def environment(self): """ :raises: EnvironmentFileNotDownloaded """ if self._environment is None: versions = {normalized_version(d['version']): d['version'] for d in self.file_data} latest_version = versions[max(versions)] file_data = [data for data in self.package['files'] if data['version'] == latest_version] req = self.binstar.download(self.username, self.packagename, latest_version, file_data[0]['basename']) if req is None: raise EnvironmentFileNotDownloaded(self.username, self.packagename) self._environment = req.raw.read() return env.from_yaml(self._environment)
def environment(self): """ :raises: EnvironmentFileNotDownloaded """ if self._environment is None: versions = [{ 'normalized': normalized_version(d['version']), 'original': d['version']} for d in self.file_data] latest_version = max(versions, key=lambda x: x['normalized'])['original'] file_data = [data for data in self.package['files'] if data['version'] == latest_version] req = self.binstar.download(self.username, self.packagename, latest_version, file_data[0]['basename']) if req is None: raise EnvironmentFileNotDownloaded(self.username, self.packagename) self._environment = req.raw.read() return env.from_yaml(self._environment)
def environment(self): """ :raises: EnvironmentFileNotDownloaded """ if self._environment is None: versions = [{ 'normalized': normalized_version(d['version']), 'original': d['version']} for d in self.file_data] latest_version = max(versions, key=lambda x: x['normalized'])['original'] file_data = [data for data in self.package['files'] if data['version'] == latest_version] req = self.binstar.download(self.username, self.packagename, latest_version, file_data[0]['basename']) if req is None: raise EnvironmentFileNotDownloaded(self.username, self.packagename) self._environment = req.text return env.from_yaml(self._environment)
def test_version_order(self): versions = [ (VersionOrder("0.4"), [[0], [0], [4]]), (VersionOrder("0.4.0"), [[0], [0], [4], [0]]), (VersionOrder("0.4.1a.vc11"),[[0], [0], [4], [1, 'a'],[0, 'vc', 11]]), (VersionOrder("0.4.1.rc"), [[0], [0], [4], [1], [0, 'rc']]), (VersionOrder("0.4.1.vc11"), [[0], [0], [4], [1],[0, 'vc', 11]]), (VersionOrder("0.4.1"), [[0], [0], [4], [1]]), (VersionOrder("0.5*"), [[0], [0], [5, '*']]), (VersionOrder("0.5a1"), [[0], [0], [5, 'a', 1]]), (VersionOrder("0.5b3"), [[0], [0], [5, 'b', 3]]), (VersionOrder("0.5C1"), [[0], [0], [5, 'c', 1]]), (VersionOrder("0.5z"), [[0], [0], [5, 'z']]), (VersionOrder("0.5za"), [[0], [0], [5, 'za']]), (VersionOrder("0.5"), [[0], [0], [5]]), (VersionOrder("0.9.6"), [[0], [0], [9], [6]]), (VersionOrder("0.960923"), [[0], [0], [960923]]), (VersionOrder("1.0"), [[0], [1], [0]]), (VersionOrder("1.0.4a3"), [[0], [1], [0], [4, 'a', 3]]), (VersionOrder("1.0.4b1"), [[0], [1], [0], [4, 'b', 1]]), (VersionOrder("1.0.4"), [[0], [1], [0], [4]]), (VersionOrder("1.1dev1"), [[0], [1], [1, 'DEV', 1]]), (VersionOrder("1.1a1"), [[0], [1], [1, 'a', 1]]), (VersionOrder("1.1.dev1"), [[0], [1], [1], [0, 'DEV', 1]]), (VersionOrder("1.1.a1"), [[0], [1], [1], [0, 'a', 1]]), (VersionOrder("1.1"), [[0], [1], [1]]), (VersionOrder("1.1.post1"), [[0], [1], [1], [0, float('inf'), 1]]), (VersionOrder("1.1.1dev1"), [[0], [1], [1], [1, 'DEV', 1]]), (VersionOrder("1.1.1rc1"), [[0], [1], [1], [1, 'rc', 1]]), (VersionOrder("1.1.1"), [[0], [1], [1], [1]]), (VersionOrder("1.1.1post1"), [[0], [1], [1], [1, float('inf'), 1]]), (VersionOrder("1.1post1"), [[0], [1], [1, float('inf'), 1]]), (VersionOrder("2g6"), [[0], [2, 'g', 6]]), (VersionOrder("2.0b1pr0"), [[0], [2], [0, 'b', 1, 'pr', 0]]), (VersionOrder("2.2be.ta29"), [[0], [2], [2, 'be'], [0, 'ta', 29]]), (VersionOrder("2.2be5ta29"), [[0], [2], [2, 'be', 5, 'ta', 29]]), (VersionOrder("2.2beta29"), [[0], [2], [2, 'beta', 29]]), (VersionOrder("2.2.0.1"), [[0], [2], [2],[0],[1]]), (VersionOrder("3.1.1.6"), [[0], [3], [1], [1], [6]]), (VersionOrder("3.2.p.r0"), [[0], [3], [2], [0, 'p'], [0, 'r', 0]]), (VersionOrder("3.2.pr0"), [[0], [3], [2], [0, 'pr', 0]]), (VersionOrder("3.2.pr.1"), [[0], [3], [2], [0, 'pr'], [1]]), (VersionOrder("5.5.kw"), [[0], [5], [5], [0, 'kw']]), (VersionOrder("11g"), [[0], [11, 'g']]), (VersionOrder("14.3.1"), [[0], [14], [3], [1]]), (VersionOrder("14.3.1.post26.g9d75ca2"), [[0],[14],[3],[1],[0,float('inf'),26],[0,'g',9,'d',75,'ca',2]]), (VersionOrder("1996.07.12"), [[0], [1996], [7], [12]]), (VersionOrder("1!0.4.1"), [[1], [0], [4], [1]]), (VersionOrder("1!3.1.1.6"), [[1], [3], [1], [1], [6]]), (VersionOrder("2!0.4.1"), [[2], [0], [4], [1]]), ] # check parser for v, l in versions: self.assertEqual(v.version, l) self.assertEqual(VersionOrder("0.4.1.rc"), VersionOrder(" 0.4.1.RC ")) self.assertEqual(normalized_version(" 0.4.1.RC "), VersionOrder("0.4.1.rc")) with self.assertRaises(ValueError): VersionOrder("") with self.assertRaises(ValueError): VersionOrder(" ") with self.assertRaises(ValueError): VersionOrder("5.5++") with self.assertRaises(ValueError): VersionOrder("5.5..mw") with self.assertRaises(ValueError): VersionOrder("5.5.mw.") with self.assertRaises(ValueError): VersionOrder("!") with self.assertRaises(ValueError): VersionOrder("a!1.0") # check __eq__ self.assertEqual(VersionOrder(" 0.4.rc "), VersionOrder("0.4.RC")) self.assertEqual(VersionOrder("0.4"), VersionOrder("0.4.0")) self.assertNotEqual(VersionOrder("0.4"), VersionOrder("0.4.1")) self.assertEqual(VersionOrder("0.4.a1"), VersionOrder("0.4.0a1")) self.assertNotEqual(VersionOrder("0.4.a1"), VersionOrder("0.4.1a1")) # check __lt__ self.assertEqual(sorted(versions, key=lambda x: x[0]), versions) # test openssl convention openssl = [VersionOrder(k) for k in ['1.0.1', '1.0.1post.a', '1.0.1post.b', '1.0.1post.z', '1.0.1post.za', '1.0.2']] self.assertEqual(sorted(openssl), openssl)
def eups_to_conda_version(product, eups_version, giturl): # Convert EUPS version string to Conda-compatible pieces # # Conda version has three parts: # version number: a version number that should be something Conda can parse and order # build string: not used in version comparison, can be anything # build number: if two versions are equal, build number is used to break the tie # # Furthermore, it parses the version itself as described in the VersionOrder object docstring at: # https://github.com/conda/conda/blob/master/conda/resolve.py # We do our best here to fit into that format. # hardcoded for now. This should be incremented on a case-by-case basis to # push fixes that are Conda-build related buildnum = 0 # Split into version + eups build number ("plusver") if '+' in eups_version: raw_version, plusver = eups_version.split('+') plusver = int(plusver) else: raw_version, plusver = eups_version, 0 # Parse EUPS version: # Possibilities to detect: # <vername>-<tagdist>-g<sha1> -> (<vername>.<tagdist>, <plusver>_<sha1>, <buildnum>) # <vername> can be <version>.lsst<N> -> <vername>.<N> # <branch>-g<sha1> -> (<branch>_g<sha1>, <plusver>_<sha1>, <buildnum>) # <something_completely_different> -> (<something_completely_different>, '', <buildnum>) # def parse_full_version(version, giturl): match = re.match('^([^-]+)-([0-9]+)-g([0-9a-z]+)$', version) if not match: return None, None vername, tagdist, sha1 = match.groups() # handle 1.2.3.lsst5 --> 1.2.3.5 fixed_ver, _ = parse_lsst_patchlevel(vername, giturl) if fixed_ver is not None: vername = fixed_ver return "%s.%s" % (vername, tagdist), sha1 def parse_lsst_patchlevel(version, giturl): # handle 1.2.3.lsst5 --> 1.2.3.5 match = re.match(r'^(.*?).?lsst([0-9]+)$', version) if not match: return None, None true_ver, lsst_patch = match.groups() return "%s.%s" % (true_ver, lsst_patch), '' def parse_branch_sha1(version, giturl): match = re.match('^([^-]+)-g([0-9a-z]+)$', version) if not match: return None, None branch, sha1 = match.groups() timestamp = subprocess.check_output([extract_version_path, giturl, sha1]).strip() version = "%s.%s" % (branch, timestamp) return version, sha1 def parse_default(version, giturl): return version, '' parsers = [ parse_full_version, parse_lsst_patchlevel, parse_branch_sha1, parse_default ] for parser in parsers: version, build_string_prefix = parser(raw_version, giturl) if version is not None: break # Heuristic for converting the (unnaturally) large LSST version numbers # to something more apropriate (i.e. 10.* -> 0.10.*, etc.). if re.match(r'^1[0-9]\.[0-9]+.*$', version): version = "0." + version # add plusver to version as .postNNN if plusver: version += ".post%d" % int(plusver) # remove any remaining '-' if '-' in version: version = version.replace('-', '_') # Make sure our version is conda-compatible try: from conda.resolve import normalized_version normalized_version(version) compliant = True except: compliant = False return version, build_string_prefix, buildnum, compliant