diff options
author | Raphaël Barrois <raphael.barrois@polytechnique.org> | 2012-05-20 21:49:00 +0200 |
---|---|---|
committer | Raphaël Barrois <raphael.barrois@polytechnique.org> | 2012-05-20 21:49:00 +0200 |
commit | e0ef7b8fe2f8f5f9945b008091c25de51f61f8aa (patch) | |
tree | 4081c85b061e87029eaa83439fe1766feb7c1f35 /src | |
parent | f075232bdf1af843d875350c1213e021da19f799 (diff) | |
download | semantic-version-e0ef7b8fe2f8f5f9945b008091c25de51f61f8aa.tar.gz |
Update rules and code to follow readable specifications.
Signed-off-by: Raphaël Barrois <raphael.barrois@polytechnique.org>
Diffstat (limited to 'src')
-rw-r--r-- | src/semantic_version/base.py | 41 |
1 files changed, 14 insertions, 27 deletions
diff --git a/src/semantic_version/base.py b/src/semantic_version/base.py index bec1a79..7b26981 100644 --- a/src/semantic_version/base.py +++ b/src/semantic_version/base.py @@ -58,7 +58,7 @@ def identifier_list_cmp(a, b): class Version(object): version_re = re.compile('^(\d+)\.(\d+)\.(\d+)(?:-([0-9a-zA-Z.-]+))?(?:\+([0-9a-zA-Z.-]+))?$') - partial_version_re = re.compile('^(\d+)(?:\.(\d+)(?:\.(\d+)(?:-([0-9a-zA-Z.-]+))?(?:\+([0-9a-zA-Z.-]+))?)?)?$') + partial_version_re = re.compile('^(\d+)\.(\d+)\.(\d+)(?:-([0-9a-zA-Z.-]*))?(?:\+([0-9a-zA-Z.-]*))?$') def __init__(self, version_string, partial=False): major, minor, patch, prerelease, build = self.parse(version_string, partial) @@ -100,11 +100,13 @@ class Version(object): patch = int(patch) if prerelease is None: - if partial and not build: + if partial and (build is None): # No build info, strip here return (major, minor, patch, None, None) else: prerelease = () + elif prerelease == '': + prerelease = () else: prerelease = tuple(prerelease.split('.')) @@ -113,6 +115,8 @@ class Version(object): build = None else: build = () + elif build == '': + build = () else: build = tuple(build.split('.')) @@ -122,16 +126,11 @@ class Version(object): return iter((self.major, self.minor, self.patch, self.prerelease, self.build)) def __str__(self): - if self.minor is None: - return '%d' % self.major - elif self.patch is None: - return '%d.%d' % (self.major, self.minor) - version = '%d.%d.%d' % (self.major, self.minor, self.patch) - if self.prerelease: + if self.prerelease or (self.partial and self.prerelease == () and self.build is None): version = '%s-%s' % (version, '.'.join(self.prerelease)) - if self.build: + if self.build or (self.partial and self.build == ()): version = '%s+%s' % (version, '.'.join(self.build)) return version @@ -255,19 +254,7 @@ class Spec(object): KIND_NEQ, ) - KIND_LTE_LOOSE = '<~' - KIND_EQ_LOOSE = '~=' - KIND_GTE_LOOSE = '>~' - KIND_NEQ_LOOSE = '!~' - - LOOSE_KINDS = ( - KIND_LTE_LOOSE, - KIND_EQ_LOOSE, - KIND_GTE_LOOSE, - KIND_NEQ_LOOSE, - ) - - re_spec = re.compile(r'^(<|<=|==|>=|>|!=|<~|>~|~=|!~)(\d.*)$') + re_spec = re.compile(r'^(<|<=|==|>=|>|!=)(\d.*)$') def __init__(self, requirement_string): kind, spec = self.parse(requirement_string) @@ -284,21 +271,21 @@ class Spec(object): raise ValueError("Invalid requirement specification: %r" % requirement_string) kind, version = match.groups() - spec = Version(version, partial=(kind in cls.LOOSE_KINDS)) + spec = Version(version, partial=True) return (kind, spec) def match(self, version): if self.kind == self.KIND_LT: return version < self.spec - elif self.kind in (self.KIND_LTE, self.KIND_LTE_LOOSE): + elif self.kind == self.KIND_LTE: return version <= self.spec - elif self.kind in (self.KIND_EQUAL, self.KIND_EQ_LOOSE): + elif self.kind == self.KIND_EQUAL: return version == self.spec - elif self.kind in (self.KIND_GTE, self.KIND_GTE_LOOSE): + elif self.kind == self.KIND_GTE: return version >= self.spec elif self.kind == self.KIND_GT: return version > self.spec - elif self.kind in (self.KIND_NEQ, self.KIND_NEQ_LOOSE): + elif self.kind == self.KIND_NEQ: return version != self.spec else: # pragma: no cover raise ValueError('Unexpected match kind: %r' % self.kind) |