diff --git a/.github/requirements/.pip-tools.toml b/.github/requirements/.pip-tools.toml new file mode 100644 index 0000000..d64dd4b --- /dev/null +++ b/.github/requirements/.pip-tools.toml @@ -0,0 +1,7 @@ +# Dependabot reads the legacy section; pip-tools reads the tool section. +# setuptools is the required build backend, installed at a reviewed hash. +[pip-tools] +allow-unsafe = true + +[tool.pip-tools] +allow-unsafe = true diff --git a/.github/requirements/integration.in b/.github/requirements/integration.in index 4a66d5c..cf7c349 100644 --- a/.github/requirements/integration.in +++ b/.github/requirements/integration.in @@ -1,6 +1,6 @@ # Python 3.12 integration dependencies, locked for all runner platforms. # Regenerate: uv pip compile --universal --python-version 3.12 --generate-hashes -# --only-binary :all: --exclude-newer 2026-10-02T00:00:00Z +# --only-binary :all: --exclude-newer 2026-10-05T00:00:00Z # .github/requirements/integration.in -o .github/requirements/integration.txt setuptools>=77 wheel @@ -12,11 +12,12 @@ prometheus_client>=0.26.0 defusedxml>=0.7.1 je_action_core>=0.0.2 PyYAML>=6.0.3 -tzdata>=2024.1; platform_system == 'Windows' +# Keep Windows timezone data even when Dependabot recompiles this shared lock on Linux. +tzdata>=2026.5 opentelemetry-api>=1.44.0 opentelemetry-sdk>=1.44.0 tomli>=2.0.1; python_version<"3.11" -boto3>=1.34.0 +boto3>=1.43.108 azure-storage-blob>=12.19.0 google-api-python-client>=2.100.0 google-auth-httplib2>=0.2.0 diff --git a/.github/requirements/integration.txt b/.github/requirements/integration.txt index 709249b..4eeebe9 100644 --- a/.github/requirements/integration.txt +++ b/.github/requirements/integration.txt @@ -1,5 +1,5 @@ # This file was autogenerated by uv via the following command: -# uv pip compile .github/requirements/integration.in --python-version 3.12 --universal --generate-hashes --only-binary=:all: --exclude-newer 2026-10-02 -o .github/requirements/integration.txt +# uv pip compile .github/requirements/integration.in --python-version 3.12 --universal --generate-hashes --only-binary :all: --exclude-newer 2026-10-05T00:00:00Z -o .github/requirements/integration.txt azure-core==1.41.0 \ --hash=sha256:522b4011e8180b1a3dcd2024396a4e7fe9ac37fb8597db47163d230b5efe892d \ --hash=sha256:f46ff5dfcd230f25cf1c19e8a34b8dc08a337b2503e268bb600a16c00db8ad5a @@ -73,13 +73,13 @@ bcrypt==5.0.0 \ --hash=sha256:f8429e1c410b4073944f03bd778a9e066e7fad723564a52ff91841d278dfc822 \ --hash=sha256:fc746432b951e92b58317af8e0ca746efe93e66555f1b40888865ef5bf56446b # via paramiko -boto3==1.43.107 \ - --hash=sha256:632a4f8298725b94144c8cd383cbdacb34624daa73221e954c3d33ac6e2528d6 \ - --hash=sha256:c4e0f1a0295cbb7103f2950128cf88463c076d220080a7d0f127cf834969fc3a +boto3==1.43.108 \ + --hash=sha256:03341f089158368acf83e921aca98b706095322ca52bc4c039a616940aa5ad41 \ + --hash=sha256:19e9da95ef0c494e27052049a42137550e66730509bb613e76eaa30ddf9a7170 # via -r .github/requirements/integration.in -botocore==1.43.107 \ - --hash=sha256:23cbe854e815dbaccf097f7fd32b461c9e1d2ed7e0c7dcc5658218704509d840 \ - --hash=sha256:4a37fa072a00280c746313532d19b00e2dc53f1993222601df104d71d548d5b6 +botocore==1.43.108 \ + --hash=sha256:ab9d16c6b4350aaa54ed28202dfa2998b2d735fdbf3247eb60af469d8d48a5b8 \ + --hash=sha256:ee4f75cf3bdbb0da7912e089950e8112f692016539d939312c771499958e6cfd # via # boto3 # s3transfer @@ -1099,9 +1099,9 @@ typing-extensions==4.16.0 \ # opentelemetry-api # opentelemetry-sdk # opentelemetry-semantic-conventions -tzdata==2026.4 ; sys_platform == 'win32' \ - --hash=sha256:c2169a8b0a7a5e9674da5a135ccdfb2b3e671b333ed9fed17b41f73c34476e81 \ - --hash=sha256:f1b8bd365d8d210c55353f4d7f8d6d8561c0ba50d704b700d195a9424bba0d79 +tzdata==2026.5 \ + --hash=sha256:8cc73c0a0bfca7dbfa59235d60b2eff82231dee33f53d206db1acd9173cfc0a7 \ + --hash=sha256:b683bd1b6659ddcd810ff02ad09ba821d4bf1065072805063eb35c49617905ac # via -r .github/requirements/integration.in uritemplate==4.2.0 \ --hash=sha256:480c2ed180878955863323eea31b0ede668795de182617fef9c6ca09e6ec9d0e \ diff --git a/architecture.md b/architecture.md index d500aaa..5bffabc 100644 --- a/architecture.md +++ b/architecture.md @@ -41,7 +41,7 @@ piece of the 1.0 roadmap (`docs/FILEAUTOMATION-1.0-ROADMAP.md`, PR #107); what i | `MANIFEST.in` | Keeps `tests/` out of both source distributions (`tests/test_sdist_manifest.py`); package discovery in the TOMLs already keeps it out of the wheels | | `scripts/dev_release.py` | Release helper for the dev channel (standard library only): picks the next `automation_file_dev` version from PyPI and tells whether the built wheel differs from the newest published one | | `.github/requirements/publish.in`, `publish.txt` | The tools of the two publish jobs (`build`, `twine`, and the build backend `setuptools`) and their hash-locked resolution for Python 3.12 on Linux. `publish.in` holds the `uv pip compile` command that regenerates `publish.txt`; Dependabot reads the directory | -| `.github/requirements/lint.in`, `lint.txt`, `integration.in`, `integration.txt` | Hash-locked wheel dependencies for lint and Python 3.12 integration jobs. The editable package uses the locked build backend without dependency resolution or build isolation. | +| `.github/requirements/lint.in`, `lint.txt`, `integration.in`, `integration.txt`, `.pip-tools.toml` | Hash-locked wheel dependencies for lint and Python 3.12 integration jobs. Shared integration inputs retain Windows timezone data on every compiler host; pip-tools configuration keeps the hashed setuptools build backend during Dependabot updates. The editable package uses that backend without dependency resolution or build isolation. | | `main_ui.py` | Development shortcut for `launch_ui()` | | `tests/`, `docs/`, `examples/mcp/` | pytest suite (fixtures, including the shared Qt application lifecycle, in `tests/conftest.py`); Sphinx docs; MCP host configuration example | diff --git a/docs/updates/2026-10.md b/docs/updates/2026-10.md index a59a9cb..7acb3e0 100644 --- a/docs/updates/2026-10.md +++ b/docs/updates/2026-10.md @@ -756,3 +756,8 @@ Index and query commands: [README.md](README.md). New entries go at the end. ## U-20261011-02 · 2026-10-11 · Keep circuit breaker clock fixtures lint clean · #done #ci Name the clock fixture explicitly and request its side effect through usefixtures where no clock value is used. All eight circuit breaker regression tests pass. + + +## U-20261012-01 · 2026-10-12 · Preserve cross-platform integration dependencies during automated updates · #done #ci + +Keep tzdata unconditional in shared integration inputs so Linux-based dependency updates retain Windows timezone data. Add pip-tools configuration for Dependabot and local compilation to retain the hash-locked setuptools build backend. Regenerate the universal Python 3.12 lock with the seven-day release cutoff and add Linux, macOS and Windows compiler regressions. Validation: 37 workflow tests passed; the full local suite passed 5390 tests with 230 optional skips; Ruff lint and format checks passed; mypy reported no issues in 275 source files. Remote service jobs must install the editable package without fetching an unlocked backend. diff --git a/docs/updates/README.md b/docs/updates/README.md index 302e9af..4c3193c 100644 --- a/docs/updates/README.md +++ b/docs/updates/README.md @@ -58,6 +58,7 @@ In the same commit: delete the item from `progress.md`, add a `#done` entry here | ID | Date | Title | Tags | Batch | |---|---|---|---|---| +| U-20261012-01 | 2026-10-12 | Preserve cross-platform integration dependencies during automated updates | #done #ci | [2026-10](2026-10.md) | | U-20261011-02 | 2026-10-11 | Keep circuit breaker clock fixtures lint clean | #done #ci | [2026-10](2026-10.md) | | U-20261011-01 | 2026-10-11 | Integrate open pull requests and stabilize circuit breaker tests | #ci #tests #dependencies | [2026-10](2026-10.md) | | U-20261008-39 | 2026-10-08 | The legacy CLI flags exit 1 when an action failed | #feature #cli #testpioneer | [2026-10](2026-10.md) | @@ -136,5 +137,5 @@ In the same commit: delete the item from `progress.md`, add a `#done` entry here | File | Period | Entries | |---|---|---:| -| [2026-10.md](2026-10.md) | 2026-10 | 52 | +| [2026-10.md](2026-10.md) | 2026-10 | 53 | | [2026-09.md](2026-09.md) | 2026-09 | 21 | diff --git a/tests/test_workflow_actions.py b/tests/test_workflow_actions.py index 4213f30..da04b89 100644 --- a/tests/test_workflow_actions.py +++ b/tests/test_workflow_actions.py @@ -219,6 +219,25 @@ def test_lint_and_integration_jobs_cannot_resolve_unlocked_dependencies(workflow assert "--only-binary :all:" in command +@pytest.mark.parametrize( + "environment", + [ + {"platform_system": "Linux", "sys_platform": "linux"}, + {"platform_system": "Darwin", "sys_platform": "darwin"}, + {"platform_system": "Windows", "sys_platform": "win32"}, + ], + ids=["linux-compiler", "macos-compiler", "windows-compiler"], +) +def test_shared_integration_inputs_keep_timezone_data_on_every_compiler(environment): + """A Linux dependency update must retain Windows timezone data in the shared lock.""" + lines = (_REQUIREMENTS / "integration.in").read_text(encoding="utf-8").splitlines() + requirements = [ + Requirement(line) for line in lines if line.strip() and not line.startswith("#") + ] + timezone = next(item for item in requirements if canonicalize_name(item.name) == "tzdata") + assert timezone.marker is None or timezone.marker.evaluate(environment) + + def test_integration_lock_covers_the_package_and_its_build_backend(): text = (_REQUIREMENTS / "integration.txt").read_text(encoding="utf-8") pins = {canonicalize_name(name): version for name, version in _PIN.findall(text)}