123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174 |
- # coding: utf-8
- from __future__ import unicode_literals
- import re
- import textwrap
- import unittest
- import importlib
- import importlib_metadata
- from . import fixtures
- from .. import (
- Distribution, EntryPoint, MetadataPathFinder,
- PackageNotFoundError, distributions,
- entry_points, metadata, version,
- )
- try:
- from builtins import str as text
- except ImportError:
- from __builtin__ import unicode as text
- class BasicTests(fixtures.DistInfoPkg, unittest.TestCase):
- version_pattern = r'\d+\.\d+(\.\d)?'
- def test_retrieves_version_of_self(self):
- dist = Distribution.from_name('distinfo-pkg')
- assert isinstance(dist.version, text)
- assert re.match(self.version_pattern, dist.version)
- def test_for_name_does_not_exist(self):
- with self.assertRaises(PackageNotFoundError):
- Distribution.from_name('does-not-exist')
- def test_new_style_classes(self):
- self.assertIsInstance(Distribution, type)
- self.assertIsInstance(MetadataPathFinder, type)
- class ImportTests(fixtures.DistInfoPkg, unittest.TestCase):
- def test_import_nonexistent_module(self):
- # Ensure that the MetadataPathFinder does not crash an import of a
- # non-existant module.
- with self.assertRaises(ImportError):
- importlib.import_module('does_not_exist')
- def test_resolve(self):
- entries = dict(entry_points()['entries'])
- ep = entries['main']
- self.assertEqual(ep.load().__name__, "main")
- def test_resolve_without_attr(self):
- ep = EntryPoint(
- name='ep',
- value='importlib_metadata',
- group='grp',
- )
- assert ep.load() is importlib_metadata
- class NameNormalizationTests(
- fixtures.OnSysPath, fixtures.SiteDir, unittest.TestCase):
- @staticmethod
- def pkg_with_dashes(site_dir):
- """
- Create minimal metadata for a package with dashes
- in the name (and thus underscores in the filename).
- """
- metadata_dir = site_dir / 'my_pkg.dist-info'
- metadata_dir.mkdir()
- metadata = metadata_dir / 'METADATA'
- with metadata.open('w') as strm:
- strm.write('Version: 1.0\n')
- return 'my-pkg'
- def test_dashes_in_dist_name_found_as_underscores(self):
- """
- For a package with a dash in the name, the dist-info metadata
- uses underscores in the name. Ensure the metadata loads.
- """
- pkg_name = self.pkg_with_dashes(self.site_dir)
- assert version(pkg_name) == '1.0'
- @staticmethod
- def pkg_with_mixed_case(site_dir):
- """
- Create minimal metadata for a package with mixed case
- in the name.
- """
- metadata_dir = site_dir / 'CherryPy.dist-info'
- metadata_dir.mkdir()
- metadata = metadata_dir / 'METADATA'
- with metadata.open('w') as strm:
- strm.write('Version: 1.0\n')
- return 'CherryPy'
- def test_dist_name_found_as_any_case(self):
- """
- Ensure the metadata loads when queried with any case.
- """
- pkg_name = self.pkg_with_mixed_case(self.site_dir)
- assert version(pkg_name) == '1.0'
- assert version(pkg_name.lower()) == '1.0'
- assert version(pkg_name.upper()) == '1.0'
- class NonASCIITests(fixtures.OnSysPath, fixtures.SiteDir, unittest.TestCase):
- @staticmethod
- def pkg_with_non_ascii_description(site_dir):
- """
- Create minimal metadata for a package with non-ASCII in
- the description.
- """
- metadata_dir = site_dir / 'portend.dist-info'
- metadata_dir.mkdir()
- metadata = metadata_dir / 'METADATA'
- with metadata.open('w', encoding='utf-8') as fp:
- fp.write('Description: pôrˈtend\n')
- return 'portend'
- @staticmethod
- def pkg_with_non_ascii_description_egg_info(site_dir):
- """
- Create minimal metadata for an egg-info package with
- non-ASCII in the description.
- """
- metadata_dir = site_dir / 'portend.dist-info'
- metadata_dir.mkdir()
- metadata = metadata_dir / 'METADATA'
- with metadata.open('w', encoding='utf-8') as fp:
- fp.write(textwrap.dedent("""
- Name: portend
- pôrˈtend
- """).lstrip())
- return 'portend'
- def test_metadata_loads(self):
- pkg_name = self.pkg_with_non_ascii_description(self.site_dir)
- meta = metadata(pkg_name)
- assert meta['Description'] == 'pôrˈtend'
- def test_metadata_loads_egg_info(self):
- pkg_name = self.pkg_with_non_ascii_description_egg_info(self.site_dir)
- meta = metadata(pkg_name)
- assert meta.get_payload() == 'pôrˈtend\n'
- class DiscoveryTests(fixtures.EggInfoPkg,
- fixtures.DistInfoPkg,
- unittest.TestCase):
- def test_package_discovery(self):
- dists = list(distributions())
- assert all(
- isinstance(dist, Distribution)
- for dist in dists
- )
- assert any(
- dist.metadata['Name'] == 'egginfo-pkg'
- for dist in dists
- )
- assert any(
- dist.metadata['Name'] == 'distinfo-pkg'
- for dist in dists
- )
- class DirectoryTest(fixtures.OnSysPath, fixtures.SiteDir, unittest.TestCase):
- def test(self):
- # make an `EGG-INFO` directory that's unrelated
- self.site_dir.joinpath('EGG-INFO').mkdir()
- # used to crash with `IsADirectoryError`
- self.assertIsNone(version('unknown-package'))
|