@@ -233,7 +233,8 @@ class NpmVersionRange(VersionRange):
233233 ">=" : ">=" ,
234234 "<" : "<" ,
235235 ">" : ">" ,
236- "=" : "=" , # This is not a native node-semver comparator, but is used in the gitlab version range for npm packages.
236+ "=" : "=" ,
237+ # This is not a native node-semver comparator, but is used in the gitlab version range for npm packages.
237238 }
238239
239240 @classmethod
@@ -672,7 +673,8 @@ class ComposerVersionRange(VersionRange):
672673 ">=" : ">=" ,
673674 "<" : "<" ,
674675 ">" : ">" ,
675- "=" : "=" , # This is not a native composer-semver comparator, but is used in the gitlab version range for composer packages.
676+ "=" : "=" ,
677+ # This is not a native composer-semver comparator, but is used in the gitlab version range for composer packages.
676678 }
677679
678680
@@ -774,7 +776,8 @@ class GolangVersionRange(VersionRange):
774776 ">=" : ">=" ,
775777 "<" : "<" ,
776778 ">" : ">" ,
777- "=" : "=" , # This is not a native golang-semver comparator, but is used in the gitlab version range for go packages.
779+ "=" : "=" ,
780+ # This is not a native golang-semver comparator, but is used in the gitlab version range for go packages.
778781 }
779782
780783
@@ -798,6 +801,48 @@ class HexVersionRange(VersionRange):
798801class CargoVersionRange (VersionRange ):
799802 scheme = "cargo"
800803 version_class = versions .SemverVersion
804+ vers_by_native_comparators = {
805+ "==" : "=" , # not sure for this
806+ "<=" : "<=" ,
807+ ">=" : ">=" ,
808+ "<" : "<" ,
809+ ">" : ">" ,
810+ }
811+
812+ @classmethod
813+ def from_native (cls , string ):
814+ """
815+ Return a VersionRange built from an "cargo-semver" range ``string``.
816+ >>> from univers.versions import SemverVersion
817+ >>> constraints = [
818+ ... VersionConstraint(comparator=">=", version=SemverVersion('0.3.2')),
819+ ... ]
820+ >>> assert CargoVersionRange(constraints=constraints) == CargoVersionRange.from_native(">= 0.3.2")
821+ """
822+ try :
823+ specifiers = SpecifierSet (string )
824+ except InvalidSpecifier as e :
825+ raise InvalidVersionRange () from e
826+
827+ constraints = []
828+ unsupported_messages = []
829+ for spec in specifiers :
830+ operator = spec .operator
831+ version = spec .version
832+
833+ try :
834+ version = cls .version_class (version )
835+ comparator = cls .vers_by_native_comparators [operator ]
836+ constraint = VersionConstraint (comparator = comparator , version = version )
837+ constraints .append (constraint )
838+ except :
839+ msg = f"Invalid Semver version: { spec !r} "
840+ unsupported_messages .append (msg )
841+
842+ if unsupported_messages :
843+ raise InvalidVersionRange (* unsupported_messages )
844+
845+ return cls (constraints = constraints )
801846
802847
803848class MozillaVersionRange (VersionRange ):
0 commit comments