importlib-metadata 7.2.0__tar.gz → 8.0.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (66) hide show
  1. {importlib_metadata-7.2.0 → importlib_metadata-8.0.0}/NEWS.rst +19 -0
  2. {importlib_metadata-7.2.0/importlib_metadata.egg-info → importlib_metadata-8.0.0}/PKG-INFO +2 -2
  3. {importlib_metadata-7.2.0 → importlib_metadata-8.0.0}/docs/conf.py +0 -2
  4. {importlib_metadata-7.2.0 → importlib_metadata-8.0.0}/importlib_metadata/__init__.py +4 -26
  5. {importlib_metadata-7.2.0 → importlib_metadata-8.0.0}/importlib_metadata/_adapters.py +8 -15
  6. importlib_metadata-8.0.0/importlib_metadata/compat/py311.py +22 -0
  7. {importlib_metadata-7.2.0 → importlib_metadata-8.0.0/importlib_metadata.egg-info}/PKG-INFO +2 -2
  8. {importlib_metadata-7.2.0 → importlib_metadata-8.0.0}/importlib_metadata.egg-info/SOURCES.txt +1 -0
  9. {importlib_metadata-7.2.0 → importlib_metadata-8.0.0}/pyproject.toml +1 -1
  10. {importlib_metadata-7.2.0 → importlib_metadata-8.0.0}/tests/fixtures.py +34 -0
  11. {importlib_metadata-7.2.0 → importlib_metadata-8.0.0}/tests/test_api.py +5 -13
  12. {importlib_metadata-7.2.0 → importlib_metadata-8.0.0}/tests/test_main.py +0 -13
  13. {importlib_metadata-7.2.0 → importlib_metadata-8.0.0}/.coveragerc +0 -0
  14. {importlib_metadata-7.2.0 → importlib_metadata-8.0.0}/.editorconfig +0 -0
  15. {importlib_metadata-7.2.0 → importlib_metadata-8.0.0}/.github/FUNDING.yml +0 -0
  16. {importlib_metadata-7.2.0 → importlib_metadata-8.0.0}/.github/dependabot.yml +0 -0
  17. {importlib_metadata-7.2.0 → importlib_metadata-8.0.0}/.github/workflows/main.yml +0 -0
  18. {importlib_metadata-7.2.0 → importlib_metadata-8.0.0}/.gitignore +0 -0
  19. {importlib_metadata-7.2.0 → importlib_metadata-8.0.0}/.pre-commit-config.yaml +0 -0
  20. {importlib_metadata-7.2.0 → importlib_metadata-8.0.0}/.readthedocs.yaml +0 -0
  21. {importlib_metadata-7.2.0 → importlib_metadata-8.0.0}/LICENSE +0 -0
  22. {importlib_metadata-7.2.0 → importlib_metadata-8.0.0}/README.rst +0 -0
  23. {importlib_metadata-7.2.0 → importlib_metadata-8.0.0}/SECURITY.md +0 -0
  24. {importlib_metadata-7.2.0 → importlib_metadata-8.0.0}/conftest.py +0 -0
  25. {importlib_metadata-7.2.0 → importlib_metadata-8.0.0}/docs/__init__.py +0 -0
  26. {importlib_metadata-7.2.0 → importlib_metadata-8.0.0}/docs/api.rst +0 -0
  27. {importlib_metadata-7.2.0 → importlib_metadata-8.0.0}/docs/history.rst +0 -0
  28. {importlib_metadata-7.2.0 → importlib_metadata-8.0.0}/docs/index.rst +0 -0
  29. {importlib_metadata-7.2.0 → importlib_metadata-8.0.0}/docs/migration.rst +0 -0
  30. {importlib_metadata-7.2.0 → importlib_metadata-8.0.0}/exercises.py +0 -0
  31. {importlib_metadata-7.2.0 → importlib_metadata-8.0.0}/importlib_metadata/_collections.py +0 -0
  32. {importlib_metadata-7.2.0 → importlib_metadata-8.0.0}/importlib_metadata/_compat.py +0 -0
  33. {importlib_metadata-7.2.0 → importlib_metadata-8.0.0}/importlib_metadata/_functools.py +0 -0
  34. {importlib_metadata-7.2.0 → importlib_metadata-8.0.0}/importlib_metadata/_itertools.py +0 -0
  35. {importlib_metadata-7.2.0 → importlib_metadata-8.0.0}/importlib_metadata/_meta.py +0 -0
  36. {importlib_metadata-7.2.0 → importlib_metadata-8.0.0}/importlib_metadata/_text.py +0 -0
  37. {importlib_metadata-7.2.0 → importlib_metadata-8.0.0}/importlib_metadata/compat/__init__.py +0 -0
  38. {importlib_metadata-7.2.0 → importlib_metadata-8.0.0}/importlib_metadata/compat/py39.py +0 -0
  39. {importlib_metadata-7.2.0 → importlib_metadata-8.0.0}/importlib_metadata/diagnose.py +0 -0
  40. {importlib_metadata-7.2.0 → importlib_metadata-8.0.0}/importlib_metadata/py.typed +0 -0
  41. {importlib_metadata-7.2.0 → importlib_metadata-8.0.0}/importlib_metadata.egg-info/dependency_links.txt +0 -0
  42. {importlib_metadata-7.2.0 → importlib_metadata-8.0.0}/importlib_metadata.egg-info/requires.txt +0 -0
  43. {importlib_metadata-7.2.0 → importlib_metadata-8.0.0}/importlib_metadata.egg-info/top_level.txt +0 -0
  44. {importlib_metadata-7.2.0 → importlib_metadata-8.0.0}/mypy.ini +0 -0
  45. {importlib_metadata-7.2.0 → importlib_metadata-8.0.0}/pytest.ini +0 -0
  46. {importlib_metadata-7.2.0 → importlib_metadata-8.0.0}/ruff.toml +0 -0
  47. {importlib_metadata-7.2.0 → importlib_metadata-8.0.0}/setup.cfg +0 -0
  48. {importlib_metadata-7.2.0 → importlib_metadata-8.0.0}/tests/__init__.py +0 -0
  49. {importlib_metadata-7.2.0 → importlib_metadata-8.0.0}/tests/_context.py +0 -0
  50. {importlib_metadata-7.2.0 → importlib_metadata-8.0.0}/tests/_path.py +0 -0
  51. {importlib_metadata-7.2.0 → importlib_metadata-8.0.0}/tests/compat/__init__.py +0 -0
  52. {importlib_metadata-7.2.0 → importlib_metadata-8.0.0}/tests/compat/py312.py +0 -0
  53. {importlib_metadata-7.2.0 → importlib_metadata-8.0.0}/tests/compat/py39.py +0 -0
  54. {importlib_metadata-7.2.0 → importlib_metadata-8.0.0}/tests/compat/test_py39_compat.py +0 -0
  55. {importlib_metadata-7.2.0 → importlib_metadata-8.0.0}/tests/data/__init__.py +0 -0
  56. {importlib_metadata-7.2.0 → importlib_metadata-8.0.0}/tests/data/example-21.12-py3-none-any.whl +0 -0
  57. {importlib_metadata-7.2.0 → importlib_metadata-8.0.0}/tests/data/example-21.12-py3.6.egg +0 -0
  58. {importlib_metadata-7.2.0 → importlib_metadata-8.0.0}/tests/data/example2-1.0.0-py3-none-any.whl +0 -0
  59. {importlib_metadata-7.2.0 → importlib_metadata-8.0.0}/tests/data/sources/example/example/__init__.py +0 -0
  60. {importlib_metadata-7.2.0 → importlib_metadata-8.0.0}/tests/data/sources/example/setup.py +0 -0
  61. {importlib_metadata-7.2.0 → importlib_metadata-8.0.0}/tests/data/sources/example2/example2/__init__.py +0 -0
  62. {importlib_metadata-7.2.0 → importlib_metadata-8.0.0}/tests/data/sources/example2/pyproject.toml +0 -0
  63. {importlib_metadata-7.2.0 → importlib_metadata-8.0.0}/tests/test_integration.py +0 -0
  64. {importlib_metadata-7.2.0 → importlib_metadata-8.0.0}/tests/test_zip.py +0 -0
  65. {importlib_metadata-7.2.0 → importlib_metadata-8.0.0}/towncrier.toml +0 -0
  66. {importlib_metadata-7.2.0 → importlib_metadata-8.0.0}/tox.ini +0 -0
@@ -1,3 +1,22 @@
1
+ v8.0.0
2
+ ======
3
+
4
+ Deprecations and Removals
5
+ -------------------------
6
+
7
+ - Message.__getitem__ now raises a KeyError on missing keys. (#371)
8
+ - Removed deprecated support for Distribution subclasses not implementing abstract methods.
9
+
10
+
11
+ v7.2.1
12
+ ======
13
+
14
+ Bugfixes
15
+ --------
16
+
17
+ - When reading installed files from an egg, use ``relative_to(walk_up=True)`` to honor files installed outside of the installation root. (#455)
18
+
19
+
1
20
  v7.2.0
2
21
  ======
3
22
 
@@ -1,9 +1,9 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: importlib_metadata
3
- Version: 7.2.0
3
+ Version: 8.0.0
4
4
  Summary: Read metadata from Python packages
5
5
  Author-email: "Jason R. Coombs" <jaraco@jaraco.com>
6
- Project-URL: Homepage, https://github.com/python/importlib_metadata
6
+ Project-URL: Source, https://github.com/python/importlib_metadata
7
7
  Classifier: Development Status :: 5 - Production/Stable
8
8
  Classifier: Intended Audience :: Developers
9
9
  Classifier: License :: OSI Approved :: Apache Software License
@@ -69,6 +69,4 @@ nitpick_ignore = [
69
69
  ('py:class', 'importlib_metadata._meta._T'),
70
70
  # Workaround for #435
71
71
  ('py:class', '_T'),
72
- # Other workarounds
73
- ('py:class', 'importlib_metadata.DeprecatedNonAbstract'),
74
72
  ]
@@ -12,14 +12,13 @@ import inspect
12
12
  import pathlib
13
13
  import operator
14
14
  import textwrap
15
- import warnings
16
15
  import functools
17
16
  import itertools
18
17
  import posixpath
19
18
  import collections
20
19
 
21
20
  from . import _meta
22
- from .compat import py39
21
+ from .compat import py39, py311
23
22
  from ._collections import FreezableDefaultDict, Pair
24
23
  from ._compat import (
25
24
  NullFinder,
@@ -334,27 +333,7 @@ class FileHash:
334
333
  return f'<FileHash mode: {self.mode} value: {self.value}>'
335
334
 
336
335
 
337
- class DeprecatedNonAbstract:
338
- # Required until Python 3.14
339
- def __new__(cls, *args, **kwargs):
340
- all_names = {
341
- name for subclass in inspect.getmro(cls) for name in vars(subclass)
342
- }
343
- abstract = {
344
- name
345
- for name in all_names
346
- if getattr(getattr(cls, name), '__isabstractmethod__', False)
347
- }
348
- if abstract:
349
- warnings.warn(
350
- f"Unimplemented abstract methods {abstract}",
351
- DeprecationWarning,
352
- stacklevel=2,
353
- )
354
- return super().__new__(cls)
355
-
356
-
357
- class Distribution(DeprecatedNonAbstract):
336
+ class Distribution(metaclass=abc.ABCMeta):
358
337
  """
359
338
  An abstract Python distribution package.
360
339
 
@@ -570,9 +549,8 @@ class Distribution(DeprecatedNonAbstract):
570
549
  return
571
550
 
572
551
  paths = (
573
- (subdir / name)
574
- .resolve()
575
- .relative_to(self.locate_file('').resolve())
552
+ py311.relative_fix((subdir / name).resolve())
553
+ .relative_to(self.locate_file('').resolve(), walk_up=True)
576
554
  .as_posix()
577
555
  for name in text.splitlines()
578
556
  )
@@ -1,20 +1,8 @@
1
- import functools
2
- import warnings
3
1
  import re
4
2
  import textwrap
5
3
  import email.message
6
4
 
7
5
  from ._text import FoldedCase
8
- from ._compat import pypy_partial
9
-
10
-
11
- # Do not remove prior to 2024-01-01 or Python 3.14
12
- _warn = functools.partial(
13
- warnings.warn,
14
- "Implicit None on return values is deprecated and will raise KeyErrors.",
15
- DeprecationWarning,
16
- stacklevel=pypy_partial(2),
17
- )
18
6
 
19
7
 
20
8
  class Message(email.message.Message):
@@ -53,12 +41,17 @@ class Message(email.message.Message):
53
41
 
54
42
  def __getitem__(self, item):
55
43
  """
56
- Warn users that a ``KeyError`` can be expected when a
57
- missing key is supplied. Ref python/importlib_metadata#371.
44
+ Override parent behavior to typical dict behavior.
45
+
46
+ ``email.message.Message`` will emit None values for missing
47
+ keys. Typical mappings, including this ``Message``, will raise
48
+ a key error for missing keys.
49
+
50
+ Ref python/importlib_metadata#371.
58
51
  """
59
52
  res = super().__getitem__(item)
60
53
  if res is None:
61
- _warn()
54
+ raise KeyError(item)
62
55
  return res
63
56
 
64
57
  def _repair_headers(self):
@@ -0,0 +1,22 @@
1
+ import os
2
+ import pathlib
3
+ import sys
4
+ import types
5
+
6
+
7
+ def wrap(path): # pragma: no cover
8
+ """
9
+ Workaround for https://github.com/python/cpython/issues/84538
10
+ to add backward compatibility for walk_up=True.
11
+ An example affected package is dask-labextension, which uses
12
+ jupyter-packaging to install JupyterLab javascript files outside
13
+ of site-packages.
14
+ """
15
+
16
+ def relative_to(root, *, walk_up=False):
17
+ return pathlib.Path(os.path.relpath(path, root))
18
+
19
+ return types.SimpleNamespace(relative_to=relative_to)
20
+
21
+
22
+ relative_fix = wrap if sys.version_info < (3, 12) else lambda x: x
@@ -1,9 +1,9 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: importlib_metadata
3
- Version: 7.2.0
3
+ Version: 8.0.0
4
4
  Summary: Read metadata from Python packages
5
5
  Author-email: "Jason R. Coombs" <jaraco@jaraco.com>
6
- Project-URL: Homepage, https://github.com/python/importlib_metadata
6
+ Project-URL: Source, https://github.com/python/importlib_metadata
7
7
  Classifier: Development Status :: 5 - Production/Stable
8
8
  Classifier: Intended Audience :: Developers
9
9
  Classifier: License :: OSI Approved :: Apache Software License
@@ -40,6 +40,7 @@ importlib_metadata.egg-info/dependency_links.txt
40
40
  importlib_metadata.egg-info/requires.txt
41
41
  importlib_metadata.egg-info/top_level.txt
42
42
  importlib_metadata/compat/__init__.py
43
+ importlib_metadata/compat/py311.py
43
44
  importlib_metadata/compat/py39.py
44
45
  tests/__init__.py
45
46
  tests/_context.py
@@ -24,7 +24,7 @@ dependencies = [
24
24
  dynamic = ["version"]
25
25
 
26
26
  [project.urls]
27
- Homepage = "https://github.com/python/importlib_metadata"
27
+ Source = "https://github.com/python/importlib_metadata"
28
28
 
29
29
  [project.optional-dependencies]
30
30
  test = [
@@ -233,6 +233,40 @@ class EggInfoPkgPipInstalledNoToplevel(OnSysPath, SiteBuilder):
233
233
  }
234
234
 
235
235
 
236
+ class EggInfoPkgPipInstalledExternalDataFiles(OnSysPath, SiteBuilder):
237
+ files: FilesSpec = {
238
+ "egg_with_module_pkg.egg-info": {
239
+ "PKG-INFO": "Name: egg_with_module-pkg",
240
+ # SOURCES.txt is made from the source archive, and contains files
241
+ # (setup.py) that are not present after installation.
242
+ "SOURCES.txt": """
243
+ egg_with_module.py
244
+ setup.py
245
+ egg_with_module.json
246
+ egg_with_module_pkg.egg-info/PKG-INFO
247
+ egg_with_module_pkg.egg-info/SOURCES.txt
248
+ egg_with_module_pkg.egg-info/top_level.txt
249
+ """,
250
+ # installed-files.txt is written by pip, and is a strictly more
251
+ # accurate source than SOURCES.txt as to the installed contents of
252
+ # the package.
253
+ "installed-files.txt": """
254
+ ../../../etc/jupyter/jupyter_notebook_config.d/relative.json
255
+ /etc/jupyter/jupyter_notebook_config.d/absolute.json
256
+ ../egg_with_module.py
257
+ PKG-INFO
258
+ SOURCES.txt
259
+ top_level.txt
260
+ """,
261
+ # missing top_level.txt (to trigger fallback to installed-files.txt)
262
+ },
263
+ "egg_with_module.py": """
264
+ def main():
265
+ print("hello world")
266
+ """,
267
+ }
268
+
269
+
236
270
  class EggInfoPkgPipInstalledNoModules(OnSysPath, SiteBuilder):
237
271
  files: FilesSpec = {
238
272
  "egg_with_no_modules_pkg.egg-info": {
@@ -1,9 +1,7 @@
1
1
  import re
2
2
  import textwrap
3
3
  import unittest
4
- import warnings
5
4
  import importlib
6
- import contextlib
7
5
 
8
6
  from . import fixtures
9
7
  from importlib_metadata import (
@@ -18,17 +16,11 @@ from importlib_metadata import (
18
16
  )
19
17
 
20
18
 
21
- @contextlib.contextmanager
22
- def suppress_known_deprecation():
23
- with warnings.catch_warnings(record=True) as ctx:
24
- warnings.simplefilter('default', category=DeprecationWarning)
25
- yield ctx
26
-
27
-
28
19
  class APITests(
29
20
  fixtures.EggInfoPkg,
30
21
  fixtures.EggInfoPkgPipInstalledNoToplevel,
31
22
  fixtures.EggInfoPkgPipInstalledNoModules,
23
+ fixtures.EggInfoPkgPipInstalledExternalDataFiles,
32
24
  fixtures.EggInfoPkgSourcesFallback,
33
25
  fixtures.DistInfoPkg,
34
26
  fixtures.DistInfoPkgWithDot,
@@ -156,13 +148,13 @@ class APITests(
156
148
  resolved = version('importlib-metadata')
157
149
  assert re.match(self.version_pattern, resolved)
158
150
 
159
- def test_missing_key_legacy(self):
151
+ def test_missing_key(self):
160
152
  """
161
- Requesting a missing key will still return None, but warn.
153
+ Requesting a missing key raises KeyError.
162
154
  """
163
155
  md = metadata('distinfo-pkg')
164
- with suppress_known_deprecation():
165
- assert md['does-not-exist'] is None
156
+ with self.assertRaises(KeyError):
157
+ md['does-not-exist']
166
158
 
167
159
  def test_get_key(self):
168
160
  """
@@ -1,16 +1,13 @@
1
1
  import re
2
2
  import pickle
3
3
  import unittest
4
- import warnings
5
4
  import importlib
6
5
  import importlib_metadata
7
- import contextlib
8
6
  from .compat.py39 import os_helper
9
7
 
10
8
  import pyfakefs.fake_filesystem_unittest as ffs
11
9
 
12
10
  from . import fixtures
13
- from ._context import suppress
14
11
  from ._path import Symlink
15
12
  from importlib_metadata import (
16
13
  Distribution,
@@ -25,13 +22,6 @@ from importlib_metadata import (
25
22
  )
26
23
 
27
24
 
28
- @contextlib.contextmanager
29
- def suppress_known_deprecation():
30
- with warnings.catch_warnings(record=True) as ctx:
31
- warnings.simplefilter('default', category=DeprecationWarning)
32
- yield ctx
33
-
34
-
35
25
  class BasicTests(fixtures.DistInfoPkg, unittest.TestCase):
36
26
  version_pattern = r'\d+\.\d+(\.\d)?'
37
27
 
@@ -56,9 +46,6 @@ class BasicTests(fixtures.DistInfoPkg, unittest.TestCase):
56
46
 
57
47
  assert "metadata" in str(ctx.exception)
58
48
 
59
- # expected to fail until ABC is enforced
60
- @suppress(AssertionError)
61
- @suppress_known_deprecation()
62
49
  def test_abc_enforced(self):
63
50
  with self.assertRaises(TypeError):
64
51
  type('DistributionSubclass', (Distribution,), {})()