blob: f0142a1e6fcd4e226847e257193a143a69cfc3b1 [file] [log] [blame]
import astroid
from pylint.checkers import BaseChecker, DeprecatedMixin
from pylint.interfaces import UNDEFINED, IAstroidChecker
from pylint.testutils import CheckerTestCase, Message
class _DeprecatedChecker(DeprecatedMixin, BaseChecker):
__implements__ = (IAstroidChecker,)
name = "deprecated"
def deprecated_methods(self):
return {"deprecated_func", ".Deprecated.deprecated_method"}
def deprecated_modules(self):
return {"deprecated_module"}
def deprecated_classes(self, module):
return ["DeprecatedClass"] if module == "deprecated" else []
def deprecated_arguments(self, method):
if method == "myfunction1":
# def myfunction1(arg1, deprecated_arg1='spam')
return ((1, "deprecated_arg1"),)
if method == "myfunction2":
# def myfunction2(arg1, deprecated_arg1, arg2='foo', deprecated_arg2='spam'))
return ((1, "deprecated_arg1"), (3, "deprecated_arg2"))
if method == "myfunction3":
# def myfunction1(arg1, *, deprecated_arg1='spam')
return ((None, "deprecated_arg1"),)
if method == ".MyClass.mymethod1":
# def mymethod1(self, arg1, deprecated_arg1=None)
return ((1, "deprecated_arg1"),)
if method == ".MyClass.mymethod2":
# def mymethod2(self, arg1, deprecated_arg1='bar', arg2='foo', deprecated_arg2='spam'))
return ((1, "deprecated_arg1"), (3, "deprecated_arg2"))
if method == ".MyClass.mymethod3":
# def mymethod1(self, arg1, *, deprecated_arg1=None)
return ((None, "deprecated_arg1"),)
if method == ".MyClass":
# def __init__(self, deprecated_arg=None)
return ((0, "deprecated_arg"),)
return ()
def deprecated_decorators(self):
return {".deprecated_decorator"}
class TestDeprecatedChecker(CheckerTestCase):
CHECKER_CLASS = _DeprecatedChecker
def test_deprecated_function(self):
# Tests detecting deprecated function
node = astroid.extract_node(
"""
def deprecated_func():
pass
deprecated_func()
"""
)
with self.assertAddsMessages(
Message(
msg_id="deprecated-method",
args=("deprecated_func",),
node=node,
confidence=UNDEFINED,
)
):
self.checker.visit_call(node)
def test_deprecated_method(self):
# Tests detecting deprecated method
node = astroid.extract_node(
"""
class Deprecated:
def deprecated_method():
pass
d = Deprecated()
d.deprecated_method()
"""
)
with self.assertAddsMessages(
Message(
msg_id="deprecated-method",
args=("deprecated_method",),
node=node,
confidence=UNDEFINED,
)
):
self.checker.visit_call(node)
def test_deprecated_method_alias(self):
# Tests detecting deprecated method defined as alias
# to existing method
node = astroid.extract_node(
"""
class Deprecated:
def _deprecated_method(self):
pass
deprecated_method = _deprecated_method
d = Deprecated()
d.deprecated_method()
"""
)
with self.assertAddsMessages(
Message(
msg_id="deprecated-method",
args=("deprecated_method",),
node=node,
confidence=UNDEFINED,
)
):
self.checker.visit_call(node)
def test_no_message(self):
# Tests not raising error when no deprecated functions/methods are present.
node = astroid.extract_node(
"""
class MyClass:
def mymethod():
pass
MyClass().mymethod()
def myfunc():
pass
myfunc()
"""
)
with self.assertNoMessages():
self.checker.visit_call(node)
def test_function_deprecated_arg(self):
# Tests raising error when calling function with deprecated argument
node = astroid.extract_node(
"""
def myfunction1(arg1, deprecated_arg1='spam'):
pass
myfunction1(None, 'deprecated')
"""
)
with self.assertAddsMessages(
Message(
msg_id="deprecated-argument",
args=("deprecated_arg1", "myfunction1"),
node=node,
confidence=UNDEFINED,
)
):
self.checker.visit_call(node)
def test_function_deprecated_kwarg(self):
# Tests raising error when calling function with deprecated keyword argument
node = astroid.extract_node(
"""
def myfunction1(arg1, deprecated_arg1='spam'):
pass
myfunction1(None, deprecated_arg1='deprecated')
"""
)
with self.assertAddsMessages(
Message(
msg_id="deprecated-argument",
args=("deprecated_arg1", "myfunction1"),
node=node,
confidence=UNDEFINED,
)
):
self.checker.visit_call(node)
def test_function_deprecated_not_used(self):
# Tests raising error when calling function without deprecated argument
node = astroid.extract_node(
"""
def myfunction1(arg1, deprecated_arg1='spam'):
pass
myfunction1(None)
"""
)
with self.assertNoMessages():
self.checker.visit_call(node)
def test_function_deprecated_kwarg_only(self):
# Tests raising error when calling function with deprecated keyword only argument
node = astroid.extract_node(
"""
def myfunction3(arg1, *, deprecated_arg1='spam'):
pass
myfunction3(None, deprecated_arg1='deprecated')
"""
)
with self.assertAddsMessages(
Message(
msg_id="deprecated-argument",
args=("deprecated_arg1", "myfunction3"),
node=node,
confidence=UNDEFINED,
)
):
self.checker.visit_call(node)
def test_method_deprecated_arg(self):
# Tests raising error when calling method with deprecated argument
node = astroid.extract_node(
"""
class MyClass:
def mymethod1(self, arg1, deprecated_arg1):
pass
MyClass().mymethod1(None, 'deprecated')
"""
)
with self.assertAddsMessages(
Message(
msg_id="deprecated-argument",
args=("deprecated_arg1", "mymethod1"),
node=node,
confidence=UNDEFINED,
)
):
self.checker.visit_call(node)
def test_method_deprecated_kwarg(self):
# Tests raising error when calling method with deprecated keyword argument
node = astroid.extract_node(
"""
class MyClass:
def mymethod1(self, arg1, deprecated_arg1):
pass
MyClass().mymethod1(None, deprecated_arg1='deprecated')
"""
)
with self.assertAddsMessages(
Message(
msg_id="deprecated-argument",
args=("deprecated_arg1", "mymethod1"),
node=node,
confidence=UNDEFINED,
)
):
self.checker.visit_call(node)
def test_method_deprecated_not_used(self):
# Tests raising error when calling method without deprecated argument
node = astroid.extract_node(
"""
class MyClass:
def mymethod1(self, arg1, deprecated_arg1):
pass
MyClass().mymethod1(None)
"""
)
with self.assertNoMessages():
self.checker.visit_call(node)
def test_method_deprecated_kwarg_only(self):
# Tests raising error when calling method with deprecated keyword only argument
node = astroid.extract_node(
"""
class MyClass:
def mymethod3(self, arg1, *, deprecated_arg1):
pass
MyClass().mymethod3(None, deprecated_arg1='deprecated')
"""
)
with self.assertAddsMessages(
Message(
msg_id="deprecated-argument",
args=("deprecated_arg1", "mymethod3"),
node=node,
confidence=UNDEFINED,
)
):
self.checker.visit_call(node)
def test_function_deprecated_arg_kwargs(self):
# Tests raising error when calling function with deprecated argument
# and keyword argument
node = astroid.extract_node(
"""
def myfunction2(arg1, deprecated_arg1, arg2='foo', deprecated_arg2='spam'):
pass
myfunction2(None, 'deprecated', deprecated_arg2='deprecated')
"""
)
with self.assertAddsMessages(
Message(
msg_id="deprecated-argument",
args=("deprecated_arg1", "myfunction2"),
node=node,
confidence=UNDEFINED,
),
Message(
msg_id="deprecated-argument",
args=("deprecated_arg2", "myfunction2"),
node=node,
confidence=UNDEFINED,
),
):
self.checker.visit_call(node)
def test_function_deprecated_kwarg_kwarg(self):
# Tests raising error when calling function with deprecated keyword arguments
node = astroid.extract_node(
"""
def myfunction2(arg1, deprecated_arg1, arg2='foo', deprecated_arg2='spam'):
pass
myfunction2(None, deprecated_arg1='deprecated', deprecated_arg2='deprecated')
"""
)
with self.assertAddsMessages(
Message(
msg_id="deprecated-argument",
args=("deprecated_arg1", "myfunction2"),
node=node,
confidence=UNDEFINED,
),
Message(
msg_id="deprecated-argument",
args=("deprecated_arg2", "myfunction2"),
node=node,
confidence=UNDEFINED,
),
):
self.checker.visit_call(node)
def test_method_deprecated_arg_kwargs(self):
# Tests raising error when calling method with deprecated argument
# and keyword argument
node = astroid.extract_node(
"""
class MyClass:
def mymethod2(self, arg1, deprecated_arg1, arg2='foo', deprecated_arg2='spam'):
pass
MyClass().mymethod2(None, 'deprecated', deprecated_arg2='deprecated')
"""
)
with self.assertAddsMessages(
Message(
msg_id="deprecated-argument",
args=("deprecated_arg1", "mymethod2"),
node=node,
confidence=UNDEFINED,
),
Message(
msg_id="deprecated-argument",
args=("deprecated_arg2", "mymethod2"),
node=node,
confidence=UNDEFINED,
),
):
self.checker.visit_call(node)
def test_method_deprecated_kwarg_kwarg(self):
# Tests raising error when calling method with deprecated keyword arguments
node = astroid.extract_node(
"""
class MyClass:
def mymethod2(self, arg1, deprecated_arg1, arg2='foo', deprecated_arg2='spam'):
pass
MyClass().mymethod2(None, deprecated_arg1='deprecated', deprecated_arg2='deprecated')
"""
)
with self.assertAddsMessages(
Message(
msg_id="deprecated-argument",
args=("deprecated_arg1", "mymethod2"),
node=node,
confidence=UNDEFINED,
),
Message(
msg_id="deprecated-argument",
args=("deprecated_arg2", "mymethod2"),
node=node,
confidence=UNDEFINED,
),
):
self.checker.visit_call(node)
def test_class_deprecated_arguments(self):
node = astroid.extract_node(
"""
class MyClass:
def __init__(self, deprecated_arg=None):
pass
MyClass(5)
"""
)
with self.assertAddsMessages(
Message(
msg_id="deprecated-argument",
args=("deprecated_arg", "MyClass"),
node=node,
confidence=UNDEFINED,
)
):
self.checker.visit_call(node)
def test_deprecated_module(self):
# Tests detecting deprecated module
node = astroid.extract_node(
"""
import deprecated_module
"""
)
with self.assertAddsMessages(
Message(
msg_id="deprecated-module",
args="deprecated_module",
node=node,
confidence=UNDEFINED,
)
):
self.checker.visit_import(node)
def test_deprecated_module_from(self):
# Tests detecting deprecated module
node = astroid.extract_node(
"""
from deprecated_module import myfunction
"""
)
with self.assertAddsMessages(
Message(
msg_id="deprecated-module",
args="deprecated_module",
node=node,
confidence=UNDEFINED,
)
):
self.checker.visit_importfrom(node)
def test_deprecated_class_import_from(self):
# Tests detecting deprecated class via import from
node = astroid.extract_node(
"""
from deprecated import DeprecatedClass
"""
)
with self.assertAddsMessages(
Message(
msg_id="deprecated-class",
args=("DeprecatedClass", "deprecated"),
node=node,
confidence=UNDEFINED,
)
):
self.checker.visit_importfrom(node)
def test_deprecated_class_import(self):
# Tests detecting deprecated class via import
node = astroid.extract_node(
"""
import deprecated.DeprecatedClass
"""
)
with self.assertAddsMessages(
Message(
msg_id="deprecated-class",
args=("DeprecatedClass", "deprecated"),
node=node,
confidence=UNDEFINED,
)
):
self.checker.visit_import(node)
def test_deprecated_class_call(self):
# Tests detecting deprecated class via call
node = astroid.extract_node(
"""
import deprecated
deprecated.DeprecatedClass()
"""
)
with self.assertAddsMessages(
Message(
msg_id="deprecated-class",
args=("DeprecatedClass", "deprecated"),
node=node,
confidence=UNDEFINED,
)
):
self.checker.visit_call(node)
def test_deprecated_decorator(self):
# Tests detecting deprecated decorator
node = astroid.extract_node(
"""
def deprecated_decorator(f):
def wrapper():
return f()
return wrapper
@deprecated_decorator #@
def function():
pass
"""
)
with self.assertAddsMessages(
Message(
msg_id="deprecated-decorator",
args=".deprecated_decorator",
node=node,
confidence=UNDEFINED,
)
):
self.checker.visit_decorators(node)
def test_deprecated_decorator_with_arguments(self):
# Tests detecting deprecated decorator with arguments
node = astroid.extract_node(
"""
def deprecated_decorator(arg1, arg2):
def wrapper(f):
def wrapped():
return f()
return wrapped
return wrapper
@deprecated_decorator(2, 3) #@
def function():
pass
"""
)
with self.assertAddsMessages(
Message(
msg_id="deprecated-decorator",
args=".deprecated_decorator",
node=node,
confidence=UNDEFINED,
)
):
self.checker.visit_decorators(node)