Skip to content

Commit f28c4b0

Browse files
authored
Merge pull request #120 from nexB/117-fix-npm-caret-range
Handle npm prerelease caret range expression
2 parents 0113d67 + da287b1 commit f28c4b0

3 files changed

Lines changed: 54 additions & 6 deletions

File tree

src/univers/version_range.py

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -357,11 +357,26 @@ def from_native(cls, string):
357357
VersionConstraint(comparator=comparator, version=vrc(constraint))
358358
)
359359
else:
360-
if (
361-
constraint.endswith(".x")
362-
or constraint.startswith("~")
363-
or constraint.startswith("^")
364-
):
360+
# Handle caret range expression.
361+
if constraint.startswith("^"):
362+
base_version = vrc(constraint.lstrip("^"))
363+
prerelease = base_version.value.prerelease
364+
base_version.value.prerelease = ()
365+
if base_version.major:
366+
high = base_version.next_major()
367+
elif base_version.minor:
368+
high = base_version.next_minor()
369+
else:
370+
high = base_version.next_patch()
371+
base_version.value.prerelease = prerelease
372+
lower = base_version
373+
constraints.extend(
374+
[
375+
VersionConstraint(comparator=">=", version=lower),
376+
VersionConstraint(comparator="<", version=high),
377+
]
378+
)
379+
elif constraint.endswith(".x") or constraint.startswith("~"):
365380
constraints.extend(
366381
get_npm_version_constraints_from_semver_npm_spec(
367382
string=constraint, cls=cls

tests/data/npm_advisory.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1845,7 +1845,7 @@
18451845
"test_index": 308,
18461846
"scheme": "npm",
18471847
"npm_native": "^2.0.18 || ^3.0.16 || ^3.1.6 || ^4.0.8 || ^5.0.0-beta.5",
1848-
"expected_vers": "vers:npm/>=2.0.18|<3.0.0|>=3.0.16|>=3.1.6|<4.0.0|<4.0.0|>=4.0.8|>=5.0.0-beta.5|<5.0.0|>=5.0.0|<5.0.1|<6.0.0"
1848+
"expected_vers": "vers:npm/>=2.0.18|<3.0.0|>=3.0.16|>=3.1.6|<4.0.0|<4.0.0|>=4.0.8|>=5.0.0-beta.5|<5.0.0|<6.0.0"
18491849
},
18501850
{
18511851
"test_index": 309,

tests/test_version_range.py

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -216,6 +216,39 @@ def test_NpmVersionRange_from_native_with_compatible_with_version_operator(self)
216216
version_range = NpmVersionRange.from_native(npm_range)
217217
assert version_range == expected
218218

219+
def test_NpmVersionRange_from_native_with_prerelease_carate_range(self):
220+
npm_range = "^1.2.3-beta.1"
221+
expected = NpmVersionRange(
222+
constraints=(
223+
VersionConstraint(comparator=">=", version=SemverVersion(string="1.2.3-beta.1")),
224+
VersionConstraint(comparator="<", version=SemverVersion(string="2.0.0")),
225+
)
226+
)
227+
version_range = NpmVersionRange.from_native(npm_range)
228+
assert version_range == expected
229+
230+
def test_NpmVersionRange_from_native_with_prerelease_carate_range_wihtout_major(self):
231+
npm_range = "^0.2.1-beta"
232+
expected = NpmVersionRange(
233+
constraints=(
234+
VersionConstraint(comparator=">=", version=SemverVersion(string="0.2.1-beta")),
235+
VersionConstraint(comparator="<", version=SemverVersion(string="0.3.0")),
236+
)
237+
)
238+
version_range = NpmVersionRange.from_native(npm_range)
239+
assert version_range == expected
240+
241+
def test_NpmVersionRange_from_native_with_prerelease_carate_range_wihtout_major_and_minor(self):
242+
npm_range = "^0.0.2-beta"
243+
expected = NpmVersionRange(
244+
constraints=(
245+
VersionConstraint(comparator=">=", version=SemverVersion(string="0.0.2-beta")),
246+
VersionConstraint(comparator="<", version=SemverVersion(string="0.0.3")),
247+
)
248+
)
249+
version_range = NpmVersionRange.from_native(npm_range)
250+
assert version_range == expected
251+
219252
def test_NpmVersionRange_from_native_with_approximately_equal_to_operator(self):
220253
npm_range = "~3.8.2"
221254
expected = NpmVersionRange(

0 commit comments

Comments
 (0)