def get_local_formatter(locale: Union[str, Sequence[str], Tuple[str, dict]]): """Return an AttrFormatter instance for the given locale. Parameters ---------- locale : str or tuple of str IETF language tag or a tuple of the language tag and a translation dict, or a tuple of the language tag and a path to a json file defining translation of attributes. """ loc_name, loc_dict = get_local_dict(locale) attrs_mapping = loc_dict["attrs_mapping"].copy() mods = attrs_mapping.pop("modifiers") return AttrFormatter(attrs_mapping, mods)
def format( self, attrs: dict, args: dict = None, formatter: AttrFormatter = default_formatter, ): """Format attributes including {} tags with arguments. Parameters ---------- attrs: dict Attributes containing tags to replace with arguments' values. args : dict Function call arguments. """ if args is None: return attrs out = {} for key, val in attrs.items(): mba = {"indexer": "annual"} # Add formatting {} around values to be able to replace them with _attrs_mapping using format. for k, v in args.items(): if isinstance(v, dict): if v: dk, dv = v.copy().popitem() if dk == "month": dv = "m{}".format(dv) mba[k] = dv elif isinstance(v, units.Quantity): mba[k] = "{:g~P}".format(v) elif isinstance(v, (int, float)): mba[k] = "{:g}".format(v) else: mba[k] = v if callable(val): val = val(**mba) out[key] = formatter.format(val, **mba) if key in self._text_fields: out[key] = out[key].strip().capitalize() return out
def test_AttrFormatter(): fmt = AttrFormatter( mapping={"evil": ["méchant", "méchante"], "nice": ["beau", "belle"]}, modifiers=["m", "f"], ) # Normal cases assert fmt.format("{adj:m}", adj="evil") == "méchant" assert fmt.format("{adj:f}", adj="nice") == "belle" # Missing mod: assert fmt.format("{adj}", adj="evil") == "méchant" # Mod with unknown value with pytest.raises(ValueError): fmt.format("{adj:m}", adj="funny")