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")
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