55This module provides the Github3 object model.
66"""
77
8- from .helpers import to_python , to_api
8+ import json
9+
10+ from .helpers import to_python , to_api , key_diff
911
1012
1113class BaseResource (object ):
@@ -17,7 +19,7 @@ class BaseResource(object):
1719 _bools = []
1820 _map = {}
1921 _writeable = []
20- _modified = []
22+ _cache = {}
2123
2224
2325 def __init__ (self ):
@@ -26,22 +28,23 @@ def __init__(self):
2628
2729
2830 def __dir__ (self ):
29- d = self .__dict__ .copy ()
30-
31- try :
32- del d ['_gh' ]
33- except KeyError :
34- pass
35-
36- return d .keys ()
37-
31+ return self .keys ()
3832
3933 def _bootstrap (self ):
4034 """Bootstraps the model object based on configured values."""
4135
42- for attr in ( self ._strs + self . _ints + self . _dates + self . _bools + self . _map . keys () ):
36+ for attr in self .keys ():
4337 setattr (self , attr , None )
4438
39+ def keys (self ):
40+ return self ._strs + self ._ints + self ._dates + self ._bools + self ._map .keys ()
41+
42+ def dict (self ):
43+ d = dict ()
44+ for k in self .keys ():
45+ d [k ] = self .__dict__ .get (k )
46+
47+ return d
4548
4649 @classmethod
4750 def new_from_dict (cls , d , gh = None ):
@@ -57,12 +60,21 @@ def new_from_dict(cls, d, gh=None):
5760 )
5861
5962 def update (self ):
60- pass
63+ deploy = key_diff (self ._cache , self .dict (), pack = True )
64+
65+ deploy = to_api (deploy , int_keys = self ._ints , date_keys = self ._dates , bool_keys = self ._bools )
66+ deploy = json .dumps (deploy )
67+
68+ r = self ._gh ._patch_resource (self .ri , deploy )
69+ return r
70+
71+
6172
6273 def setattr (self , k , v ):
6374 # TODO: when writable key changed,
6475 pass
6576
77+
6678class Plan (BaseResource ):
6779 """Github Plan object model."""
6880
@@ -87,6 +99,10 @@ class User(BaseResource):
8799 # _map = {}
88100 # _writeable = []
89101
102+ @property
103+ def ri (self ):
104+ return ('users' , self .login )
105+
90106 def __repr__ (self ):
91107 return '<user {0}>' .format (self .login )
92108
@@ -107,6 +123,10 @@ class CurrentUser(User):
107123 _map = {'plan' : Plan }
108124 _writeable = ['name' , 'email' , 'blog' , 'company' , 'location' , 'hireable' , 'bio' ]
109125
126+ @property
127+ def ri (self ):
128+ return ('user' ,)
129+
110130 def __repr__ (self ):
111131 return '<current-user {0}>' .format (self .login )
112132
@@ -147,6 +167,11 @@ class Repo(BaseResource):
147167 _dates = ['pushed_at' , 'created_at' ]
148168 _map = {'owner' : User }
149169
170+
171+ @property
172+ def ri (self ):
173+ return ('repos' , self .owner .login , self .name )
174+
150175 def __repr__ (self ):
151176 return '<repo {0}/{1}>' .format (self .owner .login , self .name )
152177 # owner
0 commit comments