@@ -77,21 +77,21 @@ def parse_single_constraint(
7777 constraint : str , * , is_marker_constraint : bool = False
7878) -> VersionConstraint :
7979 from poetry .core .constraints .version .patterns import BASIC_CONSTRAINT
80+ from poetry .core .constraints .version .patterns import BASIC_RELEASE_CONSTRAINT
8081 from poetry .core .constraints .version .patterns import CARET_CONSTRAINT
8182 from poetry .core .constraints .version .patterns import TILDE_CONSTRAINT
8283 from poetry .core .constraints .version .patterns import TILDE_PEP440_CONSTRAINT
8384 from poetry .core .constraints .version .patterns import X_CONSTRAINT
8485 from poetry .core .constraints .version .version import Version
8586 from poetry .core .constraints .version .version_range import VersionRange
8687 from poetry .core .constraints .version .version_union import VersionUnion
88+ from poetry .core .version .pep440 import ReleaseTag
8789
88- m = re .match (r"(?i)^v?[xX*](\.[xX*])*$" , constraint )
89- if m :
90+ if m := re .match (r"(?i)^v?[xX*](\.[xX*])*$" , constraint ):
9091 return VersionRange ()
9192
9293 # Tilde range
93- m = TILDE_CONSTRAINT .match (constraint )
94- if m :
94+ if m := TILDE_CONSTRAINT .match (constraint ):
9595 try :
9696 version = Version .parse (m .group ("version" ))
9797 except InvalidVersion as e :
@@ -106,8 +106,8 @@ def parse_single_constraint(
106106 return VersionRange (version , high , include_min = True )
107107
108108 # PEP 440 Tilde range (~=)
109- m = TILDE_PEP440_CONSTRAINT . match ( constraint )
110- if m :
109+
110+ if m := TILDE_PEP440_CONSTRAINT . match ( constraint ) :
111111 try :
112112 version = Version .parse (m .group ("version" ))
113113 except InvalidVersion as e :
@@ -123,8 +123,8 @@ def parse_single_constraint(
123123 return VersionRange (version , high , include_min = True )
124124
125125 # Caret range
126- m = CARET_CONSTRAINT . match ( constraint )
127- if m :
126+
127+ if m := CARET_CONSTRAINT . match ( constraint ) :
128128 try :
129129 version = Version .parse (m .group ("version" ))
130130 except InvalidVersion as e :
@@ -135,8 +135,7 @@ def parse_single_constraint(
135135 return VersionRange (version , version .next_breaking (), include_min = True )
136136
137137 # X Range
138- m = X_CONSTRAINT .match (constraint )
139- if m :
138+ if m := X_CONSTRAINT .match (constraint ):
140139 op = m .group ("op" )
141140
142141 try :
@@ -149,8 +148,7 @@ def parse_single_constraint(
149148 raise ValueError (f"Could not parse version constraint: { constraint } " )
150149
151150 # Basic comparator
152- m = BASIC_CONSTRAINT .match (constraint )
153- if m :
151+ if m := BASIC_CONSTRAINT .match (constraint ):
154152 op = m .group ("op" )
155153 version_string = m .group ("version" )
156154
@@ -163,7 +161,6 @@ def parse_single_constraint(
163161 raise ParseConstraintError (
164162 f"Could not parse version constraint: { constraint } "
165163 ) from e
166-
167164 if op == "<" :
168165 return VersionRange (max = version )
169166 if op == "<=" :
@@ -180,6 +177,39 @@ def parse_single_constraint(
180177 is_marker_constraint = is_marker_constraint ,
181178 )
182179
180+ if op == "!=" :
181+ return VersionUnion (VersionRange (max = version ), VersionRange (min = version ))
182+ return version
183+
184+ # These below should be reserved for comparing non python packages such as OS
185+ # versions using `platform_release`
186+ if m := BASIC_RELEASE_CONSTRAINT .match (constraint ):
187+ op = m .group ("op" )
188+ major = m .group ("major" )
189+ minor = m .group ("minor" )
190+ patch = m .group ("patch" )
191+ # certain OS releases aren't semver or pep440 compliant
192+ build = m .group ("build" )
193+ try :
194+ version = Version .from_parts (
195+ major = int (major ),
196+ minor = int (minor ) if minor else None ,
197+ patch = int (patch ) if patch else None ,
198+ post = ReleaseTag (phase = build ),
199+ )
200+ except InvalidVersion as e :
201+ raise ParseConstraintError (
202+ f"Could not parse version constraint: { constraint } "
203+ ) from e
204+
205+ if op == "<" :
206+ return VersionRange (max = version )
207+ if op == "<=" :
208+ return VersionRange (max = version , include_max = True )
209+ if op == ">" :
210+ return VersionRange (min = version )
211+ if op == ">=" :
212+ return VersionRange (min = version , include_min = True )
183213 if op == "!=" :
184214 return VersionUnion (VersionRange (max = version ), VersionRange (min = version ))
185215
0 commit comments