def to_fs_from_unicode(unic): """ Return a byte string version of unic encoded using the file system encoding. """ if is_unicode(unic): try: string = unic.encode(FS_ENCODING) except (UnicodeError, TypeError): pass else: return string return unic
def to_unicode(string): """Convert a string to unicode""" if not is_unicode(string): for codec in CODECS: try: unic = to_text_string(string, codec) except UnicodeError: pass except TypeError: break else: return unic return string
def sort_versions(versions=(), reverse=False, sep=u'.'): """Sort a list of version number strings. This function ensures that the package sorting based on number name is performed correctly when including alpha, dev rc1 etc... """ if versions == []: return [] digits = u'0123456789' def toint(x): try: n = int(x) except: n = x return n versions = list(versions) new_versions, alpha, sizes = [], set(), set() for item in versions: it = item.split(sep) temp = [] for i in it: x = toint(i) if not isinstance(x, int): x = u(x) middle = x.lstrip(digits).rstrip(digits) tail = toint(x.lstrip(digits).replace(middle, u'')) head = toint(x.rstrip(digits).replace(middle, u'')) middle = toint(middle) res = [head, middle, tail] while u'' in res: res.remove(u'') for r in res: if is_unicode(r): alpha.add(r) else: res = [x] temp += res sizes.add(len(temp)) new_versions.append(temp) # replace letters found by a negative number replace_dic = {} alpha = sorted(alpha, reverse=True) if len(alpha): replace_dic = dict(zip(alpha, list(range(-1, -(len(alpha)+1), -1)))) # Complete with zeros based on longest item and replace alphas with number nmax = max(sizes) for i in range(len(new_versions)): item = [] for z in new_versions[i]: if z in replace_dic: item.append(replace_dic[z]) else: item.append(z) nzeros = nmax - len(item) item += [0]*nzeros item += [versions[i]] new_versions[i] = item new_versions = sorted(new_versions, reverse=reverse) return [n[-1] for n in new_versions]