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))
 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]
 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]
 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]
 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))
 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]')))
 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]
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
    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
Beispiel #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
Beispiel #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()
Beispiel #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
 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'
 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'
 def test_one_requirement_no_version(self):
     self.requirement_set.add_requirement(
         InstallRequirement('pkg', None))
     self.expected = 'pkg\n'
        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