Skip to content

airflowctl: make required CLI params positional, keep optional as --flag#66768

Merged
potiuk merged 2 commits into
apache:mainfrom
1fanwang:airflowctl-positional-required-args
May 12, 2026
Merged

airflowctl: make required CLI params positional, keep optional as --flag#66768
potiuk merged 2 commits into
apache:mainfrom
1fanwang:airflowctl-positional-required-args

Conversation

@1fanwang
Copy link
Copy Markdown
Contributor

Following the dev-list lazy consensus on airflowctl parameter style[1], 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 matches the established precedent set by 0.1.1's pause/unpause positionalization (#59936) and aligns airflowctl with the conventions of the existing airflow CLI for required params.

A parameter is "required" when the operation method declares it without a default and without | None in its annotation. Datamodel-expanded body fields (e.g. fields of BackfillPostBody) are unaffected and keep --flag.

What changed

  • airflow-ctl/src/airflowctl/ctl/cli_config.py_inspect_operations now captures required-ness from the AST (offset len(args) - len(defaults) for the standard Python convention). _create_args_map_from_operation branches on positional vs flag; a new _create_positional_arg helper drops default=/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 with test_command_factory updated to reflect the new positional shape for get and delete.
  • airflow-ctl/RELEASE_NOTES.rst — entry under Unreleased.

How was this tested?

airflowctl dags get-details my_dag           # positional, exit 0
airflowctl dags get-details                  # missing required arg
  error: the following arguments are required: dag_id  (exit 2)

22/22 existing + 2 new tests pass.

[1] https://lists.apache.org/thread/m1qvcvow3l17ytv40vhslh40wn3rntrm

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 potiuk merged commit ffa426b into apache:main May 12, 2026
92 checks passed
@github-actions
Copy link
Copy Markdown
Contributor

Backport failed to create: airflow-ctl/v0-1-test. View the failure log Run details

Note: As of Merging PRs targeted for Airflow 3.X
the committer who merges the PR is responsible for backporting the PRs that are bug fixes (generally speaking) to the maintenance branches.

In matter of doubt please ask in #release-management Slack channel.

Status Branch Result
airflow-ctl/v0-1-test Commit Link

You can attempt to backport this manually by running:

cherry_picker ffa426b airflow-ctl/v0-1-test

This should apply the commit to the airflow-ctl/v0-1-test branch and leave the commit in conflict state marking
the files that need manual conflict resolution.

After you have resolved the conflicts, you can continue the backport process by running:

cherry_picker --continue

If you don't have cherry-picker installed, see the installation guide.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants