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
|
"""Unittest for the base checker."""
import re
from astroid import test_utils
from pylint.checkers import base
from pylint.testutils import CheckerTestCase, Message, set_config
class DocstringTest(CheckerTestCase):
CHECKER_CLASS = base.DocStringChecker
def testMissingDocstringModule(self):
module = test_utils.build_module("")
with self.assertAddsMessages(Message('missing-docstring', node=module, args=('module',))):
self.checker.visit_module(module)
def testEmptyDocstringModule(self):
module = test_utils.build_module("''''''")
with self.assertAddsMessages(Message('empty-docstring', node=module, args=('module',))):
self.checker.visit_module(module)
def testEmptyDocstringFunction(self):
func = test_utils.extract_node("""
def func(tion):
pass""")
with self.assertAddsMessages(Message('missing-docstring', node=func, args=('function',))):
self.checker.visit_function(func)
@set_config(docstring_min_length=2)
def testShortFunctionNoDocstring(self):
func = test_utils.extract_node("""
def func(tion):
pass""")
with self.assertNoMessages():
self.checker.visit_function(func)
@set_config(docstring_min_length=2)
def testFunctionNoDocstringByName(self):
func = test_utils.extract_node("""
def __fun__(tion):
pass""")
with self.assertNoMessages():
self.checker.visit_function(func)
def testClassNoDocstring(self):
klass = test_utils.extract_node("""
class Klass(object):
pass""")
with self.assertAddsMessages(Message('missing-docstring', node=klass, args=('class',))):
self.checker.visit_class(klass)
class NameCheckerTest(CheckerTestCase):
CHECKER_CLASS = base.NameChecker
CONFIG = {
'bad_names': set(),
}
@set_config(attr_rgx=re.compile('[A-Z]+'))
def testPropertyNames(self):
# If a method is annotated with @property, it's name should
# match the attr regex. Since by default the attribute regex is the same
# as the method regex, we override it here.
methods = test_utils.extract_node("""
import abc
class FooClass(object):
@property
def FOO(self): #@
pass
@property
def bar(self): #@
pass
@abc.abstractproperty
def BAZ(self): #@
pass
""")
with self.assertNoMessages():
self.checker.visit_function(methods[0])
self.checker.visit_function(methods[2])
with self.assertAddsMessages(Message('invalid-name', node=methods[1],
args=('attribute', 'bar'))):
self.checker.visit_function(methods[1])
@set_config(attr_rgx=re.compile('[A-Z]+'))
def testPropertySetters(self):
method = test_utils.extract_node("""
class FooClass(object):
@property
def foo(self): pass
@foo.setter
def FOOSETTER(self): #@
pass
""")
with self.assertNoMessages():
self.checker.visit_function(method)
def testModuleLevelNames(self):
assign = test_utils.extract_node("""
import collections
Class = collections.namedtuple("a", ("b", "c")) #@
""")
with self.assertNoMessages():
self.checker.visit_assname(assign.targets[0])
assign = test_utils.extract_node("""
class ClassA(object):
pass
ClassB = ClassA
""")
with self.assertNoMessages():
self.checker.visit_assname(assign.targets[0])
module = test_utils.build_module("""
def A():
return 1, 2, 3
CONSTA, CONSTB, CONSTC = A()
CONSTD = A()""")
with self.assertNoMessages():
self.checker.visit_assname(module.body[1].targets[0].elts[0])
self.checker.visit_assname(module.body[2].targets[0])
assign = test_utils.extract_node("""
CONST = "12 34 ".rstrip().split()""")
with self.assertNoMessages():
self.checker.visit_assname(assign.targets[0])
if __name__ == '__main__':
from logilab.common.testlib import unittest_main
unittest_main()
|