@@ -1126,6 +1126,58 @@ def strip_string(value, max_length=None):
11261126 return value
11271127
11281128
1129+ def parse_version (version ):
1130+ # type: (str) -> Optional[Tuple[int, ...]]
1131+ """
1132+ Parses a version string into a tuple of integers.
1133+ This uses the parsing loging from PEP 440:
1134+ https://peps.python.org/pep-0440/#appendix-b-parsing-version-strings-with-regular-expressions
1135+ """
1136+ VERSION_PATTERN = r""" # noqa: N806
1137+ v?
1138+ (?:
1139+ (?:(?P<epoch>[0-9]+)!)? # epoch
1140+ (?P<release>[0-9]+(?:\.[0-9]+)*) # release segment
1141+ (?P<pre> # pre-release
1142+ [-_\.]?
1143+ (?P<pre_l>(a|b|c|rc|alpha|beta|pre|preview))
1144+ [-_\.]?
1145+ (?P<pre_n>[0-9]+)?
1146+ )?
1147+ (?P<post> # post release
1148+ (?:-(?P<post_n1>[0-9]+))
1149+ |
1150+ (?:
1151+ [-_\.]?
1152+ (?P<post_l>post|rev|r)
1153+ [-_\.]?
1154+ (?P<post_n2>[0-9]+)?
1155+ )
1156+ )?
1157+ (?P<dev> # dev release
1158+ [-_\.]?
1159+ (?P<dev_l>dev)
1160+ [-_\.]?
1161+ (?P<dev_n>[0-9]+)?
1162+ )?
1163+ )
1164+ (?:\+(?P<local>[a-z0-9]+(?:[-_\.][a-z0-9]+)*))? # local version
1165+ """
1166+
1167+ pattern = re .compile (
1168+ r"^\s*" + VERSION_PATTERN + r"\s*$" ,
1169+ re .VERBOSE | re .IGNORECASE ,
1170+ )
1171+
1172+ try :
1173+ release = pattern .match (version ).groupdict ()["release" ] # type: ignore
1174+ release_tuple = tuple (map (int , release .split ("." )[:3 ])) # type: Tuple[int, ...]
1175+ except (TypeError , ValueError , AttributeError ):
1176+ return None
1177+
1178+ return release_tuple
1179+
1180+
11291181def _is_contextvars_broken ():
11301182 # type: () -> bool
11311183 """
@@ -1520,58 +1572,6 @@ def is_sentry_url(hub, url):
15201572 )
15211573
15221574
1523- def parse_version (version ):
1524- # type: (str) -> Optional[Tuple[int, ...]]
1525- """
1526- Parses a version string into a tuple of integers.
1527- This uses the parsing loging from PEP 440:
1528- https://peps.python.org/pep-0440/#appendix-b-parsing-version-strings-with-regular-expressions
1529- """
1530- VERSION_PATTERN = r""" # noqa: N806
1531- v?
1532- (?:
1533- (?:(?P<epoch>[0-9]+)!)? # epoch
1534- (?P<release>[0-9]+(?:\.[0-9]+)*) # release segment
1535- (?P<pre> # pre-release
1536- [-_\.]?
1537- (?P<pre_l>(a|b|c|rc|alpha|beta|pre|preview))
1538- [-_\.]?
1539- (?P<pre_n>[0-9]+)?
1540- )?
1541- (?P<post> # post release
1542- (?:-(?P<post_n1>[0-9]+))
1543- |
1544- (?:
1545- [-_\.]?
1546- (?P<post_l>post|rev|r)
1547- [-_\.]?
1548- (?P<post_n2>[0-9]+)?
1549- )
1550- )?
1551- (?P<dev> # dev release
1552- [-_\.]?
1553- (?P<dev_l>dev)
1554- [-_\.]?
1555- (?P<dev_n>[0-9]+)?
1556- )?
1557- )
1558- (?:\+(?P<local>[a-z0-9]+(?:[-_\.][a-z0-9]+)*))? # local version
1559- """
1560-
1561- pattern = re .compile (
1562- r"^\s*" + VERSION_PATTERN + r"\s*$" ,
1563- re .VERBOSE | re .IGNORECASE ,
1564- )
1565-
1566- try :
1567- release = pattern .match (version ).groupdict ()["release" ] # type: ignore
1568- release_tuple = tuple (map (int , release .split ("." )[:3 ])) # type: Tuple[int, ...]
1569- except (TypeError , ValueError , AttributeError ):
1570- return None
1571-
1572- return release_tuple
1573-
1574-
15751575if PY37 :
15761576
15771577 def nanosecond_time ():
0 commit comments