Skip to content

Commit 8721a05

Browse files
committed
Merge branch 'master' into feature/skeleton
2 parents ed672ee + c3421fb commit 8721a05

File tree

4 files changed

+70
-3
lines changed

4 files changed

+70
-3
lines changed

CHANGES.rst

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,15 @@
1+
v3.1.0
2+
======
3+
4+
* Merge with 2.1.0.
5+
6+
v2.1.0
7+
======
8+
9+
* #253: When querying for package metadata, the lookup
10+
now honors
11+
`package normalization rules <https://packaging.python.org/specifications/recording-installed-packages/>`_.
12+
113
v3.0.0
214
======
315

importlib_metadata/__init__.py

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -461,7 +461,7 @@ def search(self, name):
461461
n_low = child.lower()
462462
if (
463463
n_low in name.exact_matches
464-
or n_low.startswith(name.prefix)
464+
or n_low.replace('.', '_').startswith(name.prefix)
465465
and n_low.endswith(name.suffixes)
466466
# legacy case:
467467
or self.is_egg(name)
@@ -485,11 +485,18 @@ def __init__(self, name):
485485
self.name = name
486486
if name is None:
487487
return
488-
self.normalized = name.lower().replace('-', '_')
488+
self.normalized = self.normalize(name)
489489
self.prefix = self.normalized + '-'
490490
self.exact_matches = [self.normalized + suffix for suffix in self.suffixes]
491491
self.versionless_egg_name = self.normalized + '.egg'
492492

493+
@staticmethod
494+
def normalize(name):
495+
"""
496+
PEP 503 normalization plus dashes as underscores.
497+
"""
498+
return re.sub(r"[-_.]+", "-", name).lower().replace('-', '_')
499+
493500

494501
@install
495502
class MetadataPathFinder(NullFinder, DistributionFinder):

tests/fixtures.py

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,36 @@ def setUp(self):
105105
build_files(DistInfoPkg.files, self.site_dir)
106106

107107

108+
class DistInfoPkgWithDot(OnSysPath, SiteDir):
109+
files: FilesDef = {
110+
"pkg_dot-1.0.0.dist-info": {
111+
"METADATA": """
112+
Name: pkg.dot
113+
Version: 1.0.0
114+
""",
115+
},
116+
}
117+
118+
def setUp(self):
119+
super(DistInfoPkgWithDot, self).setUp()
120+
build_files(DistInfoPkgWithDot.files, self.site_dir)
121+
122+
123+
class DistInfoPkgWithDotLegacy(OnSysPath, SiteDir):
124+
files: FilesDef = {
125+
"pkg.dot-1.0.0.dist-info": {
126+
"METADATA": """
127+
Name: pkg.dot
128+
Version: 1.0.0
129+
""",
130+
},
131+
}
132+
133+
def setUp(self):
134+
super(DistInfoPkgWithDotLegacy, self).setUp()
135+
build_files(DistInfoPkgWithDotLegacy.files, self.site_dir)
136+
137+
108138
class DistInfoPkgOffPath(SiteDir):
109139
def setUp(self):
110140
super(DistInfoPkgOffPath, self).setUp()

tests/test_api.py

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,11 @@
1616

1717

1818
class APITests(
19-
fixtures.EggInfoPkg, fixtures.DistInfoPkg, fixtures.EggInfoFile, unittest.TestCase
19+
fixtures.EggInfoPkg,
20+
fixtures.DistInfoPkg,
21+
fixtures.DistInfoPkgWithDot,
22+
fixtures.EggInfoFile,
23+
unittest.TestCase,
2024
):
2125

2226
version_pattern = r'\d+\.\d+(\.\d)?'
@@ -35,6 +39,12 @@ def test_for_name_does_not_exist(self):
3539
with self.assertRaises(PackageNotFoundError):
3640
distribution('does-not-exist')
3741

42+
def test_name_normalization(self):
43+
names = 'pkg.dot', 'pkg_dot', 'pkg-dot', 'pkg..dot', 'Pkg.Dot'
44+
for name in names:
45+
with self.subTest(name):
46+
assert distribution(name).metadata['Name'] == 'pkg.dot'
47+
3848
def test_for_top_level(self):
3949
self.assertEqual(
4050
distribution('egginfo-pkg').read_text('top_level.txt').strip(), 'mod'
@@ -143,6 +153,14 @@ def test_more_complex_deps_requires_text(self):
143153
assert deps == expected
144154

145155

156+
class LegacyDots(fixtures.DistInfoPkgWithDotLegacy, unittest.TestCase):
157+
def test_name_normalization(self):
158+
names = 'pkg.dot', 'pkg_dot', 'pkg-dot', 'pkg..dot', 'Pkg.Dot'
159+
for name in names:
160+
with self.subTest(name):
161+
assert distribution(name).metadata['Name'] == 'pkg.dot'
162+
163+
146164
class OffSysPathTests(fixtures.DistInfoPkgOffPath, unittest.TestCase):
147165
def test_find_distributions_specified_path(self):
148166
dists = Distribution.discover(path=[str(self.site_dir)])

0 commit comments

Comments
 (0)