aboutsummaryrefslogtreecommitdiffstats
path: root/github3/models/base.py
diff options
context:
space:
mode:
authorDavid Medina <davidmedina9@gmail.com>2011-10-29 16:11:27 +0200
committerDavid Medina <davidmedina9@gmail.com>2011-10-31 00:34:31 +0100
commitc23698e64f3244636290ffa4065f3b70ba5151e9 (patch)
tree37fee2463eb1aedbf758fe1b9b9afd173c5908c8 /github3/models/base.py
parentUpdate requests (fixs with auth) (diff)
downloadpython-github3-c23698e64f3244636290ffa4065f3b70ba5151e9.tar.xz
python-github3-c23698e64f3244636290ffa4065f3b70ba5151e9.zip
Wip on handlers
Diffstat (limited to 'github3/models/base.py')
-rw-r--r--github3/models/base.py178
1 files changed, 178 insertions, 0 deletions
diff --git a/github3/models/base.py b/github3/models/base.py
new file mode 100644
index 0000000..618e57f
--- /dev/null
+++ b/github3/models/base.py
@@ -0,0 +1,178 @@
+"""
+github3.models
+~~~~~~~~~~~~~~
+
+This module provides the Github3 object model.
+"""
+
+import json
+
+from .helpers import to_python, to_api, key_diff
+
+
+class BaseResource(object):
+ """A BaseResource object."""
+
+ _strs = []
+ _ints = []
+ _dates = []
+ _bools = []
+ _map = {}
+ _writeable = []
+ _cache = {}
+
+
+ def __init__(self):
+ self._bootstrap()
+ super(BaseResource, self).__init__()
+
+
+ def __dir__(self):
+ return self.keys()
+
+ def _bootstrap(self):
+ """Bootstraps the model object based on configured values."""
+
+ 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):
+
+ return to_python(
+ obj=cls(), in_dict=d,
+ str_keys = cls._strs,
+ int_keys = cls._ints,
+ date_keys = cls._dates,
+ bool_keys = cls._bools,
+ object_map = cls._map,
+ _gh = gh
+ )
+
+
+ def update(self):
+ 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
+
+
+class Plan(BaseResource):
+ """Github Plan object model."""
+
+ _strs = ['name']
+ _ints = ['space', 'collaborators', 'private_repos']
+
+ def __repr__(self):
+ return '<plan {0}>'.format(str(self.name))
+
+class Org(BaseResource):
+ """Github Organization object model."""
+
+ _strs = [
+ 'login', 'url', 'avatar_url', 'name', 'company', 'blog', 'location', 'email'
+ 'html_url', 'type', 'billing_email']
+ _ints = [
+ 'id', 'public_repos', 'public_gists', 'followers', 'following',
+ 'total_private_repos', 'owned_private_repos', 'private_gists', 'disk_usage',
+ 'collaborators']
+ _dates = ['created_at']
+ _map = {'plan': Plan}
+ _writable = ['billing_email', 'blog', 'company', 'email', 'location', 'name']
+
+ @property
+ def ri(self):
+ return ('orgs', self.login)
+
+ def __repr__(self):
+ return '<org {0}>'.format(self.login)
+
+ def repos(self, limit=None):
+ return self._gh._get_resources(('orgs', self.login, 'repos'), Repo, limit=limit)
+
+ def members(self, limit=None):
+ return self._gh._get_resources(('orgs', self.login, 'members'), User, limit=limit)
+
+ def is_member(self, username):
+ if isinstance(username, User):
+ username = username.login
+
+ r = self._gh._http_resource('GET', ('orgs', self.login, 'members', username), check_status=False)
+ return (r.status_code == 204)
+
+ def publicize_member(self, username):
+ if isinstance(username, User):
+ username = username.login
+
+ r = self._gh._http_resource('PUT', ('orgs', self.login, 'public_members', username), check_status=False, data='')
+ return (r.status_code == 204)
+
+ def conceal_member(self, username):
+ if isinstance(username, User):
+ username = username.login
+
+ r = self._gh._http_resource('DELETE', ('orgs', self.login, 'public_members', username), check_status=False)
+ return (r.status_code == 204)
+
+ def remove_member(self, username):
+ if isinstance(username, User):
+ username = username.login
+
+ r = self._gh._http_resource('DELETE', ('orgs', self.login, 'members', username), check_status=False)
+ return (r.status_code == 204)
+
+ def public_members(self, limit=None):
+ return self._gh._get_resources(('orgs', self.login, 'public_members'), User, limit=limit)
+
+ def is_public_member(self, username):
+ if isinstance(username, User):
+ username = username.login
+
+ r = self._gh._http_resource('GET', ('orgs', self.login, 'public_members', username), check_status=False)
+ return (r.status_code == 204)
+
+
+class Gist(BaseResource):
+ _strs = ['url', 'description', 'html_url', 'git_pull_url', 'git_push_url']
+ _ints = ['id', 'comments']
+ _bools = ['public']
+ _dates = ['created_at']
+ _map = {'user': User} #TODO: file
+
+ @property
+ def ri(self):
+ return ('users', self.user.login, self.id)
+
+ def __repr__(self):
+ return '<gist %s/%s>' % (self.user.login, self.description)
+
+class Repo(BaseResource):
+ _strs = [
+ 'url', 'html_url', 'clone_url', 'git_url', 'ssh_url', 'svn_url',
+ 'name', 'description', 'homepage', 'language', 'master_branch']
+ _bools = ['private', 'fork']
+ _ints = ['forks', 'watchers', 'size',]
+ _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