Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # -*- coding: utf8 -*-
- import urllib
- import re
- from keyword import kwlist
- from HTMLParser import HTMLParser
- htmlparser = HTMLParser()
- DEV_URL = 'http://vk.com/dev/'
- def get_contents(url):
- u = urllib.urlopen(url)
- d = u.read()
- ct = u.info().get('content-type')
- if ct:
- m = re.search(r'\bcharset=(.+)\b', ct)
- if m:
- d = d.decode(m.group(1))
- return d
- def find_params(s, block_name):
- m = re.search(r'<div class="wk_header dev_block_header">' + block_name + r'</div>\s+<table>([\s\S]+?)</table>', s)
- if m:
- partial = m.group(1)
- pat = r'<td class="dev_param_name"[^>]+>([\s\S]+?)</td><td class="dev_param_desc fl_l">([\s\S]+?)</td>'
- params = re.findall(pat, partial)
- return params
- def prep(s):
- s = re.sub('<[^>]+>', '', s)
- s = htmlparser.unescape(s)
- s = s.strip()
- s = re.sub(r'\s+', ' ', s)
- return s
- def wrap(s, indent = '\n', initial_indent=None):
- if initial_indent is None:
- initial_indent = indent + ' '
- ret = []
- width = 80 - len(indent)
- width1 = 80 - len(initial_indent)
- words = s.split(' ')
- temp = ''
- for word in words:
- if (1 + len(word) + len(temp)) <= (width if len(ret) else width1):
- temp += (' ' if len(temp) else '') + word
- else:
- ret.append(temp)
- temp = word
- if len(temp):
- ret.append(temp)
- ret = initial_indent + indent.join(ret)
- return ret
- methods_url = DEV_URL + 'methods'
- _code = ''
- _code += '# -*- coding: utf8 -*-\n'
- _code += '# @author err0x0 <tz4678@gmail.com>\n'
- _code += '# @url https://github.com/err0x0/vk/\n'
- _code += 'from vkclient import *\n'
- _code += 'from keyword import kwlist\n'
- _code += '\n'
- _code += 'class VKClient2(VKClient):\n'
- _code += ' u"""\n'
- _code += u' Код класса сгенерирован на основе документации по ссылке\n'
- _code += u' {}. Параметры, имена которых совпадают с ключевыми\n'.format(methods_url)
- _code += u' словами, должны начинаться с подчеркивания(eg: _from, _global).\n'
- _code += ' """\n'
- _code += ' def __init__(self, *args, **kwargs):\n'
- _code += ' super(VKClient2, self).__init__(*args, **kwargs)\n'
- _code += " self._pattern = '_(' + '|'.join(kwlist) + ')$'\n"
- _code += '\n'
- _code += ' def _smart_call(self, method, params={}):\n'
- _code += ' for k in params.keys():\n'
- _code += " if (k == 'self' and params[k] == self) or\\\n"
- _code += " (k == 'kwargs' and params[k] == params):\n"
- _code += ' del params[k]\n'
- _code += ' continue\n'
- _code += ' m = re.match(self._pattern, k)\n'
- _code += ' if m:\n'
- _code += ' params[m.group(1)] = params.pop(k)\n'
- _code += ' return self.api(method, params)'
- ################################# 80 CHARS LINE ################################
- _code += '\n'
- _code += '\n #'
- _code += '\n #' + u'МЕТОДЫ ДЛЯ РАБОТЫ С API'.center(75)
- _code += '\n #'
- __code = ''
- html = get_contents(methods_url)
- api_methods = re.findall('<span class="dev_methods_list_span">(.+)</span>', html)
- methods_without_params = []
- for api_method in api_methods:
- class_method = re.sub(r'\.|(?=[\x41-\x5a])', '_', api_method).lower()
- method_url = DEV_URL + api_method
- print method_url
- html = get_contents(method_url)
- # описание метода
- m = re.search(r'<div class="dev_method_desc">([\s\S]+?)</div>', html)
- description = prep(m.group(1))
- _code += wrap(description, '\n #' + ' ' * 37, '\n # ' + class_method.rjust(34) + ' ')
- _code += '\n #'
- # требуемый уровень доступа
- m = re.search(r'<div class="dev_sett_block">([\s\S]+?)</div>', html)
- requirements = prep(m.group(1))
- params_title = u'Параметры'
- params = find_params(html, params_title)
- args = ['self']
- required = []
- optional = []
- params_block = ''
- if params:
- params_block += '\n\n ' + params_title + ':'
- for k, v in params:
- if k in kwlist:
- k = '_' + k
- params_block += wrap(k + ' - ' + prep(v), '\n ')
- if v.lower().find(u'обязательный') != -1:
- required.append(k)
- else:
- optional.append(k + '=None')
- else:
- methods_without_params.append(api_method)
- args = args + required + optional
- args.append('**kwargs')
- __code += '\n'
- __code += wrap('\n def {}({}):'.format(class_method, ', '.join(args)), '\\\n ', '')
- __code += '\n u"""'
- __code += '\n @link http://' + DEV_URL + api_method
- __code += '\n'
- __code += wrap(description, '\n ')
- __code += '\n'
- __code += wrap(requirements, '\n ')
- __code += params_block
- error_title = u'Коды ошибок'
- errors = find_params(html, error_title)
- if errors and len(errors):
- __code += '\n'
- __code += '\n ' + error_title + ':'
- for errno, errmsg in errors:
- __code += wrap(errno + ' - ' + prep(errmsg), '\n ')
- # возвращаемый результат
- __code += '\n'
- m = re.search(r'<div class="dev_method_res">([\s\S]+?)<div>', html)
- __code += wrap(prep(m.group(1)), '\n ')
- __code += '\n """'
- if len(args) > 2:
- __code += '\n kwargs.update(locals())'
- __code += "\n return self._smart_call('{}', kwargs)".format(api_method)
- _code += __code
- print u'Методы без параметров:'
- for method in methods_without_params:
- print DEV_URL + method
- open('vklib/vkclient2.py', 'w').write(_code.encode('utf8'))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement