From ed2bade230f44316dcea2f226dbd9b935427a329d3886b30b5fad4d02b7da235 Mon Sep 17 00:00:00 2001 From: Matthias Bach Date: Tue, 27 May 2025 21:30:44 +0000 Subject: [PATCH] OBS-URL: https://build.opensuse.org/package/show/devel:languages:python/python-typer?expand=0&rev=47 --- .gitattributes | 23 + .gitignore | 1 + python-typer-rpmlintrc | 5 + python-typer.changes | 238 +++++++++++ python-typer.spec | 99 +++++ support-click-8.2.patch | 926 ++++++++++++++++++++++++++++++++++++++++ typer-0.12.3.tar.gz | 3 + typer-0.12.5.tar.gz | 3 + typer-0.13.1.tar.gz | 3 + typer-0.15.1.tar.gz | 3 + typer-0.15.2.tar.gz | 3 + typer-0.15.3.tar.gz | 3 + typer-0.16.0.tar.gz | 3 + 13 files changed, 1313 insertions(+) create mode 100644 .gitattributes create mode 100644 .gitignore create mode 100644 python-typer-rpmlintrc create mode 100644 python-typer.changes create mode 100644 python-typer.spec create mode 100644 support-click-8.2.patch create mode 100644 typer-0.12.3.tar.gz create mode 100644 typer-0.12.5.tar.gz create mode 100644 typer-0.13.1.tar.gz create mode 100644 typer-0.15.1.tar.gz create mode 100644 typer-0.15.2.tar.gz create mode 100644 typer-0.15.3.tar.gz create mode 100644 typer-0.16.0.tar.gz diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..9b03811 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,23 @@ +## Default LFS +*.7z filter=lfs diff=lfs merge=lfs -text +*.bsp filter=lfs diff=lfs merge=lfs -text +*.bz2 filter=lfs diff=lfs merge=lfs -text +*.gem filter=lfs diff=lfs merge=lfs -text +*.gz filter=lfs diff=lfs merge=lfs -text +*.jar filter=lfs diff=lfs merge=lfs -text +*.lz filter=lfs diff=lfs merge=lfs -text +*.lzma filter=lfs diff=lfs merge=lfs -text +*.obscpio filter=lfs diff=lfs merge=lfs -text +*.oxt filter=lfs diff=lfs merge=lfs -text +*.pdf filter=lfs diff=lfs merge=lfs -text +*.png filter=lfs diff=lfs merge=lfs -text +*.rpm filter=lfs diff=lfs merge=lfs -text +*.tbz filter=lfs diff=lfs merge=lfs -text +*.tbz2 filter=lfs diff=lfs merge=lfs -text +*.tgz filter=lfs diff=lfs merge=lfs -text +*.ttf filter=lfs diff=lfs merge=lfs -text +*.txz filter=lfs diff=lfs merge=lfs -text +*.whl filter=lfs diff=lfs merge=lfs -text +*.xz filter=lfs diff=lfs merge=lfs -text +*.zip filter=lfs diff=lfs merge=lfs -text +*.zst filter=lfs diff=lfs merge=lfs -text diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..57affb6 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.osc diff --git a/python-typer-rpmlintrc b/python-typer-rpmlintrc new file mode 100644 index 0000000..f91f336 --- /dev/null +++ b/python-typer-rpmlintrc @@ -0,0 +1,5 @@ +# Upstream does not declare a dependency as it ships all files in both packages, +# which scarily works with pip unless you start uninstalling one of the two packages. +# We use files from python-typer-slim where they exist in both. Thus, we require +# the dependency although it is not there upstream. +addFilter("python\d+-typer.noarch: W: python-leftover-require python\d+-typer-slim") diff --git a/python-typer.changes b/python-typer.changes new file mode 100644 index 0000000..9d9f1bd --- /dev/null +++ b/python-typer.changes @@ -0,0 +1,238 @@ +------------------------------------------------------------------- +Tue May 27 20:52:25 UTC 2025 - Matthias Bach - 0.16.0 + +- Update to 0.16.0 + * Add compatibility with Click 8.2. +- Remove support-click-8.2.patch as it is no longer needed. + +------------------------------------------------------------------- +Fri May 16 05:00:12 UTC 2025 - Steve Kowalik + +- Add patch support-click-8.2.patch: + * Support both click 8.1 and 8.2. +- Switch to autosetup macro. + +------------------------------------------------------------------- +Tue Apr 29 17:58:31 UTC 2025 - Matthias Bach - 0.15.3 + +- Update to 0.15.3 + * Ensure that autocompletion works for Path arguments/options. + * Fix newline after header in help text. + +------------------------------------------------------------------- +Fri Feb 28 16:41:20 UTC 2025 - Matthias Bach - 0.15.2 + +- Update to 0.15.2 + * Allow custom styles for commands in help output. + * Avoid the unnecessary import of typing_extensions in newer + Python versions. + * Fix shell completions for the fish shell. + +------------------------------------------------------------------- +Wed Dec 4 20:49:15 UTC 2024 - Matthias Bach - 0.15.1 + +- Update to 0.15.1 + * Deprecate shell_complete and continue to use autocompletion for + CLI parameters. + +------------------------------------------------------------------- +Tue Dec 3 20:36:00 UTC 2024 - Matthias Bach - 0.15.0 + +- Update to 0.15.0 + * Add support for extending typer apps without passing a name, + add commands to the top level. + * Breaking change: Remove auto naming of groups added via + add_typer based on the group's callback function name. + +------------------------------------------------------------------- +Wed Nov 20 17:25:27 UTC 2024 - Dirk Müller + +- update to 0.13.1: + * Remove Rich tags when showing completion text. + * Render Rich markup as HTML in Markdown docs. + * Support cp850 encoding for auto-completion in PowerShell. + * Allow gettext translation of help message. + * Fix printing HTML from Rich output. PR #1055 by @tiangolo. + * Update markdown includes to use the new simpler format. PR +- update to 0.13.0: + * Handle `KeyboardInterrupt` separately from other + exceptions. + * Update `launch` to not print anything when opening urls. + * Show help items in order of definition. + * Fix equality check for custom classes. + * Allow colon in zsh autocomplete values and descriptions. + * Deprecate support for `is_flag` and `flag_value` + parameters. + * Remove unused functionality from `_typing.py` file. + * Fix typo in function name `_make_rich_text`. + +------------------------------------------------------------------- +Fri Sep 27 15:41:42 UTC 2024 - Matthias Bach - 0.12.5 + +- Switch PDM dependency from python3-pdm to python3-pdm-backend to + account for changes in that package's structure. + +------------------------------------------------------------------- +Thu Aug 29 17:42:57 UTC 2024 - Matthias Bach - 0.12.5 + +- Update to upstream version 0.12.5 + * Unify the width of the Rich console for help and errors. + * Improve assertion error message if a group is not a valid subclass. + * Ensure rich_markup_mode=None disables Rich formatting. + +------------------------------------------------------------------- +Sat Aug 17 08:05:30 UTC 2024 - Matthias Bach - 0.12.4 + +- Update to upstream version 0.12.4 + * Fix support for UnionType (e.g. str | None) with Python 3.11. + * Fix zsh autocompletion installation. + * Fix usage of Annotated with future annotations in Python 3.7+. + * Fix shell_complete not working for Arguments. + +------------------------------------------------------------------- +Fri Apr 12 15:28:57 UTC 2024 - Matthias Bach + +- Add conflict declaration with Erlang as both packages provide + /usr/bin/typer + +------------------------------------------------------------------- +Tue Apr 9 20:28:42 UTC 2024 - Matthias Bach - 0.12.3 + +- Update to upstream version 0.12.3 + * Fix Rich formatting with no commands. + * Improve column help display, ensure commands column width is + the same on all panels. + * Add support for an argument of type Optional[Tuple] and default + +------------------------------------------------------------------- +Sat Apr 6 13:05:09 UTC 2024 - Matthias Bach - 0.12.1 + +- Update to upstream version 0.12.1 + * The core functionality has been extracted into + python-typer-slim. + * The typer command is now provided as part of the main typer + package. + * Formerly optional dependencies required for full + functionality are now automatically installed. If they are not + required, the slim package can be used. +- Drop set-proper-pythonpath-for-tutorial-script-tests.patch as it + is now applied in python-typer-slim. + +------------------------------------------------------------------- +Fri Mar 29 09:29:31 UTC 2024 - Matthias Bach - 0.11.1 + +- Update to upstream version 0.10.1 + * Internal and dependency changes +- Fix missing requirement specification on + python-typing_extensions. + +------------------------------------------------------------------- +Mon Mar 25 21:08:07 UTC 2024 - Matthias Bach - 0.10.0 + +- Update to upstream version 0.10.0 + * Fix default value of None for CLI Parameters when the type is + list | None and the default value is None. + * Improve support for CLI translations using gettext. + * Fix evaluating stringified annotations in Python 3.10. + * Fix display of default value for Enum parameters inside of a + list, include docs and tests. + * Update type annotations for show_default parameter and update + docs for setting a "Custom default string". + * Add missing default_factory in Argument overloads. + * Fix preserving case in enum values. + +------------------------------------------------------------------- +Tue Oct 17 19:08:42 UTC 2023 - Matthias Bach - 0.9.0 + +- Fix sle15_python_module_python being on wrong line post spec + auto-format. + +------------------------------------------------------------------- +Tue Oct 17 06:59:59 UTC 2023 - Matthias Bach - 0.9.0 + +- add sle15_python_module_python + +------------------------------------------------------------------- +Sun May 7 14:47:17 UTC 2023 - Matthias Bach - 0.9.0 + +- Update to upstream version 0.9.0 + * Add support for PEP-593 Annotated for specifying options and + arguments. + * Add support for custom types and parsers. +- Drop patch run-subprocesses-with-correct-python.patch that got + included upstream. + +------------------------------------------------------------------- +Thu Jan 5 15:07:01 UTC 2023 - Matthias Bach - 0.7.0 + +- Adapt set-proper-pythonpath-for-tutorial-script-tests.patch to + also work for Python 3.11. + +------------------------------------------------------------------- +Sun Nov 6 19:35:15 UTC 2022 - Matthias Bach - 0.7.0 + +- Update to upstream version 0.7.0 + * Make typer.run() not add completion scripts by default, it only + makes sense in installed apps. + * Add support for Python 3.11. + +------------------------------------------------------------------- +Mon Jul 18 10:22:12 UTC 2022 - Matthias Bach - 0.6.1 + +- Update to upstream version 0.6.1 + * Adds deep integrations with Rich. If Rich is available, it will + be used to show the content from --help options, validation + errors, and even errors in apps. + * Support for Rich Markup and Markdown in docstrings, CLI + parameters, help, and epilog. + * Fix type conversion for List and Tuple. + * Fix context_settings for a Typer apps with a single command. + * Fix setting FORCE_TERMINAL with colors. +- Refreshed patches + +------------------------------------------------------------------- +Fri Jun 24 18:20:30 UTC 2022 - Matthias Bach - 0.4.1 + +- Add run-subprocesses-with-correct-python.patch to ensure tests + aren't accidentally running subprocesses using the wrong Python + version. +- Add set-proper-pythonpath-for-tutorial-script-tests.patch to fix + issue with build failing due to import failures. + +------------------------------------------------------------------- +Tue Jun 14 14:37:26 UTC 2022 - Matthias Bach - 0.4.1 + +- Update to upstream version 0.4.1 + * Fix import of get_terminal_size for Click 8.1.0 support. +- Switch from traditional setup.py installation to pyproject macros + as upstream no longer ships its setup.py compability wrapper. + +------------------------------------------------------------------- +Mon Aug 30 19:31:17 UTC 2021 - Matthias Bach - 0.4.0 + +- Update to upstream version 0.4.0 + * Add support for Click 8 while keeping compatibility with + Click 7. +- Remove basic-click8-compat.patch as Click 8 compatibility is now + provided upstream. + +------------------------------------------------------------------- +Fri Jul 23 18:56:14 UTC 2021 - Matthias Bach + +- Resolve Typer no longer working since Click got bumped to version + 8. + * This removes support for autocompletion. +- Add basic-click8-compat.patch + +------------------------------------------------------------------- +Wed Apr 14 16:06:14 UTC 2021 - Matthias Bach + +- Properly specify package group. +- Suppress false-positive detection of empty file in rpmlint. +- Properly declare minimum version requirement vs. python-click to + avoid broken installation on Leap. + +------------------------------------------------------------------- +Tue Apr 13 19:30:11 UTC 2021 - Matthias Bach - 0.3.2 + +- Initial package release diff --git a/python-typer.spec b/python-typer.spec new file mode 100644 index 0000000..47ae070 --- /dev/null +++ b/python-typer.spec @@ -0,0 +1,99 @@ +# +# spec file for package python-typer +# +# Copyright (c) 2025 SUSE LLC +# Copyright (c) 2021 Matthias Bach +# +# All modifications and additions to the file contributed by third parties +# remain the property of their copyright owners, unless otherwise agreed +# upon. The license for this file, and modifications and additions to the +# file, is the same license as for the pristine package itself (unless the +# license for the pristine package is not an Open Source License, in which +# case the license is the MIT License). An "Open Source License" is a +# license that conforms to the Open Source Definition (Version 1.9) +# published by the Open Source Initiative. + +# Please submit bugfixes or comments via https://bugs.opensuse.org/ +# + + +%define plainpython python +%{?sle15_python_module_pythons} +Name: python-typer +Version: 0.16.0 +Release: 0 +Summary: Typer, build great CLIs. Easy to code. Based on Python type hints +License: MIT +URL: https://github.com/tiangolo/typer +Source: https://files.pythonhosted.org/packages/source/t/typer/typer-%{version}.tar.gz +Source2: %{name}-rpmlintrc +BuildRequires: %{python_module coverage} +BuildRequires: %{python_module pdm-backend} +BuildRequires: %{python_module pip} +BuildRequires: %{python_module pytest} +BuildRequires: %{python_module rich} +BuildRequires: %{python_module shellingham} +BuildRequires: %{python_module typer-slim} +BuildRequires: fdupes +BuildRequires: python-rpm-macros +# Work around Python dependency not being auto-added as there are no modules provided +Requires: %{plainpython}(abi) = %{python_version} +Requires: python-click +Requires: python-rich +Requires: python-shellingham +Requires: python-typer-slim >= %version +Requires: python-typing_extensions +Requires(post): update-alternatives +Requires(postun): update-alternatives +# both packages provide /usr/bin/typer +Conflicts: erlang +BuildArch: noarch +%python_subpackages + +%description +Typer is a library for building CLI applications based on Python 3.6+ type hints. + +Based on type hints, Typer enables great editor support and completion for developers. +With automatic help and completion, Typer makes CLIs easy to use for users. + +This package provides the Typer Python package and ensures all dependencies required +for full functionality are provided. In addition, it provides the command "typer" +which allows users to run scripts not using typer with the same command line comfort +as those that do. + +%prep +%autosetup -p1 -n typer-%{version} + +%build +%pyproject_wheel + +%install +%pyproject_install + +# Remove files that were already installed by typer-slim +%python_expand rm -r %{buildroot}%{$python_sitelib}/typer + +%python_clone -a %{buildroot}/%{_bindir}/typer + +%python_expand %fdupes %{buildroot}%{$python_sitelib} + +%check +# Broken with click 8.2.0: +# - test_enum/test_tutorial003 +# - test_script_completion_run and test_completion_show_invalid_shell +# - test_invalid_score stumbles over linebreaks in the output +%pytest -k 'not ((test_enum and test_tutorial003) or test_script_completion_run or test_completion_show_invalid_shell or test_invalid_score)' + +%post +%python_install_alternative typer + +%postun +%python_uninstall_alternative typer + +%files %{python_files} +%doc README.md +%license LICENSE +%python_alternative %{_bindir}/typer +%{python_sitelib}/typer-%{version}.dist-info + +%changelog diff --git a/support-click-8.2.patch b/support-click-8.2.patch new file mode 100644 index 0000000..c34956a --- /dev/null +++ b/support-click-8.2.patch @@ -0,0 +1,926 @@ +From 6cd8b4d08ffc70cc0f62dfa011c71f68f1f0d5fa Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Sebasti=C3=A1n=20Ram=C3=ADrez?= +Date: Tue, 13 May 2025 19:11:32 +0200 +Subject: [PATCH 1/6] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20Update=20internals=20f?= + =?UTF-8?q?or=20compatibility=20with=20Click=208.2?= +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +--- + typer/core.py | 30 ++++++++++++++++++++++++++---- + typer/rich_utils.py | 8 +++++++- + 2 files changed, 33 insertions(+), 5 deletions(-) + +Index: typer_slim-0.15.3/typer/core.py +=================================================================== +--- typer_slim-0.15.3.orig/typer/core.py ++++ typer_slim-0.15.3/typer/core.py +@@ -329,7 +329,7 @@ class TyperArgument(click.core.Argument) + # to support Arguments + if self.hidden: + return None +- name = self.make_metavar() ++ name = self.make_metavar(ctx=ctx) + help = self.help or "" + extra = [] + if self.show_envvar: +@@ -375,7 +375,8 @@ class TyperArgument(click.core.Argument) + help = f"{help} {extra_str}" if help else f"{extra_str}" + return name, help + +- def make_metavar(self) -> str: ++ # TODO: When deprecating Click < 8.2, make context required ++ def make_metavar(self, ctx: Union[click.Context, None] = None) -> str: + # Modified version of click.core.Argument.make_metavar() + # to include Argument name + if self.metavar is not None: +@@ -383,7 +384,16 @@ class TyperArgument(click.core.Argument) + var = (self.name or "").upper() + if not self.required: + var = f"[{var}]" +- type_var = self.type.get_metavar(self) ++ # TODO: When Click < 8.2, remove this ++ signature = inspect.signature(self.type.get_metavar) ++ if "ctx" in signature.parameters: ++ # Click >= 8.2 ++ type_var = self.type.get_metavar(self, ctx=ctx) # type: ignore[arg-type] ++ else: ++ # Click < 8.2 ++ type_var = self.type.get_metavar(self) # type: ignore[call-arg] ++ # TODO: /When Click < 8.2, remove this, uncomment the line below ++ # type_var = self.type.get_metavar(self, ctx=use_ctx) + if type_var: + var += f":{type_var}" + if self.nargs != 1: +@@ -480,6 +490,16 @@ class TyperOption(click.core.Option): + ) -> Optional[Union[Any, Callable[[], Any]]]: + return _extract_default_help_str(self, ctx=ctx) + ++ # TODO: Remove when deprecating Click < 8.2 ++ def make_metavar(self, ctx: Union[click.Context, None] = None) -> str: ++ super_make_metavar = super().make_metavar ++ signature = inspect.signature(super_make_metavar) ++ if "ctx" in signature.parameters: ++ # Click >= 8.2 ++ return super_make_metavar(ctx=ctx) # type: ignore[arg-type] ++ # Click < 8.2 ++ return super().make_metavar() # type: ignore[call-arg] ++ + def get_help_record(self, ctx: click.Context) -> Optional[Tuple[str, str]]: + # Duplicate all of Click's logic only to modify a single line, to allow boolean + # flags with only names for False values as it's currently supported by Typer +@@ -498,7 +518,7 @@ class TyperOption(click.core.Option): + any_prefix_is_slash = True + + if not self.is_flag and not self.count: +- rv += f" {self.make_metavar()}" ++ rv += f" {self.make_metavar(ctx=ctx)}" + + return rv + +Index: typer_slim-0.15.3/typer/rich_utils.py +=================================================================== +--- typer_slim-0.15.3.orig/typer/rich_utils.py ++++ typer_slim-0.15.3/typer/rich_utils.py +@@ -370,7 +370,13 @@ def _print_options_panel( + + # Column for a metavar, if we have one + metavar = Text(style=STYLE_METAVAR, overflow="fold") +- metavar_str = param.make_metavar() ++ # TODO: when deprecating Click < 8.2, make ctx required ++ signature = inspect.signature(param.make_metavar) ++ if "ctx" in signature.parameters: ++ metavar_str = param.make_metavar(ctx=ctx) ++ else: ++ # Click < 8.2 ++ metavar_str = param.make_metavar() # type: ignore[call-arg] + + # Do it ourselves if this is a positional argument + if ( +Index: typer_slim-0.15.3/typer/_completion_classes.py +=================================================================== +--- typer_slim-0.15.3.orig/typer/_completion_classes.py ++++ typer_slim-0.15.3/typer/_completion_classes.py +@@ -17,6 +17,14 @@ from ._completion_shared import ( + ) + + try: ++ from click.shell_completion import split_arg_string as click_split_arg_string ++except ImportError: # pragma: no cover ++ # TODO: when removing support for Click < 8.2, remove this import ++ from click.parser import ( # type: ignore[no-redef] ++ split_arg_string as click_split_arg_string, ++ ) ++ ++try: + import shellingham + except ImportError: # pragma: no cover + shellingham = None +@@ -43,7 +51,7 @@ class BashComplete(click.shell_completio + } + + def get_completion_args(self) -> Tuple[List[str], str]: +- cwords = click.parser.split_arg_string(os.environ["COMP_WORDS"]) ++ cwords = click_split_arg_string(os.environ["COMP_WORDS"]) + cword = int(os.environ["COMP_CWORD"]) + args = cwords[1:cword] + +@@ -80,7 +88,7 @@ class ZshComplete(click.shell_completion + + def get_completion_args(self) -> Tuple[List[str], str]: + completion_args = os.getenv("_TYPER_COMPLETE_ARGS", "") +- cwords = click.parser.split_arg_string(completion_args) ++ cwords = click_split_arg_string(completion_args) + args = cwords[1:] + if args and not completion_args.endswith(" "): + incomplete = args[-1] +@@ -131,7 +139,7 @@ class FishComplete(click.shell_completio + + def get_completion_args(self) -> Tuple[List[str], str]: + completion_args = os.getenv("_TYPER_COMPLETE_ARGS", "") +- cwords = click.parser.split_arg_string(completion_args) ++ cwords = click_split_arg_string(completion_args) + args = cwords[1:] + if args and not completion_args.endswith(" "): + incomplete = args[-1] +@@ -185,7 +193,7 @@ class PowerShellComplete(click.shell_com + def get_completion_args(self) -> Tuple[List[str], str]: + completion_args = os.getenv("_TYPER_COMPLETE_ARGS", "") + incomplete = os.getenv("_TYPER_COMPLETE_WORD_TO_COMPLETE", "") +- cwords = click.parser.split_arg_string(completion_args) ++ cwords = click_split_arg_string(completion_args) + args = cwords[1:-1] if incomplete else cwords[1:] + return args, incomplete + +Index: typer_slim-0.15.3/tests/test_others.py +=================================================================== +--- typer_slim-0.15.3.orig/tests/test_others.py ++++ typer_slim-0.15.3/tests/test_others.py +@@ -243,7 +243,7 @@ def test_forward_references(): + + result = runner.invoke(app, ["Hello", "2", "invalid"]) + +- assert "Invalid value for 'ARG3': 'invalid' is not a valid integer" in result.stdout ++ assert "Invalid value for 'ARG3': 'invalid' is not a valid integer" in result.output + result = runner.invoke(app, ["Hello", "2", "3", "--arg4", "--arg5"]) + assert ( + "arg1: Hello\narg2: 2\narg3: 3\narg4: True\narg5: True\n" +Index: typer_slim-0.15.3/tests/test_tutorial/test_arguments/test_optional/test_tutorial001.py +=================================================================== +--- typer_slim-0.15.3.orig/tests/test_tutorial/test_arguments/test_optional/test_tutorial001.py ++++ typer_slim-0.15.3/tests/test_tutorial/test_arguments/test_optional/test_tutorial001.py +@@ -31,7 +31,7 @@ def test_call_no_arg_no_rich(): + typer.core.rich = None + result = runner.invoke(app) + assert result.exit_code != 0 +- assert "Error: Missing argument 'NAME'" in result.stdout ++ assert "Error: Missing argument 'NAME'" in result.output + typer.core.rich = rich + + +Index: typer_slim-0.15.3/tests/test_tutorial/test_arguments/test_optional/test_tutorial001_an.py +=================================================================== +--- typer_slim-0.15.3.orig/tests/test_tutorial/test_arguments/test_optional/test_tutorial001_an.py ++++ typer_slim-0.15.3/tests/test_tutorial/test_arguments/test_optional/test_tutorial001_an.py +@@ -31,7 +31,7 @@ def test_call_no_arg_no_rich(): + typer.core.rich = None + result = runner.invoke(app) + assert result.exit_code != 0 +- assert "Error: Missing argument 'NAME'" in result.stdout ++ assert "Error: Missing argument 'NAME'" in result.output + typer.core.rich = rich + + +Index: typer_slim-0.15.3/tests/test_tutorial/test_arguments/test_optional/test_tutorial003.py +=================================================================== +--- typer_slim-0.15.3.orig/tests/test_tutorial/test_arguments/test_optional/test_tutorial003.py ++++ typer_slim-0.15.3/tests/test_tutorial/test_arguments/test_optional/test_tutorial003.py +@@ -31,7 +31,7 @@ def test_call_no_arg_no_rich(): + typer.core.rich = None + result = runner.invoke(app) + assert result.exit_code != 0 +- assert "Error: Missing argument 'NAME'" in result.stdout ++ assert "Error: Missing argument 'NAME'" in result.output + typer.core.rich = rich + + +Index: typer_slim-0.15.3/tests/test_tutorial/test_multiple_values/test_arguments_with_multiple_values/test_tutorial002.py +=================================================================== +--- typer_slim-0.15.3.orig/tests/test_tutorial/test_multiple_values/test_arguments_with_multiple_values/test_tutorial002.py ++++ typer_slim-0.15.3/tests/test_tutorial/test_multiple_values/test_arguments_with_multiple_values/test_tutorial002.py +@@ -30,7 +30,7 @@ def test_defaults(): + def test_invalid_args(): + result = runner.invoke(app, ["Draco", "Hagrid"]) + assert result.exit_code != 0 +- assert "Argument 'names' takes 3 values" in result.stdout ++ assert "Argument 'names' takes 3 values" in result.output + + + def test_valid_args(): +Index: typer_slim-0.15.3/tests/test_tutorial/test_multiple_values/test_arguments_with_multiple_values/test_tutorial002_an.py +=================================================================== +--- typer_slim-0.15.3.orig/tests/test_tutorial/test_multiple_values/test_arguments_with_multiple_values/test_tutorial002_an.py ++++ typer_slim-0.15.3/tests/test_tutorial/test_multiple_values/test_arguments_with_multiple_values/test_tutorial002_an.py +@@ -32,7 +32,7 @@ def test_defaults(): + def test_invalid_args(): + result = runner.invoke(app, ["Draco", "Hagrid"]) + assert result.exit_code != 0 +- assert "Argument 'names' takes 3 values" in result.stdout ++ assert "Argument 'names' takes 3 values" in result.output + + + def test_valid_args(): +Index: typer_slim-0.15.3/tests/test_tutorial/test_parameter_types/test_datetime/test_tutorial001.py +=================================================================== +--- typer_slim-0.15.3.orig/tests/test_tutorial/test_parameter_types/test_datetime/test_tutorial001.py ++++ typer_slim-0.15.3/tests/test_tutorial/test_parameter_types/test_datetime/test_tutorial001.py +@@ -30,7 +30,7 @@ def test_invalid(): + assert result.exit_code != 0 + assert ( + "Invalid value for 'BIRTH:[%Y-%m-%d|%Y-%m-%dT%H:%M:%S|%Y-%m-%d %H:%M:%S]':" +- in result.stdout ++ in result.output + ) + assert "'july-19-1989' does not match the formats" in result.output + assert "%Y-%m-%d" in result.output +Index: typer_slim-0.15.3/tests/test_tutorial/test_terminating/test_tutorial003.py +=================================================================== +--- typer_slim-0.15.3.orig/tests/test_tutorial/test_terminating/test_tutorial003.py ++++ typer_slim-0.15.3/tests/test_tutorial/test_terminating/test_tutorial003.py +@@ -38,8 +38,8 @@ def test_root_no_rich(): + typer.core.rich = None + result = runner.invoke(app, ["root"]) + assert result.exit_code == 1 +- assert "The root user is reserved" in result.stdout +- assert "Aborted!" in result.stdout ++ assert "The root user is reserved" in result.output ++ assert "Aborted!" in result.output + typer.core.rich = rich + + +Index: typer_slim-0.15.3/tests/test_tutorial/test_using_click/test_tutorial003.py +=================================================================== +--- typer_slim-0.15.3.orig/tests/test_tutorial/test_using_click/test_tutorial003.py ++++ typer_slim-0.15.3/tests/test_tutorial/test_using_click/test_tutorial003.py +@@ -10,7 +10,7 @@ runner = CliRunner() + + def test_cli(): + result = runner.invoke(mod.typer_click_object, []) +- assert "Missing command" in result.stdout ++ assert "Missing command" in result.output + + + def test_help(): +Index: typer_slim-0.15.3/tests/test_tutorial/test_using_click/test_tutorial004.py +=================================================================== +--- typer_slim-0.15.3.orig/tests/test_tutorial/test_using_click/test_tutorial004.py ++++ typer_slim-0.15.3/tests/test_tutorial/test_using_click/test_tutorial004.py +@@ -10,9 +10,9 @@ runner = CliRunner() + + def test_cli(): + result = runner.invoke(mod.cli, []) +- assert "Usage" in result.stdout +- assert "dropdb" in result.stdout +- assert "sub" in result.stdout ++ assert "Usage" in result.output ++ assert "dropdb" in result.output ++ assert "sub" in result.output + + + def test_typer(): +Index: typer_slim-0.15.3/tests/test_tutorial/test_options/test_required/test_tutorial001.py +=================================================================== +--- typer_slim-0.15.3.orig/tests/test_tutorial/test_options/test_required/test_tutorial001.py ++++ typer_slim-0.15.3/tests/test_tutorial/test_options/test_required/test_tutorial001.py +@@ -1,3 +1,4 @@ ++import importlib.metadata + import subprocess + import sys + +@@ -13,10 +14,18 @@ app = typer.Typer() + app.command()(mod.main) + + ++click_version_str = importlib.metadata.version("click") ++click_version = tuple(int(part) for part in click_version_str.split('.')) ++if click_version >= (8, 2): ++ extra = " (env var: 'None')" ++else: ++ extra = "" ++ ++ + def test_1(): + result = runner.invoke(app, ["Camila"]) + assert result.exit_code != 0 +- assert "Missing option '--lastname'." in result.output ++ assert f"Missing option '--lastname'{extra}." in result.output + + + def test_option_lastname(): +Index: typer_slim-0.15.3/tests/test_tutorial/test_options/test_callback/test_tutorial001.py +=================================================================== +--- typer_slim-0.15.3.orig/tests/test_tutorial/test_options/test_callback/test_tutorial001.py ++++ typer_slim-0.15.3/tests/test_tutorial/test_options/test_callback/test_tutorial001.py +@@ -1,3 +1,4 @@ ++import importlib.metadata + import subprocess + import sys + +@@ -12,6 +13,14 @@ app = typer.Typer() + app.command()(mod.main) + + ++click_version_str = importlib.metadata.version("click") ++click_version = tuple(int(part) for part in click_version_str.split('.')) ++if click_version >= (8, 2): ++ extra = " (env var: 'None')" ++else: ++ extra = "" ++ ++ + def test_1(): + result = runner.invoke(app, ["--name", "Camila"]) + assert result.exit_code == 0 +@@ -21,7 +30,7 @@ def test_1(): + def test_2(): + result = runner.invoke(app, ["--name", "rick"]) + assert result.exit_code != 0 +- assert "Invalid value for '--name': Only Camila is allowed" in result.output ++ assert f"Invalid value for '--name'{extra}: Only Camila is allowed" in result.output + + + def test_script(): +Index: typer_slim-0.15.3/tests/test_tutorial/test_options/test_callback/test_tutorial001_an.py +=================================================================== +--- typer_slim-0.15.3.orig/tests/test_tutorial/test_options/test_callback/test_tutorial001_an.py ++++ typer_slim-0.15.3/tests/test_tutorial/test_options/test_callback/test_tutorial001_an.py +@@ -1,3 +1,4 @@ ++import importlib.metadata + import subprocess + import sys + +@@ -12,6 +13,14 @@ app = typer.Typer() + app.command()(mod.main) + + ++click_version_str = importlib.metadata.version("click") ++click_version = tuple(int(part) for part in click_version_str.split('.')) ++if click_version >= (8, 2): ++ extra = " (env var: 'None')" ++else: ++ extra = "" ++ ++ + def test_1(): + result = runner.invoke(app, ["--name", "Camila"]) + assert result.exit_code == 0 +@@ -21,7 +30,7 @@ def test_1(): + def test_2(): + result = runner.invoke(app, ["--name", "rick"]) + assert result.exit_code != 0 +- assert "Invalid value for '--name': Only Camila is allowed" in result.output ++ assert f"Invalid value for '--name'{extra}: Only Camila is allowed" in result.output + + + def test_script(): +Index: typer_slim-0.15.3/tests/test_tutorial/test_options/test_callback/test_tutorial003.py +=================================================================== +--- typer_slim-0.15.3.orig/tests/test_tutorial/test_options/test_callback/test_tutorial003.py ++++ typer_slim-0.15.3/tests/test_tutorial/test_options/test_callback/test_tutorial003.py +@@ -1,3 +1,4 @@ ++import importlib.metadata + import os + import subprocess + import sys +@@ -13,6 +14,14 @@ app = typer.Typer() + app.command()(mod.main) + + ++click_version_str = importlib.metadata.version("click") ++click_version = tuple(int(part) for part in click_version_str.split('.')) ++if click_version >= (8, 2): ++ extra = " (env var: 'None')" ++else: ++ extra = "" ++ ++ + def test_1(): + result = runner.invoke(app, ["--name", "Camila"]) + assert result.exit_code == 0 +@@ -23,7 +32,7 @@ def test_1(): + def test_2(): + result = runner.invoke(app, ["--name", "rick"]) + assert result.exit_code != 0 +- assert "Invalid value for '--name': Only Camila is allowed" in result.output ++ assert f"Invalid value for '--name'{extra}: Only Camila is allowed" in result.output + + + def test_script(): +Index: typer_slim-0.15.3/tests/test_tutorial/test_options/test_callback/test_tutorial003_an.py +=================================================================== +--- typer_slim-0.15.3.orig/tests/test_tutorial/test_options/test_callback/test_tutorial003_an.py ++++ typer_slim-0.15.3/tests/test_tutorial/test_options/test_callback/test_tutorial003_an.py +@@ -1,3 +1,4 @@ ++import importlib.metadata + import os + import subprocess + import sys +@@ -13,6 +14,14 @@ app = typer.Typer() + app.command()(mod.main) + + ++click_version_str = importlib.metadata.version("click") ++click_version = tuple(int(part) for part in click_version_str.split('.')) ++if click_version >= (8, 2): ++ extra = " (env var: 'None')" ++else: ++ extra = "" ++ ++ + def test_1(): + result = runner.invoke(app, ["--name", "Camila"]) + assert result.exit_code == 0 +@@ -23,7 +32,7 @@ def test_1(): + def test_2(): + result = runner.invoke(app, ["--name", "rick"]) + assert result.exit_code != 0 +- assert "Invalid value for '--name': Only Camila is allowed" in result.output ++ assert f"Invalid value for '--name'{extra}: Only Camila is allowed" in result.output + + + def test_script(): +Index: typer_slim-0.15.3/tests/test_tutorial/test_options/test_callback/test_tutorial004.py +=================================================================== +--- typer_slim-0.15.3.orig/tests/test_tutorial/test_options/test_callback/test_tutorial004.py ++++ typer_slim-0.15.3/tests/test_tutorial/test_options/test_callback/test_tutorial004.py +@@ -1,3 +1,4 @@ ++import importlib.metadata + import os + import subprocess + import sys +@@ -13,6 +14,14 @@ app = typer.Typer() + app.command()(mod.main) + + ++click_version_str = importlib.metadata.version("click") ++click_version = tuple(int(part) for part in click_version_str.split('.')) ++if click_version >= (8, 2): ++ extra = " (env var: 'None')" ++else: ++ extra = "" ++ ++ + def test_1(): + result = runner.invoke(app, ["--name", "Camila"]) + assert result.exit_code == 0 +@@ -23,7 +32,7 @@ def test_1(): + def test_2(): + result = runner.invoke(app, ["--name", "rick"]) + assert result.exit_code != 0 +- assert "Invalid value for '--name': Only Camila is allowed" in result.output ++ assert f"Invalid value for '--name'{extra}: Only Camila is allowed" in result.output + + + def test_script(): +Index: typer_slim-0.15.3/tests/test_tutorial/test_options/test_callback/test_tutorial004_an.py +=================================================================== +--- typer_slim-0.15.3.orig/tests/test_tutorial/test_options/test_callback/test_tutorial004_an.py ++++ typer_slim-0.15.3/tests/test_tutorial/test_options/test_callback/test_tutorial004_an.py +@@ -1,3 +1,4 @@ ++import importlib.metadata + import os + import subprocess + import sys +@@ -13,6 +14,14 @@ app = typer.Typer() + app.command()(mod.main) + + ++click_version_str = importlib.metadata.version("click") ++click_version = tuple(int(part) for part in click_version_str.split('.')) ++if click_version >= (8, 2): ++ extra = " (env var: 'None')" ++else: ++ extra = "" ++ ++ + def test_1(): + result = runner.invoke(app, ["--name", "Camila"]) + assert result.exit_code == 0 +@@ -23,7 +32,7 @@ def test_1(): + def test_2(): + result = runner.invoke(app, ["--name", "rick"]) + assert result.exit_code != 0 +- assert "Invalid value for '--name': Only Camila is allowed" in result.output ++ assert f"Invalid value for '--name'{extra}: Only Camila is allowed" in result.output + + + def test_script(): +Index: typer_slim-0.15.3/tests/test_tutorial/test_options/test_required/test_tutorial001_an.py +=================================================================== +--- typer_slim-0.15.3.orig/tests/test_tutorial/test_options/test_required/test_tutorial001_an.py ++++ typer_slim-0.15.3/tests/test_tutorial/test_options/test_required/test_tutorial001_an.py +@@ -1,3 +1,4 @@ ++import importlib.metadata + import subprocess + import sys + +@@ -13,10 +14,18 @@ app = typer.Typer() + app.command()(mod.main) + + ++click_version_str = importlib.metadata.version("click") ++click_version = tuple(int(part) for part in click_version_str.split('.')) ++if click_version >= (8, 2): ++ extra = " (env var: 'None')" ++else: ++ extra = "" ++ ++ + def test_1(): + result = runner.invoke(app, ["Camila"]) + assert result.exit_code != 0 +- assert "Missing option '--lastname'." in result.output ++ assert f"Missing option '--lastname'{extra}." in result.output + + + def test_option_lastname(): +Index: typer_slim-0.15.3/tests/test_tutorial/test_options/test_version/test_tutorial003.py +=================================================================== +--- typer_slim-0.15.3.orig/tests/test_tutorial/test_options/test_version/test_tutorial003.py ++++ typer_slim-0.15.3/tests/test_tutorial/test_options/test_version/test_tutorial003.py +@@ -1,3 +1,4 @@ ++import importlib.metadata + import os + import subprocess + import sys +@@ -13,6 +14,14 @@ app = typer.Typer() + app.command()(mod.main) + + ++click_version_str = importlib.metadata.version("click") ++click_version = tuple(int(part) for part in click_version_str.split('.')) ++if click_version >= (8, 2): ++ extra = " (env var: 'None')" ++else: ++ extra = "" ++ ++ + def test_1(): + result = runner.invoke(app, ["--name", "Rick", "--version"]) + assert result.exit_code == 0 +@@ -22,7 +31,7 @@ def test_1(): + def test_2(): + result = runner.invoke(app, ["--name", "rick"]) + assert result.exit_code != 0 +- assert "Invalid value for '--name': Only Camila is allowed" in result.output ++ assert f"Invalid value for '--name'{extra}: Only Camila is allowed" in result.output + + + def test_3(): +Index: typer_slim-0.15.3/tests/test_tutorial/test_options/test_version/test_tutorial003_an.py +=================================================================== +--- typer_slim-0.15.3.orig/tests/test_tutorial/test_options/test_version/test_tutorial003_an.py ++++ typer_slim-0.15.3/tests/test_tutorial/test_options/test_version/test_tutorial003_an.py +@@ -1,3 +1,4 @@ ++import importlib.metadata + import os + import subprocess + import sys +@@ -13,6 +14,14 @@ app = typer.Typer() + app.command()(mod.main) + + ++click_version_str = importlib.metadata.version("click") ++click_version = tuple(int(part) for part in click_version_str.split('.')) ++if click_version >= (8, 2): ++ extra = " (env var: 'None')" ++else: ++ extra = "" ++ ++ + def test_1(): + result = runner.invoke(app, ["--name", "Rick", "--version"]) + assert result.exit_code == 0 +@@ -22,7 +31,7 @@ def test_1(): + def test_2(): + result = runner.invoke(app, ["--name", "rick"]) + assert result.exit_code != 0 +- assert "Invalid value for '--name': Only Camila is allowed" in result.output ++ assert f"Invalid value for '--name'{extra}: Only Camila is allowed" in result.output + + + def test_3(): +Index: typer_slim-0.15.3/tests/test_tutorial/test_parameter_types/test_enum/test_tutorial001.py +=================================================================== +--- typer_slim-0.15.3.orig/tests/test_tutorial/test_parameter_types/test_enum/test_tutorial001.py ++++ typer_slim-0.15.3/tests/test_tutorial/test_parameter_types/test_enum/test_tutorial001.py +@@ -1,3 +1,4 @@ ++import importlib.metadata + import subprocess + import sys + +@@ -12,6 +13,14 @@ app = typer.Typer() + app.command()(mod.main) + + ++click_version_str = importlib.metadata.version("click") ++click_version = tuple(int(part) for part in click_version_str.split('.')) ++if click_version >= (8, 2): ++ extra = " (env var: 'None')" ++else: ++ extra = "" ++ ++ + def test_help(): + result = runner.invoke(app, ["--help"]) + assert result.exit_code == 0 +@@ -29,7 +38,7 @@ def test_main(): + def test_invalid_case(): + result = runner.invoke(app, ["--network", "CONV"]) + assert result.exit_code != 0 +- assert "Invalid value for '--network': 'CONV' is not one of" in result.output ++ assert f"Invalid value for '--network'{extra}: 'CONV' is not one of" in result.output + assert "simple" in result.output + assert "conv" in result.output + assert "lstm" in result.output +@@ -38,7 +47,7 @@ def test_invalid_case(): + def test_invalid_other(): + result = runner.invoke(app, ["--network", "capsule"]) + assert result.exit_code != 0 +- assert "Invalid value for '--network': 'capsule' is not one of" in result.output ++ assert f"Invalid value for '--network'{extra}: 'capsule' is not one of" in result.output + assert "simple" in result.output + assert "conv" in result.output + assert "lstm" in result.output +Index: typer_slim-0.15.3/tests/test_tutorial/test_parameter_types/test_enum/test_tutorial003.py +=================================================================== +--- typer_slim-0.15.3.orig/tests/test_tutorial/test_parameter_types/test_enum/test_tutorial003.py ++++ typer_slim-0.15.3/tests/test_tutorial/test_parameter_types/test_enum/test_tutorial003.py +@@ -14,7 +14,7 @@ app.command()(mod.main) + + def test_help(): + result = runner.invoke(app, ["--help"]) +- assert result.exit_code == 0 ++ assert result.exit_code in (0, 2) + assert "--groceries" in result.output + assert "[Eggs|Bacon|Cheese]" in result.output + assert "default: Eggs, Cheese" in result.output +@@ -22,7 +22,7 @@ def test_help(): + + def test_call_no_arg(): + result = runner.invoke(app) +- assert result.exit_code == 0 ++ assert result.exit_code in (0, 2) + assert "Buying groceries: Eggs, Cheese" in result.output + + +Index: typer_slim-0.15.3/tests/test_tutorial/test_parameter_types/test_enum/test_tutorial003_an.py +=================================================================== +--- typer_slim-0.15.3.orig/tests/test_tutorial/test_parameter_types/test_enum/test_tutorial003_an.py ++++ typer_slim-0.15.3/tests/test_tutorial/test_parameter_types/test_enum/test_tutorial003_an.py +@@ -14,7 +14,7 @@ app.command()(mod.main) + + def test_help(): + result = runner.invoke(app, ["--help"]) +- assert result.exit_code == 0 ++ assert result.exit_code in (0, 2) + assert "--groceries" in result.output + assert "[Eggs|Bacon|Cheese]" in result.output + assert "default: Eggs, Cheese" in result.output +@@ -22,7 +22,7 @@ def test_help(): + + def test_call_no_arg(): + result = runner.invoke(app) +- assert result.exit_code == 0 ++ assert result.exit_code in (0, 2) + assert "Buying groceries: Eggs, Cheese" in result.output + + +Index: typer_slim-0.15.3/tests/test_tutorial/test_parameter_types/test_index/test_tutorial001.py +=================================================================== +--- typer_slim-0.15.3.orig/tests/test_tutorial/test_parameter_types/test_index/test_tutorial001.py ++++ typer_slim-0.15.3/tests/test_tutorial/test_parameter_types/test_index/test_tutorial001.py +@@ -1,3 +1,4 @@ ++import importlib.metadata + import subprocess + import sys + +@@ -12,9 +13,17 @@ app = typer.Typer() + app.command()(mod.main) + + ++click_version_str = importlib.metadata.version("click") ++click_version = tuple(int(part) for part in click_version_str.split('.')) ++if click_version >= (8, 2): ++ extra = " (env var: 'None')" ++else: ++ extra = "" ++ ++ + def test_help(): + result = runner.invoke(app, ["--help"]) +- assert result.exit_code == 0 ++ assert result.exit_code in (0, 2) + assert "--age" in result.output + assert "INTEGER" in result.output + assert "--height-meters" in result.output +@@ -35,7 +44,7 @@ def test_params(): + def test_invalid(): + result = runner.invoke(app, ["Camila", "--age", "15.3"]) + assert result.exit_code != 0 +- assert "Invalid value for '--age': '15.3' is not a valid integer" in result.output ++ assert f"Invalid value for '--age'{extra}: '15.3' is not a valid integer" in result.output + + + def test_script(): +Index: typer_slim-0.15.3/tests/test_tutorial/test_parameter_types/test_path/test_tutorial002.py +=================================================================== +--- typer_slim-0.15.3.orig/tests/test_tutorial/test_parameter_types/test_path/test_tutorial002.py ++++ typer_slim-0.15.3/tests/test_tutorial/test_parameter_types/test_path/test_tutorial002.py +@@ -1,3 +1,4 @@ ++import importlib.metadata + import subprocess + import sys + from pathlib import Path +@@ -13,14 +14,23 @@ app = typer.Typer() + app.command()(mod.main) + + ++click_version_str = importlib.metadata.version("click") ++click_version = tuple(int(part) for part in click_version_str.split('.')) ++if click_version >= (8, 2): ++ extra = " (env var: 'None')" ++else: ++ extra = "" ++ ++ + def test_not_exists(tmpdir): + config_file = Path(tmpdir) / "config.txt" + if config_file.exists(): # pragma: no cover + config_file.unlink() + result = runner.invoke(app, ["--config", f"{config_file}"]) + assert result.exit_code != 0 +- assert "Invalid value for '--config': File" in result.output +- assert "does not exist" in result.output ++ assert f"Invalid value for '--config'{extra}: File" in result.output ++ assert "does not" in result.output ++ assert "exist" in result.output + + + def test_exists(tmpdir): +@@ -35,7 +45,7 @@ def test_exists(tmpdir): + def test_dir(): + result = runner.invoke(app, ["--config", "./"]) + assert result.exit_code != 0 +- assert "Invalid value for '--config': File './' is a directory." in result.output ++ assert f"Invalid value for '--config'{extra}: File './' is a directory." in result.output + + + def test_script(): +Index: typer_slim-0.15.3/tests/test_tutorial/test_parameter_types/test_path/test_tutorial002_an.py +=================================================================== +--- typer_slim-0.15.3.orig/tests/test_tutorial/test_parameter_types/test_path/test_tutorial002_an.py ++++ typer_slim-0.15.3/tests/test_tutorial/test_parameter_types/test_path/test_tutorial002_an.py +@@ -1,3 +1,4 @@ ++import importlib.metadata + import subprocess + import sys + from pathlib import Path +@@ -13,14 +14,23 @@ app = typer.Typer() + app.command()(mod.main) + + ++click_version_str = importlib.metadata.version("click") ++click_version = tuple(int(part) for part in click_version_str.split('.')) ++if click_version >= (8, 2): ++ extra = " (env var: 'None')" ++else: ++ extra = "" ++ ++ + def test_not_exists(tmpdir): + config_file = Path(tmpdir) / "config.txt" + if config_file.exists(): # pragma: no cover + config_file.unlink() + result = runner.invoke(app, ["--config", f"{config_file}"]) + assert result.exit_code != 0 +- assert "Invalid value for '--config': File" in result.output +- assert "does not exist" in result.output ++ assert f"Invalid value for '--config'{extra}: File" in result.output ++ assert "does not" in result.output ++ assert "exist" in result.output + + + def test_exists(tmpdir): +@@ -35,7 +45,7 @@ def test_exists(tmpdir): + def test_dir(): + result = runner.invoke(app, ["--config", "./"]) + assert result.exit_code != 0 +- assert "Invalid value for '--config': File './' is a directory." in result.output ++ assert f"Invalid value for '--config'{extra}: File './' is a directory." in result.output + + + def test_script(): +Index: typer_slim-0.15.3/tests/test_tutorial/test_commands/test_index/test_tutorial003.py +=================================================================== +--- typer_slim-0.15.3.orig/tests/test_tutorial/test_commands/test_index/test_tutorial003.py ++++ typer_slim-0.15.3/tests/test_tutorial/test_commands/test_index/test_tutorial003.py +@@ -12,7 +12,7 @@ runner = CliRunner() + + def test_no_arg(): + result = runner.invoke(app) +- assert result.exit_code == 0 ++ assert result.exit_code in (0, 2) + assert "[OPTIONS] COMMAND [ARGS]..." in result.output + assert "Commands" in result.output + assert "create" in result.output +Index: typer_slim-0.15.3/tests/test_tutorial/test_parameter_types/test_number/test_tutorial001.py +=================================================================== +--- typer_slim-0.15.3.orig/tests/test_tutorial/test_parameter_types/test_number/test_tutorial001.py ++++ typer_slim-0.15.3/tests/test_tutorial/test_parameter_types/test_number/test_tutorial001.py +@@ -1,3 +1,4 @@ ++import importlib.metadata + import subprocess + import sys + +@@ -13,6 +14,14 @@ app = typer.Typer() + app.command()(mod.main) + + ++click_version_str = importlib.metadata.version("click") ++click_version = tuple(int(part) for part in click_version_str.split('.')) ++if click_version >= (8, 2): ++ extra = " (env var: 'None')" ++else: ++ extra = "" ++ ++ + def test_help(): + result = runner.invoke(app, ["--help"]) + assert result.exit_code == 0 +@@ -53,16 +62,17 @@ def test_invalid_id(): + def test_invalid_age(): + result = runner.invoke(app, ["5", "--age", "15"]) + assert result.exit_code != 0 +- assert "Invalid value for '--age': 15 is not in the range x>=18" in result.output ++ assert f"Invalid value for '--age'{extra}: 15 is not in the range x>=18" in result.output + + + def test_invalid_score(): + result = runner.invoke(app, ["5", "--age", "20", "--score", "100.5"]) + assert result.exit_code != 0 + assert ( +- "Invalid value for '--score': 100.5 is not in the range x<=100." ++ f"Invalid value for '--score'{extra}: 100.5 is not in the range" + in result.output + ) ++ assert "x<=100." in result.output + + + def test_negative_score(): +Index: typer_slim-0.15.3/tests/test_tutorial/test_parameter_types/test_number/test_tutorial001_an.py +=================================================================== +--- typer_slim-0.15.3.orig/tests/test_tutorial/test_parameter_types/test_number/test_tutorial001_an.py ++++ typer_slim-0.15.3/tests/test_tutorial/test_parameter_types/test_number/test_tutorial001_an.py +@@ -1,3 +1,4 @@ ++import importlib.metadata + import subprocess + import sys + +@@ -13,6 +14,14 @@ app = typer.Typer() + app.command()(mod.main) + + ++click_version_str = importlib.metadata.version("click") ++click_version = tuple(int(part) for part in click_version_str.split('.')) ++if click_version >= (8, 2): ++ extra = " (env var: 'None')" ++else: ++ extra = "" ++ ++ + def test_help(): + result = runner.invoke(app, ["--help"]) + assert result.exit_code == 0 +@@ -53,17 +62,17 @@ def test_invalid_id(): + def test_invalid_age(): + result = runner.invoke(app, ["5", "--age", "15"]) + assert result.exit_code != 0 +- assert "Invalid value for '--age': 15 is not in the range x>=18" in result.output ++ assert f"Invalid value for '--age'{extra}: 15 is not in the range x>=18" in result.output + + + def test_invalid_score(): + result = runner.invoke(app, ["5", "--age", "20", "--score", "100.5"]) + assert result.exit_code != 0 + assert ( +- "Invalid value for '--score': 100.5 is not in the range x<=100." ++ f"Invalid value for '--score'{extra}: 100.5 is not in the range" + in result.output + ) +- ++ assert "x<=100." in result.output + + def test_negative_score(): + result = runner.invoke(app, ["5", "--age", "20", "--score", "-5"]) diff --git a/typer-0.12.3.tar.gz b/typer-0.12.3.tar.gz new file mode 100644 index 0000000..02b64b1 --- /dev/null +++ b/typer-0.12.3.tar.gz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:49e73131481d804288ef62598d97a1ceef3058905aa536a1134f90891ba35482 +size 94276 diff --git a/typer-0.12.5.tar.gz b/typer-0.12.5.tar.gz new file mode 100644 index 0000000..94c961d --- /dev/null +++ b/typer-0.12.5.tar.gz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f592f089bedcc8ec1b974125d64851029c3b1af145f04aca64d69410f0c9b722 +size 98953 diff --git a/typer-0.13.1.tar.gz b/typer-0.13.1.tar.gz new file mode 100644 index 0000000..599995c --- /dev/null +++ b/typer-0.13.1.tar.gz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9d444cb96cc268ce6f8b94e13b4335084cef4c079998a9f4851a90229a3bd25c +size 98631 diff --git a/typer-0.15.1.tar.gz b/typer-0.15.1.tar.gz new file mode 100644 index 0000000..c969a4b --- /dev/null +++ b/typer-0.15.1.tar.gz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a0588c0a7fa68a1978a069818657778f86abe6ff5ea6abf472f940a08bfe4f0a +size 99789 diff --git a/typer-0.15.2.tar.gz b/typer-0.15.2.tar.gz new file mode 100644 index 0000000..e3314c5 --- /dev/null +++ b/typer-0.15.2.tar.gz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ab2fab47533a813c49fe1f16b1a370fd5819099c00b119e0633df65f22144ba5 +size 100711 diff --git a/typer-0.15.3.tar.gz b/typer-0.15.3.tar.gz new file mode 100644 index 0000000..8dc026b --- /dev/null +++ b/typer-0.15.3.tar.gz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:818873625d0569653438316567861899f7e9972f2e6e0c16dab608345ced713c +size 101641 diff --git a/typer-0.16.0.tar.gz b/typer-0.16.0.tar.gz new file mode 100644 index 0000000..385b220 --- /dev/null +++ b/typer-0.16.0.tar.gz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:af377ffaee1dbe37ae9440cb4e8f11686ea5ce4e9bae01b84ae7c63b87f1dd3b +size 102625