Trello » TrelloPy
Clone URL:  
Pushed to one repository · View In Graph Contained in tip

First pass at auto-generated api.

Changeset e25b30abca97

by Profile picture of User 10Tyler G. Hicks-Wright <tghw@fogcreek.com>

Changes to one file · Browse files at e25b30abca97 Diff from another changeset...

Change 1 of 1 Show Entire File trello_api_gen.py Stacked
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
@@ -0,0 +1,83 @@
+import os +import re +import requests +from urlparse import urljoin +from BeautifulSoup 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 + for section in sections: + write_section(section) + +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 def_args(req_args, opt_args): + return ', '.join(req_args + [arg + '=None' for arg in opt_args]) + +def write_section(section_url): + module = section_url.split('/')[-2] + if not os.path.exists('trello'): + os.mkdir('trello') + actions = get_actions(section_url) + with open(os.path.join('trello', '%s.py' % module), 'w') as fd: + for action in actions: + url_parts = action[1].split('/') + method_parts = [part.rstrip('s') for part in url_parts[2:] if not part.startswith('[')] + method_name = '%s_%s' % (METHOD_LOOKUP[action[0]], '_'.join(method_parts)) + id_arg = [part.strip('[]').replace(' ', '_') for part in url_parts if part.startswith('[')] + id_arg = id_arg[0] if id_arg else None + req_args = [arg[0] for arg in action[2] if arg[1]] + opt_args = [arg[0] for arg in action[2] if not arg[1]] + args = req_args + opt_args + if id_arg: + print >>fd, 'def %s(%s, %s):' % (method_name, id_arg, def_args(req_args, opt_args)) + print >>fd, ' resp = requests.%s("%s" %% %s, %s)' % (action[0].lower(), re.sub(r'\[.*\]', '%s', action[1]), id_arg, ', '.join(args[1:])) + else: + print >>fd, 'def %s(%s):' % (method_name, def_args(req_args, opt_args)) + print >>fd, ' resp = requests.%s("%s", %s)' % (action[0].lower(), action[1], ', '.join(args)) + print >>fd, ' resp.raise_for_status()' + print >>fd, ' return json.loads(resp.content)' + print >>fd, '' + +if __name__ == '__main__': + main()