Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package python-typer-slim for 
openSUSE:Factory checked in at 2025-09-01 17:16:42
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-typer-slim (Old)
 and      /work/SRC/openSUSE:Factory/.python-typer-slim.new.1977 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "python-typer-slim"

Mon Sep  1 17:16:42 2025 rev:15 rq:1302028 version:0.17.3

Changes:
--------
--- /work/SRC/openSUSE:Factory/python-typer-slim/python-typer-slim.changes      
2025-08-21 16:53:56.264446423 +0200
+++ 
/work/SRC/openSUSE:Factory/.python-typer-slim.new.1977/python-typer-slim.changes
    2025-09-01 17:16:45.963322729 +0200
@@ -1,0 +2,10 @@
+Sat Aug 30 14:18:00 UTC 2025 - Matthias Bach <[email protected]>
+
+- Update to 0.17.3
+  * Allow annotated parsing with a subclass of Path.
+  * Avoid printing default: None in the help section when using
+    Rich.
+  * Fix markdown formatting in --help output.
+  * Lazy-load rich_utils to reduce startup time.
+
+-------------------------------------------------------------------

Old:
----
  typer_slim-0.16.1.tar.gz

New:
----
  typer_slim-0.17.3.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ python-typer-slim.spec ++++++
--- /var/tmp/diff_new_pack.wqqPTs/_old  2025-09-01 17:16:46.695353723 +0200
+++ /var/tmp/diff_new_pack.wqqPTs/_new  2025-09-01 17:16:46.695353723 +0200
@@ -20,7 +20,7 @@
 
 %{?sle15_python_module_pythons}
 Name:           python-typer-slim
-Version:        0.16.1
+Version:        0.17.3
 Release:        0
 Summary:        Typer, build great CLIs. Easy to code. Based on Python type 
hints
 License:        MIT

++++++ typer_slim-0.16.1.tar.gz -> typer_slim-0.17.3.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/typer_slim-0.16.1/PKG-INFO 
new/typer_slim-0.17.3/PKG-INFO
--- old/typer_slim-0.16.1/PKG-INFO      1970-01-01 01:00:00.000000000 +0100
+++ new/typer_slim-0.17.3/PKG-INFO      1970-01-01 01:00:00.000000000 +0100
@@ -1,6 +1,6 @@
 Metadata-Version: 2.1
 Name: typer-slim
-Version: 0.16.1
+Version: 0.17.3
 Summary: Typer, build great CLIs. Easy to code. Based on Python type hints.
 Author-Email: =?utf-8?q?Sebasti=C3=A1n_Ram=C3=ADrez?= <[email protected]>
 Classifier: Intended Audience :: Information Technology
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/typer_slim-0.16.1/pyproject.toml 
new/typer_slim-0.17.3/pyproject.toml
--- old/typer_slim-0.16.1/pyproject.toml        2025-08-18 21:18:13.198518000 
+0200
+++ new/typer_slim-0.17.3/pyproject.toml        2025-08-30 14:34:53.167327600 
+0200
@@ -40,7 +40,7 @@
     "typing-extensions >= 3.7.4.3",
 ]
 readme = "README.md"
-version = "0.16.1"
+version = "0.17.3"
 
 [project.urls]
 Homepage = "https://github.com/fastapi/typer";
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/typer_slim-0.16.1/requirements-tests.txt 
new/typer_slim-0.17.3/requirements-tests.txt
--- old/typer_slim-0.16.1/requirements-tests.txt        2025-08-18 
21:18:07.036445100 +0200
+++ new/typer_slim-0.17.3/requirements-tests.txt        2025-08-30 
14:34:50.144306000 +0200
@@ -4,9 +4,9 @@
 pytest-cov >=2.10.0,<7.0.0
 coverage[toml] >=6.2,<8.0
 pytest-xdist >=1.32.0,<4.0.0
-pytest-sugar >=0.9.4,<1.1.0
+pytest-sugar >=0.9.4,<1.2.0
 mypy ==1.4.1
-ruff ==0.12.9
+ruff ==0.12.10
 # Needed explicitly by typer-slim
 rich >=10.11.0
 shellingham >=1.3.0
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/typer_slim-0.16.1/tests/assets/print_modules.py 
new/typer_slim-0.17.3/tests/assets/print_modules.py
--- old/typer_slim-0.16.1/tests/assets/print_modules.py 1970-01-01 
01:00:00.000000000 +0100
+++ new/typer_slim-0.17.3/tests/assets/print_modules.py 2025-08-30 
14:34:50.145305900 +0200
@@ -0,0 +1,15 @@
+import sys
+
+import typer
+
+app = typer.Typer()
+
+
[email protected]()
+def main():
+    for m in sys.modules:
+        print(m)
+
+
+if __name__ == "__main__":
+    app()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/typer_slim-0.16.1/tests/test_annotated.py 
new/typer_slim-0.17.3/tests/test_annotated.py
--- old/typer_slim-0.16.1/tests/test_annotated.py       2025-08-18 
21:18:07.037445000 +0200
+++ new/typer_slim-0.17.3/tests/test_annotated.py       2025-08-30 
14:34:50.145305900 +0200
@@ -1,3 +1,6 @@
+import sys
+from pathlib import Path
+
 import typer
 from typer.testing import CliRunner
 from typing_extensions import Annotated
@@ -76,3 +79,22 @@
     result = runner.invoke(app, ["--force"])
     assert result.exit_code == 0, result.output
     assert "Forcing operation" in result.output
+
+
+def test_annotated_custom_path():
+    app = typer.Typer()
+
+    class CustomPath(Path):
+        # Subclassing Path was not fully supported before 3.12
+        # https://docs.python.org/3.12/whatsnew/3.12.html
+        if sys.version_info < (3, 12):
+            _flavour = type(Path())._flavour
+
+    @app.command()
+    def custom_parser(
+        my_path: Annotated[CustomPath, typer.Argument(parser=CustomPath)],
+    ):
+        assert isinstance(my_path, CustomPath)
+
+    result = runner.invoke(app, "/some/quirky/path/implementation")
+    assert result.exit_code == 0
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/typer_slim-0.16.1/tests/test_rich_import.py 
new/typer_slim-0.17.3/tests/test_rich_import.py
--- old/typer_slim-0.16.1/tests/test_rich_import.py     1970-01-01 
01:00:00.000000000 +0100
+++ new/typer_slim-0.17.3/tests/test_rich_import.py     2025-08-30 
14:34:50.146305800 +0200
@@ -0,0 +1,21 @@
+import subprocess
+import sys
+from pathlib import Path
+
+ACCEPTED_MODULES = {"rich._extension", "rich"}
+
+
+def test_rich_not_imported_unnecessary():
+    file_path = Path(__file__).parent / "assets/print_modules.py"
+    result = subprocess.run(
+        [sys.executable, "-m", "coverage", "run", str(file_path)],
+        capture_output=True,
+        encoding="utf-8",
+    )
+    modules = result.stdout.splitlines()
+    modules = [
+        module
+        for module in modules
+        if module not in ACCEPTED_MODULES and module.startswith("rich")
+    ]
+    assert not modules
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/typer_slim-0.16.1/tests/test_rich_markup_mode.py 
new/typer_slim-0.17.3/tests/test_rich_markup_mode.py
--- old/typer_slim-0.16.1/tests/test_rich_markup_mode.py        2025-08-18 
21:18:07.039445200 +0200
+++ new/typer_slim-0.17.3/tests/test_rich_markup_mode.py        2025-08-30 
14:34:50.146305800 +0200
@@ -49,7 +49,6 @@
         pytest.param(
             "markdown",
             ["First line", "", "Line 1", "", "Line 2", "", "Line 3", ""],
-            marks=pytest.mark.xfail,
         ),
         pytest.param(
             "rich", ["First line", "", "Line 1", "", "Line 2", "", "Line 3", 
""]
@@ -140,7 +139,6 @@
                 "Line 3",
                 "",
             ],
-            marks=pytest.mark.xfail,
         ),
         pytest.param(
             "rich",
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/typer_slim-0.16.1/tests/test_rich_utils.py 
new/typer_slim-0.17.3/tests/test_rich_utils.py
--- old/typer_slim-0.16.1/tests/test_rich_utils.py      2025-08-18 
21:18:07.039445200 +0200
+++ new/typer_slim-0.17.3/tests/test_rich_utils.py      2025-08-30 
14:34:50.147306000 +0200
@@ -50,3 +50,32 @@
 
     assert result.exit_code == 0
     assert "Show this message" in result.stdout
+
+
+def test_rich_doesnt_print_None_default():
+    app = typer.Typer(rich_markup_mode="rich")
+
+    @app.command()
+    def main(
+        name: str,
+        option_1: str = typer.Option(
+            "option_1_default",
+        ),
+        option_2: str = typer.Option(
+            ...,
+        ),
+    ):
+        print(f"Hello {name}")
+        print(f"First: {option_1}")
+        print(f"Second: {option_2}")
+
+    result = runner.invoke(app, ["--help"])
+    assert "Usage" in result.stdout
+    assert "name" in result.stdout
+    assert "option-1" in result.stdout
+    assert "option-2" in result.stdout
+    assert result.stdout.count("[default: None]") == 0
+    result = runner.invoke(app, ["Rick", "--option-2=Morty"])
+    assert "Hello Rick" in result.stdout
+    assert "First: option_1_default" in result.stdout
+    assert "Second: Morty" in result.stdout
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/typer_slim-0.16.1/typer/__init__.py 
new/typer_slim-0.17.3/typer/__init__.py
--- old/typer_slim-0.16.1/typer/__init__.py     2025-08-18 21:18:07.047445300 
+0200
+++ new/typer_slim-0.17.3/typer/__init__.py     2025-08-30 14:34:50.155305900 
+0200
@@ -1,6 +1,6 @@
 """Typer, build great CLIs. Easy to code. Based on Python type hints."""
 
-__version__ = "0.16.1"
+__version__ = "0.17.3"
 
 from shutil import get_terminal_size as get_terminal_size
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/typer_slim-0.16.1/typer/cli.py 
new/typer_slim-0.17.3/typer/cli.py
--- old/typer_slim-0.16.1/typer/cli.py  2025-08-18 21:18:07.048445200 +0200
+++ new/typer_slim-0.17.3/typer/cli.py  2025-08-30 14:34:50.155305900 +0200
@@ -15,7 +15,6 @@
     import rich
 
     has_rich = True
-    from . import rich_utils
 
 except ImportError:  # pragma: no cover
     has_rich = False
@@ -275,6 +274,8 @@
 def _parse_html(input_text: str) -> str:
     if not has_rich:  # pragma: no cover
         return input_text
+    from . import rich_utils
+
     return rich_utils.rich_to_html(input_text)
 
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/typer_slim-0.16.1/typer/core.py 
new/typer_slim-0.17.3/typer/core.py
--- old/typer_slim-0.16.1/typer/core.py 2025-08-18 21:18:07.048445200 +0200
+++ new/typer_slim-0.17.3/typer/core.py 2025-08-30 14:34:50.155305900 +0200
@@ -33,8 +33,6 @@
 try:
     import rich
 
-    from . import rich_utils
-
     DEFAULT_MARKUP_MODE: MarkupMode = "rich"
 
 except ImportError:  # pragma: no cover
@@ -213,6 +211,8 @@
                 raise
             # Typer override
             if rich and rich_markup_mode is not None:
+                from . import rich_utils
+
                 rich_utils.rich_format_error(e)
             else:
                 e.show()
@@ -243,6 +243,8 @@
             raise
         # Typer override
         if rich and rich_markup_mode is not None:
+            from . import rich_utils
+
             rich_utils.rich_abort_error()
         else:
             click.echo(_("Aborted!"), file=sys.stderr)
@@ -705,6 +707,8 @@
     def format_help(self, ctx: click.Context, formatter: click.HelpFormatter) 
-> None:
         if not rich or self.rich_markup_mode is None:
             return super().format_help(ctx, formatter)
+        from . import rich_utils
+
         return rich_utils.rich_format_help(
             obj=self,
             ctx=ctx,
@@ -768,6 +772,8 @@
     def format_help(self, ctx: click.Context, formatter: click.HelpFormatter) 
-> None:
         if not rich or self.rich_markup_mode is None:
             return super().format_help(ctx, formatter)
+        from . import rich_utils
+
         return rich_utils.rich_format_help(
             obj=self,
             ctx=ctx,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/typer_slim-0.16.1/typer/main.py 
new/typer_slim-0.17.3/typer/main.py
--- old/typer_slim-0.16.1/typer/main.py 2025-08-18 21:18:07.048445200 +0200
+++ new/typer_slim-0.17.3/typer/main.py 2025-08-30 14:34:50.155305900 +0200
@@ -51,11 +51,6 @@
 
 try:
     import rich
-    from rich.traceback import Traceback
-
-    from . import rich_utils
-
-    console_stderr = rich_utils._get_rich_console(stderr=True)
 
 except ImportError:  # pragma: no cover
     rich = None  # type: ignore
@@ -83,7 +78,9 @@
     supress_internal_dir_names = [typer_path, click_path]
     exc = exc_value
     if rich:
-        from .rich_utils import MAX_WIDTH
+        from rich.traceback import Traceback
+
+        from . import rich_utils
 
         rich_tb = Traceback.from_exception(
             type(exc),
@@ -91,8 +88,9 @@
             exc.__traceback__,
             show_locals=exception_config.pretty_exceptions_show_locals,
             suppress=supress_internal_dir_names,
-            width=MAX_WIDTH,
+            width=rich_utils.MAX_WIDTH,
         )
+        console_stderr = rich_utils._get_rich_console(stderr=True)
         console_stderr.print(rich_tb)
         return
     tb_exc = traceback.TracebackException.from_exception(exc)
@@ -622,7 +620,9 @@
 
 def param_path_convertor(value: Optional[str] = None) -> Optional[Path]:
     if value is not None:
-        return Path(value)
+        # allow returning any subclass of Path created by an annotated parser 
without converting
+        # it back to a Path
+        return value if isinstance(value, Path) else Path(value)
     return None
 
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/typer_slim-0.16.1/typer/rich_utils.py 
new/typer_slim-0.17.3/typer/rich_utils.py
--- old/typer_slim-0.16.1/typer/rich_utils.py   2025-08-18 21:18:07.048445200 
+0200
+++ new/typer_slim-0.17.3/typer/rich_utils.py   2025-08-30 14:34:50.156306000 
+0200
@@ -190,7 +190,8 @@
     help_text = help_text.partition("\f")[0]
 
     # Get the first paragraph
-    first_line = help_text.split("\n\n")[0]
+    first_line, *remaining_paragraphs = help_text.split("\n\n")
+
     # Remove single linebreaks
     if markup_mode != MARKUP_MODE_MARKDOWN and not first_line.startswith("\b"):
         first_line = first_line.replace("\n", " ")
@@ -200,13 +201,11 @@
         markup_mode=markup_mode,
     )
 
-    # Add a newline inbetween the header and the remaining paragraphs
-    yield Text("")
-
     # Get remaining lines, remove single line breaks and format as dim
-    remaining_paragraphs = help_text.split("\n\n")[1:]
     if remaining_paragraphs:
-        if markup_mode != MARKUP_MODE_RICH:
+        # Add a newline inbetween the header and the remaining paragraphs
+        yield Text("")
+        if markup_mode not in (MARKUP_MODE_RICH, MARKUP_MODE_MARKDOWN):
             # Remove single linebreaks
             remaining_paragraphs = [
                 x.replace("\n", " ").strip()
@@ -217,7 +216,7 @@
             # Join back together
             remaining_lines = "\n".join(remaining_paragraphs)
         else:
-            # Join with double linebreaks if markdown
+            # Join with double linebreaks if markdown or Rich markup
             remaining_lines = "\n\n".join(remaining_paragraphs)
 
         yield _make_rich_text(
@@ -289,9 +288,11 @@
     # Default value
     # This uses Typer's specific param._get_default_string
     if isinstance(param, (TyperOption, TyperArgument)):
-        if param.show_default:
-            show_default_is_str = isinstance(param.show_default, str)
-            default_value = param._extract_default_help_str(ctx=ctx)
+        default_value = param._extract_default_help_str(ctx=ctx)
+        show_default_is_str = isinstance(param.show_default, str)
+        if show_default_is_str or (
+            default_value is not None and (param.show_default or 
ctx.show_default)
+        ):
             default_str = param._get_default_string(
                 ctx=ctx,
                 show_default_is_str=show_default_is_str,

Reply via email to