summaryrefslogtreecommitdiff
path: root/src/semantic_version/__init__.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/semantic_version/__init__.py')
-rw-r--r--src/semantic_version/__init__.py118
1 files changed, 1 insertions, 117 deletions
diff --git a/src/semantic_version/__init__.py b/src/semantic_version/__init__.py
index 2dbf9bb..18019f6 100644
--- a/src/semantic_version/__init__.py
+++ b/src/semantic_version/__init__.py
@@ -2,123 +2,7 @@
# Copyright (c) 2012 Raphaƫl Barrois
-import itertools
-import re
-
__version__ = '0.1.0'
-def _to_int(value):
- try:
- return int(value), True
- except ValueError:
- return value, False
-
-
-def identifier_cmp(a, b):
- """Compare two identifier (for pre-release/build components)."""
-
- a_cmp, a_is_int = _to_int(a)
- b_cmp, b_is_int = _to_int(b)
-
- if a_is_int and b_is_int:
- # Numeric identifiers are compared as integers
- return cmp(a_cmp, b_cmp)
- elif a_is_int:
- # Numeric identifiers have lower precedence
- return -1
- elif b_is_int:
- return 1
- else:
- # Non-numeric identifers are compared lexicographically
- return cmp(a_cmp, b_cmp)
-
-
-def identifier_list_cmp(a, b):
- identifier_pairs = zip(a, b)
- for id_a, id_b in identifier_pairs:
- cmp_res = identifier_cmp(id_a, id_b)
- if cmp_res != 0:
- return cmp_res
- # alpha1.3 < alpha1.3.1
- return cmp(len(a), len(b))
-
-
-class SemanticVersion(object):
-
- version_re = re.compile('^(\d+)\.(\d+)\.(\d+)(?:-([0-9a-zA-Z.-]+))?(?:\+([0-9a-zA-Z.-]+))?$')
-
- def __init__(self, version_string):
- major, minor, patch, prerelease, build = self.parse(version_string)
- self.major = int(major)
- self.minor = int(minor)
- self.patch = int(patch)
- if prerelease is None:
- self.prerelease = []
- else:
- self.prerelease = prerelease.split('.')
- if build is None:
- self.build = []
- else:
- self.build = build.split('.')
-
- @classmethod
- def parse(cls, version_string):
- if not version_string:
- raise ValueError('Invalid version string %r.' % version_string)
-
- match = cls.version_re.match(version_string)
- if match:
- return match.groups()
- else:
- raise ValueError('Invalid version string %r.' % version_string)
-
- def __str__(self):
- prerelease = '.'.join(self.prerelease)
- build = '.'.join(self.build)
- version = '%d.%d.%d' % (self.major, self.minor, self.patch)
- if prerelease:
- version = '%s-%s' % (version, prerelease)
- if build:
- version = '%s+%s' % (version, build)
- return version
-
- def __repr__(self):
- return '<SemVer(%d, %d, %d, %r, %r)>' % (
- self.major,
- self.minor,
- self.patch,
- self.prerelease,
- self.build,
- )
-
- def __cmp__(self, other):
- if not isinstance(other, SemanticVersion):
- return NotImplemented
-
- base_cmp = cmp(
- (self.major, self.minor, self.patch),
- (other.major, other.minor, other.patch))
-
- if base_cmp != 0:
- return base_cmp
-
- if self.prerelease and other.prerelease:
- prerelease_cmp = identifier_list_cmp(self.prerelease, other.prerelease)
- if prerelease_cmp != 0:
- return prerelease_cmp
- elif self.prerelease:
- # Prerelease version have lower precedence
- return -1
- elif other.prerelease:
- return 1
-
- if self.build and other.build:
- return identifier_list_cmp(self.build, other.build)
- elif self.build:
- # Build version have higher precedence
- return 1
- elif other.build:
- return -1
- else:
- return 0
+from .base import compare, match, SemanticVersion, RequirementSpec