File: test_dict_subclass.py

package info (click to toggle)
python-rapidjson 1.4-3
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 7,368 kB
  • sloc: cpp: 3,332; python: 1,990; makefile: 106
file content (57 lines) | stat: -rw-r--r-- 1,672 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
# -*- coding: utf-8 -*-
# :Project:   python-rapidjson -- Test dict subclasses
# :Created:   dom 17 mar 2019 12:38:24 CET
# :Author:    Lele Gaifax <lele@metapensiero.it>
# :License:   MIT License
# :Copyright: © 2019, 2021 Lele Gaifax
#

from collections import OrderedDict
from rapidjson import Decoder


class OrderedDecoder(Decoder):
    def start_object(self):
        return OrderedDict()


def test_ordered_dict():
    od = OrderedDecoder()
    result = od('{"foo": "bar", "bar": "foo"}')
    assert isinstance(result, OrderedDict)
    assert list(result.keys()) == ["foo", "bar"]


class ObjectsAsKeyValuePairsDecoder(Decoder):
    def start_object(self):
        return []


def test_objects_as_key_value_pairs():
    kvp = ObjectsAsKeyValuePairsDecoder()
    result = kvp('{"a": 1, "b": {"b1": 1, "b2": 2}}')
    assert result == [('a', 1), ('b', [('b1', 1), ('b2', 2)])]


class JoinDuplicatedKeysDecoder(ObjectsAsKeyValuePairsDecoder):
    def end_object(self, ordered_pairs):
        # Adapted from https://stackoverflow.com/a/38307621
        d = {}
        for k, v in ordered_pairs:
            if k in d:
                if type(d[k]) == list:
                    d[k].append(v)
                else:
                    newlist = []
                    newlist.append(d[k])
                    newlist.append(v)
                    d[k] = newlist
            else:
                d[k] = v
        return d


def test_join_duplicated_keys():
    jdk = JoinDuplicatedKeysDecoder()
    result = jdk('{"a": 1, "b": {"b1": 1, "b2": 2}, "b": {"b1": 3, "b2": 2,"b4": 8}}')
    assert result == {'a': 1, 'b': [{'b1': 1, 'b2': 2}, {'b1': 3, 'b2': 2, 'b4': 8}]}