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