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(),