Skip to content

Commit

Permalink
Use semver for version parser
Browse files Browse the repository at this point in the history
  • Loading branch information
cbeauchesne committed May 24, 2024
1 parent d6bbecf commit ad56db4
Show file tree
Hide file tree
Showing 2 changed files with 24 additions and 111 deletions.
7 changes: 2 additions & 5 deletions tests/test_the_test/test_version.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,11 +34,8 @@ def test_version_comparizon():

assert Version(" * ddtrace (1.0.0.beta1)", "ruby") == Version("1.0.0.beta1", "ruby")
assert Version(" * ddtrace (1.0.0.beta1)", "ruby")
assert Version(" * ddtrace (1.0.0.beta1)", "ruby") < Version(" * ddtrace (1.0.0.beta1 de82857)", "ruby")
assert Version(" * ddtrace (1.0.0.beta1 de82857)", "ruby") < Version("1.0.0", "ruby")

assert Version("1.0.0beta1", "ruby") < Version("1.0.0beta1+8a50f1f", "ruby")

assert Version("1.1.0rc2.dev15+gc41d325d", "python") >= "1.1.0rc2.dev"
assert Version("1.1.0", "python") > "1.1.0rc2.dev"

Expand All @@ -53,7 +50,7 @@ def test_version_serialization():

v = Version("0.53.0.dev70+g494e6dc0", "some comp")
assert v == "0.53.0.dev70+g494e6dc0"
assert str(v) == "0.53.0.dev70+g494e6dc0"
assert str(v) == "0.53.0-dev70+g494e6dc0"

v = Version(" * ddtrace (0.53.0.appsec.180045)", "ruby")
assert v == Version("0.53.0appsec.180045", "ruby")
Expand Down Expand Up @@ -85,7 +82,7 @@ def test_version_serialization():
assert v == "7.43.1"

v = Version("7.50.0-dbm-oracle-0.1", "agent")
assert str(v) == "7.50.0+dbm.oracle.0.1"
assert str(v) == "7.50.0-dbm-oracle-0.1"


def test_agent_version():
Expand Down
128 changes: 22 additions & 106 deletions utils/_context/library_version.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,116 +4,30 @@

from collections import defaultdict
import re
from packaging import version as version_module

# some monkey patching
def _parse_letter_version(letter, number):

if letter:
if number is None:
number = 0

return letter, int(number)
if not letter and number:
letter = "post"

return letter, int(number)

return None


version_module._parse_letter_version = _parse_letter_version # pylint: disable=protected-access

RUBY_VERSION_PATTERN = r"""
v?
(?:
(?:(?P<epoch>[0-9]+)!)? # epoch
(?P<release>[0-9]+(?:\.[0-9]+)*) # release segment
(?P<pre> # pre-release
[-_\.]?
(?P<pre_l>(a|b|c|rc|alpha|beta|pre|preview|appsec))
[-_\.]?
(?P<pre_n>[0-9]+)?
)?
(?P<post> # post release
(?:-(?P<post_n1>[0-9]+))
|
(?:
[-_\.]?
(?P<post_l>post|rev|r)
[-_\.]?
(?P<post_n2>[0-9]+)?
)
)?
(?P<dev> # dev release
[-_\.]?
(?P<dev_l>dev)
[-_\.]?
(?P<dev_n>[0-9]+)?
)?
)
(?:[+ ](?P<local>[a-z0-9]+(?:[-_\.][a-z0-9]+)*))? # local version
"""

AGENT_VERSION_PATTERN = r"""
v?
(?:
(?:(?P<epoch>[0-9]+)!)? # epoch
(?P<release>[0-9]+(?:\.[0-9]+)*) # release segment
(?P<pre> # pre-release
[-_\.]?
(?P<pre_l>(a|b|c|rc|alpha|beta|pre|preview))
[-_\.]?
(?P<pre_n>[0-9]+)?
)?
(?P<post> # post release
(?:-(?P<post_n1>[0-9]+))
|
(?:
[-_\.]?
(?P<post_l>post|rev|r)
[-_\.]?
(?P<post_n2>[0-9]+)?
)
)?
(?P<dev> # dev release
[-_\.]?
(?P<dev_l>dev)
[-_\.]?
(?P<dev_n>[0-9]+)?
)?
(?P<devel> # dev release
-
(?P<devel_l>devel)
[ ]?
(?P<devel_n>.*)?
)?
)
(?:[\+\-](?P<local>[a-z0-9]+(?:[-_\.][a-z0-9]+)*))? # local version
"""
import semantic_version as version_module


class Version(version_module.Version):
@classmethod
def build(cls, version, component):
if isinstance(version, str):
return cls(version, component)
def _build(version, component):
if isinstance(version, str):
return Version(version, component)

if isinstance(version, Version):
return version

if isinstance(version, cls):
return version
raise TypeError(version)

raise TypeError(version)

class Version(version_module.Version):

version_re = re.compile(r"^(\d+)\.(\d+)\.(\d+)(?:[-\.]?([0-9a-zA-Z.-]+))?(?:[\+ ]([0-9a-zA-Z.-]+))?$")

def __init__(self, version, component):

self._component = component

version = version.strip()

pattern = version_module.VERSION_PATTERN

if component == "ruby":
pattern = RUBY_VERSION_PATTERN
if version.startswith("* ddtrace"):
version = re.sub(r"\* *ddtrace *\((.*)\)", r"\1", version)
if version.startswith("* datadog"):
Expand All @@ -130,8 +44,6 @@ def __init__(self, version, component):
version = re.sub("\x1b\\[\\d+m", "", version) # remove color pattern from terminal
version = re.sub(r"[a-zA-Z\-]*$", "", version) # remove any lable post version

pattern = AGENT_VERSION_PATTERN

elif component == "java":
version = version.split("~")[0]
version = version.replace("-SNAPSHOT", "")
Expand All @@ -142,24 +54,28 @@ def __init__(self, version, component):
elif component == "php":
version = version.replace("-nightly", "")

self._regex = re.compile(r"^\s*" + pattern + r"\s*$", re.VERBOSE | re.IGNORECASE)
if version.startswith("v"):
version = version[1:]

if re.match(r"^\d+\.\d+$", version):
version = f"{version}.0"

super().__init__(version)

def __eq__(self, other):
return super().__eq__(self.build(other, self._component))
return super().__eq__(_build(other, self._component))

def __lt__(self, other):
return super().__lt__(self.build(other, self._component))
return super().__lt__(_build(other, self._component))

def __le__(self, other):
return super().__le__(self.build(other, self._component))
return super().__le__(_build(other, self._component))

def __gt__(self, other):
return super().__gt__(self.build(other, self._component))
return super().__gt__(_build(other, self._component))

def __ge__(self, other):
return super().__ge__(self.build(other, self._component))
return super().__ge__(_build(other, self._component))


class LibraryVersion:
Expand Down

0 comments on commit ad56db4

Please sign in to comment.