Skip to content

Commit 2c27b09

Browse files
authored
Merge pull request #1122 from minrk/rm-distutils
Remove deprecated calls to distutils
2 parents e3d0a9a + d728a64 commit 2c27b09

File tree

7 files changed

+58
-9
lines changed

7 files changed

+58
-9
lines changed

repo2docker/buildpacks/_r_base.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
44
Keeping this in r.py would lead to cyclic imports.
55
"""
6-
from distutils.version import LooseVersion as V
6+
from ..semver import parse_version as V
77

88

99
def rstudio_base_scripts(r_version):

repo2docker/buildpacks/julia/julia_project.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
11
"""Generates a Dockerfile based on an input matrix for Julia"""
22
import functools
33
import os
4+
45
import requests
6+
import semver
57
import toml
8+
69
from ..python import PythonBuildPack
7-
from .semver import find_semver_match, semver
10+
from ...semver import find_semver_match
811

912

1013
class JuliaProjectTomlBuildPack(PythonBuildPack):

repo2docker/buildpacks/julia/julia_require.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
"""Generates a Dockerfile based on an input matrix with REQUIRE for legacy Julia"""
22

3-
from distutils.version import LooseVersion as V
43
import os
54

65
from ..python import PythonBuildPack
6+
from ...semver import parse_version as V
77

88

99
class JuliaRequireBuildPack(PythonBuildPack):

repo2docker/buildpacks/r.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@
33
import datetime
44
import requests
55

6-
from distutils.version import LooseVersion as V
76

7+
from ..semver import parse_version as V
88
from .python import PythonBuildPack
99
from ._r_base import rstudio_base_scripts
1010

repo2docker/buildpacks/julia/semver.py renamed to repo2docker/semver.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,13 @@
1212

1313

1414
import re
15+
from functools import lru_cache
1516

1617
import semver
1718

1819

1920
def find_semver_match(constraint, versions_list):
21+
"""Find first version in a list of versions that matches a constraint"""
2022
matcher = create_semver_matcher(constraint)
2123
for vstr in reversed(versions_list):
2224
if matcher.match(str_to_version(vstr)):
@@ -25,9 +27,29 @@ def find_semver_match(constraint, versions_list):
2527

2628

2729
def str_to_version(vstr):
30+
"""Convert a simple x[.y[.z]] version string to a tuple of ints"""
2831
return tuple([int(n) for n in vstr.split(".")])
2932

3033

34+
@lru_cache()
35+
def parse_version(vstr):
36+
"""Convert a simple 'x[.y[.z]]' version string to a comparable VersionInfo
37+
38+
Wraps semver.VersionInfo.parse with zero-padding,
39+
so it can accept '1.0', where upstream only accepts exactly 3 version fields.
40+
"""
41+
try:
42+
return semver.VersionInfo.parse(vstr)
43+
except ValueError:
44+
# may fail for e.g. short 1.0 versions
45+
n_fields = vstr.count(".")
46+
if n_fields < 2:
47+
vstr = vstr + (".0" * (2 - n_fields))
48+
return semver.VersionInfo.parse(vstr)
49+
else:
50+
raise
51+
52+
3153
# Helpers
3254
def major(v):
3355
return v[0]
@@ -41,6 +63,7 @@ def patch(v):
4163
return v[2] if len(v) >= 3 else 0
4264

4365

66+
@lru_cache()
4467
def create_semver_matcher(constraint_str):
4568
"""Create a matcher that can be used to match version tuples
4669

tests/unit/contentproviders/test_mercurial.py

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,20 @@
1-
from pathlib import Path
1+
import os
22
import subprocess
3+
from pathlib import Path
34
from tempfile import TemporaryDirectory
4-
import os
5-
from distutils.util import strtobool
65

76
import pytest
87

98
from repo2docker.contentproviders import Mercurial
109
from repo2docker.contentproviders.mercurial import args_enabling_topic
1110

12-
SKIP_HG = strtobool(os.environ.get("REPO2DOCKER_SKIP_HG_TESTS", "False"))
11+
12+
SKIP_HG = os.environ.get("REPO2DOCKER_SKIP_HG_TESTS", "").lower() not in {
13+
"",
14+
"0",
15+
"false",
16+
"no",
17+
}
1318

1419
skip_if_no_hg_tests = pytest.mark.skipif(
1520
SKIP_HG,

tests/unit/test_semver.py

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import pytest
2-
from repo2docker.buildpacks.julia import semver
2+
from semver import VersionInfo
3+
from repo2docker import semver
34

45

56
@pytest.mark.parametrize("test_input, expected", [("1.5.2", (1, 5, 2)), ("1", (1,))])
@@ -145,3 +146,20 @@ def test_largerthan_equal():
145146
semver.create_semver_matcher(">=1.2.3").match(semver.str_to_version("1.2.2"))
146147
== False
147148
)
149+
150+
151+
@pytest.mark.parametrize(
152+
"vstr, expected",
153+
[
154+
("1.2.3", "1.2.3"),
155+
("1.2", "1.2.0"),
156+
("1", "1.0.0"),
157+
],
158+
)
159+
def test_parse_version(vstr, expected):
160+
version_info = semver.parse_version(vstr)
161+
assert isinstance(version_info, semver.semver.VersionInfo)
162+
assert str(version_info) == expected
163+
# satisfies itself, since this is how we use it
164+
assert semver.parse_version(expected) <= version_info
165+
assert semver.parse_version(expected) >= version_info

0 commit comments

Comments
 (0)