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-11-13 18:29:41
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-cyclopts (Old)
 and      /work/SRC/openSUSE:Factory/.python-cyclopts.new.1251 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "python-cyclopts"

Fri Nov 13 18:29:41 2026 rev:28 rq:1397191 version:5.4.2

Changes:
--------
--- /work/SRC/openSUSE:Factory/python-cyclopts/python-cyclopts.changes  
2026-11-10 14:40:01.323565082 +0100
+++ 
/work/SRC/openSUSE:Factory/.python-cyclopts.new.1251/python-cyclopts.changes    
    2026-11-13 18:31:54.337597550 +0100
@@ -1,0 +2,17 @@
+Thu Nov 12 19:36:02 UTC 2026 - Martin Pluskal <[email protected]>
+
+- Update to 5.4.2 (PyPI release 2026-11-12):
+  * LimitedChoice errors dedupe listed names and include
+    aliases via Argument.positives
+  * Scalar conversion overflow reported as CoercionError,
+    keeping token and target type on the normal error path
+
+-------------------------------------------------------------------
+Wed Nov 11 19:50:04 UTC 2026 - Martin Pluskal <[email protected]>
+
+- Update to 5.4.1 (PyPI release 2026-11-11):
+  * LimitedChoice count error states the requirement
+    and lists the group options instead of printing
+    only the supplied arguments
+
+-------------------------------------------------------------------

Old:
----
  cyclopts-5.4.0.tar.gz

New:
----
  cyclopts-5.4.2.tar.gz

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

Other differences:
------------------
++++++ python-cyclopts.spec ++++++
--- /var/tmp/diff_new_pack.7BOlzZ/_old  2026-11-13 18:31:56.043669781 +0100
+++ /var/tmp/diff_new_pack.7BOlzZ/_new  2026-11-13 18:31:56.045669866 +0100
@@ -18,7 +18,7 @@
 
 %bcond_without libalternatives
 Name:           python-cyclopts
-Version:        5.4.0
+Version:        5.4.2
 Release:        0
 Summary:        Intuitive, easy CLIs based on python type hints
 License:        Apache-2.0

++++++ cyclopts-5.4.0.tar.gz -> cyclopts-5.4.2.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/cyclopts-5.4.0/PKG-INFO new/cyclopts-5.4.2/PKG-INFO
--- old/cyclopts-5.4.0/PKG-INFO 2020-02-02 01:00:00.000000000 +0100
+++ new/cyclopts-5.4.2/PKG-INFO 2020-02-02 01:00:00.000000000 +0100
@@ -1,6 +1,6 @@
 Metadata-Version: 2.5
 Name: cyclopts
-Version: 5.4.0
+Version: 5.4.2
 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.4.0/cyclopts/_convert.py 
new/cyclopts-5.4.2/cyclopts/_convert.py
--- old/cyclopts-5.4.0/cyclopts/_convert.py     2020-02-02 01:00:00.000000000 
+0100
+++ new/cyclopts-5.4.2/cyclopts/_convert.py     2020-02-02 01:00:00.000000000 
+0100
@@ -843,7 +843,7 @@
                 if e.token is None:
                     e.token = token
                 raise
-            except ValueError:
+            except (ValueError, OverflowError):
                 raise CoercionError(token=token, target_type=type_) from None
         else:
             # Convert it into a user-supplied class.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/cyclopts-5.4.0/cyclopts/_version.py 
new/cyclopts-5.4.2/cyclopts/_version.py
--- old/cyclopts-5.4.0/cyclopts/_version.py     2020-02-02 01:00:00.000000000 
+0100
+++ new/cyclopts-5.4.2/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.4.0'
-__version_tuple__ = version_tuple = (5, 4, 0)
+__version__ = version = '5.4.2'
+__version_tuple__ = version_tuple = (5, 4, 2)
 
 __commit_id__ = commit_id = None
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/cyclopts-5.4.0/cyclopts/argument/_argument.py 
new/cyclopts-5.4.2/cyclopts/argument/_argument.py
--- old/cyclopts-5.4.0/cyclopts/argument/_argument.py   2020-02-02 
01:00:00.000000000 +0100
+++ new/cyclopts-5.4.2/cyclopts/argument/_argument.py   2020-02-02 
01:00:00.000000000 +0100
@@ -1262,12 +1262,15 @@
         return self.names[0]
 
     @property
+    def positives(self) -> tuple[str, ...]:
+        """Names the argument goes by, excluding :attr:`negatives`."""
+        assert isinstance(self.parameter.name, tuple)
+        return self.parameter.name
+
+    @property
     def names(self) -> tuple[str, ...]:
         """Names the argument goes by (both positive and negative)."""
-        import itertools
-
-        assert isinstance(self.parameter.name, tuple)
-        return tuple(itertools.chain(self.parameter.name, self.negatives))
+        return self.positives + self.negatives
 
     def env_var_split(self, value: str, delimiter: str | None = None) -> 
list[str]:
         """Split a given value with :meth:`.Parameter.env_var_split`."""
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/cyclopts-5.4.0/cyclopts/validators/_group.py 
new/cyclopts-5.4.2/cyclopts/validators/_group.py
--- old/cyclopts-5.4.0/cyclopts/validators/_group.py    2020-02-02 
01:00:00.000000000 +0100
+++ new/cyclopts-5.4.2/cyclopts/validators/_group.py    2020-02-02 
01:00:00.000000000 +0100
@@ -15,6 +15,10 @@
 
         Commonly used for enforcing mutually-exclusive parameters (default 
behavior).
 
+        A parameter counts as selected when it is given a value from any 
source, regardless of
+        the value itself; e.g. ``--no-flag`` counts the same as ``--flag``.
+        Set ``Parameter(negative="")`` on boolean flags to remove their 
negative variants.
+
         Parameters
         ----------
         min: int
@@ -64,10 +68,23 @@
             )
             if self.min == 0 and self.max == 1:
                 raise ValueError(f"Mutually exclusive arguments: {offenders}")
+
+            if self.min == self.max:
+                requirement = f"Exactly {self.min}"
+            elif self.min == 0:
+                requirement = f"At most {self.max}"
+            elif self.max >= group_size:
+                requirement = f"At least {self.min}"
             else:
-                raise ValueError(
-                    f"Received {n_arguments} arguments: {offenders}. Only 
[{self.min}, {self.max}] choices may be specified."
-                )
+                requirement = f"Between {self.min} and {self.max}"
+            if self.allow_none:
+                requirement += " (or none)"
+            received = f"Received {n_arguments} argument{'' if n_arguments == 
1 else 's'}"
+            if n_arguments:
+                received += f": {offenders}"
+            choices = "{" + ", ".join("/".join(dict.fromkeys(a.positives)) for 
a in argument_collection) + "}"
+            verb = "may" if self.min == 0 else "must"
+            raise ValueError(f"{received}. {requirement} of {choices} {verb} 
be specified.")
 
 
 class MutuallyExclusive(LimitedChoice):

Reply via email to