def test_invalid(self): data = [ 'blerg', 'git+https://user:[email protected]/foo', '>=1 a', '? >=1', ] for pattern in data: with self.assertRaises(ValueError, msg='Pattern should be invalid %s' % pattern): Range(pattern, loose=True)
def test_loose_ranges(self): data = [ ['>01.02.03', '>1.2.3'], ['~1.2.3beta', '>=1.2.3-beta <1.3.0'], ] for pattern, expanded in data: pattern = Range(pattern, loose=True) result = '||'.join(comparator.desc for comparator in pattern.ranges) self.assertEqual(result, expanded, msg='%s should expand to %s' % (pattern, expanded))
def test_loose_range_non_matches(self): data = [ ['1', '1.0.0beta'], ['<1', '1.0.0beta'], ['< 1', '1.0.0beta'], ['>=0.1.97', 'v0.1.93'], ['1', '2.0.0beta'], ['*', 'v1.2.3-foo'], # node's semver doesn't consider these a loose range: ['~v0.5.4-beta', '0.5.4-alpha'], ] for pattern, version in data: pattern = Range(pattern, loose=True) self.assertNotIn(version, pattern, msg='%s should not be in %s' % (version, pattern))
def test_loose_range_matches(self): data = [ ['1.2.3pre+asdf - 2.4.3-pre+asdf', '1.2.3'], ['1.2.3-pre+asdf - 2.4.3pre+asdf', '1.2.3'], ['1.2.3pre+asdf - 2.4.3pre+asdf', '1.2.3'], ['*', 'v1.2.3'], ['>=0.1.97', 'v0.1.97'], # node's semver doesn't consider these a loose range: ['~v0.5.4-pre', '0.5.5'], ['~v0.5.4-pre', '0.5.4'], ] for pattern, version in data: pattern = Range(pattern, loose=True) self.assertIn(version, pattern, msg='%s should be in %s' % (version, pattern))
def test_max_satisfying(self): data = [ [['1.2.3', '1.2.4'], '1.2', '1.2.4'], [['1.2.4', '1.2.3'], '1.2', '1.2.4'], [['1.2.3', '1.2.4', '1.2.5', '1.2.6'], '~1.2.3', '1.2.6'], ] for versions, pattern, expected in data: pattern = Range(pattern) self.assertEqual(pattern.highest_version(versions), expected) data = [ [[ '1.1.0', '1.2.0', '1.2.1', '1.3.0', '2.0.0b1', '2.0.0b2', '2.0.0b3', '2.0.0', '2.1.0' ], '~2.0.0', '2.0.0'], ] for versions, pattern, expected in data: pattern = Range(pattern, loose=True) self.assertEqual(pattern.highest_version(versions), expected)
def test_range_non_matches(self): data = [ ['1.0.0 - 2.0.0', '2.2.3'], ['1.2.3+asdf - 2.4.3+asdf', '1.2.3-pre.2'], ['1.2.3+asdf - 2.4.3+asdf', '2.4.3-alpha'], ['^1.2.3+build', '2.0.0'], ['^1.2.3+build', '1.2.0'], ['^1.2.3', '1.2.3-pre'], ['^1.2', '1.2.0-pre'], ['>1.2', '1.3.0-beta'], ['<=1.2.3', '1.2.3-beta'], ['^1.2.3', '1.2.3-beta'], ['=0.7.x', '0.7.0-asdf'], ['>=0.7.x', '0.7.0-asdf'], ['1.0.0', '1.0.1'], ['>=1.0.0', '0.0.0'], ['>=1.0.0', '0.0.1'], ['>=1.0.0', '0.1.0'], ['>1.0.0', '0.0.1'], ['>1.0.0', '0.1.0'], ['<=2.0.0', '3.0.0'], ['<=2.0.0', '2.9999.9999'], ['<=2.0.0', '2.2.9'], ['<2.0.0', '2.9999.9999'], ['<2.0.0', '2.2.9'], ['>=0.1.97', '0.1.93'], ['0.1.20 || 1.2.4', '1.2.3'], ['>=0.2.3 || <0.0.1', '0.0.3'], ['>=0.2.3 || <0.0.1', '0.2.2'], ['2.x.x', '1.1.3'], ['2.x.x', '3.1.3'], ['1.2.x', '1.3.3'], ['1.2.x || 2.x', '3.1.3'], ['1.2.x || 2.x', '1.1.3'], ['2.*.*', '1.1.3'], ['2.*.*', '3.1.3'], ['1.2.*', '1.3.3'], ['1.2.* || 2.*', '3.1.3'], ['1.2.* || 2.*', '1.1.3'], ['2', '1.1.2'], ['2.3', '2.4.1'], ['~2.4', '2.5.0'], # >= 2.4.0 < 2.5.0 ['~2.4', '2.3.9'], ['~>3.2.1', '3.3.2'], # >= 3.2.1 < 3.3.0 ['~>3.2.1', '3.2.0'], # >= 3.2.1 < 3.3.0 ['~1', '0.2.3'], # >= 1.0.0 < 2.0.0 ['~>1', '2.2.3'], ['~1.0', '1.1.0'], # >= 1.0.0 < 1.1.0 ['<1', '1.0.0'], ['>=1.2', '1.1.1'], ['=0.7.x', '0.8.2'], ['>=0.7.x', '0.6.2'], ['<0.7.x', '0.7.2'], ['<1.2.3', '1.2.3-beta'], ['=1.2.3', '1.2.3-beta'], ['>1.2', '1.2.8'], ['^1.2.3', '2.0.0-alpha'], ['^1.2.3', '1.2.2'], ['^1.2', '1.1.9'], ['^1.2.3', '2.0.0-pre'], ] for pattern, version in data: pattern = Range(pattern) self.assertNotIn(version, pattern, msg='%s should not be in %s' % (version, pattern))
def test_range_matches(self): data = [ ['1.0.0 - 2.0.0', '1.2.3'], ['^1.2.3+build', '1.2.3'], ['^1.2.3+build', '1.3.0'], ['1.2.3-pre+asdf - 2.4.3-pre+asdf', '1.2.3'], ['1.2.3-pre+asdf - 2.4.3-pre+asdf', '1.2.3-pre.2'], ['1.2.3-pre+asdf - 2.4.3-pre+asdf', '2.4.3-alpha'], ['1.2.3+asdf - 2.4.3+asdf', '1.2.3'], ['1.0.0', '1.0.0'], ['>=*', '0.2.4'], ['', '1.0.0'], ['*', '1.2.3'], ['>=1.0.0', '1.0.0'], ['>=1.0.0', '1.0.1'], ['>=1.0.0', '1.1.0'], ['>1.0.0', '1.0.1'], ['>1.0.0', '1.1.0'], ['<=2.0.0', '2.0.0'], ['<=2.0.0', '1.9999.9999'], ['<=2.0.0', '0.2.9'], ['<2.0.0', '1.9999.9999'], ['<2.0.0', '0.2.9'], ['>= 1.0.0', '1.0.0'], ['>= 1.0.0', '1.0.1'], ['>= 1.0.0', '1.1.0'], ['> 1.0.0', '1.0.1'], ['> 1.0.0', '1.1.0'], ['<= 2.0.0', '2.0.0'], ['<= 2.0.0', '1.9999.9999'], ['<= 2.0.0', '0.2.9'], ['< 2.0.0', '1.9999.9999'], ['<\t2.0.0', '0.2.9'], ['>=0.1.97', '0.1.97'], ['0.1.20 || 1.2.4', '1.2.4'], ['>=0.2.3 || <0.0.1', '0.0.0'], ['>=0.2.3 || <0.0.1', '0.2.3'], ['>=0.2.3 || <0.0.1', '0.2.4'], ['||', '1.3.4'], ['2.x.x', '2.1.3'], ['1.2.x', '1.2.3'], ['1.2.x || 2.x', '2.1.3'], ['1.2.x || 2.x', '1.2.3'], ['x', '1.2.3'], ['2.*.*', '2.1.3'], ['1.2.*', '1.2.3'], ['1.2.* || 2.*', '2.1.3'], ['1.2.* || 2.*', '1.2.3'], ['*', '1.2.3'], ['2', '2.1.2'], ['2.3', '2.3.1'], ['~2.4', '2.4.0'], # >=2.4.0 <2.5.0 ['~2.4', '2.4.5'], ['~>3.2.1', '3.2.2'], # >=3.2.1 <3.3.0, ['~1', '1.2.3'], # >=1.0.0 <2.0.0 ['~>1', '1.2.3'], ['~> 1', '1.2.3'], ['~1.0', '1.0.2'], # >=1.0.0 <1.1.0, ['~ 1.0', '1.0.2'], ['~ 1.0.3', '1.0.12'], ['>=1', '1.0.0'], ['>= 1', '1.0.0'], ['<1.2', '1.1.1'], ['< 1.2', '1.1.1'], ['=0.7.x', '0.7.2'], ['<=0.7.x', '0.7.2'], ['>=0.7.x', '0.7.2'], ['<=0.7.x', '0.6.2'], ['~1.2.1 >=1.2.3', '1.2.3'], ['~1.2.1 =1.2.3', '1.2.3'], ['~1.2.1 1.2.3', '1.2.3'], ['~1.2.1 >=1.2.3 1.2.3', '1.2.3'], ['~1.2.1 1.2.3 >=1.2.3', '1.2.3'], ['~1.2.1 1.2.3', '1.2.3'], ['>=1.2.1 1.2.3', '1.2.3'], ['1.2.3 >=1.2.1', '1.2.3'], ['>=1.2.3 >=1.2.1', '1.2.3'], ['>=1.2.1 >=1.2.3', '1.2.3'], ['>=1.2', '1.2.8'], ['^1.2.3', '1.8.1'], ['^0.1.2', '0.1.2'], ['^0.1', '0.1.2'], ['^1.2', '1.4.2'], ['^1.2 ^1', '1.4.2'], ['^1.2.3-alpha', '1.2.3-pre'], ['^1.2.0-alpha', '1.2.0-pre'], ['^0.0.1-alpha', '0.0.1-beta'], ] for pattern, version in data: pattern = Range(pattern) self.assertIn(version, pattern, msg='%s should be in %s' % (version, pattern))
def test_comparators(self): data = [ ['1.0.0 - 2.0.0', [['>=1.0.0', '<=2.0.0']]], ['1.0.0', [['1.0.0']]], ['>=*', [['>=0.0.0']]], # node's semver uses '' ['', [['>=0.0.0']]], # node's semver uses '' ['*', [['>=0.0.0']]], # node's semver uses '' ['*', [['>=0.0.0']]], # node's semver uses '' ['>=1.0.0', [['>=1.0.0']]], ['>=1.0.0', [['>=1.0.0']]], ['>=1.0.0', [['>=1.0.0']]], ['>1.0.0', [['>1.0.0']]], ['>1.0.0', [['>1.0.0']]], ['<=2.0.0', [['<=2.0.0']]], ['1', [['>=1.0.0', '<2.0.0']]], ['<=2.0.0', [['<=2.0.0']]], ['<=2.0.0', [['<=2.0.0']]], ['<2.0.0', [['<2.0.0']]], ['<2.0.0', [['<2.0.0']]], ['>= 1.0.0', [['>=1.0.0']]], ['>= 1.0.0', [['>=1.0.0']]], ['>= 1.0.0', [['>=1.0.0']]], ['> 1.0.0', [['>1.0.0']]], ['> 1.0.0', [['>1.0.0']]], ['<= 2.0.0', [['<=2.0.0']]], ['<= 2.0.0', [['<=2.0.0']]], ['<= 2.0.0', [['<=2.0.0']]], ['< 2.0.0', [['<2.0.0']]], ['<\t2.0.0', [['<2.0.0']]], ['>=0.1.97', [['>=0.1.97']]], ['>=0.1.97', [['>=0.1.97']]], ['0.1.20 || 1.2.4', [['0.1.20'], ['1.2.4']]], ['>=0.2.3 || <0.0.1', [['>=0.2.3'], ['<0.0.1']]], ['>=0.2.3 || <0.0.1', [['>=0.2.3'], ['<0.0.1']]], ['>=0.2.3 || <0.0.1', [['>=0.2.3'], ['<0.0.1']]], ['||', [['>=0.0.0']]], # node's semver uses '||' ['2.x.x', [['>=2.0.0', '<3.0.0']]], ['1.2.x', [['>=1.2.0', '<1.3.0']]], ['1.2.x || 2.x', [['>=1.2.0', '<1.3.0'], ['>=2.0.0', '<3.0.0']]], ['1.2.x || 2.x', [['>=1.2.0', '<1.3.0'], ['>=2.0.0', '<3.0.0']]], ['x', [['>=0.0.0']]], # node's semver uses '' ['2.*.*', [['>=2.0.0', '<3.0.0']]], ['1.2.*', [['>=1.2.0', '<1.3.0']]], ['1.2.* || 2.*', [['>=1.2.0', '<1.3.0'], ['>=2.0.0', '<3.0.0']]], ['1.2.* || 2.*', [['>=1.2.0', '<1.3.0'], ['>=2.0.0', '<3.0.0']]], ['*', [['>=0.0.0']]], # node's semver uses '' ['2', [['>=2.0.0', '<3.0.0']]], ['2.3', [['>=2.3.0', '<2.4.0']]], ['~2.4', [['>=2.4.0', '<2.5.0']]], ['~2.4', [['>=2.4.0', '<2.5.0']]], ['~>3.2.1', [['>=3.2.1', '<3.3.0']]], ['~1', [['>=1.0.0', '<2.0.0']]], ['~>1', [['>=1.0.0', '<2.0.0']]], ['~> 1', [['>=1.0.0', '<2.0.0']]], ['~1.0', [['>=1.0.0', '<1.1.0']]], ['~ 1.0', [['>=1.0.0', '<1.1.0']]], ['~ 1.0.3', [['>=1.0.3', '<1.1.0']]], ['~> 1.0.3', [['>=1.0.3', '<1.1.0']]], ['<1', [['<1.0.0']]], ['< 1', [['<1.0.0']]], ['>=1', [['>=1.0.0']]], ['>= 1', [['>=1.0.0']]], ['<1.2', [['<1.2.0']]], ['< 1.2', [['<1.2.0']]], ['1', [['>=1.0.0', '<2.0.0']]], # node's semver uses '>=1.0.0', '<2.0.0', '>=2.0.0', '<3.0.0': ['1 2', [['>=1.0.0', '>=2.0.0', '<2.0.0', '<3.0.0']]], ['1.2 - 3.4.5', [['>=1.2.0', '<=3.4.5']]], ['1.2.3 - 3.4', [['>=1.2.3', '<3.5.0']]], ['1.2.3 - 3', [['>=1.2.3', '<4.0.0']]], # match-nothing ranges ['>*', [['<0.0.0']]], ['<*', [['<0.0.0']]], ] for pattern, expected_ranges in data: pattern = Range(pattern) for expected_range, comparator in zip(expected_ranges, pattern.ranges): expected_range = ' '.join(expected_range) self.assertEqual(expected_range, comparator.desc, msg='%s should expand to %s' % (pattern, expected_range))
def test_ranges(self): data = [ ['1.2.3 - 2.3.4', '>=1.2.3 <=2.3.4'], ['1.2 - 2.3.4', '>=1.2.0 <=2.3.4'], ['1.2.3 - 2.3', '>=1.2.3 <2.4.0'], ['1.2.3 - 2', '>=1.2.3 <3.0.0'], ['~1.2.3', '>=1.2.3 <1.3.0'], ['~1.2', '>=1.2.0 <1.3.0'], ['~1', '>=1.0.0 <2.0.0'], ['~0.2.3', '>=0.2.3 <0.3.0'], ['~0.2', '>=0.2.0 <0.3.0'], ['~0', '>=0.0.0 <1.0.0'], ['~1.2.3-beta.2', '>=1.2.3-beta.2 <1.3.0'], ['^1.2.3', '>=1.2.3 <2.0.0'], ['^0.2.3', '>=0.2.3 <0.3.0'], ['^0.0.3', '>=0.0.3 <0.0.4'], ['^1.2.3-beta.2', '>=1.2.3-beta.2 <2.0.0'], ['^0.0.3-beta', '>=0.0.3-beta <0.0.4'], ['^1.2.x', '>=1.2.0 <2.0.0'], ['^0.0.x', '>=0.0.0 <0.1.0'], ['^0.0', '>=0.0.0 <0.1.0'], ['^1.x', '>=1.0.0 <2.0.0'], ['^0.x', '>=0.0.0 <1.0.0'], ['1.2.3 - *', '>=1.2.3'], ['* - 2', '>=0.0.0 <3.0.0'], ['^*', '>=0.0.0'], # is this right? ['', '>=0.0.0'], ['1.0.0 - 2.0.0', '>=1.0.0 <=2.0.0'], ['1.0.0', '1.0.0'], ['>=*', '>=0.0.0'], # node's semver uses * ['', '>=0.0.0'], # node's semver uses * ['*', '>=0.0.0'], # node's semver uses * ['*', '>=0.0.0'], # node's semver uses * ['>=1.0.0', '>=1.0.0'], ['>1.0.0', '>1.0.0'], ['<=2.0.0', '<=2.0.0'], ['1', '>=1.0.0 <2.0.0'], ['<=2.0.0', '<=2.0.0'], ['<=2.0.0', '<=2.0.0'], ['<2.0.0', '<2.0.0'], ['<2.0.0', '<2.0.0'], ['>= 1.0.0', '>=1.0.0'], ['>= 1.0.0', '>=1.0.0'], ['>= 1.0.0', '>=1.0.0'], ['> 1.0.0', '>1.0.0'], ['> 1.0.0', '>1.0.0'], ['<= 2.0.0', '<=2.0.0'], ['<= 2.0.0', '<=2.0.0'], ['<= 2.0.0', '<=2.0.0'], ['< 2.0.0', '<2.0.0'], ['< 2.0.0', '<2.0.0'], ['>=0.1.97', '>=0.1.97'], ['>=0.1.97', '>=0.1.97'], ['0.1.20 || 1.2.4', '0.1.20||1.2.4'], ['>=0.2.3 || <0.0.1', '>=0.2.3||<0.0.1'], ['>=0.2.3 || <0.0.1', '>=0.2.3||<0.0.1'], ['>=0.2.3 || <0.0.1', '>=0.2.3||<0.0.1'], ['||', '>=0.0.0'], # node's semver uses || ['2.x.x', '>=2.0.0 <3.0.0'], ['1.2.x', '>=1.2.0 <1.3.0'], ['1.2.x || 2.x', '>=1.2.0 <1.3.0||>=2.0.0 <3.0.0'], ['1.2.x || 2.x', '>=1.2.0 <1.3.0||>=2.0.0 <3.0.0'], ['x', '>=0.0.0'], # node's semver uses * ['2.*.*', '>=2.0.0 <3.0.0'], ['1.2.*', '>=1.2.0 <1.3.0'], ['1.2.* || 2.*', '>=1.2.0 <1.3.0||>=2.0.0 <3.0.0'], ['*', '>=0.0.0'], # node's semver uses * ['2', '>=2.0.0 <3.0.0'], ['2.3', '>=2.3.0 <2.4.0'], ['~2.4', '>=2.4.0 <2.5.0'], ['~2.4', '>=2.4.0 <2.5.0'], ['~>3.2.1', '>=3.2.1 <3.3.0'], ['~1', '>=1.0.0 <2.0.0'], ['~>1', '>=1.0.0 <2.0.0'], ['~> 1', '>=1.0.0 <2.0.0'], ['~1.0', '>=1.0.0 <1.1.0'], ['~ 1.0', '>=1.0.0 <1.1.0'], ['^0', '>=0.0.0 <1.0.0'], ['^ 1', '>=1.0.0 <2.0.0'], ['^0.1', '>=0.1.0 <0.2.0'], ['^1.0', '>=1.0.0 <2.0.0'], ['^1.2', '>=1.2.0 <2.0.0'], ['^0.0.1', '>=0.0.1 <0.0.2'], ['^0.0.1-beta', '>=0.0.1-beta <0.0.2'], ['^0.1.2', '>=0.1.2 <0.2.0'], ['^1.2.3', '>=1.2.3 <2.0.0'], ['^1.2.3-beta.4', '>=1.2.3-beta.4 <2.0.0'], ['<1', '<1.0.0'], ['< 1', '<1.0.0'], ['>=1', '>=1.0.0'], ['>= 1', '>=1.0.0'], ['<1.2', '<1.2.0'], ['< 1.2', '<1.2.0'], ['1', '>=1.0.0 <2.0.0'], ['^ 1.2 ^ 1', '>=1.0.0 >=1.2.0 <2.0.0 <2.0.0' ], # node's semver doesn't sort: >=1.2.0 <2.0.0 >=1.0.0 <2.0.0 ] for pattern, expanded in data: pattern = Range(pattern) result = '||'.join(comparator.desc for comparator in pattern.ranges) self.assertEqual(result, expanded, msg='%s should expand to %s' % (pattern, expanded))