def test_compatibility_expr(self): expr = VersionExpr('~= 1.0.0') self.assertTrue(expr.eval('1.0.0')) self.assertTrue(expr.eval('1.0.1')) self.assertFalse(expr.eval('1.0.0a1')) self.assertFalse(expr.eval('2.0.0'))
def test_requires(self): self.assertEqual( RequirementSet('foo'), {'foo': {}} ) self.assertEqual( RequirementSet('foo==1'), {'foo': {'version': VersionExpr('==1')}} ) self.assertEqual( RequirementSet('foo:version~=2'), {'foo': {'version': VersionExpr('~=2')}} ) self.assertEqual( RequirementSet('foo:bar'), {'foo': {'bar': None}} ) self.assertEqual( RequirementSet('foo;bar'), {'foo': {}, 'bar': {}} ) self.assertEqual( RequirementSet('foo:version>1,bar>=2;baz<=3'), {'foo': {'version': VersionExpr('>1'), 'bar': VersionExpr('>=2')}, 'baz': {'version': VersionExpr('<=3')}} )
def test_gitrev_expr(self): commits = ('deadbeef', 'deadbeef01234', 'deadbe') for a in commits: expr = VersionExpr(a) for b in commits: self.assertTrue(expr.eval(b)) expr = VersionExpr('deadbeef1') self.assertFalse(expr.eval('deadb')) self.assertFalse(expr.eval('deadbeef2')) self.assertTrue(VersionExpr('986b416').eval('986b4161')) self.assertTrue(VersionExpr('986b416').eval(Version('986b4161')))
def fetch(self): pkg = self.package meta = self._meta() all_releases = [(Version(v), rs) for v, rs in meta['releases'].iteritems()] all_releases.sort(reverse=True) if pkg.revision: expr = VersionExpr(pkg.revision) matching_releases = [(v, rs) for v, rs in all_releases if expr.eval(v)] log.debug( '%s matched %s' % (expr, ','.join(str(v) for v, _ in matching_releases) or 'none')) else: matching_releases = all_releases for version, releases in matching_releases: release = next( (r for r in releases if r['packagetype'] == 'sdist'), None) if release: break else: raise ValueError('no sdist %s %s on the PyPI;' % (self.name, expr if pkg.revision else '(any)')) pkg.revision = str(version) if release.get('md5_digest'): pkg.checksum = 'md5:%s' % release['md5_digest'] pkg.package_name = os.path.join(self.name, os.path.basename(release['url'])) pkg._assert_paths(package=True) if os.path.exists(pkg.package_path): log.info(style_note('Already downloaded', release['url'])) return log.info(style_note('Downloading', release['url'])) download(release['url'], pkg.package_path)
def test_multiple_exprs(self): expr = VersionExpr('>= 1.0.0, < 2.0.0') self.assertTrue(expr.eval('1.0.0')) self.assertTrue(expr.eval('1.0.1')) self.assertFalse(expr.eval('2.0.0')) self.assertFalse(expr.eval('1.0.0a')) self.assertFalse(expr.eval('0.9.0'))
def test_gte_expr(self): # This one has no space as a test of that, since that used to be # a parsing problem. expr = VersionExpr('>=1.0.0') self.assertTrue(expr.eval('1.0.0')) self.assertFalse(expr.eval('1.0.0a1')) self.assertTrue(expr.eval('2')) self.assertTrue(expr.eval('2.0.0'))
def resolve_existing(self, env=None, weak=False): """Check against the database to see if this was already installed.""" if self.id is not None: raise ValueError('requirement already in database') cur = self.home.db.cursor() # Dependencies are deferred. deferred = self.url.startswith('deferred:') if deferred: deferred_id = int(self.url.split(':')[1]) cur.execute('SELECT * from packages WHERE id = ?', [deferred_id]) else: clauses = ['install_path IS NOT NULL'] values = [] if not weak and self.url: clauses.append('url = ?') values.append(self.url) for name in ('name', 'etag', 'install_name'): if getattr(self, name): clauses.append('%s = ?' % name) values.append(getattr(self, name)) clause = ' AND '.join(clauses) # log.debug('SELECT FROM packages WHERE %s' % ' AND '.join('%s = %r' % (c.replace(' = ?', ''), v) for c, v in zip(clauses[1:], values)), verbosity=2) if env: values.append(env.id_or_persist()) cur.execute(''' SELECT packages.*, links.id as link_id FROM packages LEFT OUTER JOIN links ON packages.id = links.package_id WHERE %s AND links.environment_id = ? ORDER BY links.created_at DESC, packages.created_at DESC ''' % clause, values) else: cur.execute(''' SELECT * FROM packages WHERE %s ORDER BY packages.created_at DESC ''' % clause, values) rev_expr = VersionExpr(self.revision) if self.revision else None for row in cur: if rev_expr and row['revision'] and not rev_expr.eval(Version(row['revision'])): log.debug('Found %s (%d) whose revision %s does not satisfy %s' % ( self.name or row['name'], row['id'], row['revision'], rev_expr, ), verbosity=2) continue if not os.path.exists(row['install_path']): log.warning('Found %s (%d) does not exist at %s' % (self.name or row['name'], row['id'], row['install_path'])) continue break else: if deferred: raise ValueError('deferred package %d no longer exists; consider `vee gc`' % deferred_id) return log.debug('Found %s (%d%s%s) at %s' % ( self.name or row['name'], row['id'], ' weakly' if weak else '', ' in env %d' % env.id if env else '', row['install_path'], )) self.restore_from_row(row, ignore=set(('abstract_requirements', 'concrete_requirement'))) self.link_id = row.get('link_id') if deferred: self._init_pipeline() self._load_dependencies(cur) return True
def test_lte_expr(self): expr = VersionExpr('<= 1.0.0') self.assertTrue(expr.eval('1.0.0')) self.assertTrue(expr.eval('1.0.0a1')) self.assertFalse(expr.eval('2'))
def fetch(self, pkg): meta = self._get_meta(pkg) all_releases = [(Version(v), rs) for v, rs in meta['releases'].items()] all_releases.sort(reverse=True) if not all_releases: raise ValueError('no releases of {} (any version) on the PyPI'.format(self.name)) if pkg.version: version_expr = VersionExpr(pkg.version) matching_releases = [(v, rs) for v, rs in all_releases if version_expr.eval(v)] if not matching_releases: for v, rs in all_releases: print(v) raise ValueError('no releases of {} {} on the PyPI'.format(self.name, pkg.version)) else: matching_releases = all_releases supported_tags = get_supported_tags() usable_releases = [] for version, releases in matching_releases: for release in releases: if release['packagetype'] == 'sdist': usable_releases.append((version, 0, release)) continue elif release['packagetype'] == 'bdist_wheel': m = re.match(r'^(.+)-([^-]+)-([^-]+)-([^-]+)-([^-]+)\.whl$', release['filename']) if not m: log.warning("Could not parse wheel filename: {}".format(release['filename'])) name, version_tag, python_tag, abi_tag, platform_tags = m.groups() # Platform tags can have multiple seperated by dots. for platform_tag in platform_tags.split('.'): tags = (python_tag, abi_tag, platform_tag) if tags in supported_tags: break else: continue usable_releases.append((version, 1, release)) if not usable_releases: raise ValueError('no usable release of %s %s on the PyPI;' % (self.name, expr if pkg.version else '(any version)')) usable_releases.sort(key=lambda x: x[:2]) version, _, release = usable_releases[-1] pkg.version = str(version) if release.get('md5_digest'): pkg.checksum = 'md5:%s' % release['md5_digest'] pkg.package_name = os.path.join(self.name, os.path.basename(release['url'])) pkg._assert_paths(package=True) if os.path.exists(pkg.package_path): log.info(style_note('Already downloaded', release['url'])) return log.info(style_note('Downloading', release['url'])) download(release['url'], pkg.package_path)
def __setitem__(self, key, value): self._data[key] = None if value is None else VersionExpr.coerce(value)