diff options
-rw-r--r-- | CONTRIBUTORS.txt | 2 | ||||
-rw-r--r-- | pylint/checkers/stdlib.py | 132 | ||||
-rw-r--r-- | pylint/test/functional/deprecated_methods_py2.py | 9 | ||||
-rw-r--r-- | pylint/test/functional/deprecated_methods_py2.rc | 2 | ||||
-rw-r--r-- | pylint/test/functional/deprecated_methods_py2.txt | 4 | ||||
-rw-r--r-- | pylint/test/functional/deprecated_methods_py3.py | 15 | ||||
-rw-r--r-- | pylint/test/functional/deprecated_methods_py3.rc | 2 | ||||
-rw-r--r-- | pylint/test/functional/deprecated_methods_py3.txt | 3 | ||||
-rw-r--r-- | pylint/test/functional/duplicate_dict_literal_key.py | 2 | ||||
-rw-r--r-- | pylint/test/functional/logging_not_lazy.py | 8 | ||||
-rw-r--r-- | pylint/test/unittest_checker_stdlib.py | 122 |
11 files changed, 125 insertions, 176 deletions
diff --git a/CONTRIBUTORS.txt b/CONTRIBUTORS.txt index ac8800d..e88762a 100644 --- a/CONTRIBUTORS.txt +++ b/CONTRIBUTORS.txt @@ -66,3 +66,5 @@ Order doesn't matter (not that much, at least ;) Maarten ter Huurne, Mirko Friedenhagen and all the Logilab's team (among others): bug reports, feedback, feature requests... Many other people have contributed by their feedback or even patches, if I've forgotten you, send me a note ! + +* Cezar Elnazli: deprecated-method diff --git a/pylint/checkers/stdlib.py b/pylint/checkers/stdlib.py index 52251c5..aa4dab1 100644 --- a/pylint/checkers/stdlib.py +++ b/pylint/checkers/stdlib.py @@ -27,7 +27,8 @@ from pylint.checkers import BaseChecker from pylint.checkers import utils -TYPECHECK_COMPARISON_OPERATORS = frozenset(('is', 'is not', '==', '!=', 'in', 'not in')) +TYPECHECK_COMPARISON_OPERATORS = frozenset(('is', 'is not', '==', + '!=', 'in', 'not in')) LITERAL_NODE_TYPES = (astroid.Const, astroid.Dict, astroid.List, astroid.Set) if sys.version_info >= (3, 0): @@ -125,52 +126,76 @@ class StdlibChecker(BaseChecker): 'alternative in the documentation.'), } - options = (('deprecated-methods', - {'default': ( - 'asyncio.tasks.async', - 'base64.encodestring', 'base64.decodestring', - 'cgi.parse_qs', 'cgi.parse_qsl', 'cgi.escape', - 'configparser.RawConfigParser.readfp', - 'ctypes.c_buffer', - 'distutils.command.register.register.check_metadata', - 'distutils.command.sdist.sdist.check_metadata', - 'fractions.gcd', - 'html.unescape', - 'importlib.find_loader', - 'inspect.getmoduleinfo', 'inspect.getargspec', - 'inspect.Signature.from_function', - 'inspect.Signature.from_builtin', - 'logging.warn', 'logging.Logger.warn', - 'logging.LoggerAdapter.warn', - 'nntplib._NNTPBase.xgtitle', 'nntplib._NNTPBase.xpath', - 'ntpath.splitunc', - 'platform.linux_distribution', 'platform.dist', - 'platform.popen', - 'plistlib.readPlist', 'plistlib.writePlist', - 'plistlib.readPlistFromBytes', - 'plistlib.writePlistToBytes', - 'sre_parse.isident', 'sre_parse.isdigit', - 'sre_parse.isname', - 'tarfile.filemode', - 'tkinter.Misc.tk_menuBar', - 'tkinter.Menu.tk_bindForTraversal', - 'trace.usage', 'trace.modname', 'trace.fullmodname', - 'trace.find_lines_from_code', 'trace.find_lines', - 'trace.find_strings', 'trace.find_executable_linenos', - 'unittest.case.TestCase._deprecate.deprecated_func', - 'unittest.case.TestCase.assertEquals', - 'unittest.case.TestCase.assertNotEquals', - 'unittest.case.TestCase.assertAlmostEquals', - 'unittest.case.TestCase.assertNotAlmostEquals', - 'unittest.case.TestCase.assert_', - 'xml.etree.Element.getchildren', - 'xml.etree.Element.getiterator', - 'xml.etree.XMLParser.getiterator', - 'xml.etree.XMLParser.doctype', - ), 'type': 'csv', 'metavar': '<names>', - 'help': 'Methods considered deprecated'} - ), - ) + deprecated = { + 0: [ + 'cgi.parse_qs', 'cgi.parse_qsl', + 'ctypes.c_buffer', + 'distutils.command.register.register.check_metadata', + 'distutils.command.sdist.sdist.check_metadata', + 'tkinter.Misc.tk_menuBar', + 'tkinter.Menu.tk_bindForTraversal', + ], + 2: { + (2, 6): [ + 'commands.getstatus', + 'os.popen2', + 'os.popen3', + 'os.popen4', + 'macostools.touched', + ], + (2, 7): [ + 'unittest.case.TestCase.assertEquals', + 'unittest.case.TestCase.assertNotEquals', + 'unittest.case.TestCase.assertAlmostEquals', + 'unittest.case.TestCase.assertNotAlmostEquals', + 'unittest.case.TestCase.assert_', + 'xml.etree.ElementTree.Element.getchildren', + 'xml.etree.ElementTree.Element.getiterator', + 'xml.etree.ElementTree.XMLParser.getiterator', + 'xml.etree.ElementTree.XMLParser.doctype', + ], + }, + 3: { + (3, 0): [ + 'inspect.getargspec', + 'unittest.case.TestCase._deprecate.deprecated_func', + ], + (3, 1): [ + 'base64.encodestring', 'base64.decodestring', + 'ntpath.splitunc', + ], + (3, 2): [ + 'cgi.escape', + 'configparser.RawConfigParser.readfp', + 'xml.etree.ElementTree.Element.getchildren', + 'xml.etree.ElementTree.Element.getiterator', + 'xml.etree.ElementTree.XMLParser.getiterator', + 'xml.etree.ElementTree.XMLParser.doctype', + ], + (3, 3): [ + 'inspect.getmoduleinfo', 'inspect.getmodulename', + 'logging.warn', 'logging.Logger.warn', + 'logging.LoggerAdapter.warn', + 'nntplib.NNTPBase.xpath', + 'platform.popen', + ], + (3, 4): [ + 'asyncio.tasks.async', + 'importlib.find_loader', + 'plistlib.readPlist', 'plistlib.writePlist', + 'plistlib.readPlistFromBytes', + 'plistlib.writePlistToBytes', + 'xml.etree.ElementTree.iterparse', + ], + (3, 5): [ + 'fractions.gcd', + 'inspect.getfullargspec', 'inspect.getargvalues', + 'inspect.formatargspec', 'inspect.formatargvalues', + 'inspect.getcallargs', + 'platform.linux_distribution', 'platform.dist', + ], + }, + } @utils.check_messages('bad-open-mode', 'redundant-unittest-assert', 'deprecated-method') @@ -213,9 +238,18 @@ class StdlibChecker(BaseChecker): self._check_type_x_is_y(node, left, operator, right) def _check_deprecated_method(self, node, infer): - if infer.qname() in self.config.deprecated_methods: + py_vers = sys.version_info[0] + qname = infer.qname() + + if qname in self.deprecated[0]: self.add_message('deprecated-method', node=node, - args=(infer.name, )) + args=(node.func.attrname, )) + else: + for since_vers, func_list in self.deprecated[py_vers].items(): + if since_vers < sys.version_info and qname in func_list: + self.add_message('deprecated-method', node=node, + args=(node.func.attrname, )) + break def _check_redundant_assert(self, node, infer): if (isinstance(infer, astroid.BoundMethod) and diff --git a/pylint/test/functional/deprecated_methods_py2.py b/pylint/test/functional/deprecated_methods_py2.py new file mode 100644 index 0000000..3b3d25a --- /dev/null +++ b/pylint/test/functional/deprecated_methods_py2.py @@ -0,0 +1,9 @@ +""" Functional test for deprecated methods in Python 2 """ +# pylint: disable=no-member +import os +import xml.etree.ElementTree + +os.popen2() # [deprecated-method] +os.popen3() # [deprecated-method] +os.popen4() # [deprecated-method] +xml.etree.ElementTree.Element('elem').getchildren() # [deprecated-method] diff --git a/pylint/test/functional/deprecated_methods_py2.rc b/pylint/test/functional/deprecated_methods_py2.rc new file mode 100644 index 0000000..a650233 --- /dev/null +++ b/pylint/test/functional/deprecated_methods_py2.rc @@ -0,0 +1,2 @@ +[testoptions] +max_pyver=3.0 diff --git a/pylint/test/functional/deprecated_methods_py2.txt b/pylint/test/functional/deprecated_methods_py2.txt new file mode 100644 index 0000000..226e8d3 --- /dev/null +++ b/pylint/test/functional/deprecated_methods_py2.txt @@ -0,0 +1,4 @@ +deprecated-method:5::Using deprecated method popen2() +deprecated-method:6::Using deprecated method popen3() +deprecated-method:7::Using deprecated method popen4() +deprecated-method:8::Using deprecated method getchildren() diff --git a/pylint/test/functional/deprecated_methods_py3.py b/pylint/test/functional/deprecated_methods_py3.py new file mode 100644 index 0000000..1a5fbf0 --- /dev/null +++ b/pylint/test/functional/deprecated_methods_py3.py @@ -0,0 +1,15 @@ +""" Functional tests for method deprecation. """ +# pylint: disable=missing-docstring +import unittest +import distutils +import xml.etree.ElementTree + + +class MyTest(unittest.TestCase): + def test(self): + self.assert_(True) # [deprecated-method] + +REG = distutils.command.register.register('a') +REG.check_metadata() # [deprecated-method] + +xml.etree.ElementTree.Element('tag').getchildren() # [deprecated-method] diff --git a/pylint/test/functional/deprecated_methods_py3.rc b/pylint/test/functional/deprecated_methods_py3.rc new file mode 100644 index 0000000..c093be2 --- /dev/null +++ b/pylint/test/functional/deprecated_methods_py3.rc @@ -0,0 +1,2 @@ +[testoptions] +min_pyver=3.0 diff --git a/pylint/test/functional/deprecated_methods_py3.txt b/pylint/test/functional/deprecated_methods_py3.txt new file mode 100644 index 0000000..8e9516c --- /dev/null +++ b/pylint/test/functional/deprecated_methods_py3.txt @@ -0,0 +1,3 @@ +deprecated-method:10:MyTest.test:Using deprecated method assert_() +deprecated-method:13::Using deprecated method check_metadata() +deprecated-method:15::Using deprecated method getchildren() diff --git a/pylint/test/functional/duplicate_dict_literal_key.py b/pylint/test/functional/duplicate_dict_literal_key.py index f74e10e..3fae8b7 100644 --- a/pylint/test/functional/duplicate_dict_literal_key.py +++ b/pylint/test/functional/duplicate_dict_literal_key.py @@ -1,5 +1,5 @@ """Check multiple key definition""" -#pylint: disable=C0103 +# pylint: disable=C0103 correct_dict = { 'tea': 'for two', diff --git a/pylint/test/functional/logging_not_lazy.py b/pylint/test/functional/logging_not_lazy.py index ccc8665..b843431 100644 --- a/pylint/test/functional/logging_not_lazy.py +++ b/pylint/test/functional/logging_not_lazy.py @@ -1,13 +1,13 @@ -# pylint: disable=missing-docstring,no-member +# pylint: disable=missing-docstring,no-member,deprecated-method # Muck up the names in an effort to confuse... import logging as renamed_logging import os as logging # Statements that should be flagged: -renamed_logging.warn('%s, %s' % (4, 5)) # [logging-not-lazy] -renamed_logging.exception('%s' % 'Exceptional!') # [logging-not-lazy] -renamed_logging.log(renamed_logging.INFO, 'msg: %s' % 'Run!') # [logging-not-lazy] +renamed_logging.warn('%s, %s' % (4, 5)) # [logging-not-lazy] +renamed_logging.exception('%s' % 'Exceptional!') # [logging-not-lazy] +renamed_logging.log(renamed_logging.INFO, 'msg: %s' % 'Run!') # [logging-not-lazy] # Statements that should not be flagged: renamed_logging.warn('%s, %s', 4, 5) diff --git a/pylint/test/unittest_checker_stdlib.py b/pylint/test/unittest_checker_stdlib.py deleted file mode 100644 index b8bed76..0000000 --- a/pylint/test/unittest_checker_stdlib.py +++ /dev/null @@ -1,122 +0,0 @@ -"""Unit tests for the imports checker.""" -import unittest - -from astroid import test_utils -from pylint.checkers import stdlib -from pylint.testutils import CheckerTestCase, Message - - -class StdlibCheckerTC(CheckerTestCase): - - CHECKER_CLASS = stdlib.StdlibChecker - - def test_asyncio_deprecated(self): - """ - `asyncio.async` is deprecated. - """ - node = test_utils.extract_node(""" - import asyncio - asyncio.async() - """) - msg = Message(msg_id='deprecated-method', node=node, - args=('async', )) - with self.assertAddsMessages(msg): - self.checker.visit_call(node) - - def test_base64_deprecated(self): - """ - `base64.encodestring` and `base64.decodestring` are deprecated. - """ - node = test_utils.extract_node(""" - import base64 - base64.encodestring('a') - """) - msg = Message(msg_id='deprecated-method', node=node, - args=('encodestring', )) - with self.assertAddsMessages(msg): - self.checker.visit_call(node) - - node = test_utils.extract_node(""" - import base64 - base64.decodestring('a') - """) - msg = Message(msg_id='deprecated-method', node=node, - args=('decodestring', )) - with self.assertAddsMessages(msg): - self.checker.visit_call(node) - - def test_cgi_deprecated(self): - """ - All deprecated methods in package `cgi` - """ - - node = test_utils.extract_node(""" - from cgi import parse_qs - parse_qs() - """) - msg = Message(msg_id='deprecated-method', node=node, - args=('parse_qs', )) - with self.assertAddsMessages(msg): - self.checker.visit_call(node) - - node = test_utils.extract_node(""" - import cgi - cgi.parse_qsl() - """) - msg = Message(msg_id='deprecated-method', node=node, - args=('parse_qsl', )) - with self.assertAddsMessages(msg): - self.checker.visit_call(node) - - node = test_utils.extract_node(""" - from cgi import escape - escape() - """) - msg = Message(msg_id='deprecated-method', node=node, - args=('escape', )) - with self.assertAddsMessages(msg): - self.checker.visit_call(node) - - def test_unittest_deprecated(self): - """ - Deprecated methods in package `unittest` - """ - node = test_utils.extract_node(""" - import unittest - class TestMe(unittest.TestCase): - def test(self): - self.failIf(True) - """) - msg = Message(msg_id='deprecated-method', node=node, - args=('failIf', )) - with self.assertAddsMessages(msg): - self.checker.visit_call(node) - - def test_html_deprecated(self): - """ - `html` deprecation - """ - node = test_utils.extract_node(""" - import html.parser - html.parser.unescape('a') - """) - msg = Message(msg_id='deprecated-method', node=node, - args=('unescape', )) - with self.assertAddsMessages(msg): - self.checker.visit_call(node) - - def test_distutils_deprecated(self): - """ - `distutil` deprecation - """ - node = test_utils.extract_node(""" - import distutils - distutils.command.register.register('a').check_metadata() - """) - msg = Message(msg_id='deprecated-method', node=node, - args=('check_metadata', )) - with self.assertAddsMessages(msg): - self.checker.visit_call(node) - -if __name__ == '__main__': - unittest.main() |