codekingpro/portable-devtools
114k
1import typing as t2 3from enum import EnumMeta4 5 6_extra_values: t.Dict[str, t.Dict[str, t.Any]] = {}7 8 9def register_value(10 cl_str: str,11 name: str,12 value: t.Any,13) -> None:14 _extra_values[cl_str] = _extra_values.get(cl_str, {})15 _extra_values[cl_str][name] = value16 17 18class ExtendableEnum(EnumMeta):19 def __new__(20 metacl,21 name: str,22 bases: t.Tuple[t.Type],23 classdict: t.Dict[str, t.Any],24 ) -> "ExtendableEnum":25 extra_vals = _extra_values.get(name)26 27 if extra_vals is not None:28 for extra_name, extra_val in list(extra_vals.items()):29 if extra_name in classdict:30 raise AttributeError(31 "Enumeration extensions cannot override existing "32 "enumeration members")33 else:34 classdict[extra_name] = extra_val35 36 return super(ExtendableEnum, metacl).__new__(37 metacl,38 name,39 bases,40 classdict, # type: ignore[arg-type] # Uses private explicit type41 )42 