178 lines
5.4 KiB
Python
178 lines
5.4 KiB
Python
|
import re
|
||
|
import textwrap
|
||
|
import unittest
|
||
|
|
||
|
from . import fixtures
|
||
|
from .. import (
|
||
|
Distribution, PackageNotFoundError, distribution,
|
||
|
entry_points, files, metadata, requires, version,
|
||
|
)
|
||
|
|
||
|
try:
|
||
|
from collections.abc import Iterator
|
||
|
except ImportError:
|
||
|
from collections import Iterator # noqa: F401
|
||
|
|
||
|
try:
|
||
|
from builtins import str as text
|
||
|
except ImportError:
|
||
|
from __builtin__ import unicode as text
|
||
|
|
||
|
|
||
|
class APITests(
|
||
|
fixtures.EggInfoPkg,
|
||
|
fixtures.DistInfoPkg,
|
||
|
fixtures.EggInfoFile,
|
||
|
unittest.TestCase):
|
||
|
|
||
|
version_pattern = r'\d+\.\d+(\.\d)?'
|
||
|
|
||
|
def test_retrieves_version_of_self(self):
|
||
|
pkg_version = version('egginfo-pkg')
|
||
|
assert isinstance(pkg_version, text)
|
||
|
assert re.match(self.version_pattern, pkg_version)
|
||
|
|
||
|
def test_retrieves_version_of_distinfo_pkg(self):
|
||
|
pkg_version = version('distinfo-pkg')
|
||
|
assert isinstance(pkg_version, text)
|
||
|
assert re.match(self.version_pattern, pkg_version)
|
||
|
|
||
|
def test_for_name_does_not_exist(self):
|
||
|
with self.assertRaises(PackageNotFoundError):
|
||
|
distribution('does-not-exist')
|
||
|
|
||
|
def test_for_top_level(self):
|
||
|
self.assertEqual(
|
||
|
distribution('egginfo-pkg').read_text('top_level.txt').strip(),
|
||
|
'mod')
|
||
|
|
||
|
def test_read_text(self):
|
||
|
top_level = [
|
||
|
path for path in files('egginfo-pkg')
|
||
|
if path.name == 'top_level.txt'
|
||
|
][0]
|
||
|
self.assertEqual(top_level.read_text(), 'mod\n')
|
||
|
|
||
|
def test_entry_points(self):
|
||
|
entries = dict(entry_points()['entries'])
|
||
|
ep = entries['main']
|
||
|
self.assertEqual(ep.value, 'mod:main')
|
||
|
self.assertEqual(ep.extras, [])
|
||
|
|
||
|
def test_metadata_for_this_package(self):
|
||
|
md = metadata('egginfo-pkg')
|
||
|
assert md['author'] == 'Steven Ma'
|
||
|
assert md['LICENSE'] == 'Unknown'
|
||
|
assert md['Name'] == 'egginfo-pkg'
|
||
|
classifiers = md.get_all('Classifier')
|
||
|
assert 'Topic :: Software Development :: Libraries' in classifiers
|
||
|
|
||
|
def test_importlib_metadata_version(self):
|
||
|
resolved = version('importlib-metadata')
|
||
|
assert re.match(self.version_pattern, resolved)
|
||
|
|
||
|
@staticmethod
|
||
|
def _test_files(files):
|
||
|
root = files[0].root
|
||
|
for file in files:
|
||
|
assert file.root == root
|
||
|
assert not file.hash or file.hash.value
|
||
|
assert not file.hash or file.hash.mode == 'sha256'
|
||
|
assert not file.size or file.size >= 0
|
||
|
assert file.locate().exists()
|
||
|
assert isinstance(file.read_binary(), bytes)
|
||
|
if file.name.endswith('.py'):
|
||
|
file.read_text()
|
||
|
|
||
|
def test_file_hash_repr(self):
|
||
|
try:
|
||
|
assertRegex = self.assertRegex
|
||
|
except AttributeError:
|
||
|
# Python 2
|
||
|
assertRegex = self.assertRegexpMatches
|
||
|
|
||
|
util = [
|
||
|
p for p in files('distinfo-pkg')
|
||
|
if p.name == 'mod.py'
|
||
|
][0]
|
||
|
assertRegex(
|
||
|
repr(util.hash),
|
||
|
'<FileHash mode: sha256 value: .*>')
|
||
|
|
||
|
def test_files_dist_info(self):
|
||
|
self._test_files(files('distinfo-pkg'))
|
||
|
|
||
|
def test_files_egg_info(self):
|
||
|
self._test_files(files('egginfo-pkg'))
|
||
|
|
||
|
def test_version_egg_info_file(self):
|
||
|
self.assertEqual(version('egginfo-file'), '0.1')
|
||
|
|
||
|
def test_requires_egg_info_file(self):
|
||
|
requirements = requires('egginfo-file')
|
||
|
self.assertIsNone(requirements)
|
||
|
|
||
|
def test_requires_egg_info(self):
|
||
|
deps = requires('egginfo-pkg')
|
||
|
assert len(deps) == 2
|
||
|
assert any(
|
||
|
dep == 'wheel >= 1.0; python_version >= "2.7"'
|
||
|
for dep in deps
|
||
|
)
|
||
|
|
||
|
def test_requires_dist_info(self):
|
||
|
deps = requires('distinfo-pkg')
|
||
|
assert len(deps) == 2
|
||
|
assert all(deps)
|
||
|
assert 'wheel >= 1.0' in deps
|
||
|
assert "pytest; extra == 'test'" in deps
|
||
|
|
||
|
def test_more_complex_deps_requires_text(self):
|
||
|
requires = textwrap.dedent("""
|
||
|
dep1
|
||
|
dep2
|
||
|
|
||
|
[:python_version < "3"]
|
||
|
dep3
|
||
|
|
||
|
[extra1]
|
||
|
dep4
|
||
|
|
||
|
[extra2:python_version < "3"]
|
||
|
dep5
|
||
|
""")
|
||
|
deps = sorted(Distribution._deps_from_requires_text(requires))
|
||
|
expected = [
|
||
|
'dep1',
|
||
|
'dep2',
|
||
|
'dep3; python_version < "3"',
|
||
|
'dep4; extra == "extra1"',
|
||
|
'dep5; (python_version < "3") and extra == "extra2"',
|
||
|
]
|
||
|
# It's important that the environment marker expression be
|
||
|
# wrapped in parentheses to avoid the following 'and' binding more
|
||
|
# tightly than some other part of the environment expression.
|
||
|
|
||
|
assert deps == expected
|
||
|
|
||
|
|
||
|
class OffSysPathTests(fixtures.DistInfoPkgOffPath, unittest.TestCase):
|
||
|
def test_find_distributions_specified_path(self):
|
||
|
dists = Distribution.discover(path=[str(self.site_dir)])
|
||
|
assert any(
|
||
|
dist.metadata['Name'] == 'distinfo-pkg'
|
||
|
for dist in dists
|
||
|
)
|
||
|
|
||
|
def test_distribution_at_pathlib(self):
|
||
|
"""Demonstrate how to load metadata direct from a directory.
|
||
|
"""
|
||
|
dist_info_path = self.site_dir / 'distinfo_pkg-1.0.0.dist-info'
|
||
|
dist = Distribution.at(dist_info_path)
|
||
|
assert dist.version == '1.0.0'
|
||
|
|
||
|
def test_distribution_at_str(self):
|
||
|
dist_info_path = self.site_dir / 'distinfo_pkg-1.0.0.dist-info'
|
||
|
dist = Distribution.at(str(dist_info_path))
|
||
|
assert dist.version == '1.0.0'
|