From 790cfe775177a51fed9ce0a9dd1a3d90ae334e64 Mon Sep 17 00:00:00 2001 From: Mike Gerber Date: Sun, 24 May 2015 20:29:22 +0200 Subject: [PATCH] Replace distutils.version.LooseVersion without own Version class --- check_kernel | 32 ++++++++++++++++++++++++++++++-- check_kernel_test.py | 21 +++++++++++++++------ 2 files changed, 45 insertions(+), 8 deletions(-) diff --git a/check_kernel b/check_kernel index 664bb71..ee8052d 100755 --- a/check_kernel +++ b/check_kernel @@ -1,12 +1,40 @@ #!/usr/bin/python from __future__ import division, print_function -from distutils.version import LooseVersion import posixpath import re import subprocess import sys +class Version(object): + """Crude version abstraction for systems without distutils.version""" + + def __init__(self, version_str): + self.version_str = version_str + + def components(self): + return re.split('\.|-', self.version_str) + + def __eq__(self, other): + return self.version_str == other.version_str + + def __gt__(self, other): + def num_gt(str_, str_other): + m = re.search('^\d+', str_) + m_other = re.search('^\d+', str_other) + if m and m_other: + return int(m.group(0)) > int(m_other.group(0)) + else: + return str_ > str_other + + for self_c, other_c in zip(self.components(), other.components()): + if num_gt(self_c, other_c): + return True + return False + + # Note: not using functools.total_ordering to support Python 2.6 + + def proc_version(): with open('/proc/version', 'r') as v: proc_version = v.next() @@ -74,7 +102,7 @@ def clean_kernel_version(version): # Fedora release version = re.sub('\.fc\d+', '', version) - return LooseVersion(version) + return Version(version) def main(): diff --git a/check_kernel_test.py b/check_kernel_test.py index 9c4f85d..cbe6d8b 100644 --- a/check_kernel_test.py +++ b/check_kernel_test.py @@ -7,11 +7,10 @@ if sys.version_info[0] < 3: print("This script requires Python version 3") sys.exit(1) -from distutils.version import LooseVersion import unittest import unittest.mock -from check_kernel import clean_kernel_version +from check_kernel import clean_kernel_version, Version import check_kernel @@ -19,25 +18,35 @@ class CleanKernelVersionTestCase(unittest.TestCase): def testDebian(self): versions = [('3.16.7-ckt9-3~deb8u2', '3.16.7-ckt9-3~deb8u2')] for dirty, clean in versions: - self.assertEqual(clean_kernel_version(dirty), LooseVersion(clean)) + self.assertEqual(clean_kernel_version(dirty), Version(clean)) def testFedora(self): versions = [('4.0.4-301.fc22.x86_64', '4.0.4-301'), ('4.0.0-1.fc22', '4.0.0-1')] for dirty, clean in versions: - self.assertEqual(clean_kernel_version(dirty), LooseVersion(clean)) + self.assertEqual(clean_kernel_version(dirty), Version(clean)) class RunningKernelVersionTestCase(unittest.TestCase): def testFedora(self): with unittest.mock.patch.object(check_kernel, 'proc_version', return_value='Linux version 4.0.3-301.fc22.x86_64 (mockbuild@bkernel02.phx2.fedoraproject.org) (gcc version 5.1.1 20150422 (Red Hat 5.1.1-1) (GCC) ) #1 SMP Thu May 21 13:10:33 UTC 2015'): self.assertEqual(check_kernel.running_kernel_version(), - LooseVersion('4.0.3-301')) + Version('4.0.3-301')) def testDebian(self): with unittest.mock.patch.object(check_kernel, 'proc_version', return_value='Linux version 3.16.0-4-amd64 (debian-kernel@lists.debian.org) (gcc version 4.8.4 (Debian 4.8.4-1) ) #1 SMP Debian 3.16.7-ckt9-3~deb8u1 (2015-04-24)'): self.assertEqual(check_kernel.running_kernel_version(), - LooseVersion('3.16.7-ckt9-3~deb8u1')) + Version('3.16.7-ckt9-3~deb8u1')) + + +class VersionTestCase(unittest.TestCase): + def testComparingTrivial(self): + self.assertEqual(Version('1.0'), Version('1.0')) + self.assertGreater(Version('2.0'), Version('1.0')) + + def testComparingNonTrivial(self): + self.assertGreater(Version('2.12'), Version('2.2')) + self.assertGreater(Version('3.12-12'), Version('3.12-2')) if __name__ == '__main__':