From 0a3118db4d568f965f6c8b29ff7ca64840c96327 Mon Sep 17 00:00:00 2001 From: Jericho Tolentino <68654047+jericht@users.noreply.github.com> Date: Wed, 8 Jul 2026 23:15:00 +0000 Subject: [PATCH] chore(deps): bump pytest, black, mypy, hypothesis with Py39 compat Update dev dependencies to their latest versions while maintaining Python 3.9 support via environment markers: - pytest: 8.4.* -> 9.1.* (Py39 stays on 8.4.*) - black: 25.* -> 26.* (Py39 stays on 25.*) - mypy: 1.19.* -> 2.2.* (Py39 stays on 1.19.*) - hypothesis: ~=6.0 -> ~=6.156 (Py39 gets ~=6.141) All four packages dropped Python 3.9 support in their latest major releases. This uses the same conditional pattern as openjd-cli. Supersedes #300, #301, #302, #303. Signed-off-by: Jericho Tolentino <68654047+jericht@users.noreply.github.com> --- .github/dependabot.yml | 4 ++++ requirements-testing.txt | 13 +++++++++---- src/openjd/expr/__init__.py | 1 - src/openjd/model/_v1/__init__.py | 2 -- src/openjd/model/_v1/template.py | 1 - test/openjd/expr/test_known_gaps.py | 1 - test/openjd/expr/test_pickle.py | 1 - test/openjd/expr/test_target_type_propagation.py | 1 - test/openjd/model_v0/conftest.py | 1 - .../test_step_param_space_iter_with_chunks.py | 1 - .../v2023_09/test_chunk_int_task_parameter_type.py | 1 - test/openjd/model_v0/v2023_09/test_definitions.py | 1 - test/openjd/model_v1/test_known_gaps.py | 1 - test/openjd/model_v1/test_merge_job_parameters.py | 1 - test/openjd/model_v1/test_pickle.py | 1 - test/openjd/model_v1/test_version_enums.py | 1 - test/openjd/test_model_package_sanity.py | 1 - 17 files changed, 13 insertions(+), 20 deletions(-) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index ea851027..ffca0e36 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -12,6 +12,10 @@ updates: day: "monday" commit-message: prefix: "chore(deps):" + ignore: + # black 26+ drops Python 3.9 compat and produces different formatting + - dependency-name: "black" + update-types: ["version-update:semver-major"] - package-ecosystem: "github-actions" directory: "/" # Location of package manifests schedule: diff --git a/requirements-testing.txt b/requirements-testing.txt index 9c1ef299..166756e4 100644 --- a/requirements-testing.txt +++ b/requirements-testing.txt @@ -1,15 +1,20 @@ coverage[toml] == 7.* -pytest == 8.4.* +pytest == 9.1.*; python_version >= "3.10" +pytest == 8.4.*; python_version < "3.10" pytest-cov == 7.1.* pytest-timeout == 2.4.* pytest-xdist == 3.8.* types-PyYAML ~= 6.0 -black == 25.* +# Pinned to 25.x because black 26+ produces different formatting output +# that is incompatible with black 25 (last version supporting Python 3.9). +black == 25.11.* ruff == 0.15.* -mypy == 1.19.* +mypy == 2.2.*; python_version >= "3.10" +mypy == 1.19.*; python_version < "3.10" # pydantic: required by the legacy model_v0 (Pydantic) test suite, # which lives alongside the new Rust-backed model_v1 implementation. pydantic >= 2.10, < 3 # hypothesis: used by the opt-in fuzz test suites in test/openjd/expr # and test/openjd/model-v*. conftest.py imports it unconditionally. -hypothesis ~= 6.0 \ No newline at end of file +hypothesis ~= 6.156; python_version >= "3.10" +hypothesis ~= 6.141; python_version < "3.10" diff --git a/src/openjd/expr/__init__.py b/src/openjd/expr/__init__.py index e75a1365..d857e2f4 100644 --- a/src/openjd/expr/__init__.py +++ b/src/openjd/expr/__init__.py @@ -37,7 +37,6 @@ HostContext, ) - # Note: the `__module__` / `__name__` / `__qualname__` of the Rust-backed # exceptions (ExpressionError, FormatStringValidationError, etc.) are set by # the `_openjd_rs` module init in Rust to their canonical user-facing values diff --git a/src/openjd/model/_v1/__init__.py b/src/openjd/model/_v1/__init__.py index 175fc33a..1323a381 100644 --- a/src/openjd/model/_v1/__init__.py +++ b/src/openjd/model/_v1/__init__.py @@ -66,7 +66,6 @@ # from openjd.model._v1 import template, job, types, errors from . import errors, job, template, types # noqa: F401 - # ── Python-only types ── @@ -92,7 +91,6 @@ from .._version import version # noqa: E402 - __all__ = ( # Submodules "errors", diff --git a/src/openjd/model/_v1/template.py b/src/openjd/model/_v1/template.py index c78251bf..1ce8eec8 100644 --- a/src/openjd/model/_v1/template.py +++ b/src/openjd/model/_v1/template.py @@ -81,7 +81,6 @@ HiddenOnlyUserInterface, ) - # Short aliases for ergonomics. Both names refer to the same class # object — ``Action is TemplateAction`` is True. Action = TemplateAction diff --git a/test/openjd/expr/test_known_gaps.py b/test/openjd/expr/test_known_gaps.py index a0bf7622..63ec635e 100644 --- a/test/openjd/expr/test_known_gaps.py +++ b/test/openjd/expr/test_known_gaps.py @@ -23,7 +23,6 @@ SymbolTable, ) - # ── SymbolTable['Key'] = value when Key is already a subtable ── # # Reference (``_set_path`` with a single-component key): diff --git a/test/openjd/expr/test_pickle.py b/test/openjd/expr/test_pickle.py index 90d6201d..9f928b58 100644 --- a/test/openjd/expr/test_pickle.py +++ b/test/openjd/expr/test_pickle.py @@ -32,7 +32,6 @@ TypeCode, ) - # ── Group A: enums round-trip via variant name ─────────────────── diff --git a/test/openjd/expr/test_target_type_propagation.py b/test/openjd/expr/test_target_type_propagation.py index 41873587..0a618594 100644 --- a/test/openjd/expr/test_target_type_propagation.py +++ b/test/openjd/expr/test_target_type_propagation.py @@ -29,7 +29,6 @@ from openjd.expr import ExprType, SymbolTable, TypeCode, evaluate_expression - STRING = ExprType("string") LIST_INT = ExprType("list[int]") INT_OR_STRING = ExprType("int | string") diff --git a/test/openjd/model_v0/conftest.py b/test/openjd/model_v0/conftest.py index a1d762d5..2017d7da 100644 --- a/test/openjd/model_v0/conftest.py +++ b/test/openjd/model_v0/conftest.py @@ -29,7 +29,6 @@ import os import sys - _VAR = "OPENJD_MODEL_V0_TEST_IMPORT" _DEFAULT = "root" _CHOICES = ("root", "v0") diff --git a/test/openjd/model_v0/test_step_param_space_iter_with_chunks.py b/test/openjd/model_v0/test_step_param_space_iter_with_chunks.py index 2222bfd5..6fde92df 100644 --- a/test/openjd/model_v0/test_step_param_space_iter_with_chunks.py +++ b/test/openjd/model_v0/test_step_param_space_iter_with_chunks.py @@ -24,7 +24,6 @@ divide_int_list_into_noncontiguous_chunks, ) - PARAMETRIZE_CASES: tuple = ( pytest.param( RangeListTaskParameterDefinition_2023_09( diff --git a/test/openjd/model_v0/v2023_09/test_chunk_int_task_parameter_type.py b/test/openjd/model_v0/v2023_09/test_chunk_int_task_parameter_type.py index d3d88151..0b6c6681 100644 --- a/test/openjd/model_v0/v2023_09/test_chunk_int_task_parameter_type.py +++ b/test/openjd/model_v0/v2023_09/test_chunk_int_task_parameter_type.py @@ -12,7 +12,6 @@ StepParameterSpaceDefinition, ) - PARAMETRIZE_CASES: tuple = ( "data", ( diff --git a/test/openjd/model_v0/v2023_09/test_definitions.py b/test/openjd/model_v0/v2023_09/test_definitions.py index 8a9bb4cd..0acfdc38 100644 --- a/test/openjd/model_v0/v2023_09/test_definitions.py +++ b/test/openjd/model_v0/v2023_09/test_definitions.py @@ -9,7 +9,6 @@ from .test_module import ClassWithForwardRef, ClassWithoutForwardRef - ALL_MODELS = sorted( [obj for name, obj in getmembers(mod) if isclass(obj) and issubclass(obj, BaseModel)], key=lambda o: o.__name__, diff --git a/test/openjd/model_v1/test_known_gaps.py b/test/openjd/model_v1/test_known_gaps.py index 70b27c65..3cb9c745 100644 --- a/test/openjd/model_v1/test_known_gaps.py +++ b/test/openjd/model_v1/test_known_gaps.py @@ -19,7 +19,6 @@ from __future__ import annotations - # ── Top-level package no longer leaks typing imports ── # # An earlier draft of ``openjd.model._v1`` imported ``Any``, diff --git a/test/openjd/model_v1/test_merge_job_parameters.py b/test/openjd/model_v1/test_merge_job_parameters.py index 91f37964..1ac4befa 100644 --- a/test/openjd/model_v1/test_merge_job_parameters.py +++ b/test/openjd/model_v1/test_merge_job_parameters.py @@ -13,7 +13,6 @@ JobTemplate, ) - BASIC_JOB_TEMPLATE_STEP_2023_09: dict[str, Any] = { "name": "Test", "script": {"actions": {"onRun": {"command": "foo"}}}, diff --git a/test/openjd/model_v1/test_pickle.py b/test/openjd/model_v1/test_pickle.py index c1641a6d..4c77274d 100644 --- a/test/openjd/model_v1/test_pickle.py +++ b/test/openjd/model_v1/test_pickle.py @@ -25,7 +25,6 @@ import pytest - # ── Group A: enums ─────────────────────────────────────────────── diff --git a/test/openjd/model_v1/test_version_enums.py b/test/openjd/model_v1/test_version_enums.py index efbfaf49..bf31d325 100644 --- a/test/openjd/model_v1/test_version_enums.py +++ b/test/openjd/model_v1/test_version_enums.py @@ -4,7 +4,6 @@ from openjd.model._v1 import TemplateSpecificationVersion, decode_job_template - # All known variants. Add new ones here as the spec evolves; the test # ensures every variant is classified as exactly job-template OR # environment-template, never both. diff --git a/test/openjd/test_model_package_sanity.py b/test/openjd/test_model_package_sanity.py index c97f0908..daf8c180 100644 --- a/test/openjd/test_model_package_sanity.py +++ b/test/openjd/test_model_package_sanity.py @@ -19,7 +19,6 @@ import pytest - # A minimal but real job template that exercises parsing, validation, # job creation, and task parameter iteration. _MINIMAL_JOB_TEMPLATE = {