From 5f6964648de47f9f418c38a898ba34c265676bf5 Mon Sep 17 00:00:00 2001 From: Claudiu Popa Date: Wed, 11 Mar 2015 18:15:47 +0200 Subject: Remove abstract-class-not-used, for the same reasons as star-args and abstract-class-little-referenced. --- pylint/checkers/design_analysis.py | 39 +++------------------- .../functional/abstract_class_instantiated_py2.py | 2 +- .../functional/abstract_class_instantiated_py3.py | 1 - .../functional/abstract_class_instantiated_py3.txt | 8 ++--- .../functional/abstract_class_instantiated_py34.py | 4 +-- pylint/test/functional/abstract_method_py2.py | 1 - pylint/test/functional/abstract_method_py2.txt | 32 +++++++++--------- pylint/test/functional/abstract_method_py3.py | 1 - pylint/test/functional/abstract_method_py3.txt | 32 +++++++++--------- pylint/test/input/func_r0921.py | 15 --------- .../input/func_typecheck_callfunc_assigment.py | 2 +- pylint/test/messages/func_r0921.txt | 1 - pylintrc | 2 +- 13 files changed, 45 insertions(+), 95 deletions(-) delete mode 100644 pylint/test/input/func_r0921.py delete mode 100644 pylint/test/messages/func_r0921.txt diff --git a/pylint/checkers/design_analysis.py b/pylint/checkers/design_analysis.py index fe5e973..9ff10bf 100644 --- a/pylint/checkers/design_analysis.py +++ b/pylint/checkers/design_analysis.py @@ -18,7 +18,7 @@ import re from collections import defaultdict -from astroid import Function, If, InferenceError +from astroid import If, InferenceError from pylint.interfaces import IAstroidChecker from pylint.checkers import BaseChecker @@ -28,17 +28,6 @@ from pylint.checkers.utils import check_messages IGNORED_ARGUMENT_NAMES = re.compile('_.*') -def class_is_abstract(klass): - """return true if the given class node should be considered as an abstract - class - """ - for attr in klass.values(): - if isinstance(attr, Function): - if attr.is_abstract(pass_is_abstract=False): - return True - return False - - MSGS = { 'R0901': ('Too many ancestors (%s/%s)', 'too-many-ancestors', @@ -75,10 +64,6 @@ MSGS = { 'too-many-statements', 'Used when a function or method has too many statements. You \ should then split it in smaller functions / methods.'), - - 'R0921': ('Abstract class not referenced', - 'abstract-class-not-used', - 'Used when an abstract class is not used as ancestor anywhere.'), 'R0923': ('Interface not implemented', 'interface-not-implemented', 'Used when an interface class is not implemented anywhere.'), @@ -161,9 +146,7 @@ class MisdesignChecker(BaseChecker): self.stats = None self._returns = None self._branches = None - self._used_abstracts = None self._used_ifaces = None - self._abstracts = None self._ifaces = None self._stmts = 0 @@ -172,23 +155,17 @@ class MisdesignChecker(BaseChecker): self.stats = self.linter.add_stats() self._returns = [] self._branches = defaultdict(int) - self._used_abstracts = {} self._used_ifaces = {} - self._abstracts = [] self._ifaces = [] def close(self): - """check that abstract/interface classes are used""" - for abstract in self._abstracts: - if not abstract in self._used_abstracts: - self.add_message('abstract-class-not-used', node=abstract) + """check that interface classes are used""" for iface in self._ifaces: if not iface in self._used_ifaces: self.add_message('interface-not-implemented', node=iface) @check_messages('too-many-ancestors', 'too-many-instance-attributes', 'too-few-public-methods', 'too-many-public-methods', - 'abstract-class-not-used', 'interface-not-implemented') def visit_class(self, node): """check size of inheritance hierarchy and number of instance attributes @@ -205,10 +182,8 @@ class MisdesignChecker(BaseChecker): self.add_message('too-many-instance-attributes', node=node, args=(len(node.instance_attrs), self.config.max_attributes)) - # update abstract / interface classes structures - if class_is_abstract(node): - self._abstracts.append(node) - elif node.type == 'interface' and node.name != 'Interface': + # update interface classes structures + if node.type == 'interface' and node.name != 'Interface': self._ifaces.append(node) for parent in node.ancestors(False): if parent.name == 'Interface': @@ -220,11 +195,6 @@ class MisdesignChecker(BaseChecker): except InferenceError: # XXX log ? pass - for parent in node.ancestors(): - try: - self._used_abstracts[parent] += 1 - except KeyError: - self._used_abstracts[parent] = 1 @check_messages('too-few-public-methods', 'too-many-public-methods') def leave_class(self, node): @@ -355,7 +325,6 @@ class MisdesignChecker(BaseChecker): """increments the branches counter""" self._branches[node.scope()] += branchesnum - # FIXME: make a nice report... def register(linter): """required method to auto register this checker """ diff --git a/pylint/test/functional/abstract_class_instantiated_py2.py b/pylint/test/functional/abstract_class_instantiated_py2.py index 2fc575a..9b3f315 100644 --- a/pylint/test/functional/abstract_class_instantiated_py2.py +++ b/pylint/test/functional/abstract_class_instantiated_py2.py @@ -3,7 +3,7 @@ abstract methods. """ -# pylint: disable=too-few-public-methods, missing-docstring, abstract-class-not-used +# pylint: disable=too-few-public-methods, missing-docstring # pylint: disable=no-absolute-import, metaclass-assignment # pylint: disable=abstract-method diff --git a/pylint/test/functional/abstract_class_instantiated_py3.py b/pylint/test/functional/abstract_class_instantiated_py3.py index 561c605..be26b8c 100644 --- a/pylint/test/functional/abstract_class_instantiated_py3.py +++ b/pylint/test/functional/abstract_class_instantiated_py3.py @@ -4,7 +4,6 @@ abstract methods. """ # pylint: disable=too-few-public-methods, missing-docstring -# pylint: disable=abstract-class-not-used # pylint: disable=abstract-method __revision__ = 0 diff --git a/pylint/test/functional/abstract_class_instantiated_py3.txt b/pylint/test/functional/abstract_class_instantiated_py3.txt index b2e70a0..6469929 100644 --- a/pylint/test/functional/abstract_class_instantiated_py3.txt +++ b/pylint/test/functional/abstract_class_instantiated_py3.txt @@ -1,4 +1,4 @@ -abstract-class-instantiated:95:main:Abstract class 'BadMroAbstractMethods' with abstract methods instantiated -abstract-class-instantiated:96:main:Abstract class 'BadClass' with abstract methods instantiated -abstract-class-instantiated:97:main:Abstract class 'SecondBadClass' with abstract methods instantiated -abstract-class-instantiated:98:main:Abstract class 'ThirdBadClass' with abstract methods instantiated +abstract-class-instantiated:94:main:Abstract class 'BadMroAbstractMethods' with abstract methods instantiated +abstract-class-instantiated:95:main:Abstract class 'BadClass' with abstract methods instantiated +abstract-class-instantiated:96:main:Abstract class 'SecondBadClass' with abstract methods instantiated +abstract-class-instantiated:97:main:Abstract class 'ThirdBadClass' with abstract methods instantiated diff --git a/pylint/test/functional/abstract_class_instantiated_py34.py b/pylint/test/functional/abstract_class_instantiated_py34.py index 8f710a2..4dadef4 100644 --- a/pylint/test/functional/abstract_class_instantiated_py34.py +++ b/pylint/test/functional/abstract_class_instantiated_py34.py @@ -1,9 +1,9 @@ """ -Check that instantiating a class with `abc.ABCM` as ancestor fails if it +Check that instantiating a class with `abc.ABCMeta` as ancestor fails if it defines abstract methods. """ -# pylint: disable=too-few-public-methods, missing-docstring, abstract-class-not-used, no-init +# pylint: disable=too-few-public-methods, missing-docstring, no-init __revision__ = 0 diff --git a/pylint/test/functional/abstract_method_py2.py b/pylint/test/functional/abstract_method_py2.py index 341f5de..a7c0d6b 100644 --- a/pylint/test/functional/abstract_method_py2.py +++ b/pylint/test/functional/abstract_method_py2.py @@ -3,7 +3,6 @@ from __future__ import print_function # pylint: disable=missing-docstring, no-init, no-self-use # pylint: disable=too-few-public-methods -# pylint: disable=abstract-class-not-used import abc class Abstract(object): diff --git a/pylint/test/functional/abstract_method_py2.txt b/pylint/test/functional/abstract_method_py2.txt index 4ccf9ca..ce0c617 100644 --- a/pylint/test/functional/abstract_method_py2.txt +++ b/pylint/test/functional/abstract_method_py2.txt @@ -1,16 +1,16 @@ -abstract-method:29:Concret:"Method 'bbbb' is abstract in class 'Abstract' but is not overridden" -abstract-method:54:Container:"Method '__hash__' is abstract in class 'Structure' but is not overridden" -abstract-method:54:Container:"Method '__iter__' is abstract in class 'Structure' but is not overridden" -abstract-method:54:Container:"Method '__len__' is abstract in class 'Structure' but is not overridden" -abstract-method:60:Sizable:"Method '__contains__' is abstract in class 'Structure' but is not overridden" -abstract-method:60:Sizable:"Method '__hash__' is abstract in class 'Structure' but is not overridden" -abstract-method:60:Sizable:"Method '__iter__' is abstract in class 'Structure' but is not overridden" -abstract-method:66:Hashable:"Method '__contains__' is abstract in class 'Structure' but is not overridden" -abstract-method:66:Hashable:"Method '__iter__' is abstract in class 'Structure' but is not overridden" -abstract-method:66:Hashable:"Method '__len__' is abstract in class 'Structure' but is not overridden" -abstract-method:71:Iterator:"Method '__contains__' is abstract in class 'Structure' but is not overridden" -abstract-method:71:Iterator:"Method '__hash__' is abstract in class 'Structure' but is not overridden" -abstract-method:71:Iterator:"Method '__len__' is abstract in class 'Structure' but is not overridden" -abstract-method:90:BadComplexMro:"Method '__hash__' is abstract in class 'Structure' but is not overridden" -abstract-method:90:BadComplexMro:"Method '__len__' is abstract in class 'AbstractSizable' but is not overridden" -abstract-method:90:BadComplexMro:"Method 'length' is abstract in class 'AbstractSizable' but is not overridden" +abstract-method:28:Concret:"Method 'bbbb' is abstract in class 'Abstract' but is not overridden" +abstract-method:53:Container:"Method '__hash__' is abstract in class 'Structure' but is not overridden" +abstract-method:53:Container:"Method '__iter__' is abstract in class 'Structure' but is not overridden" +abstract-method:53:Container:"Method '__len__' is abstract in class 'Structure' but is not overridden" +abstract-method:59:Sizable:"Method '__contains__' is abstract in class 'Structure' but is not overridden" +abstract-method:59:Sizable:"Method '__hash__' is abstract in class 'Structure' but is not overridden" +abstract-method:59:Sizable:"Method '__iter__' is abstract in class 'Structure' but is not overridden" +abstract-method:65:Hashable:"Method '__contains__' is abstract in class 'Structure' but is not overridden" +abstract-method:65:Hashable:"Method '__iter__' is abstract in class 'Structure' but is not overridden" +abstract-method:65:Hashable:"Method '__len__' is abstract in class 'Structure' but is not overridden" +abstract-method:70:Iterator:"Method '__contains__' is abstract in class 'Structure' but is not overridden" +abstract-method:70:Iterator:"Method '__hash__' is abstract in class 'Structure' but is not overridden" +abstract-method:70:Iterator:"Method '__len__' is abstract in class 'Structure' but is not overridden" +abstract-method:89:BadComplexMro:"Method '__hash__' is abstract in class 'Structure' but is not overridden" +abstract-method:89:BadComplexMro:"Method '__len__' is abstract in class 'AbstractSizable' but is not overridden" +abstract-method:89:BadComplexMro:"Method 'length' is abstract in class 'AbstractSizable' but is not overridden" diff --git a/pylint/test/functional/abstract_method_py3.py b/pylint/test/functional/abstract_method_py3.py index 93e2cf1..e7b0445 100644 --- a/pylint/test/functional/abstract_method_py3.py +++ b/pylint/test/functional/abstract_method_py3.py @@ -3,7 +3,6 @@ from __future__ import print_function # pylint: disable=missing-docstring, no-init, no-self-use # pylint: disable=too-few-public-methods -# pylint: disable=abstract-class-not-used import abc class Abstract(object): diff --git a/pylint/test/functional/abstract_method_py3.txt b/pylint/test/functional/abstract_method_py3.txt index fd01e9a..7d83f38 100644 --- a/pylint/test/functional/abstract_method_py3.txt +++ b/pylint/test/functional/abstract_method_py3.txt @@ -1,16 +1,16 @@ -abstract-method:29:Concret:"Method 'bbbb' is abstract in class 'Abstract' but is not overridden" -abstract-method:52:Container:"Method '__hash__' is abstract in class 'Structure' but is not overridden" -abstract-method:52:Container:"Method '__iter__' is abstract in class 'Structure' but is not overridden" -abstract-method:52:Container:"Method '__len__' is abstract in class 'Structure' but is not overridden" -abstract-method:58:Sizable:"Method '__contains__' is abstract in class 'Structure' but is not overridden" -abstract-method:58:Sizable:"Method '__hash__' is abstract in class 'Structure' but is not overridden" -abstract-method:58:Sizable:"Method '__iter__' is abstract in class 'Structure' but is not overridden" -abstract-method:64:Hashable:"Method '__contains__' is abstract in class 'Structure' but is not overridden" -abstract-method:64:Hashable:"Method '__iter__' is abstract in class 'Structure' but is not overridden" -abstract-method:64:Hashable:"Method '__len__' is abstract in class 'Structure' but is not overridden" -abstract-method:69:Iterator:"Method '__contains__' is abstract in class 'Structure' but is not overridden" -abstract-method:69:Iterator:"Method '__hash__' is abstract in class 'Structure' but is not overridden" -abstract-method:69:Iterator:"Method '__len__' is abstract in class 'Structure' but is not overridden" -abstract-method:88:BadComplexMro:"Method '__hash__' is abstract in class 'Structure' but is not overridden" -abstract-method:88:BadComplexMro:"Method '__len__' is abstract in class 'AbstractSizable' but is not overridden" -abstract-method:88:BadComplexMro:"Method 'length' is abstract in class 'AbstractSizable' but is not overridden" +abstract-method:28:Concret:"Method 'bbbb' is abstract in class 'Abstract' but is not overridden" +abstract-method:51:Container:"Method '__hash__' is abstract in class 'Structure' but is not overridden" +abstract-method:51:Container:"Method '__iter__' is abstract in class 'Structure' but is not overridden" +abstract-method:51:Container:"Method '__len__' is abstract in class 'Structure' but is not overridden" +abstract-method:57:Sizable:"Method '__contains__' is abstract in class 'Structure' but is not overridden" +abstract-method:57:Sizable:"Method '__hash__' is abstract in class 'Structure' but is not overridden" +abstract-method:57:Sizable:"Method '__iter__' is abstract in class 'Structure' but is not overridden" +abstract-method:63:Hashable:"Method '__contains__' is abstract in class 'Structure' but is not overridden" +abstract-method:63:Hashable:"Method '__iter__' is abstract in class 'Structure' but is not overridden" +abstract-method:63:Hashable:"Method '__len__' is abstract in class 'Structure' but is not overridden" +abstract-method:68:Iterator:"Method '__contains__' is abstract in class 'Structure' but is not overridden" +abstract-method:68:Iterator:"Method '__hash__' is abstract in class 'Structure' but is not overridden" +abstract-method:68:Iterator:"Method '__len__' is abstract in class 'Structure' but is not overridden" +abstract-method:87:BadComplexMro:"Method '__hash__' is abstract in class 'Structure' but is not overridden" +abstract-method:87:BadComplexMro:"Method '__len__' is abstract in class 'AbstractSizable' but is not overridden" +abstract-method:87:BadComplexMro:"Method 'length' is abstract in class 'AbstractSizable' but is not overridden" diff --git a/pylint/test/input/func_r0921.py b/pylint/test/input/func_r0921.py deleted file mode 100644 index 1baf0a8..0000000 --- a/pylint/test/input/func_r0921.py +++ /dev/null @@ -1,15 +0,0 @@ -"""test max methods""" -__revision__ = None - -class Aaaa(object): - """yo""" - def __init__(self): - pass - - def meth1(self): - """hehehe""" - raise NotImplementedError - - def meth2(self): - """hehehe""" - return 'Yo', self diff --git a/pylint/test/input/func_typecheck_callfunc_assigment.py b/pylint/test/input/func_typecheck_callfunc_assigment.py index 3a668ab..0fb1ed4 100644 --- a/pylint/test/input/func_typecheck_callfunc_assigment.py +++ b/pylint/test/input/func_typecheck_callfunc_assigment.py @@ -1,4 +1,4 @@ -# pylint: disable=R0921, print-statement +# pylint: disable=print-statement """check assignment to function call where the function doesn't return 'E1111': ('Assigning to function call which doesn\'t return', diff --git a/pylint/test/messages/func_r0921.txt b/pylint/test/messages/func_r0921.txt deleted file mode 100644 index 7e9a442..0000000 --- a/pylint/test/messages/func_r0921.txt +++ /dev/null @@ -1 +0,0 @@ -R: 4:Aaaa: Abstract class not referenced diff --git a/pylintrc b/pylintrc index e1a8f4b..bd60a2a 100644 --- a/pylintrc +++ b/pylintrc @@ -60,7 +60,7 @@ confidence= # --enable=similarities". If you want to run only the classes checker, but have # no Warning level messages displayed, use"--disable=all --enable=classes # --disable=W" -disable=C0103,C0111,C0302,C0330,C0401,C0402,C0403,C1001,E0001,E0011,E0012,E0100,E0101,E0102,E0103,E0104,E0105,E0106,E0107,E0108,E0109,E0110,E0111,E0202,E0203,E0211,E0213,E0221,E0222,E0235,E0236,E0237,E0238,E0239,E0601,E0602,E0603,E0604,E0611,E0701,E0702,E0710,E0711,E0712,E1001,E1002,E1003,E1004,E1101,E1102,E1111,E1120,E1121,E1123,E1124,E1126,E1127,E1200,E1201,E1205,E1206,E1300,E1301,E1302,E1303,E1304,E1305,E1306,E1310,E1601,E1602,E1603,E1604,E1605,E1606,E1607,E1608,F0001,F0002,F0003,F0010,F0202,F0220,F0401,I0001,I0010,I0011,I0012,I0013,I0020,I0021,I0022,R0201,R0401,R0801,R0901,R0902,R0903,R0904,R0911,R0912,R0913,R0914,R0915,R0921,R0923,W0101,W0102,W0104,W0105,W0106,W0107,W0108,W0109,W0110,W0120,W0122,W0123,W0141,W0142,W0150,W0199,W0201,W0211,W0212,W0221,W0222,W0223,W0231,W0232,W0233,W0234,W0301,W0311,W0312,W0332,W0401,W0402,W0403,W0404,W0406,W0410,W0511,W0512,W0601,W0602,W0603,W0604,W0611,W0612,W0613,W0614,W0621,W0622,W0623,W0631,W0632,W0633,W0640,W0702,W0703,W0704,W0710,W0711,W1001,W1111,W1201,W1202,W1300,W1301,W1302,W1303,W1304,W1305,W1306,W1307,W1401,W1402,W1501,W1502,W1503,W1504,W1601,W1602,W1603,W1604,W1605,W1606,W1607,W1608,W1609,W1610,W1611,W1612,W1613,W1614,W1615,W1616,W1617,W1618,W1619,W1620,W1621,W1622,W1623,W1624,W1625,W1626,W1627,W1628,W1629,W1630,W1632,W1633,W1634,W1635,W1636,W1637,W1638,W1639 +disable=C0103,C0111,C0302,C0330,C0401,C0402,C0403,C1001,E0001,E0011,E0012,E0100,E0101,E0102,E0103,E0104,E0105,E0106,E0107,E0108,E0109,E0110,E0111,E0202,E0203,E0211,E0213,E0221,E0222,E0235,E0236,E0237,E0238,E0239,E0601,E0602,E0603,E0604,E0611,E0701,E0702,E0710,E0711,E0712,E1001,E1002,E1003,E1004,E1101,E1102,E1111,E1120,E1121,E1123,E1124,E1126,E1127,E1200,E1201,E1205,E1206,E1300,E1301,E1302,E1303,E1304,E1305,E1306,E1310,E1601,E1602,E1603,E1604,E1605,E1606,E1607,E1608,F0001,F0002,F0003,F0010,F0202,F0220,F0401,I0001,I0010,I0011,I0012,I0013,I0020,I0021,I0022,R0201,R0401,R0801,R0901,R0902,R0903,R0904,R0911,R0912,R0913,R0914,R0915,R0923,W0101,W0102,W0104,W0105,W0106,W0107,W0108,W0109,W0110,W0120,W0122,W0123,W0141,W0142,W0150,W0199,W0201,W0211,W0212,W0221,W0222,W0223,W0231,W0232,W0233,W0234,W0301,W0311,W0312,W0332,W0401,W0402,W0403,W0404,W0406,W0410,W0511,W0512,W0601,W0602,W0603,W0604,W0611,W0612,W0613,W0614,W0621,W0622,W0623,W0631,W0632,W0633,W0640,W0702,W0703,W0704,W0710,W0711,W1001,W1111,W1201,W1202,W1300,W1301,W1302,W1303,W1304,W1305,W1306,W1307,W1401,W1402,W1501,W1502,W1503,W1504,W1601,W1602,W1603,W1604,W1605,W1606,W1607,W1608,W1609,W1610,W1611,W1612,W1613,W1614,W1615,W1616,W1617,W1618,W1619,W1620,W1621,W1622,W1623,W1624,W1625,W1626,W1627,W1628,W1629,W1630,W1632,W1633,W1634,W1635,W1636,W1637,W1638,W1639 [REPORTS] -- cgit v1.2.1