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