pylint-flask-0.1/0000755000076500000240000000000012544067245013700 5ustar joestaff00000000000000pylint-flask-0.1/PKG-INFO0000644000076500000240000000132712544067245015000 0ustar joestaff00000000000000Metadata-Version: 1.1 Name: pylint-flask Version: 0.1 Summary: pylint-flask is a Pylint plugin to aid Pylint in recognising and understandingerrors caused when using Flask Home-page: https://github.com/jschaf/pylint-flask Author: Joe Schafer Author-email: joe@jschaf.com License: GPLv2 Description: UNKNOWN Keywords: pylint flask plugin Platform: UNKNOWN Classifier: Development Status :: 4 - Beta Classifier: Environment :: Console Classifier: Intended Audience :: Developers Classifier: Operating System :: Unix Classifier: Topic :: Software Development :: Quality Assurance Classifier: Programming Language :: Python :: 2.7 Classifier: Programming Language :: Python :: 3.3 Classifier: Programming Language :: Python :: 3.4 pylint-flask-0.1/pylint_flask/0000755000076500000240000000000012544067245016377 5ustar joestaff00000000000000pylint-flask-0.1/pylint_flask/__init__.py0000644000076500000240000001057512544066262020516 0ustar joestaff00000000000000'''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) pylint-flask-0.1/pylint_flask.egg-info/0000755000076500000240000000000012544067245020071 5ustar joestaff00000000000000pylint-flask-0.1/pylint_flask.egg-info/dependency_links.txt0000644000076500000240000000000112544067245024137 0ustar joestaff00000000000000 pylint-flask-0.1/pylint_flask.egg-info/PKG-INFO0000644000076500000240000000132712544067245021171 0ustar joestaff00000000000000Metadata-Version: 1.1 Name: pylint-flask Version: 0.1 Summary: pylint-flask is a Pylint plugin to aid Pylint in recognising and understandingerrors caused when using Flask Home-page: https://github.com/jschaf/pylint-flask Author: Joe Schafer Author-email: joe@jschaf.com License: GPLv2 Description: UNKNOWN Keywords: pylint flask plugin Platform: UNKNOWN Classifier: Development Status :: 4 - Beta Classifier: Environment :: Console Classifier: Intended Audience :: Developers Classifier: Operating System :: Unix Classifier: Topic :: Software Development :: Quality Assurance Classifier: Programming Language :: Python :: 2.7 Classifier: Programming Language :: Python :: 3.3 Classifier: Programming Language :: Python :: 3.4 pylint-flask-0.1/pylint_flask.egg-info/requires.txt0000644000076500000240000000011212544067245022463 0ustar joestaff00000000000000pylint-plugin-utils>=0.2.1 pylint>=1.0 astroid>=1.0 logilab-common>=0.60.0pylint-flask-0.1/pylint_flask.egg-info/SOURCES.txt0000644000076500000240000000034612544067245021760 0ustar joestaff00000000000000setup.py pylint_flask/__init__.py pylint_flask.egg-info/PKG-INFO pylint_flask.egg-info/SOURCES.txt pylint_flask.egg-info/dependency_links.txt pylint_flask.egg-info/requires.txt pylint_flask.egg-info/top_level.txt test/test_func.pypylint-flask-0.1/pylint_flask.egg-info/top_level.txt0000644000076500000240000000001512544067245022617 0ustar joestaff00000000000000pylint_flask pylint-flask-0.1/setup.cfg0000644000076500000240000000007312544067245015521 0ustar joestaff00000000000000[egg_info] tag_date = 0 tag_svn_revision = 0 tag_build = pylint-flask-0.1/setup.py0000644000076500000240000000266512543603402015411 0ustar joestaff00000000000000# -*- coding: utf-8 -*- from distutils.core import setup from setuptools import find_packages import sys _version = '0.1' _packages = find_packages(exclude=["*.tests", "*.tests.*", "tests.*", "tests"]) _short_description = "pylint-flask is a Pylint plugin to aid Pylint in recognising and understanding" \ "errors caused when using Flask" _classifiers = ( 'Development Status :: 4 - Beta', 'Environment :: Console', 'Intended Audience :: Developers', 'Operating System :: Unix', 'Topic :: Software Development :: Quality Assurance', 'Programming Language :: Python :: 2.7', 'Programming Language :: Python :: 3.3', 'Programming Language :: Python :: 3.4', ) _install_requires = [ 'pylint-plugin-utils>=0.2.1' ] if sys.version_info < (2, 7): # pylint 1.4 dropped support for Python 2.6 _install_requires += [ 'pylint>=1.0,<1.4', 'astroid>=1.0,<1.3.0', 'logilab-common>=0.60.0,<0.63', ] else: _install_requires += [ 'pylint>=1.0', 'astroid>=1.0', 'logilab-common>=0.60.0', ] setup( name='pylint-flask', url='https://github.com/jschaf/pylint-flask', author='Joe Schafer', author_email='joe@jschaf.com', description=_short_description, version=_version, packages=_packages, install_requires=_install_requires, license='GPLv2', classifiers=_classifiers, keywords='pylint flask plugin' ) pylint-flask-0.1/test/0000755000076500000240000000000012544067245014657 5ustar joestaff00000000000000pylint-flask-0.1/test/test_func.py0000644000076500000240000000206012543603706017216 0ustar joestaff00000000000000import os import unittest from logilab.common import testlib from pylint.testutils import make_tests, LintTestUsingFile, cb_test_gen, linter HERE = os.path.dirname(os.path.abspath(__file__)) linter.load_plugin_modules(['pylint_flask']) # remove required __revision__ linter.global_set_option('required-attributes', ()) def module_exists(module_name): try: __import__(module_name) except ImportError: return False else: return True def tests(input_dir, messages_dir): callbacks = [cb_test_gen(LintTestUsingFile)] input_dir = os.path.join(HERE, input_dir) messages_dir = os.path.join(HERE, messages_dir) return make_tests(input_dir, messages_dir, None, callbacks) def suite(): test_list = tests('input', 'messages') if module_exists('rest_framework'): test_list += tests('external_drf', '') return testlib.TestSuite( [unittest.makeSuite(test, suiteClass=testlib.TestSuite) for test in test_list]) if __name__ == '__main__': testlib.unittest_main(defaultTest='suite')