Passed
Push — main ( 4a8edb...6b2163 )
by Eran
01:34
created

graphinate.converters   A

Complexity

Total Complexity 11

Size/Duplication

Total Lines 92
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
wmc 11
eloc 62
dl 0
loc 92
rs 10
c 0
b 0
f 0

9 Functions

Rating   Name   Duplication   Size   Complexity  
A node_label_converter() 0 2 1
A encode_id() 0 9 1
A encode_edge_id() 0 3 1
A decode_id() 0 9 1
A label_converter() 0 5 3
A value_to_infnum() 0 2 1
A edge_label_converter() 0 2 1
A decode_edge_id() 0 3 1
A infnum_to_value() 0 2 1
1
import base64
2
import decimal
3
import json
4
import math
5
from types import MappingProxyType
6
from typing import NewType, 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 = NewType("InfNumber", Union[float, int, decimal.Decimal])
26
27
INFINITY_MAPPING = MappingProxyType({
28
    'Infinity': math.inf,
29
    '+Infinity': math.inf,
30
    '-Infinity': -math.inf
31
})
32
33
MATH_INF_MAPPING = MappingProxyType({
34
    math.inf: 'Infinity',
35
    -math.inf: '-Infinity'
36
})
37
38
39
def value_to_infnum(value: any) -> InfNumber:
40
    return INFINITY_MAPPING.get(value, value)
41
42
43
def infnum_to_value(value: InfNumber):
44
    return MATH_INF_MAPPING.get(value, value)
45
46
47
def label_converter(value, delimiter: str):
48
    if value:
49
        return delimiter.join(str(v) for v in value) if isinstance(value, tuple) else str(value)
50
51
    return value
52
53
54
def node_label_converter(value):
55
    return label_converter(value, delimiter=DEFAULT_NODE_DELIMITER)
56
57
58
def edge_label_converter(value):
59
    return label_converter(tuple(node_label_converter(n) for n in value), delimiter=DEFAULT_EDGE_DELIMITER)
60
61
62
def encode_id(graph_node_id: tuple,
63
              encoding: str = 'utf-8',
64
              delimiter: str = DEFAULT_NODE_DELIMITER) -> str:
65
    # obj_s: str = delimiter.join(map(str,graph_node_id))
66
    obj_s: str = json.dumps(graph_node_id)
67
    obj_b: bytes = obj_s.encode(encoding)
68
    enc_b: bytes = base64.b64encode(obj_b)
69
    enc_s: str = enc_b.decode(encoding)
70
    return enc_s
71
72
73
def decode_id(graphql_node_id: strawberry.ID,
74
              encoding: str = 'utf-8',
75
              delimiter: str = DEFAULT_NODE_DELIMITER) -> tuple[str, ...]:
76
    enc_b: bytes = graphql_node_id.encode(encoding)
77
    obj_b: bytes = base64.b64decode(enc_b)
78
    obj_s: str = obj_b.decode(encoding)
79
    obj: tuple = tuple(json.loads(obj_s))
80
    # obj: tuple = tuple(obj_s.split(delimiter))
81
    return obj
82
83
84
def encode_edge_id(edge: tuple, encoding: str = 'utf-8'):
85
    encoded_edge = tuple(encode_id(n, encoding) for n in edge)
86
    return encode_id(encoded_edge, encoding)
87
88
89
def decode_edge_id(graphql_edge_id: strawberry.ID, encoding: str = 'utf-8'):
90
    encoded_edge: tuple = decode_id(graphql_edge_id, encoding)
91
    return tuple(decode_id(enc_node) for enc_node in encoded_edge)
92