import re class Sha1File: """ Manages file names such as "name-{5}.txt" """ DIGEST_LEN = 40 def __init__(self, fileName): self._fileName = fileName res = re.findall(r'{(\d+)}', fileName) self._ok = bool(res) and len(res)==1 and int(res[0])>0 self._occurences = int(res[0]) if self._ok else None self._left, self._right = re.split(r'{\d+}', fileName) if self._ok else (None, None) def __bool__(self): return self._ok def __repr__(self): return self._fileName def __int__(self): return self._occurences def __len__(self): if self._ok: return self.DIGEST_LEN + len(self._left+self._right) else: return len(self._fileName) def nameWithSha1(self, sha1): assert(len(sha1)==self.DIGEST_LEN) return self._left + sha1 + self._right class StrKey: """ Manages string key parameters enclosed by underscores such _string key_ """ def __init__(self, strKey): m = re.match('^_(.+)_$', strKey) self._ok, self._value = (True, m.group(1)) if m else (False, None) def __bool__(self): return self._ok def __repr__(self): return self._value def __len__(self): return len(self._value) def evalMultiple(size): """ Takes size as "123k" and return "123000", same for m, g, and t. 1024 multiples are also supported: ki, mi, gi, ti Raises ValueError if size malformed """ size = ''.join(size.split()).lower() # remove any blank caracter multiples = {"ki":1024, "mi":1024**2, "gi":1024**3, "ti":1024**4, "k":1000, "m":1000**2, "g":1000**3, "t":1000**4, } for m in multiples: if size.endswith(m): size = int(size[:-len(m)]) * multiples[m] break return int(size) def splitList(L, needle): """ Splits a list in chuncks around the needle [1,2,3], 2 --> [ [1], [3] ] [1,2,2,3], 2 --> [ [1], [], [3] ] [2,1,2], 2 --> [ [], [1], [] ] [4,5,6], 2 --> [ [4, 5, 6] ] """ output, lastPos = [], 0 while True: try: pos = L.index(needle, lastPos) output.append(L[lastPos:pos]) lastPos = pos+1 except ValueError: output.append(L[lastPos:]) break return output