aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--github3/models.py51
1 files changed, 38 insertions, 13 deletions
diff --git a/github3/models.py b/github3/models.py
index 1cdf239..1e7f2b4 100644
--- a/github3/models.py
+++ b/github3/models.py
@@ -5,7 +5,9 @@ github3.models
This module provides the Github3 object model.
"""
-from .helpers import to_python, to_api
+import json
+
+from .helpers import to_python, to_api, key_diff
class BaseResource(object):
@@ -17,7 +19,7 @@ class BaseResource(object):
_bools = []
_map = {}
_writeable = []
- _modified = []
+ _cache = {}
def __init__(self):
@@ -26,22 +28,23 @@ class BaseResource(object):
def __dir__(self):
- d = self.__dict__.copy()
-
- try:
- del d['_gh']
- except KeyError:
- pass
-
- return d.keys()
-
+ return self.keys()
def _bootstrap(self):
"""Bootstraps the model object based on configured values."""
- for attr in (self._strs + self._ints + self._dates + self._bools + self._map.keys()):
+ for attr in self.keys():
setattr(self, attr, None)
+ def keys(self):
+ return self._strs + self._ints + self._dates + self._bools + self._map.keys()
+
+ def dict(self):
+ d = dict()
+ for k in self.keys():
+ d[k] = self.__dict__.get(k)
+
+ return d
@classmethod
def new_from_dict(cls, d, gh=None):
@@ -57,12 +60,21 @@ class BaseResource(object):
)
def update(self):
- pass
+ deploy = key_diff(self._cache, self.dict(), pack=True)
+
+ deploy = to_api(deploy, int_keys=self._ints, date_keys=self._dates, bool_keys=self._bools)
+ deploy = json.dumps(deploy)
+
+ r = self._gh._patch_resource(self.ri, deploy)
+ return r
+
+
def setattr(self, k, v):
# TODO: when writable key changed,
pass
+
class Plan(BaseResource):
"""Github Plan object model."""
@@ -87,6 +99,10 @@ class User(BaseResource):
# _map = {}
# _writeable = []
+ @property
+ def ri(self):
+ return ('users', self.login)
+
def __repr__(self):
return '<user {0}>'.format(self.login)
@@ -107,6 +123,10 @@ class CurrentUser(User):
_map = {'plan': Plan}
_writeable = ['name', 'email', 'blog', 'company', 'location', 'hireable', 'bio']
+ @property
+ def ri(self):
+ return ('user',)
+
def __repr__(self):
return '<current-user {0}>'.format(self.login)
@@ -147,6 +167,11 @@ class Repo(BaseResource):
_dates = ['pushed_at', 'created_at']
_map = {'owner': User}
+
+ @property
+ def ri(self):
+ return ('repos', self.owner.login, self.name)
+
def __repr__(self):
return '<repo {0}/{1}>'.format(self.owner.login, self.name)
# owner