/usr/lib/python3/dist-packages/pylint_flask/__init__.py is in python3-pylint-flask 0.5-2.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
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 134 135 136 137 138 139 140 141 142 | '''pylint_flask module'''
from astroid import MANAGER
from astroid import nodes
import re
def register(_):
'''register is expected by pylint for plugins, but we are creating a
transform, not registering a checker.
'''
pass
def copy_node_info(src, dest):
"""Copy information from src to dest
Every node in the AST has to have line number information. Get
the information from the old stmt."""
for attr in ['lineno', 'fromlineno', 'tolineno',
'col_offset', 'parent']:
if hasattr(src, attr):
setattr(dest, attr, getattr(src, attr))
def mark_transformed(node):
'''Mark a node as transformed so we don't process it multiple times.'''
node.pylint_flask_was_transformed = True
def is_transformed(node):
'''Return True if `node` was already transformed.'''
return getattr(node, 'pylint_flask_was_transformed', False)
def make_non_magical_flask_import(flask_ext_name):
'''Convert a flask.ext.admin into flask_admin.'''
match = re.match(r'flask\.ext\.(.*)', flask_ext_name)
if match is None:
raise LookupError("Module name `{}` doesn't match"
"`flask.ext` style import.")
from_name = match.group(1)
actual_module_name = 'flask_{}'.format(from_name)
return actual_module_name
def transform_flask_from_import(node):
'''Translates a flask.ext from-style import into a non-magical import.
Translates:
from flask.ext import wtf, bcrypt as fcrypt
Into:
import flask_wtf as wtf, flask_bcrypt as fcrypt
'''
new_names = []
# node.names is a list of 2-tuples. Each tuple consists of (name, as_name).
# So, the import would be represented as:
#
# from flask.ext import wtf as ftw, admin
#
# node.names = [('wtf', 'ftw'), ('admin', None)]
for (name, as_name) in node.names:
actual_module_name = 'flask_{}'.format(name)
new_names.append((actual_module_name, as_name or name))
new_node = nodes.Import()
copy_node_info(node, new_node)
new_node.names = new_names
mark_transformed(new_node)
return new_node
def is_flask_from_import(node):
'''Predicate for checking if we have the flask module.'''
# Check for transformation first so we don't double process
return not is_transformed(node) and node.modname == 'flask.ext'
MANAGER.register_transform(nodes.From,
transform_flask_from_import,
is_flask_from_import)
def transform_flask_from_long(node):
'''Translates a flask.ext.wtf from-style import into a non-magical import.
Translates:
from flask.ext.wtf import Form
from flask.ext.admin.model import InlineFormAdmin
Into:
from flask_wtf import Form
from flask_admin.model import InlineFormAdmin
'''
actual_module_name = make_non_magical_flask_import(node.modname)
new_node = nodes.From(actual_module_name, node.names, node.level)
copy_node_info(node, new_node)
mark_transformed(new_node)
return new_node
def is_flask_from_import_long(node):
'''Check if an import is like `from flask.ext.wtf import Form`.'''
# Check for transformation first so we don't double process
return not is_transformed(node) and node.modname.startswith('flask.ext.')
MANAGER.register_transform(nodes.From,
transform_flask_from_long,
is_flask_from_import_long)
def transform_flask_bare_import(node):
'''Translates a flask.ext.wtf bare import into a non-magical import.
Translates:
import flask.ext.admin as admin
Into:
import flask_admin as admin
'''
new_names = []
for (name, as_name) in node.names:
match = re.match(r'flask\.ext\.(.*)', name)
from_name = match.group(1)
actual_module_name = 'flask_{}'.format(from_name)
new_names.append((actual_module_name, as_name))
new_node = nodes.Import()
copy_node_info(node, new_node)
new_node.names = new_names
mark_transformed(new_node)
return new_node
def is_flask_bare_import(node):
'''Check if an import is like `import flask.ext.admin as admin`.'''
return (not is_transformed(node) and
any(['flask.ext' in pair[0] for pair in node.names]))
MANAGER.register_transform(nodes.Import,
transform_flask_bare_import,
is_flask_bare_import)
|