Source code for version_tool

# labtools, Copyright (C) 2017 Jerry Fowler and Paul Scheet.
# This program comes with ABSOLUTELY NO WARRANTY. It is licensed under
# GNU GPL Version 3. License and warranty may be viewed in the manual.
'''
version_tool
'''

import os
import sys

import re

from labtools import const
from labtools import misc
from labtools import reflection

[docs]def make_version_list(vlist): ''' Strip off and ignore -SNAP or any other trailing string ''' if isinstance(vlist, str): vlist = vlist.split(const.DOT) vlist = [int(n) if str(n).isdigit() else n for n in vlist] if not str(vlist[-1]).isdigit(): m = re.match(r'(\d*)(\D*)$', vlist[-1]) vlist[-1] = 0 if m.group(1) == const.EMPTY else int(m.group(1)) return vlist
class version_tool(): def __init__(self, my_version, lowest_acceptable=[0]): ''' ''' if not isinstance(my_version, list): raise UserWarning('Programmer: version should be a numeric list (got %r)' % (my_version)) if not isinstance(lowest_acceptable, list): raise UserWarning('Programmer: lowest_acceptable should be a numeric list (got %r)' % (my_version)) self.my_version = my_version self.lowest_acceptable = lowest_acceptable for element in my_version[:-1]: if not isinstance(element, int): raise UserWarning('Programmer: all but the last element of __version__ should be a numeric list (got %s)' % (my_version)) def version(self, version_list=None, lowest_acceptable=False): ''' Return the version as a dotted string ''' if version_list is None: version_list = self.lowest_acceptable if lowest_acceptable else self.my_version return const.DOT.join([str(v) for v in version_list]) def version_acceptable(self, x, lowerbound, upperbound=None): w = DeprecationWarning('%s is obsolete, is_package_version_acceptable(lowerbound[, upperbound]) instead' % (reflection.my_methodname())) if False: raise w else: print(w.message, file=sys.stderr) return self.is_package_version_acceptable(lowerbound, upperbound) def is_package_version_acceptable(self, lowerbound, upperbound=None): ''' Test whether the package version meets the boundaries. Be satisfied with any numerically or lexically higher revision less than or equal to *upperbound* if given Elements of the version can have trailing strings. ''' #print('Testing %r' % (test_version)) my_version = make_version_list(self.my_version) lowerbound = make_version_list(lowerbound) if len(lowerbound) < len(my_version): lowerbound.extend(my_version[len(lowerbound):]) elif len(lowerbound) > len(my_version): my_version.extend([0]*(len(lowerbound)-len(my_version))) lowerstrict = [(lowerbound[i] < my_version[i]) for i in range(len(my_version))] lowerequal = [(lowerbound[i] == my_version[i]) for i in range(len(my_version))] for i in range(len(lowerstrict)): if lowerstrict[i]: break elif not lowerequal[i]: return False if upperbound is None: return True upperbound = make_version_list(upperbound) if len(upperbound) < len(my_version): upperbound.extend(my_version[len(upperbound):]) elif len(upperbound) > len(my_version): my_version.extend([0]*(len(upperbound)-len(my_version))) upperstrict = [(upperbound[i] > my_version[i]) for i in range(len(my_version))] upperequal = [(upperbound[i] == my_version[i]) for i in range(len(my_version))] for i in range(len(upperstrict)): if upperstrict[i]: break elif not upperequal[i]: return False return True def is_retrieved_version_acceptable_to_package(self, retrieved, lowerbound=None): ''' Test whether the retrieved version can be used by the package. Be satisfied with any retrieved version between a lowerbound (if given) and my_version. Elements of the version can have trailing strings. ''' #print('Testing %r' % (test_version)) my_version = make_version_list(self.my_version) retrieved = make_version_list(retrieved) if len(retrieved) < len(my_version): retrieved.extend(my_version[len(retrieved):]) elif len(retrieved) > len(my_version): my_version.extend([0]*(len(retrieved)-len(my_version))) lowerbound = make_version_list(lowerbound if lowerbound else self.lowest_acceptable) if len(lowerbound) < len(my_version): lowerbound.extend(retrieved[len(lowerbound):]) upperstrict = [(retrieved[i] < my_version[i]) for i in range(len(retrieved))] upperequal = [(retrieved[i] == my_version[i]) for i in range(len(retrieved))] for i in range(len(upperstrict)): if upperstrict[i]: break elif not upperequal[i]: return False lowerstrict = [(lowerbound[i] < retrieved[i]) for i in range(len(retrieved))] lowerequal = [(lowerbound[i] == retrieved[i]) for i in range(len(retrieved))] for i in range(len(lowerstrict)): if lowerstrict[i]: break elif not lowerequal[i]: return False return True