graphinate.converters   A
last analyzed

Complexity

Total Complexity 13

Size/Duplication

Total Lines 95
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
wmc 13
eloc 64
dl 0
loc 95
rs 10
c 0
b 0
f 0

11 Functions

Rating   Name   Duplication   Size   Complexity  
A value_to_infnum() 0 2 1
A infnum_to_value() 0 2 1
A node_label_converter() 0 2 1
A decode() 0 6 1
A encode_id() 0 3 1
A encode_edge_id() 0 3 1
A decode_id() 0 3 1
A label_converter() 0 4 3
A edge_label_converter() 0 2 1
A encode() 0 6 1
A decode_edge_id() 0 3 1
1
import ast
2
import base64
3
import decimal
4
import math
5
from types import MappingProxyType
6
from typing import Any, Union
7
8
import strawberry
9
10
from .constants import DEFAULT_EDGE_DELIMITER, DEFAULT_NODE_DELIMITER
11
12
__all__ = [
13
    'InfNumber',
14
    'decode_edge_id',
15
    'decode_id',
16
    'edge_label_converter',
17
    'encode_edge_id',
18
    'encode_id',
19
    'infnum_to_value',
20
    'label_converter',
21
    'node_label_converter',
22
    'value_to_infnum',
23
]
24
25
InfNumber = Union[float, int, decimal.Decimal]
26
27
INFINITY_MAPPING: MappingProxyType[str, InfNumber] = MappingProxyType({
28
    'Infinity': math.inf,
29
    '+Infinity': math.inf,
30
    '-Infinity': -math.inf
31
})
32
33
MATH_INF_MAPPING: MappingProxyType[InfNumber, str] = MappingProxyType({
34
    math.inf: 'Infinity',
35
    -math.inf: '-Infinity'
36
})
37
38
39
def value_to_infnum(value: str | InfNumber) -> InfNumber:
40
    return INFINITY_MAPPING.get(value, value)
41
42
43
def infnum_to_value(value: InfNumber) -> InfNumber | str:
44
    return MATH_INF_MAPPING.get(value, value)
45
46
47
def label_converter(value: Any, delimiter: str) -> str | None:
48
    if value is not None:
49
        return delimiter.join(str(v) for v in value) if isinstance(value, tuple) else str(value)
50
    return value
51
52
53
def node_label_converter(value: Any) -> str | None:
54
    return label_converter(value, delimiter=DEFAULT_NODE_DELIMITER)
55
56
57
def edge_label_converter(value: Any) -> str | None:
58
    return label_converter(tuple(node_label_converter(n) for n in value), delimiter=DEFAULT_EDGE_DELIMITER)
59
60
61
def encode(value: Any, encoding: str = 'utf-8') -> str:
62
    obj_s: str = repr(value)
63
    obj_b: bytes = obj_s.encode(encoding)
64
    enc_b: bytes = base64.urlsafe_b64encode(obj_b)
65
    enc_s: str = enc_b.decode(encoding)
66
    return enc_s
67
68
69
def decode(value: str, encoding: str = 'utf-8') -> Any:
70
    enc_b: bytes = value.encode(encoding)
71
    obj_b: bytes = base64.urlsafe_b64decode(enc_b)
72
    obj_s: str = obj_b.decode(encoding)
73
    obj: Any = ast.literal_eval(obj_s)
74
    return obj
75
76
77
def encode_id(graph_node_id: tuple,
78
              encoding: str = 'utf-8') -> str:
79
    return encode(graph_node_id, encoding)
80
81
82
def decode_id(graphql_node_id: strawberry.ID,
83
              encoding: str = 'utf-8') -> tuple[str, ...]:
84
    return decode(graphql_node_id, encoding)
85
86
87
def encode_edge_id(edge: tuple, encoding: str = 'utf-8') -> str:
88
    encoded_edge = tuple(encode_id(n, encoding) for n in edge)
89
    return encode_id(encoded_edge, encoding)
90
91
92
def decode_edge_id(graphql_edge_id: strawberry.ID, encoding: str = 'utf-8') -> tuple:
93
    encoded_edge: tuple = decode_id(graphql_edge_id, encoding)
94
    return tuple(decode_id(enc_node) for enc_node in encoded_edge)
95