Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package python-importlib-metadata for 
openSUSE:Factory checked in at 2026-09-10 11:46:49
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-importlib-metadata (Old)
 and      /work/SRC/openSUSE:Factory/.python-importlib-metadata.new.1265 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "python-importlib-metadata"

Thu Sep 10 11:46:49 2026 rev:32 rq:1376501 version:9.0.1

Changes:
--------
--- 
/work/SRC/openSUSE:Factory/python-importlib-metadata/python-importlib-metadata.changes
      2026-03-24 18:48:05.780564781 +0100
+++ 
/work/SRC/openSUSE:Factory/.python-importlib-metadata.new.1265/python-importlib-metadata.changes
    2026-09-10 11:47:07.752848609 +0200
@@ -1,0 +2,9 @@
+Tue Sep  1 21:07:22 UTC 2026 - Dirk Müller <[email protected]>
+
+- update to 9.0.1:
+  * Marked the other parameter of SimplePath.joinpath and
+    SimplePath.__truediv__ positional-only, so pathlib.Path
+    satisfies the protocol under type checkers that compare
+    parameter names.
+
+-------------------------------------------------------------------

Old:
----
  importlib_metadata-9.0.0.tar.gz

New:
----
  importlib_metadata-9.0.1.tar.gz

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

Other differences:
------------------
++++++ python-importlib-metadata.spec ++++++
--- /var/tmp/diff_new_pack.y8s6oj/_old  2026-09-10 11:47:08.927897870 +0200
+++ /var/tmp/diff_new_pack.y8s6oj/_new  2026-09-10 11:47:08.929897953 +0200
@@ -26,7 +26,7 @@
 %endif
 %{?sle15_python_module_pythons}
 Name:           python-importlib-metadata%{psuffix}
-Version:        9.0.0
+Version:        9.0.1
 Release:        0
 Summary:        Read metadata from Python packages
 License:        Apache-2.0

++++++ importlib_metadata-9.0.0.tar.gz -> importlib_metadata-9.0.1.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/importlib_metadata-9.0.0/.github/workflows/main.yml 
new/importlib_metadata-9.0.1/.github/workflows/main.yml
--- old/importlib_metadata-9.0.0/.github/workflows/main.yml     2026-03-20 
07:42:33.000000000 +0100
+++ new/importlib_metadata-9.0.1/.github/workflows/main.yml     2026-08-28 
17:30:07.798459800 +0200
@@ -15,19 +15,6 @@
 permissions:
   contents: read
 
-env:
-  # Environment variable to support color support (jaraco/skeleton#66)
-  FORCE_COLOR: 1
-
-  # Suppress noisy pip warnings
-  PIP_DISABLE_PIP_VERSION_CHECK: 'true'
-  PIP_NO_WARN_SCRIPT_LOCATION: 'true'
-
-  # Ensure tests can sense settings about the environment
-  TOX_OVERRIDE: >-
-    testenv.pass_env+=GITHUB_*,FORCE_COLOR
-
-
 jobs:
   test:
     strategy:
@@ -35,7 +22,8 @@
       matrix:
         python:
         - "3.10"
-        - "3.13"
+        - "3.14"
+        - "3.14t"
         platform:
         - ubuntu-latest
         - macos-latest
@@ -45,32 +33,16 @@
           platform: ubuntu-latest
         - python: "3.12"
           platform: ubuntu-latest
-        - python: "3.14"
+        - python: "3.13"
           platform: ubuntu-latest
         - python: "3.15"
           platform: ubuntu-latest
-        - python: pypy3.10
+        - python: pypy3.11
           platform: ubuntu-latest
-    runs-on: ${{ matrix.platform }}
-    continue-on-error: ${{ matrix.python == '3.15' }}
-    steps:
-      - uses: actions/checkout@v4
-      - name: Install build dependencies
-        # Install dependencies for building packages on pre-release Pythons
-        # jaraco/skeleton#161
-        if: matrix.python == '3.15' && matrix.platform == 'ubuntu-latest'
-        run: |
-          sudo apt update
-          sudo apt install -y libxml2-dev libxslt-dev
-      - name: Setup Python
-        uses: actions/setup-python@v5
-        with:
-          python-version: ${{ matrix.python }}
-          allow-prereleases: true
-      - name: Install tox
-        run: python -m pip install tox
-      - name: Run
-        run: tox
+    uses: ./.github/workflows/test-suite.yml
+    with:
+      python: ${{ matrix.python }}
+      platform: ${{ matrix.platform }}
 
   collateral:
     strategy:
@@ -79,19 +51,10 @@
         job:
         - diffcov
         - docs
-    runs-on: ubuntu-latest
-    steps:
-      - uses: actions/checkout@v4
-        with:
-          fetch-depth: 0
-      - name: Setup Python
-        uses: actions/setup-python@v5
-        with:
-          python-version: 3.x
-      - name: Install tox
-        run: python -m pip install tox
-      - name: Eval ${{ matrix.job }}
-        run: tox -e ${{ matrix.job }}
+    uses: ./.github/workflows/test-suite.yml
+    with:
+      platform: ubuntu-latest
+      tox-env: ${{ matrix.job }}
 
   check:  # This job does nothing and is only used for the branch protection
     if: always()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/importlib_metadata-9.0.0/.github/workflows/test-suite.yml 
new/importlib_metadata-9.0.1/.github/workflows/test-suite.yml
--- old/importlib_metadata-9.0.0/.github/workflows/test-suite.yml       
1970-01-01 01:00:00.000000000 +0100
+++ new/importlib_metadata-9.0.1/.github/workflows/test-suite.yml       
2026-08-28 17:30:07.798538400 +0200
@@ -0,0 +1,62 @@
+name: Test Suite
+
+on:
+  workflow_call:
+    inputs:
+      python:
+        description: Python version
+        type: string
+        default: "3.x"
+      platform:
+        description: Runner platform
+        type: string
+        default: ubuntu-latest
+      tox-env:
+        description: >-
+          Tox environment to run; if empty, runs default tox
+        type: string
+        default: ""
+
+env:
+  # Environment variable to support color support (jaraco/skeleton#66)
+  FORCE_COLOR: 1
+
+  # Suppress noisy pip warnings
+  PIP_DISABLE_PIP_VERSION_CHECK: 'true'
+  PIP_NO_WARN_SCRIPT_LOCATION: 'true'
+
+  # Ensure tests can sense settings about the environment
+  TOX_OVERRIDE: >-
+    testenv.pass_env+=GITHUB_*,FORCE_COLOR
+
+jobs:
+  run:
+    runs-on: ${{ inputs.platform }}
+    # Tolerate failures on pre-release Pythons (jaraco/skeleton#199)
+    continue-on-error: ${{ inputs.python == '3.15' }}
+    permissions:
+      contents: read
+    steps:
+      - uses: actions/checkout@v4
+        with:
+          fetch-depth: 0
+      - name: Install build dependencies
+        # Install dependencies for building packages on pre-release Pythons
+        # jaraco/skeleton#161
+        if: inputs.python == '3.15' && inputs.platform == 'ubuntu-latest'
+        run: |
+          sudo apt update
+          sudo apt install -y libxml2-dev libxslt-dev
+      - name: Setup Python
+        uses: actions/setup-python@v5
+        with:
+          python-version: ${{ inputs.python }}
+          allow-prereleases: true
+      - name: Install tox
+        run: python -m pip install tox
+      - name: Run
+        if: ${{ !inputs.tox-env }}
+        run: tox
+      - name: Run ${{ inputs.tox-env }}
+        if: ${{ inputs.tox-env }}
+        run: tox -e ${{ inputs.tox-env }}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/importlib_metadata-9.0.0/AGENTS.md 
new/importlib_metadata-9.0.1/AGENTS.md
--- old/importlib_metadata-9.0.0/AGENTS.md      1970-01-01 01:00:00.000000000 
+0100
+++ new/importlib_metadata-9.0.1/AGENTS.md      2026-08-28 17:30:07.798538400 
+0200
@@ -0,0 +1 @@
+**Required first step:** Before reading further or making any changes, fetch 
and read the [skeleton](https://blog.jaraco.com/skeleton/) document in its 
entirety. It is the authoritative source of truth for this project's structure, 
conventions, testing, and release process, and is not duplicated here. Do not 
act until you have ingested it.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/importlib_metadata-9.0.0/NEWS.rst 
new/importlib_metadata-9.0.1/NEWS.rst
--- old/importlib_metadata-9.0.0/NEWS.rst       2026-03-20 07:42:33.000000000 
+0100
+++ new/importlib_metadata-9.0.1/NEWS.rst       2026-08-28 17:30:07.798819500 
+0200
@@ -1,3 +1,12 @@
+v9.0.1
+======
+
+Bugfixes
+--------
+
+- Marked the ``other`` parameter of ``SimplePath.joinpath`` and 
``SimplePath.__truediv__`` positional-only, so ``pathlib.Path`` satisfies the 
protocol under type checkers that compare parameter names. (#542)
+
+
 v9.0.0
 ======
 
@@ -6,6 +15,14 @@
 
 - Added ``MetadataNotFound`` (subclass of ``FileNotFoundError``) and updated 
``Distribution.metadata``/``metadata()`` to raise it when the metadata files 
are missing instead of returning ``None`` (python/cpython#143387). (#532)
 
+v8.9.0
+======
+
+Features
+--------
+
+- Ported changes from CPython (python/cpython#110937, python/cpython#140141, 
python/cpython#143658)
+
 
 v8.8.0
 ======
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/importlib_metadata-9.0.0/PKG-INFO 
new/importlib_metadata-9.0.1/PKG-INFO
--- old/importlib_metadata-9.0.0/PKG-INFO       2026-03-20 07:42:51.991946700 
+0100
+++ new/importlib_metadata-9.0.1/PKG-INFO       2026-08-28 17:30:30.357092400 
+0200
@@ -1,6 +1,6 @@
 Metadata-Version: 2.4
 Name: importlib_metadata
-Version: 9.0.0
+Version: 9.0.1
 Summary: Read metadata from Python packages
 Author-email: "Jason R. Coombs" <[email protected]>
 License-Expression: Apache-2.0
@@ -17,7 +17,7 @@
 Requires-Dist: pytest!=8.1.*,>=6; extra == "test"
 Requires-Dist: packaging; extra == "test"
 Requires-Dist: pyfakefs; extra == "test"
-Requires-Dist: pytest-perf>=0.9.2; extra == "test"
+Requires-Dist: pytest-perf>=0.17; extra == "test"
 Provides-Extra: doc
 Requires-Dist: sphinx>=3.5; extra == "doc"
 Requires-Dist: jaraco.packaging>=9.3; extra == "doc"
@@ -54,7 +54,7 @@
 .. image:: 
https://readthedocs.org/projects/importlib-metadata/badge/?version=latest
    :target: https://importlib-metadata.readthedocs.io/en/latest/?badge=latest
 
-.. image:: https://img.shields.io/badge/skeleton-2025-informational
+.. image:: https://img.shields.io/badge/skeleton-2026-informational
    :target: https://blog.jaraco.com/skeleton
 
 .. image:: https://tidelift.com/badges/package/pypi/importlib-metadata
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/importlib_metadata-9.0.0/README.rst 
new/importlib_metadata-9.0.1/README.rst
--- old/importlib_metadata-9.0.0/README.rst     2026-03-20 07:42:33.000000000 
+0100
+++ new/importlib_metadata-9.0.1/README.rst     2026-08-28 17:30:07.798819500 
+0200
@@ -14,7 +14,7 @@
 .. image:: 
https://readthedocs.org/projects/importlib-metadata/badge/?version=latest
    :target: https://importlib-metadata.readthedocs.io/en/latest/?badge=latest
 
-.. image:: https://img.shields.io/badge/skeleton-2025-informational
+.. image:: https://img.shields.io/badge/skeleton-2026-informational
    :target: https://blog.jaraco.com/skeleton
 
 .. image:: https://tidelift.com/badges/package/pypi/importlib-metadata
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/importlib_metadata-9.0.0/docs/conf.py 
new/importlib_metadata-9.0.1/docs/conf.py
--- old/importlib_metadata-9.0.0/docs/conf.py   2026-03-20 07:42:33.000000000 
+0100
+++ new/importlib_metadata-9.0.1/docs/conf.py   2026-08-28 17:30:07.799237700 
+0200
@@ -82,6 +82,7 @@
 nitpick_ignore += [
     # Workaround for #316
     ('py:class', 'importlib_metadata.EntryPoints'),
+    ('py:class', 'importlib_metadata.FileHash'),
     ('py:class', 'importlib_metadata.PackagePath'),
     ('py:class', 'importlib_metadata.SelectableGroups'),
     ('py:class', 'importlib_metadata._meta._T'),
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/importlib_metadata-9.0.0/exercises.py 
new/importlib_metadata-9.0.1/exercises.py
--- old/importlib_metadata-9.0.0/exercises.py   2026-03-20 07:42:33.000000000 
+0100
+++ new/importlib_metadata-9.0.1/exercises.py   2026-08-28 17:30:07.799237700 
+0200
@@ -45,3 +45,15 @@
     input = '0' + ' ' * 2**10 + '0'  # end warmup
 
     re.match(importlib_metadata.EntryPoint.pattern, input)
+
+
+def normalize_perf():
+    # python/cpython#143658
+    import importlib_metadata  # end warmup
+
+    importlib_metadata.Prepared.normalize('sample')
+
+
+def import_time():
+    "import"
+    import importlib_metadata  # noqa: F401
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/importlib_metadata-9.0.0/importlib_metadata/__init__.py 
new/importlib_metadata-9.0.1/importlib_metadata/__init__.py
--- old/importlib_metadata-9.0.0/importlib_metadata/__init__.py 2026-03-20 
07:42:33.000000000 +0100
+++ new/importlib_metadata-9.0.1/importlib_metadata/__init__.py 2026-08-28 
17:30:07.799237700 +0200
@@ -44,9 +44,10 @@
 __all__ = [
     'Distribution',
     'DistributionFinder',
+    'MetadataNotFound',
     'PackageMetadata',
     'PackageNotFoundError',
-    'MetadataNotFound',
+    'PackagePath',
     'SimplePath',
     'distribution',
     'distributions',
@@ -216,7 +217,8 @@
 
     def __init__(self, name: str, value: str, group: str) -> None:
         vars(self).update(name=name, value=value, group=group)
-        self.module
+        # resolve the value now, raising ValueError if it's invalid
+        _ = self.module
 
     def load(self) -> Any:
         """Load the entry point from its definition. If only a module
@@ -338,7 +340,7 @@
         Repr with classname and tuple constructor to
         signal that we deviate from regular tuple behavior.
         """
-        return '%s(%r)' % (self.__class__.__name__, tuple(self))
+        return f'{self.__class__.__name__}({tuple(self)!r})'
 
     def select(self, **params) -> EntryPoints:
         """
@@ -467,7 +469,7 @@
         try:
             return next(iter(cls._prefer_valid(cls.discover(name=name))))
         except StopIteration:
-            raise PackageNotFoundError(name)
+            raise PackageNotFoundError(name) from None
 
     @classmethod
     def discover(
@@ -710,7 +712,7 @@
 
         def quoted_marker(section):
             section = section or ''
-            extra, sep, markers = section.partition(':')
+            extra, _sep, markers = section.partition(':')
             if extra and markers:
                 markers = f'({markers})'
             conditions = list(filter(None, [markers, make_condition(extra)]))
@@ -835,7 +837,7 @@
     """
 
     @_clear_after_fork  # type: ignore[misc]
-    @functools.lru_cache()
+    @functools.lru_cache
     def __new__(cls, root):
         return super().__new__(cls)
 
@@ -961,8 +963,15 @@
     def normalize(name):
         """
         PEP 503 normalization plus dashes as underscores.
+
+        Specifically avoids ``re.sub`` as prescribed for performance
+        benefits (see python/cpython#143658).
         """
-        return re.sub(r"[-_.]+", "-", name).lower().replace('-', '_')
+        value = name.lower().replace("-", "_").replace(".", "_")
+        # Condense repeats
+        while "__" in value:
+            value = value.replace("__", "_")
+        return value
 
     @staticmethod
     def legacy_normalize(name):
@@ -1063,7 +1072,7 @@
         filename, ext = os.path.splitext(stem)
         if ext not in ('.dist-info', '.egg-info'):
             return
-        name, sep, rest = filename.partition('-')
+        name, _sep, _rest = filename.partition('-')
         return name
 
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/importlib_metadata-9.0.0/importlib_metadata/_adapters.py 
new/importlib_metadata-9.0.1/importlib_metadata/_adapters.py
--- old/importlib_metadata-9.0.0/importlib_metadata/_adapters.py        
2026-03-20 07:42:33.000000000 +0100
+++ new/importlib_metadata-9.0.1/importlib_metadata/_adapters.py        
2026-08-28 17:30:07.799793700 +0200
@@ -54,7 +54,7 @@
     <BLANKLINE>
     """
 
-    multiple_use_keys = set(
+    multiple_use_keys = frozenset(
         map(
             FoldedCase,
             [
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/importlib_metadata-9.0.0/importlib_metadata/_compat.py 
new/importlib_metadata-9.0.1/importlib_metadata/_compat.py
--- old/importlib_metadata-9.0.0/importlib_metadata/_compat.py  2026-03-20 
07:42:33.000000000 +0100
+++ new/importlib_metadata-9.0.1/importlib_metadata/_compat.py  2026-08-28 
17:30:07.799819700 +0200
@@ -1,7 +1,7 @@
 import platform
 import sys
 
-__all__ = ['install', 'NullFinder']
+__all__ = ['NullFinder', 'install']
 
 
 def install(cls):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/importlib_metadata-9.0.0/importlib_metadata/_meta.py 
new/importlib_metadata-9.0.1/importlib_metadata/_meta.py
--- old/importlib_metadata-9.0.0/importlib_metadata/_meta.py    2026-03-20 
07:42:33.000000000 +0100
+++ new/importlib_metadata-9.0.1/importlib_metadata/_meta.py    2026-08-28 
17:30:07.799819700 +0200
@@ -54,11 +54,11 @@
     """
 
     def joinpath(
-        self, other: str | os.PathLike[str]
+        self, other: str | os.PathLike[str], /
     ) -> SimplePath: ...  # pragma: no cover
 
     def __truediv__(
-        self, other: str | os.PathLike[str]
+        self, other: str | os.PathLike[str], /
     ) -> SimplePath: ...  # pragma: no cover
 
     @property
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/importlib_metadata-9.0.0/importlib_metadata/_text.py 
new/importlib_metadata-9.0.1/importlib_metadata/_text.py
--- old/importlib_metadata-9.0.0/importlib_metadata/_text.py    2026-03-20 
07:42:33.000000000 +0100
+++ new/importlib_metadata-9.0.1/importlib_metadata/_text.py    2026-08-28 
17:30:07.799819700 +0200
@@ -95,5 +95,5 @@
         return self.lower().index(sub.lower())
 
     def split(self, splitter=' ', maxsplit=0):
-        pattern = re.compile(re.escape(splitter), re.I)
+        pattern = re.compile(re.escape(splitter), re.IGNORECASE)
         return pattern.split(self, maxsplit)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/importlib_metadata-9.0.0/importlib_metadata.egg-info/PKG-INFO 
new/importlib_metadata-9.0.1/importlib_metadata.egg-info/PKG-INFO
--- old/importlib_metadata-9.0.0/importlib_metadata.egg-info/PKG-INFO   
2026-03-20 07:42:51.000000000 +0100
+++ new/importlib_metadata-9.0.1/importlib_metadata.egg-info/PKG-INFO   
2026-08-28 17:30:30.321092100 +0200
@@ -1,6 +1,6 @@
 Metadata-Version: 2.4
 Name: importlib_metadata
-Version: 9.0.0
+Version: 9.0.1
 Summary: Read metadata from Python packages
 Author-email: "Jason R. Coombs" <[email protected]>
 License-Expression: Apache-2.0
@@ -17,7 +17,7 @@
 Requires-Dist: pytest!=8.1.*,>=6; extra == "test"
 Requires-Dist: packaging; extra == "test"
 Requires-Dist: pyfakefs; extra == "test"
-Requires-Dist: pytest-perf>=0.9.2; extra == "test"
+Requires-Dist: pytest-perf>=0.17; extra == "test"
 Provides-Extra: doc
 Requires-Dist: sphinx>=3.5; extra == "doc"
 Requires-Dist: jaraco.packaging>=9.3; extra == "doc"
@@ -54,7 +54,7 @@
 .. image:: 
https://readthedocs.org/projects/importlib-metadata/badge/?version=latest
    :target: https://importlib-metadata.readthedocs.io/en/latest/?badge=latest
 
-.. image:: https://img.shields.io/badge/skeleton-2025-informational
+.. image:: https://img.shields.io/badge/skeleton-2026-informational
    :target: https://blog.jaraco.com/skeleton
 
 .. image:: https://tidelift.com/badges/package/pypi/importlib-metadata
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/importlib_metadata-9.0.0/importlib_metadata.egg-info/SOURCES.txt 
new/importlib_metadata-9.0.1/importlib_metadata.egg-info/SOURCES.txt
--- old/importlib_metadata-9.0.0/importlib_metadata.egg-info/SOURCES.txt        
2026-03-20 07:42:51.000000000 +0100
+++ new/importlib_metadata-9.0.1/importlib_metadata.egg-info/SOURCES.txt        
2026-08-28 17:30:30.336298000 +0200
@@ -3,6 +3,7 @@
 .gitignore
 .pre-commit-config.yaml
 .readthedocs.yaml
+AGENTS.md
 LICENSE
 NEWS.rst
 README.rst
@@ -17,6 +18,7 @@
 tox.ini
 .github/FUNDING.yml
 .github/workflows/main.yml
+.github/workflows/test-suite.yml
 docs/__init__.py
 docs/api.rst
 docs/conf.py
@@ -38,6 +40,8 @@
 importlib_metadata.egg-info/SOURCES.txt
 importlib_metadata.egg-info/dependency_links.txt
 importlib_metadata.egg-info/requires.txt
+importlib_metadata.egg-info/scm_file_list.json
+importlib_metadata.egg-info/scm_version.json
 importlib_metadata.egg-info/top_level.txt
 importlib_metadata/compat/__init__.py
 importlib_metadata/compat/py311.py
@@ -51,6 +55,7 @@
 tests/test_zip.py
 tests/compat/__init__.py
 tests/compat/py312.py
+tests/compat/py314.py
 tests/data/__init__.py
 tests/data/example-21.12-py3-none-any.whl
 tests/data/example-21.12-py3.6.egg
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/importlib_metadata-9.0.0/importlib_metadata.egg-info/requires.txt 
new/importlib_metadata-9.0.1/importlib_metadata.egg-info/requires.txt
--- old/importlib_metadata-9.0.0/importlib_metadata.egg-info/requires.txt       
2026-03-20 07:42:51.000000000 +0100
+++ new/importlib_metadata-9.0.1/importlib_metadata.egg-info/requires.txt       
2026-08-28 17:30:30.324384700 +0200
@@ -27,7 +27,7 @@
 pytest!=8.1.*,>=6
 packaging
 pyfakefs
-pytest-perf>=0.9.2
+pytest-perf>=0.17
 
 [type]
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/importlib_metadata-9.0.0/importlib_metadata.egg-info/scm_file_list.json 
new/importlib_metadata-9.0.1/importlib_metadata.egg-info/scm_file_list.json
--- old/importlib_metadata-9.0.0/importlib_metadata.egg-info/scm_file_list.json 
1970-01-01 01:00:00.000000000 +0100
+++ new/importlib_metadata-9.0.1/importlib_metadata.egg-info/scm_file_list.json 
2026-08-28 17:30:30.319303300 +0200
@@ -0,0 +1,62 @@
+{
+  "files": [
+    ".coveragerc",
+    ".editorconfig",
+    ".github/FUNDING.yml",
+    ".github/workflows/main.yml",
+    ".github/workflows/test-suite.yml",
+    ".gitignore",
+    ".pre-commit-config.yaml",
+    ".readthedocs.yaml",
+    "AGENTS.md",
+    "NEWS.rst",
+    "README.rst",
+    "SECURITY.md",
+    "conftest.py",
+    "docs/__init__.py",
+    "docs/api.rst",
+    "docs/conf.py",
+    "docs/history.rst",
+    "docs/index.rst",
+    "docs/migration.rst",
+    "exercises.py",
+    "importlib_metadata/__init__.py",
+    "importlib_metadata/_adapters.py",
+    "importlib_metadata/_collections.py",
+    "importlib_metadata/_compat.py",
+    "importlib_metadata/_context.py",
+    "importlib_metadata/_functools.py",
+    "importlib_metadata/_itertools.py",
+    "importlib_metadata/_meta.py",
+    "importlib_metadata/_text.py",
+    "importlib_metadata/compat/__init__.py",
+    "importlib_metadata/compat/py311.py",
+    "importlib_metadata/diagnose.py",
+    "importlib_metadata/py.typed",
+    "mypy.ini",
+    "pyproject.toml",
+    "pytest.ini",
+    "ruff.toml",
+    "tests/__init__.py",
+    "tests/_context.py",
+    "tests/_path.py",
+    "tests/compat/__init__.py",
+    "tests/compat/py312.py",
+    "tests/compat/py314.py",
+    "tests/data/__init__.py",
+    "tests/data/example-21.12-py3-none-any.whl",
+    "tests/data/example-21.12-py3.6.egg",
+    "tests/data/example2-1.0.0-py3-none-any.whl",
+    "tests/data/sources/example/example/__init__.py",
+    "tests/data/sources/example/setup.py",
+    "tests/data/sources/example2/example2/__init__.py",
+    "tests/data/sources/example2/pyproject.toml",
+    "tests/fixtures.py",
+    "tests/test_api.py",
+    "tests/test_integration.py",
+    "tests/test_main.py",
+    "tests/test_zip.py",
+    "towncrier.toml",
+    "tox.ini"
+  ]
+}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/importlib_metadata-9.0.0/importlib_metadata.egg-info/scm_version.json 
new/importlib_metadata-9.0.1/importlib_metadata.egg-info/scm_version.json
--- old/importlib_metadata-9.0.0/importlib_metadata.egg-info/scm_version.json   
1970-01-01 01:00:00.000000000 +0100
+++ new/importlib_metadata-9.0.1/importlib_metadata.egg-info/scm_version.json   
2026-08-28 17:30:30.311318900 +0200
@@ -0,0 +1,8 @@
+{
+  "tag": "9.0.1",
+  "distance": 0,
+  "node": "gc5acd62aee92667de3d245a786cce14718cfe786",
+  "dirty": false,
+  "branch": "HEAD",
+  "node_date": "2026-08-28"
+}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/importlib_metadata-9.0.0/pyproject.toml 
new/importlib_metadata-9.0.1/pyproject.toml
--- old/importlib_metadata-9.0.0/pyproject.toml 2026-03-20 07:42:33.000000000 
+0100
+++ new/importlib_metadata-9.0.1/pyproject.toml 2026-08-28 17:30:07.800453200 
+0200
@@ -38,7 +38,7 @@
        # local
        "packaging",
        "pyfakefs",
-       "pytest-perf >= 0.9.2",
+       "pytest-perf >= 0.17",
 ]
 
 doc = [
@@ -72,7 +72,7 @@
 type = [
        # upstream
        
-    # Exclude PyPy from type checks (python/mypy#20454 jaraco/skeleton#187)
+       # Exclude PyPy from type checks (python/mypy#20454 jaraco/skeleton#187)
        "pytest-mypy >= 1.0.1; platform_python_implementation != 'PyPy'",
 
        # local
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/importlib_metadata-9.0.0/ruff.toml 
new/importlib_metadata-9.0.1/ruff.toml
--- old/importlib_metadata-9.0.0/ruff.toml      2026-03-20 07:42:33.000000000 
+0100
+++ new/importlib_metadata-9.0.1/ruff.toml      2026-08-28 17:30:07.800453200 
+0200
@@ -5,44 +5,48 @@
        "C901", # complex-structure
        "I", # isort
        "PERF401", # manual-list-comprehension
+       "UP", # pyupgrade (Code modernization for strings, annotations, 
conditions, ...)
 
        # Ensure modern type annotation syntax and best practices
        # Not including those covered by type-checkers or exclusive to Python 
3.11+
        "FA", # flake8-future-annotations
        "F404", # late-future-import
        "PYI", # flake8-pyi
-       "UP006", # non-pep585-annotation
-       "UP007", # non-pep604-annotation
-       "UP010", # unnecessary-future-import
-       "UP035", # deprecated-import
-       "UP037", # quoted-annotation
-       "UP043", # unnecessary-default-type-args
 
        # local
 ]
 ignore = [
        # upstream
+       "UP015", # redundant-open-modes, explicit is preferred
 
        # Typeshed rejects complex or non-literal defaults for maintenance and 
testing reasons,
        # irrelevant to this project.
        "PYI011", # typed-argument-default-in-stub
        # https://docs.astral.sh/ruff/formatter/#conflicting-lint-rules
        "W191",
-       "E111",
-       "E114",
-       "E117",
        "D206",
        "D300",
-       "Q000",
-       "Q001",
-       "Q002",
-       "Q003",
        "COM812",
        "COM819",
 
+       # N999 (invalid-module-name) yields false positives when a project's
+       # source directory is the distribution name and is redirected to a
+       # different import package (e.g. namespace layouts); the dotted 
directory
+       # name is itself a valid module. See
+       # https://github.com/astral-sh/ruff/issues/27801.
+       "N999",
+
+       # B008 is over-reaching; see jaraco/skeleton#214
+       "B008", # function-call-in-default-argument
+
        # local
 ]
 
+[lint.flake8-comprehensions]
+# Retain the elegant dict(a=1) keyword-call style; C408 still flags dict()
+# and dict([...]). See jaraco/skeleton#210.
+allow-dict-calls-with-keyword-arguments = true
+
 [format]
 # Enable preview to get hugged parenthesis unwrapping and other nice surprises
 # See https://github.com/jaraco/skeleton/pull/133#issuecomment-2239538373
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/importlib_metadata-9.0.0/tests/compat/py314.py 
new/importlib_metadata-9.0.1/tests/compat/py314.py
--- old/importlib_metadata-9.0.0/tests/compat/py314.py  1970-01-01 
01:00:00.000000000 +0100
+++ new/importlib_metadata-9.0.1/tests/compat/py314.py  2026-08-28 
17:30:07.801053500 +0200
@@ -0,0 +1,95 @@
+import contextlib
+import sys
+import types
+import warnings
+from collections.abc import Mapping
+
+from test.support import warnings_helper as orig
+
+if sys.version_info >= (3, 15):
+    from builtins import frozendict
+else:
+
+    class frozendict(Mapping):
+        """
+        Approximate frozendict, added to builtins in Python 3.15.
+
+        Accepts anything dict() accepts and presents it read-only.
+
+        >>> frozendict(a=1)['a']
+        1
+        >>> frozendict({'a': 1}) == {'a': 1}
+        True
+        >>> frozendict(a=1)
+        frozendict({'a': 1})
+
+        Hashable when the values are.
+
+        >>> hash(frozendict(a=1)) == hash(frozendict(a=1))
+        True
+
+        Unlike a mapping proxy, supports copying, so callers may take a
+        mutable snapshot to alter.
+
+        >>> import copy
+        >>> spec = frozendict(pkg={'META': 'lower'})
+        >>> altered = copy.deepcopy(spec)
+        >>> altered['pkg']['META'] = 'UPPER'
+        >>> spec['pkg']['META']
+        'lower'
+        """
+
+        def __init__(self, *args, **kwargs):
+            self._data = dict(*args, **kwargs)
+
+        def __getitem__(self, key):
+            return self._data[key]
+
+        def __iter__(self):
+            return iter(self._data)
+
+        def __len__(self):
+            return len(self._data)
+
+        def __hash__(self):
+            return hash(frozenset(self._data.items()))
+
+        def __repr__(self):
+            return f'{type(self).__name__}({self._data!r})'
+
+
[email protected]
+def ignore_warnings(*, category, message=''):
+    """Decorator to suppress warnings.
+
+    Can also be used as a context manager. This is not preferred,
+    because it makes diffs more noisy and tools like 'git blame' less useful.
+    But, it's useful for async functions.
+    """
+    with warnings.catch_warnings():
+        warnings.filterwarnings('ignore', category=category, message=message)
+        yield
+
+
[email protected]
+def ignore_fork_in_thread_deprecation_warnings():
+    """Suppress deprecation warnings related to forking in multi-threaded code.
+
+    See gh-135427
+
+    Can be used as decorator (preferred) or context manager.
+    """
+    with ignore_warnings(
+        message=".*fork.*may lead to deadlocks in the child.*",
+        category=DeprecationWarning,
+    ):
+        yield
+
+
+if sys.version_info >= (3, 15):
+    warnings_helper = orig
+else:
+    warnings_helper = types.SimpleNamespace(
+        
ignore_fork_in_thread_deprecation_warnings=ignore_fork_in_thread_deprecation_warnings,
+        **vars(orig),
+    )
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/importlib_metadata-9.0.0/tests/fixtures.py 
new/importlib_metadata-9.0.1/tests/fixtures.py
--- old/importlib_metadata-9.0.0/tests/fixtures.py      2026-03-20 
07:42:33.000000000 +0100
+++ new/importlib_metadata-9.0.1/tests/fixtures.py      2026-08-28 
17:30:07.801584000 +0200
@@ -13,6 +13,7 @@
 from . import _path
 from ._path import FilesSpec
 from .compat.py312 import import_helper
+from .compat.py314 import frozendict
 
 
 @contextlib.contextmanager
@@ -70,7 +71,7 @@
 
 
 class DistInfoPkg(OnSysPath, SiteBuilder):
-    files: FilesSpec = {
+    files: FilesSpec = frozendict({
         "distinfo_pkg-1.0.0.dist-info": {
             "METADATA": """
                 Name: distinfo-pkg
@@ -94,7 +95,7 @@
             def main():
                 print("hello world")
             """,
-    }
+    })
 
     def make_uppercase(self):
         """
@@ -113,7 +114,7 @@
     """
 
     some_hash = 
'524127ce937f7cb65665130c695abd18ca386f60bb29687efb976faa1596fdcc'
-    files: FilesSpec = {
+    files: FilesSpec = frozendict({
         'distinfo_pkg-1.0.0.dist-info': {
             'direct_url.json': json.dumps({
                 "archive_info": {
@@ -123,22 +124,22 @@
                 "url": 
"file:///path/to/distinfo_pkg-1.0.0.editable-py3-none-any.whl",
             })
         },
-    }
+    })
 
 
 class DistInfoPkgWithDot(OnSysPath, SiteBuilder):
-    files: FilesSpec = {
+    files: FilesSpec = frozendict({
         "pkg_dot-1.0.0.dist-info": {
             "METADATA": """
                 Name: pkg.dot
                 Version: 1.0.0
                 """,
         },
-    }
+    })
 
 
 class DistInfoPkgWithDotLegacy(OnSysPath, SiteBuilder):
-    files: FilesSpec = {
+    files: FilesSpec = frozendict({
         "pkg.dot-1.0.0.dist-info": {
             "METADATA": """
                 Name: pkg.dot
@@ -151,7 +152,7 @@
                 Version: 1.0.0
                 """,
         },
-    }
+    })
 
 
 class DistInfoPkgOffPath(SiteBuilder):
@@ -159,7 +160,7 @@
 
 
 class EggInfoPkg(OnSysPath, SiteBuilder):
-    files: FilesSpec = {
+    files: FilesSpec = frozendict({
         "egginfo_pkg.egg-info": {
             "PKG-INFO": """
                 Name: egginfo-pkg
@@ -191,11 +192,11 @@
             def main():
                 print("hello world")
             """,
-    }
+    })
 
 
 class EggInfoPkgPipInstalledNoToplevel(OnSysPath, SiteBuilder):
-    files: FilesSpec = {
+    files: FilesSpec = frozendict({
         "egg_with_module_pkg.egg-info": {
             "PKG-INFO": "Name: egg_with_module-pkg",
             # SOURCES.txt is made from the source archive, and contains files
@@ -222,11 +223,11 @@
             def main():
                 print("hello world")
             """,
-    }
+    })
 
 
 class EggInfoPkgPipInstalledExternalDataFiles(OnSysPath, SiteBuilder):
-    files: FilesSpec = {
+    files: FilesSpec = frozendict({
         "egg_with_module_pkg.egg-info": {
             "PKG-INFO": "Name: egg_with_module-pkg",
             # SOURCES.txt is made from the source archive, and contains files
@@ -256,11 +257,11 @@
             def main():
                 print("hello world")
             """,
-    }
+    })
 
 
 class EggInfoPkgPipInstalledNoModules(OnSysPath, SiteBuilder):
-    files: FilesSpec = {
+    files: FilesSpec = frozendict({
         "egg_with_no_modules_pkg.egg-info": {
             "PKG-INFO": "Name: egg_with_no_modules-pkg",
             # SOURCES.txt is made from the source archive, and contains files
@@ -282,11 +283,11 @@
             # top_level.txt correctly reflects that no modules are installed
             "top_level.txt": b"\n",
         },
-    }
+    })
 
 
 class EggInfoPkgSourcesFallback(OnSysPath, SiteBuilder):
-    files: FilesSpec = {
+    files: FilesSpec = frozendict({
         "sources_fallback_pkg.egg-info": {
             "PKG-INFO": "Name: sources_fallback-pkg",
             # SOURCES.txt is made from the source archive, and contains files
@@ -304,11 +305,11 @@
             def main():
                 print("hello world")
             """,
-    }
+    })
 
 
 class EggInfoFile(OnSysPath, SiteBuilder):
-    files: FilesSpec = {
+    files: FilesSpec = frozendict({
         "egginfo_file.egg-info": """
             Metadata-Version: 1.0
             Name: egginfo_file
@@ -321,7 +322,7 @@
             Description: UNKNOWN
             Platform: UNKNOWN
             """,
-    }
+    })
 
 
 # dedent all text strings before writing
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/importlib_metadata-9.0.0/tests/test_api.py 
new/importlib_metadata-9.0.1/tests/test_api.py
--- old/importlib_metadata-9.0.0/tests/test_api.py      2026-03-20 
07:42:33.000000000 +0100
+++ new/importlib_metadata-9.0.1/tests/test_api.py      2026-08-28 
17:30:07.801584000 +0200
@@ -6,6 +6,7 @@
 from importlib_metadata import (
     Distribution,
     PackageNotFoundError,
+    Prepared,
     distribution,
     entry_points,
     files,
@@ -53,9 +54,8 @@
     def test_prefix_not_matched(self):
         prefixes = 'p', 'pkg', 'pkg.'
         for prefix in prefixes:
-            with self.subTest(prefix):
-                with self.assertRaises(PackageNotFoundError):
-                    distribution(prefix)
+            with self.subTest(prefix), self.assertRaises(PackageNotFoundError):
+                distribution(prefix)
 
     def test_for_top_level(self):
         tests = [
@@ -76,9 +76,9 @@
         ]
         for pkg_name, expect_content in tests:
             with self.subTest(pkg_name):
-                top_level = [
+                top_level = next(
                     path for path in files(pkg_name) if path.name == 
'top_level.txt'
-                ][0]
+                )
                 self.assertEqual(top_level.read_text(), expect_content)
 
     def test_entry_points(self):
@@ -185,7 +185,7 @@
                 file.read_text()
 
     def test_file_hash_repr(self):
-        util = [p for p in files('distinfo-pkg') if p.name == 'mod.py'][0]
+        util = next(p for p in files('distinfo-pkg') if p.name == 'mod.py')
         self.assertRegex(repr(util.hash), '<FileHash mode: sha256 value: .*>')
 
     def test_files_dist_info(self):
@@ -317,3 +317,34 @@
     def test_invalidate_cache(self):
         # No externally observable behavior, but ensures test coverage...
         importlib.invalidate_caches()
+
+
+class PreparedTests(unittest.TestCase):
+    @fixtures.parameterize(
+        # Simple
+        dict(input='sample', expected='sample'),
+        # Mixed case
+        dict(input='Sample', expected='sample'),
+        dict(input='SAMPLE', expected='sample'),
+        dict(input='SaMpLe', expected='sample'),
+        # Separator conversions
+        dict(input='sample-pkg', expected='sample_pkg'),
+        dict(input='sample.pkg', expected='sample_pkg'),
+        dict(input='sample_pkg', expected='sample_pkg'),
+        # Multiple separators
+        dict(input='sample---pkg', expected='sample_pkg'),
+        dict(input='sample___pkg', expected='sample_pkg'),
+        dict(input='sample...pkg', expected='sample_pkg'),
+        # Mixed separators
+        dict(input='sample-._pkg', expected='sample_pkg'),
+        dict(input='sample_.-pkg', expected='sample_pkg'),
+        # Complex
+        dict(input='Sample__Pkg-name.foo', expected='sample_pkg_name_foo'),
+        dict(input='Sample__Pkg.name__foo', expected='sample_pkg_name_foo'),
+        # Uppercase with separators
+        dict(input='SAMPLE-PKG', expected='sample_pkg'),
+        dict(input='Sample.Pkg', expected='sample_pkg'),
+        dict(input='SAMPLE_PKG', expected='sample_pkg'),
+    )
+    def test_normalize(self, input, expected):
+        self.assertEqual(Prepared.normalize(input), expected)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/importlib_metadata-9.0.0/tests/test_main.py 
new/importlib_metadata-9.0.1/tests/test_main.py
--- old/importlib_metadata-9.0.0/tests/test_main.py     2026-03-20 
07:42:33.000000000 +0100
+++ new/importlib_metadata-9.0.1/tests/test_main.py     2026-08-28 
17:30:07.801819600 +0200
@@ -22,6 +22,7 @@
 
 from . import fixtures
 from ._path import Symlink
+from .compat.py314 import frozendict
 
 
 class BasicTests(fixtures.DistInfoPkg, unittest.TestCase):
@@ -57,7 +58,7 @@
         dict(name=''),
     )
     def test_invalid_inputs_to_from_name(self, name):
-        with self.assertRaises(Exception):
+        with self.assertRaises(ValueError):
             Distribution.from_name(name)
 
 
@@ -134,7 +135,7 @@
 
 class InvalidMetadataTests(fixtures.OnSysPath, fixtures.SiteDir, 
unittest.TestCase):
     @staticmethod
-    def make_pkg(name, files=dict(METADATA="VERSION: 1.0")):
+    def make_pkg(name, files=frozendict(METADATA="VERSION: 1.0")):
         """
         Create metadata for a dist-info package with name and files.
         """
@@ -164,7 +165,7 @@
         """
         fixtures.build_files(self.make_pkg('foo-4.3', files={}), self.site_dir)
         with self.assertRaises(MetadataNotFound):
-            Distribution.from_name('foo').metadata
+            _ = Distribution.from_name('foo').metadata
         with self.assertRaises(MetadataNotFound):
             metadata('foo')
 
@@ -259,9 +260,8 @@
     def test_egg(self):
         egg = self.site_dir.joinpath('foo-3.6.egg')
         egg.mkdir()
-        with self.add_sys_path(egg):
-            with self.assertRaises(PackageNotFoundError):
-                version('foo')
+        with self.add_sys_path(egg), self.assertRaises(PackageNotFoundError):
+            version('foo')
 
 
 class MissingSysPath(fixtures.OnSysPath, unittest.TestCase):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/importlib_metadata-9.0.0/tests/test_zip.py 
new/importlib_metadata-9.0.1/tests/test_zip.py
--- old/importlib_metadata-9.0.0/tests/test_zip.py      2026-03-20 
07:42:33.000000000 +0100
+++ new/importlib_metadata-9.0.1/tests/test_zip.py      2026-08-28 
17:30:07.801819600 +0200
@@ -14,6 +14,7 @@
 )
 
 from . import fixtures
+from .compat.py314 import warnings_helper
 
 
 class TestZip(fixtures.ZipFixtures, unittest.TestCase):
@@ -50,6 +51,7 @@
         dists = list(distributions(path=sys.path[:1]))
         assert len(dists) == 1
 
+    @warnings_helper.ignore_fork_in_thread_deprecation_warnings()
     @unittest.skipUnless(
         hasattr(os, 'register_at_fork')
         and 'fork' in multiprocessing.get_all_start_methods(),

Reply via email to