Пример #1
0
 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)
Пример #2
0
 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)
Пример #3
0
 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)
Пример #4
0
    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)
Пример #5
0
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