Development of an internal social media platform with personalised dashboards for students
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

brain_six.py 11KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308
  1. # Copyright (c) 2014-2016 Claudiu Popa <pcmanticore@gmail.com>
  2. # Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html
  3. # For details: https://github.com/PyCQA/astroid/blob/master/COPYING.LESSER
  4. """Astroid hooks for six module."""
  5. import sys
  6. from textwrap import dedent
  7. from astroid import MANAGER, register_module_extender
  8. from astroid.builder import AstroidBuilder
  9. from astroid.exceptions import AstroidBuildingError, InferenceError, AttributeInferenceError
  10. from astroid import nodes
  11. SIX_ADD_METACLASS = 'six.add_metaclass'
  12. def _indent(text, prefix, predicate=None):
  13. """Adds 'prefix' to the beginning of selected lines in 'text'.
  14. If 'predicate' is provided, 'prefix' will only be added to the lines
  15. where 'predicate(line)' is True. If 'predicate' is not provided,
  16. it will default to adding 'prefix' to all non-empty lines that do not
  17. consist solely of whitespace characters.
  18. """
  19. if predicate is None:
  20. predicate = lambda line: line.strip()
  21. def prefixed_lines():
  22. for line in text.splitlines(True):
  23. yield prefix + line if predicate(line) else line
  24. return ''.join(prefixed_lines())
  25. if sys.version_info[0] == 2:
  26. _IMPORTS_2 = """
  27. import BaseHTTPServer
  28. import CGIHTTPServer
  29. import SimpleHTTPServer
  30. from StringIO import StringIO
  31. from cStringIO import StringIO as cStringIO
  32. from UserDict import UserDict
  33. from UserList import UserList
  34. from UserString import UserString
  35. import __builtin__ as builtins
  36. import thread as _thread
  37. import dummy_thread as _dummy_thread
  38. import ConfigParser as configparser
  39. import copy_reg as copyreg
  40. from itertools import (imap as map,
  41. ifilter as filter,
  42. ifilterfalse as filterfalse,
  43. izip_longest as zip_longest,
  44. izip as zip)
  45. import htmlentitydefs as html_entities
  46. import HTMLParser as html_parser
  47. import httplib as http_client
  48. import cookielib as http_cookiejar
  49. import Cookie as http_cookies
  50. import Queue as queue
  51. import repr as reprlib
  52. from pipes import quote as shlex_quote
  53. import SocketServer as socketserver
  54. import SimpleXMLRPCServer as xmlrpc_server
  55. import xmlrpclib as xmlrpc_client
  56. import _winreg as winreg
  57. import robotparser as urllib_robotparser
  58. import Tkinter as tkinter
  59. import tkFileDialog as tkinter_tkfiledialog
  60. input = raw_input
  61. intern = intern
  62. range = xrange
  63. xrange = xrange
  64. reduce = reduce
  65. reload_module = reload
  66. class UrllibParse(object):
  67. def __init__(self):
  68. import urlparse as _urlparse
  69. import urllib as _urllib
  70. self.ParseResult = _urlparse.ParseResult
  71. self.SplitResult = _urlparse.SplitResult
  72. self.parse_qs = _urlparse.parse_qs
  73. self.parse_qsl = _urlparse.parse_qsl
  74. self.urldefrag = _urlparse.urldefrag
  75. self.urljoin = _urlparse.urljoin
  76. self.urlparse = _urlparse.urlparse
  77. self.urlsplit = _urlparse.urlsplit
  78. self.urlunparse = _urlparse.urlunparse
  79. self.urlunsplit = _urlparse.urlunsplit
  80. self.quote = _urllib.quote
  81. self.quote_plus = _urllib.quote_plus
  82. self.unquote = _urllib.unquote
  83. self.unquote_plus = _urllib.unquote_plus
  84. self.urlencode = _urllib.urlencode
  85. self.splitquery = _urllib.splitquery
  86. self.splittag = _urllib.splittag
  87. self.splituser = _urllib.splituser
  88. self.uses_fragment = _urlparse.uses_fragment
  89. self.uses_netloc = _urlparse.uses_netloc
  90. self.uses_params = _urlparse.uses_params
  91. self.uses_query = _urlparse.uses_query
  92. self.uses_relative = _urlparse.uses_relative
  93. class UrllibError(object):
  94. import urllib2 as _urllib2
  95. import urllib as _urllib
  96. URLError = _urllib2.URLError
  97. HTTPError = _urllib2.HTTPError
  98. ContentTooShortError = _urllib.ContentTooShortError
  99. class DummyModule(object):
  100. pass
  101. class UrllibRequest(object):
  102. def __init__(self):
  103. import urlparse as _urlparse
  104. import urllib2 as _urllib2
  105. import urllib as _urllib
  106. self.urlopen = _urllib2.urlopen
  107. self.install_opener = _urllib2.install_opener
  108. self.build_opener = _urllib2.build_opener
  109. self.pathname2url = _urllib.pathname2url
  110. self.url2pathname = _urllib.url2pathname
  111. self.getproxies = _urllib.getproxies
  112. self.Request = _urllib2.Request
  113. self.OpenerDirector = _urllib2.OpenerDirector
  114. self.HTTPDefaultErrorHandler = _urllib2.HTTPDefaultErrorHandler
  115. self.HTTPRedirectHandler = _urllib2.HTTPRedirectHandler
  116. self.HTTPCookieProcessor = _urllib2.HTTPCookieProcessor
  117. self.ProxyHandler = _urllib2.ProxyHandler
  118. self.BaseHandler = _urllib2.BaseHandler
  119. self.HTTPPasswordMgr = _urllib2.HTTPPasswordMgr
  120. self.HTTPPasswordMgrWithDefaultRealm = _urllib2.HTTPPasswordMgrWithDefaultRealm
  121. self.AbstractBasicAuthHandler = _urllib2.AbstractBasicAuthHandler
  122. self.HTTPBasicAuthHandler = _urllib2.HTTPBasicAuthHandler
  123. self.ProxyBasicAuthHandler = _urllib2.ProxyBasicAuthHandler
  124. self.AbstractDigestAuthHandler = _urllib2.AbstractDigestAuthHandler
  125. self.HTTPDigestAuthHandler = _urllib2.HTTPDigestAuthHandler
  126. self.ProxyDigestAuthHandler = _urllib2.ProxyDigestAuthHandler
  127. self.HTTPHandler = _urllib2.HTTPHandler
  128. self.HTTPSHandler = _urllib2.HTTPSHandler
  129. self.FileHandler = _urllib2.FileHandler
  130. self.FTPHandler = _urllib2.FTPHandler
  131. self.CacheFTPHandler = _urllib2.CacheFTPHandler
  132. self.UnknownHandler = _urllib2.UnknownHandler
  133. self.HTTPErrorProcessor = _urllib2.HTTPErrorProcessor
  134. self.urlretrieve = _urllib.urlretrieve
  135. self.urlcleanup = _urllib.urlcleanup
  136. self.proxy_bypass = _urllib.proxy_bypass
  137. urllib_parse = UrllibParse()
  138. urllib_error = UrllibError()
  139. urllib = DummyModule()
  140. urllib.request = UrllibRequest()
  141. urllib.parse = UrllibParse()
  142. urllib.error = UrllibError()
  143. """
  144. else:
  145. _IMPORTS_3 = """
  146. import _io
  147. cStringIO = _io.StringIO
  148. filter = filter
  149. from itertools import filterfalse
  150. input = input
  151. from sys import intern
  152. map = map
  153. range = range
  154. from imp import reload as reload_module
  155. from functools import reduce
  156. from shlex import quote as shlex_quote
  157. from io import StringIO
  158. from collections import UserDict, UserList, UserString
  159. xrange = range
  160. zip = zip
  161. from itertools import zip_longest
  162. import builtins
  163. import configparser
  164. import copyreg
  165. import _dummy_thread
  166. import http.cookiejar as http_cookiejar
  167. import http.cookies as http_cookies
  168. import html.entities as html_entities
  169. import html.parser as html_parser
  170. import http.client as http_client
  171. import http.server as http_server
  172. BaseHTTPServer = CGIHTTPServer = SimpleHTTPServer = http.server
  173. import pickle as cPickle
  174. import queue
  175. import reprlib
  176. import socketserver
  177. import _thread
  178. import winreg
  179. import xmlrpc.server as xmlrpc_server
  180. import xmlrpc.client as xmlrpc_client
  181. import urllib.robotparser as urllib_robotparser
  182. import email.mime.multipart as email_mime_multipart
  183. import email.mime.nonmultipart as email_mime_nonmultipart
  184. import email.mime.text as email_mime_text
  185. import email.mime.base as email_mime_base
  186. import urllib.parse as urllib_parse
  187. import urllib.error as urllib_error
  188. import tkinter
  189. import tkinter.dialog as tkinter_dialog
  190. import tkinter.filedialog as tkinter_filedialog
  191. import tkinter.scrolledtext as tkinter_scrolledtext
  192. import tkinter.simpledialog as tkinder_simpledialog
  193. import tkinter.tix as tkinter_tix
  194. import tkinter.ttk as tkinter_ttk
  195. import tkinter.constants as tkinter_constants
  196. import tkinter.dnd as tkinter_dnd
  197. import tkinter.colorchooser as tkinter_colorchooser
  198. import tkinter.commondialog as tkinter_commondialog
  199. import tkinter.filedialog as tkinter_tkfiledialog
  200. import tkinter.font as tkinter_font
  201. import tkinter.messagebox as tkinter_messagebox
  202. import urllib
  203. import urllib.request as urllib_request
  204. import urllib.robotparser as urllib_robotparser
  205. import urllib.parse as urllib_parse
  206. import urllib.error as urllib_error
  207. """
  208. if sys.version_info[0] == 2:
  209. _IMPORTS = dedent(_IMPORTS_2)
  210. else:
  211. _IMPORTS = dedent(_IMPORTS_3)
  212. def six_moves_transform():
  213. code = dedent('''
  214. class Moves(object):
  215. {}
  216. moves = Moves()
  217. ''').format(_indent(_IMPORTS, " "))
  218. module = AstroidBuilder(MANAGER).string_build(code)
  219. module.name = 'six.moves'
  220. return module
  221. def _six_fail_hook(modname):
  222. """Fix six.moves imports due to the dynamic nature of this
  223. class.
  224. Construct a psuedo-module which contains all the nessecary imports
  225. for six
  226. :param modname: Name of failed module
  227. :type modname: str
  228. :return: An astroid module
  229. :rtype: nodes.Module
  230. """
  231. attribute_of = (modname != "six.moves" and
  232. modname.startswith("six.moves"))
  233. if modname != 'six.moves' and not attribute_of:
  234. raise AstroidBuildingError(modname=modname)
  235. module = AstroidBuilder(MANAGER).string_build(_IMPORTS)
  236. module.name = 'six.moves'
  237. if attribute_of:
  238. # Facilitate import of submodules in Moves
  239. start_index = len(module.name)
  240. attribute = modname[start_index:].lstrip(".").replace(".", "_")
  241. try:
  242. import_attr = module.getattr(attribute)[0]
  243. except AttributeInferenceError:
  244. raise AstroidBuildingError(modname=modname)
  245. if isinstance(import_attr, nodes.Import):
  246. submodule = MANAGER.ast_from_module_name(import_attr.names[0][0])
  247. return submodule
  248. # Let dummy submodule imports pass through
  249. # This will cause an Uninferable result, which is okay
  250. return module
  251. def transform_six_add_metaclass(node):
  252. """Check if the given class node is decorated with *six.add_metaclass*
  253. If so, inject its argument as the metaclass of the underlying class.
  254. """
  255. if not node.decorators:
  256. return
  257. for decorator in node.decorators.nodes:
  258. if not isinstance(decorator, nodes.Call):
  259. continue
  260. try:
  261. func = next(decorator.func.infer())
  262. except InferenceError:
  263. continue
  264. if func.qname() == SIX_ADD_METACLASS and decorator.args:
  265. metaclass = decorator.args[0]
  266. node._metaclass = metaclass
  267. return node
  268. register_module_extender(MANAGER, 'six', six_moves_transform)
  269. register_module_extender(MANAGER, 'requests.packages.urllib3.packages.six',
  270. six_moves_transform)
  271. MANAGER.register_failed_import_hook(_six_fail_hook)
  272. MANAGER.register_transform(nodes.ClassDef, transform_six_add_metaclass)