1"""Test .dist-info style distributions.
2"""
3
4import pytest
5
6import pkg_resources
7from .textwrap import DALS
8
9
10class TestDistInfo:
11
12    metadata_base = DALS("""
13        Metadata-Version: 1.2
14        Requires-Dist: splort (==4)
15        Provides-Extra: baz
16        Requires-Dist: quux (>=1.1); extra == 'baz'
17        """)
18
19    @classmethod
20    def build_metadata(cls, **kwargs):
21        lines = (
22            '{key}: {value}\n'.format(**locals())
23            for key, value in kwargs.items()
24        )
25        return cls.metadata_base + ''.join(lines)
26
27    @pytest.fixture
28    def metadata(self, tmpdir):
29        dist_info_name = 'VersionedDistribution-2.718.dist-info'
30        versioned = tmpdir / dist_info_name
31        versioned.mkdir()
32        filename = versioned / 'METADATA'
33        content = self.build_metadata(
34            Name='VersionedDistribution',
35        )
36        filename.write_text(content, encoding='utf-8')
37
38        dist_info_name = 'UnversionedDistribution.dist-info'
39        unversioned = tmpdir / dist_info_name
40        unversioned.mkdir()
41        filename = unversioned / 'METADATA'
42        content = self.build_metadata(
43            Name='UnversionedDistribution',
44            Version='0.3',
45        )
46        filename.write_text(content, encoding='utf-8')
47
48        return str(tmpdir)
49
50    def test_distinfo(self, metadata):
51        dists = dict(
52            (d.project_name, d)
53            for d in pkg_resources.find_distributions(metadata)
54        )
55
56        assert len(dists) == 2, dists
57
58        unversioned = dists['UnversionedDistribution']
59        versioned = dists['VersionedDistribution']
60
61        assert versioned.version == '2.718'  # from filename
62        assert unversioned.version == '0.3'  # from METADATA
63
64    def test_conditional_dependencies(self, metadata):
65        specs = 'splort==4', 'quux>=1.1'
66        requires = list(map(pkg_resources.Requirement.parse, specs))
67
68        for d in pkg_resources.find_distributions(metadata):
69            assert d.requires() == requires[:1]
70            assert d.requires(extras=('baz',)) == [
71                requires[0],
72                pkg_resources.Requirement.parse('quux>=1.1;extra=="baz"'),
73            ]
74            assert d.extras == ['baz']
75