Skip to content

Commit 249654d

Browse files
committed
Drop packaging dependency
Compare versions like Moby (api/types/versions/compare.go) Signed-off-by: Aarni Koskela <akx@iki.fi>
1 parent 694d979 commit 249654d

File tree

3 files changed

+38
-14
lines changed

3 files changed

+38
-14
lines changed

docker/utils/utils.py

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,8 @@
66
import shlex
77
import string
88
from datetime import datetime, timezone
9-
from packaging.version import Version
9+
from functools import lru_cache
10+
from itertools import zip_longest
1011

1112
from .. import errors
1213
from ..constants import DEFAULT_HTTP_HOST
@@ -43,6 +44,7 @@ def decode_json_header(header):
4344
return json.loads(data)
4445

4546

47+
@lru_cache(maxsize=None)
4648
def compare_version(v1, v2):
4749
"""Compare docker versions
4850
@@ -55,14 +57,20 @@ def compare_version(v1, v2):
5557
>>> compare_version(v2, v2)
5658
0
5759
"""
58-
s1 = Version(v1)
59-
s2 = Version(v2)
60-
if s1 == s2:
60+
if v1 == v2:
6161
return 0
62-
elif s1 > s2:
63-
return -1
64-
else:
65-
return 1
62+
# Split into `sys.version_info` like tuples.
63+
s1 = tuple(int(p) for p in v1.split('.'))
64+
s2 = tuple(int(p) for p in v2.split('.'))
65+
# Compare each component, padding with 0 if necessary.
66+
for c1, c2 in zip_longest(s1, s2, fillvalue=0):
67+
if c1 == c2:
68+
continue
69+
elif c1 > c2:
70+
return -1
71+
else:
72+
return 1
73+
return 0
6674

6775

6876
def version_lt(v1, v2):

setup.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010
SOURCE_DIR = os.path.join(ROOT_DIR)
1111

1212
requirements = [
13-
'packaging >= 14.0',
1413
'requests >= 2.26.0',
1514
'urllib3 >= 1.26.0',
1615
]

tests/unit/utils_test.py

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,13 @@
1010
from docker.api.client import APIClient
1111
from docker.constants import IS_WINDOWS_PLATFORM, DEFAULT_DOCKER_API_VERSION
1212
from docker.errors import DockerException
13-
from docker.utils import (convert_filters, convert_volume_binds,
14-
decode_json_header, kwargs_from_env, parse_bytes,
15-
parse_devices, parse_env_file, parse_host,
16-
parse_repository_tag, split_command, update_headers)
13+
from docker.utils import (
14+
compare_version, convert_filters, convert_volume_binds, decode_json_header,
15+
format_environment, kwargs_from_env, parse_bytes, parse_devices,
16+
parse_env_file, parse_host, parse_repository_tag, split_command,
17+
update_headers, version_gte, version_lt
18+
)
1719
from docker.utils.ports import build_port_bindings, split_port
18-
from docker.utils.utils import format_environment
1920

2021
TEST_CERT_DIR = os.path.join(
2122
os.path.dirname(__file__),
@@ -629,3 +630,19 @@ def test_format_env_no_value(self):
629630
'BAR': '',
630631
}
631632
assert sorted(format_environment(env_dict)) == ['BAR=', 'FOO']
633+
634+
635+
def test_compare_versions():
636+
assert compare_version('1.0', '1.1') == 1
637+
assert compare_version('1.10', '1.1') == -1
638+
assert compare_version('1.10', '1.10') == 0
639+
assert compare_version('1.10.0', '1.10.1') == 1
640+
assert compare_version('1.9', '1.10') == 1
641+
assert compare_version('1.9.1', '1.10') == 1
642+
# Test comparison helpers
643+
assert version_lt('1.0', '1.27')
644+
assert version_gte('1.27', '1.20')
645+
# Test zero-padding
646+
assert compare_version('1', '1.0') == 0
647+
assert compare_version('1.10', '1.10.1') == 1
648+
assert compare_version('1.10.0', '1.10') == 0

0 commit comments

Comments
 (0)