summaryrefslogtreecommitdiffstats
path: root/staslib/version.py
blob: 999d91633d808d8f80ca769c8cd88a42d66d5522 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
# Copyright (c) 2021, Dell Inc. or its subsidiaries.  All rights reserved.
# SPDX-License-Identifier: Apache-2.0
# See the LICENSE file for details.
#
# This file is part of NVMe STorage Appliance Services (nvme-stas).
#
# Authors: Martin Belanger <Martin.Belanger@dell.com>
#
''' distutils (and hence LooseVersion) is being deprecated. None of the
    suggested replacements (e.g. from pkg_resources import parse_version) quite
    work with Linux kernel versions the way LooseVersion does.

    It was suggested to simply lift the LooseVersion code and vendor it in,
    which is what this module is about.
'''

import re


class KernelVersion:
    '''Code loosely lifted from distutils's LooseVersion'''

    component_re = re.compile(r'(\d+ | [a-z]+ | \.)', re.VERBOSE)

    def __init__(self, string: str):
        self.string = string
        self.version = self.__parse(string)

    def __str__(self):
        return self.string

    def __repr__(self):
        return f'KernelVersion ("{self}")'

    def __eq__(self, other):
        return self.version == self.__version(other)

    def __lt__(self, other):
        return self.version < self.__version(other)

    def __le__(self, other):
        return self.version <= self.__version(other)

    def __gt__(self, other):
        return self.version > self.__version(other)

    def __ge__(self, other):
        return self.version >= self.__version(other)

    @staticmethod
    def __version(obj):
        return obj.version if isinstance(obj, KernelVersion) else KernelVersion.__parse(obj)

    @staticmethod
    def __parse(string):
        components = []
        for item in KernelVersion.component_re.split(string):
            if item and item != '.':
                try:
                    components.append(int(item))
                except ValueError:
                    pass

        return components