Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package python-cyclopts for openSUSE:Factory 
checked in at 2026-10-27 16:58:26
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-cyclopts (Old)
 and      /work/SRC/openSUSE:Factory/.python-cyclopts.new.2252680 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "python-cyclopts"

Tue Oct 27 16:58:26 2026 rev:24 rq:1392924 version:5.3.1

Changes:
--------
--- /work/SRC/openSUSE:Factory/python-cyclopts/python-cyclopts.changes  
2026-10-23 20:31:32.981757029 +0200
+++ 
/work/SRC/openSUSE:Factory/.python-cyclopts.new.2252680/python-cyclopts.changes 
    2026-10-27 16:58:40.717896535 +0100
@@ -1,0 +2,10 @@
+Mon Oct 26 19:25:44 UTC 2026 - Martin Pluskal <[email protected]>
+
+- Update to 5.3.1 (PyPI release 2026-10-26):
+  * Respect explicit delimiters for path environment values
+  * Validate Parameter(name="*") behind a type alias at setup time
+  * Resolve subscripted generic type aliases
+  * Bind config values to a meta app's own parameters (regression
+    since 4.0.0)
+
+-------------------------------------------------------------------

Old:
----
  cyclopts-5.3.0.tar.gz

New:
----
  cyclopts-5.3.1.tar.gz

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

Other differences:
------------------
++++++ python-cyclopts.spec ++++++
--- /var/tmp/diff_new_pack.BHpfvI/_old  2026-10-27 16:58:42.978991166 +0100
+++ /var/tmp/diff_new_pack.BHpfvI/_new  2026-10-27 16:58:42.980991250 +0100
@@ -18,7 +18,7 @@
 
 %bcond_without libalternatives
 Name:           python-cyclopts
-Version:        5.3.0
+Version:        5.3.1
 Release:        0
 Summary:        Intuitive, easy CLIs based on python type hints
 License:        Apache-2.0

++++++ cyclopts-5.3.0.tar.gz -> cyclopts-5.3.1.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/cyclopts-5.3.0/PKG-INFO new/cyclopts-5.3.1/PKG-INFO
--- old/cyclopts-5.3.0/PKG-INFO 2020-02-02 01:00:00.000000000 +0100
+++ new/cyclopts-5.3.1/PKG-INFO 2020-02-02 01:00:00.000000000 +0100
@@ -1,6 +1,6 @@
 Metadata-Version: 2.5
 Name: cyclopts
-Version: 5.3.0
+Version: 5.3.1
 Summary: Intuitive, easy CLIs based on type hints.
 Project-URL: Homepage, https://github.com/BrianPugh/cyclopts
 Project-URL: Repository, https://github.com/BrianPugh/cyclopts
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/cyclopts-5.3.0/cyclopts/_env_var.py 
new/cyclopts-5.3.1/cyclopts/_env_var.py
--- old/cyclopts-5.3.0/cyclopts/_env_var.py     2020-02-02 01:00:00.000000000 
+0100
+++ new/cyclopts-5.3.1/cyclopts/_env_var.py     2020-02-02 01:00:00.000000000 
+0100
@@ -28,9 +28,9 @@
     Converts a single string into a list of strings. Splits when:
 
     * The ``type_`` is some variant of ``Iterable[pathlib.Path]`` objects.
-      If Windows, split on ``;``, otherwise split on ``:``.
+      By default, split on ``;`` on Windows and ``:`` otherwise.
 
-    * Otherwise, if the ``type_`` is an ``Iterable``, split on whitespace.
+    * Otherwise, if the ``type_`` is an ``Iterable``, split on whitespace by 
default.
       Leading/trailing whitespace of each output element will be stripped.
 
     This function is the default value for :attr:`cyclopts.App.env_var_split`.
@@ -43,7 +43,7 @@
         String to split.
     delimiter: str | None
         Delimiter to split ``val`` on.
-        If None, defaults to whitespace.
+        If None, defaults to ``os.pathsep`` for paths and whitespace otherwise.
 
     Returns
     -------
@@ -54,6 +54,8 @@
     count, consume_all = token_count(type_)
 
     if count > 1 or consume_all:
-        return val.split(os.pathsep) if _is_path(type_) else 
val.split(delimiter)
+        if delimiter is None and _is_path(type_):
+            delimiter = os.pathsep
+        return val.split(delimiter)
     else:
         return [val]
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/cyclopts-5.3.0/cyclopts/_version.py 
new/cyclopts-5.3.1/cyclopts/_version.py
--- old/cyclopts-5.3.0/cyclopts/_version.py     2020-02-02 01:00:00.000000000 
+0100
+++ new/cyclopts-5.3.1/cyclopts/_version.py     2020-02-02 01:00:00.000000000 
+0100
@@ -18,7 +18,7 @@
 commit_id: str | None
 __commit_id__: str | None
 
-__version__ = version = '5.3.0'
-__version_tuple__ = version_tuple = (5, 3, 0)
+__version__ = version = '5.3.1'
+__version_tuple__ = version_tuple = (5, 3, 1)
 
 __commit_id__ = commit_id = None
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/cyclopts-5.3.0/cyclopts/annotations.py 
new/cyclopts-5.3.1/cyclopts/annotations.py
--- old/cyclopts-5.3.0/cyclopts/annotations.py  2020-02-02 01:00:00.000000000 
+0100
+++ new/cyclopts-5.3.1/cyclopts/annotations.py  2020-02-02 01:00:00.000000000 
+0100
@@ -289,9 +289,25 @@
 
 
 def resolve_type_alias(type_: Any) -> Any:
-    """Resolve TypeAliasType (Python 3.12+ 'type' statement) to its underlying 
type."""
-    if TypeAliasType is not None and isinstance(type_, TypeAliasType):
+    """Resolve TypeAliasType (Python 3.12+ 'type' statement) to its underlying 
type.
+
+    A subscripted generic alias (``type Alias[T] = ...`` used as 
``Alias[int]``) resolves
+    to its value with the type arguments substituted.
+    """
+    if TypeAliasType is None:
+        return type_
+    if isinstance(type_, TypeAliasType):
         return type_.__value__
+    origin = get_origin(type_)
+    if isinstance(origin, TypeAliasType):
+        substitutions = dict(zip(origin.__type_params__, get_args(type_), 
strict=True))
+        value = origin.__value__
+        if value in substitutions:
+            return substitutions[value]
+        parameters = getattr(value, "__parameters__", ())
+        if not parameters:
+            return value
+        return value[tuple(substitutions[p] for p in parameters)]
     return type_
 
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/cyclopts-5.3.0/cyclopts/argument/_collection.py 
new/cyclopts-5.3.1/cyclopts/argument/_collection.py
--- old/cyclopts-5.3.0/cyclopts/argument/_collection.py 2020-02-02 
01:00:00.000000000 +0100
+++ new/cyclopts-5.3.1/cyclopts/argument/_collection.py 2020-02-02 
01:00:00.000000000 +0100
@@ -750,9 +750,13 @@
 
 
 def _meta_arguments(apps: Sequence["App"]) -> ArgumentCollection:
+    """Collect the arguments of meta apps in the config frame, whose keys the 
app being populated skips.
+
+    ``apps[-1]`` must be the app being populated; its own meta parameters are 
never excluded.
+    """
     argument_collection = ArgumentCollection()
     for app in apps:
-        if app._meta is None:
+        if app._meta is None or app._meta is apps[-1]:
             continue
         argument_collection.extend(app._meta.assemble_argument_collection())
     return argument_collection
@@ -871,9 +875,8 @@
     arguments : ArgumentCollection
         Collection of arguments to populate with configuration values.
     apps : Optional[Sequence[App]]
-        Stack of App instances for meta-argument handling.
-        We need to know all the meta-apps leading up to the current 
application so that we can
-        properly detect unknown keys.
+        Stack of apps leading to the app being populated, which is 
``apps[-1]``.
+        Config keys belonging to their meta apps are skipped instead of 
reported as unknown.
     root_keys : Iterable[str]
         Base path keys to prepend to all configuration keys.
     allow_unknown : bool
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/cyclopts-5.3.0/cyclopts/parameter.py 
new/cyclopts-5.3.1/cyclopts/parameter.py
--- old/cyclopts-5.3.0/cyclopts/parameter.py    2020-02-02 01:00:00.000000000 
+0100
+++ new/cyclopts-5.3.1/cyclopts/parameter.py    2020-02-02 01:00:00.000000000 
+0100
@@ -650,9 +650,13 @@
     if (f.__module__ or "").startswith("cyclopts"):  # Speed optimization.
         return
     for field_info in signature_parameters(f).values():
-        # Speed optimization: if no annotation and no cyclopts config, skip 
validation
-        field_info_is_annotated = is_annotated(field_info.annotation)
-        if not field_info_is_annotated and not getattr(field_info.annotation, 
"__cyclopts__", None):
+        # Speed optimization: if no annotation and no cyclopts config, skip 
validation.
+        # Look through ``type`` statement aliases (Python 3.12+), which can 
hide either.
+        annotation = field_info.annotation
+        while (resolved := resolve_type_alias(annotation)) is not annotation:
+            annotation = resolved
+        field_info_is_annotated = is_annotated(annotation)
+        if not field_info_is_annotated and not getattr(annotation, 
"__cyclopts__", None):
             # There is no annotation, so there is nothing to validate.
             continue
 

Reply via email to