e25b30abca97 — Tyler G. Hicks-Wright 11 years ago
First pass at auto-generated api.
1 files changed, 83 insertions(+), 0 deletions(-)

A => trello_api_gen.py
A => trello_api_gen.py +83 -0
@@ 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()