Source code for debrepo.utils

import string


[docs]class PluralFormatter(string.Formatter): """Formatter syntax: ``{key|unit}``, ``{key~sep}`` The *key* is the index of the argument or the key of the keyword argument to interpret and interpolate. The value must be an integer. The *unit* can be "base(suffix)" or "either/or", e.g.: * antenna(e) * goose/geese * fox(es) If unit is preceded by a \*, take ``len(value)`` instead of value as the count (i.e., ``{key|*item(s)}`` will count the values at *key* instead of interpreting the value at *key* as the count directly). In the second form, *sep* is a string with which to join the list indicated by *key* (and the value must be a valid argument to :func:`string.join`). Examples: .. code-block:: python >>> geese = [ 'goose1', 'goose2' ] >>> FMT.format('Your geese are {0~ & }', geese) 'Your geese are goose1 & goose2' >>> FMT.format('You still have {0|goose/geese}', len(geese)) 'You still have 2 geese' >>> geese = [ 'goose1' ] >>> FMT.format('You still have {geese|*goose/geese}', geese=geese) 'You still have 1 goose' """ def get_value(self, key, args, kwargs): if isinstance(key, int): return args[key] if key in kwargs: return kwargs[key] if '|' in key: compute_len = False key, rest = key.split('|', 1) if rest.startswith('*'): compute_len = True rest = rest[1:] if '/' in rest: words = rest.split('/', 1) elif '(' in rest and rest.endswith(')'): word, suffix = rest.split('(') words = [word, word + suffix.rstrip(')')] if key in kwargs: value = kwargs[key] else: try: index = int(key) except ValueError: raise KeyError(key) value = args[index] if compute_len: value = len(value) if not isinstance(value, int): raise TypeError('Plurality only applies to numbers!') return '{0} {1}'.format(value, words[0 if value == 1 else 1]) elif '~' in key: key, sep = key.split('~', 1) if key in kwargs: values = kwargs[key] else: try: index = int(key) except ValueError: raise KeyError(key) values = args[index] return sep.join(values) else: raise KeyError(key)
#: Instance of :class:`PluralFormatter` exported for convenience FMT = PluralFormatter()