mirror of
https://github.com/kennethreitz/python-github3.git
synced 2026-06-05 15:00:21 +00:00
examples
This commit is contained in:
@@ -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 "<resource '{0}'>".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 "<app '{0}'>".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()
|
||||
|
||||
Reference in New Issue
Block a user