aboutsummaryrefslogtreecommitdiffstats
path: root/pygithub3/models/base.py
blob: 722d545792e9deb64b62711d37e00367da870682 (plain) (blame)
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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
#!/usr/bin/env python
# -*- encoding: utf-8 -*-

try:
    import simplejson as json
except ImportError:
    import json


class Model(object):

    _dates = ()
    _maps = {}
    _collection_maps = {}

    def __init__(self, attrs):
        """ """
        self._attrs = attrs
        self.__set_attrs()

    def __set_attrs(self):
        for attr in self._attrs:
            setattr(self, attr, self._attrs[attr])

    @classmethod
    def loads(self, json_content):
        resource_chunk = json.loads(json_content)
        if not hasattr(resource_chunk, 'items'):
            return [self.__load(raw_resource)
                    for raw_resource in resource_chunk]
        else:
            return self.__load(resource_chunk)

    @classmethod
    def __load(self, raw_resource):
        def parse_date(string_date):
            from datetime import datetime
            try:
                date = datetime.strptime(string_date, '%Y-%m-%dT%H:%M:%SZ')
            except TypeError:
                date = None
            return date

        def parse_map(model, raw_resource):
            if hasattr(raw_resource, 'items'):
                return model.__load(raw_resource)

        def parse_collection_map(model, raw_resources):
            # Dict of resources (Ex: Gist file)
            if hasattr(raw_resources, 'items'):
                dict_map = {}
                for key, raw_resource in raw_resources.items():
                    dict_map[key] = model.__load(raw_resource)
                return dict_map
            # list of resources
            elif hasattr(raw_resources, '__iter__'):
                return [model.__load(raw_resource)
                        for raw_resource in raw_resources]
        raw_resource.update(
            {attr: parse_date(raw_resource[attr])
             for attr in self._dates if attr in raw_resource})
        raw_resource.update(
            {attr: parse_map(model, raw_resource[attr])
             for attr, model in self._maps.items()
             if attr in raw_resource})
        raw_resource.update(
            {attr: parse_collection_map(model, raw_resource[attr])
             for attr, model in self._collection_maps.items()
             if attr in raw_resource})

        return self(raw_resource)


class Raw(Model):

    @classmethod
    def loads(self, json_content):
        return json.loads(json_content)