rattail.commands.typer

Typer-based command utilities

class rattail.commands.typer.OrderCommands(*, name: str | None = None, commands: Dict[str, Command] | Sequence[Command] | None = None, rich_markup_mode: Literal['markdown', 'rich', None] = 'rich', rich_help_panel: str | None = None, **attrs: Any)[source]

Custom base class for top-level Typer command.

This exists only to ensure the commands listing is sorted when displayed with --help param, since Typer “by design” will not sort them.

See also this Typer doc.

rattail.commands.typer.file_exporter_command(fn)[source]

Decorator for file export commands. Adds common params based on file_exporter_command_template().

rattail.commands.typer.file_exporter_command_template(output_dir: ~pathlib.Annotated[~pathlib.Path, <typer.models.OptionInfo object at 0x7f95d1f0ddd0>] = Ellipsis)[source]

Stub function to provide signature for exporter commands which produce data file(s) as output. Used with file_exporter_command().

rattail.commands.typer.file_importer_command(fn)[source]

Decorator for file import commands. Adds common params based on file_importer_command_template().

rattail.commands.typer.file_importer_command_template(input_dir: ~pathlib.Annotated[~pathlib.Path, <typer.models.OptionInfo object at 0x7f95d1f0df50>] = Ellipsis)[source]

Stub function to provide signature for importer commands which require data file(s) as input. Used with file_importer_command().

rattail.commands.typer.importer_command(fn)[source]

Decorator for import/export commands. Adds common params based on importer_command_template().

rattail.commands.typer.importer_command_template(models: ~typing.Annotated[~typing.List[str] | None, <typer.models.ArgumentInfo object at 0x7f95d1f0c410>] = None, list_all_models: ~typing.Annotated[bool, <typer.models.OptionInfo object at 0x7f95d2d4fb50>] = False, list_default_models: ~typing.Annotated[bool, <typer.models.OptionInfo object at 0x7f95d1f0c3d0>] = False, make_batches: ~typing.Annotated[bool, <typer.models.OptionInfo object at 0x7f95d1f0c510>] = False, key: ~typing.Annotated[str, <typer.models.OptionInfo object at 0x7f95d1f0c610>] = None, fields: ~typing.Annotated[str, <typer.models.OptionInfo object at 0x7f95d1f0c710>] = None, exclude_fields: ~typing.Annotated[str, <typer.models.OptionInfo object at 0x7f95d1f0c810>] = None, fuzzy_fields: ~typing.Annotated[str, <typer.models.OptionInfo object at 0x7f95d1f0c910>] = None, fuzz_factor: ~typing.Annotated[int, <typer.models.OptionInfo object at 0x7f95d1f0ca10>] = 1, create: ~typing.Annotated[bool, <typer.models.OptionInfo object at 0x7f95d1f0cb10>] = True, max_create: ~typing.Annotated[int, <typer.models.OptionInfo object at 0x7f95d1f0cc10>] = None, update: ~typing.Annotated[bool, <typer.models.OptionInfo object at 0x7f95d1f0cd10>] = True, max_update: ~typing.Annotated[int, <typer.models.OptionInfo object at 0x7f95d1f0ce10>] = None, delete: ~typing.Annotated[bool, <typer.models.OptionInfo object at 0x7f95d1f0cf10>] = False, max_delete: ~typing.Annotated[int, <typer.models.OptionInfo object at 0x7f95d1f0d010>] = None, max_total: ~typing.Annotated[int, <typer.models.OptionInfo object at 0x7f95d1f0d110>] = None, start_date: ~datetime.Annotated[~datetime.datetime, <typer.models.OptionInfo object at 0x7f95d1f0d210>] = None, end_date: ~datetime.Annotated[~datetime.datetime, <typer.models.OptionInfo object at 0x7f95d1f0d310>] = None, year: ~typing.Annotated[int, <typer.models.OptionInfo object at 0x7f95d1f0d490>] = None, batch_size: ~typing.Annotated[int, <typer.models.OptionInfo object at 0x7f95d1f0d650>] = 200, collect_changes: ~typing.Annotated[bool, <typer.models.OptionInfo object at 0x7f95d1f0d7d0>] = True, warnings: ~typing.Annotated[bool, <typer.models.OptionInfo object at 0x7f95d1f0d950>] = False, max_diffs: ~typing.Annotated[int, <typer.models.OptionInfo object at 0x7f95d1f0dad0>] = None, dry_run: ~typing.Annotated[bool, <typer.models.OptionInfo object at 0x7f95d1f0dc50>] = False)[source]

Stub function which provides a common param signature; used with importer_command().

rattail.commands.typer.make_cli_config(ctx)[source]

Make a config object according to the command-line context (params).

Parameters:

ctxtyper.Context instance

Returns:

RattailConfig instance

rattail.commands.typer.make_typer(**kwargs)[source]

Create a Typer command instance, per Rattail conventions.

This function is used to create the top-level rattail command, rattail_typer. You can use it to create additional top-level commands for your app, as needed.

Returns:

typer.Typer instance

rattail.commands.typer.typer_callback(ctx: ~typer.models.Context, config_paths: ~typing.Annotated[~typing.List[~pathlib.Path] | None, <typer.models.OptionInfo object at 0x7f95d20f2f10>] = None, plus_config_paths: ~typing.Annotated[~typing.List[~pathlib.Path] | None, <typer.models.OptionInfo object at 0x7f95d20f3910>] = None, progress: ~typing.Annotated[bool, <typer.models.OptionInfo object at 0x7f95d20f39d0>] = False, no_init: ~typing.Annotated[bool, <typer.models.OptionInfo object at 0x7f95d20f3a90>] = False, no_extend_config: ~typing.Annotated[bool, <typer.models.OptionInfo object at 0x7f95d20f3b90>] = False, verbose: ~typing.Annotated[bool, <typer.models.OptionInfo object at 0x7f95d20f3c90>] = False, progress_socket: ~typing.Annotated[str, <typer.models.OptionInfo object at 0x7f95d20f3d90>] = None, runas_username: ~typing.Annotated[str, <typer.models.OptionInfo object at 0x7f95d20f3e90>] = None, versioning: ~typing.Annotated[bool, <typer.models.OptionInfo object at 0x7f95d20f3f90>] = False, no_versioning: ~typing.Annotated[bool, <typer.models.OptionInfo object at 0x7f95d1f0c0d0>] = False)[source]

Generic callback for use with top-level commands.

rattail.commands.typer.typer_eager_imports(group: [<class 'typer.main.Typer'>, <class 'str'>])[source]

Eagerly import all modules which are registered as having subcommands belonging to the given group.

This is used to locate subcommands which may be defined by multiple different packages. It is mostly needed for the main rattail command, since e.g. various POS integration packages may define additional subcommands for it.

Most custom apps will define their own top-level command and some subcommands, but will have no need to “discover” additional subcommands defined elsewhere. Hence you normally would not need to call this function.

However if you wish to define a rattail subcommand(s), you would need to register the entry point for your module(s) containing the subcommand(s) like so (in pyproject.toml):

[project.entry-points."rattail.typer_imports"]
poser = "poser.commands"

Note that rattail.typer_imports indicates you are registering a module which defines rattail subcommands. The poser name is arbitrary but should match your package name.

Parameters:

group – Typer group command, or the name of one.

rattail.commands.typer.typer_get_runas_user(ctx, session=None)[source]

Convenience function to get the “runas” User object for the current command.

Uses rattail.app.AppHandler.get_runas_user() under the hood, but the --runas command line param provides the default username.