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
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
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()
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