From ff1372ac9e92e1360c5308a5186c7f3ec261dcf2 Mon Sep 17 00:00:00 2001 From: Chuck McCallum Date: Wed, 28 Jan 2026 09:45:51 -0500 Subject: [PATCH 1/4] upgrade minimum python version from 3.10 to 3.11 --- .github/workflows/test.yml | 2 +- README-PYPI.md | 2 +- README.md | 6 +++--- docs/index.html | 2 +- docs/index.md | 2 +- dp_wizard/__init__.py | 2 +- pyproject.toml | 2 +- requirements-dev.txt | 2 +- requirements.in | 1 + requirements.txt | 2 +- tests/test_misc.py | 4 ++-- 11 files changed, 14 insertions(+), 13 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 781f0b8b..748a8c4e 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -12,7 +12,7 @@ jobs: strategy: matrix: python-version: - - '3.10' + - '3.11' - '3.13' requirements-file: - 'requirements-dev.txt' # pinned, for predictability diff --git a/README-PYPI.md b/README-PYPI.md index dd40d1e9..62f45e71 100644 --- a/README-PYPI.md +++ b/README-PYPI.md @@ -32,7 +32,7 @@ Download Results: ## Usage -DP Wizard requires Python 3.10 or later. +DP Wizard requires Python 3.11 or later. You can check your current version with `python --version`. The exact upgrade process will depend on your environment and operating system. diff --git a/README.md b/README.md index a9bd88bb..7d166607 100644 --- a/README.md +++ b/README.md @@ -32,7 +32,7 @@ Download Results: ## Usage -DP Wizard requires Python 3.10 or later. +DP Wizard requires Python 3.11 or later. You can check your current version with `python --version`. The exact upgrade process will depend on your environment and operating system. @@ -91,8 +91,8 @@ DP-Wizard will run across multiple Python versions, but for the fewest surprises ```shell $ git clone https://github.com/opendp/dp-wizard.git $ cd dp-wizard -$ brew install python@3.10 -$ python3.10 -m venv .venv +$ brew install python@3.11 +$ python3.11 -m venv .venv $ source .venv/bin/activate ``` diff --git a/docs/index.html b/docs/index.html index 8fd8ccc4..a66138e4 100644 --- a/docs/index.html +++ b/docs/index.html @@ -646,7 +646,7 @@

Return to the class grades example ✋

pip install 'dp_wizard[app]'
dp_wizard --cloud
(requires -Python>=3.10)

+Python>=3.11)

… or go to: -**[`pip install 'dp_wizard[app]'`](https://pypi.org/project/dp_wizard/)
`dp_wizard --cloud`
(requires Python>=3.10)** +**[`pip install 'dp_wizard[app]'`](https://pypi.org/project/dp_wizard/)
`dp_wizard --cloud`
(requires Python>=3.11)** diff --git a/dp_wizard/__init__.py b/dp_wizard/__init__.py index fe505ebb..0ce5885d 100644 --- a/dp_wizard/__init__.py +++ b/dp_wizard/__init__.py @@ -19,7 +19,7 @@ def get_template_root(path: str) -> Path: def main() -> None: # pragma: no cover import sys - min_version = "3.10" + min_version = "3.11" if sys.version_info < tuple(int(v) for v in min_version.split(".")): raise Exception( f"DP Wizard requires Python {min_version}" diff --git a/pyproject.toml b/pyproject.toml index 7914b9ba..4c82974a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -28,7 +28,7 @@ dependencies = [ ] [options] -python_requires = ">=3.10" +python_requires = ">=3.11" [project.scripts] # Prefer dash in name where allowed (repo named and executable) diff --git a/requirements-dev.txt b/requirements-dev.txt index 13b134aa..f10a6cd0 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -1,5 +1,5 @@ # -# This file is autogenerated by pip-compile with Python 3.10 +# This file is autogenerated by pip-compile with Python 3.11 # by the following command: # # pip-compile requirements-dev.in diff --git a/requirements.in b/requirements.in index 9b60d565..aefe953a 100644 --- a/requirements.in +++ b/requirements.in @@ -20,6 +20,7 @@ urllib3>=2.6.0 pillow>=11.3.0 starlette>=0.49.1 fonttools>=4.60.2 +jax>=0.7.1 # TODO: Upgrade when fix is available. # https://github.com/opendp/dp-wizard/security/dependabot/35 diff --git a/requirements.txt b/requirements.txt index 58450ffc..a86814f6 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,5 +1,5 @@ # -# This file is autogenerated by pip-compile with Python 3.10 +# This file is autogenerated by pip-compile with Python 3.11 # by the following command: # # pip-compile requirements.in diff --git a/tests/test_misc.py b/tests/test_misc.py index 7def621e..d3799597 100644 --- a/tests/test_misc.py +++ b/tests/test_misc.py @@ -57,7 +57,7 @@ def test_opendp_pin(rel_path): ) def test_python_min_version(rel_path): text = (package_root.parent / rel_path).read_text() - assert "3.10" in text + assert "3.11" in text if "README" in rel_path: # Make sure we haven't upgraded one reference by mistake. - assert not re.search(r"3.1[^0]", text) + assert not re.search(r"3.1[^1]", text) From 0abbb8e8162479695b0086564752a8628b694241 Mon Sep 17 00:00:00 2001 From: Chuck McCallum Date: Wed, 28 Jan 2026 09:49:52 -0500 Subject: [PATCH 2/4] max: 3.13 -> 3.15 --- .github/workflows/test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 748a8c4e..3420b4ae 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -13,7 +13,7 @@ jobs: matrix: python-version: - '3.11' - - '3.13' + - '3.15' requirements-file: - 'requirements-dev.txt' # pinned, for predictability - 'requirements-dev.in' # un-pinned, so we catch problems early From 703339b43e913642609918b4bc7dae2671641d56 Mon Sep 17 00:00:00 2001 From: Chuck McCallum Date: Wed, 28 Jan 2026 10:06:51 -0500 Subject: [PATCH 3/4] 3.14? --- .github/workflows/test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 3420b4ae..85631673 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -13,7 +13,7 @@ jobs: matrix: python-version: - '3.11' - - '3.15' + - '3.14' requirements-file: - 'requirements-dev.txt' # pinned, for predictability - 'requirements-dev.in' # un-pinned, so we catch problems early From d38458a7a57c6c44166b82cdc5544447cbfc22ff Mon Sep 17 00:00:00 2001 From: Chuck McCallum Date: Wed, 28 Jan 2026 10:44:11 -0500 Subject: [PATCH 4/4] upgrade jax --- pyproject.toml | 6 ++---- requirements-dev.txt | 45 +++++++++++++------------------------------- requirements.in | 1 - requirements.txt | 17 ++--------------- 4 files changed, 17 insertions(+), 52 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 4c82974a..c67c72d0 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -84,7 +84,6 @@ app = [ "defusedxml==0.7.1", "deprecated==1.2.18", "dp-wizard-templates==0.7.0", - "exceptiongroup==1.3.0", "executing==2.2.0", "faicons==0.2.2", "fastjsonschema==2.21.1", @@ -94,8 +93,8 @@ app = [ "idna==3.10", "ipykernel==6.29.5", "ipython==8.35.0", - "jax==0.6.2", - "jaxlib==0.6.2", + "jax==0.9.0", + "jaxlib==0.9.0", "jedi==0.19.2", "jinja2==3.1.6", "joblib==1.4.2", @@ -164,7 +163,6 @@ app = [ "starlette==0.49.1", "threadpoolctl==3.6.0", "tinycss2==1.4.0", - "tomli==2.2.1", "toolz==1.0.0", "tornado==6.5.1", "traitlets==5.14.3", diff --git a/requirements-dev.txt b/requirements-dev.txt index f10a6cd0..e91a4f73 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -77,19 +77,13 @@ distlib==0.3.9 docutils==0.21.2 # via flit dp-wizard-templates==0.7.0 - # via -r .../dp-wizard/requirements.in -exceptiongroup==1.3.0 - # via - # anyio - # hypothesis - # ipython - # pytest + # via -r requirements.in execnet==2.1.1 # via pytest-xdist executing==2.2.0 # via stack-data faicons==0.2.2 - # via -r .../dp-wizard/requirements.in + # via -r requirements.in fastjsonschema==2.21.1 # via nbformat filelock==3.20.2 @@ -108,7 +102,7 @@ flit-core==3.12.0 # via flit fonttools==4.61.0 # via - # -r .../dp-wizard/requirements.in + # -r requirements.in # matplotlib greenlet==3.2.0 # via playwright @@ -134,12 +128,12 @@ ipython==8.35.0 # via ipykernel isort==6.0.1 # via -r requirements-dev.in -jax==0.6.2 +jax==0.9.0 # via # chex # mbi # optax -jaxlib==0.6.2 +jaxlib==0.9.0 # via # chex # jax @@ -185,7 +179,7 @@ markupsafe==3.0.2 # jinja2 # nbconvert matplotlib==3.10.1 - # via -r .../dp-wizard/requirements.in + # via -r requirements.in matplotlib-inline==0.1.7 # via # ipykernel @@ -243,7 +237,7 @@ numpy==2.2.4 # scikit-learn # scipy opendp[mbi]==0.14.1 - # via -r .../dp-wizard/requirements.in + # via -r requirements.in opt-einsum==3.4.0 # via jax optax==0.2.5 @@ -273,7 +267,7 @@ pexpect==4.9.0 # via ipython pillow==11.3.0 # via - # -r .../dp-wizard/requirements.in + # -r requirements.in # diffimg # matplotlib pip-tools==7.4.1 @@ -368,7 +362,7 @@ referencing==0.36.2 # jsonschema-specifications requests==2.32.4 # via - # -r .../dp-wizard/requirements.in + # -r requirements.in # flit # pytest-base-url rpds-py==0.24.0 @@ -384,7 +378,7 @@ scipy==1.15.2 # mbi # scikit-learn shiny==1.4.0 - # via -r .../dp-wizard/requirements.in + # via -r requirements.in six==1.17.0 # via python-dateutil sniffio==1.3.1 @@ -397,7 +391,7 @@ stack-data==0.6.3 # via ipython starlette==0.49.1 # via - # -r .../dp-wizard/requirements.in + # -r requirements.in # shiny text-unidecode==1.3 # via python-slugify @@ -405,14 +399,6 @@ threadpoolctl==3.6.0 # via scikit-learn tinycss2==1.4.0 # via bleach -tomli==2.2.1 - # via - # black - # build - # coverage - # jupytext - # pip-tools - # pytest tomli-w==1.2.0 # via flit tomlkit==0.13.2 @@ -421,7 +407,7 @@ toolz==1.0.0 # via chex tornado==6.5.1 # via - # -r .../dp-wizard/requirements.in + # -r requirements.in # ipykernel # jupyter-client traitlets==5.14.3 @@ -438,27 +424,22 @@ traitlets==5.14.3 typing-extensions==4.13.2 # via # anyio - # asgiref # beautifulsoup4 - # black # chex - # exceptiongroup # htmltools # ipython - # mistune # pyee # pyright # referencing # shiny # starlette - # uvicorn tzdata==2025.2 # via pandas uc-micro-py==1.0.3 # via linkify-it-py urllib3==2.6.0 # via - # -r .../dp-wizard/requirements.in + # -r requirements.in # requests uvicorn==0.34.1 # via shiny diff --git a/requirements.in b/requirements.in index aefe953a..9b60d565 100644 --- a/requirements.in +++ b/requirements.in @@ -20,7 +20,6 @@ urllib3>=2.6.0 pillow>=11.3.0 starlette>=0.49.1 fonttools>=4.60.2 -jax>=0.7.1 # TODO: Upgrade when fix is available. # https://github.com/opendp/dp-wizard/security/dependabot/35 diff --git a/requirements.txt b/requirements.txt index a86814f6..b894d695 100644 --- a/requirements.txt +++ b/requirements.txt @@ -60,10 +60,6 @@ deprecated==1.2.18 # via opendp dp-wizard-templates==0.7.0 # via -r requirements.in -exceptiongroup==1.3.0 - # via - # anyio - # ipython executing==2.2.0 # via stack-data faicons==0.2.2 @@ -88,12 +84,12 @@ ipykernel==6.29.5 # via dp-wizard-templates ipython==8.35.0 # via ipykernel -jax==0.6.2 +jax==0.9.0 # via # chex # mbi # optax -jaxlib==0.6.2 +jaxlib==0.9.0 # via # chex # jax @@ -301,10 +297,6 @@ threadpoolctl==3.6.0 # via scikit-learn tinycss2==1.4.0 # via bleach -tomli==2.2.1 - # via - # black - # jupytext toolz==1.0.0 # via chex tornado==6.5.1 @@ -326,18 +318,13 @@ traitlets==5.14.3 typing-extensions==4.13.2 # via # anyio - # asgiref # beautifulsoup4 - # black # chex - # exceptiongroup # htmltools # ipython - # mistune # referencing # shiny # starlette - # uvicorn tzdata==2025.2 # via pandas uc-micro-py==1.0.3