Skip to content

Commit

Permalink
Add vs-Typer documentation on keyword multiple values.
Browse files Browse the repository at this point in the history
  • Loading branch information
BrianPugh committed Dec 4, 2024
1 parent b60cab7 commit f27b1e1
Show file tree
Hide file tree
Showing 3 changed files with 62 additions and 2 deletions.
4 changes: 2 additions & 2 deletions docs/source/migration/typer.rst
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,8 @@ Much of Cyclopts's syntax is `Typer`_-inspired. Migrating from Typer should be p
- :meth:`@app.command() <.App.command>`
- In Cyclopts, ``@app.command`` :ref:`always results in a command. <Typer Default Command>` To define an action when no command is provided, see :meth:`@app.default <.App.default>`.

* - :meth:`@app.add_typer`
- :meth:`@app.command`
* - :meth:`app.add_typer(...)`
- :meth:`app.command(...)`
- Sub applications and commands are registered the same way in Cyclopts.

* - :meth:`@app.callback()`
Expand Down
1 change: 1 addition & 0 deletions docs/source/vs_typer/README.rst
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ This section was written about the current version of Typer: ``v0.9.0``.
docstring/README.rst
decorator_parentheses/README.rst
optional_list/README.rst
keyword_multiple_values/README.rst
flag_negation/README.rst
help_defaults/README.rst
validation/README.rst
Expand Down
59 changes: 59 additions & 0 deletions docs/source/vs_typer/keyword_multiple_values/README.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
=======================
Keyword Multiple Values
=======================
In some applications, it is desirable to supply multiple values to a keyword argument.
For example, lets consider an application where we want to specify multiple input files.
We want our application to look like the following:

.. code-block:: console
$ my-program output.bin --input input1.bin input2.bin input3.bin
In Typer, `it is impossible to accomplish this <https://github.com/pallets/click/issues/484>`_.
With Typer, the keyword must be specified before each value:

.. code-block:: console
$ my-program output.bin --input input1.bin --input input2.bin --input input3.bin
By default, Cyclopts behavior mimics Typer, where a single element worth of CLI tokens are consumed.
However, by setting :attr:`.Parameter.consume_multiple` to :obj:`True`, multiple elements worth of CLI tokens will be consumed.
Consider the following example program with a single output path, and multiple input paths.

.. code-block:: python
from cyclopts import App, Parameter
from pathlib import Path
from typing import Annotated
app = App()
@app.default
def main(output: Path, input: Annotated[list[Path], Parameter(consume_multiple=True)]):
print(f"{input=} {output=}")
if __name__ == "__main__":
app()
All of the following invocations are equivalent:

.. code-block:: console
$ my-program out.bin input1.bin input2.bin input3.bin
input=[PosixPath('input1.bin'), PosixPath('input2.bin'), PosixPath('input3.bin')] output=PosixPath('out.bin')
$ my-program out.bin --input input1.bin --input input2.bin --input input3.bin
$ my-program out.bin --input input1.bin input2.bin input3.bin
$ my-program --input input1.bin input2.bin input3.bin --output out.bin
$ my-program --input input1.bin input2.bin input3.bin -- output.bin
To set this configuration for your entire application, supply it to your root :attr:`.App.default_parameter`:

.. code-block:: python
from cyclopts import App, Parameter
app = App(default_parameter=Parameter(consume_multiple=True))

0 comments on commit f27b1e1

Please sign in to comment.