Skip to content

Commit b26751f

Browse files
author
Kenneth Reitz
committed
examples
1 parent 5f12865 commit b26751f

File tree

1 file changed

+263
-0
lines changed

1 file changed

+263
-0
lines changed

github3/models.py

Lines changed: 263 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,263 @@
1+
# -*- coding: utf-8 -*-
2+
3+
"""
4+
github3.models
5+
~~~~~~~~~~~~~~
6+
7+
This module contains the models that comprise the Github API.
8+
"""
9+
10+
import json
11+
from urllib import quote
12+
13+
import requests
14+
from .helpers import to_python
15+
from .structures import *
16+
17+
18+
class BaseResource(object):
19+
20+
_strs = []
21+
_ints = []
22+
_dates = []
23+
_bools = []
24+
_dicts = []
25+
_map = {}
26+
_pks = []
27+
28+
def __init__(self):
29+
self._bootstrap()
30+
self._h = None
31+
super(BaseResource, self).__init__()
32+
33+
def __repr__(self):
34+
return "<resource '{0}'>".format(self._id)
35+
36+
def _bootstrap(self):
37+
"""Bootstraps the model object based on configured values."""
38+
39+
for attr in self._keys():
40+
setattr(self, attr, None)
41+
42+
def _keys(self):
43+
return self._strs + self._ints + self._dates + self._bools + self._map.keys()
44+
45+
@property
46+
def _id(self):
47+
try:
48+
return getattr(self, self._pks[0])
49+
except IndexError:
50+
return None
51+
52+
@property
53+
def _ids(self):
54+
"""The list of primary keys to validate against."""
55+
for pk in self._pks:
56+
yield getattr(self, pk)
57+
58+
for pk in self._pks:
59+
60+
try:
61+
yield str(getattr(self, pk))
62+
except ValueError:
63+
pass
64+
65+
66+
def dict(self):
67+
d = dict()
68+
for k in self.keys():
69+
d[k] = self.__dict__.get(k)
70+
71+
return d
72+
73+
@classmethod
74+
def new_from_dict(cls, d, h=None, **kwargs):
75+
76+
d = to_python(
77+
obj=cls(),
78+
in_dict=d,
79+
str_keys=cls._strs,
80+
int_keys=cls._ints,
81+
date_keys=cls._dates,
82+
bool_keys=cls._bools,
83+
dict_keys= cls._dicts,
84+
object_map=cls._map,
85+
_h = h
86+
)
87+
88+
d.__dict__.update(kwargs)
89+
90+
return d
91+
92+
93+
class App(BaseResource):
94+
"""Heroku App."""
95+
96+
_strs = ['name', 'create_status', 'stack', 'repo_migrate_status']
97+
_ints = ['id', 'slug_size', 'repo_size', 'dynos', 'workers']
98+
_dates = ['created_at',]
99+
_pks = ['name', 'id']
100+
101+
def __init__(self):
102+
super(App, self).__init__()
103+
104+
def __repr__(self):
105+
return "<app '{0}'>".format(self.name)
106+
107+
def new(self, name=None, stack='cedar'):
108+
"""Creates a new app."""
109+
110+
payload = {}
111+
112+
if name:
113+
payload['app[name]'] = name
114+
115+
if stack:
116+
payload['app[stack]'] = stack
117+
118+
r = self._h._http_resource(
119+
method='POST',
120+
resource=('apps',),
121+
data=payload
122+
)
123+
124+
name = json.loads(r.content).get('name')
125+
return self._h.apps.get(name)
126+
127+
@property
128+
def addons(self):
129+
return self._h._get_resources(
130+
resource=('apps', self.name, 'addons'),
131+
obj=Addon, app=self
132+
)
133+
134+
@property
135+
def collaborators(self):
136+
"""The collaborators for this app."""
137+
return self._h._get_resources(
138+
resource=('apps', self.name, 'collaborators'),
139+
obj=Collaborator, app=self
140+
)
141+
142+
@property
143+
def domains(self):
144+
"""The domains for this app."""
145+
return self._h._get_resources(
146+
resource=('apps', self.name, 'domains'),
147+
obj=Domain, app=self
148+
)
149+
150+
@property
151+
def releases(self):
152+
"""The releases for this app."""
153+
return self._h._get_resources(
154+
resource=('apps', self.name, 'releases'),
155+
obj=Release, app=self
156+
)
157+
158+
@property
159+
def processes(self):
160+
"""The proccesses for this app."""
161+
return self._h._get_resources(
162+
resource=('apps', self.name, 'ps'),
163+
obj=Process, app=self, map=ProcessListResource
164+
)
165+
166+
@property
167+
def config(self):
168+
"""The envs for this app."""
169+
170+
return self._h._get_resource(
171+
resource=('apps', self.name, 'config_vars'),
172+
obj=ConfigVars, app=self
173+
)
174+
175+
@property
176+
def info(self):
177+
"""Returns current info for this app."""
178+
179+
return self._h._get_resource(
180+
resource=('apps', self.name),
181+
obj=App,
182+
)
183+
184+
def rollback(self, release):
185+
"""Rolls back the release to the given version."""
186+
r = self._h._http_resource(
187+
method='POST',
188+
resource=('apps', self.name, 'releases'),
189+
data={'rollback': release}
190+
)
191+
return self.releases[-1]
192+
193+
194+
def rename(self, name):
195+
"""Renames app to given name."""
196+
197+
r = self._h._http_resource(
198+
method='PUT',
199+
resource=('apps', self.name),
200+
data={'app[name]': name}
201+
)
202+
return r.ok
203+
204+
def transfer(self, user):
205+
"""Transfers app to given username's account."""
206+
207+
r = self._h._http_resource(
208+
method='PUT',
209+
resource=('apps', self.name),
210+
data={'app[transfer_owner]': user}
211+
)
212+
return r.ok
213+
214+
def maintenance(self, on=True):
215+
"""Toggles maintenance mode."""
216+
217+
r = self._h._http_resource(
218+
method='POST',
219+
resource=('apps', self.name, 'server', 'maintenance'),
220+
data={'maintenance_mode': int(on)}
221+
)
222+
return r.ok
223+
224+
def destroy(self):
225+
"""Destoys the app. Do be careful."""
226+
227+
r = self._h._http_resource(
228+
method='DELETE',
229+
resource=('apps', self.name)
230+
)
231+
return r.ok
232+
233+
def logs(self, num=None, source=None, tail=False):
234+
"""Returns the requested log."""
235+
236+
# Bootstrap payload package.
237+
payload = {'logplex': 'true'}
238+
239+
if num:
240+
payload['num'] = num
241+
242+
if source:
243+
payload['source'] = source
244+
245+
if tail:
246+
payload['tail'] = 1
247+
248+
# Grab the URL of the logplex endpoint.
249+
r = self._h._http_resource(
250+
method='GET',
251+
resource=('apps', self.name, 'logs'),
252+
data=payload
253+
)
254+
255+
# Grab the actual logs.
256+
r = requests.get(r.content)
257+
258+
if not tail:
259+
return r.content
260+
else:
261+
# Return line iterator for tail!
262+
return r.iter_lines()
263+

0 commit comments

Comments
 (0)