equal
deleted
inserted
replaced
1 """https://pastebin.logilab.fr/show/860/""" |
1 """Pylint plugin for cubicweb""" |
2 |
2 |
3 from astroid import MANAGER, InferenceError, nodes, scoped_nodes |
3 from astroid import MANAGER, InferenceError, nodes, scoped_nodes, ClassDef, FunctionDef |
4 from astroid.builder import AstroidBuilder |
4 from astroid.builder import AstroidBuilder |
|
5 |
5 |
6 |
6 def turn_function_to_class(node): |
7 def turn_function_to_class(node): |
7 """turn a Function node into a Class node (in-place)""" |
8 """turn a Function node into a Class node (in-place)""" |
8 node.__class__ = scoped_nodes.Class |
9 node.__class__ = ClassDef |
9 node.bases = () |
10 node.bases = () |
10 # remove return nodes so that we don't get warned about 'return outside |
11 # remove return nodes so that we don't get warned about 'return outside |
11 # function' by pylint |
12 # function' by pylint |
12 for rnode in node.nodes_of_class(nodes.Return): |
13 for rnode in node.nodes_of_class(nodes.Return): |
13 rnode.parent.body.remove(rnode) |
14 rnode.parent.body.remove(rnode) |
17 def cubicweb_transform(module): |
18 def cubicweb_transform(module): |
18 # handle objectify_predicate decorator (and its former name until bw compat |
19 # handle objectify_predicate decorator (and its former name until bw compat |
19 # is kept). Only look at module level functions, should be enough. |
20 # is kept). Only look at module level functions, should be enough. |
20 for assnodes in module.locals.values(): |
21 for assnodes in module.locals.values(): |
21 for node in assnodes: |
22 for node in assnodes: |
22 if isinstance(node, scoped_nodes.Function) and node.decorators: |
23 if isinstance(node, FunctionDef) and node.decorators: |
23 for decorator in node.decorators.nodes: |
24 for decorator in node.decorators.nodes: |
24 try: |
25 try: |
25 for infered in decorator.infer(): |
26 for infered in decorator.infer(): |
26 if infered.name in ('objectify_predicate', 'objectify_selector'): |
27 if infered.name in ('objectify_predicate', 'objectify_selector'): |
27 turn_function_to_class(node) |
28 turn_function_to_class(node) |
43 def data(string): |
44 def data(string): |
44 return u'' |
45 return u'' |
45 ''') |
46 ''') |
46 module.locals['data'] = fake.locals['data'] |
47 module.locals['data'] = fake.locals['data'] |
47 |
48 |
|
49 |
48 def register(linter): |
50 def register(linter): |
49 """called when loaded by pylint --load-plugins, nothing to do here""" |
51 """called when loaded by pylint --load-plugins, nothing to do here""" |
50 MANAGER.register_transform(nodes.Module, cubicweb_transform) |
52 MANAGER.register_transform(nodes.Module, cubicweb_transform) |