Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package python-tqdm for openSUSE:Factory 
checked in at 2026-03-11 20:49:43
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-tqdm (Old)
 and      /work/SRC/openSUSE:Factory/.python-tqdm.new.8177 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "python-tqdm"

Wed Mar 11 20:49:43 2026 rev:65 rq:1337901 version:4.67.3

Changes:
--------
--- /work/SRC/openSUSE:Factory/python-tqdm/python-tqdm.changes  2025-08-26 
14:56:49.853973045 +0200
+++ /work/SRC/openSUSE:Factory/.python-tqdm.new.8177/python-tqdm.changes        
2026-03-11 20:49:51.056468091 +0100
@@ -1,0 +2,20 @@
+Tue Mar 10 08:19:24 UTC 2026 - Dirk Müller <[email protected]>
+
+- update to 4.67.3:
+  * fix py3.7 dependencies
+
+- update to 4.67.2:
+  * support `pandas>=3`
+  * fix `format_interval` for negative numbers
+  * misc linting
+  * framework updates
+  * bump CI workflow & `pre-commit` dependencies
+  * add `pyupgrade`
+  * add py3.13 support
+  * fix py3.7 tests
+  * update `setuptools-scm` usage
+  * support auto-dedented docstrings when building docs in
+    py3.13
+  * tests: relax flaky benchmarks
+
+-------------------------------------------------------------------

Old:
----
  tqdm-4.67.1.tar.gz

New:
----
  tqdm-4.67.3.tar.gz

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

Other differences:
------------------
++++++ python-tqdm.spec ++++++
--- /var/tmp/diff_new_pack.Qfq6Ae/_old  2026-03-11 20:49:51.704494363 +0100
+++ /var/tmp/diff_new_pack.Qfq6Ae/_new  2026-03-11 20:49:51.704494363 +0100
@@ -1,7 +1,7 @@
 #
 # spec file for package python-tqdm
 #
-# Copyright (c) 2025 SUSE LLC and contributors
+# Copyright (c) 2026 SUSE LLC and contributors
 #
 # All modifications and additions to the file contributed by third parties
 # remain the property of their copyright owners, unless otherwise agreed
@@ -33,7 +33,7 @@
 %endif
 %{?sle15_python_module_pythons}
 Name:           python-tqdm%{pkg_suffix}
-Version:        4.67.1
+Version:        4.67.3
 Release:        0
 Summary:        An extensible progress meter
 License:        MIT AND MPL-2.0

++++++ tqdm-4.67.1.tar.gz -> tqdm-4.67.3.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/tqdm-4.67.1/.pre-commit-config.yaml 
new/tqdm-4.67.3/.pre-commit-config.yaml
--- old/tqdm-4.67.1/.pre-commit-config.yaml     2024-11-24 21:11:41.000000000 
+0100
+++ new/tqdm-4.67.3/.pre-commit-config.yaml     2026-02-03 18:34:16.000000000 
+0100
@@ -2,7 +2,7 @@
   python: python3
 repos:
 - repo: https://github.com/pre-commit/pre-commit-hooks
-  rev: v5.0.0
+  rev: v6.0.0
   hooks:
   - id: check-added-large-files
   - id: check-case-conflict
@@ -39,7 +39,7 @@
     - pytest-timeout
     - pytest-asyncio>=0.24
 - repo: https://github.com/PyCQA/flake8
-  rev: 7.1.1
+  rev: 7.3.0
   hooks:
   - id: flake8
     args: [-j8]
@@ -50,13 +50,17 @@
     - flake8-debugger
     - flake8-isort
     - flake8-pyproject
-    - flake8-string-format
+- repo: https://github.com/asottile/pyupgrade
+  rev: v3.21.2
+  hooks:
+  - id: pyupgrade
+    args: [--py37-plus]
 - repo: https://github.com/PyCQA/isort
-  rev: 5.13.2
+  rev: 7.0.0
   hooks:
   - id: isort
 - repo: https://github.com/kynan/nbstripout
-  rev: 0.7.1
+  rev: 0.9.0
   hooks:
   - id: nbstripout
     args: [--keep-count, --keep-output]
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/tqdm-4.67.1/CONTRIBUTING.md 
new/tqdm-4.67.3/CONTRIBUTING.md
--- old/tqdm-4.67.1/CONTRIBUTING.md     2024-11-24 21:11:41.000000000 +0100
+++ new/tqdm-4.67.3/CONTRIBUTING.md     2026-02-03 18:34:16.000000000 +0100
@@ -99,7 +99,7 @@
 in [tox.ini](https://github.com/tqdm/tqdm/blob/master/tox.ini),
 you can use `MiniConda` to install a minimal setup. You must also ensure
 that each distribution has an alias to call the Python interpreter
-(e.g. `python312` for Python 3.12's interpreter).
+(e.g. `python313` for Python 3.13's interpreter).
 
 ### Alternative unit tests with pytest
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/tqdm-4.67.1/LICENCE new/tqdm-4.67.3/LICENCE
--- old/tqdm-4.67.1/LICENCE     2024-11-24 21:11:41.000000000 +0100
+++ new/tqdm-4.67.3/LICENCE     2026-02-03 18:34:16.000000000 +0100
@@ -7,7 +7,7 @@
 in reverse chronological order:
 
 * files: *
-  MPL-2.0 2015-2024 (c) Casper da Costa-Luis
+  MPL-2.0 2015-2026 (c) Casper da Costa-Luis
   [casperdcl](https://github.com/casperdcl).
 * files: tqdm/_tqdm.py
   MIT 2016 (c) [PR #96] on behalf of Google Inc.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/tqdm-4.67.1/Makefile new/tqdm-4.67.3/Makefile
--- old/tqdm-4.67.1/Makefile    2024-11-24 21:11:41.000000000 +0100
+++ new/tqdm-4.67.3/Makefile    2026-02-03 18:34:16.000000000 +0100
@@ -113,7 +113,7 @@
        @+python -c "fd=open('.dockerignore', 'w'); 
fd.write('*\n!dist/*.whl\n')"
 
 Dockerfile:
-       @+python -c 'fd=open("Dockerfile", "w"); fd.write("FROM 
python:3.8-alpine\nCOPY dist/*.whl .\nRUN pip install -U $$(ls ./*.whl) && rm 
./*.whl\nENTRYPOINT [\"tqdm\"]\n")'
+       @+python -c 'fd=open("Dockerfile", "w"); fd.write("FROM 
python:3.13-alpine\nCOPY dist/*.whl .\nRUN pip install -U $$(ls ./*.whl) && rm 
./*.whl\nENTRYPOINT [\"tqdm\"]\n")'
 
 distclean:
        @+make coverclean
@@ -124,7 +124,6 @@
        @+python -c "import shutil; shutil.rmtree('dist', True)"
        @+python -c "import shutil; shutil.rmtree('tqdm.egg-info', True)"
        @+python -c "import shutil; shutil.rmtree('.eggs', True)"
-       @+python -c "import os; os.remove('tqdm/_dist_ver.py') if 
os.path.exists('tqdm/_dist_ver.py') else None"
 coverclean:
        @+python -c "import os; os.remove('.coverage') if 
os.path.exists('.coverage') else None"
        @+python -c "import os, glob; [os.remove(i) for i in 
glob.glob('.coverage.*')]"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/tqdm-4.67.1/PKG-INFO new/tqdm-4.67.3/PKG-INFO
--- old/tqdm-4.67.1/PKG-INFO    2024-11-24 21:12:11.768507000 +0100
+++ new/tqdm-4.67.3/PKG-INFO    2026-02-03 18:35:32.658512600 +0100
@@ -1,6 +1,6 @@
-Metadata-Version: 2.1
+Metadata-Version: 2.4
 Name: tqdm
-Version: 4.67.1
+Version: 4.67.3
 Summary: Fast, Extensible Progress Meter
 Maintainer-email: tqdm developers <[email protected]>
 License: MPL-2.0 AND MIT
@@ -22,8 +22,6 @@
 Classifier: Intended Audience :: End Users/Desktop
 Classifier: Intended Audience :: Other Audience
 Classifier: Intended Audience :: System Administrators
-Classifier: License :: OSI Approved :: MIT License
-Classifier: License :: OSI Approved :: Mozilla Public License 2.0 (MPL 2.0)
 Classifier: Operating System :: MacOS
 Classifier: Operating System :: MacOS :: MacOS X
 Classifier: Operating System :: Microsoft
@@ -43,6 +41,7 @@
 Classifier: Programming Language :: Python :: 3.10
 Classifier: Programming Language :: Python :: 3.11
 Classifier: Programming Language :: Python :: 3.12
+Classifier: Programming Language :: Python :: 3.13
 Classifier: Programming Language :: Python :: 3 :: Only
 Classifier: Programming Language :: Python :: Implementation
 Classifier: Programming Language :: Python :: Implementation :: IronPython
@@ -68,6 +67,7 @@
 Description-Content-Type: text/x-rst
 License-File: LICENCE
 Requires-Dist: colorama; platform_system == "Windows"
+Requires-Dist: importlib_metadata; python_version < "3.8"
 Provides-Extra: dev
 Requires-Dist: pytest>=6; extra == "dev"
 Requires-Dist: pytest-cov; extra == "dev"
@@ -82,6 +82,7 @@
 Requires-Dist: requests; extra == "telegram"
 Provides-Extra: notebook
 Requires-Dist: ipywidgets>=6; extra == "notebook"
+Dynamic: license-file
 
 |Logo|
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/tqdm-4.67.1/examples/7zx.py 
new/tqdm-4.67.3/examples/7zx.py
--- old/tqdm-4.67.1/examples/7zx.py     2024-11-24 21:11:41.000000000 +0100
+++ new/tqdm-4.67.3/examples/7zx.py     2026-02-03 18:34:16.000000000 +0100
@@ -1,4 +1,3 @@
-# -*- coding: utf-8 -*-
 """Usage:
   7zx.py [--help | options] <zipfiles>...
 
@@ -18,7 +17,6 @@
                          NOTSET
   -d, --debug-trace      Print lots of debugging information (-D NOTSET)
 """
-import io
 import logging
 import os
 import pty
@@ -81,7 +79,7 @@
                 stdout=md,  # subprocess.PIPE,
                 stderr=subprocess.STDOUT)
             os.close(sd)
-            with io.open(md, mode="rU", buffering=1) as m:
+            with open(md, buffering=1) as m:
                 with tqdm(total=sum(fcomp.values()), disable=len(zips) < 2,
                           leave=False, unit="B", unit_scale=True) as t:
                     if not hasattr(t, "start_t"):  # disabled
@@ -89,7 +87,7 @@
                     while True:
                         try:
                             l_raw = m.readline()
-                        except IOError:
+                        except OSError:
                             break
                         ln = l_raw.strip()
                         if ln.startswith("Extracting"):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/tqdm-4.67.1/pyproject.toml 
new/tqdm-4.67.3/pyproject.toml
--- old/tqdm-4.67.1/pyproject.toml      2024-11-24 21:11:41.000000000 +0100
+++ new/tqdm-4.67.3/pyproject.toml      2026-02-03 18:34:16.000000000 +0100
@@ -1,10 +1,8 @@
 [build-system]
-requires = ["setuptools>=42", "wheel", "setuptools_scm[toml]>=3.4"]
+requires = ["setuptools>=42", "setuptools-scm[toml]>=3.4"]
 build-backend = "setuptools.build_meta"
 
 [tool.setuptools_scm]
-write_to = "tqdm/_dist_ver.py"
-write_to_template = "__version__ = '{version}'\n"
 
 [tool.setuptools.packages.find]
 exclude = ["benchmarks", "examples", "tests", "wiki", "docs", "feedstock"]
@@ -39,8 +37,6 @@
     "Intended Audience :: End Users/Desktop",
     "Intended Audience :: Other Audience",
     "Intended Audience :: System Administrators",
-    "License :: OSI Approved :: MIT License",
-    "License :: OSI Approved :: Mozilla Public License 2.0 (MPL 2.0)",
     "Operating System :: MacOS",
     "Operating System :: MacOS :: MacOS X",
     "Operating System :: Microsoft",
@@ -60,6 +56,7 @@
     "Programming Language :: Python :: 3.10",
     "Programming Language :: Python :: 3.11",
     "Programming Language :: Python :: 3.12",
+    "Programming Language :: Python :: 3.13",
     "Programming Language :: Python :: 3 :: Only",
     "Programming Language :: Python :: Implementation",
     "Programming Language :: Python :: Implementation :: IronPython",
@@ -81,7 +78,7 @@
     "Topic :: System :: Shells",
     "Topic :: Terminals",
     "Topic :: Utilities"]
-dependencies = ['colorama; platform_system == "Windows"']
+dependencies = ['colorama; platform_system == "Windows"', 'importlib_metadata; 
python_version < "3.8"']
 
 [project.optional-dependencies]
 dev = ["pytest>=6", "pytest-cov", "pytest-timeout", "pytest-asyncio>=0.24", 
"nbval"]
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/tqdm-4.67.1/tests/conftest.py 
new/tqdm-4.67.3/tests/conftest.py
--- old/tqdm-4.67.1/tests/conftest.py   2024-11-24 21:11:41.000000000 +0100
+++ new/tqdm-4.67.3/tests/conftest.py   2026-02-03 18:34:16.000000000 +0100
@@ -18,10 +18,10 @@
         n = len(tqdm._instances)
         if n:
             tqdm._instances.clear()
-            raise EnvironmentError(f"{n} `tqdm` instances still in existence 
PRE-test")
+            raise OSError(f"{n} `tqdm` instances still in existence PRE-test")
     yield
     if getattr(tqdm, "_instances", False):
         n = len(tqdm._instances)
         if n:
             tqdm._instances.clear()
-            raise EnvironmentError(f"{n} `tqdm` instances still in existence 
POST-test")
+            raise OSError(f"{n} `tqdm` instances still in existence POST-test")
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/tqdm-4.67.1/tests/tests_itertools.py 
new/tqdm-4.67.3/tests/tests_itertools.py
--- old/tqdm-4.67.1/tests/tests_itertools.py    2024-11-24 21:11:41.000000000 
+0100
+++ new/tqdm-4.67.3/tests/tests_itertools.py    2026-02-03 18:34:16.000000000 
+0100
@@ -8,13 +8,12 @@
 from .tests_tqdm import StringIO, closing
 
 
-class NoLenIter(object):
+class NoLenIter:
     def __init__(self, iterable):
         self._it = iterable
 
     def __iter__(self):
-        for i in self._it:
-            yield i
+        yield from self._it
 
 
 def test_product():
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/tqdm-4.67.1/tests/tests_pandas.py 
new/tqdm-4.67.3/tests/tests_pandas.py
--- old/tqdm-4.67.1/tests/tests_pandas.py       2024-11-24 21:11:41.000000000 
+0100
+++ new/tqdm-4.67.3/tests/tests_pandas.py       2026-02-03 18:34:16.000000000 
+0100
@@ -77,16 +77,18 @@
         def task_func(x):
             return x + 1
 
-        # applymap
-        res1 = df.progress_applymap(task_func)
-        res2 = df.applymap(task_func)
-        assert res1.equals(res2)
-
-        # map
         if hasattr(df, 'map'):  # pandas>=2.1.0
+            # map
             res1 = df.progress_map(task_func)
             res2 = df.map(task_func)
             assert res1.equals(res2)
+            assert '200/200' in our_file.getvalue()
+        else:
+            # applymap
+            res1 = df.progress_applymap(task_func)
+            res2 = df.applymap(task_func)
+            assert res1.equals(res2)
+            assert '20000/20000' in our_file.getvalue()
 
         # apply unhashable
         res1 = []
@@ -98,25 +100,17 @@
             res3 = df.progress_apply(task_func, axis=axis)
             res4 = df.apply(task_func, axis=axis)
             assert res3.equals(res4)
+        assert '200/200' in our_file.getvalue()  # axis=0
+        assert '100/100' in our_file.getvalue()  # axis=1
 
         our_file.seek(0)
-        if our_file.read().count('100%') < 3:
+        if our_file.read().count('100%') < 6:
             our_file.seek(0)
             raise AssertionError(
-                f"\nExpected:\n100% at least three 
times\nIn:\n{our_file.read()}\n")
-
-        # apply_map, apply axis=0, apply axis=1
-        expects = ['20000/20000', '200/200', '100/100']
-        for exres in expects:
-            our_file.seek(0)
-            if our_file.getvalue().count(exres) < 1:
-                our_file.seek(0)
-                raise AssertionError(
-                    f"\nExpected:\n{exres} at least 
once.\nIn:\n{our_file.read()}\n")
+                f"\nExpected:\n100% at least 6 
times\nIn:\n{our_file.read()}\n")
 
 
[email protected](
-    "ignore:DataFrameGroupBy.apply operated on the grouping 
columns:DeprecationWarning")
[email protected]("ignore:DataFrameGroupBy.apply operated on the grouping 
columns")
 def test_pandas_groupby_apply():
     """Test pandas.DataFrame.groupby(...).progress_apply"""
     with closing(StringIO()) as our_file:
@@ -169,8 +163,7 @@
                     f"\nExpected:\n{exres} at least 
once.\nIn:\n{our_file.read()}\n")
 
 
[email protected](
-    "ignore:DataFrameGroupBy.apply operated on the grouping 
columns:DeprecationWarning")
[email protected]("ignore:DataFrameGroupBy.apply operated on the grouping 
columns")
 def test_pandas_leave():
     """Test pandas with `leave=True`"""
     with closing(StringIO()) as our_file:
@@ -205,8 +198,7 @@
             "keyword arguments instead"))
 
 
[email protected](
-    "ignore:DataFrameGroupBy.apply operated on the grouping 
columns:DeprecationWarning")
[email protected]("ignore:DataFrameGroupBy.apply operated on the grouping 
columns")
 def test_pandas_deprecation():
     """Test bar object instance as argument deprecation"""
     try:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/tqdm-4.67.1/tests/tests_synchronisation.py 
new/tqdm-4.67.3/tests/tests_synchronisation.py
--- old/tqdm-4.67.1/tests/tests_synchronisation.py      2024-11-24 
21:11:41.000000000 +0100
+++ new/tqdm-4.67.3/tests/tests_synchronisation.py      2026-02-03 
18:34:16.000000000 +0100
@@ -7,7 +7,7 @@
 from .tests_tqdm import StringIO, closing, importorskip, patch_lock, skip
 
 
-class Time(object):
+class Time:
     """Fake time class class providing an offset"""
     offset = 0
 
@@ -78,7 +78,7 @@
     return timer
 
 
-class FakeTqdm(object):
+class FakeTqdm:
     _instances = set()
     get_lock = tqdm.get_lock
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/tqdm-4.67.1/tests/tests_tqdm.py 
new/tqdm-4.67.3/tests/tests_tqdm.py
--- old/tqdm-4.67.1/tests/tests_tqdm.py 2024-11-24 21:11:41.000000000 +0100
+++ new/tqdm-4.67.3/tests/tests_tqdm.py 2026-02-03 18:34:16.000000000 +0100
@@ -1,4 +1,3 @@
-# -*- coding: utf-8 -*-
 # Advice: use repr(our_file.read()) to print the full output of tqdm
 # (else '\r' will replace the previous lines and you'll see only the latest.
 import csv
@@ -80,7 +79,7 @@
     return res
 
 
-class DiscreteTimer(object):
+class DiscreteTimer:
     """Virtual discrete time manager, to precisely control time for tests"""
     def __init__(self):
         self.t = 0.0
@@ -180,6 +179,10 @@
     assert format_interval(60) == '01:00'
     assert format_interval(6160) == '1:42:40'
     assert format_interval(238113) == '66:08:33'
+    assert format_interval(-1) == '-00:01'
+    assert format_interval(-60) == '-01:00'
+    assert format_interval(-100000) == '-27:46:40'
+    assert format_interval(0) == '00:00'
 
 
 def test_format_num():
@@ -353,7 +356,7 @@
     """Native strings written to unspecified files"""
     stderr = sys.stderr
     try:
-        sys.stderr = WriteTypeChecker(expected_type=type(''))
+        sys.stderr = WriteTypeChecker(expected_type=str)
         for _ in tqdm(range(3)):
             pass
         sys.stderr.encoding = None  # py2 behaviour
@@ -365,20 +368,20 @@
 
 def test_unicode_string_io_for_specified_file():
     """Unicode strings written to specified files"""
-    for _ in tqdm(range(3), file=WriteTypeChecker(expected_type=type(u''))):
+    for _ in tqdm(range(3), file=WriteTypeChecker(expected_type=str)):
         pass
 
 
 def test_write_bytes():
     """Test write_bytes argument with and without `file`"""
     # specified file (and bytes)
-    for _ in tqdm(range(3), file=WriteTypeChecker(expected_type=type(b'')),
+    for _ in tqdm(range(3), file=WriteTypeChecker(expected_type=bytes),
                   write_bytes=True):
         pass
     # unspecified file (and unicode)
     stderr = sys.stderr
     try:
-        sys.stderr = WriteTypeChecker(expected_type=type(u''))
+        sys.stderr = WriteTypeChecker(expected_type=str)
         for _ in tqdm(range(3), write_bytes=False):
             pass
     finally:
@@ -869,9 +872,9 @@
             for _ in range(3):
                 t.update()
         res = our_file.getvalue().strip("\r").split("\r")
-    assert u"7%|\u258b" in res[1]
-    assert u"13%|\u2588\u258e" in res[2]
-    assert u"20%|\u2588\u2588" in res[3]
+    assert "7%|\u258b" in res[1]
+    assert "13%|\u2588\u258e" in res[2]
+    assert "20%|\u2588\u2588" in res[3]
 
     # Test custom bar
     for bars in [" .oO0", " #"]:
@@ -1323,7 +1326,7 @@
     # unicode
     with closing(StringIO()) as our_file:
         with tqdm(total=10, file=our_file) as t:
-            t.set_description(u"\xe1\xe9\xed\xf3\xfa")
+            t.set_description("\xe1\xe9\xed\xf3\xfa")
 
 
 def test_deprecated_gui():
@@ -1446,8 +1449,8 @@
         t2.close()
 
         # Check that refreshing indeed forced the display to use realtime state
-        assert before == [u'pos0 bar:   0%|', u'pos1 bar:   0%|']
-        assert after == [u'pos0 bar:  10%|', u'pos1 bar:  10%|']
+        assert before == ['pos0 bar:   0%|', 'pos1 bar:   0%|']
+        assert after == ['pos0 bar:  10%|', 'pos1 bar:  10%|']
 
 
 def test_disabled_repr(capsys):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/tqdm-4.67.1/tox.ini new/tqdm-4.67.3/tox.ini
--- old/tqdm-4.67.1/tox.ini     2024-11-24 21:11:41.000000000 +0100
+++ new/tqdm-4.67.3/tox.ini     2026-02-03 18:34:16.000000000 +0100
@@ -4,7 +4,7 @@
 # and then run "tox" from this directory.
 
 [tox]
-envlist=py{37,38,39,310,311,312,py3}{,-tf}{,-keras}, perf, check
+envlist=py{37,38,39,310,311,312,313,py3}{,-tf}{,-keras}, perf, check
 isolated_build=True
 
 [gh-actions]
@@ -15,6 +15,7 @@
     3.10: py310
     3.11: py311
     3.12: py312
+    3.13: py313
     pypy-3.7: pypy3
 [gh-actions:env]
 PLATFORM=
@@ -27,7 +28,9 @@
     pytest-timeout
     pytest-asyncio
     ipywidgets
-    git+https://github.com/casperdcl/nbval.git@master#egg=nbval
+    py37: importlib_resources
+    py37: git+https://github.com/casperdcl/nbval@named-cells-py37
+    !py37: git+https://github.com/casperdcl/nbval
     coverage
     coveralls
     codecov
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/tqdm-4.67.1/tqdm/_dist_ver.py 
new/tqdm-4.67.3/tqdm/_dist_ver.py
--- old/tqdm-4.67.1/tqdm/_dist_ver.py   2024-11-24 21:12:11.000000000 +0100
+++ new/tqdm-4.67.3/tqdm/_dist_ver.py   1970-01-01 01:00:00.000000000 +0100
@@ -1 +0,0 @@
-__version__ = '4.67.1'
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/tqdm-4.67.1/tqdm/cli.py new/tqdm-4.67.3/tqdm/cli.py
--- old/tqdm-4.67.1/tqdm/cli.py 2024-11-24 21:11:41.000000000 +0100
+++ new/tqdm-4.67.3/tqdm/cli.py 2026-02-03 18:34:16.000000000 +0100
@@ -249,7 +249,7 @@
         manpath = tqdm_args.pop('manpath', None)
         comppath = tqdm_args.pop('comppath', None)
         if tqdm_args.pop('null', False):
-            class stdout(object):
+            class stdout:
                 @staticmethod
                 def write(_):
                     pass
@@ -278,7 +278,7 @@
             stdout_write = stdout.write
             fp_write = getattr(fp, 'buffer', fp).write
 
-            class stdout(object):  # pylint: disable=function-redefined
+            class stdout:  # pylint: disable=function-redefined
                 @staticmethod
                 def write(x):
                     with tqdm.external_write_mode(file=fp):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/tqdm-4.67.1/tqdm/contrib/__init__.py 
new/tqdm-4.67.3/tqdm/contrib/__init__.py
--- old/tqdm-4.67.1/tqdm/contrib/__init__.py    2024-11-24 21:11:41.000000000 
+0100
+++ new/tqdm-4.67.3/tqdm/contrib/__init__.py    2026-02-03 18:34:16.000000000 
+0100
@@ -76,8 +76,7 @@
     """
     kwargs = tqdm_kwargs.copy()
     tqdm_class = kwargs.pop("tqdm_class", tqdm_auto)
-    for i in zip(tqdm_class(iter1, **kwargs), *iter2plus):
-        yield i
+    yield from zip(tqdm_class(iter1, **kwargs), *iter2plus)
 
 
 def tmap(function, *sequences, **tqdm_kwargs):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/tqdm-4.67.1/tqdm/contrib/utils_worker.py 
new/tqdm-4.67.3/tqdm/contrib/utils_worker.py
--- old/tqdm-4.67.1/tqdm/contrib/utils_worker.py        2024-11-24 
21:11:41.000000000 +0100
+++ new/tqdm-4.67.3/tqdm/contrib/utils_worker.py        2026-02-03 
18:34:16.000000000 +0100
@@ -10,7 +10,7 @@
 __all__ = ['MonoWorker']
 
 
-class MonoWorker(object):
+class MonoWorker:
     """
     Supports one running task and one waiting task.
     The waiting task is the most recent submitted (others are discarded).
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/tqdm-4.67.1/tqdm/notebook.py 
new/tqdm-4.67.3/tqdm/notebook.py
--- old/tqdm-4.67.1/tqdm/notebook.py    2024-11-24 21:11:41.000000000 +0100
+++ new/tqdm-4.67.3/tqdm/notebook.py    2026-02-03 18:34:16.000000000 +0100
@@ -157,7 +157,7 @@
         pbar.value = self.n
 
         if msg:
-            msg = msg.replace(' ', u'\u2007')  # fix html space padding
+            msg = msg.replace(' ', '\u2007')  # fix html space padding
             # html escape special characters (like '&')
             if '<bar/>' in msg:
                 left, right = map(escape, re.split(r'\|?<bar/>\|?', msg, 
maxsplit=1))
@@ -247,9 +247,7 @@
     def __iter__(self):
         try:
             it = super().__iter__()
-            for obj in it:
-                # return super(tqdm...) will not catch exception
-                yield obj
+            yield from it
         # NB: except ... [ as ...] breaks IPython async KeyboardInterrupt
         except:  # NOQA
             self.disp(bar_style='danger')
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/tqdm-4.67.1/tqdm/std.py new/tqdm-4.67.3/tqdm/std.py
--- old/tqdm-4.67.1/tqdm/std.py 2024-11-24 21:11:41.000000000 +0100
+++ new/tqdm-4.67.3/tqdm/std.py 2026-02-03 18:34:16.000000000 +0100
@@ -42,11 +42,11 @@
 
     Used for non-external-code-breaking errors, such as garbled printing.
     """
-    def __init__(self, msg, fp_write=None, *a, **k):
+    def __init__(self, msg, fp_write=None):  # noqa: B042
         if fp_write is not None:
             fp_write("\n" + self.__class__.__name__ + ": " + str(msg).rstrip() 
+ '\n')
         else:
-            super().__init__(msg, *a, **k)
+            super().__init__(msg)
 
 
 class TqdmExperimentalWarning(TqdmWarning, FutureWarning):
@@ -73,7 +73,7 @@
         pass
 
 
-class TqdmDefaultWriteLock(object):
+class TqdmDefaultWriteLock:
     """
     Provide a default write lock for thread and multiprocessing safety.
     Works only on platforms supporting `fork` (so Windows is excluded).
@@ -128,7 +128,7 @@
         warn("create_th_lock not needed anymore", TqdmDeprecationWarning, 
stacklevel=2)
 
 
-class Bar(object):
+class Bar:
     """
     `str.format`-able bar with format specifiers: `[width][type]`
 
@@ -142,7 +142,7 @@
       + `b`: blank (`charset="  "` override)
     """
     ASCII = " 123456789#"
-    UTF = u" " + u''.join(map(chr, range(0x258F, 0x2587, -1)))
+    UTF = " " + ''.join(map(chr, range(0x258F, 0x2587, -1)))
     BLANK = "  "
     COLOUR_RESET = '\x1b[0m'
     COLOUR_RGB = '\x1b[38;2;%d;%d;%dm'
@@ -178,9 +178,8 @@
             else:
                 raise KeyError
         except (KeyError, AttributeError):
-            warn("Unknown colour (%s); valid choices: [hex (#00ff00), %s]" % (
-                 value, ", ".join(self.COLOURS)),
-                 TqdmWarning, stacklevel=2)
+            warn(f"Unknown colour ({value}); valid choices:"
+                 f" [hex (#00ff00), {', '.join(self.COLOURS)}]", TqdmWarning, 
stacklevel=2)
             self._colour = None
 
     def __format__(self, format_spec):
@@ -211,7 +210,7 @@
         return self.colour + res + self.COLOUR_RESET if self.colour else res
 
 
-class EMA(object):
+class EMA:
     """
     Exponential moving average: smoothing to give progressively lower
     weights to older values.
@@ -412,9 +411,10 @@
         out  : str
             [H:]MM:SS
         """
-        mins, s = divmod(int(t), 60)
+        sign = '-' if t < 0 else ''
+        mins, s = divmod(abs(int(t)), 60)
         h, m = divmod(mins, 60)
-        return f'{h:d}:{m:02d}:{s:02d}' if h else f'{m:02d}:{s:02d}'
+        return f'{sign}{h:d}:{m:02d}:{s:02d}' if h else 
f'{sign}{m:02d}:{s:02d}'
 
     @staticmethod
     def format_num(n):
@@ -893,10 +893,10 @@
                         " Use keyword arguments instead.",
                         fp_write=getattr(t.fp, 'write', sys.stderr.write))
 
-                try:  # pandas>=1.3.0
+                try:  # pandas>=1.3.0,<3.0
                     from pandas.core.common import is_builtin_func
-                except ImportError:
-                    is_builtin_func = df._is_builtin_func
+                except ImportError:  # pandas<1.3.0
+                    is_builtin_func = getattr(df, '_is_builtin_func', lambda 
f: f)
                 try:
                     func = is_builtin_func(func)
                 except TypeError:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/tqdm-4.67.1/tqdm/tqdm.1 new/tqdm-4.67.3/tqdm/tqdm.1
--- old/tqdm-4.67.1/tqdm/tqdm.1 2024-11-24 21:11:41.000000000 +0100
+++ new/tqdm-4.67.3/tqdm/tqdm.1 2026-02-03 18:34:16.000000000 +0100
@@ -1,77 +1,64 @@
-.\" Automatically generated by Pandoc 1.19.2
+.\" Automatically generated by Pandoc 3.8.3
 .\"
-.TH "TQDM" "1" "2015\-2021" "tqdm User Manuals" ""
-.hy
+.TH "TQDM" "1" "2015\-2026" "tqdm User Manuals"
 .SH NAME
-.PP
 tqdm \- fast, extensible progress bar for Python and CLI
 .SH SYNOPSIS
-.PP
-tqdm [\f[I]options\f[]]
+tqdm [\f[I]options\f[R]]
 .SH DESCRIPTION
-.PP
-See <https://github.com/tqdm/tqdm>.
+See \c
+.UR https://github.com/tqdm/tqdm
+.UE \c
+\&.
 Can be used as a pipe:
 .IP
-.nf
-\f[C]
-$\ #\ count\ lines\ of\ code
-$\ cat\ *.py\ |\ tqdm\ |\ wc\ \-l
-327it\ [00:00,\ 981773.38it/s]
+.EX
+$ \f[I]# count lines of code\f[R]
+$ cat *.py \f[B]|\f[R] tqdm \f[B]|\f[R] wc \-l
+327it [00:00, 981773.38it/s]
 327
 
-$\ #\ find\ all\ files
-$\ find\ .\ \-name\ "*.py"\ |\ tqdm\ |\ wc\ \-l
-432it\ [00:00,\ 833842.30it/s]
+$ \f[I]# find all files\f[R]
+$ find . \-name \(dq*.py\(dq \f[B]|\f[R] tqdm \f[B]|\f[R] wc \-l
+432it [00:00, 833842.30it/s]
 432
 
-#\ ...\ and\ more\ info
-$\ find\ .\ \-name\ \[aq]*.py\[aq]\ \-exec\ wc\ \-l\ \\{}\ \\;\ \\
-\ \ |\ tqdm\ \-\-total\ 432\ \-\-unit\ files\ \-\-desc\ counting\ \\
-\ \ |\ awk\ \[aq]{\ sum\ +=\ $1\ };\ END\ {\ print\ sum\ }\[aq]
-counting:\ 100%|█████████|\ 432/432\ [00:00<00:00,\ 794361.83files/s]
+\f[I]# ... and more info\f[R]
+$ find . \-name \(aq*.py\(aq \-exec wc \-l \(rs{} \(rs; \(rs
+  \f[B]|\f[R] tqdm \-\-total 432 \-\-unit files \-\-desc counting \(rs
+  \f[B]|\f[R] awk \(aq{ sum += $1 }; END { print sum }\(aq
+counting: 100%\f[B]|\f[R]█████████\f[B]|\f[R] 432/432 [00:00<00:00, 
794361.83files/s]
 131998
-\f[]
-.fi
+.EE
 .SH OPTIONS
 .TP
-.B \-h, \-\-help
+\-h, \-\-help
 Print this help and exit.
-.RS
-.RE
 .TP
-.B \-v, \-\-version
+\-v, \-\-version
 Print version and exit.
-.RS
-.RE
 .TP
-.B \-\-desc=\f[I]desc\f[]
+\-\-desc=\f[I]desc\f[R]
 str, optional.
 Prefix for the progressbar.
-.RS
-.RE
 .TP
-.B \-\-total=\f[I]total\f[]
+\-\-total=\f[I]total\f[R]
 int or float, optional.
 The number of expected iterations.
 If unspecified, len(iterable) is used if possible.
-If float("inf") or as a last resort, only basic progress statistics are
-displayed (no ETA, no progressbar).
-If \f[C]gui\f[] is True and this parameter needs subsequent updating,
-specify an initial arbitrary large positive number, e.g.
-9e9.
-.RS
-.RE
+If float(\(lqinf\(rq) or as a last resort, only basic progress
+statistics are displayed (no ETA, no progressbar).
+If \f[CR]gui\f[R] is True and this parameter needs subsequent updating,
+specify an initial arbitrary large positive number, e.g.\ 9e9.
 .TP
-.B \-\-leave
+\-\-leave
 bool, optional.
 If [default: True], keeps all traces of the progressbar upon termination
 of iteration.
-If \f[C]None\f[], will leave only if \f[C]position\f[] is \f[C]0\f[].
-.RS
-.RE
+If \f[CR]None\f[R], will leave only if \f[CR]position\f[R] is
+\f[CR]0\f[R].
 .TP
-.B \-\-ncols=\f[I]ncols\f[]
+\-\-ncols=\f[I]ncols\f[R]
 int, optional.
 The width of the entire output message.
 If specified, dynamically resizes the progressbar to stay within this
@@ -80,235 +67,177 @@
 The fallback is a meter width of 10 and no limit for the counter and
 statistics.
 If 0, will not print any meter (only stats).
-.RS
-.RE
 .TP
-.B \-\-mininterval=\f[I]mininterval\f[]
+\-\-mininterval=\f[I]mininterval\f[R]
 float, optional.
 Minimum progress display update interval [default: 0.1] seconds.
-.RS
-.RE
 .TP
-.B \-\-maxinterval=\f[I]maxinterval\f[]
+\-\-maxinterval=\f[I]maxinterval\f[R]
 float, optional.
 Maximum progress display update interval [default: 10] seconds.
-Automatically adjusts \f[C]miniters\f[] to correspond to
-\f[C]mininterval\f[] after long display update lag.
-Only works if \f[C]dynamic_miniters\f[] or monitor thread is enabled.
-.RS
-.RE
+Automatically adjusts \f[CR]miniters\f[R] to correspond to
+\f[CR]mininterval\f[R] after long display update lag.
+Only works if \f[CR]dynamic_miniters\f[R] or monitor thread is enabled.
 .TP
-.B \-\-miniters=\f[I]miniters\f[]
+\-\-miniters=\f[I]miniters\f[R]
 int or float, optional.
 Minimum progress display update interval, in iterations.
-If 0 and \f[C]dynamic_miniters\f[], will automatically adjust to equal
-\f[C]mininterval\f[] (more CPU efficient, good for tight loops).
+If 0 and \f[CR]dynamic_miniters\f[R], will automatically adjust to equal
+\f[CR]mininterval\f[R] (more CPU efficient, good for tight loops).
 If > 0, will skip display of specified number of iterations.
-Tweak this and \f[C]mininterval\f[] to get very efficient loops.
+Tweak this and \f[CR]mininterval\f[R] to get very efficient loops.
 If your progress is erratic with both fast and slow iterations (network,
 skipping items, etc) you should set miniters=1.
-.RS
-.RE
 .TP
-.B \-\-ascii=\f[I]ascii\f[]
+\-\-ascii=\f[I]ascii\f[R]
 bool or str, optional.
 If unspecified or False, use unicode (smooth blocks) to fill the meter.
-The fallback is to use ASCII characters " 123456789#".
-.RS
-.RE
+The fallback is to use ASCII characters \(rq 123456789#\(lq.
 .TP
-.B \-\-disable
+\-\-disable
 bool, optional.
 Whether to disable the entire progressbar wrapper [default: False].
 If set to None, disable on non\-TTY.
-.RS
-.RE
 .TP
-.B \-\-unit=\f[I]unit\f[]
+\-\-unit=\f[I]unit\f[R]
 str, optional.
 String that will be used to define the unit of each iteration [default:
 it].
-.RS
-.RE
 .TP
-.B \-\-unit\-scale=\f[I]unit_scale\f[]
+\-\-unit\-scale=\f[I]unit_scale\f[R]
 bool or int or float, optional.
 If 1 or True, the number of iterations will be reduced/scaled
 automatically and a metric prefix following the International System of
-Units standard will be added (kilo, mega, etc.) [default: False].
-If any other non\-zero number, will scale \f[C]total\f[] and \f[C]n\f[].
-.RS
-.RE
+Units standard will be added (kilo, mega, etc.)
+[default: False].
+If any other non\-zero number, will scale \f[CR]total\f[R] and
+\f[CR]n\f[R].
 .TP
-.B \-\-dynamic\-ncols
+\-\-dynamic\-ncols
 bool, optional.
-If set, constantly alters \f[C]ncols\f[] and \f[C]nrows\f[] to the
+If set, constantly alters \f[CR]ncols\f[R] and \f[CR]nrows\f[R] to the
 environment (allowing for window resizes) [default: False].
-.RS
-.RE
 .TP
-.B \-\-smoothing=\f[I]smoothing\f[]
+\-\-smoothing=\f[I]smoothing\f[R]
 float, optional.
 Exponential moving average smoothing factor for speed estimates (ignored
 in GUI mode).
 Ranges from 0 (average speed) to 1 (current/instantaneous speed)
 [default: 0.3].
-.RS
-.RE
 .TP
-.B \-\-bar\-format=\f[I]bar_format\f[]
+\-\-bar\-format=\f[I]bar_format\f[R]
 str, optional.
 Specify a custom bar string formatting.
 May impact performance.
-[default: \[aq]{l_bar}{bar}{r_bar}\[aq]], where l_bar=\[aq]{desc}:
-{percentage:3.0f}%|\[aq] and r_bar=\[aq]| {n_fmt}/{total_fmt}
-[{elapsed}<{remaining}, \[aq] \[aq]{rate_fmt}{postfix}]\[aq] Possible
-vars: l_bar, bar, r_bar, n, n_fmt, total, total_fmt, percentage,
-elapsed, elapsed_s, ncols, nrows, desc, unit, rate, rate_fmt,
-rate_noinv, rate_noinv_fmt, rate_inv, rate_inv_fmt, postfix,
-unit_divisor, remaining, remaining_s, eta.
-Note that a trailing ": " is automatically removed after {desc} if the
-latter is empty.
-.RS
-.RE
+[default: `{l_bar}{bar}{r_bar}'], where l_bar=`{desc}:
+{percentage:3.0f}%|' and r_bar=`| {n_fmt}/{total_fmt}
+[{elapsed}<{remaining}, \(cq \(cq{rate_fmt}{postfix}]' Possible vars:
+l_bar, bar, r_bar, n, n_fmt, total, total_fmt, percentage, elapsed,
+elapsed_s, ncols, nrows, desc, unit, rate, rate_fmt, rate_noinv,
+rate_noinv_fmt, rate_inv, rate_inv_fmt, postfix, unit_divisor,
+remaining, remaining_s, eta.
+Note that a trailing \(lq:\(rq is automatically removed after {desc} if
+the latter is empty.
 .TP
-.B \-\-initial=\f[I]initial\f[]
+\-\-initial=\f[I]initial\f[R]
 int or float, optional.
 The initial counter value.
 Useful when restarting a progress bar [default: 0].
-If using float, consider specifying \f[C]{n:.3f}\f[] or similar in
-\f[C]bar_format\f[], or specifying \f[C]unit_scale\f[].
-.RS
-.RE
+If using float, consider specifying \f[CR]{n:.3f}\f[R] or similar in
+\f[CR]bar_format\f[R], or specifying \f[CR]unit_scale\f[R].
 .TP
-.B \-\-position=\f[I]position\f[]
+\-\-position=\f[I]position\f[R]
 int, optional.
 Specify the line offset to print this bar (starting from 0) Automatic if
 unspecified.
 Useful to manage multiple bars at once (eg, from threads).
-.RS
-.RE
 .TP
-.B \-\-postfix=\f[I]postfix\f[]
+\-\-postfix=\f[I]postfix\f[R]
 dict or *, optional.
 Specify additional stats to display at the end of the bar.
-Calls \f[C]set_postfix(**postfix)\f[] if possible (dict).
-.RS
-.RE
+Calls \f[CR]set_postfix(**postfix)\f[R] if possible (dict).
 .TP
-.B \-\-unit\-divisor=\f[I]unit_divisor\f[]
+\-\-unit\-divisor=\f[I]unit_divisor\f[R]
 float, optional.
-[default: 1000], ignored unless \f[C]unit_scale\f[] is True.
-.RS
-.RE
+[default: 1000], ignored unless \f[CR]unit_scale\f[R] is True.
 .TP
-.B \-\-write\-bytes
+\-\-write\-bytes
 bool, optional.
 Whether to write bytes.
 If (default: False) will write unicode.
-.RS
-.RE
 .TP
-.B \-\-lock\-args=\f[I]lock_args\f[]
+\-\-lock\-args=\f[I]lock_args\f[R]
 tuple, optional.
-Passed to \f[C]refresh\f[] for intermediate output (initialisation,
+Passed to \f[CR]refresh\f[R] for intermediate output (initialisation,
 iterating, and updating).
-.RS
-.RE
 .TP
-.B \-\-nrows=\f[I]nrows\f[]
+\-\-nrows=\f[I]nrows\f[R]
 int, optional.
 The screen height.
 If specified, hides nested bars outside this bound.
 If unspecified, attempts to use environment height.
 The fallback is 20.
-.RS
-.RE
 .TP
-.B \-\-colour=\f[I]colour\f[]
+\-\-colour=\f[I]colour\f[R]
 str, optional.
-Bar colour (e.g.
-\[aq]green\[aq], \[aq]#00ff00\[aq]).
-.RS
-.RE
+Bar colour (e.g.\ `green', `#00ff00').
 .TP
-.B \-\-delay=\f[I]delay\f[]
+\-\-delay=\f[I]delay\f[R]
 float, optional.
-Don\[aq]t display until [default: 0] seconds have elapsed.
-.RS
-.RE
+Don\(cqt display until [default: 0] seconds have elapsed.
 .TP
-.B \-\-delim=\f[I]delim\f[]
+\-\-delim=\f[I]delim\f[R]
 chr, optional.
-Delimiting character [default: \[aq]\\n\[aq]].
-Use \[aq]\\0\[aq] for null.
-N.B.: on Windows systems, Python converts \[aq]\\n\[aq] to
-\[aq]\\r\\n\[aq].
-.RS
-.RE
+Delimiting character [default: `\(rsn'].
+Use `\(rs0' for null.
+N.B.: on Windows systems, Python converts `\(rsn' to `\(rsr\(rsn'.
 .TP
-.B \-\-buf\-size=\f[I]buf_size\f[]
+\-\-buf\-size=\f[I]buf_size\f[R]
 int, optional.
-String buffer size in bytes [default: 256] used when \f[C]delim\f[] is
+String buffer size in bytes [default: 256] used when \f[CR]delim\f[R] is
 specified.
-.RS
-.RE
 .TP
-.B \-\-bytes
+\-\-bytes
 bool, optional.
-If true, will count bytes, ignore \f[C]delim\f[], and default
-\f[C]unit_scale\f[] to True, \f[C]unit_divisor\f[] to 1024, and
-\f[C]unit\f[] to \[aq]B\[aq].
-.RS
-.RE
+If true, will count bytes, ignore \f[CR]delim\f[R], and default
+\f[CR]unit_scale\f[R] to True, \f[CR]unit_divisor\f[R] to 1024, and
+\f[CR]unit\f[R] to `B'.
 .TP
-.B \-\-tee
+\-\-tee
 bool, optional.
-If true, passes \f[C]stdin\f[] to both \f[C]stderr\f[] and
-\f[C]stdout\f[].
-.RS
-.RE
+If true, passes \f[CR]stdin\f[R] to both \f[CR]stderr\f[R] and
+\f[CR]stdout\f[R].
 .TP
-.B \-\-update
+\-\-update
 bool, optional.
-If true, will treat input as newly elapsed iterations, i.e.
-numbers to pass to \f[C]update()\f[].
-Note that this is slow (~2e5 it/s) since every input must be decoded as
-a number.
-.RS
-.RE
+If true, will treat input as newly elapsed iterations, i.e.\ numbers to
+pass to \f[CR]update()\f[R].
+Note that this is slow (\(ti2e5 it/s) since every input must be decoded
+as a number.
 .TP
-.B \-\-update\-to
+\-\-update\-to
 bool, optional.
-If true, will treat input as total elapsed iterations, i.e.
-numbers to assign to \f[C]self.n\f[].
-Note that this is slow (~2e5 it/s) since every input must be decoded as
-a number.
-.RS
-.RE
+If true, will treat input as total elapsed iterations, i.e.\ numbers to
+assign to \f[CR]self.n\f[R].
+Note that this is slow (\(ti2e5 it/s) since every input must be decoded
+as a number.
 .TP
-.B \-\-null
+\-\-null
 bool, optional.
 If true, will discard input (no stdout).
-.RS
-.RE
 .TP
-.B \-\-manpath=\f[I]manpath\f[]
+\-\-manpath=\f[I]manpath\f[R]
 str, optional.
 Directory in which to install tqdm man pages.
-.RS
-.RE
 .TP
-.B \-\-comppath=\f[I]comppath\f[]
+\-\-comppath=\f[I]comppath\f[R]
 str, optional.
 Directory in which to place tqdm completion.
-.RS
-.RE
 .TP
-.B \-\-log=\f[I]log\f[]
+\-\-log=\f[I]log\f[R]
 str, optional.
-CRITICAL|FATAL|ERROR|WARN(ING)|[default: \[aq]INFO\[aq]]|DEBUG|NOTSET.
-.RS
-.RE
+CRITICAL|FATAL|ERROR|WARN(ING)|[default: `INFO']|DEBUG|NOTSET.
 .SH AUTHORS
-tqdm developers <https://github.com/tqdm>.
+tqdm developers \c
+.UR https://github.com/tqdm
+.UE \c.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/tqdm-4.67.1/tqdm/utils.py 
new/tqdm-4.67.3/tqdm/utils.py
--- old/tqdm-4.67.1/tqdm/utils.py       2024-11-24 21:11:41.000000000 +0100
+++ new/tqdm-4.67.3/tqdm/utils.py       2026-02-03 18:34:16.000000000 +0100
@@ -99,7 +99,7 @@
     return wrap
 
 
-class FormatReplace(object):
+class FormatReplace:
     """
     >>> a = FormatReplace('something')
     >>> f"{a:5d}"
@@ -114,7 +114,7 @@
         return self.replace
 
 
-class Comparable(object):
+class Comparable:
     """Assumes child has self._comparable attr/@property"""
     def __lt__(self, other):
         return self._comparable < other._comparable
@@ -135,7 +135,7 @@
         return not self < other
 
 
-class ObjectWrapper(object):
+class ObjectWrapper:
     def __getattr__(self, name):
         return getattr(self._wrapped, name)
 
@@ -210,7 +210,7 @@
                     pass
         return inner
 
-    def __init__(self, wrapped, tqdm_instance):
+    def __init__(self, wrapped, tqdm_instance):  # noqa: B042
         super().__init__(wrapped)
         if hasattr(wrapped, 'write'):
             self.wrapper_setattr(
@@ -251,7 +251,7 @@
 
 def _is_utf(encoding):
     try:
-        u'\u2588\u2589'.encode(encoding)
+        '\u2588\u2589'.encode(encoding)
     except UnicodeEncodeError:
         return False
     except Exception:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/tqdm-4.67.1/tqdm/version.py 
new/tqdm-4.67.3/tqdm/version.py
--- old/tqdm-4.67.1/tqdm/version.py     2024-11-24 21:11:41.000000000 +0100
+++ new/tqdm-4.67.3/tqdm/version.py     2026-02-03 18:34:16.000000000 +0100
@@ -1,9 +1,10 @@
 """`tqdm` version detector. Precedence: installed dist, git, 'UNKNOWN'."""
 try:
-    from ._dist_ver import __version__
-except ImportError:
-    try:
-        from setuptools_scm import get_version
-        __version__ = get_version(root='..', relative_to=__file__)
-    except (ImportError, LookupError):
-        __version__ = "UNKNOWN"
+    from importlib.metadata import PackageNotFoundError, version
+except ImportError:  # py<3.8
+    from importlib_metadata import PackageNotFoundError, version
+
+try:
+    __version__ = version('tqdm')
+except PackageNotFoundError:
+    __version__ = "UNKNOWN"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/tqdm-4.67.1/tqdm.egg-info/PKG-INFO 
new/tqdm-4.67.3/tqdm.egg-info/PKG-INFO
--- old/tqdm-4.67.1/tqdm.egg-info/PKG-INFO      2024-11-24 21:12:11.000000000 
+0100
+++ new/tqdm-4.67.3/tqdm.egg-info/PKG-INFO      2026-02-03 18:35:32.000000000 
+0100
@@ -1,6 +1,6 @@
-Metadata-Version: 2.1
+Metadata-Version: 2.4
 Name: tqdm
-Version: 4.67.1
+Version: 4.67.3
 Summary: Fast, Extensible Progress Meter
 Maintainer-email: tqdm developers <[email protected]>
 License: MPL-2.0 AND MIT
@@ -22,8 +22,6 @@
 Classifier: Intended Audience :: End Users/Desktop
 Classifier: Intended Audience :: Other Audience
 Classifier: Intended Audience :: System Administrators
-Classifier: License :: OSI Approved :: MIT License
-Classifier: License :: OSI Approved :: Mozilla Public License 2.0 (MPL 2.0)
 Classifier: Operating System :: MacOS
 Classifier: Operating System :: MacOS :: MacOS X
 Classifier: Operating System :: Microsoft
@@ -43,6 +41,7 @@
 Classifier: Programming Language :: Python :: 3.10
 Classifier: Programming Language :: Python :: 3.11
 Classifier: Programming Language :: Python :: 3.12
+Classifier: Programming Language :: Python :: 3.13
 Classifier: Programming Language :: Python :: 3 :: Only
 Classifier: Programming Language :: Python :: Implementation
 Classifier: Programming Language :: Python :: Implementation :: IronPython
@@ -68,6 +67,7 @@
 Description-Content-Type: text/x-rst
 License-File: LICENCE
 Requires-Dist: colorama; platform_system == "Windows"
+Requires-Dist: importlib_metadata; python_version < "3.8"
 Provides-Extra: dev
 Requires-Dist: pytest>=6; extra == "dev"
 Requires-Dist: pytest-cov; extra == "dev"
@@ -82,6 +82,7 @@
 Requires-Dist: requests; extra == "telegram"
 Provides-Extra: notebook
 Requires-Dist: ipywidgets>=6; extra == "notebook"
+Dynamic: license-file
 
 |Logo|
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/tqdm-4.67.1/tqdm.egg-info/SOURCES.txt 
new/tqdm-4.67.3/tqdm.egg-info/SOURCES.txt
--- old/tqdm-4.67.1/tqdm.egg-info/SOURCES.txt   2024-11-24 21:12:11.000000000 
+0100
+++ new/tqdm-4.67.3/tqdm.egg-info/SOURCES.txt   2026-02-03 18:35:32.000000000 
+0100
@@ -46,7 +46,6 @@
 tests/tests_version.py
 tqdm/__init__.py
 tqdm/__main__.py
-tqdm/_dist_ver.py
 tqdm/_main.py
 tqdm/_monitor.py
 tqdm/_tqdm.py
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/tqdm-4.67.1/tqdm.egg-info/requires.txt 
new/tqdm-4.67.3/tqdm.egg-info/requires.txt
--- old/tqdm-4.67.1/tqdm.egg-info/requires.txt  2024-11-24 21:12:11.000000000 
+0100
+++ new/tqdm-4.67.3/tqdm.egg-info/requires.txt  2026-02-03 18:35:32.000000000 
+0100
@@ -2,6 +2,9 @@
 [:platform_system == "Windows"]
 colorama
 
+[:python_version < "3.8"]
+importlib_metadata
+
 [dev]
 pytest>=6
 pytest-cov

Reply via email to