diff --git a/Lib/packaging/manifest.py b/Lib/packaging/manifest.py --- a/Lib/packaging/manifest.py +++ b/Lib/packaging/manifest.py @@ -366,10 +366,8 @@ def _translate_pattern(pattern, anchor=T # ditch end of pattern character empty_pattern = _glob_to_re('') prefix_re = _glob_to_re(prefix)[:-len(empty_pattern)] - # match both path separators, as in Postel's principle - sep_pat = "[" + re.escape(os.path.sep + os.path.altsep - if os.path.altsep else os.path.sep) + "]" - pattern_re = "^" + sep_pat.join([prefix_re, ".*" + pattern_re]) + # don't use os.path.join here, as Windows' os.sep is a regex metachar + pattern_re = "^%s/.*%s" % (prefix_re, pattern_re) else: # no prefix -- respect anchor flag if anchor: pattern_re = "^" + pattern_re diff --git a/Lib/packaging/tests/test_version.py b/Lib/packaging/tests/test_version.py --- a/Lib/packaging/tests/test_version.py +++ b/Lib/packaging/tests/test_version.py @@ -1,56 +1,40 @@ """Tests for packaging.version.""" -import doctest - -from packaging.version import NormalizedVersion as V +from packaging.version import NormalizedVersion as V, VersionPredicate from packaging.version import HugeMajorVersionNumError, IrrationalVersionError from packaging.version import suggest_normalized_version as suggest -from packaging.version import VersionPredicate from packaging.tests import unittest class VersionTestCase(unittest.TestCase): - versions = ((V('1.0'), '1.0'), - (V('1.1'), '1.1'), - (V('1.2.3'), '1.2.3'), - (V('1.2'), '1.2'), - (V('1.2.3a4'), '1.2.3a4'), - (V('1.2c4'), '1.2c4'), - (V('1.2.3.4'), '1.2.3.4'), - (V('1.2.3.4.0b3'), '1.2.3.4b3'), - (V('1.2.0.0.0'), '1.2'), - (V('1.0.dev345'), '1.0.dev345'), - (V('1.0.post456.dev623'), '1.0.post456.dev623')) + maxDiff = None + versions = [(V(s), s) for s in + ('1.0', '1.1', '1.2.3', '1.2', '1.2.3a4', '1.2c4', '1.2.3.4', + '1.2.3.4b3', '1.2', '1.0.dev345', '1.0.post456.dev623')] def test_repr(self): + self.assertIn('1.0.post4.dev6', repr(V('1.0.post4.dev6'))) - self.assertEqual(repr(V('1.0')), "NormalizedVersion('1.0')") - - def test_basic_versions(self): - + def test_str(self): for v, s in self.versions: self.assertEqual(str(v), s) def test_hash(self): + self.assertEqual(set([V('1.0')]), set([V('1.0'), V('1.0.0')])) + # XXX need PEP edition + #self.assertEqual(set([V('1.0c1')]), set([V('1.0c1'), V('1.0.0rc1')])) + versions = [v for v, s in self.versions] for v, s in self.versions: self.assertEqual(hash(v), hash(V(s))) - - versions = set([v for v, s in self.versions]) - for v, s in self.versions: self.assertIn(v, versions) - self.assertEqual(set([V('1.0')]), set([V('1.0'), V('1.0')])) - def test_from_parts(self): - for v, s in self.versions: v2 = V.from_parts(*v.parts) self.assertEqual(v, v2) - self.assertEqual(str(v), str(v2)) def test_irrational_versions(self): - irrational = ('1', '1.2a', '1.2.3b', '1.02', '1.2a03', '1.2a3.04', '1.2.dev.2', '1.2dev', '1.2.dev', '1.2.dev2.post2', '1.2.post2.dev3.post4') @@ -59,34 +43,20 @@ class VersionTestCase(unittest.TestCase) self.assertRaises(IrrationalVersionError, V, s) def test_huge_version(self): - self.assertEqual(str(V('1980.0')), '1980.0') self.assertRaises(HugeMajorVersionNumError, V, '1981.0') - self.assertEqual(str(V('1981.0', error_on_huge_major_num=False)), - '1981.0') + V('1981.0', error_on_huge_major_num=False) def test_comparison(self): - comparison_doctest_string = r""" - >>> V('1.2.0') == '1.2' - Traceback (most recent call last): - ... - TypeError: cannot compare NormalizedVersion and str - - >>> V('1.2') < '1.3' - Traceback (most recent call last): - ... - TypeError: cannot compare NormalizedVersion and str - - >>> V('1.2.0') == V('1.2') - True - >>> V('1.2.0') == V('1.2.3') - False - >>> V('1.2.0') != V('1.2.3') - True - >>> V('1.2.0') < V('1.2.3') - True - >>> V('1.2.0') < V('1.2.0') - False + self.assertRaises(TypeError, V('1.2.0').__eq__, '1.2') + self.assertRaises(TypeError, V('1.2').__lt__, '1.3') + self.assertRaises(TypeError, sorted, [V('1.2.0'), '1.2']) + self.assertEqual(V('1.2.0'), V('1.2.0')) + self.assertEqual(V('1.2.0'), V('1.2')) + #self.assertEqual(V('1.2rc4'), V('1.2c4')) # XXX need PEP edition + self.assertNotEqual(V('1.2.0'), V('1.2.3')) + self.assertLess(V('1.2.0'), V('1.2.3')) + """ >>> V('1.2.0') <= V('1.2.0') True >>> V('1.2.0') <= V('1.2.3') @@ -123,31 +93,33 @@ class VersionTestCase(unittest.TestCase) >>> V('1.0.post456.dev623') < V('1.0.post456') < V('1.0.post1234') True - - >>> (V('1.0a1') - ... < V('1.0a2.dev456') - ... < V('1.0a2') - ... < V('1.0a2.1.dev456') # e.g. need to do a quick post release on 1.0a2 - ... < V('1.0a2.1') - ... < V('1.0b1.dev456') - ... < V('1.0b2') - ... < V('1.0c1.dev456') - ... < V('1.0c1') - ... < V('1.0.dev7') - ... < V('1.0.dev18') - ... < V('1.0.dev456') - ... < V('1.0.dev1234') - ... < V('1.0rc1') - ... < V('1.0rc2') - ... < V('1.0') - ... < V('1.0.post456.dev623') # development version of a post release - ... < V('1.0.post456')) - True """ - doctest.script_from_examples(comparison_doctest_string) + sorted_versions = [V('1.0a1'), + V('1.0a2.dev456'), + V('1.0a2'), + V('1.0a2.1.dev456'), # e.g. need to do a quick post release on 1.0a2 + V('1.0a2.1'), + V('1.0b1.dev456'), + V('1.0b2'), + V('1.0c1.dev456'), + V('1.0c1'), + #V('1.0rc1'), # FIXME PEP says rc sorts after c but + # rc1 really should equal c1 + #V('1.0rc2'), + #V('1.0c4'); + #V('1.0rc5'); + #V('1.0c6'); + V('1.0.dev7'), + V('1.0.dev18'), + V('1.0.dev456'), + V('1.0.dev1234'), + V('1.0'), + V('1.0.post456.dev623'), # development version of a post release + V('1.0.post456'), + ] + self.assertEqual(sorted(sorted_versions), sorted_versions) def test_suggest_normalized_version(self): - self.assertEqual(suggest('1.0'), '1.0') self.assertEqual(suggest('1.0-alpha1'), '1.0a1') self.assertEqual(suggest('1.0c2'), '1.0c2') @@ -180,9 +152,7 @@ class VersionTestCase(unittest.TestCase) def test_predicate(self): # VersionPredicate knows how to parse stuff like: - # # Project (>=version, ver2) - predicates = ('zope.interface (>3.5.0)', 'AnotherProject (3.4)', 'OtherProject (<3.0)', @@ -192,6 +162,7 @@ class VersionTestCase(unittest.TestCase) for predicate in predicates: VersionPredicate(predicate) + # TODO assertMatches, assertDoesntMatches self.assertTrue(VersionPredicate('Hey (>=2.5,<2.7)').match('2.6')) self.assertTrue(VersionPredicate('Ho').match('2.6')) self.assertFalse(VersionPredicate('Hey (>=2.5,!=2.6,<2.7)').match('2.6')) @@ -225,7 +196,6 @@ class VersionTestCase(unittest.TestCase) def test_predicate_name(self): # Test that names are parsed the right way - self.assertEqual('Hey', VersionPredicate('Hey (<1.1)').name) self.assertEqual('Foo-Bar', VersionPredicate('Foo-Bar (1.1)').name) self.assertEqual('Foo Bar', VersionPredicate('Foo Bar (1.1)').name) @@ -252,8 +222,6 @@ class VersionWhiteBoxTestCase(unittest.T def test_suite(): - #README = os.path.join(os.path.dirname(__file__), 'README.txt') - #suite = [doctest.DocFileSuite(README), unittest.makeSuite(VersionTestCase)] suite = [unittest.makeSuite(VersionTestCase), unittest.makeSuite(VersionWhiteBoxTestCase)] return unittest.TestSuite(suite)