done
This commit is contained in:
287
lib/python3.11/site-packages/dash/dash_table/Format.py
Normal file
287
lib/python3.11/site-packages/dash/dash_table/Format.py
Normal file
@ -0,0 +1,287 @@
|
||||
import collections
|
||||
|
||||
|
||||
def get_named_tuple(name, dict):
|
||||
return collections.namedtuple(name, dict.keys())(*dict.values())
|
||||
|
||||
|
||||
Align = get_named_tuple(
|
||||
"align",
|
||||
{"default": "", "left": "<", "right": ">", "center": "^", "right_sign": "="},
|
||||
)
|
||||
|
||||
Group = get_named_tuple("group", {"no": "", "yes": ","})
|
||||
|
||||
Padding = get_named_tuple("padding", {"no": "", "yes": "0"})
|
||||
|
||||
Prefix = get_named_tuple(
|
||||
"prefix",
|
||||
{
|
||||
"yocto": 10**-24,
|
||||
"zepto": 10**-21,
|
||||
"atto": 10**-18,
|
||||
"femto": 10**-15,
|
||||
"pico": 10**-12,
|
||||
"nano": 10**-9,
|
||||
"micro": 10**-6,
|
||||
"milli": 10**-3,
|
||||
"none": None,
|
||||
"kilo": 10**3,
|
||||
"mega": 10**6,
|
||||
"giga": 10**9,
|
||||
"tera": 10**12,
|
||||
"peta": 10**15,
|
||||
"exa": 10**18,
|
||||
"zetta": 10**21,
|
||||
"yotta": 10**24,
|
||||
},
|
||||
)
|
||||
|
||||
Scheme = get_named_tuple(
|
||||
"scheme",
|
||||
{
|
||||
"default": "",
|
||||
"decimal": "r",
|
||||
"decimal_integer": "d",
|
||||
"decimal_or_exponent": "g",
|
||||
"decimal_si_prefix": "s",
|
||||
"exponent": "e",
|
||||
"fixed": "f",
|
||||
"percentage": "%",
|
||||
"percentage_rounded": "p",
|
||||
"binary": "b",
|
||||
"octal": "o",
|
||||
"lower_case_hex": "x",
|
||||
"upper_case_hex": "X",
|
||||
"unicode": "c",
|
||||
},
|
||||
)
|
||||
|
||||
Sign = get_named_tuple(
|
||||
"sign",
|
||||
{"default": "", "negative": "-", "positive": "+", "parantheses": "(", "space": " "},
|
||||
)
|
||||
|
||||
Symbol = get_named_tuple(
|
||||
"symbol", {"no": "", "yes": "$", "binary": "#b", "octal": "#o", "hex": "#x"}
|
||||
)
|
||||
|
||||
Trim = get_named_tuple("trim", {"no": "", "yes": "~"})
|
||||
|
||||
|
||||
class Format:
|
||||
def __init__(self, **kwargs):
|
||||
self._locale = {}
|
||||
self._nully = ""
|
||||
self._prefix = Prefix.none
|
||||
self._specifier = {
|
||||
"align": Align.default,
|
||||
"fill": "",
|
||||
"group": Group.no,
|
||||
"width": "",
|
||||
"padding": Padding.no,
|
||||
"precision": "",
|
||||
"sign": Sign.default,
|
||||
"symbol": Symbol.no,
|
||||
"trim": Trim.no,
|
||||
"type": Scheme.default,
|
||||
}
|
||||
|
||||
valid_methods = [
|
||||
m for m in dir(self.__class__) if m[0] != "_" and m != "to_plotly_json"
|
||||
]
|
||||
|
||||
for kw, val in kwargs.items():
|
||||
if kw not in valid_methods:
|
||||
raise TypeError(
|
||||
"{0} is not a format method. Expected one of".format(kw),
|
||||
str(list(valid_methods)),
|
||||
)
|
||||
|
||||
getattr(self, kw)(val)
|
||||
|
||||
def _validate_char(self, value):
|
||||
self._validate_string(value)
|
||||
|
||||
if len(value) != 1:
|
||||
raise ValueError("expected value to a string of length one")
|
||||
|
||||
def _validate_non_negative_integer_or_none(self, value):
|
||||
if value is None:
|
||||
return
|
||||
|
||||
if not isinstance(value, int):
|
||||
raise TypeError("expected value to be an integer")
|
||||
|
||||
if value < 0:
|
||||
raise ValueError("expected value to be non-negative", str(value))
|
||||
|
||||
def _validate_named(self, value, named_values):
|
||||
if value not in named_values:
|
||||
raise TypeError("expected value to be one of", str(list(named_values)))
|
||||
|
||||
def _validate_string(self, value):
|
||||
if not isinstance(value, (str, "".__class__)):
|
||||
raise TypeError("expected value to be a string")
|
||||
|
||||
# Specifier
|
||||
def align(self, value):
|
||||
self._validate_named(value, Align)
|
||||
|
||||
self._specifier["align"] = value
|
||||
return self
|
||||
|
||||
def fill(self, value):
|
||||
self._validate_char(value)
|
||||
|
||||
self._specifier["fill"] = value
|
||||
return self
|
||||
|
||||
def group(self, value):
|
||||
if isinstance(value, bool):
|
||||
value = Group.yes if value else Group.no
|
||||
|
||||
self._validate_named(value, Group)
|
||||
|
||||
self._specifier["group"] = value
|
||||
return self
|
||||
|
||||
def padding(self, value):
|
||||
if isinstance(value, bool):
|
||||
value = Padding.yes if value else Padding.no
|
||||
|
||||
self._validate_named(value, Padding)
|
||||
|
||||
self._specifier["padding"] = value
|
||||
return self
|
||||
|
||||
def padding_width(self, value):
|
||||
self._validate_non_negative_integer_or_none(value)
|
||||
|
||||
self._specifier["width"] = value if value is not None else ""
|
||||
return self
|
||||
|
||||
def precision(self, value):
|
||||
self._validate_non_negative_integer_or_none(value)
|
||||
|
||||
self._specifier["precision"] = ".{0}".format(value) if value is not None else ""
|
||||
return self
|
||||
|
||||
def scheme(self, value):
|
||||
self._validate_named(value, Scheme)
|
||||
|
||||
self._specifier["type"] = value
|
||||
return self
|
||||
|
||||
def sign(self, value):
|
||||
self._validate_named(value, Sign)
|
||||
|
||||
self._specifier["sign"] = value
|
||||
return self
|
||||
|
||||
def symbol(self, value):
|
||||
self._validate_named(value, Symbol)
|
||||
|
||||
self._specifier["symbol"] = value
|
||||
return self
|
||||
|
||||
def trim(self, value):
|
||||
if isinstance(value, bool):
|
||||
value = Trim.yes if value else Trim.no
|
||||
|
||||
self._validate_named(value, Trim)
|
||||
|
||||
self._specifier["trim"] = value
|
||||
return self
|
||||
|
||||
# Locale
|
||||
def symbol_prefix(self, value):
|
||||
self._validate_string(value)
|
||||
|
||||
if "symbol" not in self._locale:
|
||||
self._locale["symbol"] = [value, ""]
|
||||
else:
|
||||
self._locale["symbol"][0] = value
|
||||
|
||||
return self
|
||||
|
||||
def symbol_suffix(self, value):
|
||||
self._validate_string(value)
|
||||
|
||||
if "symbol" not in self._locale:
|
||||
self._locale["symbol"] = ["", value]
|
||||
else:
|
||||
self._locale["symbol"][1] = value
|
||||
|
||||
return self
|
||||
|
||||
def decimal_delimiter(self, value):
|
||||
self._validate_char(value)
|
||||
|
||||
self._locale["decimal"] = value
|
||||
return self
|
||||
|
||||
def group_delimiter(self, value):
|
||||
self._validate_char(value)
|
||||
|
||||
self._locale["group"] = value
|
||||
return self
|
||||
|
||||
def groups(self, groups):
|
||||
groups = (
|
||||
groups
|
||||
if isinstance(groups, list)
|
||||
else [groups]
|
||||
if isinstance(groups, int)
|
||||
else None
|
||||
)
|
||||
|
||||
if not isinstance(groups, list):
|
||||
raise TypeError("expected groups to be an integer or a list of integers")
|
||||
if len(groups) == 0:
|
||||
raise ValueError(
|
||||
"expected groups to be an integer or a list of " "one or more integers"
|
||||
)
|
||||
|
||||
for group in groups:
|
||||
if not isinstance(group, int):
|
||||
raise TypeError("expected entry to be an integer")
|
||||
|
||||
if group <= 0:
|
||||
raise ValueError("expected entry to be a non-negative integer")
|
||||
|
||||
self._locale["grouping"] = groups
|
||||
return self
|
||||
|
||||
# Nully
|
||||
def nully(self, value):
|
||||
self._nully = value
|
||||
return self
|
||||
|
||||
# Prefix
|
||||
def si_prefix(self, value):
|
||||
self._validate_named(value, Prefix)
|
||||
|
||||
self._prefix = value
|
||||
return self
|
||||
|
||||
def to_plotly_json(self):
|
||||
f = {}
|
||||
f["locale"] = self._locale.copy()
|
||||
f["nully"] = self._nully
|
||||
f["prefix"] = self._prefix
|
||||
aligned = self._specifier["align"] != Align.default
|
||||
f["specifier"] = "{}{}{}{}{}{}{}{}{}{}".format(
|
||||
self._specifier["fill"] if aligned else "",
|
||||
self._specifier["align"],
|
||||
self._specifier["sign"],
|
||||
self._specifier["symbol"],
|
||||
self._specifier["padding"],
|
||||
self._specifier["width"],
|
||||
self._specifier["group"],
|
||||
self._specifier["precision"],
|
||||
self._specifier["trim"],
|
||||
self._specifier["type"],
|
||||
)
|
||||
|
||||
return f
|
Reference in New Issue
Block a user