summaryrefslogtreecommitdiff
path: root/semantic_version
diff options
context:
space:
mode:
authorRaphaël Barrois <raphael.barrois@polytechnique.org>2019-08-28 21:09:50 +0200
committerRaphaël Barrois <raphael.barrois@polytechnique.org>2019-08-28 21:09:50 +0200
commit4bc0edd07fb3210dd382512d6485ef172fcbfb0a (patch)
treeb29b753e1c29beef2162e216bf48a07b30350e1c /semantic_version
parent1241c3470f65b7f680a4590b68b144dac97df89b (diff)
downloadsemantic-version-4bc0edd07fb3210dd382512d6485ef172fcbfb0a.tar.gz
Fix NPM-style caret matching.
Diffstat (limited to 'semantic_version')
-rw-r--r--semantic_version/base.py16
1 files changed, 10 insertions, 6 deletions
diff --git a/semantic_version/base.py b/semantic_version/base.py
index fb8205c..1c4b01d 100644
--- a/semantic_version/base.py
+++ b/semantic_version/base.py
@@ -1186,7 +1186,7 @@ class NpmSpec(BaseSpec):
PART = r'[a-zA-Z0-9.-]*'
NPM_SPEC_BLOCK = re.compile(r"""
^(?:v)? # Strip optional initial v
- (?P<op><|<=|>=|>|=|^|~|) # Operator, can be empty
+ (?P<op><|<=|>=|>|=|\^|~|) # Operator, can be empty
(?P<major>{nb})(?:\.(?P<minor>{nb})(?:\.(?P<patch>{nb}))?)?
(?:-(?P<prerel>{part}))? # Optional re-release
(?:\+(?P<build>{part}))? # Optional build
@@ -1316,13 +1316,17 @@ class NpmSpec(BaseSpec):
raise ValueError("Invalid NPM spec: %r" % simple)
if prefix == cls.PREFIX_CARET:
- if target.major: # ^1.2.4 => >=1.2.4 <2.0.0
- high = target.next_major()
+ if target.major: # ^1.2.4 => >=1.2.4 <2.0.0 ; ^1.x => >=1.0.0 <2.0.0
+ high = target.truncate().next_major()
elif target.minor: # ^0.1.2 => >=0.1.2 <0.2.0
- high = target.next_minor()
+ high = target.truncate().next_minor()
+ elif minor is None: # ^0.x => >=0.0.0 <1.0.0
+ high = target.truncate().next_major()
+ elif patch is None: # ^0.2.x => >=0.2.0 <0.3.0
+ high = target.truncate().next_minor()
else: # ^0.0.1 => >=0.0.1 <0.0.2
- high = target.next_patch()
- return [cls.range(Range.OP_GTE, target), cls.Range(Range.OP_LT, high)]
+ high = target.truncate().next_patch()
+ return [cls.range(Range.OP_GTE, target), cls.range(Range.OP_LT, high)]
elif prefix == cls.PREFIX_TILDE:
assert major is not None