From b26751f3a99ea5eba4df8a4a53ea2210ee77b034 Mon Sep 17 00:00:00 2001 From: Kenneth Reitz Date: Mon, 26 Dec 2011 23:19:40 -0500 Subject: [PATCH] examples --- github3/models.py | 263 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 263 insertions(+) create mode 100644 github3/models.py diff --git a/github3/models.py b/github3/models.py new file mode 100644 index 0000000..4380b62 --- /dev/null +++ b/github3/models.py @@ -0,0 +1,263 @@ +# -*- coding: utf-8 -*- + +""" +github3.models +~~~~~~~~~~~~~~ + +This module contains the models that comprise the Github API. +""" + +import json +from urllib import quote + +import requests +from .helpers import to_python +from .structures import * + + +class BaseResource(object): + + _strs = [] + _ints = [] + _dates = [] + _bools = [] + _dicts = [] + _map = {} + _pks = [] + + def __init__(self): + self._bootstrap() + self._h = None + super(BaseResource, self).__init__() + + def __repr__(self): + return "".format(self._id) + + 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() + + @property + def _id(self): + try: + return getattr(self, self._pks[0]) + except IndexError: + return None + + @property + def _ids(self): + """The list of primary keys to validate against.""" + for pk in self._pks: + yield getattr(self, pk) + + for pk in self._pks: + + try: + yield str(getattr(self, pk)) + except ValueError: + pass + + + 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, h=None, **kwargs): + + d = to_python( + obj=cls(), + in_dict=d, + str_keys=cls._strs, + int_keys=cls._ints, + date_keys=cls._dates, + bool_keys=cls._bools, + dict_keys= cls._dicts, + object_map=cls._map, + _h = h + ) + + d.__dict__.update(kwargs) + + return d + + +class App(BaseResource): + """Heroku App.""" + + _strs = ['name', 'create_status', 'stack', 'repo_migrate_status'] + _ints = ['id', 'slug_size', 'repo_size', 'dynos', 'workers'] + _dates = ['created_at',] + _pks = ['name', 'id'] + + def __init__(self): + super(App, self).__init__() + + def __repr__(self): + return "".format(self.name) + + def new(self, name=None, stack='cedar'): + """Creates a new app.""" + + payload = {} + + if name: + payload['app[name]'] = name + + if stack: + payload['app[stack]'] = stack + + r = self._h._http_resource( + method='POST', + resource=('apps',), + data=payload + ) + + name = json.loads(r.content).get('name') + return self._h.apps.get(name) + + @property + def addons(self): + return self._h._get_resources( + resource=('apps', self.name, 'addons'), + obj=Addon, app=self + ) + + @property + def collaborators(self): + """The collaborators for this app.""" + return self._h._get_resources( + resource=('apps', self.name, 'collaborators'), + obj=Collaborator, app=self + ) + + @property + def domains(self): + """The domains for this app.""" + return self._h._get_resources( + resource=('apps', self.name, 'domains'), + obj=Domain, app=self + ) + + @property + def releases(self): + """The releases for this app.""" + return self._h._get_resources( + resource=('apps', self.name, 'releases'), + obj=Release, app=self + ) + + @property + def processes(self): + """The proccesses for this app.""" + return self._h._get_resources( + resource=('apps', self.name, 'ps'), + obj=Process, app=self, map=ProcessListResource + ) + + @property + def config(self): + """The envs for this app.""" + + return self._h._get_resource( + resource=('apps', self.name, 'config_vars'), + obj=ConfigVars, app=self + ) + + @property + def info(self): + """Returns current info for this app.""" + + return self._h._get_resource( + resource=('apps', self.name), + obj=App, + ) + + def rollback(self, release): + """Rolls back the release to the given version.""" + r = self._h._http_resource( + method='POST', + resource=('apps', self.name, 'releases'), + data={'rollback': release} + ) + return self.releases[-1] + + + def rename(self, name): + """Renames app to given name.""" + + r = self._h._http_resource( + method='PUT', + resource=('apps', self.name), + data={'app[name]': name} + ) + return r.ok + + def transfer(self, user): + """Transfers app to given username's account.""" + + r = self._h._http_resource( + method='PUT', + resource=('apps', self.name), + data={'app[transfer_owner]': user} + ) + return r.ok + + def maintenance(self, on=True): + """Toggles maintenance mode.""" + + r = self._h._http_resource( + method='POST', + resource=('apps', self.name, 'server', 'maintenance'), + data={'maintenance_mode': int(on)} + ) + return r.ok + + def destroy(self): + """Destoys the app. Do be careful.""" + + r = self._h._http_resource( + method='DELETE', + resource=('apps', self.name) + ) + return r.ok + + def logs(self, num=None, source=None, tail=False): + """Returns the requested log.""" + + # Bootstrap payload package. + payload = {'logplex': 'true'} + + if num: + payload['num'] = num + + if source: + payload['source'] = source + + if tail: + payload['tail'] = 1 + + # Grab the URL of the logplex endpoint. + r = self._h._http_resource( + method='GET', + resource=('apps', self.name, 'logs'), + data=payload + ) + + # Grab the actual logs. + r = requests.get(r.content) + + if not tail: + return r.content + else: + # Return line iterator for tail! + return r.iter_lines() +