diff --git a/.github/workflows/register-pypi.yml b/.github/workflows/register-pypi.yml index 011afd2d..b39a5422 100644 --- a/.github/workflows/register-pypi.yml +++ b/.github/workflows/register-pypi.yml @@ -17,7 +17,7 @@ jobs: - name: Set up Python uses: actions/setup-python@v7 with: - python-version: "3.10" + python-version: "3.11" - name: Install build run: >- python -m diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 338d00e8..1e498dda 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -41,6 +41,17 @@ jobs: - uses: julia-actions/cache@v3 + # The package cache includes Conda's build configuration, but not its root environment. + - name: Rebuild Conda configuration + shell: julia --color=yes {0} + env: + JULIA_PKG_PRECOMPILE_AUTO: '0' + run: | + using Pkg + Pkg.activate(; temp=true) + Pkg.add("Conda") + Pkg.build("Conda") + - name: Build package uses: julia-actions/julia-buildpkg@v1 env: @@ -83,7 +94,7 @@ jobs: fail-fast: false matrix: os: [ubuntu-latest, windows-latest, macos-latest] - pyversion: ['3', '3.10'] + pyversion: ['3', '3.11'] juliaexe: ["@JuliaPkg"] include: - os: ubuntu-latest diff --git a/AGENTS.md b/AGENTS.md index 354305bd..fb476699 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -9,5 +9,10 @@ The majority of tests live in the Julia package; Python tests cover functionality that cannot be exercised from Julia (e.g., JuliaCall-specific behavior). Run both suites—typically Julia first—in whichever order makes sense. +- In restricted sandboxes, both suites need approval to write to the shared caches (`~/.julia` and `~/.cache/uv`). +- `pysrc/juliacall/juliapkg.json` is tracked; restore its original contents after using the development copy for Python tests. + ## Meta instructions +- When testing an older Julia version, a local manifest generated by newer Julia can fail on stdlib dependencies. Use a temporary environment with `Pkg.develop(path=pwd()); Pkg.test("PythonCall")` to resolve dependencies for that Julia version. +- CI caches Conda.jl build configuration without its root environment. Rebuild Conda after cache restore before PyCall is built; otherwise Julia 1.10 can fail before tests with "Path to conda environment is not valid". - When you discover environment quirks, false assumptions, process fixes, or any other generally useful info, update this AGENTS.md so future coding agents have the information. diff --git a/CHANGELOG.md b/CHANGELOG.md index 6c5636b4..7ad07fa2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,8 @@ # Changelog +## Unreleased +* Minimum supported Python version is now 3.11. + ## 0.9.37 (2026-10-12) * Compatibility fix with Python 3.15 from conda-forge, which no longer bundles libpython. * Bug fixes. diff --git a/CondaPkg.toml b/CondaPkg.toml index 8174a3ec..1bfcab9b 100644 --- a/CondaPkg.toml +++ b/CondaPkg.toml @@ -9,7 +9,7 @@ version = "<=julia" [deps.python] build = "**cpython**" -version = ">=3.10,!=3.14.0,!=3.14.1,<4" +version = ">=3.11,!=3.14.0,!=3.14.1,<4" [deps.libpython] build = "**bundled-or-separate**" diff --git a/README.md b/README.md index a3615e66..de141e65 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,7 @@ Bringing [**Python®**](https://www.python.org/) and [**Julia**](https://juliala - Fast non-copying conversion of numeric arrays in either direction: modify Python arrays (e.g. `bytes`, `array.array`, `numpy.ndarray`) from Julia or Julia arrays from Python. - Helpful wrappers: interpret Python sequences, dictionaries, arrays, dataframes and IO streams as their Julia counterparts, and vice versa. - Beautiful stack-traces. -- Supports modern systems: tested on Windows, MacOS and Linux; 64-bit; Julia 1.10 upwards and Python 3.10 upwards. +- Supports modern systems: tested on Windows, MacOS and Linux; 64-bit; Julia 1.10 upwards and Python 3.11 upwards. ⭐ If you like this, a GitHub star would be lovely thank you. ⭐ diff --git a/docs/src/faq.md b/docs/src/faq.md index a31dff7b..5436fa17 100644 --- a/docs/src/faq.md +++ b/docs/src/faq.md @@ -112,7 +112,7 @@ np = pyimport("numpy") ## What versions of Python and Julia do you support? Each release of PythonCall and JuliaCall will support and require: -- Any currently supported version of Python, [see here](https://devguide.python.org/versions/). Currently 3.10+. +- Any currently supported version of Python, [see here](https://devguide.python.org/versions/). Currently 3.11+. - The current Julia LTS version and newer, [see here](https://julialang.org/downloads/#long_term_support_release). Currently 1.10+. Only the latest patch release within each minor version is supported. diff --git a/docs/src/index.md b/docs/src/index.md index dc73a496..774b8f36 100644 --- a/docs/src/index.md +++ b/docs/src/index.md @@ -7,4 +7,4 @@ Bringing [**Python®**](https://www.python.org/) and [**Julia**](https://juliala - Fast non-copying conversion of numeric arrays in either direction: modify Python arrays (e.g. `bytes`, `array.array`, `numpy.ndarray`) from Julia or Julia arrays from Python. - Helpful wrappers: interpret Python sequences, dictionaries, arrays, dataframes and IO streams as their Julia counterparts, and vice versa. - Beautiful stack-traces. -- Works anywhere: tested on Windows, MacOS and Linux; 64-bit; Julia 1.10 upwards and Python 3.10 upwards. +- Works anywhere: tested on Windows, MacOS and Linux; 64-bit; Julia 1.10 upwards and Python 3.11 upwards. diff --git a/pyproject.toml b/pyproject.toml index 4edc1a24..0ebe589b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -12,7 +12,7 @@ classifiers = [ "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", ] -requires-python = ">=3.10, <4" +requires-python = ">=3.11, <4" dependencies = ["juliapkg >=0.1.27, <0.2"] [dependency-groups] diff --git a/src/C/context.jl b/src/C/context.jl index ea469ffd..15cc427d 100644 --- a/src/C/context.jl +++ b/src/C/context.jl @@ -323,8 +323,8 @@ function init_context() error("Cannot parse version from version string: $(repr(verstr))") end CTX.version = VersionNumber(vermatch.match) - v"3.10" ≤ CTX.version < v"4" || error( - "Only Python 3.10+ is supported, this is Python $(CTX.version) at $(CTX.exe_path===missing ? "unknown location" : CTX.exe_path).", + v"3.11" ≤ CTX.version < v"4" || error( + "Only Python 3.11+ is supported, this is Python $(CTX.version) at $(CTX.exe_path===missing ? "unknown location" : CTX.exe_path).", ) CTX.is_free_threaded = occursin("free-threading build", verstr)