File: __init__.py

package info (click to toggle)
python-trame-server 3.6.1-2
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 480 kB
  • sloc: python: 4,075; javascript: 5; sh: 4; makefile: 3
file content (98 lines) | stat: -rw-r--r-- 2,306 bytes parent folder | download
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