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

benedict.serializers.query_string   A

Complexity

Total Complexity 5

Size/Duplication

Total Lines 38
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
eloc 27
dl 0
loc 38
rs 10
c 0
b 0
f 0
wmc 5

3 Methods

Rating   Name   Duplication   Size   Complexity  
A QueryStringSerializer.__init__() 0 2 1
A QueryStringSerializer.encode() 0 3 1
A QueryStringSerializer.decode() 0 11 3
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