Completed
Push — master ( e6e2ec...0ced3f )
by Fabio
01:26
created

QueryStringSerializer.decode()   A

Complexity

Conditions 3

Size

Total Lines 11
Code Lines 10

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 3
eloc 10
nop 3
dl 0
loc 11
rs 9.9
c 0
b 0
f 0
1
# -*- coding: utf-8 -*-
2
3
from benedict.serializers.abstract import AbstractSerializer
4
5
try:
6
    # python 3
7
    from urllib.parse import urlencode
8
    from urllib.parse import parse_qs
9
except ImportError:
10
    # python 2
11
    from urllib import urlencode
12
    from urlparse import parse_qs
13
14
import json
15
import re
16
17
18
class QueryStringSerializer(AbstractSerializer):
19
20
    def __init__(self):
21
        super(QueryStringSerializer, self).__init__()
22
23
    def decode(self, s, **kwargs):
24
        flat = kwargs.pop('flat', True)
25
        qs_re = r'^(([\w\-\%\+]+\=[\w\-\%\+]*)+([\&]{1})?)+'
26
        qs_pattern = re.compile(qs_re)
27
        if qs_pattern.match(s):
28
            data = parse_qs(s)
29
            if flat:
30
                data = {key: value[0] for key, value in data.items()}
31
            return data
32
        else:
33
            raise ValueError('Invalid query string: {}'.format(s))
34
35
    def encode(self, d, **kwargs):
36
        data = urlencode(d, **kwargs)
37
        return data
38