cubicweb/pylintext.py
changeset 11217 1f686f55ef3d
parent 11057 0b59724cb3f2
child 11218 3fea2f3b25c1
equal deleted inserted replaced
11216:efecb78bf929 11217:1f686f55ef3d
     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)