diff options
author | Dmitry Pribysh <dmand@yandex.ru> | 2015-10-15 21:45:00 +0300 |
---|---|---|
committer | Dmitry Pribysh <dmand@yandex.ru> | 2015-10-15 21:45:00 +0300 |
commit | 6c6ec4a713118136ccdd9117693078e15fcccbbe (patch) | |
tree | 38f910fa37a5171c23d7a9e67fe6d55a56e63772 /pylint/test | |
parent | af2d53301e296856bba66e04b06d7544e5a6343d (diff) | |
download | pylint-6c6ec4a713118136ccdd9117693078e15fcccbbe.tar.gz |
Make iterable/mapping checker more smart and refactor it.
Now it ignores errors inside mixins declarations and is able to recognize
iterable/mapping metaclasses.
Diffstat (limited to 'pylint/test')
-rw-r--r-- | pylint/test/functional/iterable_context.py | 26 | ||||
-rw-r--r-- | pylint/test/functional/iterable_context_py2.py | 18 | ||||
-rw-r--r-- | pylint/test/functional/iterable_context_py2.rc | 3 | ||||
-rw-r--r-- | pylint/test/functional/iterable_context_py2.txt | 1 | ||||
-rw-r--r-- | pylint/test/functional/iterable_context_py3.py | 18 | ||||
-rw-r--r-- | pylint/test/functional/iterable_context_py3.rc | 3 | ||||
-rw-r--r-- | pylint/test/functional/iterable_context_py3.txt | 1 | ||||
-rw-r--r-- | pylint/test/functional/mapping_context.py | 33 | ||||
-rw-r--r-- | pylint/test/functional/mapping_context.txt | 3 | ||||
-rw-r--r-- | pylint/test/functional/mapping_context_py2.py | 19 | ||||
-rw-r--r-- | pylint/test/functional/mapping_context_py2.rc | 3 | ||||
-rw-r--r-- | pylint/test/functional/mapping_context_py2.txt | 1 | ||||
-rw-r--r-- | pylint/test/functional/mapping_context_py3.py | 19 | ||||
-rw-r--r-- | pylint/test/functional/mapping_context_py3.rc | 3 | ||||
-rw-r--r-- | pylint/test/functional/mapping_context_py3.txt | 1 | ||||
-rw-r--r-- | pylint/test/unittest_checker_typecheck.py | 8 |
16 files changed, 145 insertions, 15 deletions
diff --git a/pylint/test/functional/iterable_context.py b/pylint/test/functional/iterable_context.py index 47400f9..8dfcbbe 100644 --- a/pylint/test/functional/iterable_context.py +++ b/pylint/test/functional/iterable_context.py @@ -2,7 +2,7 @@ Checks that primitive values are not used in an iterating/mapping context. """ -# pylint: disable=missing-docstring,invalid-name,too-few-public-methods,no-init,no-self-use +# pylint: disable=missing-docstring,invalid-name,too-few-public-methods,no-init,no-self-use,import-error,unused-argument,bad-mcs-method-argument from __future__ import print_function # primitives @@ -115,3 +115,27 @@ for i in 8.5: # [not-an-iterable] for i in 10: # [not-an-iterable] pass + + +# skip uninferable instances +from some_missing_module import Iterable + +class MyClass(Iterable): + pass + +m = MyClass() +for i in m: + print(i) + +# skip checks if statement is inside mixin class +class ManagedAccessViewMixin(object): + access_requirements = None + + def get_access_requirements(self): + return self.access_requirements + + def dispatch(self, *_args, **_kwargs): + klasses = self.get_access_requirements() + + for requirement in klasses: + print(requirement) diff --git a/pylint/test/functional/iterable_context_py2.py b/pylint/test/functional/iterable_context_py2.py new file mode 100644 index 0000000..8687f84 --- /dev/null +++ b/pylint/test/functional/iterable_context_py2.py @@ -0,0 +1,18 @@ +""" +Checks that iterable metaclasses are recognized by pylint. +""" +# pylint: disable=missing-docstring,too-few-public-methods,no-init,no-self-use,unused-argument,bad-mcs-method-argument + +# metaclasses as iterables +class Meta(type): + def __iter__(self): + return iter((1, 2, 3)) + +class SomeClass(object): + __metaclass__ = Meta + + +for i in SomeClass: + print i +for i in SomeClass(): # [not-an-iterable] + print i diff --git a/pylint/test/functional/iterable_context_py2.rc b/pylint/test/functional/iterable_context_py2.rc new file mode 100644 index 0000000..61e01ea --- /dev/null +++ b/pylint/test/functional/iterable_context_py2.rc @@ -0,0 +1,3 @@ +[testoptions] +max_pyver=2.7 + diff --git a/pylint/test/functional/iterable_context_py2.txt b/pylint/test/functional/iterable_context_py2.txt new file mode 100644 index 0000000..8de579a --- /dev/null +++ b/pylint/test/functional/iterable_context_py2.txt @@ -0,0 +1 @@ +not-an-iterable:17::Non-iterable value SomeClass() is used in an iterating context diff --git a/pylint/test/functional/iterable_context_py3.py b/pylint/test/functional/iterable_context_py3.py new file mode 100644 index 0000000..cb2a505 --- /dev/null +++ b/pylint/test/functional/iterable_context_py3.py @@ -0,0 +1,18 @@ +""" +Checks that iterable metaclasses are recognized by pylint. +""" +# pylint: disable=missing-docstring,too-few-public-methods,no-init,no-self-use,unused-argument,bad-mcs-method-argument + +# metaclasses as iterables +class Meta(type): + def __iter__(self): + return iter((1, 2, 3)) + +class SomeClass(metaclass=Meta): + pass + + +for i in SomeClass: + print(i) +for i in SomeClass(): # [not-an-iterable] + print(i) diff --git a/pylint/test/functional/iterable_context_py3.rc b/pylint/test/functional/iterable_context_py3.rc new file mode 100644 index 0000000..9bf6df0 --- /dev/null +++ b/pylint/test/functional/iterable_context_py3.rc @@ -0,0 +1,3 @@ +[testoptions] +min_pyver=3.0 + diff --git a/pylint/test/functional/iterable_context_py3.txt b/pylint/test/functional/iterable_context_py3.txt new file mode 100644 index 0000000..8de579a --- /dev/null +++ b/pylint/test/functional/iterable_context_py3.txt @@ -0,0 +1 @@ +not-an-iterable:17::Non-iterable value SomeClass() is used in an iterating context diff --git a/pylint/test/functional/mapping_context.py b/pylint/test/functional/mapping_context.py index d9e0d2c..cfab8dc 100644 --- a/pylint/test/functional/mapping_context.py +++ b/pylint/test/functional/mapping_context.py @@ -1,7 +1,7 @@ """ Checks that only valid values are used in a mapping context. """ -# pylint: disable=missing-docstring,invalid-name,too-few-public-methods +# pylint: disable=missing-docstring,invalid-name,too-few-public-methods,no-self-use,import-error from __future__ import print_function @@ -22,9 +22,6 @@ class CustomMapping(object): def __init__(self): self.data = dict(a=1, b=2, c=3, d=4, e=5) - def __iter__(self): - return iter(self.data) - def __getitem__(self, key): return self.data[key] @@ -32,5 +29,31 @@ class CustomMapping(object): return self.data.keys() test(**CustomMapping()) - test(**CustomMapping) # [not-a-mapping] + +class NotMapping(object): + pass + +test(**NotMapping()) # [not-a-mapping] + +# skip checks if statement is inside mixin class +class SomeMixin(object): + kwargs = None + + def get_kwargs(self): + return self.kwargs + + def run(self, **kwargs): + print(kwargs) + + def dispatch(self): + kws = self.get_kwargs() + self.run(**kws) + +# skip uninferable instances +from some_missing_module import Mapping + +class MyClass(Mapping): + pass + +test(**MyClass()) diff --git a/pylint/test/functional/mapping_context.txt b/pylint/test/functional/mapping_context.txt index f27ca97..201da1a 100644 --- a/pylint/test/functional/mapping_context.txt +++ b/pylint/test/functional/mapping_context.txt @@ -1 +1,2 @@ -not-a-mapping:36::Non-mapping value CustomMapping is used in a mapping context +not-a-mapping:32::Non-mapping value CustomMapping is used in a mapping context +not-a-mapping:37::Non-mapping value NotMapping() is used in a mapping context diff --git a/pylint/test/functional/mapping_context_py2.py b/pylint/test/functional/mapping_context_py2.py new file mode 100644 index 0000000..afe4400 --- /dev/null +++ b/pylint/test/functional/mapping_context_py2.py @@ -0,0 +1,19 @@ +# pylint: disable=missing-docstring,invalid-name,too-few-public-methods +from __future__ import print_function + + +def test(**kwargs): + print(kwargs) + +# metaclasses as mappings +class Meta(type): + def __getitem__(self, key): + return ord(key) + def keys(self): + return ['a', 'b', 'c'] + +class SomeClass(object): + __metaclass__ = Meta + +test(**SomeClass) +test(**SomeClass()) # [not-a-mapping] diff --git a/pylint/test/functional/mapping_context_py2.rc b/pylint/test/functional/mapping_context_py2.rc new file mode 100644 index 0000000..61e01ea --- /dev/null +++ b/pylint/test/functional/mapping_context_py2.rc @@ -0,0 +1,3 @@ +[testoptions] +max_pyver=2.7 + diff --git a/pylint/test/functional/mapping_context_py2.txt b/pylint/test/functional/mapping_context_py2.txt new file mode 100644 index 0000000..59cca6c --- /dev/null +++ b/pylint/test/functional/mapping_context_py2.txt @@ -0,0 +1 @@ +not-a-mapping:19::Non-mapping value SomeClass() is used in a mapping context diff --git a/pylint/test/functional/mapping_context_py3.py b/pylint/test/functional/mapping_context_py3.py new file mode 100644 index 0000000..042d4d0 --- /dev/null +++ b/pylint/test/functional/mapping_context_py3.py @@ -0,0 +1,19 @@ +# pylint: disable=missing-docstring,invalid-name,too-few-public-methods,no-self-use +from __future__ import print_function + +def test(**kwargs): + print(kwargs) + +# metaclasses as mappings +class Meta(type): + def __getitem__(cls, key): + return ord(key) + + def keys(cls): + return ['a', 'b', 'c'] + +class SomeClass(metaclass=Meta): + pass + +test(**SomeClass) +test(**SomeClass()) # [not-a-mapping] diff --git a/pylint/test/functional/mapping_context_py3.rc b/pylint/test/functional/mapping_context_py3.rc new file mode 100644 index 0000000..9bf6df0 --- /dev/null +++ b/pylint/test/functional/mapping_context_py3.rc @@ -0,0 +1,3 @@ +[testoptions] +min_pyver=3.0 + diff --git a/pylint/test/functional/mapping_context_py3.txt b/pylint/test/functional/mapping_context_py3.txt new file mode 100644 index 0000000..59cca6c --- /dev/null +++ b/pylint/test/functional/mapping_context_py3.txt @@ -0,0 +1 @@ +not-a-mapping:19::Non-mapping value SomeClass() is used in a mapping context diff --git a/pylint/test/unittest_checker_typecheck.py b/pylint/test/unittest_checker_typecheck.py index b89a81b..0aaa8a5 100644 --- a/pylint/test/unittest_checker_typecheck.py +++ b/pylint/test/unittest_checker_typecheck.py @@ -1,19 +1,11 @@ """Unittest for the type checker.""" import unittest -import sys from astroid import test_utils from pylint.checkers import typecheck from pylint.testutils import CheckerTestCase, Message, set_config -def python33_and_newer(test): - """ - Decorator for any tests that will fail if launched not with Python 3.3+. - """ - return unittest.skipIf(sys.version_info < (3, 3), - 'Python 3.2 and older')(test) - class TypeCheckerTest(CheckerTestCase): "Tests for pylint.checkers.typecheck" CHECKER_CLASS = typecheck.TypeChecker |