Exemple #1
0
 def test_create__target_python_none(self):
     """
     Test passing target_python=None.
     """
     evaluator = CandidateEvaluator.create('my-project')
     expected_tags = get_supported()
     assert evaluator._supported_tags == expected_tags
Exemple #2
0
 def test_create__specifier_none(self):
     """
     Test passing specifier=None.
     """
     evaluator = CandidateEvaluator.create('my-project')
     expected_specifier = SpecifierSet()
     assert evaluator._specifier == expected_specifier
Exemple #3
0
 def test_sort_best_candidate__no_candidates(self):
     """
     Test passing an empty list.
     """
     evaluator = CandidateEvaluator.create('my-project')
     actual = evaluator.sort_best_candidate([])
     assert actual is None
Exemple #4
0
 def test_get_applicable_candidates__hashes(
     self,
     specifier,
     expected_versions,
 ):
     """
     Test a non-None hashes value.
     """
     candidates = [
         make_mock_candidate('1.0'),
         make_mock_candidate('1.1', hex_digest=(64 * 'a')),
         make_mock_candidate('1.2', hex_digest=(64 * 'b')),
     ]
     hashes_data = {
         'sha256': [64 * 'b'],
     }
     hashes = Hashes(hashes_data)
     evaluator = CandidateEvaluator.create(
         'my-project',
         specifier=specifier,
         hashes=hashes,
     )
     actual = evaluator.get_applicable_candidates(candidates)
     actual_versions = [str(c.version) for c in actual]
     assert actual_versions == expected_versions
Exemple #5
0
    def test_sort_best_candidate__all_yanked(self, caplog):
        """
        Test all candidates yanked.
        """
        candidates = [
            make_mock_candidate('1.0', yanked_reason='bad metadata #1'),
            # Put the best candidate in the middle, to test sorting.
            make_mock_candidate('3.0', yanked_reason='bad metadata #3'),
            make_mock_candidate('2.0', yanked_reason='bad metadata #2'),
        ]
        expected_best = candidates[1]
        evaluator = CandidateEvaluator.create('my-project')
        actual = evaluator.sort_best_candidate(candidates)
        assert actual is expected_best
        assert str(actual.version) == '3.0'

        # Check the log messages.
        assert len(caplog.records) == 1
        record = caplog.records[0]
        assert record.levelname == 'WARNING'
        assert record.message == (
            'The candidate selected for download or install is a yanked '
            "version: 'mypackage' candidate "
            '(version 3.0 at https://example.com/pkg-3.0.tar.gz)\n'
            'Reason for being yanked: bad metadata #3')
Exemple #6
0
 def test_get_best_candidate__no_candidates(self):
     """
     Test passing an empty list.
     """
     evaluator = CandidateEvaluator.create()
     actual = evaluator.get_best_candidate([])
     assert actual is None
Exemple #7
0
    def test_sort_best_candidate__yanked_reason(
        self,
        caplog,
        yanked_reason,
        expected_reason,
    ):
        """
        Test the log message with various reason strings.
        """
        candidates = [
            make_mock_candidate('1.0', yanked_reason=yanked_reason),
        ]
        evaluator = CandidateEvaluator.create('my-project')
        actual = evaluator.sort_best_candidate(candidates)
        assert str(actual.version) == '1.0'

        assert len(caplog.records) == 1
        record = caplog.records[0]
        assert record.levelname == 'WARNING'
        expected_message = (
            'The candidate selected for download or install is a yanked '
            "version: 'mypackage' candidate "
            '(version 1.0 at https://example.com/pkg-1.0.tar.gz)\n'
            'Reason for being yanked: ') + expected_reason
        assert record.message == expected_message
Exemple #8
0
 def test_sort_key__is_yanked(self, yanked_reason, expected):
     """
     Test the effect of is_yanked on _sort_key()'s return value.
     """
     candidate = make_mock_candidate('1.0', yanked_reason=yanked_reason)
     evaluator = CandidateEvaluator.create('my-project')
     sort_value = evaluator._sort_key(candidate)
     # Yanked / non-yanked is reflected in the second element of the tuple.
     actual = sort_value[1]
     assert actual == expected
Exemple #9
0
 def test_create(self, allow_all_prereleases, prefer_binary):
     target_python = TargetPython()
     target_python._valid_tags = [('py36', 'none', 'any')]
     evaluator = CandidateEvaluator.create(
         target_python=target_python,
         allow_all_prereleases=allow_all_prereleases,
         prefer_binary=prefer_binary,
     )
     assert evaluator._allow_all_prereleases == allow_all_prereleases
     assert evaluator._prefer_binary == prefer_binary
     assert evaluator._supported_tags == [('py36', 'none', 'any')]
Exemple #10
0
    def test_sort_key__is_yanked(self, yanked_reason, expected):
        """
        Test the effect of is_yanked on _sort_key()'s return value.
        """
        url = 'https://example.com/mypackage.tar.gz'
        link = Link(url, yanked_reason=yanked_reason)
        candidate = InstallationCandidate('mypackage', '1.0', link)

        evaluator = CandidateEvaluator.create()
        sort_value = evaluator._sort_key(candidate)
        # Yanked / non-yanked is reflected in the first element of the tuple.
        actual = sort_value[0]
        assert actual == expected
Exemple #11
0
 def test_sort_key__hash(self, hex_digest, expected):
     """
     Test the effect of the link's hash on _sort_key()'s return value.
     """
     candidate = make_mock_candidate('1.0', hex_digest=hex_digest)
     hashes_data = {
         'sha256': [64 * 'a'],
     }
     hashes = Hashes(hashes_data)
     evaluator = CandidateEvaluator.create('my-project', hashes=hashes)
     sort_value = evaluator._sort_key(candidate)
     # The hash is reflected in the first element of the tuple.
     actual = sort_value[0]
     assert actual == expected
Exemple #12
0
 def test_get_applicable_candidates(self):
     specifier = SpecifierSet('<= 1.11')
     versions = ['1.10', '1.11', '1.12']
     candidates = [make_mock_candidate(version) for version in versions]
     evaluator = CandidateEvaluator.create(
         'my-project',
         specifier=specifier,
     )
     actual = evaluator.get_applicable_candidates(candidates)
     expected_applicable = candidates[:2]
     assert [str(c.version) for c in expected_applicable] == [
         '1.10',
         '1.11',
     ]
     assert actual == expected_applicable
Exemple #13
0
 def test_create(self, allow_all_prereleases, prefer_binary):
     target_python = TargetPython()
     target_python._valid_tags = [('py36', 'none', 'any')]
     specifier = SpecifierSet()
     evaluator = CandidateEvaluator.create(
         project_name='my-project',
         target_python=target_python,
         allow_all_prereleases=allow_all_prereleases,
         prefer_binary=prefer_binary,
         specifier=specifier,
     )
     assert evaluator._allow_all_prereleases == allow_all_prereleases
     assert evaluator._prefer_binary == prefer_binary
     assert evaluator._specifier is specifier
     assert evaluator._supported_tags == [('py36', 'none', 'any')]
Exemple #14
0
    def test_compute_best_candidate__none_best(self):
        """
        Test returning a None best candidate.
        """
        specifier = SpecifierSet('<= 1.10')
        versions = ['1.11', '1.12']
        candidates = [make_mock_candidate(version) for version in versions]
        evaluator = CandidateEvaluator.create(
            'my-project',
            specifier=specifier,
        )
        result = evaluator.compute_best_candidate(candidates)

        assert result._candidates == candidates
        assert result._applicable_candidates == []
        assert result.best_candidate is None
Exemple #15
0
    def test_make_found_candidates(self):
        specifier = SpecifierSet('<= 1.11')
        versions = ['1.10', '1.11', '1.12']
        candidates = [make_mock_candidate(version) for version in versions]
        evaluator = CandidateEvaluator.create('my-project')
        found_candidates = evaluator.make_found_candidates(
            candidates,
            specifier=specifier,
        )

        assert found_candidates._candidates == candidates
        assert found_candidates._evaluator is evaluator
        expected_applicable = candidates[:2]
        assert [str(c.version) for c in expected_applicable] == [
            '1.10',
            '1.11',
        ]
        assert found_candidates._applicable_candidates == expected_applicable
Exemple #16
0
    def test_get_best_candidate__best_yanked_but_not_all(self, caplog):
        """
        Test the best candidates being yanked, but not all.
        """
        candidates = [
            make_mock_candidate('4.0', yanked_reason='bad metadata #4'),
            # Put the best candidate in the middle, to test sorting.
            make_mock_candidate('2.0'),
            make_mock_candidate('3.0', yanked_reason='bad metadata #3'),
            make_mock_candidate('1.0'),
        ]
        expected_best = candidates[1]
        evaluator = CandidateEvaluator.create('my-project')
        actual = evaluator.get_best_candidate(candidates)
        assert actual is expected_best
        assert str(actual.version) == '2.0'

        # Check the log messages.
        assert len(caplog.records) == 0
Exemple #17
0
    def test_compute_best_candidate(self):
        specifier = SpecifierSet('<= 1.11')
        versions = ['1.10', '1.11', '1.12']
        candidates = [make_mock_candidate(version) for version in versions]
        evaluator = CandidateEvaluator.create(
            'my-project',
            specifier=specifier,
        )
        result = evaluator.compute_best_candidate(candidates)

        assert result._candidates == candidates
        expected_applicable = candidates[:2]
        assert [str(c.version) for c in expected_applicable] == [
            '1.10',
            '1.11',
        ]
        assert result._applicable_candidates == expected_applicable

        assert result.best_candidate is expected_applicable[1]
Exemple #18
0
 def test_link_sorting_wheels_with_build_tags(self):
     """Verify build tags affect sorting."""
     links = [
         InstallationCandidate(
             "simplewheel",
             "2.0",
             Link("simplewheel-2.0-1-py2.py3-none-any.whl"),
         ),
         InstallationCandidate(
             "simplewheel",
             "2.0",
             Link("simplewheel-2.0-py2.py3-none-any.whl"),
         ),
         InstallationCandidate(
             "simplewheel",
             "1.0",
             Link("simplewheel-1.0-py2.py3-none-any.whl"),
         ),
     ]
     candidate_evaluator = CandidateEvaluator.create('my-project')
     sort_key = candidate_evaluator._sort_key
     results = sorted(links, key=sort_key, reverse=True)
     results2 = sorted(reversed(links), key=sort_key, reverse=True)
     assert links == results == results2, results2