1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98
|
import msgpack
from . import logger
def share(obj, attr_name, default_value):
if obj and hasattr(obj, attr_name):
return getattr(obj, attr_name)
return default_value
def isascii(s):
# For Python >= 3.7, use the built-in function
return s.isascii()
def is_dunder(s):
# Check if this is a double underscore (dunder) name
return len(s) > 4 and isascii(s) and s[:2] == s[-2:] == "__"
def is_private(s):
return isascii(s) and s[0] == "_"
def clean_state(state):
cleaned = {}
str_values = {}
for key in state:
value = clean_value(state[key])
try:
str_value = msgpack.packb(value)
cleaned[key] = value
str_values[key] = str_value
except Exception:
logger.error(
f"Skip state value for '{key}' since its content is not serializable"
)
return cleaned, str_values
def clean_value(value):
if isinstance(value, dict) and "_filter" in value.keys():
subset = {}
subset.update(value)
keys_to_filter = value.get("_filter")
for key in keys_to_filter:
subset.pop(key, None)
return subset
if isinstance(value, list):
return list(map(clean_value, value))
return value
def update_dict(destination, source):
for key, value in source.items():
if isinstance(value, dict):
# get node or create one
container = destination.setdefault(key, {})
update_dict(container, value)
else:
destination[key] = value
return destination
def reduce_vue_use(state):
_order = []
_options = {}
_reduced = []
# Merge options
for item in state.trame__vue_use:
options = {}
if isinstance(item, str):
name = item
else:
name, options = item
_options.setdefault(name, {})
if name not in _order:
_order.append(name)
update_dict(_options[name], options)
# Generate new content
for name in _order:
if len(_options[name]):
_reduced.append((name, _options[name]))
else:
_reduced.append(name)
# Update state.trame__vue_use with cleaned up version
state.trame__vue_use = _reduced
|