Pylint Werkzeug plugin
Hi all, I'm trying to extend pylint to recognize Werkzeug's import trickery. Werkzeug uses a variable called `all_by_module` in https://github.com/mitsuhiko/werkzeug/blob/master/werkzeug/__init__.py to lazily load modules. Pylint doesn't recognize this scheme and flags statements like: from werkzeug import secure_filename My attempt to fix the problem is at https://github.com/jschaf/pylint-werkzeug/blob/master/pylint_werkzeug/__init... I don't think I'm following an optimal path to success. Basically, I'm trying to recreate Python's import logic and then generate an AST with astroid. It's not going well. The current solution recurses endlessly, since creating the AST seems to trigger the pylint transform plugin. I'm looking for simpler or more robust alternatives to my current approach with imports. My problem seems somewhat related to the issue about changing flask.ext imports at https://bitbucket.org/logilab/astroid/issue/10/ Do you have any suggestions? Thanks, Joe Schafer
On Sat, Jun 27, 2015 at 8:18 AM, Joe Schafer
Hi all,
I'm trying to extend pylint to recognize Werkzeug's import trickery.
Werkzeug uses a variable called `all_by_module` in https://github.com/mitsuhiko/werkzeug/blob/master/werkzeug/__init__.py to lazily load modules. Pylint doesn't recognize this scheme and flags statements like:
from werkzeug import secure_filename
My attempt to fix the problem is at https://github.com/jschaf/pylint-werkzeug/blob/master/pylint_werkzeug/__init...
I don't think I'm following an optimal path to success. Basically, I'm trying to recreate Python's import logic and then generate an AST with astroid. It's not going well. The current solution recurses endlessly, since creating the AST seems to trigger the pylint transform plugin. I'm looking for simpler or more robust alternatives to my current approach with imports.
My problem seems somewhat related to the issue about changing flask.ext imports at https://bitbucket.org/logilab/astroid/issue/10/
Do you have any suggestions?
Thanks, Joe Schafer
Hi Joe, You could try something similar to the six.moves transform: https://bitbucket.org/logilab/astroid/src/0fa5de5411866d2d17ef0c6f43665f6463... Basically something along these lines: def werkzeug_transform(): code = textwrap.dedent(''' from werkzeug.useragents import UserAgent from werkzeug.http import parse_etags .... ''') return AstroidBuilder().string_build(code) astroid.register_module_extender(MANAGER, 'werkzeug', werkzeug_transform)
Thanks Claudiu, worked like a charm.
On Sat, Jun 27, 2015, 10:57 AM Claudiu Popa
On Sat, Jun 27, 2015 at 8:18 AM, Joe Schafer
wrote: Hi all,
I'm trying to extend pylint to recognize Werkzeug's import trickery.
Werkzeug uses a variable called `all_by_module` in https://github.com/mitsuhiko/werkzeug/blob/master/werkzeug/__init__.py to lazily load modules. Pylint doesn't recognize this scheme and flags statements like:
from werkzeug import secure_filename
My attempt to fix the problem is at
https://github.com/jschaf/pylint-werkzeug/blob/master/pylint_werkzeug/__init...
I don't think I'm following an optimal path to success. Basically, I'm trying to recreate Python's import logic and then generate an AST with astroid. It's not going well. The current solution recurses endlessly, since creating the AST seems to trigger the pylint transform plugin. I'm looking for simpler or more robust alternatives to my current approach
with
imports.
My problem seems somewhat related to the issue about changing flask.ext imports at https://bitbucket.org/logilab/astroid/issue/10/
Do you have any suggestions?
Thanks, Joe Schafer
Hi Joe,
You could try something similar to the six.moves transform:
https://bitbucket.org/logilab/astroid/src/0fa5de5411866d2d17ef0c6f43665f6463...
Basically something along these lines:
def werkzeug_transform(): code = textwrap.dedent(''' from werkzeug.useragents import UserAgent from werkzeug.http import parse_etags .... ''') return AstroidBuilder().string_build(code)
astroid.register_module_extender(MANAGER, 'werkzeug', werkzeug_transform)
participants (2)
-
Claudiu Popa
-
Joe Schafer