This is an automated email from the ASF dual-hosted git repository. vatsrahul1001 pushed a commit to branch fix-static-checks-toolchain-v3-3-test in repository https://gitbox.apache.org/repos/asf/airflow.git
commit 595fe17af0201fd29dc6d4633af0f53b4e11e22b Author: Rahul Vats <[email protected]> AuthorDate: Sun Sep 13 07:17:14 2026 +0530 Carry the lint/type config for the ruff 0.16.6 and mypy 2.3.1 bump #73042 bumped ruff (0.15.17->0.16.6) and mypy (2.1.0->2.3.1) on v3-3-test but not the companion config that keeps static checks green, which lives in separate main PRs. On the 3.3.2 sync PR the full-diff prek run therefore goes red across ruff, ruff-format, mypy and zizmor. Without the pinned base rule set, ruff 0.16 falls back to its widened default (~510 rules) and reports 6278 errors; its B010 autofix rewrites setattr on the fake modules in the devel-common tests, which then trip mypy's attr-defined check. Pinning the base set (from #70725) clears both. The zizmor config and unsound-ternary rewrites mirror main (#69026); the plugins_manager type-ignore is local since that code was refactored away on main. --- .github/workflows/publish-docs-to-s3.yml | 2 +- .github/workflows/run-unit-tests.yml | 4 ++-- .github/zizmor.yml | 18 ++++++++++++++++++ pyproject.toml | 11 +++++++++++ .../airflow_shared/plugins_manager/plugins_manager.py | 3 ++- .../src/airflow/sdk/execution_time/schema/AGENTS.md | 2 +- 6 files changed, 35 insertions(+), 5 deletions(-) diff --git a/.github/workflows/publish-docs-to-s3.yml b/.github/workflows/publish-docs-to-s3.yml index e81d5a5b153..8d7dbac0a9c 100644 --- a/.github/workflows/publish-docs-to-s3.yml +++ b/.github/workflows/publish-docs-to-s3.yml @@ -88,7 +88,7 @@ jobs: AIRFLOW_VERSION: ${{ inputs.airflow-version || '' }} APPLY_COMMITS: ${{ inputs.apply-commits || '' }} outputs: - include-docs: ${{ inputs.include-docs == 'all' && '' || inputs.include-docs }} + include-docs: ${{ case(inputs.include-docs == 'all', '', inputs.include-docs) }} destination-location: ${{ steps.parameters.outputs.destination-location }} destination: ${{ steps.parameters.outputs.destination }} extra-build-options: ${{ steps.parameters.outputs.extra-build-options }} diff --git a/.github/workflows/run-unit-tests.yml b/.github/workflows/run-unit-tests.yml index 415cad01d93..458ee33ca10 100644 --- a/.github/workflows/run-unit-tests.yml +++ b/.github/workflows/run-unit-tests.yml @@ -142,8 +142,8 @@ jobs: timeout-minutes: ${{ fromJSON(inputs.job-timeout-minutes) }} # yamllint disable rule:line-length name: "\ - ${{ inputs.test-scope == 'All' && '' || inputs.test-scope == 'Quarantined' && 'Qrnt' || inputs.test-scope }}\ - ${{ inputs.test-scope == 'All' && '' || '-' }}\ + ${{ case(inputs.test-scope == 'Quarantined', 'Qrnt', inputs.test-scope == 'All', '', inputs.test-scope) }}\ + ${{ case(inputs.test-scope == 'All', '', '-') }}\ ${{ inputs.test-group == 'providers' && 'prov' || inputs.test-group}}:\ ${{ inputs.test-name }}${{ inputs.test-name-separator }}${{ matrix.backend-version }}:\ ${{ matrix.python-version}}:${{ matrix.test-types.description }}" diff --git a/.github/zizmor.yml b/.github/zizmor.yml index ef9fbc6d507..c0429fd3442 100644 --- a/.github/zizmor.yml +++ b/.github/zizmor.yml @@ -19,3 +19,21 @@ rules: secrets-outside-env: disable: true + # This audit wants every in-repo `uses: ./...` rewritten to GitHub's + # self-repository form (`uses: $/...`). Two things outside this repository's + # control block that, and both were confirmed by pushing the conversion: + # + # * `$/` makes the runner fetch apache/airflow as an action repository, and + # that download cannot materialise the symlinks this repository commits -- + # it aborts on `.claude/skills/airflow-translations`, whose target is not + # tracked, before any job runs. + # * ASF infrastructure's allowlist check does not recognise the syntax and + # reports every `$/...` reference as an action missing from the allowlist. + # + # The audit's own threat model -- a privileged workflow loading a local action + # out of a checkout untrusted code could have altered first -- does not reach + # us either, since no Airflow workflow runs on `pull_request_target` or + # `workflow_run`. Revisit if the symlinks go away and ASF Infra teaches the + # allowlist about `$/`. + self-repository: + disable: true diff --git a/pyproject.toml b/pyproject.toml index d5ee724ee41..35184d08d77 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -596,6 +596,10 @@ extend-exclude = [ [tool.ruff.lint] typing-modules = ["airflow.typing_compat"] external = ["MIG"] +# Pin the base rule set instead of inheriting Ruff's default, which Ruff changes +# between releases (0.16 widened it from ~250 to ~510 rules). Everything Airflow +# actually opts into lives in extend-select below. +select = ["E4", "E7", "E9", "F"] extend-select = [ # Enable entire ruff rule section "I", # Missing required import (auto-fixable) @@ -704,6 +708,13 @@ ignore = [ "COM812", "COM819", "E501", # Formatted code may exceed the line length, leading to line-too-long (E501) errors. + # New in Ruff 0.16, inside sections Airflow selects wholesale. Deferred so a tooling + # bump does not also carry semantic changes; both need per-site judgement. + "ISC004", # Implicit string concat in a collection literal; 109 sites, unsafe autofix + # LOG004 is not a mechanical replacement: switching to `.error()` where an exception is + # in flight silently drops the traceback, while leaving `.exception()` where none is + # only prints a bare `NoneType: None`. Review already caught one bad guess in 13. + "LOG004", # `.exception()` outside an exception handler; 13 sites ] unfixable = [ # PT022 replace empty `yield` to empty `return`. Might be fixed with a combination of PLR1711 diff --git a/shared/plugins_manager/src/airflow_shared/plugins_manager/plugins_manager.py b/shared/plugins_manager/src/airflow_shared/plugins_manager/plugins_manager.py index e8dea0d1294..35f7ed9df27 100644 --- a/shared/plugins_manager/src/airflow_shared/plugins_manager/plugins_manager.py +++ b/shared/plugins_manager/src/airflow_shared/plugins_manager/plugins_manager.py @@ -177,7 +177,8 @@ def is_valid_plugin(plugin_obj) -> bool: ) if is_airflow_plugin and plugin_obj.__name__ != "AirflowPlugin": - plugin_obj.validate() + # Validated as an AirflowPlugin subclass by name above; mypy can't narrow a name-based check. + plugin_obj.validate() # type: ignore[attr-defined] return True return False diff --git a/task-sdk/src/airflow/sdk/execution_time/schema/AGENTS.md b/task-sdk/src/airflow/sdk/execution_time/schema/AGENTS.md index 0d844efe7ac..33fa2b85b50 100644 --- a/task-sdk/src/airflow/sdk/execution_time/schema/AGENTS.md +++ b/task-sdk/src/airflow/sdk/execution_time/schema/AGENTS.md @@ -87,7 +87,7 @@ head shape *is* the schema for the new body. `versions/__init__.py`: ```python - Version("2026-06-16", AddRetryDelay, AddSentryTraceField), + (Version("2026-06-16", AddRetryDelay, AddSentryTraceField),) ``` 4. The `generate-supervisor-schemas-snapshot` prek hook will
