Base64Serializer._pop_options()   A
last analyzed

Complexity

Conditions 1

Size

Total Lines 7
Code Lines 6

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 6
dl 0
loc 7
rs 10
c 0
b 0
f 0
cc 1
nop 2
1
import base64
2
from urllib.parse import unquote
3
4
from benedict.serializers.abstract import AbstractSerializer
5
from benedict.utils import type_util
6
7
8
class Base64CoreSerializer(AbstractSerializer):
9
    """
10
    This class describes a base64 core serializer.
11
    """
12
13
    def __init__(self):
14
        super().__init__(
15
            extensions=[
16
                "b64",
17
                "base64",
18
            ],
19
        )
20
21
    def _fix_url_encoding_and_padding(self, s):
22
        # fix urlencoded chars
23
        s = unquote(s)
24
        # fix padding
25
        m = len(s) % 4
26
        if m != 0:
27
            s += "=" * (4 - m)
28
        return s
29
30
    def decode(self, s, **kwargs):
31
        value = self._fix_url_encoding_and_padding(s)
32
        encoding = kwargs.pop("encoding", "utf-8")
33
        if encoding:
34
            value = value.encode(encoding)
35
        value = base64.b64decode(value)
36
        if encoding:
37
            return value.decode(encoding)
38
        return value
39
40
    def encode(self, d, **kwargs):
41
        value = d
42
        encoding = kwargs.pop("encoding", "utf-8")
43
        if encoding and type_util.is_string(value):
44
            value = value.encode(encoding)
45
        value = base64.b64encode(value)
46
        if encoding:
47
            value = value.decode(encoding)
48
        return value
49
50
51
class Base64Serializer(Base64CoreSerializer):
52
    def __init__(self):
53
        super().__init__()
54
55
    def _pop_options(self, options):
56
        encoding = options.pop("encoding", "utf-8")
57
        subformat = options.pop("subformat", None)
58
        from benedict.serializers import get_serializer_by_format
59
60
        serializer = get_serializer_by_format(subformat)
61
        return (serializer, encoding)
62
63
    def decode(self, s, **kwargs):
64
        serializer, encoding = self._pop_options(kwargs)
65
        value = super().decode(s, encoding=encoding)
66
        if serializer:
67
            value = serializer.decode(value, **kwargs)
68
        return value
69
70
    def encode(self, d, **kwargs):
71
        serializer, encoding = self._pop_options(kwargs)
72
        value = d
73
        if serializer:
74
            value = serializer.encode(value, **kwargs)
75
        value = super().encode(value, encoding=encoding)
76
        return value
77