diff --git a/ChangeLog b/ChangeLog index aed43aa9f0..754392a27f 100644 --- a/ChangeLog +++ b/ChangeLog @@ -10,6 +10,9 @@ Release date: TBA .. Put new features here and also in 'doc/whatsnew/2.11.rst' +* The python3 porting mode checker and it's ``py3k`` option were removed. You can still find it in older pylint + versions. + * Added new extension ``SetMembershipChecker`` with ``use-set-for-membership`` check: Emitted when using an in-place defined ``list`` or ``tuple`` to do a membership test. ``sets`` are better optimized for that. diff --git a/doc/faq.rst b/doc/faq.rst index 02e2524578..479d3c0520 100644 --- a/doc/faq.rst +++ b/doc/faq.rst @@ -192,9 +192,7 @@ tricks like: :: pylint does have some messages disabled by default, either because they are prone to false positives or that they are opinionated enough -for not being included as default messages. But most of the disabled -messages are from the Python 3 porting checker, which is disabled by -default. It needs special activation with the ``--py3k`` flag. +for not being included as default messages. You can see the plugin you need to explicitly `load in the technical reference`_ diff --git a/doc/whatsnew/2.11.rst b/doc/whatsnew/2.11.rst index e91199fb02..8a9161c710 100644 --- a/doc/whatsnew/2.11.rst +++ b/doc/whatsnew/2.11.rst @@ -16,6 +16,11 @@ New checkers Closes #3592 +Removed checkers +================ + +* The python3 porting mode checker and it's ``py3k`` option were removed. You can still find it in older pylint + versions. Extensions ========== diff --git a/examples/pylintrc b/examples/pylintrc index 8a50a58331..0bfe959390 100644 --- a/examples/pylintrc +++ b/examples/pylintrc @@ -69,17 +69,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=print-statement, - parameter-unpacking, - unpacking-in-except, - old-raise-syntax, - backtick, - long-suffix, - old-ne-operator, - old-octal-literal, - import-star-module-level, - non-ascii-bytes-literal, - raw-checker-failed, +disable=raw-checker-failed, bad-inline-option, locally-disabled, file-ignored, @@ -87,67 +77,6 @@ disable=print-statement, useless-suppression, deprecated-pragma, use-symbolic-message-instead, - apply-builtin, - basestring-builtin, - buffer-builtin, - cmp-builtin, - coerce-builtin, - execfile-builtin, - file-builtin, - long-builtin, - raw_input-builtin, - reduce-builtin, - standarderror-builtin, - unicode-builtin, - xrange-builtin, - coerce-method, - delslice-method, - getslice-method, - setslice-method, - no-absolute-import, - old-division, - dict-iter-method, - dict-view-method, - next-method-called, - metaclass-assignment, - indexing-exception, - raising-string, - reload-builtin, - oct-method, - hex-method, - nonzero-method, - cmp-method, - input-builtin, - round-builtin, - intern-builtin, - unichr-builtin, - map-builtin-not-iterating, - zip-builtin-not-iterating, - range-builtin-not-iterating, - filter-builtin-not-iterating, - using-cmp-argument, - eq-without-hash, - div-method, - idiv-method, - rdiv-method, - exception-message-attribute, - invalid-str-codec, - sys-max-int, - bad-python3-import, - deprecated-string-function, - deprecated-str-translate-call, - deprecated-itertools-function, - deprecated-types-field, - next-method-defined, - dict-items-not-iterating, - dict-keys-not-iterating, - dict-values-not-iterating, - deprecated-operator-function, - deprecated-urllib-function, - xreadlines-attribute, - deprecated-sys-function, - exception-escape, - comprehension-escape # Enable the message, report, category or checker with the given id(s). You can # either give multiple identifier separated by comma (,) or put this option diff --git a/pylint/checkers/python3.py b/pylint/checkers/python3.py deleted file mode 100644 index 71c5e98a8c..0000000000 --- a/pylint/checkers/python3.py +++ /dev/null @@ -1,1432 +0,0 @@ -# Copyright (c) 2014-2020 Claudiu Popa -# Copyright (c) 2014-2015 Brett Cannon -# Copyright (c) 2015 Simu Toni -# Copyright (c) 2015 Pavel Roskin -# Copyright (c) 2015 Ionel Cristian Maries -# Copyright (c) 2015 Cosmin Poieana -# Copyright (c) 2015 Viorel Stirbu -# Copyright (c) 2016, 2018 Jakub Wilk -# Copyright (c) 2016-2017 Roy Williams -# Copyright (c) 2016 Roy Williams -# Copyright (c) 2016 Łukasz Rogalski -# Copyright (c) 2016 Erik -# Copyright (c) 2017, 2020 hippo91 -# Copyright (c) 2017-2018 Ville Skyttä -# Copyright (c) 2017 Daniel Miller -# Copyright (c) 2017 ahirnish -# Copyright (c) 2018-2020 Anthony Sottile -# Copyright (c) 2018 sbagan -# Copyright (c) 2018 Lucas Cimon -# Copyright (c) 2018 Aivar Annamaa -# Copyright (c) 2018 ssolanki -# Copyright (c) 2018 Sushobhit <31987769+sushobhit27@users.noreply.github.com> -# Copyright (c) 2018 Ashley Whetter -# Copyright (c) 2018 gaurikholkar -# Copyright (c) 2019-2021 Pierre Sassoulas -# Copyright (c) 2019 Nick Drozd -# Copyright (c) 2019 Hugues Bruant -# Copyright (c) 2019 Gabriel R Sezefredo -# Copyright (c) 2019 Hugo van Kemenade -# Copyright (c) 2019 bluesheeptoken -# Copyright (c) 2020 Peter Kolbus -# Copyright (c) 2020 谭九鼎 <109224573@qq.com> -# Copyright (c) 2020 Federico Bond -# Copyright (c) 2020 Athos Ribeiro -# Copyright (c) 2021 Marc Mueller <30130371+cdce8p@users.noreply.github.com> -# Copyright (c) 2021 bot -# Copyright (c) 2021 Tiago Honorato -# Copyright (c) 2021 tiagohonorato <61059243+tiagohonorato@users.noreply.github.com> -# Licensed under the GPL: https://www.gnu.org/licenses/old-licenses/gpl-2.0.html -# For details: https://github.com/PyCQA/pylint/blob/main/LICENSE - -"""Check Python 2 code for Python 2/3 source-compatible issues.""" -import itertools -import re -import tokenize -from collections import namedtuple - -import astroid -from astroid import nodes - -from pylint import checkers, interfaces -from pylint.checkers import utils -from pylint.checkers.utils import find_try_except_wrapper_node, node_ignores_exception -from pylint.constants import WarningScope -from pylint.interfaces import INFERENCE, INFERENCE_FAILURE - -_ZERO = re.compile("^0+$") - - -def _is_old_octal(literal): - if _ZERO.match(literal): - return False - if re.match(r"0\d+", literal): - try: - int(literal, 8) - except ValueError: - return False - return True - return None - - -def _inferred_value_is_dict(value): - if isinstance(value, nodes.Dict): - return True - return isinstance(value, astroid.Instance) and "dict" in value.basenames - - -def _infer_if_relevant_attr(node, relevant_attrs): - return node.expr.infer() if node.attrname in relevant_attrs else [] - - -def _is_builtin(node): - return getattr(node, "name", None) in ("__builtin__", "builtins") - - -_ACCEPTS_ITERATOR = { - "iter", - "list", - "tuple", - "sorted", - "set", - "sum", - "any", - "all", - "enumerate", - "dict", - "filter", - "reversed", - "max", - "min", - "frozenset", - "OrderedDict", - "zip", - "map", -} -ATTRIBUTES_ACCEPTS_ITERATOR = {"join", "from_iterable"} -_BUILTIN_METHOD_ACCEPTS_ITERATOR = { - "builtins.list.extend", - "builtins.dict.update", - "builtins.set.update", -} -DICT_METHODS = {"items", "keys", "values"} - - -def _in_iterating_context(node): - """Check if the node is being used as an iterator. - - Definition is taken from lib2to3.fixer_util.in_special_context(). - """ - parent = node.parent - # Since a call can't be the loop variant we only need to know if the node's - # parent is a 'for' loop to know it's being used as the iterator for the - # loop. - if isinstance(parent, nodes.For): - return True - # Need to make sure the use of the node is in the iterator part of the - # comprehension. - if isinstance(parent, nodes.Comprehension): - if parent.iter == node: - return True - # Various built-ins can take in an iterable or list and lead to the same - # value. - elif isinstance(parent, nodes.Call): - if isinstance(parent.func, nodes.Name): - if parent.func.name in _ACCEPTS_ITERATOR: - return True - elif isinstance(parent.func, nodes.Attribute): - if parent.func.attrname in ATTRIBUTES_ACCEPTS_ITERATOR: - return True - - inferred = utils.safe_infer(parent.func) - if inferred: - if inferred.qname() in _BUILTIN_METHOD_ACCEPTS_ITERATOR: - return True - root = inferred.root() - if root and root.name == "itertools": - return True - # If the call is in an unpacking, there's no need to warn, - # since it can be considered iterating. - elif isinstance(parent, nodes.Assign) and isinstance( - parent.targets[0], (nodes.List, nodes.Tuple) - ): - if len(parent.targets[0].elts) > 1: - return True - # If the call is in a containment check, we consider that to - # be an iterating context - elif ( - isinstance(parent, nodes.Compare) - and len(parent.ops) == 1 - and parent.ops[0][0] in ["in", "not in"] - ): - return True - # Also if it's an `yield from`, that's fair - elif isinstance(parent, nodes.YieldFrom): - return True - if isinstance(parent, nodes.Starred): - return True - return False - - -def _is_conditional_import(node): - """Checks if an import node is in the context of a conditional.""" - parent = node.parent - return isinstance( - parent, (nodes.TryExcept, nodes.ExceptHandler, nodes.If, nodes.IfExp) - ) - - -Branch = namedtuple("Branch", ["node", "is_py2_only"]) - - -class Python3Checker(checkers.BaseChecker): - - __implements__ = interfaces.IAstroidChecker - enabled = False - name = "python3" - - msgs = { - # Errors for what will syntactically break in Python 3, warnings for - # everything else. - "E1601": ( - "print statement used", - "print-statement", - "Used when a print statement is used " - "(`print` is a function in Python 3)", - ), - "E1602": ( - "Parameter unpacking specified", - "parameter-unpacking", - "Used when parameter unpacking is specified for a function" - "(Python 3 doesn't allow it)", - ), - "E1603": ( - "Implicit unpacking of exceptions is not supported in Python 3", - "unpacking-in-except", - "Python3 will not allow implicit unpacking of " - "exceptions in except clauses. " - "See https://www.python.org/dev/peps/pep-3110/", - {"old_names": [("W0712", "old-unpacking-in-except")]}, - ), - "E1604": ( - "Use raise ErrorClass(args) instead of raise ErrorClass, args.", - "old-raise-syntax", - "Used when the alternate raise syntax " - "'raise foo, bar' is used " - "instead of 'raise foo(bar)'.", - {"old_names": [("W0121", "old-old-raise-syntax")]}, - ), - "E1605": ( - "Use of the `` operator", - "backtick", - 'Used when the deprecated "``" (backtick) operator is used ' - "instead of the str() function.", - {"scope": WarningScope.NODE, "old_names": [("W0333", "old-backtick")]}, - ), - "E1609": ( - "Import * only allowed at module level", - "import-star-module-level", - "Used when the import star syntax is used somewhere " - "else than the module level.", - {"maxversion": (3, 0)}, - ), - "W1601": ( - "apply built-in referenced", - "apply-builtin", - "Used when the apply built-in function is referenced " - "(missing from Python 3)", - ), - "W1602": ( - "basestring built-in referenced", - "basestring-builtin", - "Used when the basestring built-in function is referenced " - "(missing from Python 3)", - ), - "W1603": ( - "buffer built-in referenced", - "buffer-builtin", - "Used when the buffer built-in function is referenced " - "(missing from Python 3)", - ), - "W1604": ( - "cmp built-in referenced", - "cmp-builtin", - "Used when the cmp built-in function is referenced " - "(missing from Python 3)", - ), - "W1605": ( - "coerce built-in referenced", - "coerce-builtin", - "Used when the coerce built-in function is referenced " - "(missing from Python 3)", - ), - "W1606": ( - "execfile built-in referenced", - "execfile-builtin", - "Used when the execfile built-in function is referenced " - "(missing from Python 3)", - ), - "W1607": ( - "file built-in referenced", - "file-builtin", - "Used when the file built-in function is referenced " - "(missing from Python 3)", - ), - "W1608": ( - "long built-in referenced", - "long-builtin", - "Used when the long built-in function is referenced " - "(missing from Python 3)", - ), - "W1609": ( - "raw_input built-in referenced", - "raw_input-builtin", - "Used when the raw_input built-in function is referenced " - "(missing from Python 3)", - ), - "W1610": ( - "reduce built-in referenced", - "reduce-builtin", - "Used when the reduce built-in function is referenced " - "(missing from Python 3)", - ), - "W1611": ( - "StandardError built-in referenced", - "standarderror-builtin", - "Used when the StandardError built-in function is referenced " - "(missing from Python 3)", - ), - "W1612": ( - "unicode built-in referenced", - "unicode-builtin", - "Used when the unicode built-in function is referenced " - "(missing from Python 3)", - ), - "W1613": ( - "xrange built-in referenced", - "xrange-builtin", - "Used when the xrange built-in function is referenced " - "(missing from Python 3)", - ), - "W1614": ( - "__coerce__ method defined", - "coerce-method", - "Used when a __coerce__ method is defined " - "(method is not used by Python 3)", - ), - "W1615": ( - "__delslice__ method defined", - "delslice-method", - "Used when a __delslice__ method is defined " - "(method is not used by Python 3)", - ), - "W1616": ( - "__getslice__ method defined", - "getslice-method", - "Used when a __getslice__ method is defined " - "(method is not used by Python 3)", - ), - "W1617": ( - "__setslice__ method defined", - "setslice-method", - "Used when a __setslice__ method is defined " - "(method is not used by Python 3)", - ), - "W1618": ( - "import missing `from __future__ import absolute_import`", - "no-absolute-import", - "Used when an import is not accompanied by " - "``from __future__ import absolute_import`` " - "(default behaviour in Python 3)", - ), - "W1619": ( - "division w/o __future__ statement", - "old-division", - "Used for non-floor division w/o a float literal or " - "``from __future__ import division`` " - "(Python 3 returns a float for int division unconditionally)", - ), - "W1620": ( - "Calling a dict.iter*() method", - "dict-iter-method", - "Used for calls to dict.iterkeys(), itervalues() or iteritems() " - "(Python 3 lacks these methods)", - ), - "W1621": ( - "Calling a dict.view*() method", - "dict-view-method", - "Used for calls to dict.viewkeys(), viewvalues() or viewitems() " - "(Python 3 lacks these methods)", - ), - "W1622": ( - "Called a next() method on an object", - "next-method-called", - "Used when an object's next() method is called " - "(Python 3 uses the next() built-in function)", - ), - "W1623": ( - "Assigning to a class's __metaclass__ attribute", - "metaclass-assignment", - "Used when a metaclass is specified by assigning to __metaclass__ " - "(Python 3 specifies the metaclass as a class statement argument)", - ), - "W1624": ( - "Indexing exceptions will not work on Python 3", - "indexing-exception", - "Indexing exceptions will not work on Python 3. Use " - "`exception.args[index]` instead.", - {"old_names": [("W0713", "old-indexing-exception")]}, - ), - "W1625": ( - "Raising a string exception", - "raising-string", - "Used when a string exception is raised. This will not " - "work on Python 3.", - {"old_names": [("W0701", "old-raising-string")]}, - ), - "W1626": ( - "reload built-in referenced", - "reload-builtin", - "Used when the reload built-in function is referenced " - "(missing from Python 3). You can use instead imp.reload " - "or importlib.reload.", - ), - "W1627": ( - "__oct__ method defined", - "oct-method", - "Used when an __oct__ method is defined " - "(method is not used by Python 3)", - ), - "W1628": ( - "__hex__ method defined", - "hex-method", - "Used when a __hex__ method is defined (method is not used by Python 3)", - ), - "W1629": ( - "__nonzero__ method defined", - "nonzero-method", - "Used when a __nonzero__ method is defined " - "(method is not used by Python 3)", - ), - "W1630": ( - "__cmp__ method defined", - "cmp-method", - "Used when a __cmp__ method is defined (method is not used by Python 3)", - ), - # 'W1631': replaced by W1636 - "W1632": ( - "input built-in referenced", - "input-builtin", - "Used when the input built-in is referenced " - "(backwards-incompatible semantics in Python 3)", - ), - "W1633": ( - "round built-in referenced", - "round-builtin", - "Used when the round built-in is referenced " - "(backwards-incompatible semantics in Python 3)", - ), - "W1634": ( - "intern built-in referenced", - "intern-builtin", - "Used when the intern built-in is referenced " - "(Moved to sys.intern in Python 3)", - ), - "W1635": ( - "unichr built-in referenced", - "unichr-builtin", - "Used when the unichr built-in is referenced (Use chr in Python 3)", - ), - "W1636": ( - "map built-in referenced when not iterating", - "map-builtin-not-iterating", - "Used when the map built-in is referenced in a non-iterating " - "context (returns an iterator in Python 3)", - {"old_names": [("W1631", "implicit-map-evaluation")]}, - ), - "W1637": ( - "zip built-in referenced when not iterating", - "zip-builtin-not-iterating", - "Used when the zip built-in is referenced in a non-iterating " - "context (returns an iterator in Python 3)", - ), - "W1638": ( - "range built-in referenced when not iterating", - "range-builtin-not-iterating", - "Used when the range built-in is referenced in a non-iterating " - "context (returns a range in Python 3)", - ), - "W1639": ( - "filter built-in referenced when not iterating", - "filter-builtin-not-iterating", - "Used when the filter built-in is referenced in a non-iterating " - "context (returns an iterator in Python 3)", - ), - "W1640": ( - "Using the cmp argument for list.sort / sorted", - "using-cmp-argument", - "Using the cmp argument for list.sort or the sorted " - "builtin should be avoided, since it was removed in " - "Python 3. Using either `key` or `functools.cmp_to_key` " - "should be preferred.", - ), - "W1641": ( - "Implementing __eq__ without also implementing __hash__", - "eq-without-hash", - "Used when a class implements __eq__ but not __hash__. In Python 2, objects " - "get object.__hash__ as the default implementation, in Python 3 objects get " - "None as their default __hash__ implementation if they also implement __eq__.", - ), - "W1642": ( - "__div__ method defined", - "div-method", - "Used when a __div__ method is defined. Using `__truediv__` and setting" - "__div__ = __truediv__ should be preferred." - "(method is not used by Python 3)", - ), - "W1643": ( - "__idiv__ method defined", - "idiv-method", - "Used when an __idiv__ method is defined. Using `__itruediv__` and setting" - "__idiv__ = __itruediv__ should be preferred." - "(method is not used by Python 3)", - ), - "W1644": ( - "__rdiv__ method defined", - "rdiv-method", - "Used when a __rdiv__ method is defined. Using `__rtruediv__` and setting" - "__rdiv__ = __rtruediv__ should be preferred." - "(method is not used by Python 3)", - ), - "W1645": ( - "Exception.message removed in Python 3", - "exception-message-attribute", - "Used when the message attribute is accessed on an Exception. Use " - "str(exception) instead.", - ), - "W1646": ( - "non-text encoding used in str.decode", - "invalid-str-codec", - "Used when using str.encode or str.decode with a non-text encoding. Use " - "codecs module to handle arbitrary codecs.", - ), - "W1647": ( - "sys.maxint removed in Python 3", - "sys-max-int", - "Used when accessing sys.maxint. Use sys.maxsize instead.", - ), - "W1648": ( - "Module moved in Python 3", - "bad-python3-import", - "Used when importing a module that no longer exists in Python 3.", - ), - "W1649": ( - "Accessing a deprecated function on the string module", - "deprecated-string-function", - "Used when accessing a string function that has been deprecated in Python 3.", - ), - "W1650": ( - "Using str.translate with deprecated deletechars parameters", - "deprecated-str-translate-call", - "Used when using the deprecated deletechars parameters from str.translate. Use " - "re.sub to remove the desired characters ", - ), - "W1651": ( - "Accessing a deprecated function on the itertools module", - "deprecated-itertools-function", - "Used when accessing a function on itertools that has been removed in Python 3.", - ), - "W1652": ( - "Accessing a deprecated fields on the types module", - "deprecated-types-field", - "Used when accessing a field on types that has been removed in Python 3.", - ), - "W1653": ( - "next method defined", - "next-method-defined", - "Used when a next method is defined that would be an iterator in Python 2 but " - "is treated as a normal function in Python 3.", - ), - "W1654": ( - "dict.items referenced when not iterating", - "dict-items-not-iterating", - "Used when dict.items is referenced in a non-iterating " - "context (returns an iterator in Python 3)", - ), - "W1655": ( - "dict.keys referenced when not iterating", - "dict-keys-not-iterating", - "Used when dict.keys is referenced in a non-iterating " - "context (returns an iterator in Python 3)", - ), - "W1656": ( - "dict.values referenced when not iterating", - "dict-values-not-iterating", - "Used when dict.values is referenced in a non-iterating " - "context (returns an iterator in Python 3)", - ), - "W1657": ( - "Accessing a removed attribute on the operator module", - "deprecated-operator-function", - "Used when accessing a field on operator module that has been " - "removed in Python 3.", - ), - "W1658": ( - "Accessing a removed attribute on the urllib module", - "deprecated-urllib-function", - "Used when accessing a field on urllib module that has been " - "removed or moved in Python 3.", - ), - "W1659": ( - "Accessing a removed xreadlines attribute", - "xreadlines-attribute", - "Used when accessing the xreadlines() function on a file stream, " - "removed in Python 3.", - ), - "W1660": ( - "Accessing a removed attribute on the sys module", - "deprecated-sys-function", - "Used when accessing a field on sys module that has been " - "removed in Python 3.", - ), - "W1661": ( - "Using an exception object that was bound by an except handler", - "exception-escape", - "Emitted when using an exception, that was bound in an except " - "handler, outside of the except handler. On Python 3 these " - "exceptions will be deleted once they get out " - "of the except handler.", - ), - "W1662": ( - "Using a variable that was bound inside a comprehension", - "comprehension-escape", - "Emitted when using a variable, that was bound in a comprehension " - "handler, outside of the comprehension itself. On Python 3 these " - "variables will be deleted outside of the " - "comprehension.", - ), - } - - _bad_builtins = frozenset( - [ - "apply", - "basestring", - "buffer", - "cmp", - "coerce", - "execfile", - "file", - "input", # Not missing, but incompatible semantics - "intern", - "long", - "raw_input", - "reduce", - "round", # Not missing, but incompatible semantics - "StandardError", - "unichr", - "unicode", - "xrange", - "reload", - ] - ) - - _unused_magic_methods = frozenset( - [ - "__coerce__", - "__delslice__", - "__getslice__", - "__setslice__", - "__oct__", - "__hex__", - "__nonzero__", - "__cmp__", - "__div__", - "__idiv__", - "__rdiv__", - ] - ) - - _invalid_encodings = frozenset( - [ - "base64_codec", - "base64", - "base_64", - "bz2_codec", - "bz2", - "hex_codec", - "hex", - "quopri_codec", - "quopri", - "quotedprintable", - "quoted_printable", - "uu_codec", - "uu", - "zlib_codec", - "zlib", - "zip", - "rot13", - "rot_13", - ] - ) - - _bad_python3_module_map = { - "sys-max-int": {"sys": frozenset(["maxint"])}, - "deprecated-itertools-function": { - "itertools": frozenset( - ["izip", "ifilter", "imap", "izip_longest", "ifilterfalse"] - ) - }, - "deprecated-types-field": { - "types": frozenset( - [ - "EllipsisType", - "XRangeType", - "ComplexType", - "StringType", - "TypeType", - "LongType", - "UnicodeType", - "ClassType", - "BufferType", - "StringTypes", - "NotImplementedType", - "NoneType", - "InstanceType", - "FloatType", - "SliceType", - "UnboundMethodType", - "ObjectType", - "IntType", - "TupleType", - "ListType", - "DictType", - "FileType", - "DictionaryType", - "BooleanType", - "DictProxyType", - ] - ) - }, - "bad-python3-import": frozenset( - [ - "anydbm", - "BaseHTTPServer", - "__builtin__", - "CGIHTTPServer", - "ConfigParser", - "copy_reg", - "cPickle", - "cStringIO", - "Cookie", - "cookielib", - "dbhash", - "dumbdbm", - "dumbdb", - "Dialog", - "DocXMLRPCServer", - "FileDialog", - "FixTk", - "gdbm", - "htmlentitydefs", - "HTMLParser", - "httplib", - "markupbase", - "Queue", - "repr", - "robotparser", - "ScrolledText", - "SimpleDialog", - "SimpleHTTPServer", - "SimpleXMLRPCServer", - "StringIO", - "dummy_thread", - "SocketServer", - "test.test_support", - "Tkinter", - "Tix", - "Tkconstants", - "tkColorChooser", - "tkCommonDialog", - "Tkdnd", - "tkFileDialog", - "tkFont", - "tkMessageBox", - "tkSimpleDialog", - "UserList", - "UserString", - "whichdb", - "_winreg", - "xmlrpclib", - "audiodev", - "Bastion", - "bsddb185", - "bsddb3", - "Canvas", - "cfmfile", - "cl", - "commands", - "compiler", - "dircache", - "dl", - "exception", - "fpformat", - "htmllib", - "ihooks", - "imageop", - "imputil", - "linuxaudiodev", - "md5", - "mhlib", - "mimetools", - "MimeWriter", - "mimify", - "multifile", - "mutex", - "new", - "popen2", - "posixfile", - "pure", - "rexec", - "rfc822", - "sets", - "sha", - "sgmllib", - "sre", - "stringold", - "sunaudio", - "sv", - "test.testall", - "thread", - "timing", - "toaiff", - "user", - "urllib2", - "urlparse", - ] - ), - "deprecated-string-function": { - "string": frozenset( - [ - "maketrans", - "atof", - "atoi", - "atol", - "capitalize", - "expandtabs", - "find", - "rfind", - "index", - "rindex", - "count", - "lower", - "letters", - "split", - "rsplit", - "splitfields", - "join", - "joinfields", - "lstrip", - "rstrip", - "strip", - "swapcase", - "translate", - "upper", - "ljust", - "rjust", - "center", - "zfill", - "replace", - "lowercase", - "letters", - "uppercase", - "atol_error", - "atof_error", - "atoi_error", - "index_error", - ] - ) - }, - "deprecated-operator-function": {"operator": frozenset({"div"})}, - "deprecated-urllib-function": { - "urllib": frozenset( - { - "addbase", - "addclosehook", - "addinfo", - "addinfourl", - "always_safe", - "basejoin", - "ftpcache", - "ftperrors", - "ftpwrapper", - "getproxies", - "getproxies_environment", - "getproxies_macosx_sysconf", - "main", - "noheaders", - "pathname2url", - "proxy_bypass", - "proxy_bypass_environment", - "proxy_bypass_macosx_sysconf", - "quote", - "quote_plus", - "reporthook", - "splitattr", - "splithost", - "splitnport", - "splitpasswd", - "splitport", - "splitquery", - "splittag", - "splittype", - "splituser", - "splitvalue", - "unquote", - "unquote_plus", - "unwrap", - "url2pathname", - "urlcleanup", - "urlencode", - "urlopen", - "urlretrieve", - } - ) - }, - "deprecated-sys-function": {"sys": frozenset({"exc_clear"})}, - } - - _deprecated_attrs = frozenset( - itertools.chain.from_iterable( - attr - for module_map in _bad_python3_module_map.values() - if isinstance(module_map, dict) - for attr in module_map.values() - ) - ) - - _relevant_call_attrs = ( - DICT_METHODS | _deprecated_attrs | {"encode", "decode", "translate"} - ) - - _python_2_tests = frozenset( - astroid.extract_node(x).repr_tree() - for x in ( - "sys.version_info[0] == 2", - "sys.version_info[0] < 3", - "sys.version_info == (2, 7)", - "sys.version_info <= (2, 7)", - "sys.version_info < (3, 0)", - ) - ) - - def __init__(self, *args, **kwargs): - self._future_division = False - self._future_absolute_import = False - self._modules_warned_about = set() - self._branch_stack = [] - super().__init__(*args, **kwargs) - - # pylint: disable=keyword-arg-before-vararg, arguments-differ - def add_message(self, msg_id, always_warn=False, *args, **kwargs): - if always_warn or not ( - self._branch_stack and self._branch_stack[-1].is_py2_only - ): - super().add_message(msg_id, *args, **kwargs) - - def _is_py2_test(self, node): - if isinstance(node.test, nodes.Attribute) and isinstance( - node.test.expr, nodes.Name - ): - if node.test.expr.name == "six" and node.test.attrname == "PY2": - return True - elif ( - isinstance(node.test, nodes.Compare) - and node.test.repr_tree() in self._python_2_tests - ): - return True - return False - - def visit_if(self, node): - self._branch_stack.append(Branch(node, self._is_py2_test(node))) - - def leave_if(self, node): - new_node = self._branch_stack.pop().node - assert new_node == node - - def visit_ifexp(self, node): - self._branch_stack.append(Branch(node, self._is_py2_test(node))) - - def leave_ifexp(self, node): - new_node = self._branch_stack.pop() - assert new_node.node == node - - def visit_module(self, node): # pylint: disable=unused-argument - """Clear checker state after previous module.""" - self._future_division = False - self._future_absolute_import = False - - def visit_functiondef(self, node): - if node.is_method(): - if node.name in self._unused_magic_methods: - method_name = node.name - if node.name.startswith("__"): - method_name = node.name[2:-2] - self.add_message(method_name + "-method", node=node) - elif node.name == "next": - # If there is a method named `next` declared, if it is invokable - # with zero arguments then it implements the Iterator protocol. - # This means if the method is an instance method or a - # classmethod 1 argument should cause a failure, if it is a - # staticmethod 0 arguments should cause a failure. - failing_arg_count = 1 - if utils.decorated_with(node, ["builtins.staticmethod"]): - failing_arg_count = 0 - if len(node.args.args) == failing_arg_count: - self.add_message("next-method-defined", node=node) - - @utils.check_messages("parameter-unpacking") - def visit_arguments(self, node): - for arg in node.args: - if isinstance(arg, nodes.Tuple): - self.add_message("parameter-unpacking", node=arg) - - @utils.check_messages("comprehension-escape") - def visit_listcomp(self, node): - names = { - generator.target.name - for generator in node.generators - if isinstance(generator.target, nodes.AssignName) - } - scope = node.parent.scope() - scope_names = scope.nodes_of_class(nodes.Name, skip_klass=nodes.FunctionDef) - has_redefined_assign_name = any( - assign_name - for assign_name in scope.nodes_of_class( - nodes.AssignName, skip_klass=nodes.FunctionDef - ) - if assign_name.name in names and assign_name.lineno > node.lineno - ) - if has_redefined_assign_name: - return - - emitted_for_names = set() - scope_names = list(scope_names) - for scope_name in scope_names: - if ( - scope_name.name not in names - or scope_name.lineno <= node.lineno - or scope_name.name in emitted_for_names - or scope_name.scope() == node - ): - continue - - emitted_for_names.add(scope_name.name) - self.add_message("comprehension-escape", node=scope_name) - - def visit_name(self, node): - """Detect when a "bad" built-in is referenced.""" - found_node, _ = node.lookup(node.name) - if not _is_builtin(found_node): - return - if node.name not in self._bad_builtins: - return - if node_ignores_exception(node) or isinstance( - find_try_except_wrapper_node(node), nodes.ExceptHandler - ): - return - - message = node.name.lower() + "-builtin" - self.add_message(message, node=node) - - @utils.check_messages("print-statement") - def visit_print(self, node): - self.add_message("print-statement", node=node, always_warn=True) - - def _warn_if_deprecated(self, node, module, attributes, report_on_modules=True): - for message, module_map in self._bad_python3_module_map.items(): - if module in module_map and module not in self._modules_warned_about: - if isinstance(module_map, frozenset): - if report_on_modules: - self._modules_warned_about.add(module) - self.add_message(message, node=node) - elif attributes and module_map[module].intersection(attributes): - self.add_message(message, node=node) - - def visit_importfrom(self, node): - if node.modname == "__future__": - for name, _ in node.names: - if name == "division": - self._future_division = True - elif name == "absolute_import": - self._future_absolute_import = True - else: - if not self._future_absolute_import: - if self.linter.is_message_enabled("no-absolute-import"): - self.add_message("no-absolute-import", node=node) - self._future_absolute_import = True - if not _is_conditional_import(node) and not node.level: - self._warn_if_deprecated(node, node.modname, {x[0] for x in node.names}) - - if node.names[0][0] == "*": - if self.linter.is_message_enabled("import-star-module-level"): - if not isinstance(node.scope(), nodes.Module): - self.add_message("import-star-module-level", node=node) - - def visit_import(self, node): - if not self._future_absolute_import: - if self.linter.is_message_enabled("no-absolute-import"): - self.add_message("no-absolute-import", node=node) - self._future_absolute_import = True - if not _is_conditional_import(node): - for name, _ in node.names: - self._warn_if_deprecated(node, name, None) - - @utils.check_messages("metaclass-assignment") - def visit_classdef(self, node): - if "__metaclass__" in node.locals: - self.add_message("metaclass-assignment", node=node) - locals_and_methods = set(node.locals).union(x.name for x in node.mymethods()) - if "__eq__" in locals_and_methods and "__hash__" not in locals_and_methods: - self.add_message("eq-without-hash", node=node) - - @utils.check_messages("old-division") - def visit_binop(self, node): - if not self._future_division and node.op == "/": - for arg in (node.left, node.right): - inferred = utils.safe_infer(arg) - # If we can infer the object and that object is not an int, bail out. - if inferred and not ( - ( - isinstance(inferred, nodes.Const) - and isinstance(inferred.value, int) - ) - or ( - isinstance(inferred, astroid.Instance) - and inferred.name == "int" - ) - ): - break - else: - self.add_message("old-division", node=node) - - def _check_cmp_argument(self, node): - # Check that the `cmp` argument is used - kwargs = [] - if isinstance(node.func, nodes.Attribute) and node.func.attrname == "sort": - inferred = utils.safe_infer(node.func.expr) - if not inferred: - return - - builtins_list = "builtins.list" - if isinstance(inferred, nodes.List) or inferred.qname() == builtins_list: - kwargs = node.keywords - - elif isinstance(node.func, nodes.Name) and node.func.name == "sorted": - inferred = utils.safe_infer(node.func) - if not inferred: - return - - builtins_sorted = "builtins.sorted" - if inferred.qname() == builtins_sorted: - kwargs = node.keywords - - for kwarg in kwargs or []: - if kwarg.arg == "cmp": - self.add_message("using-cmp-argument", node=node) - return - - @staticmethod - def _is_constant_string_or_name(node): - if isinstance(node, nodes.Const): - return isinstance(node.value, str) - return isinstance(node, nodes.Name) - - @staticmethod - def _is_none(node): - return isinstance(node, nodes.Const) and node.value is None - - @staticmethod - def _has_only_n_positional_args(node, number_of_args): - return len(node.args) == number_of_args and all(node.args) and not node.keywords - - @staticmethod - def _could_be_string(inferred_types): - confidence = INFERENCE if inferred_types else INFERENCE_FAILURE - for inferred_type in inferred_types: - if inferred_type is astroid.Uninferable: - confidence = INFERENCE_FAILURE - elif not ( - isinstance(inferred_type, nodes.Const) - and isinstance(inferred_type.value, str) - ): - return None - return confidence - - def visit_call(self, node): - self._check_cmp_argument(node) - - if isinstance(node.func, nodes.Attribute): - inferred_types = set() - - try: - for inferred_receiver in _infer_if_relevant_attr( - node.func, self._relevant_call_attrs - ): - if inferred_receiver is astroid.Uninferable: - continue - inferred_types.add(inferred_receiver) - if isinstance(inferred_receiver, nodes.Module): - self._warn_if_deprecated( - node, - inferred_receiver.name, - {node.func.attrname}, - report_on_modules=False, - ) - if ( - _inferred_value_is_dict(inferred_receiver) - and node.func.attrname in DICT_METHODS - ): - if not _in_iterating_context(node): - checker = f"dict-{node.func.attrname}-not-iterating" - self.add_message(checker, node=node) - except astroid.InferenceError: - pass - if node.args: - is_str_confidence = self._could_be_string(inferred_types) - if is_str_confidence: - if ( - node.func.attrname in ("encode", "decode") - and len(node.args) >= 1 - and node.args[0] - ): - first_arg = node.args[0] - self._validate_encoding(first_arg, node) - if ( - node.func.attrname == "translate" - and self._has_only_n_positional_args(node, 2) - and self._is_none(node.args[0]) - and self._is_constant_string_or_name(node.args[1]) - ): - # The above statement looking for calls of the form: - # - # foo.translate(None, 'abc123') - # - # or - # - # foo.translate(None, some_variable) - # - # This check is somewhat broad and _may_ have some false positives, but - # after checking several large codebases it did not have any false - # positives while finding several real issues. This call pattern seems - # rare enough that the trade off is worth it. - self.add_message( - "deprecated-str-translate-call", - node=node, - confidence=is_str_confidence, - ) - return - if node.keywords: - return - if node.func.attrname == "next": - self.add_message("next-method-called", node=node) - elif node.func.attrname in ("iterkeys", "itervalues", "iteritems"): - self.add_message("dict-iter-method", node=node) - elif node.func.attrname in ("viewkeys", "viewvalues", "viewitems"): - self.add_message("dict-view-method", node=node) - elif isinstance(node.func, nodes.Name): - found_node = node.func.lookup(node.func.name)[0] - if _is_builtin(found_node): - if node.func.name in ("filter", "map", "range", "zip"): - if not _in_iterating_context(node): - checker = f"{node.func.name}-builtin-not-iterating" - self.add_message(checker, node=node) - elif node.func.name == "open" and node.keywords: - kwargs = node.keywords - for kwarg in kwargs or []: - if kwarg.arg == "encoding": - self._validate_encoding(kwarg.value, node) - break - - def _validate_encoding(self, encoding, node): - if isinstance(encoding, nodes.Const): - value = encoding.value - if value in self._invalid_encodings: - self.add_message("invalid-str-codec", node=node) - - @utils.check_messages("indexing-exception") - def visit_subscript(self, node): - """Look for indexing exceptions.""" - try: - for inferred in node.value.infer(): - if not isinstance(inferred, astroid.Instance): - continue - if utils.inherit_from_std_ex(inferred): - self.add_message("indexing-exception", node=node) - except astroid.InferenceError: - return - - def visit_assignattr(self, node): - if isinstance(node.assign_type(), nodes.AugAssign): - self.visit_attribute(node) - - def visit_delattr(self, node): - self.visit_attribute(node) - - @utils.check_messages("exception-message-attribute", "xreadlines-attribute") - def visit_attribute(self, node): - """Look for removed attributes""" - if node.attrname == "xreadlines": - self.add_message("xreadlines-attribute", node=node) - return - - exception_message = "message" - try: - for inferred in _infer_if_relevant_attr( - node, self._deprecated_attrs | {exception_message} - ): - if isinstance(inferred, astroid.Instance) and utils.inherit_from_std_ex( - inferred - ): - if node.attrname == exception_message: - - # Exceptions with .message clearly defined are an exception - if exception_message in inferred.instance_attrs: - continue - self.add_message("exception-message-attribute", node=node) - if isinstance(inferred, nodes.Module): - self._warn_if_deprecated( - node, inferred.name, {node.attrname}, report_on_modules=False - ) - except astroid.InferenceError: - return - - @utils.check_messages("unpacking-in-except", "comprehension-escape") - def visit_excepthandler(self, node): - """Visit an except handler block and check for exception unpacking.""" - - def _is_used_in_except_block(node, block): - current = node - while current and current is not block: - current = current.parent - return current is not None - - if isinstance(node.name, (nodes.Tuple, nodes.List)): - self.add_message("unpacking-in-except", node=node) - return - - if not node.name: - return - - # Find any names - scope = node.parent.scope() - scope_names = scope.nodes_of_class(nodes.Name, skip_klass=nodes.FunctionDef) - scope_names = list(scope_names) - potential_leaked_names = [ - scope_name - for scope_name in scope_names - if scope_name.name == node.name.name - and scope_name.lineno > node.lineno - and not _is_used_in_except_block(scope_name, node) - ] - reassignments_for_same_name = { - assign_name.lineno - for assign_name in scope.nodes_of_class( - nodes.AssignName, skip_klass=nodes.FunctionDef - ) - if assign_name.name == node.name.name - } - for leaked_name in potential_leaked_names: - if any( - node.lineno < elem < leaked_name.lineno - for elem in reassignments_for_same_name - ): - continue - self.add_message("exception-escape", node=leaked_name) - - @utils.check_messages("backtick") - def visit_repr(self, node): - self.add_message("backtick", node=node) - - @utils.check_messages("raising-string", "old-raise-syntax") - def visit_raise(self, node): - """Visit a raise statement and check for raising - strings or old-raise-syntax. - """ - - # Ignore empty raise. - if node.exc is None: - return - expr = node.exc - if self._check_raise_value(node, expr): - return - try: - value = next(astroid.unpack_infer(expr)) - except astroid.InferenceError: - return - self._check_raise_value(node, value) - - def _check_raise_value(self, node, expr): - if isinstance(expr, nodes.Const): - value = expr.value - if isinstance(value, str): - self.add_message("raising-string", node=node) - return True - return None - - -class Python3TokenChecker(checkers.BaseTokenChecker): - __implements__ = interfaces.ITokenChecker - name = "python3" - enabled = False - - msgs = { - "E1606": ( - "Use of long suffix", - "long-suffix", - 'Used when "l" or "L" is used to mark a long integer. ' - "This will not work in Python 3, since `int` and `long` " - "types have merged.", - {"maxversion": (3, 0)}, - ), - "E1607": ( - "Use of the <> operator", - "old-ne-operator", - 'Used when the deprecated "<>" operator is used instead ' - 'of "!=". This is removed in Python 3.', - {"maxversion": (3, 0), "old_names": [("W0331", "old-old-ne-operator")]}, - ), - "E1608": ( - "Use of old octal literal", - "old-octal-literal", - "Used when encountering the old octal syntax, " - "removed in Python 3. To use the new syntax, " - "prepend 0o on the number.", - {"maxversion": (3, 0)}, - ), - "E1610": ( - "Non-ascii bytes literals not supported in 3.x", - "non-ascii-bytes-literal", - "Used when non-ascii bytes literals are found in a program. " - "They are no longer supported in Python 3.", - {"maxversion": (3, 0)}, - ), - } - - def process_tokens(self, tokens): - for idx, (tok_type, token, start, _, _) in enumerate(tokens): - if tok_type == tokenize.NUMBER: - if token.lower().endswith("l"): - # This has a different semantic than lowercase-l-suffix. - self.add_message("long-suffix", line=start[0]) - elif _is_old_octal(token): - self.add_message("old-octal-literal", line=start[0]) - if tokens[idx][1] == "<>": - self.add_message("old-ne-operator", line=tokens[idx][2][0]) - if tok_type == tokenize.STRING and token.startswith("b"): - if any(elem for elem in token if ord(elem) > 127): - self.add_message("non-ascii-bytes-literal", line=start[0]) - - -def register(linter): - linter.register_checker(Python3Checker(linter)) - linter.register_checker(Python3TokenChecker(linter)) diff --git a/pylint/lint/pylinter.py b/pylint/lint/pylinter.py index 8582f76373..59276a50a2 100644 --- a/pylint/lint/pylinter.py +++ b/pylint/lint/pylinter.py @@ -536,7 +536,6 @@ def __init__(self, options=(), reporter=None, option_groups=(), pylintrc=None): ) self.register_checker(self) self._dynamic_plugins = set() - self._python3_porting_mode = False self._error_mode = False self.load_provider_defaults() if reporter: @@ -755,45 +754,10 @@ def error_mode(self): self._error_mode = True self.disable_noerror_messages() self.disable("miscellaneous") - if self._python3_porting_mode: - self.disable("all") - for msg_id in self._checker_messages("python3"): - if msg_id.startswith("E"): - self.enable(msg_id) - config_parser = self.cfgfile_parser - if config_parser.has_option("MESSAGES CONTROL", "disable"): - value = config_parser.get("MESSAGES CONTROL", "disable") - self.global_set_option("disable", value) - else: - self.disable("python3") self.set_option("reports", False) self.set_option("persistent", False) self.set_option("score", False) - def python3_porting_mode(self): - """Disable all other checkers and enable Python 3 warnings.""" - self.disable("all") - # re-enable some errors, or 'print', 'raise', 'async', 'await' will mistakenly lint fine - self.enable("fatal") # F0001 - self.enable("astroid-error") # F0002 - self.enable("parse-error") # F0010 - self.enable("syntax-error") # E0001 - self.enable("python3") - if self._error_mode: - # The error mode was activated, using the -E flag. - # So we'll need to enable only the errors from the - # Python 3 porting checker. - for msg_id in self._checker_messages("python3"): - if msg_id.startswith("E"): - self.enable(msg_id) - else: - self.disable(msg_id) - config_parser = self.cfgfile_parser - if config_parser.has_option("MESSAGES CONTROL", "disable"): - value = config_parser.get("MESSAGES CONTROL", "disable") - self.global_set_option("disable", value) - self._python3_porting_mode = True - def list_messages_enabled(self): emittable, non_emittable = self.msgs_store.find_emittable_messages() enabled = [] diff --git a/pylint/lint/run.py b/pylint/lint/run.py index ac4f586f40..d84ed27037 100644 --- a/pylint/lint/run.py +++ b/pylint/lint/run.py @@ -247,16 +247,6 @@ def __init__( "displayed, and no reports are done by default.", }, ), - ( - "py3k", - { - "action": "callback", - "callback": self.cb_python3_porting_mode, - "help": "In Python 3 porting mode, all checkers will be " - "disabled and only messages emitted by the porting " - "checker will be displayed.", - }, - ), ( "verbose", { @@ -469,9 +459,5 @@ def cb_list_groups(self, *args, **kwargs): print(check) sys.exit(0) - def cb_python3_porting_mode(self, *args, **kwargs): - """Activate only the python3 porting checker.""" - self.linter.python3_porting_mode() - def cb_verbose_mode(self, *args, **kwargs): self.verbose = True diff --git a/pylint/message/message_handler_mix_in.py b/pylint/message/message_handler_mix_in.py index c2dd4d0cb8..00adfa5d9a 100644 --- a/pylint/message/message_handler_mix_in.py +++ b/pylint/message/message_handler_mix_in.py @@ -94,9 +94,6 @@ def _set_msg_status( if msgid == "all": for _msgid in MSG_TYPES: self._set_msg_status(_msgid, enable, scope, line, ignore_unknown) - if enable and not self._python3_porting_mode: - # Don't activate the python 3 porting checker if it wasn't activated explicitly. - self.disable("python3") return # msgid is a category? diff --git a/tests/checkers/unittest_python3.py b/tests/checkers/unittest_python3.py deleted file mode 100644 index 6dd78cd254..0000000000 --- a/tests/checkers/unittest_python3.py +++ /dev/null @@ -1,1178 +0,0 @@ -# Copyright (c) 2014-2020 Claudiu Popa -# Copyright (c) 2014-2015 Brett Cannon -# Copyright (c) 2015 Ionel Cristian Maries -# Copyright (c) 2015 Cosmin Poieana -# Copyright (c) 2015 Viorel Stirbu -# Copyright (c) 2016-2017 Roy Williams -# Copyright (c) 2016 Roy Williams -# Copyright (c) 2016 Derek Gustafson -# Copyright (c) 2017 Daniel Miller -# Copyright (c) 2018-2020 Anthony Sottile -# Copyright (c) 2018 sbagan -# Copyright (c) 2018 Aivar Annamaa -# Copyright (c) 2018 Ville Skyttä -# Copyright (c) 2019-2021 Pierre Sassoulas -# Copyright (c) 2019 Gabriel R Sezefredo -# Copyright (c) 2019 Hugo van Kemenade -# Copyright (c) 2019 Ashley Whetter -# Copyright (c) 2020 hippo91 -# Copyright (c) 2020 Federico Bond -# Copyright (c) 2020 Athos Ribeiro -# Copyright (c) 2021 Marc Mueller <30130371+cdce8p@users.noreply.github.com> -# Copyright (c) 2021 Tiago Honorato -# Copyright (c) 2021 tiagohonorato <61059243+tiagohonorato@users.noreply.github.com> -# Copyright (c) 2021 David Gilman - -# Licensed under the GPL: https://www.gnu.org/licenses/old-licenses/gpl-2.0.html -# For details: https://github.com/PyCQA/pylint/blob/main/LICENSE - -"""Tests for the python3 checkers.""" - -# pylint: disable=too-many-public-methods,redefined-outer-name - -import astroid - -from pylint import testutils -from pylint.checkers import python3 as checker -from pylint.interfaces import INFERENCE, INFERENCE_FAILURE - -# TODO(cpopa): Port these to the functional test framework instead. pylint: disable=fixme - - -class TestPython3Checker(testutils.CheckerTestCase): - - CHECKER_CLASS = checker.Python3Checker - - def check_bad_builtin(self, builtin_name): - node = astroid.extract_node(builtin_name + " #@") - message = builtin_name.lower() + "-builtin" - with self.assertAddsMessages(testutils.Message(message, node=node)): - self.checker.visit_name(node) - - def test_bad_builtins(self): - builtins = [ - "apply", - "buffer", - "cmp", - "coerce", - "execfile", - "file", - "input", - "intern", - "long", - "raw_input", - "round", - "reduce", - "StandardError", - "unichr", - "unicode", - "xrange", - "reload", - ] - for builtin in builtins: - self.check_bad_builtin(builtin) - - def as_iterable_in_for_loop_test(self, fxn): - code = f"for x in {fxn}(): pass" - module = astroid.parse(code) - with self.assertNoMessages(): - self.walk(module) - - def as_used_by_iterable_in_for_loop_test(self, fxn): - checker = f"{fxn}-builtin-not-iterating" - node = astroid.extract_node( - f""" - for x in (whatever( - {fxn}() #@ - )): - pass - """ - ) - message = testutils.Message(checker, node=node) - with self.assertAddsMessages(message): - self.checker.visit_call(node) - - def as_iterable_in_genexp_test(self, fxn): - code = f"x = (x for x in {fxn}())" - module = astroid.parse(code) - with self.assertNoMessages(): - self.walk(module) - - def as_iterable_in_starred_context(self, fxn): - code = f"x = test(*{fxn}())" - module = astroid.parse(code) - with self.assertNoMessages(): - self.walk(module) - - def as_iterable_in_listcomp_test(self, fxn): - code = f"x = [x for x in {fxn}(None, [1])]" - module = astroid.parse(code) - with self.assertNoMessages(): - self.walk(module) - - def as_iterable_in_yield_from(self, fxn): - code = f"yield from {fxn}()" - module = astroid.parse(code) - with self.assertNoMessages(): - self.walk(module) - - def as_used_in_variant_in_genexp_test(self, fxn): - checker = f"{fxn}-builtin-not-iterating" - node = astroid.extract_node( - f""" - list( - __({fxn}(x)) - for x in [1] - ) - """ - ) - message = testutils.Message(checker, node=node) - with self.assertAddsMessages(message): - self.checker.visit_call(node) - - def as_used_in_variant_in_listcomp_test(self, fxn): - checker = f"{fxn}-builtin-not-iterating" - node = astroid.extract_node( - f""" - [ - __({fxn}(None, x)) - for x in [[1]]] - """ - ) - message = testutils.Message(checker, node=node) - with self.assertAddsMessages(message): - self.checker.visit_call(node) - - def as_argument_to_callable_constructor_test(self, fxn, callable_fn): - module = astroid.parse(f"x = {callable_fn}({fxn}())") - with self.assertNoMessages(): - self.walk(module) - - def as_argument_to_materialized_filter(self, callable_fn): - module = astroid.parse(f"list(filter(None, {callable_fn}()))") - with self.assertNoMessages(): - self.walk(module) - - def as_argument_to_random_fxn_test(self, fxn): - checker = f"{fxn}-builtin-not-iterating" - node = astroid.extract_node( - f""" - y( - {fxn}() #@ - ) - """ - ) - message = testutils.Message(checker, node=node) - with self.assertAddsMessages(message): - self.checker.visit_call(node) - - def as_argument_to_str_join_test(self, fxn): - code = f"x = ''.join({fxn}())" - module = astroid.parse(code) - with self.assertNoMessages(): - self.walk(module) - - def as_argument_to_itertools_functions(self, fxn): - code = f""" - from __future__ import absolute_import - import itertools - from itertools import product - for i,j in product({fxn}(), repeat=2): - pass - for i,j in itertools.product({fxn}(), repeat=2): - pass - """ - module = astroid.parse(code) - with self.assertNoMessages(): - self.walk(module) - - def as_argument_to_zip_test(self, fxn): - module = astroid.parse(f"list(zip({fxn}))") - with self.assertNoMessages(): - self.walk(module) - - def as_argument_to_map_test(self, fxn): - module = astroid.parse(f"list(map(__, {fxn}()))") - with self.assertNoMessages(): - self.walk(module) - - def as_iterable_in_unpacking(self, fxn): - node = astroid.extract_node( - f""" - a, b = __({fxn}()) - """ - ) - with self.assertNoMessages(): - self.checker.visit_call(node) - - def as_assignment(self, fxn): - checker = f"{fxn}-builtin-not-iterating" - node = astroid.extract_node( - f""" - a = __({fxn}()) - """ - ) - message = testutils.Message(checker, node=node) - with self.assertAddsMessages(message): - self.checker.visit_call(node) - - def iterating_context_tests(self, fxn): - """Helper for verifying a function isn't used as an iterator.""" - self.as_iterable_in_for_loop_test(fxn) - self.as_used_by_iterable_in_for_loop_test(fxn) - self.as_iterable_in_genexp_test(fxn) - self.as_iterable_in_listcomp_test(fxn) - self.as_used_in_variant_in_genexp_test(fxn) - self.as_used_in_variant_in_listcomp_test(fxn) - self.as_argument_to_random_fxn_test(fxn) - self.as_argument_to_str_join_test(fxn) - self.as_iterable_in_unpacking(fxn) - self.as_assignment(fxn) - self.as_argument_to_materialized_filter(fxn) - self.as_iterable_in_yield_from(fxn) - self.as_iterable_in_starred_context(fxn) - self.as_argument_to_itertools_functions(fxn) - self.as_argument_to_zip_test(fxn) - self.as_argument_to_map_test(fxn) - for func in ( - "iter", - "list", - "tuple", - "sorted", - "set", - "sum", - "any", - "all", - "enumerate", - "dict", - "OrderedDict", - ): - self.as_argument_to_callable_constructor_test(fxn, func) - - def test_dict_subclasses_methods_in_iterating_context(self): - iterating, not_iterating = astroid.extract_node( - """ - from __future__ import absolute_import - from collections import defaultdict - d = defaultdict(list) - a, b = d.keys() #@ - x = d.keys() #@ - """ - ) - - with self.assertNoMessages(): - self.checker.visit_call(iterating.value) - - message = testutils.Message("dict-keys-not-iterating", node=not_iterating.value) - with self.assertAddsMessages(message): - self.checker.visit_call(not_iterating.value) - - def test_dict_methods_in_iterating_context(self): - iterating_code = [ - "for x in {}(): pass", - "(x for x in {}())", - "[x for x in {}()]", - "iter({}())", - "a, b = {}()", - "max({}())", - "min({}())", - "3 in {}()", - "3 not in {}()", - "set().update({}())", - "[].extend({}())", - "{{}}.update({}())", - """ - from __future__ import absolute_import - from itertools import chain - chain.from_iterable({}()) - """, - ] - non_iterating_code = ["x = __({}())", "__({}())[0]"] - - for method in ("keys", "items", "values"): - dict_method = f"{{}}.{method}" - - for code in iterating_code: - with_value = code.format(dict_method) - module = astroid.parse(with_value) - with self.assertNoMessages(): - self.walk(module) - - for code in non_iterating_code: - with_value = code.format(dict_method) - node = astroid.extract_node(with_value) - - checker = f"dict-{method}-not-iterating" - message = testutils.Message(checker, node=node) - with self.assertAddsMessages(message): - self.checker.visit_call(node) - - def test_map_in_iterating_context(self): - self.iterating_context_tests("map") - - def test_zip_in_iterating_context(self): - self.iterating_context_tests("zip") - - def test_range_in_iterating_context(self): - self.iterating_context_tests("range") - - def test_filter_in_iterating_context(self): - self.iterating_context_tests("filter") - - def defined_method_test(self, method, warning): - """Helper for verifying that a certain method is not defined.""" - node = astroid.extract_node( - f""" - class Foo(object): - def __{method}__(self, other): #@ - pass""" - ) - message = testutils.Message(warning, node=node) - with self.assertAddsMessages(message): - self.checker.visit_functiondef(node) - - def test_delslice_method(self): - self.defined_method_test("delslice", "delslice-method") - - def test_getslice_method(self): - self.defined_method_test("getslice", "getslice-method") - - def test_setslice_method(self): - self.defined_method_test("setslice", "setslice-method") - - def test_coerce_method(self): - self.defined_method_test("coerce", "coerce-method") - - def test_oct_method(self): - self.defined_method_test("oct", "oct-method") - - def test_hex_method(self): - self.defined_method_test("hex", "hex-method") - - def test_nonzero_method(self): - self.defined_method_test("nonzero", "nonzero-method") - - def test_cmp_method(self): - self.defined_method_test("cmp", "cmp-method") - - def test_div_method(self): - self.defined_method_test("div", "div-method") - - def test_idiv_method(self): - self.defined_method_test("idiv", "idiv-method") - - def test_rdiv_method(self): - self.defined_method_test("rdiv", "rdiv-method") - - def test_eq_and_hash_method(self): - """Helper for verifying that a certain method is not defined.""" - node = astroid.extract_node( - """ - class Foo(object): #@ - def __eq__(self, other): - pass - def __hash__(self): - pass""" - ) - with self.assertNoMessages(): - self.checker.visit_classdef(node) - - def test_eq_and_hash_is_none(self): - """Helper for verifying that a certain method is not defined.""" - node = astroid.extract_node( - """ - class Foo(object): #@ - def __eq__(self, other): - pass - __hash__ = None""" - ) - with self.assertNoMessages(): - self.checker.visit_classdef(node) - - def test_eq_without_hash_method(self): - """Helper for verifying that a certain method is not defined.""" - node = astroid.extract_node( - """ - class Foo(object): #@ - def __eq__(self, other): - pass""" - ) - message = testutils.Message("eq-without-hash", node=node) - with self.assertAddsMessages(message): - self.checker.visit_classdef(node) - - def test_relative_import(self): - node = astroid.extract_node("import string #@") - message = testutils.Message("no-absolute-import", node=node) - with self.assertAddsMessages(message): - self.checker.visit_import(node) - with self.assertNoMessages(): - # message should only be added once - self.checker.visit_import(node) - - def test_relative_from_import(self): - node = astroid.extract_node("from os import path #@") - message = testutils.Message("no-absolute-import", node=node) - with self.assertAddsMessages(message): - self.checker.visit_importfrom(node) - with self.assertNoMessages(): - # message should only be added once - self.checker.visit_importfrom(node) - - def test_absolute_import(self): - module_import = astroid.parse( - "from __future__ import absolute_import; import os" - ) - module_from = astroid.parse( - "from __future__ import absolute_import; from os import path" - ) - with self.assertNoMessages(): - for module in (module_import, module_from): - self.walk(module) - - def test_import_star_module_level(self): - node = astroid.extract_node( - """ - def test(): - from lala import * #@ - """ - ) - absolute = testutils.Message("no-absolute-import", node=node) - star = testutils.Message("import-star-module-level", node=node) - with self.assertAddsMessages(absolute, star): - self.checker.visit_importfrom(node) - - def test_division(self): - nodes = astroid.extract_node( - """\ - from _unknown import a, b - 3 / 2 #@ - 3 / int(a) #@ - int(a) / 3 #@ - a / b #@ - """ - ) - for node in nodes: - message = testutils.Message("old-division", node=node) - with self.assertAddsMessages(message): - self.checker.visit_binop(node) - - def test_division_with_future_statement(self): - module = astroid.parse("from __future__ import division; 3 / 2") - with self.assertNoMessages(): - self.walk(module) - - def test_floor_division(self): - node = astroid.extract_node(" 3 // 2 #@") - with self.assertNoMessages(): - self.checker.visit_binop(node) - - def test_division_by_float(self): - nodes = astroid.extract_node( - """\ - 3.0 / 2 #@ - 3 / 2.0 #@ - 3 / float(a) #@ - float(a) / 3 #@ - """ - ) - with self.assertNoMessages(): - for node in nodes: - self.checker.visit_binop(node) - - def test_division_different_types(self): - nodes = astroid.extract_node( - """ - class A: - pass - A / 2 #@ - A() / 2 #@ - "a" / "a" #@ - class Path: - def __div__(self, other): - return 42 - Path() / 24 #@ - """ - ) - for node in nodes: - with self.assertNoMessages(): - self.checker.visit_binop(node) - - def test_dict_iter_method(self): - for meth in ("keys", "values", "items"): - node = astroid.extract_node(f"x.iter{meth}() #@") - message = testutils.Message("dict-iter-method", node=node) - with self.assertAddsMessages(message): - self.checker.visit_call(node) - - def test_dict_iter_method_on_dict(self): - nodes = astroid.extract_node( - """ - from collections import defaultdict - {}.iterkeys() #@ - defaultdict(list).iterkeys() #@ - class Someclass(dict): - pass - Someclass().iterkeys() #@ - - # Emits even though we are not sure they are dicts - x.iterkeys() #@ - - def func(x): - x.iterkeys() #@ - """ - ) - for node in nodes: - message = testutils.Message("dict-iter-method", node=node) - with self.assertAddsMessages(message): - self.checker.visit_call(node) - - def test_dict_not_iter_method(self): - arg_node = astroid.extract_node("x.iterkeys(x) #@") - stararg_node = astroid.extract_node("x.iterkeys(*x) #@") - kwarg_node = astroid.extract_node("x.iterkeys(y=x) #@") - with self.assertNoMessages(): - for node in (arg_node, stararg_node, kwarg_node): - self.checker.visit_call(node) - - def test_dict_view_method(self): - for meth in ("keys", "values", "items"): - node = astroid.extract_node(f"x.view{meth}() #@") - message = testutils.Message("dict-view-method", node=node) - with self.assertAddsMessages(message): - self.checker.visit_call(node) - - def test_dict_viewkeys(self): - nodes = astroid.extract_node( - """ - from collections import defaultdict - {}.viewkeys() #@ - defaultdict(list).viewkeys() #@ - class Someclass(dict): - pass - Someclass().viewkeys() #@ - - # Emits even though they might not be dicts - x.viewkeys() #@ - - def func(x): - x.viewkeys() #@ - """ - ) - for node in nodes: - message = testutils.Message("dict-view-method", node=node) - with self.assertAddsMessages(message): - self.checker.visit_call(node) - - def test_next_method(self): - node = astroid.extract_node("x.next() #@") - message = testutils.Message("next-method-called", node=node) - with self.assertAddsMessages(message): - self.checker.visit_call(node) - - def test_not_next_method(self): - arg_node = astroid.extract_node("x.next(x) #@") - stararg_node = astroid.extract_node("x.next(*x) #@") - kwarg_node = astroid.extract_node("x.next(y=x) #@") - with self.assertNoMessages(): - for node in (arg_node, stararg_node, kwarg_node): - self.checker.visit_call(node) - - def test_metaclass_assignment(self): - node = astroid.extract_node( - """ - class Foo(object): #@ - __metaclass__ = type""" - ) - message = testutils.Message("metaclass-assignment", node=node) - with self.assertAddsMessages(message): - self.checker.visit_classdef(node) - - def test_metaclass_global_assignment(self): - module = astroid.parse("__metaclass__ = type") - with self.assertNoMessages(): - self.walk(module) - - def test_xreadlines_attribute(self): - node = astroid.extract_node( - """ - f.xreadlines #@ - """ - ) - message = testutils.Message("xreadlines-attribute", node=node) - with self.assertAddsMessages(message): - self.checker.visit_attribute(node) - - def test_exception_message_attribute(self): - node = astroid.extract_node( - """ - try: - raise Exception("test") - except Exception as e: - e.message #@ - """ - ) - message = testutils.Message("exception-message-attribute", node=node) - with self.assertAddsMessages(message): - self.checker.visit_attribute(node) - - def test_normal_message_attribute(self): - node = astroid.extract_node( - """ - e.message #@ - """ - ) - with self.assertNoMessages(): - self.checker.visit_attribute(node) - - def test_invalid_codec(self): - node = astroid.extract_node('foobar.encode("hex") #@') - message = testutils.Message("invalid-str-codec", node=node) - with self.assertAddsMessages(message): - self.checker.visit_call(node) - - def test_valid_codec(self): - node = astroid.extract_node('foobar.encode("ascii", "ignore") #@') - with self.assertNoMessages(): - self.checker.visit_call(node) - - def test_visit_call_with_kwarg(self): - node = astroid.extract_node('foobar.raz(encoding="hex") #@') - with self.assertNoMessages(): - self.checker.visit_call(node) - - def test_invalid_open_codec(self): - node = astroid.extract_node('open(foobar, encoding="hex") #@') - message = testutils.Message("invalid-str-codec", node=node) - with self.assertAddsMessages(message): - self.checker.visit_call(node) - - def test_valid_open_codec(self): - node = astroid.extract_node('open(foobar, encoding="palmos") #@') - with self.assertNoMessages(): - self.checker.visit_call(node) - - def test_using_cmp_argument(self): - nodes = astroid.extract_node( - """ - [].sort(cmp=lambda x: x) #@ - a = list(range(x)) - a.sort(cmp=lambda x: x) #@ - - sorted([], cmp=lambda x: x) #@ - """ - ) - for node in nodes: - message = testutils.Message("using-cmp-argument", node=node) - with self.assertAddsMessages(message): - self.checker.visit_call(node) - - def test_sys_maxint(self): - node = astroid.extract_node( - """ - import sys - sys.maxint #@ - """ - ) - message = testutils.Message("sys-max-int", node=node) - with self.assertAddsMessages(message): - self.checker.visit_attribute(node) - - def test_itertools_izip(self): - node = astroid.extract_node( - """ - from itertools import izip #@ - """ - ) - absolute_import_message = testutils.Message("no-absolute-import", node=node) - message = testutils.Message("deprecated-itertools-function", node=node) - with self.assertAddsMessages(absolute_import_message, message): - self.checker.visit_importfrom(node) - - def test_deprecated_types_fields(self): - node = astroid.extract_node( - """ - from types import StringType #@ - """ - ) - absolute_import_message = testutils.Message("no-absolute-import", node=node) - message = testutils.Message("deprecated-types-field", node=node) - with self.assertAddsMessages(absolute_import_message, message): - self.checker.visit_importfrom(node) - - def test_sys_maxint_imort_from(self): - node = astroid.extract_node( - """ - from sys import maxint #@ - """ - ) - absolute_import_message = testutils.Message("no-absolute-import", node=node) - message = testutils.Message("sys-max-int", node=node) - with self.assertAddsMessages(absolute_import_message, message): - self.checker.visit_importfrom(node) - - def test_object_maxint(self): - node = astroid.extract_node( - """ - sys = object() - sys.maxint #@ - """ - ) - with self.assertNoMessages(): - self.checker.visit_attribute(node) - - def test_bad_import(self): - node = astroid.extract_node( - """ - import urllib2, sys #@ - """ - ) - absolute_import_message = testutils.Message("no-absolute-import", node=node) - message = testutils.Message("bad-python3-import", node=node) - with self.assertAddsMessages(absolute_import_message, message): - self.checker.visit_import(node) - - def test_bad_import_turtle(self): - node = astroid.extract_node( - """ - import turtle #@ - turtle.Turtle() - """ - ) - absolute_import_message = testutils.Message("no-absolute-import", node=node) - with self.assertAddsMessages(absolute_import_message): - self.checker.visit_import(node) - - def test_bad_import_dbm(self): - node = astroid.extract_node( - """ - from dbm import open as open_ #@ - open_("dummy.db") - """ - ) - absolute_import_message = testutils.Message("no-absolute-import", node=node) - with self.assertAddsMessages(absolute_import_message): - self.checker.visit_importfrom(node) - - def test_bad_import_conditional(self): - node = astroid.extract_node( - """ - import six - if six.PY2: - import urllib2 #@ - """ - ) - absolute_import_message = testutils.Message("no-absolute-import", node=node) - with self.assertAddsMessages(absolute_import_message): - self.checker.visit_import(node) - - def test_bad_import_try_except_handler(self): - node = astroid.extract_node( - """ - try: - from hashlib import sha - except: - import sha #@ - """ - ) - absolute_import_message = testutils.Message("no-absolute-import", node=node) - with self.assertAddsMessages(absolute_import_message): - self.checker.visit_import(node) - - def test_bad_import_try(self): - node = astroid.extract_node( - """ - try: - import md5 #@ - except: - from hashlib import md5 - finally: - pass - """ - ) - absolute_import_message = testutils.Message("no-absolute-import", node=node) - with self.assertAddsMessages(absolute_import_message): - self.checker.visit_import(node) - - def test_bad_import_try_finally(self): - node = astroid.extract_node( - """ - try: - import Queue #@ - finally: - import queue - """ - ) - absolute_import_message = testutils.Message("no-absolute-import", node=node) - message = testutils.Message("bad-python3-import", node=node) - with self.assertAddsMessages(absolute_import_message, message): - self.checker.visit_import(node) - - def test_bad_import_from(self): - node = astroid.extract_node( - """ - from cStringIO import StringIO #@ - """ - ) - absolute_import_message = testutils.Message("no-absolute-import", node=node) - message = testutils.Message("bad-python3-import", node=node) - with self.assertAddsMessages(absolute_import_message, message): - self.checker.visit_importfrom(node) - - def test_bad_string_attribute(self): - node = astroid.extract_node( - """ - import string - string.maketrans #@ - """ - ) - message = testutils.Message("deprecated-string-function", node=node) - with self.assertAddsMessages(message): - self.checker.visit_attribute(node) - - def test_bad_operator_attribute(self): - node = astroid.extract_node( - """ - import operator - operator.div #@ - """ - ) - message = testutils.Message("deprecated-operator-function", node=node) - with self.assertAddsMessages(message): - self.checker.visit_attribute(node) - - def test_comprehension_escape(self): - assign, escaped_node = astroid.extract_node( - """ - a = [i for i in range(10)] #@ - i #@ - """ - ) - good_module = astroid.parse( - """ - {c for c in range(10)} #@ - {j:j for j in range(10)} #@ - [image_child] = [x for x in range(10)] - thumbnail = func(__(image_child)) - """ - ) - message = testutils.Message("comprehension-escape", node=escaped_node) - with self.assertAddsMessages(message): - self.checker.visit_listcomp(assign.value) - - with self.assertNoMessages(): - self.walk(good_module) - - def test_comprehension_escape_newly_introduced(self): - node = astroid.extract_node( - """ - [i for i in range(3)] - for i in range(3): - i - """ - ) - with self.assertNoMessages(): - self.walk(node) - - def test_exception_escape(self): - module = astroid.parse( - """ - try: 1/0 - except ValueError as exc: - pass - exc #@ - try: - 2/0 - except (ValueError, TypeError) as exc: - exc = 2 - exc #@ - try: - 2/0 - except (ValueError, TypeError): #@ - exc = 2 - exc #@ - try: - 1/0 - except (ValueError, TypeError) as exc: - foo(bar for bar in exc.bar) - """ - ) - message = testutils.Message("exception-escape", node=module.body[1].value) - with self.assertAddsMessages(message): - self.checker.visit_excepthandler(module.body[0].handlers[0]) - with self.assertNoMessages(): - self.checker.visit_excepthandler(module.body[2].handlers[0]) - self.checker.visit_excepthandler(module.body[4].handlers[0]) - self.checker.visit_excepthandler(module.body[6].handlers[0]) - - def test_bad_sys_attribute(self): - node = astroid.extract_node( - """ - import sys - sys.exc_clear #@ - """ - ) - message = testutils.Message("deprecated-sys-function", node=node) - with self.assertAddsMessages(message): - self.checker.visit_attribute(node) - - def test_bad_urllib_attribute(self): - nodes = astroid.extract_node( - """ - import urllib - urllib.addbase #@ - urllib.splithost #@ - urllib.urlretrieve #@ - urllib.urlopen #@ - urllib.urlencode #@ - """ - ) - for node in nodes: - message = testutils.Message("deprecated-urllib-function", node=node) - with self.assertAddsMessages(message): - self.checker.visit_attribute(node) - - def test_ok_string_attribute(self): - node = astroid.extract_node( - """ - import string - string.ascii_letters #@ - """ - ) - with self.assertNoMessages(): - self.checker.visit_attribute(node) - - def test_bad_string_call(self): - node = astroid.extract_node( - """ - import string - string.upper("hello world") #@ - """ - ) - message = testutils.Message("deprecated-string-function", node=node) - with self.assertAddsMessages(message): - self.checker.visit_call(node) - - def test_ok_shadowed_call(self): - node = astroid.extract_node( - """ - import six.moves.configparser - six.moves.configparser.ConfigParser() #@ - """ - ) - with self.assertNoMessages(): - self.checker.visit_call(node) - - def test_ok_string_call(self): - node = astroid.extract_node( - """ - import string - string.Foramtter() #@ - """ - ) - with self.assertNoMessages(): - self.checker.visit_call(node) - - def test_bad_string_import_from(self): - node = astroid.extract_node( - """ - from string import atoi #@ - """ - ) - absolute_import_message = testutils.Message("no-absolute-import", node=node) - message = testutils.Message("deprecated-string-function", node=node) - with self.assertAddsMessages(absolute_import_message, message): - self.checker.visit_importfrom(node) - - def test_ok_string_import_from(self): - node = astroid.extract_node( - """ - from string import digits #@ - """ - ) - absolute_import_message = testutils.Message("no-absolute-import", node=node) - with self.assertAddsMessages(absolute_import_message): - self.checker.visit_importfrom(node) - - def test_bad_str_translate_call_string_literal(self): - node = astroid.extract_node( - """ - foobar.translate(None, 'abc123') #@ - """ - ) - message = testutils.Message( - "deprecated-str-translate-call", node=node, confidence=INFERENCE_FAILURE - ) - with self.assertAddsMessages(message): - self.checker.visit_call(node) - - def test_bad_str_translate_call_variable(self): - node = astroid.extract_node( - """ - def raz(foobar): - foobar.translate(None, 'hello') #@ - """ - ) - message = testutils.Message( - "deprecated-str-translate-call", node=node, confidence=INFERENCE_FAILURE - ) - with self.assertAddsMessages(message): - self.checker.visit_call(node) - - def test_bad_str_translate_call_infer_str(self): - node = astroid.extract_node( - """ - foobar = "hello world" - foobar.translate(None, foobar) #@ - """ - ) - message = testutils.Message( - "deprecated-str-translate-call", node=node, confidence=INFERENCE - ) - with self.assertAddsMessages(message): - self.checker.visit_call(node) - - def test_ok_str_translate_call_integer(self): - node = astroid.extract_node( - """ - foobar.translate(None, 33) #@ - """ - ) - with self.assertNoMessages(): - self.checker.visit_call(node) - - def test_ok_str_translate_call_keyword(self): - node = astroid.extract_node( - """ - foobar.translate(None, 'foobar', raz=33) #@ - """ - ) - with self.assertNoMessages(): - self.checker.visit_call(node) - - def test_ok_str_translate_call_not_str(self): - node = astroid.extract_node( - """ - foobar = {} - foobar.translate(None, 'foobar') #@ - """ - ) - with self.assertNoMessages(): - self.checker.visit_call(node) - - def test_non_py2_conditional(self): - code = """ - from __future__ import absolute_import - import sys - x = {} - if sys.maxsize: - x.iterkeys() #@ - """ - node = astroid.extract_node(code) - module = node.parent.parent - message = testutils.Message("dict-iter-method", node=node) - with self.assertAddsMessages(message): - self.walk(module) - - def test_six_conditional(self): - code = """ - from __future__ import absolute_import - import six - x = {} - if six.PY2: - x.iterkeys() - """ - module = astroid.parse(code) - with self.assertNoMessages(): - self.walk(module) - - def test_versioninfo_conditional(self): - code = """ - from __future__ import absolute_import - import sys - x = {} - if sys.version_info[0] == 2: - x.iterkeys() - """ - module = astroid.parse(code) - with self.assertNoMessages(): - self.walk(module) - - def test_versioninfo_tuple_conditional(self): - code = """ - from __future__ import absolute_import - import sys - x = {} - if sys.version_info == (2, 7): - x.iterkeys() - """ - module = astroid.parse(code) - with self.assertNoMessages(): - self.walk(module) - - def test_six_ifexp_conditional(self): - code = """ - from __future__ import absolute_import - import six - import string - string.translate if six.PY2 else None - """ - module = astroid.parse(code) - with self.assertNoMessages(): - self.walk(module) - - def test_next_defined(self): - node = astroid.extract_node( - """ - class Foo(object): - def next(self): #@ - pass""" - ) - message = testutils.Message("next-method-defined", node=node) - with self.assertAddsMessages(message): - self.checker.visit_functiondef(node) - - def test_next_defined_too_many_args(self): - node = astroid.extract_node( - """ - class Foo(object): - def next(self, foo=None): #@ - pass""" - ) - with self.assertNoMessages(): - self.checker.visit_functiondef(node) - - def test_next_defined_static_method_too_many_args(self): - node = astroid.extract_node( - """ - class Foo(object): - @staticmethod - def next(self): #@ - pass""" - ) - with self.assertNoMessages(): - self.checker.visit_functiondef(node) - - def test_next_defined_static_method(self): - node = astroid.extract_node( - """ - class Foo(object): - @staticmethod - def next(): #@ - pass""" - ) - message = testutils.Message("next-method-defined", node=node) - with self.assertAddsMessages(message): - self.checker.visit_functiondef(node) - - def test_next_defined_class_method(self): - node = astroid.extract_node( - """ - class Foo(object): - @classmethod - def next(cls): #@ - pass""" - ) - message = testutils.Message("next-method-defined", node=node) - with self.assertAddsMessages(message): - self.checker.visit_functiondef(node) diff --git a/tests/functional/a/abstract/abstract_abc_methods.py b/tests/functional/a/abstract/abstract_abc_methods.py index d174669a59..d63389c505 100644 --- a/tests/functional/a/abstract/abstract_abc_methods.py +++ b/tests/functional/a/abstract/abstract_abc_methods.py @@ -1,5 +1,5 @@ """ This should not warn about `prop` being abstract in Child """ -# pylint: disable=too-few-public-methods, no-absolute-import,metaclass-assignment, useless-object-inheritance +# pylint: disable=too-few-public-methods, useless-object-inheritance import abc diff --git a/tests/functional/a/access/access_attr_before_def_false_positive.py b/tests/functional/a/access/access_attr_before_def_false_positive.py index 00b7e40ed7..fbad8c3776 100644 --- a/tests/functional/a/access/access_attr_before_def_false_positive.py +++ b/tests/functional/a/access/access_attr_before_def_false_positive.py @@ -1,5 +1,5 @@ # pylint: disable=invalid-name,too-many-public-methods,attribute-defined-outside-init -# pylint: disable=no-absolute-import, useless-object-inheritance,too-few-public-methods +# pylint: disable= useless-object-inheritance,too-few-public-methods """This module demonstrates a possible problem of pyLint with calling __init__ s from inherited classes. Initializations done there are not considered, which results in Error E0203 for diff --git a/tests/functional/a/access/access_to__name__.py b/tests/functional/a/access/access_to__name__.py index 82dcdbe782..1a622824bf 100644 --- a/tests/functional/a/access/access_to__name__.py +++ b/tests/functional/a/access/access_to__name__.py @@ -1,4 +1,4 @@ -# pylint: disable=too-few-public-methods, print-statement, useless-object-inheritance +# pylint: disable=too-few-public-methods, useless-object-inheritance """test access to __name__ gives undefined member on new/old class instances but not on new/old class object """ diff --git a/tests/functional/a/access/access_to_protected_members.py b/tests/functional/a/access/access_to_protected_members.py index 06438400a5..ffbfabf157 100644 --- a/tests/functional/a/access/access_to_protected_members.py +++ b/tests/functional/a/access/access_to_protected_members.py @@ -1,4 +1,4 @@ -# pylint: disable=too-few-public-methods, super-init-not-called, print-statement +# pylint: disable=too-few-public-methods, super-init-not-called # pylint: disable=no-classmethod-decorator,useless-object-inheritance """Test external access to protected class members.""" from __future__ import print_function diff --git a/tests/functional/a/arguments.py b/tests/functional/a/arguments.py index e1a8005aa3..9e66ff18d1 100644 --- a/tests/functional/a/arguments.py +++ b/tests/functional/a/arguments.py @@ -1,4 +1,4 @@ -# pylint: disable=too-few-public-methods, no-absolute-import,missing-docstring,import-error,wrong-import-position +# pylint: disable=too-few-public-methods, missing-docstring,import-error,wrong-import-position # pylint: disable=wrong-import-order, useless-object-inheritance,unnecessary-lambda, consider-using-f-string def decorator(fun): diff --git a/tests/functional/a/assign/assigning_non_slot.py b/tests/functional/a/assign/assigning_non_slot.py index 4789014ff4..cf673692ff 100644 --- a/tests/functional/a/assign/assigning_non_slot.py +++ b/tests/functional/a/assign/assigning_non_slot.py @@ -1,7 +1,7 @@ """ Checks assigning attributes not found in class slots will trigger assigning-non-slot warning. """ -# pylint: disable=too-few-public-methods, no-init, missing-docstring, no-absolute-import, import-error, useless-object-inheritance, redundant-u-string-prefix +# pylint: disable=too-few-public-methods, no-init, missing-docstring, import-error, useless-object-inheritance, redundant-u-string-prefix from collections import deque from missing import Unknown diff --git a/tests/functional/b/bad_reversed_sequence.py b/tests/functional/b/bad_reversed_sequence.py index 0d7b84da06..101123330b 100644 --- a/tests/functional/b/bad_reversed_sequence.py +++ b/tests/functional/b/bad_reversed_sequence.py @@ -1,6 +1,6 @@ """ Checks that reversed() receive proper argument """ # pylint: disable=missing-docstring, useless-object-inheritance -# pylint: disable=too-few-public-methods,no-self-use,no-absolute-import +# pylint: disable=too-few-public-methods,no-self-use from collections import deque, OrderedDict from enum import IntEnum diff --git a/tests/functional/b/base_init_vars.py b/tests/functional/b/base_init_vars.py index 08e2828ece..b77ec2b8d0 100644 --- a/tests/functional/b/base_init_vars.py +++ b/tests/functional/b/base_init_vars.py @@ -1,7 +1,7 @@ -# pylint:disable=no-self-use, print-statement +# pylint:disable=no-self-use # pylint:disable=too-few-public-methods, useless-object-inheritance """Checks that class variables are seen as inherited !""" -__revision__ = '' + class BaseClass(object): """A simple base class diff --git a/tests/functional/c/cellvar_escaping_loop.py b/tests/functional/c/cellvar_escaping_loop.py index d2c1fb4a56..5520fe9490 100644 --- a/tests/functional/c/cellvar_escaping_loop.py +++ b/tests/functional/c/cellvar_escaping_loop.py @@ -1,4 +1,4 @@ -# pylint: disable=print-statement, unnecessary-comprehension,missing-docstring,too-few-public-methods +# pylint: disable= unnecessary-comprehension,missing-docstring,too-few-public-methods """Tests for loopvar-in-closure.""" from __future__ import print_function diff --git a/tests/functional/c/confidence_filter.rc b/tests/functional/c/confidence_filter.rc index 74953b6861..5d21cb56ed 100644 --- a/tests/functional/c/confidence_filter.rc +++ b/tests/functional/c/confidence_filter.rc @@ -1,3 +1,3 @@ [Messages Control] -disable=no-init,too-few-public-methods,undefined-variable,print-statement +disable=no-init,too-few-public-methods,undefined-variable confidence=INFERENCE,HIGH,UNDEFINED diff --git a/tests/functional/d/defined_and_used_on_same_line.py b/tests/functional/d/defined_and_used_on_same_line.py index d5bdb4db0a..98e5077a6e 100644 --- a/tests/functional/d/defined_and_used_on_same_line.py +++ b/tests/functional/d/defined_and_used_on_same_line.py @@ -1,5 +1,5 @@ """Check for definitions and usage happening on the same line.""" -#pylint: disable=missing-docstring,multiple-statements,no-absolute-import,parameter-unpacking,wrong-import-position,unnecessary-comprehension,unspecified-encoding +#pylint: disable=missing-docstring,multiple-statements,wrong-import-position,unnecessary-comprehension,unspecified-encoding from __future__ import print_function print([index for index in range(10)]) diff --git a/tests/functional/d/dotted_ancestor.py b/tests/functional/d/dotted_ancestor.py index 2c82d89a30..89826179a9 100644 --- a/tests/functional/d/dotted_ancestor.py +++ b/tests/functional/d/dotted_ancestor.py @@ -1,9 +1,8 @@ """bla""" -# pylint: disable=no-absolute-import + from ..n.non import non_init_parent_called -__revision__ = 'yo' class Aaaa(non_init_parent_called.AAAA): # [too-few-public-methods] """test dotted name in ancestors""" diff --git a/tests/functional/d/dotted_ancestor.txt b/tests/functional/d/dotted_ancestor.txt index 4aa47e7c26..20f9dbee8e 100644 --- a/tests/functional/d/dotted_ancestor.txt +++ b/tests/functional/d/dotted_ancestor.txt @@ -1 +1 @@ -too-few-public-methods:8:0:Aaaa:Too few public methods (0/2) +too-few-public-methods:7:0:Aaaa:Too few public methods (0/2):HIGH diff --git a/tests/functional/g/generated_members.rc b/tests/functional/g/generated_members.rc index 8b61b4996b..31b87ffd0b 100644 --- a/tests/functional/g/generated_members.rc +++ b/tests/functional/g/generated_members.rc @@ -1,5 +1,5 @@ [Messages Control] -disable=too-few-public-methods,print-statement +disable=too-few-public-methods [typecheck] generated-members= diff --git a/tests/functional/i/import_error.py b/tests/functional/i/import_error.py index 09bf5560ee..21c06d1e39 100644 --- a/tests/functional/i/import_error.py +++ b/tests/functional/i/import_error.py @@ -1,5 +1,5 @@ """ Test that import errors are detected. """ -# pylint: disable=invalid-name, unused-import, no-absolute-import, bare-except, broad-except, wrong-import-order, wrong-import-position +# pylint: disable=invalid-name, unused-import, bare-except, broad-except, wrong-import-order, wrong-import-position import totally_missing # [import-error] try: diff --git a/tests/functional/i/import_itself.py b/tests/functional/i/import_itself.py index becd529d7e..1f4928f3e1 100644 --- a/tests/functional/i/import_itself.py +++ b/tests/functional/i/import_itself.py @@ -1,5 +1,5 @@ """test module importing itself""" -# pylint: disable=no-absolute-import,using-constant-test +# pylint: disable=using-constant-test from __future__ import print_function from . import import_itself # [import-self] diff --git a/tests/functional/i/inherit_non_class.py b/tests/functional/i/inherit_non_class.py index ee9ef508c4..bbee6bd9a7 100644 --- a/tests/functional/i/inherit_non_class.py +++ b/tests/functional/i/inherit_non_class.py @@ -2,7 +2,7 @@ a class emits a warning. """ # pylint: disable=no-init, import-error, invalid-name, using-constant-test, useless-object-inheritance -# pylint: disable=missing-docstring, too-few-public-methods, no-absolute-import +# pylint: disable=missing-docstring, too-few-public-methods from missing import Missing diff --git a/tests/functional/i/invalid/e/invalid_exceptions_caught.py b/tests/functional/i/invalid/e/invalid_exceptions_caught.py index 5cb6c84b8b..c0298a06ec 100644 --- a/tests/functional/i/invalid/e/invalid_exceptions_caught.py +++ b/tests/functional/i/invalid/e/invalid_exceptions_caught.py @@ -1,5 +1,5 @@ # pylint: disable=missing-docstring, too-few-public-methods, useless-object-inheritance, use-list-literal -# pylint: disable=too-many-ancestors, no-absolute-import, import-error, multiple-imports,wrong-import-position +# pylint: disable=too-many-ancestors, import-error, multiple-imports,wrong-import-position from __future__ import print_function import socket, binascii, abc, six diff --git a/tests/functional/i/invalid/invalid_name.py b/tests/functional/i/invalid/invalid_name.py index 07ad99b80e..9ec81bfbf8 100644 --- a/tests/functional/i/invalid/invalid_name.py +++ b/tests/functional/i/invalid/invalid_name.py @@ -1,5 +1,5 @@ """ Tests for invalid-name checker. """ -# pylint: disable=unused-import, no-absolute-import, wrong-import-position,import-outside-toplevel +# pylint: disable=unused-import, wrong-import-position,import-outside-toplevel AAA = 24 try: diff --git a/tests/functional/l/len_checks.py b/tests/functional/l/len_checks.py index 2cbefcbe72..ceeedb5493 100644 --- a/tests/functional/l/len_checks.py +++ b/tests/functional/l/len_checks.py @@ -1,4 +1,4 @@ -# pylint: disable=too-few-public-methods,import-error, no-absolute-import,missing-docstring, misplaced-comparison-constant +# pylint: disable=too-few-public-methods,import-error, missing-docstring, misplaced-comparison-constant # pylint: disable=useless-super-delegation,wrong-import-position,invalid-name, wrong-import-order, condition-evals-to-constant if len('TEST'): # [len-as-condition] diff --git a/tests/functional/l/logging_format_interpolation.py b/tests/functional/l/logging_format_interpolation.py index 782e3834bc..5670ad57c8 100644 --- a/tests/functional/l/logging_format_interpolation.py +++ b/tests/functional/l/logging_format_interpolation.py @@ -1,4 +1,4 @@ -# pylint: disable=no-member, no-absolute-import, import-error,line-too-long +# pylint: disable=no-member, import-error,line-too-long # pylint: disable=invalid-name,missing-docstring,wrong-import-order,wrong-import-position, consider-using-f-string try: import __builtin__ as builtins diff --git a/tests/functional/m/member/member_checks.py b/tests/functional/m/member/member_checks.py index ee79d10127..c1b6a22fba 100644 --- a/tests/functional/m/member/member_checks.py +++ b/tests/functional/m/member/member_checks.py @@ -1,4 +1,4 @@ -# pylint: disable=print-statement,missing-docstring,no-self-use,too-few-public-methods,bare-except,broad-except, useless-object-inheritance, unused-private-member +# pylint: disable=missing-docstring,no-self-use,too-few-public-methods,bare-except,broad-except, useless-object-inheritance, unused-private-member # pylint: disable=using-constant-test,expression-not-assigned, assigning-non-slot, unused-variable,pointless-statement, wrong-import-order, wrong-import-position,import-outside-toplevel from __future__ import print_function class Provider(object): diff --git a/tests/functional/m/metaclass_attr_access.py b/tests/functional/m/metaclass_attr_access.py index e6bf1cccb4..50f9712faf 100644 --- a/tests/functional/m/metaclass_attr_access.py +++ b/tests/functional/m/metaclass_attr_access.py @@ -1,9 +1,9 @@ -# pylint: disable=too-few-public-methods, metaclass-assignment, useless-object-inheritance +# pylint: disable=too-few-public-methods, useless-object-inheritance """test attribute access on metaclass""" - from __future__ import print_function + class Meta(type): """the meta class""" def __init__(cls, name, bases, dictionary): @@ -11,6 +11,7 @@ def __init__(cls, name, bases, dictionary): print(cls, cls._meta_args) delattr(cls, '_meta_args') + class Test(object): """metaclassed class""" __metaclass__ = Meta diff --git a/tests/functional/m/method_hidden.py b/tests/functional/m/method_hidden.py index 47031d8d0f..cdbe323e2a 100644 --- a/tests/functional/m/method_hidden.py +++ b/tests/functional/m/method_hidden.py @@ -1,4 +1,4 @@ -# pylint: disable=too-few-public-methods,print-statement, useless-object-inheritance,missing-docstring +# pylint: disable=too-few-public-methods, useless-object-inheritance,missing-docstring """check method hidding ancestor attribute """ from __future__ import print_function diff --git a/tests/functional/n/name/name_styles.py b/tests/functional/n/name/name_styles.py index a9d74356c7..27e6e1044c 100644 --- a/tests/functional/n/name/name_styles.py +++ b/tests/functional/n/name/name_styles.py @@ -1,5 +1,5 @@ """Test for the invalid-name warning.""" -# pylint: disable=no-absolute-import, useless-object-inheritance, unnecessary-pass, unnecessary-comprehension, unused-private-member +# pylint: disable= useless-object-inheritance, unnecessary-pass, unnecessary-comprehension, unused-private-member from __future__ import print_function import abc import collections diff --git a/tests/functional/n/name/names_in__all__.py b/tests/functional/n/name/names_in__all__.py index 9b2840accf..c5d17cd80c 100644 --- a/tests/functional/n/name/names_in__all__.py +++ b/tests/functional/n/name/names_in__all__.py @@ -1,4 +1,4 @@ -# pylint: disable=too-few-public-methods,no-self-use, no-absolute-import,import-error, useless-object-inheritance, unnecessary-pass +# pylint: disable=too-few-public-methods,no-self-use, import-error, useless-object-inheritance, unnecessary-pass """Test Pylint's use of __all__. * NonExistant is not defined in this module, and it is listed in diff --git a/tests/functional/n/new_style_class_py_30.py b/tests/functional/n/new_style_class_py_30.py index 7a2a59a179..b70c6e0976 100644 --- a/tests/functional/n/new_style_class_py_30.py +++ b/tests/functional/n/new_style_class_py_30.py @@ -6,7 +6,7 @@ __revision__ = None -class File(file): # pylint: disable=file-builtin,undefined-variable +class File(file): # pylint: disable=undefined-variable """ Testing new-style class inheritance from file""" def __init__(self, name, mode="r", buffering=-1, verbose=False): """Constructor""" diff --git a/tests/functional/n/no/no_name_in_module.py b/tests/functional/n/no/no_name_in_module.py index e3ea9469b0..ba67fbdb72 100644 --- a/tests/functional/n/no/no_name_in_module.py +++ b/tests/functional/n/no/no_name_in_module.py @@ -1,4 +1,4 @@ -# pylint: disable=wildcard-import,unused-import,no-absolute-import,invalid-name,import-error, +# pylint: disable=wildcard-import,unused-import,invalid-name,import-error # pylint: disable=bare-except,broad-except,wrong-import-order,ungrouped-imports,wrong-import-position """check nonexistent names imported are reported""" from __future__ import print_function diff --git a/tests/functional/n/non/non_init_parent_called.py b/tests/functional/n/non/non_init_parent_called.py index 1ecc8f16aa..97489accf7 100644 --- a/tests/functional/n/non/non_init_parent_called.py +++ b/tests/functional/n/non/non_init_parent_called.py @@ -1,5 +1,5 @@ # pylint: disable=protected-access,import-self,too-few-public-methods,line-too-long -# pylint: disable=no-absolute-import,wrong-import-order, useless-object-inheritance, +# pylint: disable=wrong-import-order, useless-object-inheritance, """test for call to __init__ from a non ancestor class """ from __future__ import print_function diff --git a/tests/functional/n/nonlocal_without_binding.py b/tests/functional/n/nonlocal_without_binding.py index be3c003719..22887bcee6 100644 --- a/tests/functional/n/nonlocal_without_binding.py +++ b/tests/functional/n/nonlocal_without_binding.py @@ -1,6 +1,6 @@ """ Checks that reversed() receive proper argument """ # pylint: disable=missing-docstring,invalid-name,unused-variable, useless-object-inheritance -# pylint: disable=too-few-public-methods,no-self-use,no-absolute-import +# pylint: disable=too-few-public-methods,no-self-use def test(): def parent(): diff --git a/tests/functional/s/slots_checks.py b/tests/functional/s/slots_checks.py index c8cfd04e0d..79912b65c4 100644 --- a/tests/functional/s/slots_checks.py +++ b/tests/functional/s/slots_checks.py @@ -1,6 +1,6 @@ """ Checks that classes uses valid __slots__ """ -# pylint: disable=too-few-public-methods, missing-docstring, no-absolute-import, useless-object-inheritance +# pylint: disable=too-few-public-methods, missing-docstring, useless-object-inheritance # pylint: disable=using-constant-test, wrong-import-position, no-else-return, line-too-long, unused-private-member from collections import deque diff --git a/tests/functional/s/string/string_formatting.py b/tests/functional/s/string/string_formatting.py index 6d2b186657..8372a4373c 100644 --- a/tests/functional/s/string/string_formatting.py +++ b/tests/functional/s/string/string_formatting.py @@ -1,6 +1,6 @@ """Test for Python 3 string formatting error""" -# pylint: disable=too-few-public-methods, import-error, unused-argument, line-too-long, no-absolute-import, +# pylint: disable=too-few-public-methods, import-error, unused-argument, line-too-long, # pylint: disable=useless-object-inheritance, consider-using-f-string import os import sys diff --git a/tests/functional/s/string/string_formatting_error.py b/tests/functional/s/string/string_formatting_error.py index d48b47d3fa..681fedd560 100644 --- a/tests/functional/s/string/string_formatting_error.py +++ b/tests/functional/s/string/string_formatting_error.py @@ -1,5 +1,5 @@ """test string format error""" -# pylint: disable=print-statement,unsupported-binary-operation,line-too-long, consider-using-f-string +# pylint: disable=unsupported-binary-operation,line-too-long, consider-using-f-string from __future__ import print_function PARG_1 = PARG_2 = PARG_3 = 1 diff --git a/tests/functional/s/string/string_log_formatting.py b/tests/functional/s/string/string_log_formatting.py index e03d47f595..3bed980f72 100644 --- a/tests/functional/s/string/string_log_formatting.py +++ b/tests/functional/s/string/string_log_formatting.py @@ -1,15 +1,15 @@ -# pylint: disable=no-absolute-import -"""Test checking of log format strings +""" +Test checking of log format strings """ import logging -__revision__ = '' - def pprint(): - """Test string format in logging statements. """ + Test string format in logging statements. + """ + # These should all emit lint errors: logging.info(0, '') # [logging-too-many-args] logging.info('', '') # [logging-too-many-args] diff --git a/tests/functional/s/super/super_checks.py b/tests/functional/s/super/super_checks.py index 3f132dff1f..277feae7ee 100644 --- a/tests/functional/s/super/super_checks.py +++ b/tests/functional/s/super/super_checks.py @@ -1,4 +1,4 @@ -# pylint: disable=too-few-public-methods,import-error, no-absolute-import,missing-docstring, useless-object-inheritance +# pylint: disable=too-few-public-methods,import-error, missing-docstring, useless-object-inheritance # pylint: disable=useless-super-delegation,wrong-import-position,invalid-name, wrong-import-order # pylint: disable=super-with-arguments from unknown import Missing diff --git a/tests/functional/u/unpacking_non_sequence.py b/tests/functional/u/unpacking_non_sequence.py index c681641cab..b7ea2189c6 100644 --- a/tests/functional/u/unpacking_non_sequence.py +++ b/tests/functional/u/unpacking_non_sequence.py @@ -1,6 +1,6 @@ """Check unpacking non-sequences in assignments. """ -# pylint: disable=too-few-public-methods, invalid-name, attribute-defined-outside-init, unused-variable, no-absolute-import +# pylint: disable=too-few-public-methods, invalid-name, attribute-defined-outside-init, unused-variable # pylint: disable=using-constant-test, no-init, missing-docstring, wrong-import-order,wrong-import-position,no-else-return, useless-object-inheritance from os import rename as nonseq_func from functional.u.unpacking import nonseq diff --git a/tests/functional/u/unused/unused_argument.py b/tests/functional/u/unused/unused_argument.py index c5f534259d..a3fd4e6abc 100644 --- a/tests/functional/u/unused/unused_argument.py +++ b/tests/functional/u/unused/unused_argument.py @@ -47,7 +47,7 @@ def metadata_from_dict(key): """ return {key: str(value) for key, value in key.items()} -# pylint: disable=too-few-public-methods, print-statement, misplaced-future,wrong-import-position +# pylint: disable=too-few-public-methods, misplaced-future,wrong-import-position from __future__ import print_function diff --git a/tests/functional/u/unused/unused_import.py b/tests/functional/u/unused/unused_import.py index c6c2f20be2..3bf17c6c98 100644 --- a/tests/functional/u/unused/unused_import.py +++ b/tests/functional/u/unused/unused_import.py @@ -1,5 +1,5 @@ """unused import""" -# pylint: disable=undefined-all-variable, import-error, no-absolute-import, too-few-public-methods, missing-docstring,wrong-import-position, useless-object-inheritance, multiple-imports +# pylint: disable=undefined-all-variable, import-error, too-few-public-methods, missing-docstring,wrong-import-position, useless-object-inheritance, multiple-imports import xml.etree # [unused-import] import xml.sax # [unused-import] import os.path as test # [unused-import] diff --git a/tests/functional/u/unused/unused_name_from_wilcard_import.py b/tests/functional/u/unused/unused_name_from_wilcard_import.py index 56f5b600ee..292d40f95c 100644 --- a/tests/functional/u/unused/unused_name_from_wilcard_import.py +++ b/tests/functional/u/unused/unused_name_from_wilcard_import.py @@ -1,3 +1,3 @@ """check unused import from a wildcard import""" -# pylint: disable=no-absolute-import,line-too-long +# pylint: disable=line-too-long from .unused_argument_py3 import * # [unused-wildcard-import, unused-wildcard-import, wildcard-import] diff --git a/tests/functional/w/wildcard_import.py b/tests/functional/w/wildcard_import.py index 66ae63d9eb..4034162e0f 100644 --- a/tests/functional/w/wildcard_import.py +++ b/tests/functional/w/wildcard_import.py @@ -1,4 +1,4 @@ -# pylint: disable=no-absolute-import,missing-docstring,import-error,unused-wildcard-import +# pylint: disable=missing-docstring,import-error,unused-wildcard-import from indirect1 import * # [wildcard-import] # This is an unresolved import which still generates the wildcard-import # warning. diff --git a/tests/input/func_3k_removed_stuff_py_30.py b/tests/input/func_3k_removed_stuff_py_30.py index 54ad935bc1..d844c56031 100644 --- a/tests/input/func_3k_removed_stuff_py_30.py +++ b/tests/input/func_3k_removed_stuff_py_30.py @@ -1,5 +1,5 @@ """test relative import""" -# pylint: disable=no-absolute-import + from __future__ import print_function import func_w0401 __revision__ = filter(None, map(str, (1, 2, 3))) diff --git a/tests/input/func_w0332_py_30.py b/tests/input/func_w0332_py_30.py deleted file mode 100644 index 6a38e8c0d3..0000000000 --- a/tests/input/func_w0332_py_30.py +++ /dev/null @@ -1,4 +0,0 @@ -"""check use of l as long int marker -""" -# pylint: disable=long-suffix -__revision__ = 1l diff --git a/tests/input/func_w0401.py b/tests/input/func_w0401.py index 12227bc9a7..f8fae2447e 100644 --- a/tests/input/func_w0401.py +++ b/tests/input/func_w0401.py @@ -1,6 +1,6 @@ """test cyclic import """ -# pylint: disable=no-absolute-import + from __future__ import print_function from . import w0401_cycle diff --git a/tests/input/func_w0401_disabled.py b/tests/input/func_w0401_disabled.py index 966706cafe..955188f080 100644 --- a/tests/input/func_w0401_disabled.py +++ b/tests/input/func_w0401_disabled.py @@ -1,6 +1,6 @@ """test cyclic import """ -# pylint: disable=no-absolute-import + from __future__ import print_function from . import w0401_cycle # pylint: disable=cyclic-import diff --git a/tests/input/func_w0401_disabled_in_func.py b/tests/input/func_w0401_disabled_in_func.py index 69f266863f..c0013d8315 100644 --- a/tests/input/func_w0401_disabled_in_func.py +++ b/tests/input/func_w0401_disabled_in_func.py @@ -1,6 +1,6 @@ """Test disabling of cyclic import check inside a function """ -# pylint: disable=no-absolute-import,import-outside-toplevel +# pylint: disable=import-outside-toplevel from __future__ import print_function diff --git a/tests/input/func_w0401_package/all_the_things.py b/tests/input/func_w0401_package/all_the_things.py index b8bd47b9e2..64556e1be3 100644 --- a/tests/input/func_w0401_package/all_the_things.py +++ b/tests/input/func_w0401_package/all_the_things.py @@ -1,5 +1,5 @@ """All the things!""" -# pylint: disable=no-absolute-import + from .thing1 import THING1 from .thing2 import THING2 from .thing2 import THING1_PLUS_THING2 diff --git a/tests/input/func_w0401_package/thing2.py b/tests/input/func_w0401_package/thing2.py index 80bec1dd86..d7a0f22391 100644 --- a/tests/input/func_w0401_package/thing2.py +++ b/tests/input/func_w0401_package/thing2.py @@ -1,5 +1,5 @@ """The second thing.""" -# pylint: disable=no-absolute-import + from .all_the_things import THING1 __revision__ = None diff --git a/tests/input/no_absolute_import.py b/tests/input/no_absolute_import.py deleted file mode 100644 index 69059417f1..0000000000 --- a/tests/input/no_absolute_import.py +++ /dev/null @@ -1,5 +0,0 @@ -""" Puts issue #2672 under test (-j 1 vs -j N) - -Here we use a simple file to ensure configs are treated exactly the same way in -j 1 and --j N """ -import os # pylint: disable=unused-import diff --git a/tests/input/w0401_cycle.py b/tests/input/w0401_cycle.py index ddb42557ec..37be7c562b 100644 --- a/tests/input/w0401_cycle.py +++ b/tests/input/w0401_cycle.py @@ -1,6 +1,6 @@ """w0401 dependency """ -# pylint: disable=print-statement, no-absolute-import + from __future__ import print_function from . import func_w0401 diff --git a/tests/lint/unittest_lint.py b/tests/lint/unittest_lint.py index fee47c9cf0..110a2061cd 100644 --- a/tests/lint/unittest_lint.py +++ b/tests/lint/unittest_lint.py @@ -575,15 +575,6 @@ def test_analyze_explicit_script(linter): assert ["C: 2: Line too long (175/100)"] == linter.reporter.messages -def test_python3_checker_disabled(linter): - checker_names = [c.name for c in linter.prepare_checkers()] - assert "python3" not in checker_names - - linter.set_option("enable", "python3") - checker_names = [c.name for c in linter.prepare_checkers()] - assert "python3" in checker_names - - def test_full_documentation(linter): out = StringIO() linter.print_full_documentation(out) @@ -592,9 +583,9 @@ def test_full_documentation(linter): for re_str in ( # autogenerated text "^Pylint global options and switches$", - "Verbatim name of the checker is ``python3``", + "Verbatim name of the checker is ``variables``", # messages - "^:old-octal-literal \\(E1608\\):", + "^:undefined-loop-variable \\(W0631\\): *", # options "^:dummy-variables-rgx:", ): diff --git a/tests/regrtest_data/func_block_disable_msg.py b/tests/regrtest_data/func_block_disable_msg.py index 36198db2b6..8a94ab4f3a 100644 --- a/tests/regrtest_data/func_block_disable_msg.py +++ b/tests/regrtest_data/func_block_disable_msg.py @@ -1,4 +1,4 @@ -# pylint: disable=C0302,bare-except,print-statement, useless-object-inheritance +# pylint: disable=C0302,bare-except, useless-object-inheritance """pylint option block-disable""" from __future__ import print_function diff --git a/tests/regrtest_data/py3k-disabled.rc b/tests/regrtest_data/py3k-disabled.rc deleted file mode 100644 index 41d7757781..0000000000 --- a/tests/regrtest_data/py3k-disabled.rc +++ /dev/null @@ -1,2 +0,0 @@ -[MESSAGES CONTROL] -disable=no-absolute-import diff --git a/tests/regrtest_data/py3k_error_flag.py b/tests/regrtest_data/py3k_error_flag.py deleted file mode 100644 index 6bead4102f..0000000000 --- a/tests/regrtest_data/py3k_error_flag.py +++ /dev/null @@ -1,11 +0,0 @@ -"""Contains both normal error messages and Python3 porting error messages.""" -# pylint: disable=too-few-public-methods - -raise Exception, 1 # Error emitted here with the Python 3 checker. - - -class Test(object): - """dummy""" - - def __init__(self): - return 42 diff --git a/tests/regrtest_data/py3k_errors_and_warnings.py b/tests/regrtest_data/py3k_errors_and_warnings.py deleted file mode 100644 index 3d033e86c9..0000000000 --- a/tests/regrtest_data/py3k_errors_and_warnings.py +++ /dev/null @@ -1,19 +0,0 @@ -"""Contains both normal error messages and Python3 porting error messages.""" -# pylint: disable=too-few-public-methods - -# error: import missing `from __future__ import absolute_import` -import sys - -# error: Use raise ErrorClass(args) instead of raise ErrorClass, args. -raise Exception, 1 - -class Test(object): - """dummy""" - - def __init__(self): - # warning: Calling a dict.iter*() method - {1: 2}.iteritems() - return 42 - -# error: print statement used -print 'not in python3' diff --git a/tests/test_self.py b/tests/test_self.py index 519899021c..2bf635176c 100644 --- a/tests/test_self.py +++ b/tests/test_self.py @@ -290,32 +290,9 @@ def test_parallel_execution(self): in out.getvalue().strip() ) - def test_parallel_execution_bug_2674(self): - """Tests that disabling absolute imports works the same in -j1/j2""" - expected_ret_code = 0 # we are disabling the check, should pass - for jobs in (1, 2): - self._runtest( - [ - "--py3k", - "--disable=no-absolute-import", - f"-j {int(jobs)}", - join(HERE, "input", "no_absolute_import.py"), - ], - code=expected_ret_code, - ) - def test_parallel_execution_missing_arguments(self): self._runtest(["-j 2", "not_here", "not_here_too"], code=1) - def test_py3k_option(self): - # Test that --py3k flag works. - rc_code = 0 - self._runtest([UNNECESSARY_LAMBDA, "--py3k"], code=rc_code) - - def test_py3k_jobs_option(self): - rc_code = 0 - self._runtest([UNNECESSARY_LAMBDA, "--py3k", "-j 2"], code=rc_code) - def test_abbreviations_are_not_supported(self): expected = "no such option: --load-plugin" self._test_output([".", "--load-plugin"], expected_output=expected)