Пример #1
0
 def test_mutually_conflicting_constraints(self):
     """Currently, conflicts ignore versions of actual requirements"""
     self.requirement_set.add_requirement(
             InstallRequirement('pkg==1.0.1', None, constraint=True))
     with pytest.raises(InstallationError):
         self.requirement_set.add_requirement(
             InstallRequirement('pkg==1.0.2', None, constraint=True))
Пример #2
0
 def test_conflicting_constraint(self):
     """Currently, constraint versions override requirement versions"""
     self.requirement_set.add_requirement(
             InstallRequirement('pkg==1.0.1', None, constraint=True))
     self.requirement_set.add_requirement(
             InstallRequirement('pkg==1.0.2', None))
     self.expected = ['pkg==1.0.1']
     self.expected_editable = [False]
Пример #3
0
 def test_version_constraint_ignored_after_link_constraint(self):
     """Currently, constraints with versions ignored after ones with links"""
     self.requirement_set.add_requirement(
         InstallRequirement(
             'pkg', None,
             link=Link('git+ssh://git@server/[email protected]'),
             constraint=True))
     self.requirement_set.add_requirement(
         InstallRequirement('pkg==1.0', None, constraint=True))
     self.expected = ['pkg from git+ssh://git@server/[email protected]']
     self.expected_editable = [False]
Пример #4
0
 def test_constraint_git_link_override(self):
     """Constraint links override requirements with no link"""
     self.requirement_set.add_requirement(
         InstallRequirement(
             'pkg', None,
             link=Link('git+ssh://git@server/[email protected]'),
             constraint=True))
     self.requirement_set.add_requirement(
         InstallRequirement('pkg==1.0.2', None))
     self.expected = ['pkg from git+ssh://git@server/[email protected]']
     self.expected_editable = [False]
Пример #5
0
 def test_editable_requirement_conflict(self):
     """An non-editable constraint for an editable requirement fails"""
     self.requirement_set.add_requirement(
         InstallRequirement(
             'pkg==1.0.1', None,
             constraint=True))
     with pytest.raises(InstallationError):
         self.requirement_set.add_requirement(
             InstallRequirement(
                 'pkg', None,
                 editable=True))
Пример #6
0
 def test_requirement_link_and_constraint_link_conflict(self):
     """Currently, requirement/constraint link conflicts are unresolved"""
     self.requirement_set.add_requirement(
         InstallRequirement(
             'pkg', None,
             link=Link('git+ssh://git@server/[email protected]'),
             constraint=True))
     with pytest.raises(InstallationError):
         self.requirement_set.add_requirement(
             InstallRequirement(
                 'pkg', None,
                 link=Link('git+ssh://git@server/[email protected]')))
Пример #7
0
 def test_editable_constraint(self):
     """An editable constraint overrides a non-editable requirement"""
     self.requirement_set.add_requirement(
         InstallRequirement(
             'pkg==1.0.1', None,
             editable=True,
             constraint=True))
     self.requirement_set.add_requirement(
         InstallRequirement(
             'pkg', None))
     self.expected = ['pkg==1.0.1']
     self.expected_editable = [True]
Пример #8
0
def test_pip_compile_requirement_set(allow_double, constraints, expect):
    requirement_set = pip_compile.PipCompileRequirementSet(
        None, None, None, session='dummy', allow_double=allow_double)
    for constraint in constraints:
        requirement_set.add_requirement(constraint)
    requirement_set.add_requirement(
        InstallRequirement('pkg==1.0.1', 'parent1', constraint=False))

    if type(expect) is type:
        check_exception = pytest.raises(expect)
    else:
        def does_not_raise():
            yield None
        check_exception = contextmanager(does_not_raise)()

    with check_exception as exc_info:
        requirement_set.add_requirement(
            InstallRequirement('pkg==1.0.2', 'parent2', constraint=False))
    if not exc_info:
        assert [str(req) for req in requirement_set.requirements.values()] \
               == expect
Пример #9
0
    def make_install_req(ver=None):
        req = Mock()
        req.project_name = test_project_name
        if ver:
            req.url = url_template % str(ver)
            req.specs = [('==', ver)]
        else:
            req.url = url_template.replace('@', '') % ''
            req.specs = []

        install_requirement = InstallRequirement(req,
                                                 None,
                                                 editable=True,
                                                 url=req.url)

        return install_requirement
Пример #10
0
def trace_requirements(requirements):
    """given an iterable of pip InstallRequirements,
    return the set of required packages, given their transitive requirements.
    """
    from collections import deque
    from pip import logger
    from pip.req import InstallRequirement
    from pip._vendor import pkg_resources

    working_set = fresh_working_set()

    # breadth-first traversal:
    errors = False
    queue = deque(requirements)
    result = []
    seen_warnings = set()
    while queue:
        req = queue.popleft()
        if req.req is None:
            # a file:/// requirement
            continue

        try:
            dist = working_set.find(req.req)
        except pkg_resources.VersionConflict as conflict:
            dist = conflict.args[0]
            if req.name not in seen_warnings:
                logger.error("Error: version conflict: %s <-> %s" %
                             (dist, req))
                errors = True
                seen_warnings.add(req.name)

        if dist is None:
            logger.error('Error: unmet dependency: %s' % req)
            errors = True
            continue

        result.append(dist_to_req(dist))

        for dist_req in sorted(dist.requires(), key=lambda req: req.key):
            # there really shouldn't be any circular dependencies...
            queue.append(InstallRequirement(dist_req, str(req)))

    if errors:
        exit(1)

    return result
Пример #11
0
def requirement_line(r, download_to, abs_download_to):
    if isinstance(r.link, Link):
        req = r.req if pip_version > (10, ) else r
        ir = InstallRequirement(req=req,
                                link=r.link,
                                comes_from=None,
                                markers=True,
                                editable=True)
        assert r.name, "Package name not provided for %s" % r.link
        s = '{}/{}/'.format(download_to, ir.name.lower())
        ir.source_dir = '{}/{}'.format(abs_download_to, ir.name.lower())
        ir.update_editable(obtain=False)
    else:
        assert isinstance(r.req, Requirement), r.req.__class__
        s = '%-30s' % str(r.req)
        for hash_type, hashes in r.options.get('hashes', {}).items():
            for h in hashes:
                s += ' --hash={}:{}'.format(hash_type, h)
    return s.strip()
Пример #12
0
def get_latest_version(package_name=None):
    if not package_name:
        config.check('PROJECT')
        package_name = env.PROJECT

    # 这里直接使用了package finder,而非search command,
    # 是因为pypiserver不支持pip search
    from pip.index import PackageFinder
    from pip.req import InstallRequirement
    finder = PackageFinder(find_links=[], index_urls=[env.PYPI_INDEX])
    req = InstallRequirement(req=package_name, comes_from=None)
    try:
        url = finder.find_requirement(req, upgrade=True)
    except DistributionNotFound:
        print '尚无任何版本!'
        return None
    filename = url.splitext()[0]
    version = re.search(r'(\d+\.?)+', filename)
    version = version.group() if version else None

    print '当前版本: %s' % version
    return version
Пример #13
0
 def test_one_requirement_with_constraint(self):
     self.requirement_set.add_requirement(
         InstallRequirement('pkg==1.0.1', None, constraint=True))
     self.requirement_set.add_requirement(
         InstallRequirement('pkg==1.0.2-ignored', None))
     self.expected = 'pkg==1.0.1\n'
Пример #14
0
 def test_one_requirement_with_version(self):
     self.requirement_set.add_requirement(
         InstallRequirement('pkg==1.0.1', None))
     self.expected = 'pkg==1.0.1\n'
Пример #15
0
 def test_one_requirement_no_version(self):
     self.requirement_set.add_requirement(
         InstallRequirement('pkg', None))
     self.expected = 'pkg\n'
Пример #16
0
        self.requirement_set.add_requirement(
            InstallRequirement(
                'pkg==1.0.1', None,
                editable=True,
                constraint=True))
        self.requirement_set.add_requirement(
            InstallRequirement(
                'pkg', None))
        self.expected = ['pkg==1.0.1']
        self.expected_editable = [True]


@pytest.mark.parametrize('allow_double,constraints,expect', [
    (False, [], InstallationError),
    (True, [], ['pkg==1.0.1 (from parent1)']),
    (False, [InstallRequirement('pkg==1.0.0', 'constraint_parent', constraint=True)], InstallationError),
    (True, [InstallRequirement('pkg==1.0.0', 'constraint_parent', constraint=True)], ['pkg==1.0.0 (from parent1)']),
])
def test_pip_compile_requirement_set(allow_double, constraints, expect):
    requirement_set = pip_compile.PipCompileRequirementSet(
        None, None, None, session='dummy', allow_double=allow_double)
    for constraint in constraints:
        requirement_set.add_requirement(constraint)
    requirement_set.add_requirement(
        InstallRequirement('pkg==1.0.1', 'parent1', constraint=False))

    if type(expect) is type:
        check_exception = pytest.raises(expect)
    else:
        def does_not_raise():
            yield None