airflowctl: make required CLI params positional, keep optional as --flag#66768
Merged
potiuk merged 2 commits intoMay 12, 2026
Merged
Conversation
Auto-generated commands such as ``airflowctl dags get-details`` now accept
required primitive parameters positionally:
airflowctl dags get-details my_dag_id
instead of the previous ``--dag-id my_dag_id`` form. Optional parameters
and booleans keep the ``--flag`` form.
This follows the dev-list lazy consensus on airflowctl parameter style.
A parameter is considered required when the operation method declares it
without a default and without ``| None`` in its annotation. Datamodel-
expanded body fields are unaffected — they are not "parameters of the
operation method" in this sense and continue to use ``--flag``.
…gration tests Two follow-ups to the positional-required-args change: - ``TestCommandFactory._save_temp_operations_py`` previously wrote a shared ``test_command.py`` in cwd; under pytest-xdist that file is raced by workers, so ``next(arg for arg in jobs_list_args if ...)`` in one test could see content written by another and raise ``StopIteration``. Helper now takes the per-test ``tmp_path`` and returns the full path. The classmethod ``teardown_method`` that removed the shared file is no longer needed (pytest auto-cleans ``tmp_path``). - The Airflow CTL PROD-image integration tests still invoked converted parameters with the old ``--flag value`` form (e.g. ``--variable-key=X``, ``--section X --option Y``, ``--dag-id=example_bash_operator``). Updated each occurrence to the positional form that the regenerated CLI now expects. Optional parameters (``--logical-date``, ``--run-after``, ``--is-paused``, ``--state``, ``--limit``, etc.) stay as ``--flag``. Signed-off-by: 1fanwang <1fannnw@gmail.com>
potiuk
approved these changes
May 12, 2026
Contributor
Backport failed to create: airflow-ctl/v0-1-test. View the failure log Run detailsNote: As of Merging PRs targeted for Airflow 3.X In matter of doubt please ask in #release-management Slack channel.
You can attempt to backport this manually by running: cherry_picker ffa426b airflow-ctl/v0-1-testThis should apply the commit to the airflow-ctl/v0-1-test branch and leave the commit in conflict state marking After you have resolved the conflicts, you can continue the backport process by running: cherry_picker --continueIf you don't have cherry-picker installed, see the installation guide. |
1 task
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Following the dev-list lazy consensus on airflowctl parameter style[1], auto-generated commands such as
airflowctl dags get-detailsnow accept required primitive parameters positionally:instead of the previous
--dag-id my_dag_idform. Optional parameters and booleans keep the--flagform.This matches the established precedent set by 0.1.1's pause/unpause positionalization (#59936) and aligns airflowctl with the conventions of the existing
airflowCLI for required params.A parameter is "required" when the operation method declares it without a default and without
| Nonein its annotation. Datamodel-expanded body fields (e.g. fields ofBackfillPostBody) are unaffected and keep--flag.What changed
airflow-ctl/src/airflowctl/ctl/cli_config.py—_inspect_operationsnow captures required-ness from the AST (offsetlen(args) - len(defaults)for the standard Python convention)._create_args_map_from_operationbranches on positional vs flag; a new_create_positional_arghelper dropsdefault=/dest=(argparse rejects those on positional args).airflow-ctl/tests/airflow_ctl/ctl/test_cli_config.py— two new tests cover the required-positional path and the optional-with-default path. Existing 22 tests still pass withtest_command_factoryupdated to reflect the new positional shape forgetanddelete.airflow-ctl/RELEASE_NOTES.rst— entry under Unreleased.How was this tested?
22/22 existing + 2 new tests pass.
[1] https://lists.apache.org/thread/m1qvcvow3l17ytv40vhslh40wn3rntrm