aboutsummaryrefslogtreecommitdiffstats
path: root/pygithub3/resources/base.py
diff options
context:
space:
mode:
Diffstat (limited to 'pygithub3/resources/base.py')
-rw-r--r--pygithub3/resources/base.py78
1 files changed, 78 insertions, 0 deletions
diff --git a/pygithub3/resources/base.py b/pygithub3/resources/base.py
new file mode 100644
index 0000000..5a9418a
--- /dev/null
+++ b/pygithub3/resources/base.py
@@ -0,0 +1,78 @@
+#!/usr/bin/env python
+# -*- encoding: utf-8 -*-
+
+try:
+ import simplejson as json
+except ImportError:
+ import json
+
+
+class Resource(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(resource, raw_resource):
+ if hasattr(raw_resource, 'items'):
+ return resource.__load(raw_resource)
+
+ def parse_collection_map(resource, 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] = resource.__load(raw_resource)
+ return dict_map
+ # list of resources
+ elif hasattr(raw_resources, '__iter__'):
+ return [resource.__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(resource , raw_resource[attr])
+ for attr, resource in self._maps.items()
+ if attr in raw_resource})
+ raw_resource.update(
+ {attr: parse_collection_map(resource, raw_resource[attr])
+ for attr, resource in self._collection_maps.items()
+ if attr in raw_resource})
+
+ return self(raw_resource)
+
+
+class Raw(Resource):
+
+ @classmethod
+ def loads(self, json_content):
+ return json.loads(json_content)