-
Notifications
You must be signed in to change notification settings - Fork 6
/
trello_api_gen.py
133 lines (116 loc) · 4.92 KB
/
trello_api_gen.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
import os
import re
import requests
import pystache # requires pystache 0.4.1 or ealier because pystache.View has been deprecated
#to get pystache 0.4.1:
# > git clone https://github.com/defunkt/pystache.git
# > cd ./pystache
# > git checkout v0.4.1
# > python setup.py install
# TODO: change ApiClass and TrelloApi to not use pystache.View
try:
from urlparse import urljoin
except ImportError:
# Probably Python3
from urllib.parse import urljoin
from bs4 import BeautifulSoup as Soup
INDEX = 'https://trello.com/docs/api/index.html'
METHOD_LOOKUP = {
'GET': 'get',
'PUT': 'update',
'POST': 'new',
'DELETE': 'delete',
}
def get_soup(url):
resp = requests.get(url)
resp.raise_for_status()
return Soup(resp.content)
def main():
sections = get_sections()
print(sections)
if not os.path.exists('trello'):
os.mkdir('trello')
modules = []
for section in sections:
write_section(section)
with open(os.path.join('trello', '__init__.py'), 'w') as fd:
trello_api = TrelloApi([module_name(section) for section in sections])
fd.write(trello_api.render())
def get_sections():
sections = []
soup = get_soup(INDEX)
for li in soup.findAll('li', {'class': 'toctree-l1'}):
a = li.find('a', {'class': 'reference internal'})
sections.append(urljoin(INDEX, a['href']))
return sections
def get_actions(section_url):
actions = []
soup = get_soup(section_url)
for section in soup.find('div', {'class': 'section'}).findAll('div', {'class': 'section'}):
h2 = section.find('h2')
method, url, _ = [s.strip() for s in h2.findAll(text=True)]
ul = section.ul
args = []
for li in ul.findAll('li', recursive=False):
if 'arguments' in li.text.lower():
args_ul = li.ul
if args_ul:
for arg_li in args_ul.findAll('li', recursive=False):
arg = arg_li.tt.text
required = 'required' in arg_li.text.lower()
args.append((arg, required))
actions.append((method, url, args))
return actions
def function_args(url_args, id_arg, req_args, opt_args):
if id_arg:
req_args = [id_arg] + req_args
return ', '.join(url_args + req_args + [arg + '=None' for arg in opt_args])
def request_args(request_type, req_args, opt_args):
get_args = []
post_args = []
if request_type in ['GET', 'DELETE']:
get_args += req_args
get_args += opt_args
else:
post_args += req_args
post_args += opt_args
params = 'dict(%s)' % ', '.join(['key=self._apikey', 'token=self._token'] + ['%s=%s' % (arg, arg) for arg in get_args])
data = 'dict(%s)' % ', '.join(['%s=%s' % (arg, arg) for arg in post_args]) if post_args else None
return 'params=%s, data=%s' % (params, data)
def module_name(section_url):
return section_url.split('/')[-2] + 's'
def write_section(section_url):
module = module_name(section_url)
with open(os.path.join('trello', '%s.py' % module), 'w') as fd:
fd.write(ApiClass(section_url).render())
class ApiClass(pystache.View):
def __init__(self, section_url):
super(ApiClass, self).__init__()
self.module = module_name(section_url)
self.actions = get_actions(section_url)
def class_name(self):
return self.module.title()
def methods(self):
methods = []
for action in self.actions:
url_parts = action[1].split('/')
method_parts = [part.rstrip('s') for part in url_parts[3:] if not part.startswith('[')]
method_name = '_'.join([METHOD_LOOKUP[action[0]]] + method_parts)
id_arg = ([part.strip('[]').replace(' ', '_') for part in url_parts if part.startswith('[')] or [None])[0]
url_args = [arg[0] for arg in action[2] if ('[%s]' % arg[0] in url_parts)]
if url_args:
method_name = '%s_%s' % (method_name, '_'.join(url_args))
req_args = [arg[0] for arg in action[2] if arg[1] and arg[0] not in url_args]
opt_args = [arg[0] for arg in action[2] if not arg[1]]
def_args = function_args(url_args, id_arg, req_args, opt_args)
args = request_args(action[0].upper(), req_args, opt_args)
method = action[0].lower()
url = '"https://trello.com%s" %% (%s)' % (re.sub(r'\[.*?\]', '%s', action[1]), ', '.join([id_arg] + url_args if id_arg else url_args))
methods.append(dict(def_args=def_args, args=args, method=method, url=url, name=method_name))
return methods
class TrelloApi(pystache.View):
def __init__(self, sections):
super(TrelloApi, self).__init__()
self.sections = [{'module': section, 'class': section.title()} for section in sections]
if __name__ == '__main__':
main()