pylint-1.8.3/0000755000076500000240000000000013253004374013614 5ustar claudiustaff00000000000000pylint-1.8.3/bin/0000755000076500000240000000000013253004373014363 5ustar claudiustaff00000000000000pylint-1.8.3/bin/epylint0000755000076500000240000000007713224376051016004 0ustar claudiustaff00000000000000#!/usr/bin/env python from pylint import epylint epylint.Run() pylint-1.8.3/bin/epylint.bat0000644000076500000240000000027713224376051016550 0ustar claudiustaff00000000000000@echo off rem Use python to execute the python script having the same name as this batch rem file, but without any extension, located in the same directory as this rem batch file "%~dpn0" %* pylint-1.8.3/bin/pylint0000755000076500000240000000010113224376051015623 0ustar claudiustaff00000000000000#!/usr/bin/env python from pylint import run_pylint run_pylint() pylint-1.8.3/bin/pylint.bat0000644000076500000240000000030413224376051016372 0ustar claudiustaff00000000000000@echo off rem Use python to execute the python script having the same name as this batch rem file, but without any extension, located in the same directory as this rem batch file "%~dpn0" %* pylint-1.8.3/bin/pyreverse0000755000076500000240000000010713224376051016336 0ustar claudiustaff00000000000000#!/usr/bin/env python from pylint import run_pyreverse run_pyreverse() pylint-1.8.3/bin/pyreverse.bat0000644000076500000240000000027713224376051017110 0ustar claudiustaff00000000000000@echo off rem Use python to execute the python script having the same name as this batch rem file, but without any extension, located in the same directory as this rem batch file "%~dpn0" %* pylint-1.8.3/bin/symilar0000755000076500000240000000010313224376051015766 0ustar claudiustaff00000000000000#!/usr/bin/env python from pylint import run_symilar run_symilar() pylint-1.8.3/bin/symilar.bat0000644000076500000240000000030413224376051016533 0ustar claudiustaff00000000000000@echo off rem Use python to execute the python script having the same name as this batch rem file, but without any extension, located in the same directory as this rem batch file "%~dpn0" %* pylint-1.8.3/ChangeLog0000644000076500000240000033537013253004246015377 0ustar claudiustaff00000000000000------------------ Pylint's ChangeLog ------------------ What's New in Pylint 1.8.3? ========================== Release date: 2018-03-16 * Fix false positive ``inconsistent-return-statements`` message when a function is defined under an if statement. Close #1794 * Exempt `__doc__` from triggering a `redefined-builtin` `__doc__` can be used to specify a docstring for a module without passing it as a first-statement string. * Don't crash on invalid strings when checking for `logging-format-interpolation` Close #1944 * Fix false positive ``inconsistent-return-statements`` message by avoiding useless exception inference if the exception is not handled. Close #1794 (second part) * Fix false positive undefined-variable for lambda argument in class definitions Close #1824 * Fix false-positive ``undefined-variable`` for generated comprehension variables in function default arguments Close #1897 What's New in Pylint 1.8.2? ========================== Release date: 2018-01-23 * Fixed a crash which occurred when `Uninferable` wasn't properly handled in `stop-iteration-return` Close #1779 * Use the proper node to get the name for redefined functions (#1792) Close #1774 * Don't crash when encountering bare raises while checking inconsistent returns Close #1773 * Fix a false positive ``inconsistent-return-statements`` message when if statement is inside try/except. Close #1770 * Fix a false positive ``inconsistent-return-statements`` message when while loop are used. Close #1772 * Fix ``unused-argument`` false positives with overshadowed variable in dictionary comprehension. Close #1731 * Fix false positive ``inconsistent-return-statements`` message when never returning functions are used (i.e sys.exit for example). Close #1771 * Fix error when checking if function is exception, as in ``bad-exception-context``. What's New in Pylint 1.8.1? =========================== Release date: 2017-12-15 * Wrong version number in __pkginfo__. What's New in Pylint 1.8? ========================= Release date: 2017-12-15 * Respect disable=... in config file when running with --py3k. * New warning `shallow-copy-environ` added Shallow copy of os.environ doesn't work as people may expect. os.environ is not a dict object but rather a proxy object, so any changes made on copy may have unexpected effects on os.environ Instead of copy.copy(os.environ) method os.environ.copy() should be used. See https://bugs.python.org/issue15373 for details. Close #1301 * Do not display no-absolute-import warning multiple times per file. * `trailing-comma-tuple` refactor check now extends to assignment with more than one element (such as lists) Close #1713 * Fixing u'' string in superfluous-parens message Close #1420 * `abstract-class-instantiated` is now emitted for all inference paths. Close #1673 * Add set of predefined naming style to ease configuration of checking naming conventions. Closes #1013 * Added a new check, ``keyword-arg-before-vararg`` This is emitted for function definitions in which keyword arguments are placed before variable positional arguments (*args). This may lead to args list getting modified if keyword argument's value is not provided in the function call assuming it will take default value provided in the definition. * The `invalid-name` check contains the name of the template that caused the failure Close #1176 * Using the -j flag won't start more child linters than needed. Contributed by Roman Ivanov in #1614 * Fix a false positive with bad-python3-import on relative imports Close #1608 * Added a new Python 3 check, ``non-ascii-bytes-literals`` Close #1545 * Added a couple of new Python 3 checks for accessing dict methods in non-iterable context * Protocol checks (not-a-mapping, not-an-iterable and co.) aren't emitted on classes with dynamic getattr * Added a new warning, 'bad-thread-instantiation' This message is emitted when the threading.Thread class does not receive the target argument, but receives just one argument, which is by default the group parameter. Close #1327 * In non-quiet mode, absolute path of used config file is logged to standard error. Close #1519 * Raise meaningful exception for invalid reporter class being selected When unknown reporter class will be selected as Pylint reporter, meaningful error message would be raised instead of bare ``ImportError`` or ``AttribueError`` related to module or reporter class being not found. Close #1388 * Added a new Python 3 check for accessing removed functions from itertools like ``izip`` or ``ifilterfalse`` * Added a new Python 3 check for accessing removed fields from the types module like ``UnicodeType`` or ``XRangeType`` * Added a new Python 3 check for declaring a method ``next`` that would have been treated as an iterator in Python 2 but a normal function in Python 3. * Added a new key-value pair in json output. The key is ``message-id`` and the value is the message id. Close #1512 * Added a new Python 3.0 check for raising a StopIteration inside a generator. The check about raising a StopIteration inside a generator is also valid if the exception raised inherit from StopIteration. Close #1385 * Added a new warning, ``raising-format-tuple``, to detect multi-argument exception construction instead of message string formatting. * Added a new check for method of logging module that concatenate string via + operator Close #1479 * Added parameter for limiting number of suggestions in spellchecking checkers * Fix a corner-case in ``consider-using-ternary`` checker. When object ``A`` used in ``X and A or B`` was falsy in boolean context, Pylint incorrectly emitted non-equivalent ternary-based suggestion. After a change message is correctly not emitted for this case. Close #1559 * Added ``suggestion-mode`` configuration flag. When flag is enabled, informational message is emitted instead of cryptic error message for attributes accessed on c-extensions. Close #1466 * Fix a false positive ``useless-super-delegation`` message when parameters default values are different from those used in the base class. Close #1085 * Disabling 'wrong-import-order', 'wrong-import-position', or 'ungrouped-imports' for a single line now prevents that line from triggering violations on subsequent lines. Close #1336 * Added a new Python check for inconsistent return statements inside method or function. Close #1267 * Fix ``superfluous-parens`` false positive related to handling logical statements involving ``in`` operator. Close #574 * ``function-redefined`` message is no longer emitted for functions and methods which names matches dummy variable name regular expression. Close #1369 * Fix ``missing-param-doc`` and ``missing-type-doc`` false positives when mixing ``Args`` and ``Keyword Args`` in Google docstring. Close #1409 * Fix ``missing-docstring`` false negatives when modules, classes, or methods consist of compound statements that exceed the ``docstring-min-length`` * Fix ``useless-else-on-loop`` false positives when break statements are deeply nested inside loop. Close #1661 * Fix no ``wrong-import-order`` message emitted on ordering of first and third party libraries. With this fix, pylint distinguishes third and first party modules when checking import order. Close #1702 * Fix ``pylint disable=fixme`` directives ignored for comments following the last statement in a file. Close #1681 * Fix ``line-too-long`` message deactivated by wrong disable directive. The directive ``disable=fixme`` doesn't deactivate anymore the emission of ``line-too-long`` message for long commented lines. Close #1741 * If the rcfile specified on the command line doesn't exist, then an IOError exception is raised. Close #1747 What's New in Pylint 1.7.1? ========================= Release date: 2017-04-17 * Fix a false positive which occurred when an exception was reraised Close #1419 * Fix a false positive of ``disallow-trailing-tuple`` The check was improved by verifying for non-terminating newlines, which should exempt function calls and function definitions from the check Close #1424 What's New in Pylint 1.7? ========================= Release date: 2017-04-13 * Don't emit missing-final-newline or trailing-whitespace for formfeeds (page breaks). Close #1218 and #1219 * Don't emit by default no-member if we have opaque inference objects in the inference results This is controlled through the new flag ignore-on-opaque-inference, which is by default True. The inference can return multiple potential results while evaluating a Python object, but some branches might not be evaluated, which results in partial inference. In that case, it might be useful to still emit no-member and other checks for the rest of the inferred objects. * Added new message `assign-to-new-keyword` to warn about assigning to names which will become a keyword in future Python releases. Close #1351 * Split the 'missing or differing' in parameter documentation in different error. 'differing-param-doc' covers the differing part of the old 'missing-param-doc', and 'differing-type-doc' covers the differing part of the old 'missing-type-doc' Close #1342 * Added a new error, 'used-prior-global-declaration', which is emitted when a name is used prior a global declaration in a function. This causes a SyntaxError in Python 3.6 Close #1257 * The protocol checks are emitting their messages when a special method is set to None. Close #1263 * Properly detect if imported name is assigned to same name in different scope. Close #636, #848, #851, and #900 * Require one space for annotations with type hints, as per PEP 8. * 'trailing-comma-tuple' check was added This message is emitted when pylint finds an one-element tuple, created by a stray comma. This can suggest a potential problem in the code and it is recommended to use parantheses in order to emphasise the creation of a tuple, rather than relying on the comma itself. * Don't emit not-callable for instances with unknown bases. Close #1213 * Treat keyword only arguments the same as positional arguments with regard to unused-argument check * Don't try to access variables defined in a separate scope when checking for ``protected-access`` * Added new check to detect incorrect usage of len(SEQUENCE) inside test conditions. * Added new extension to detect comparisons against empty string constants * Added new extension to detect comparisons of integers against zero * Added new error conditions for 'bad-super-call' Now detects ``super(type(self), self)`` and ``super(self.__class__, self)`` which can lead to recursion loop in derived classes. * PyLinter.should_analyze_file has a new optional parameter, called `is_argument` Close #1079 * Add attribute hints for missing members Closes #1035 * Add a new warning, 'redefined-argument-from-local' Closes #649 * Support inline comments for comma separated values in the config file Closes #1024 * epylint.py_run's *script* parameter was removed. * epylint.py_run now uses ``shell=False`` for running the underlying process. Closes #441 * Added a new warning, 'useless-super-delegation' Close 839. * Added a new error, 'invalid-metaclass', raised when we can detect that a class is using an improper metaclass. Close #579 * Added a new refactoring message, 'literal-comparison'. Close #786 * arguments-differ takes in consideration kwonlyargs and variadics Close #983 * Removed --optimized-ast. Part of #975. * Removed --files-output option. Part of #975. * Removed pylint-gui from the package. * Removed the HTML reporter. Part of #975. * ignored-argument-names is now used for ignoring arguments for unused-variable check. This option was used for ignoring arguments when computing the correct number of arguments a function should have, but for handling the arguments with regard to unused-variable check, dummy-variables-rgx was used instead. Now, ignored-argument-names is used for its original purpose and also for ignoring the matched arguments for the unused-variable check. This offers a better control of what should be ignored and how. Also, the same option was moved from the design checker to the variables checker, which means that the option now appears under the ``[VARIABLES]`` section inside the configuration file. Close #862. * Fix a false positive for keyword variadics with regard to keyword only arguments. If a keyword only argument was necessary for a function, but that function was called with keyword variadics (**kwargs), then we were emitting a missing-kwoa false positive, which is now fixed. Close #934. * Fix some false positives with unknown sized variadics. Close #878 * Added a new extension, check_docstring, for checking PEP 257 conventions. Closes #868. * config files with BOM markers can now be read. Close #864. * epylint.py_run does not crash on big files, using .communicate() instead of .wait() Close #599 * Disable reports by default and show the evaluation score by default As per discussion from issue #746, the reports were disabled by default in order to simplify the interaction between the tool and the users. The score is still shown by default, as a way of closely measuring when it increases or decreases due to changes brought to the code. * Disable the information category messages by default. This is a step towards making pylint more sane, as per the discussion from issue #746. * Catch more cases as not proper iterables for __slots__ with regard to invalid-slots pattern. Closes issue #775. * empty indent strings are rejected. * Added a new error, 'relative-beyond-top-level', which is emitted when a relative import was attempted beyond the top level package. Closes issue #588. * Added a new warning, 'unsupported-assignment-operation', which is emitted when item assignment is tried on an object which doesn't have this ability. Closes issue #591. * Added a new warning, 'unsupported-delete-operation', which is emitted when item deletion is tried on an object which doesn't have this ability. Closes issue #592. * Fix a false positive of 'redundant-returns-doc', occurred when the documented function was using *yield* instead of *return*. Closes issue #984. * Fix false positives of 'missing-[raises|params|type]-doc' due to not recognizing keyword synonyms supported by Sphinx. * Added a new refactoring message, 'consider-merging-isinstance', which is emitted whenever we can detect that consecutive isinstance calls can be merged together. Closes issue #968 * Fix a false positive of 'missing-param-doc' and 'missing-type-doc', occurred when a class docstring uses the 'For the parameters, see' magic string but the class __init__ docstring does not, or vice versa. * `redefined-outer-name` is now also emitted when a nested loop's target variable is the same as a target variable in an outer loop. Closes issue #911. * Added proper exception type inference for 'missing-raises-doc'. * Added InvalidMessageError exception class to replace asserts in pylint.utils. * More thorough validation in MessagesStore.register_messages() to avoid one message accidentally overwriting another. * InvalidMessageError, UnknownMessage, and EmptyReport exceptions are moved to the new pylint.exceptions submodule. * UnknownMessage and EmptyReport are renamed to UnknownMessageError and EmptyReportError. * Warnings 'missing-returns-type-doc' and 'missing-yields-type-doc' have each been split into two warnings - 'missing-[return|yield]-doc' and 'missing-[return|yield]-type-doc'. * Added epytext support to docparams extension. Closes #1029. * Support having plugins with the same name and with options defined Closes #1018 * Sort configuration options in a section Closes #1087 * Added a new Python 3 warning around implementing '__div__', '__idiv__', or '__rdiv__' as those methods are phased out in Python 3. * Added a new warning, 'overlapping-except', which is emitted when two exceptions in the same except-clause are aliases for each other or one exceptions is an ancestor of another. * Avoid crashing on ill-formatted strings when checking for string formatting errors. * Added a new Python 3 warning for calling 'str.encode' or 'str.decode' with a non-text encoding. * Added new coding convention message, 'single-string-used-for-slots'. Closes #1166 * Added a new Python 3 check for accessing 'sys.maxint' which was removed in Python 3 in favor of 'sys.maxsize' * Added a new Python 3 check for bad imports. * Added a new Python 3 check for accessing deprecated string functions. * Do not warn about unused arguments or function being redefined in singledispatch registered implementations. Closes #1032 and #1034 * Added refactoring message 'no-else-return'. * Improve unused-variable checker to warn about unused variables in module scope. Closes #919 * Ignore modules import as _ when checking for unused imports. Closes #1190 * Improve handing of Python 3 classes with metaclasses declared in nested scopes. Closes #1177 * Added refactoring message 'consider-using-ternary'. Closes #1204 * Bug-fix for false-positive logging-format-interpolation` when format specifications are used in formatted string. Fixes #572 * Added a new switch ``single-line-class-stmt`` to allow single-line declaration of empty class bodies. Closes #738 * Protected access in form `type(self)._attribute` are now allowed. Fixes #1031 * Let the user modify msg-template when Pylint is called from a Python script Fixes #1269 * Imports checker supports new switch ``allow-wildcard-with-all`` which disables warning on wildcard import when imported module defines `__all__` variable. Fixes #831 * `too-many-format-args` and `too-few-format-args` are emitted correctly when starred expression are used in RHS tuple. Fixes #957 * `cyclic-import` checker supports local disable clauses. When one of cycle imports was done in scope where disable clause was active, cycle is not reported as violation. Fixes #59 What's new in Pylint 1.6.3? =========================== Release date: 2016-07-18 * Do not crash when inferring uninferable exception types for docparams extension Close #998 What's new in Pylint 1.6.2? =========================== Release date: TBA * Do not crash when printing the help of options with default regular expressions Close #990 * More granular versions for deprecated modules. Close #991 What's new in Pylint 1.6.1? =========================== Release date: 2016-07-07 * Use environment markers for supporting conditional dependencies. What's New in Pylint 1.6.0? =========================== Release date: 2016-07-03 * Added a new extension, `pylint.extensions.mccabe`, for warning about complexity in code. * Deprecate support for --optimize-ast. Part of #975. * Deprecate support for the HTML output. Part of #975. * Deprecate support for --output-files. Part of #975. * Fixed a documentation error for the check_docs extension. Fixes #735. * Made the list of property-defining decorators configurable. * Fix a bug where the top name of a qualified import was detected as unused variable. Close #923. * bad-builtin is now an extension check. * generated-members support qualified name through regular expressions. For instance, one can specify a regular expression as --generated-members=astroid.node_classes.* for ignoring every no-member error that is accessed as in `astroid.node_classes.missing.object`. * Add the ability to ignore files based on regex matching, with the new ``--ignore-patterns`` option. This addresses issue #156 by allowing for multiple ignore patterns to be specified. Rather than clobber the existing ignore option, we introduced a new one called ignore-patterns. * Added a new error, 'trailing-newlines', which is emitted when a file has trailing new lines. Closes issue #682. * Add a new option, 'redefining-builtins-modules', for controlling the modules which can redefine builtins, such as six.moves and future.builtins. Close #464. * 'reimported' is emitted when the same name is imported from different module. Close #162. * Add a new recommendation checker, 'consider-iterating-dictionary', which is emitted which is emitted when a dictionary is iterated through .keys(). Close #699 * Use the configparser backport for Python 2 This fixes a problem we were having with comments inside values, which is fixed in Python 3's configparser. Close #828 * A new error was added, 'invalid-length-returned', when the `__len__` special method returned something else than a non-negative number. Close issue #557 * Switch to using isort internally for wrong-import-order. Closes #879. * check_docs extension can find constructor parameters in __init__. Closes #887. * Don't warn about invalid-sequence-index if the indexed object has unknown base classes. Closes #867 * Don't crash when checking, for super-init-not-called, a method defined in an if block. * Do not emit import-error or no-name-in-module for fallback import blocks by default. Until now, we warned with these errors when a fallback import block (a TryExcept block that contained imports for Python 2 and 3) was found, but this gets cumbersome when trying to write compatible code. As such, we don't check these blocks by default, but the analysis can be enforced by using the new ``--analyse-fallback-block`` flag. Close #769. What's New in Pylint 1.5.5? =========================== Release date: 2016-03-21 * Let visit_importfrom from Python 3 porting checker be called when everything is disabled Because the visit method was filtering the patterns it was expecting to be activated, it didn't run when everything but one pattern was disabled, leading to spurious false positives Close #852 * Don't emit unsubscriptable-value for classes with unknown base classes. Close #776. * Use an OrderedDict for storing the configuration elements This fixes an issue related to impredictible order of the disable / enable elements from a config file. In certain cases, the disable was coming before the enable which resulted in classes of errors to be enabled, even though the intention was to disable them. The best example for this was in the context of running multiple processes, each one of it having different enables / disables that affected the output. Close #815 * Don't consider bare and broad except handlers as ignoring NameError, AttributeError and similar exceptions, in the context of checkers for these issues. Closes issue #826 What's New in Pylint 1.5.4? =========================== Release date: 2016-01-15 * Merge StringMethodChecker with StringFormatChecker. This fixes a bug where disabling all the messages and enabling only a handful of messages from the StringFormatChecker would have resulted in no messages at all. * Don't apply unneeded-not over sets. What's New in Pylint 1.5.3? =========================== Release date: 2016-01-11 * Handle the import fallback idiom with regard to wrong-import-order. Closes issue #750. * Decouple the displaying of reports from the displaying of messages Some reporters are aggregating the messages instead of displaying them when they are available. The actual displaying was conflatted in the generate_reports. Unfortunately this behaviour was flaky and in the case of the JSON reporter, the messages weren't shown at all if a file had syntax errors or if it was missing. In order to fix this, the aggregated messages can now be displayed with Reporter.display_message, while the reports are displayed with display_reports. Closes issues #766 and #765. * Ignore function calls with variadic arguments without a context. Inferring variadic positional arguments and keyword arguments will result into empty Tuples and Dicts, which can lead in some cases to false positives with regard to no-value-for-parameter. In order to avoid this, until we'll have support for call context propagation, we're ignoring such cases if detected. Closes issue #722. * Treat AsyncFunctionDef just like FunctionDef nodes, by implementing visit_asyncfunctiondef in terms of visit_functiondef. Closes issue #767. * Take in account kwonlyargs when verifying that arguments are defined with the check_docs extension. Closes issue #745. * Suppress reporting 'unneeded-not' inside `__ne__` methods Closes issue #749. What's New in Pylint 1.5.2? =========================== Release date: 2015-12-21 * Don't crash if graphviz is not installed, instead emit a warning letting the user to know. Closes issue #168. * Accept only functions and methods for the deprecated-method checker. This prevents a crash which can occur when an object doesn't have .qname() method after the inference. * Don't emit super-on-old-class on classes with unknown bases. Closes issue #721. * Allow statements in `if` or `try` blocks containing imports. Closes issue #714. What's New in Pylint 1.5.1? =========================== Release date: 2015-12-02 * Fix a crash which occurred when old visit methods are encountered in plugin modules. Closes issue #711. * Add wrong-import-position to check_messages's decorator arguments for ImportChecker.leave_module This fixes an esoteric bug which occurs when ungrouped-imports and wrong-import-order are disabled and pylint is executed on multiple files. What happens is that without wrong-import-position in check_messages, leave_module will never be called, which means that the first non-import node from other files might leak into the current file, leading to wrong-import-position being emitted by pylint. * Fix a crash which occurred when old visit methods are encountered in plugin modules. Closes issue #711. * Don't emit import-self and cyclic-import for relative imports of modules with the same name as the package itself. Closes issues #708 and #706. What's New in Pylint 1.5.0? =========================== Release date: 2015-11-29 * Added multiple warnings related to imports. 'wrong-import-order' is emitted when PEP 8 recommendations regarding imports are not respected (that is, standard imports should be followed by third-party imports and then by local imports). 'ungrouped-imports' is emitted when imports from the same package or module are not placed together, but scattered around in the code. 'wrong-import-position' is emitted when code is mixed with imports, being recommended for the latter to be at the top of the file, in order to figure out easier by a human reader what dependencies a module has. Closes issue #692. * Added a new refactoring warning, 'unneeded-not', emitted when an expression with the not operator could be simplified. Closes issue #670. * Added a new refactoring warning, 'simplifiable-if-statement', used when an if statement could be reduced to a boolean evaluation of its test. Closes issue #698. * Added a new refactoring warning, 'too-many-boolean-expressions', used when an if statement contains too many boolean expressions, which makes the code less maintainable and harder to understand. Closes issue #677. * Property methods are shown as attributes instead of functions in pyreverse class diagrams. Closes Issue #284 * Add a new refactoring error, 'too-many-nested-blocks', which is emitted when a function or a method has too many nested blocks, which makes the code less readable and harder to understand. Closes issue #668. * Add a new error, 'unsubscriptable-object', that is emitted when value used in subscription expression doesn't support subscription (i.e. doesn't define __getitem__ method). * Don't warn about abstract classes instantiated in their own body. Closes issue #627. * Obsolete options are not present by default in the generated configuration file. Closes issue #632. * non-iterator-returned can detect classes with iterator-metaclasses. Closes issue #679. * Add a new error, 'unsupported-membership-test', emitted when value to the right of the 'in' operator doesn't support membership test protocol (i.e. doesn't define __contains__/__iter__/__getitem__) * Add new errors, 'not-an-iterable', emitted when non-iterable value is used in an iterating context (starargs, for-statement, comprehensions, etc), and 'not-a-mapping', emitted when non-mapping value is used in a mapping context. Closes issue #563. * Make 'no-self-use' checker not emit a warning if there is a 'super()' call inside the method. Closes issue #667. * Add checker to identify multiple imports on one line. Closes issue #598. * Fix unused-argument false positive when the "+=" operator is used. Closes issue #518. * Don't emit import-error for ignored modules. PyLint will not emit import errors for any import which is, or is a subpackage of, a module in the ignored-modules list. Closes issue #223. * Fix unused-import false positive when the import is used in a class assignment. Closes issue #475 * Add a new error, 'not-context-manager', emitted when something that doesn't implement __enter__ and __exit__ is used in a with statement. * Add a new warning, 'confusing-with-statement', emitted by the base checker, when an ambiguous looking with statement is used. For example `with open() as first, second` which looks like a tuple assignment but is actually 2 context managers. * Add a new warning, 'duplicate-except', emitted when there is an exception handler which handles an exception type that was handled before. Closes issue #485. * A couple of warnings got promoted to errors, since they could uncover potential bugs in the code. These warnings are: assignment-from-none, unbalanced-tuple-unpacking, unpacking-non-sequence, non-iterator-returned. Closes issue #388. * Allow ending a pragma control with a semicolon. In this way, users can continue a pragma control with a reason for why it is used, as in `# pylint: disable=old-style-class;reason=...`. Closes issue #449. * --jobs can be used with --load-plugins now. Closes issue #456. * Improve the performance of --jobs when dealing only with a package name. Closes issue #479. * Don't emit an unused-wildcard-import when the imported name comes from another module and it is in fact a __future__ name. * The colorized reporter now works on Windows. Closes issue #96. * Remove pointless-except warning. It was previously disabled by default and it wasn't very useful. Closes issue #506. * Fix a crash on Python 3 related to the string checker, which crashed when it encountered a bytes string with a .format method called. * Don't warn about no-self-use for builtin properties. * Fix a false positive for bad-reversed-sequence, when a subclass of a `dict` provides a __reversed__ method. * Change the default no-docstring-rgx so missing-docstring isn't emitted for private functions. * Don't emit redefined-outer-name for __future__ directives. Closes issue #520. * Provide some hints for the bad-builtin message. Closes issue #522. * When checking for invalid arguments to a callable, in typecheck.py, look up for the __init__ in case the found __new__ comes from builtins. Since the __new__ comes from builtins, it will not have attached any information regarding what parameters it expects, so the check will be useless. Retrieving __init__ in that case will at least detect a couple of false negatives. Closes issue #429. * Don't emit no-member for classes with unknown bases. Since we don't know what those bases might add, we simply ignore the error in this case. * Lookup in the implicit metaclass when checking for no-member, if the class in question has an implicit metaclass, which is True for new style classes. Closes issue #438. * Add two new warnings, duplicate-bases and inconsistent-mro. duplicate-bases is emitted when a class has the same bases listed more than once in its bases definition, while inconsistent-mro is emitted when no sane mro hierarchy can be determined. Closes issue #526. * Remove interface-not-implemented warning. Closes issue #532. * Remove the rest of interface checks: interface-is-not-class, missing-interface-method, unresolved-interface. The reason is that its better to start recommending ABCs instead of the old Zope era of interfaces. One side effect of this change is that ignore-iface-methods becomes a noop, it's deprecated and it will be removed at some time. * Emit a proper deprecation warning for reporters.BaseReporter.add_message. The alternative way is to use handle_message. add_message will be removed in Pylint 1.6. * Added new module 'extensions' for optional checkers with the test directory 'test/extensions' and documentation file 'doc/extensions.rst'. * Added new checker 'extensions.check_docs' that verifies parameter documention in Sphinx, Google, and Numpy style. * Detect undefined variable cases, where the "definition" of an undefined variable was in del statement. Instead of emitting used-before-assignment, which is totally misleading, it now emits undefined-variable. Closes issue #528. * Don't emit attribute-defined-outside-init and access-member-before-definition for mixin classes. Actual errors can occur in mixin classes, but this is controlled by the ignore-mixin-members option. Closes issue #412. * Improve the detection of undefined variables and variables used before assignment for variables used as default arguments to function, where the variable was first defined in the class scope. Closes issue #342 and issue #404. * Add a new warning, 'unexpected-special-method-signature', which is emitted when a special method (dunder method) doesn't have the expected signature, which can lead to actual errors in the application code. Closes issue #253. * Remove 'bad-context-manager' due to the inclusion of 'unexpected-special-method-signature'. * Don't emit no-name-in-module if the import is guarded by an ImportError, Exception or a bare except clause. * Don't emit no-member if the attribute access node is protected by an except handler, which handles AttributeError, Exception or it is a bare except. * Don't emit import-error if the import is guarded by an ImportError, Exception or a bare except clause. * Don't emit undefined-variable if the node is guarded by a NameError, Exception or bare except clause. * Add a new warning, 'using-constant-test', which is emitted when a conditional statement (If, IfExp) uses a test which is always constant, such as numbers, classes, functions etc. This is most likely an error from the user's part. Closes issue #524. * Don't emit 'raising-non-exception' when the exception has unknown bases. We don't know what those bases actually are and it's better to assume that the user knows what he is doing rather than emitting a message which can be considered a false positive. * Look for a .pylintrc configuration file in the current folder, if pylintrc is not found. Dotted pylintrc files will not be searched in the parents of the current folder, as it is done for pylintrc. * Add a new error, 'invalid-unary-type-operand', emitted when an unary operand is used on something which doesn't support that operation (for instance, using the unary bitwise inversion operator on an instance which doesn't implement __invert__). * Take in consideration differences between arguments of various type of functions (classmethods, staticmethods, properties) when checking for `arguments-differ`. Closes issue #548. * astroid.inspector was moved to pylint.pyreverse, since it belongs there and it doesn't need to be in astroid. * astroid.utils.LocalsVisitor was moved to pylint.pyreverse.LocalsVisitor. * pylint.checkers.utils.excepts_import_error was removed. Use pylint.chekcers.utils.error_of_type instead. * Don't emit undefined-all-variables for nodes which can't be inferred (YES nodes). * yield-outside-func is also emitted for `yield from`. * Add a new error, 'too-many-star-expressions', emitted when there are more than one starred expression (`*x`) in an assignment. The warning is emitted only on Python 3. * Add a new error, 'invalid-star-assignment-target', emitted when a starred expression (`*x`) is used as the lhs side of an assignment, as in `*x = [1, 2]`. This is not a SyntaxError on Python 3 though. * Detect a couple of objects which can't be base classes (bool, slice, range and memoryview, which weren't detected until now). * Add a new error for the Python 3 porting checker, `import-star-module-level`, which is used when a star import is detected in another scope than the module level, which is an error on Python 3. Using this will emit a SyntaxWarning on Python 2. * Add a new error, 'star-needs-assignment-target', emitted on Python 3 when a Starred expression (`*x`) is not used in an assignment target. This is not caught when parsing the AST on Python 3, so it needs to be a separate check. * Add a new error, 'unsupported-binary-operation', emitted when two a binary arithmetic operation is executed between two objects which don't support it (a number plus a string for instance). This is currently disabled, since the it exhibits way too many false positives, but it will be reenabled as soon as possible. * New imported features from astroid into pyreverse: pyreverse.inspector.Project, pyreverse.inspector.project_from_files and pyreverse.inspector.interfaces. These were moved since they didn't belong in astroid. * Enable misplaced-future for Python 3. Closes issue #580. * Add a new error, 'nonlocal-and-global', which is emitted when a name is found to be both nonlocal and global in the same scope. Closes issue #581. * ignored-classes option can work with qualified names (ignored-classes=optparse.Values) Closes issue #297. * ignored-modules can work with qualified names as well as with Unix pattern matching for recursive ignoring. Closes issues #244. * Improve detection of relative imports in non-packages, as well as importing missing modules with a relative import from a package. * Don't emit no-init if not all the bases from a class are known. Closes issue #604. * --no-space-check option accepts `empty-line` as a possible option. Closes issue #541. * --generate-rcfile generates by default human readable symbols for the --disable option. Closes issue #608. * Improved the not-in-loop checker to properly detect more cases. * Add a new error, 'continue-in-finally', which is emitted when the `continue` keyword is found inside a `finally` clause, which is a SyntaxError. * The --zope flag is deprecated and it is slated for removal in Pylint 1.6. The reason behind this removal is the fact that it's a specialized flag and there are solutions for the original problem: use --generated-members with the members that causes problems when using Zope or add AST transforms tailored to the zope project. At the same time, --include-ids and --symbols will also be removed in Pylint 1.6. Closes issue #570. * missing-module-attribute was removed and the corresponding CLI option, required-attributes, which is slated for removal in Pylint 1.6. * missing-reversed-argument was removed. The reason behind this is that this kind of errors should be detected by the type checker for *all* the builtins and not as a special case for the reversed builtin. This will happen shortly in the future. * --comment flag is obsolete and it will be removed in Pylint 1.6. * --profile flag is obsolete and it will be removed in Pylint 1.6. * Add a new error, 'misplaced-bare-raise'. The error is used when a bare raise is not used inside an except clause. This can generate a RuntimeError in Python, if there are no active exceptions to be reraised. While it works in Python 2 due to the fact that the exception leaks outside of the except block, it's nevertheless a behaviour that a user shouldn't depend upon, since it's not obvious to the reader of the code what exception will be raised and it will not be compatible with Python 3 anyhow. Closes issue #633. * Bring logilab-common's ureports into pylint.reporters. With this change, we moved away from depending on logilab-common, having in Pylint all the components that were used from logilab-common. The API should be considered an implementation detail and can change at some point in the future. Closes issue #621. * `reimported` is emitted for reimported objects on the same line. Closes issue #639. * Abbreviations of command line options are not supported anymore. Using abbreviations for CLI options was never considered to be a feature of pylint, this fact being only a side effect of using optparse. As this was the case, using --load-plugin or other abbreviation for --load-plugins never actually worked, while it also didn't raise an error. Closes issue #424. * Add a new error, 'nonlocal-without-binding' The error is emitted on Python 3 when a nonlocal name is not bound to any variable in the parents scopes. Closes issue #582. * 'deprecated-module' can be shown for modules which aren't available. Closes issue #362. * Don't consider a class abstract if its members can't be properly inferred. This fixes a false positive related to abstract-class-instantiated. Closes issue #648. * Add a new checker for the async features added by PEP 492. * Add a new error, 'yield-inside-async-function', emitted on Python 3.5 and upwards when the `yield` statement is found inside a new coroutine function (PEP 492). * Add a new error, 'not-async-context-manager', emitted when an async context manager block is used with an object which doesn't support this protocol (PEP 492). * Add a new convention warning, 'singleton-comparison', emitted when comparison to True, False or None is found. * Don't emit 'assigning-non-slot' for descriptors. Closes issue #652. * Add a new error, 'repeated-keyword', when a keyword argument is passed multiple times into a function call. This is similar with redundant-keyword-arg, but it's mildly different that it needs to be a separate error. * --enable=all can now be used. Closes issue #142. * Add a new convention message, 'misplaced-comparison-constant', emitted when a constant is placed in the left hand side of a comparison, as in '5 == func()'. This is also called Yoda condition, since the flow of code reminds of the Star Wars green character, conditions usually encountered in languages with variabile assignments in conditional statements. * Add a new convention message, 'consider-using-enumerate', which is emitted when code that uses `range` and `len` for iterating is encountered. Closes issue #684. * Added two new refactoring messages, 'no-classmethod-decorator' and 'no-staticmethod-decorator', which are emitted when a static method or a class method is declared without using decorators syntax. Closes issue #675. What's New in Pylint 1.4.3? =========================== Release date: 2015-03-14 * Remove three warnings: star-args, abstract-class-little-used, abstract-class-not-used. These warnings don't add any real value and they don't imply errors or problems in the code. * Added a new option for controlling the peephole optimizer in astroid. The option ``--optimize-ast`` will control the peephole optimizer, which is used to optimize a couple of AST subtrees. The current problem solved by the peephole optimizer is when multiple joined strings, with the addition operator, are encountered. If the numbers of such strings is high enough, Pylint will then fail with a maximum recursion depth exceeded error, due to its visitor architecture. The peephole just transforms such calls, if it can, into the final resulting string and this exhibit a problem, because the visit_binop method stops being called (in the optimized AST it will be a Const node). What's New in Pylint 1.4.2? =========================== Release date: 2015-03-11 * Don't require a docstring for empty modules. Closes issue #261. * Fix a false positive with `too-few-format-args` string warning, emitted when the string format contained a normal positional argument ('{0}'), mixed with a positional argument which did an attribute access ('{0.__class__}'). Closes issue #463. * Take in account all the methods from the ancestors when checking for too-few-public-methods. Closes issue #471. * Catch enchant errors and emit 'invalid-characters-in-docstring' when checking for spelling errors. Closes issue #469. * Use all the inferred statements for the super-init-not-called check. Closes issue #389. * Add a new warning, 'unichr-builtin', emitted by the Python 3 porting checker, when the unichr builtin is found. Closes issue #472. * Add a new warning, 'intern-builtin', emitted by the Python 3 porting checker, when the intern builtin is found. Closes issue #473. * Add support for editable installations. * The HTML output accepts the `--msg-template` option. Patch by Dan Goldsmith. * Add 'map-builtin-not-iterating' (replacing 'implicit-map-evaluation'), 'zip-builtin-not-iterating', 'range-builtin-not-iterating', and 'filter-builtin-not-iterating' which are emitted by `--py3k` when the appropriate built-in is not used in an iterating context (semantics taken from 2to3). * Add a new warning, 'unidiomatic-typecheck', emitted when an explicit typecheck uses type() instead of isinstance(). For example, `type(x) == Y` instead of `isinstance(x, Y)`. Patch by Chris Rebert. Closes issue #299. * Add support for combining the Python 3 checker mode with the --jobs flag (--py3k and --jobs). Closes issue #467. * Add a new warning for the Python 3 porting checker, 'using-cmp-argument', emitted when the `cmp` argument for the `list.sort` or `sorted builtin` is encountered. * Make the --py3k flag commutative with the -E flag. Also, this patch fixes the leaks of error messages from the Python 3 checker when the errors mode was activated. Closes issue #437. What's New in Pylint 1.4.1? =========================== Release date: 2015-01-16 * Look only in the current function's scope for bad-super-call. Closes issue #403. * Check the return of properties when checking for not-callable. Closes issue #406. * Warn about using the input() or round() built-ins for Python 3. Closes issue #411. * Proper abstract method lookup while checking for abstract-class-instantiated. Closes issue #401. * Use a mro traversal for finding abstract methods. Closes issue #415. * Fix a false positive with catching-non-exception and tuples of exceptions. * Fix a false negative with raising-non-exception, when the raise used an uninferrable exception context. * Fix a false positive on Python 2 for raising-bad-type, when raising tuples in the form 'raise (ZeroDivisionError, None)'. * Fix a false positive with invalid-slots-objects, where the slot entry was a unicode string on Python 2. Closes issue #421. * Add a new warning, 'redundant-unittest-assert', emitted when using unittest's methods assertTrue and assertFalse with constant value as argument. Patch by Vlad Temian. * Add a new JSON reporter, usable through -f flag. * Add the method names for the 'signature-differs' and 'argument-differs' warnings. Closes issue #433. * Don't compile test files when installing. * Fix a crash which occurred when using multiple jobs and the files given as argument didn't exist at all. What's New in Pylint 1.4.0? ============================ Release date: 2014-11-23 * Added new options for controlling the loading of C extensions. By default, only C extensions from the stdlib will be loaded into the active Python interpreter for inspection, because they can run arbitrary code on import. The option `--extension-pkg-whitelist` can be used to specify modules or packages that are safe to load. * Change default max-line-length to 100 rather than 80 * Drop BaseRawChecker class which were only there for backward compat for a while now * Don't try to analyze string formatting with objects coming from function arguments. Closes issue #373. * Port source code to be Python 2/3 compatible. This drops the need for 2to3, but does drop support for Python 2.5. * Each message now comes with a confidence level attached, and can be filtered base on this level. This allows to filter out all messages that were emitted even though an inference failure happened during checking. * Improved presenting unused-import message. Closes issue #293. * Add new checker for finding spelling errors. New messages: wrong-spelling-in-comment, wrong-spelling-in-docstring. New options: spelling-dict, spelling-ignore-words. * Add new '-j' option for running checks in sub-processes. * Added new checks for line endings if they are mixed (LF vs CRLF) or if they are not as expected. New messages: mixed-line-endings, unexpected-line-ending-format. New option: expected-line-ending-format. * 'dangerous-default-value' no longer evaluates the value of the arguments, which could result in long error messages or sensitive data being leaked. Closes issue #282 * Fix a false positive with string formatting checker, when encountering a string which uses only position-based arguments. Closes issue #285. * Fix a false positive with string formatting checker, when using keyword argument packing. Closes issue #288. * Proper handle class level scope for lambdas. * Handle 'too-few-format-args' or 'too-many-format-args' for format strings with both named and positional fields. Closes issue #286. * Analyze only strings by the string format checker. Closes issue #287. * Properly handle nested format string fields. Closes issue #294. * Don't emit 'attribute-defined-outside-init' if the attribute was set by a function call in a defining method. Closes issue #192. * Properly handle unicode format strings for Python 2. Closes issue #296. * Don't emit 'import-error' if an import was protected by a try-except, which excepted ImportError. * Fix an 'unused-import' false positive, when the error was emitted for all the members imported with 'from import' form. Closes issue #304. * Don't emit 'invalid-name' when assigning a name in an ImportError handler. Closes issue #302. * Don't count branches from nested functions. * Fix a false positive with 'too-few-format-args', when the format strings contains duplicate manual position arguments. Closes issue #310. * fixme regex handles comments without spaces after the hash. Closes issue #311. * Don't emit 'unused-import' when a special object is imported (__all__, __doc__ etc.). Closes issue #309. * Look in the metaclass, if defined, for members not found in the current class. Closes issue #306. * Don't emit 'protected-access' if the attribute is accessed using a property defined at the class level. * Detect calls of the parent's __init__, through a binded super() call. * Check that a class has an explicitly defined metaclass before emitting 'old-style-class' for Python 2. * Emit 'catching-non-exception' for non-class nodes. Closes issue #303. * Order of reporting is consistent. * Add a new warning, 'boolean-datetime', emitted when an instance of 'datetime.time' is used in a boolean context. Closes issue #239. * Fix a crash which ocurred while checking for 'method-hidden', when the parent frame was something different than a function. * Generate html output for missing files. Closes issue #320. * Fix a false positive with 'too-many-format-args', when the format string contains mixed attribute access arguments and manual fields. Closes issue #322. * Extend the cases where 'undefined-variable' and 'used-before-assignment' can be detected. Closes issue #291. * Add support for customising callback identifiers, by adding a new '--callbacks' command line option. Closes issue #326. * Add a new warning, 'logging-format-interpolation', emitted when .format() string interpolation is used within logging function calls. * Don't emit 'unbalanced-tuple-unpacking' when the rhs of the assignment is a variable length argument. Closes issue #329. * Add a new warning, 'inherit-non-class', emitted when a class inherits from something which is not a class. Closes issue #331. * Fix another false positives with 'undefined-variable', where the variable can be found as a class assignment and used in a function annotation. Closes issue #342. * Handle assignment of the string format method to a variable. Closes issue #351. * Support wheel packaging format for PyPi. Closes issue #334. * Check that various built-ins that do not exist in Python 3 are not used: apply, basestring, buffer, cmp, coerce, execfile, file, long raw_input, reduce, StandardError, unicode, reload and xrange. * Warn for magic methods which are not used in any way in Python 3: __coerce__, __delslice__, __getslice__, __setslice__, __cmp__, __oct__, __nonzero__ and __hex__. * Don't emit 'assigning-non-slot' when the assignment is for a property. Closes issue #359. * Fix for regression: '{path}' was no longer accepted in '--msg-template'. * Report the percentage of all messages, not just for errors and warnings. Closes issue #319. * 'too-many-public-methods' is reported only for methods defined in a class, not in its ancestors. Closes issue #248. * 'too-many-lines' disable pragma can be located on any line, not only the first. Closes issue #321. * Warn in Python 2 when an import statement is found without a corresponding `from __future__ import absolute_import`. * Warn in Python 2 when a non-floor division operation is found without a corresponding `from __future__ import division`. * Add a new option, 'exclude-protected', for excluding members from the protected-access warning. Closes issue #48. * Warn in Python 2 when using dict.iter*(), dict.view*(); none of these methods are available in Python 3. * Warn in Python 2 when calling an object's next() method; Python 3 uses __next__() instead. * Warn when assigning to __metaclass__ at a class scope; in Python 3 a metaclass is specified as an argument to the 'class' statement. * Warn when performing parameter tuple unpacking; it is not supported in Python 3. * 'abstract-class-instantiated' is also emitted for Python 2. It was previously disabled. * Add 'long-suffix' error, emitted when encountering the long suffix on numbers. * Add support for disabling a checker, by specifying an 'enabled' attribute on the checker class. * Add a new CLI option, --py3k, for enabling Python 3 porting mode. This mode will disable all other checkers and will emit warnings and errors for constructs which are invalid or removed in Python 3. * Add 'old-octal-literal' to Python 3 porting checker, emitted when encountering octals with the old syntax. * Add 'implicit-map-evaluation' to Python 3 porting checker, emitted when encountering the use of map builtin, without explicit evaluation. What's New in Pylint 1.3.0? =========================== Release date: 2014-07-26 * Allow hanging continued indentation for implicitly concatenated strings. Closes issue #232. * Pylint works under Python 2.5 again, and its test suite passes. * Fix some false positives for the cellvar-from-loop warnings. Closes issue #233. * Return new astroid class nodes when the inferencer can detect that that result of a function invocation on a type (like `type` or `abc.ABCMeta`) is requested. Closes #205. * Emit 'undefined-variable' for undefined names when using the Python 3 `metaclass=` argument. * Checkers respect priority now. Close issue #229. * Fix a false positive regarding W0511. Closes issue #149. * Fix unused-import false positive with Python 3 metaclasses (#143). * Don't warn with 'bad-format-character' when encountering the 'a' format on Python 3. * Add multiple checks for PEP 3101 advanced string formatting: 'bad-format-string', 'missing-format-argument-key', 'unused-format-string-argument', 'format-combined-specification', 'missing-format-attribute' and 'invalid-format-index'. * Issue broad-except and bare-except even if the number of except handlers is different than 1. Fixes issue #113. * Issue attribute-defined-outside-init for all cases, not just for the last assignment. Closes issue #262. * Emit 'not-callable' when calling properties. Closes issue #268. * Fix a false positive with unbalanced iterable unpacking, when encountering starred nodes. Closes issue #273. * Add new checks, 'invalid-slice-index' and 'invalid-sequence-index' for invalid sequence and slice indices. * Add 'assigning-non-slot' warning, which detects assignments to attributes not defined in slots. * Don't emit 'no-name-in-module' for ignored modules. Closes issue #223. * Fix an 'unused-variable' false positive, where the variable is assigned through an import. Closes issue #196. * Definition order is considered for classes, function arguments and annotations. Closes issue #257. * Don't emit 'unused-variable' when assigning to a nonlocal. Closes issue #275. * Do not let ImportError propagate from the import checker, leading to crash in some namespace package related cases. Closes issue #203. * Don't emit 'pointless-string-statement' for attribute docstrings. Closes issue #193. * Use the proper mode for pickle when opening and writing the stats file. Closes issue #148. * Don't emit hidden-method message when the attribute has been monkey-patched, you're on your own when you do that. * Only emit attribute-defined-outside-init for definition within the same module as the offended class, avoiding to mangle the output in some cases. * Don't emit 'unnecessary-lambda' if the body of the lambda call contains call chaining. Closes issue #243. * Don't emit 'missing-docstring' when the actual docstring uses `.format`. Closes issue #281. What's New in Pylint 1.2.1? =========================== Release date: 2014-04-30 * Restore the ability to specify the init-hook option via the configuration file, which was accidentally broken in 1.2.0. * Add a new warning [bad-continuation] for badly indentend continued lines. * Emit [assignment-from-none] when the function contains bare returns. Fixes BitBucket issue #191. * Added a new warning for closing over variables that are defined in loops. Fixes Bitbucket issue #176. * Do not warn about \u escapes in string literals when Unicode literals are used for Python 2.*. Fixes BitBucket issue #151. * Extend the checking for unbalanced-tuple-unpacking and unpacking-non-sequence to instance attribute unpacking as well. * Fix explicit checking of python script (1.2 regression, #219) * Restore --init-hook, renamed accidentally into --init-hooks in 1.2.0 (#211) * Add 'indexing-exception' warning, which detects that indexing an exception occurs in Python 2 (behaviour removed in Python 3). What's New in Pylint 1.2.0? =========================== Release date: 2014-04-18 * Pass the current python paths to pylint process when invoked via epylint. Fixes BitBucket issue #133. * Add -i / --include-ids and -s / --symbols back as completely ignored options. Fixes BitBucket issue #180. * Extend the number of cases in which logging calls are detected. Fixes bitbucket issue #182. * Improve pragma handling to not detect pylint:* strings in non-comments. Fixes BitBucket issue #79. * Do not crash with UnknownMessage if an unknown message ID/name appears in disable or enable in the configuration. Patch by Cole Robinson. Fixes bitbucket issue #170. * Add new warning 'eval-used', checking that the builtin function `eval` was used. * Make it possible to show a naming hint for invalid name by setting include-naming-hint. Also make the naming hints configurable. Fixes BitBucket issue #138. * Added support for enforcing multiple, but consistent name styles for different name types inside a single module; based on a patch written by morbo@google.com. * Also warn about empty docstrings on overridden methods; contributed by sebastianu@google.com. * Also inspect arguments to constructor calls, and emit relevant warnings; contributed by sebastianu@google.com. * Added a new configuration option logging-modules to make the list of module names that can be checked for 'logging-not-lazy' et. al. configurable; contributed by morbo@google.com. * ensure init-hooks is evaluated before other options, notably load-plugins (#166) * Python 2.5 support restored: fixed small issues preventing pylint to run on python 2.5. Bitbucket issues #50 and #62. * bitbucket #128: pylint doesn't crash when looking for used-before-assignment in context manager assignments. * Add new warning, 'bad-reversed-sequence', for checking that the reversed() builtin receive a sequence (implements __getitem__ and __len__, without being a dict or a dict subclass) or an instance which implements __reversed__. * Mark `file` as a bad function when using python2 (closes #8). * Add new warning 'bad-exception-context', checking that `raise ... from ...` uses a proper exception context (None or an exception). * Enhance the check for 'used-before-assignment' to look for 'nonlocal' uses. * Emit 'undefined-all-variable' if a package's __all__ variable contains a missing submodule (closes #126). * Add a new warning 'abstract-class-instantiated' for checking that abstract classes created with `abc` module and with abstract methods are instantied. * Do not warn about 'return-arg-in-generator' in Python 3.3+. * Do not warn about 'abstract-method' when the abstract method is implemented through assignment (#155). * Improve cyclic import detection in the case of packages, patch by Buck Golemon * Add new warnings for checking proper class __slots__: `invalid-slots-object` and `invalid-slots`. * Search for rc file in `~/.config/pylintrc` if `~/.pylintrc` doesn't exists (#121) * Don't register the newstyle checker w/ python >= 3 * Fix unused-import false positive w/ augment assignment (#78) * Fix access-member-before-definition false negative wrt aug assign (#164) * Do not attempt to analyze non python file, eg .so file (#122) What's New in Pylint 1.1.0? =========================== Release date: 2013-12-22 * Add new check for use of deprecated pragma directives "pylint:disable-msg" or "pylint:enable-msg" (I0022, deprecated-pragma) which was previously emmited as a regular warn(). * Avoid false used-before-assignment for except handler defined identifier used on the same line (#111). * Combine 'no-space-after-operator', 'no-space-after-comma' and 'no-space-before-operator' into a new warning 'bad-whitespace'. * Add a new warning 'superfluous-parens' for unnecessary parentheses after certain keywords. * Fix a potential crash in the redefine-in-handler warning if the redefined name is a nested getattr node. * Add a new option for the multi-statement warning to allow single-line if statements. * Add 'bad-context-manager' error, checking that '__exit__' special method accepts the right number of arguments. * Run pylint as a python module 'python -m pylint' (anatoly techtonik). * Check for non-exception classes inside an except clause. * epylint support options to give to pylint after the file to analyze and have basic input validation (bitbucket #53 and #54), patches provided by felipeochoa and Brian Lane. * Added a new warning, 'non-iterator-returned', for non-iterators returned by '__iter__'. * Add new checks for unpacking non-sequences in assignments (unpacking-non-sequence) as well as unbalanced tuple unpacking (unbalanced-tuple-unpacking). * useless-else-on-loop not emited if there is a break in the else clause of inner loop (#117). * don't mark `input` as a bad function when using python3 (#110). * badly-implemented-container caused several problems in its current implementation. Deactivate it until we have something better. See #112 for instance. * Use attribute regexp for properties in python3, as in python2 * Create the PYLINTHOME directory when needed, it might fail and lead to spurious warnings on import of pylint.config. * Fix setup.py so that pylint properly install on Windows when using python3 * Various documentation fixes and enhancements * Fix issue #55 (false-positive trailing-whitespace on Windows) What's New in Pylint 1.0.0? =========================== Release date: 2013-08-06 * Add check for the use of 'exec' function * New --msg-template option to control output, deprecating "msvc" and "parseable" output formats as well as killing `--include-ids` and `--symbols` options * Do not emit [fixme] for every line if the config value 'notes' is empty, but [fixme] is enabled. * Emit warnings about lines exceeding the column limit when those lines are inside multiline docstrings. * Do not double-check parameter names with the regex for parameters and inline variables. * Added a new warning missing-final-newline (C0304) for files missing the final newline. * Methods that are decorated as properties are now treated as attributes for the purposes of name checking. * Names of derived instance class member are not checked any more. * Names in global statements are now checked against the regular expression for constants. * For toplevel name assignment, the class name regex will be used if pylint can detect that value on the right-hand side is a class (like collections.namedtuple()). * Simplified invalid-name message * Added a new warning invalid-encoded-data (W0512) for files that contain data that cannot be decoded with the specified or default encoding. * New warning bad-open-mode (W1501) for calls to open (or file) that specify invalid open modes (Original implementation by Sasha Issayev). * New warning old-style-class (C1001) for classes that do not have any base class. * Add new name type 'class_attribute' for attributes defined in class scope. By default, allow both const and variable names. * New warning trailing-whitespace (C0303) that warns about trailing whitespace. * Added a new warning unpacking-in-except (W0712) about unpacking exceptions in handlers, which is unsupported in Python 3. * Add a configuration option for missing-docstring to optionally exempt short functions/methods/classes from the check. * Add the type of the offending node to missing-docstring and empty-docstring. * New utility classes for per-checker unittests in testutils.py * Do not warn about redefinitions of variables that match the dummy regex. * Do not treat all variables starting with _ as dummy variables, only _ itself. * Make the line-too-long warning configurable by adding a regex for lines for with the length limit should not be enforced * Do not warn about a long line if a pylint disable option brings it above the length limit * Do not flag names in nested with statements as undefined. * Added a new warning 'old-raise-syntax' for the deprecated syntax raise Exception, args * Support for PEP 3102 and new missing-kwoa (E1125) message for missing mandatory keyword argument (logilab.org's #107788) * Fix spelling of max-branchs option, now max-branches * Added a new base class and interface for checkers that work on the tokens rather than the syntax, and only tokenize the input file once. * Follow astng renaming to astroid * bitbucket #37: check for unbalanced unpacking in assignments * bitbucket #25: fix incomplete-protocol false positive for read-only containers like tuple * bitbucket #16: fix False positive E1003 on Python 3 for argument-less super() * bitbucket #6: put back documentation in source distribution * bitbucket #15: epylint shouldn't hang anymore when there is a large output on pylint'stderr * bitbucket #7: fix epylint w/ python3 * bitbucket #3: remove string module from the default list of deprecated modules What's New in Pylint 0.28.0? ============================ Release date: 2013-04-25 * bitbucket #1: fix "dictionary changed size during iteration" crash * #74013: new E1310[bad-str-strip-call] message warning when a call to a {l,r,}strip method contains duplicate characters (patch by Torsten Marek) * #123233: new E0108[duplicate-argument-name] message reporting duplicate argument names * #81378: emit W0120[useless-else-on-loop] for loops without break * #124660: internal dependencies should not appear in external dependencies report * #124662: fix name error causing crash when symbols are included in output messages * #123285: apply pragmas for warnings attached to lines to physical source code lines * #123259: do not emit E0105 for yield expressions inside lambdas * #123892: don't crash when attempting to show source code line that can't be encoded with the current locale settings * Simplify checks for dangerous default values by unifying tests for all different mutable compound literals. * Improve the description for E1124[redundant-keyword-arg] What's New in Pylint 0.27.0? ============================ Release date: 2013-02-26 * #20693: replace pylint.el by Ian Eure version (patch by J.Kotta) * #105327: add support for --disable=all option and deprecate the 'disable-all' inline directive in favour of 'skip-file' (patch by A.Fayolle) * #110840: add messages I0020 and I0021 for reporting of suppressed messages and useless suppression pragmas. (patch by Torsten Marek) * #112728: add warning E0604 for non-string objects in __all__ (patch by Torsten Marek) * #120657: add warning W0110/deprecated-lambda when a map/filter of a lambda could be a comprehension (patch by Martin Pool) * #113231: logging checker now looks at instances of Logger classes in addition to the base logging module. (patch by Mike Bryant) * #111799: don't warn about octal escape sequence, but warn about \o which is not octal in Python (patch by Martin Pool) * #110839: bind to Run button in pylint-gui * #115580: fix erroneous W0212 (access to protected member) on super call (patch by Martin Pool) * #110853: fix a crash when an __init__ method in a base class has been created by assignment rather than direct function definition (patch by Torsten Marek) * #110838: fix pylint-gui crash when include-ids is activated (patch by Omega Weapon) * #112667: fix emission of reimport warnings for mixed imports and extend the testcase (patch by Torsten Marek) * #112698: fix crash related to non-inferable __all__ attributes and invalid __all__ contents (patch by Torsten Marek) * Python 3 related fixes: * #110213: fix import of checkers broken with python 3.3, causing "No such message id W0704" breakage * #120635: redefine cmp function used in pylint.reporters * Include full warning id for I0020 and I0021 and make sure to flush warnings after each module, not at the end of the pylint run. (patch by Torsten Marek) * Changed the regular expression for inline options so that it must be preceeded by a # (patch by Torsten Marek) * Make dot output for import graph predictable and not depend on ordering of strings in hashes. (patch by Torsten Marek) * Add hooks for import path setup and move pylint's sys.path modifications into them. (patch by Torsten Marek) What's New in Pylint 0.26.0? ============================ Release date: 2012-10-05 * #106534: add --ignore-imports option to code similarity checking and 'symilar' command line tool (patch by Ry4an Brase) * #104571: check for anomalous backslash escape, introducing new W1401 and W1402 messages (patch by Martin Pool) * #100707: check for boolop being used as exception class, introducing new W0711 message (patch by Tim Hatch) * #4014: improve checking of metaclass methods first args, introducing new C0204 message (patch by lothiraldan@gmail.com finalized by sthenault) * #4685: check for consistency of a module's __all__ variable, introducing new E0603 message * #105337: allow custom reporter in output-format (patch by Kevin Jing Qiu) * #104420: check for protocol completness and avoid false R0903 (patch by Peter Hammond) * #100654: fix grammatical error for W0332 message (using 'l' as long int identifier) * #103656: fix W0231 false positive for missing call to object.__init__ (patch by lothiraldan@gmail.com) * #63424: fix similarity report disabling by properly renaming it to RP0801 * #103949: create a console_scripts entry point to be used by easy_install, buildout and pip * fix cross-interpreter issue (non compatible access to __builtins__) * stop including tests files in distribution, they causes crash when installed with python3 (#72022, #82417, #76910) What's New in Pylint 0.25.2? ============================ Release date: 2012-07-17 * #93591: Correctly emit warnings about clobbered variable names when an except handler contains a tuple of names instead of a single name. (patch by tmarek@google.com) * #7394: W0212 (access to protected member) not emited on assigments (patch by lothiraldan@gmail.com) * #18772; no prototype consistency check for mangled methods (patch by lothiraldan@gmail.com) * #92911: emit W0102 when sets are used as default arguments in functions (patch by tmarek@google.com) * #77982: do not emit E0602 for loop variables of comprehensions used as argument values inside a decorator (patch by tmarek@google.com) * #89092: don't emit E0202 (attribute hiding a method) on @property methods * #92584: fix pylint-gui crash due to internal API change * #87192: fix crash when decorators are accessed through more than one dot (for instance @a.b is fine, @a.b.c crash) * #88914: fix parsing of --generated-members options, leading to crash when using a regexp value set * fix potential crashes with utils.safe_infer raising InferenceError What's New in Pylint 0.25.1? ============================ Release date: 2011-12-08 * #81078: Warn if names in exception handlers clobber overwrite existing names (patch by tmarek@google.com) * #81113: Fix W0702 messages appearing with the wrong line number. (patch by tmarek@google.com) * #50461, #52020, #51222: Do not issue warnings when using 2.6's property.setter/deleter functionality (patch by dneil@google.com) * #9188, #4024: Do not trigger W0631 if a loop variable is assigned in the else branch of a for loop. What's New in Pylint 0.25.0? ============================ Release date: 2011-10-7 * #74742: make allowed name for first argument of class method configurable (patch by Google) * #74087: handle case where inference of a module return YES; this avoid some cases of "TypeError: '_Yes' object does not support indexing" (patch by Google) * #74745: make "too general" exception names configurable (patch by Google) * #74747: crash occurs when lookup up a special attribute in class scope (patch by google) * #76920: crash if on eg "pylint --rcfile" (patch by Torsten Marek) * #77237: warning for E0202 may be very misleading * #73941: HTML report messages table is badly rendered What's New in Pylint 0.24.0? ============================ Release date: 2011-07-18 * #69738: add regular expressions support for "generated-members" * ids of logging and string_format checkers have been changed: logging: 65 -> 12, string_format: 99 -> 13 Also add documentation to say that ids of range 1-50 shall be reserved to pylint internal checkers * #69993: Additional string format checks for logging module: check for missing arguments, too many arguments, or invalid string formats in the logging checker module. Contributed by Daniel Arena * #69220: add column offset to the reports. If you've a custom reporter, this change may break it has now location gain a new item giving the column offset. * #60828: Fix false positive in reimport check * #70495: absolute imports fail depending on module path (patch by Jacek Konieczny) * #22273: Fix --ignore option documentation to match reality What's New in Pylint 0.23.0? ============================ Release date: 2011-01-11 * documentation update, add manpages * several performance improvements * finalize python3 support * new W0106 warning 'Expression "%s" is assigned to nothing' * drop E0501 and E0502 messages about wrong source encoding: not anymore interesting since it's a syntax error for python >= 2.5 and we now only support this python version and above. * don't emit W0221 or W0222 when methods as variable arguments (eg \*arg and/or \*\*args). Patch submitted by Charles Duffy. What's New in Pylint 0.22.0? ============================ Release date: 2010-11-15 * python versions: minimal python3.x support; drop python < 2.5 support What's New in Pylint 0.21.4? ============================ Release date: 2010-10-27 * fix #48066: pylint crashes when redirecting output containing non-ascii characters * fix #19799: "pylint -blah" exit with status 2 * update documentation What's New in Pylint 0.21.3? ============================ Release date: 2010-09-28 * restored python 2.3 compatibility. Along with logilab-astng 0.21.3 and logilab-common 0.52, this will much probably be the latest release supporting python < 2.5. What's New in Pylint 0.21.2? ============================ Release date: 2010-08-26 * fix #36193: import checker raise exception on cyclic import * fix #28796: regression in --generated-members introduced pylint 0.20 * some documentation cleanups What's New in Pylint 0.21.1? ============================ Release date: 2010-06-04 * fix #28962: pylint crash with new options, due to missing stats data while writing the Statistics by types report * updated man page to 0.21 or greater command line usage (fix debian #582494) What's New in Pylint 0.21.0? ============================ Release date: 2010-05-11 * command line updated (closes #9774, #9787, #9992, #22962): * all enable-* / disable-* options have been merged into --enable / --disable * BACKWARD INCOMPATIBLE CHANGE: short name of --errors-only becomes -E, -e being affected to --enable * pylint --help output much simplified, with --long-help available to get the complete one * revisited gui, thanks to students from Toronto university (they are great contributors to this release!) * fix #21591: html reporter produces no output if reports is set to 'no' * fix #4581: not Missing docstring (C0111) warning if a method is overridden * fix #4683: Non-ASCII characters count double if utf8 encode * fix #9018: when using defining-attr-method, method order matters * fix #4595: Comma not followed by a space should not occurs on trailing comma in list/tuple/dict definition * fix #22585: [Patch] fix man warnings for pyreverse.1 manpage * fix #20067: AttributeError: 'NoneType' object has no attribute 'name' with with What's New in Pylint 0.20.0? ============================ Release date: 2010-03-01 * fix #19498: fix windows batch file * fix #19339: pylint.el : non existing py-mod-map (closes Debian Bug report logs - #475939) * implement #18860, new W0199 message on assert (a, b) * implement #9776, 'W0150' break or return statement in finally block may swallow exception. * fix #9263, __init__ and __new__ are checked for unused arguments * fix #20991, class scope definitions ignored in a genexpr * fix #5975, Abstract intermediate class not recognized as such * fix #5977, yield and return statement have their own counters, no more R0911 (Too many return statements) when a function have many yield stamtements * implement #5564, function / method arguments with leading "_" are ignored in arguments / local variables count. * implement #9982, E0711 specific error message when raising NotImplemented * remove --cache-size option What's New in Pylint 0.19.0? ============================ Release date: 2009-12-18 * implement #18947, #5561: checker for function arguments * include James Lingard string format checker * include simple message (ids) listing by Vincent Ferotin (#9791) * --errors-only does not hide fatal error anymore * include james Lingard patches for ++/-- and duplicate key in dicts * include James Lingard patches for function call arguments checker * improved flymake code and doc provided by Derek Harland * refactor and fix the imports checker * fix #18862: E0601 false positive with lambda functions * fix #8764: More than one statement on a single line false positive with try/except/finally * fix #9215: false undefined variable error in lambda function * fix for w0108 false positive (Nathaniel) * fix test/fulltest.sh * #5821 added a utility function to run pylint in another process (patch provide by Vincent Ferotin) What's New in Pylint 0.18.0? ============================ Release date: 2009-03-25 * tests ok with python 2.4, 2.5, 2.6. 2.3 not tested * fix #8687, W0613 false positive on inner function * fix #8350, C0322 false positive on multi-line string * fix #8332: set E0501 line no to the first line where non ascii character has been found * avoid some E0203 / E0602 false negatives by detecting respectively AttributeError / NameError * implements #4037: don't issue W0142 (* or ** magic) when they are barely passed from */** arguments * complete #5573: more complete list of special methods, also skip W0613 for python internal method * don't show information messages by default * integration of Yuen Ho Wong's patches on emacs lisp files What's New in Pylint 0.17.0? ============================ Release date: 2009-03-19 * semicolon check : move W0601 to W0301 * remove rpython : remove all rpython checker, modules and tests * astng 0.18 compatibility: support for _ast module modifies interfaces What's New in Pylint 0.16.0? ============================ Release date: 2009-01-28 * change [en|dis]able-msg-cat options: only accept message categories identified by their first letter (eg IRCWEF) without the need for comma as separator * add epylint.bat script to fix Windows installation * setuptools/easy_install support * include a modified version of Maarten ter Huurne patch to avoid W0613 warning on arguments from overridden method * implement #5575 drop dumb W0704 message) by adding W0704 to ignored messages by default * new W0108 message, checking for suspicious lambda (provided by Nathaniel Manista) * fix W0631, false positive reported by Paul Hachmann * fix #6951: false positive with W0104 * fix #6949 * patches by Mads Kiilerich: * implement #4691, make pylint exits with a non zero return status if any messages other then Information are issued * fix #3711, #5626 (name resolution bug w/ decorator and class members) * fix #6954 What's New in Pylint 0.15.2? ============================ Release date: 2008-10-13 * fix #5672: W0706 weirdness ( W0706 removed ) * fix #5998: documentation points to wrong url for mailing list * fix #6022: no error message on wrong module names * fix #6040: pytest doesn't run test/func_test.py What's New in Pylint 0.15.1? ============================ Release date: 2008-09-15 * fix #4910: default values are missing in manpage * fix #5991: missing files in 0.15.0 tarball * fix #5993: epylint should work with python 2.3 What's New in Pylint 0.15.0? ============================ Release date: 2008-09-10 * include pyreverse package and class diagram generation * included Stefan Rank's patch to deal with 2.4 relative import * included Robert Kirkpatrick's tutorial and typos fixes * fix bug in reenabling message * fix #2473: invoking pylint on __init__.py (hopefully) * typecheck: acquired-members option has been dropped in favor of the more generic generated-members option. If the zope option is set, the behaviour is now to add some default values to generated-members. * flymake integration: added bin/epylint and elisp/pylint-flymake.el What's New in Pylint 0.14.0? ============================ Release date: 2008-01-14 * fix #3733: Messages (dis)appear depending on order of file names * fix #4026: pylint.el should require compile * fix a bug in colorized reporter, spotted by Dave Borowitz * applied patch from Stefan Rank to avoid W0410 false positive when multiple "from __future__" import statements * implement #4012: flag back tick as deprecated (new W0333 message) * new ignored-class option on typecheck checker allowing to skip members checking based on class name (patch provided by Thomas W Barr) What's New in Pylint 0.13.2? ============================ Release date: 2007-06-07 * fix disable-checker option so that it won't accidentally enable the rpython checker which is disabled by default * added note about the gedit plugin into documentation What's New in Pylint 0.13.1? ============================ Release date: 2007-03-02 * fix some unexplained 0.13.0 packaging issue which led to a bunch of files missing from the distribution What's New in Pylint 0.13.0? ============================ Release date: 2007-02-28 * new RPython (Restricted Python) checker for PyPy fellow or people wanting to get a compiled version of their python program using the translator of the PyPy project. For more information about PyPy or RPython, visit http://codespeak.net/pypy/ * new E0104 and E0105 messages introduced to respectively warn about "return" and "yield" outside function or method * new E0106 message when "yield" and "return something" are mixed in a function or method * new W0107 message for unnecessary pass statement * new W0614 message to differentiate between unused `import X` and unused `from X import *` (#3209, patch submitted by Daniel Drake) * included Daniel Drake's patch to have a different message E1003 instead of E1001 when a missing member is found but an inference failure has been detected * msvs reporter for Visual Studio line number reporting (#3285) * allow disable-all option inline (#3218, patch submitted by Daniel Drake) * --init-hook option to call arbitrary code necessary to set environment (eg sys.path) (#3156) * One more Daniel's patch fixing a command line option parsing problem, this'll definitely be the DDrake release :) * fix #3184: crashes on "return" outside function * fix #3205: W0704 false positive * fix #3123: W0212 false positive on static method * fix #2485: W0222 false positive * fix #3259: when a message is explicitly enabled, check the checker emitting it is enabled What's New in Pylint 0.12.2? ============================ Release date: 2006-11-23 * fix #3143: W0233 bug w/ YES objects * fix #3119: Off-by-one error counting lines in a file * fix #3117: ease sys.stdout overriding for reporters * fix #2508: E0601 false positive with lambda * fix #3125: E1101 false positive and a message duplication. Only the last part is actually fixed since the initial false positive is due to dynamic setting of attributes on the decimal.Context class. * fix #3149: E0101 false positives and introduced E0100 for generator __init__ methods * fixed some format checker false positives What's New in Pylint 0.12.1? ============================ Release date: 2006-09-25 * fixed python >= 2.4 format false positive with multiple lines statement * fixed some 2.5 issues * fixed generator expression scope bug (depends on astng 0.16.1) * stop requiring __revision__ What's New in Pylint 0.12.0? ============================ Release date: 2006-08-10 * usability changes: * parseable, html and color options are now handled by a single output-format option * enable- and disable-all options are now handled by two (exclusive) enable-checker and disable-checker options taking a comma separated list of checker names as value * renamed debug-mode option to errors-only * started a reference user manual * new W0212 message for access to protected member from client code (close #14081) * new W0105 and W0106 messages extracted from W0104 (statement seems to have no effect) respectively when the statement is actually string (that's sometimes used instead of comments for documentation) or an empty statement generated by a useless semicolon * reclassified W0302 to C0302 * fix so that global messages are not anymore connected to the last analyzed module (close #10106) * fix some bugs related to local disabling of messages * fix cr/lf pb when generating the rc file on windows platforms What's New in Pylint 0.11.0? ============================ Release date: 2006-04-19 * fix crash caused by the exceptions checker in some case * fix some E1101 false positive with abstract method or classes defining __getattr__ * dirty fix to avoid "_socketobject" has not "connect" member. The actual problem is that astng isn't able to understand the code used to create socket.socket object with exec * added an option in the similarity checker to ignore docstrings, enabled by default * included patch from Benjamin Niemann to allow block level enabling/disabling of messages What's New in Pylint 0.10.0? ============================ Release date: 2006-03-06 * WARNING, this release include some configuration changes (see below), so you may have to check and update your own configuration file(s) if you use one * this release require the 0.15 version of astng or superior (it will save you a lot of pylint crashes...) * W0705 has been reclassified to E0701, and is now detecting more inheriting problem, and a false positive when empty except clause is following an Exception catch has been fixed (close #10422) * E0212 and E0214 (metaclass/class method should have mcs/cls as first argument have been reclassified to C0202 and C0203 since this not as well established as "self" for instance method (E0213) * W0224 has been reclassified into F0220 (failed to resolve interfaces implemented by a class) * a new typecheck checker, introducing the following checks: - E1101, access to unexistent member (implements #10430), remove the need of E0201 and so some options has been moved from the classes checker to this one - E1102, calling a non callable object - E1111 and W1111 when an assignment is done on a function call but the inferred function returns None (implements #10431) * change in the base checker: - checks module level and instance attribute names (new const-rgx and attr-rgx configuration option) (implements #10209 and #10440) - list comprehension and generator expression variables have their own regular expression (the inlinevar-rgx option) (implements #9146) - the C0101 check with its min-name-length option has been removed (this can be specified in the regxp after all...) - W0103 and W0121 are now handled by the variables checker (W0103 is now W0603 and W0604 has been splitted into different messages) - W0131 and W0132 messages have been reclassified to C0111 and C0112 respectively - new W0104 message on statement without effect * regexp support for dummy-variables (dummy-variables-rgx option replace dummy-variables) (implements #10027) * better global statement handling, see W0602, W0603, W0604 messages (implements #10344 and #10236) * --debug-mode option, disabling all checkers without error message and filtering others to only display error * fixed some R0201 (method could be a function) false positive What's New in Pylint 0.9.0? ============================ Release date: 2006-01-10 * a lot of updates to follow astng 0.14 API changes, so install logilab-astng 0.14 or greater before using this version of pylint * checker number 10 ! newstyle will search for problems regarding old style / new style classes usage problems (rely on astng 0.14 new style detection feature) * new 'load-plugins' options to load additional pylint plugins (usable from the command line or from a configuration file) (implements #10031) * check if a "pylintrc" file exists in the current working directory before using the one specified in the PYLINTRC environment variable or the default ~/.pylintrc or /etc/pylintrc * fixed W0706 (Identifier used to raise an exception is assigned...) false positive and reraising a catched exception instance * fixed E0611 (No name get in module blabla) false positive when accessing to a class'__dict__ * fixed some E0203 ("access to member before its definition") false positive * fixed E0214 ("metaclass method first argument should be mcs) false positive with staticmethod used on a metaclass * fixed packaging which was missing the test/regrtest_data directory * W0212 (method could be a function) has been reclassified in the REFACTOR category as R0201, and is no more considerer when a method overrides an abstract method from an ancestor class * include module name in W0401 (wildcard import), as suggested by Amaury * when using the '--parseable', path are written relative to the current working directory if in a sub-directory of it (#9789) * 'pylint --version' shows logilab-astng and logilab-common versions * fixed pylint.el to handle space in file names * misc lint style fixes What's New in Pylint 0.8.1? ============================ Release date: 2005-11-07 * fix "deprecated module" false positive when the code imports a module whose name starts with a deprecated module's name (close #10061) * fix "module has no name __dict__" false positive (close #10039) * fix "access to undefined variable __path__" false positive (close #10065) * fix "explicit return in __init__" false positive when return is actually in an inner function (close #10075) What's New in Pylint 0.8.0? ============================ Release date: 2005-10-21 * check names imported from a module exists in the module (E0611), patch contributed by Amaury Forgeot d'Arc * print a warning (W0212) for methods that could be a function (implements #9100) * new --defining-attr-methods option on classes checker * new --acquired-members option on the classes checker, used when --zope=yes to avoid false positive on acquired attributes (listed using this new option) (close #8616) * generate one E0602 for each use of an undefined variable (previously, only one for the first use but not for the following) (implements #1000) * make profile option saveable * fix Windows .bat file, patch contributed by Amaury Forgeot d'Arc * fix one more false positive for E0601 (access before definition) with for loop such as "for i in range(10): print i" (test func_noerror_defined_and_used_on_same_line) * fix false positive for E0201 (undefined member) when accessing to __name__ on a class object * fix astng checkers traversal order * fix bug in format checker when parsing a file from a platform using different new line characters (close #9239) * fix encoding detection regexp * fix --rcfile handling (support for --rcfile=file, close #9590) What's New in Pylint 0.7.0? ============================ Release date: 2005-05-27 * WARNING: pylint is no longer a logilab subpackage. Users may have to manually remove the old logilab/pylint directory. * introduce a new --additional-builtins option to handle user defined builtins * --reports option has now -r as short alias, and -i for --include-ids * fix a bug in the variables checker which may causing some false positives when variables are defined and used within the same statement (test func_noerror_defined_and_used_on_same_line) * this time, real fix of the "disable-msg in the config file" problem, test added to unittest_lint * fix bug with --list-messages and python -OO * fix possible false positive for W0201 What's New in Pylint 0.6.4? =========================== Release date: 2005-04-14 * allow to parse files without extension when a path is given on the command line (test noext) * don't fail if we are unable to read an inline option (e.g. inside a module), just produce an information message (test func_i0010) * new message E0103 for break or continue outside loop (close #8883, test func_continue_not_in_loop) * fix bug in the variables checker, causing non detection of some actual name error (close #8884, test func_nameerror_on_string_substitution) * fix bug in the classes checker which was making pylint crash if "object" is assigned in a class inheriting from it (test func_noerror_object_as_class_attribute) * fix problem with the similar checker when related options are defined in a configuration file * new --generate-man option to generate pylint's man page (require the latest logilab.common (>= 0.9.3) * packaged (generated...) man page What's New in Pylint 0.6.3? =========================== Release date: 2005-02-24 * fix scope problem which may cause false positive and true negative on E0602 * fix problem with some options such as disable-msg causing error when they are coming from the configuration file What's New in Pylint 0.6.2? ============================ Release date: 2005-02-16 * fix false positive on E0201 ("access to undefined member") with metaclasses * fix false positive on E0203 ("access to member before its definition") when attributes are defined in a parent class * fix false positive on W0706 ("identifier used to raise an exception assigned to...") * fix interpretation of "\t" as value for the indent-string configuration variable * fix --rcfile so that --rcfile=pylintrc (only --rcfile pylintrc was working in earlier release) * new raw checker example in the examples/ directory What's New in Pylint 0.6.1? =========================== Release date: 2005-02-04 * new --rcfile option to specify the configuration file without the PYLINTRC environment variable * added an example module for a custom pylint checker (see the example/ directory) * some fixes to handle fixes in common 0.9.1 (should however still working with common 0.9.0, even if upgrade is recommended) What's New in Pylint 0.6.0? =========================== Release date: 2005-01-20 * refix pylint emacs mode * no more traceback when just typing "pylint" * fix a bug which may cause crashes on resolving parent classes * fix problems with the format checker: don't chock on files containing multiple CR, avoid C0322, C0323, C0324 false positives with triple quoted string with quote inside * correctly detect access to member defined latter in __init__ method * now depends on common 0.8.1 to fix problem with interface resolution (close #8606) * new --list-msgs option describing available checkers and their messages * added windows specific documentation to the README file, contributed by Brian van den Broek * updated doc/features.txt (actually this file is now generated using the --list-msgs option), more entries into the FAQ * improved tests coverage What's New in Pylint 0.5.0? =========================== Release date: 2004-10-19 * avoid to import analyzed modules ! * new Refactor and Convention message categories. Some Warnings have been remaped into those new categories * added "similar", a tool to find copied and pasted lines of code, both using a specific command line tool and integrated as a pylint's checker * imports checker may report import dependencies as a dot graph * new checker regrouping most Refactor detection (with some new metrics) * more command line options storable in the configuration file * fix bug with total / undocumented number of methods What's New in Pylint 0.4.2? =========================== Release date: 2004-07-08 * fix pylint emacs mode * fix classes checkers to handler twisted interfaces What's New in Pylint 0.4.1? =========================== Release date: 2004-05-14 * fix the setup.py script to allow bdist_winst (well, the generated installer has not been tested...) with the necessary logilab/__init__.py file * fix file naming convention as suggested by Andreas Amoroso * fix stupid crash bug with bad method names What's New in Pylint 0.4.0? =========================== Release date: 2004-05-10 * fix file path with --parsable * --parsable option has been renamed to --parseable * added patch from Andreas Amoroso to output message to files instead of standard output * added Run to the list of correct variable names * fix variable names regexp and checking of local classes names * some basic handling of metaclasses * no-docstring-rgx apply now on classes too * new option to specify a different regexp for methods than for functions * do not display the evaluation report when no statements has been analysed * fixed crash with a class nested in a method * fixed format checker to deals with triple quoted string and lines with code and comment mixed * use logilab.common.ureports to layout reports What's New in Pylint 0.3.3? =========================== Release date: 2004-02-17 * added a parsable text output, used when the --parsable option is provided * added an emacs mode using this output, available in the distrib's elisp directory * fixed some typos in messages * change include-ids options to yn, and allow it to be in the configuration file * do not chock on corrupted stats files * fixed bug in the format checker which may stop pylint execution * provide scripts for unix and windows to wrap the minimal pylint tk gui What's New in Pylint 0.3.2? =========================== Release date: 2003-12-23 * html-escape messages in the HTML reporter (bug reported by Juergen Hermann) * added "TODO" to the list of default note tags * added "rexec" to the list of default deprecated modules * fixed typos in some messages What's New in Pylint 0.3.1? =========================== Release date: 2003-12-05 * bug fix in format and classes checkers * remove print statement from imports checkers * provide a simple tk gui, essentially useful for windows users What's New in Pylint 0.3.0? =========================== Release date: 2003-11-20 * new exceptions checker, checking for string exception and empty except clauses. * imports checker checks for reimport of modules * classes checker checks for calls to ancestor's __init__ and abstract method not overridden. It doesn't complain anymore for unused import in __init__ files, and provides a new option ignore-interface-methods, useful when you're using zope Interface implementation in your project * base checker checks for black listed builtins call (controled by the bad-functions option) and for use of * and ** * format checker checks for use of <> and "l" as long int marker * major internal API changes * use the rewrite of astng, based on compiler.ast * added unique id for messages, as suggested by Wolfgang Grafen * added unique id for reports * can take multiple modules or files as argument * new options command line options : --disable-msg, --enable-msg, --help-msg, --include-ids, --reports, --disable-report, --cache-size * --version shows the version of the python interpreter * removed some options which are now replaced by [en|dis]able-msg, or disable-report * read disable-msg and enable-msg options in source files (should be in comments on the top of the file, in the form "# pylint: disable-msg=W0402" * new message for modules importing themselves instead of the "cyclic import" message * fix bug with relative and cyclic imports * fix bug in imports checker (cycle was not always detected) * still fixes in format checker : don't check comment and docstring, check first line after an indent * black and white list now apply to all identifiers, not only variables, so changed the configuration option from (good|bad)-variable-names to (good|bad)-names * added string, rexec and Bastion to the default list of deprecated modules * do not print redefinition warning for function/class/method defined in mutually exclusive branches What's New in Pylint 0.2.1? =========================== Release date: 2003-10-10 * added some documentation, fixed some typos * set environment variable PYLINT_IMPORT to 1 during pylint execution. * check that variables "imported" using the global statement exist * indentation problems are now warning instead of errors * fix checkers.initialize to try to load all files with a known python extension (patch from wrobell) * fix a bunch of messages * fix sample configuration file * fix the bad-construction option * fix encoding checker * fix format checker What's New in Pylint 0.2.0? =========================== Release date: 2003-09-12 * new source encoding / FIXME checker (pep 263) * new --zope option which trigger Zope import. Useful to check Zope products code. * new --comment option which enable the evaluation note comment (disabled by default). * a ton of bug fixes * easy functional test infrastructure What's New in Pylint 0.1.2? =========================== Release date: 2003-06-18 * bug fix release * remove dependency to pyreverse What's New in Pylint 0.1.1? =========================== Release date: 2003-06-01 * much more functionalities ! What's New in Pylint 0.1? =========================== Release date: 2003-05-19 * initial release pylint-1.8.3/COPYING0000644000076500000240000004310513224376051014654 0ustar claudiustaff00000000000000 GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License. pylint-1.8.3/DEPENDS0000644000076500000240000000010613224376051014620 0ustar claudiustaff00000000000000python-logilab-common (>= 0.19.0) python-astroid (>= 1.3.6) python-tk pylint-1.8.3/doc/0000755000076500000240000000000013253004373014360 5ustar claudiustaff00000000000000pylint-1.8.3/doc/backlinks.rst0000644000076500000240000000063013224376051017055 0ustar claudiustaff00000000000000 Some projects using Pylint -------------------------- The following projects are known to use Pylint to help develop better Python code: * edX (https://github.com/edx) * qutebrowser (https://github.com/The-Compiler/qutebrowser) * Odoo (https://github.com/OCA) * Landscape.io (https://github.com/landscapeio/) * Codacy (https://github.com/Codacy/) * SaltStack (https://github.com/saltstack) * many more... pylint-1.8.3/doc/conf.py0000644000076500000240000001621613253004246015664 0ustar claudiustaff00000000000000# -*- coding: utf-8 -*- # # Pylint documentation build configuration file, created by # sphinx-quickstart on Thu Apr 4 20:31:25 2013. # # This file is execfile()d with the current directory set to its containing dir. # # Note that not all possible configuration values are present in this # autogenerated file. # # All configuration values have a default; values that are commented out # serve to show the default. import sys, os # If extensions (or modules to document with autodoc) are in another directory, # add these directories to sys.path here. If the directory is relative to the # documentation root, use os.path.abspath to make it absolute, like shown here. sys.path.append(os.path.abspath('exts')) # -- General configuration ----------------------------------------------------- # If your documentation needs a minimal Sphinx version, state it here. #needs_sphinx = '1.0' # Add any Sphinx extension module names here, as strings. They can be extensions # coming with Sphinx (named 'sphinx.ext.*') or your custom ones. extensions = [ 'pylint_features', 'pylint_extensions', 'sphinx.ext.autosectionlabel', 'sphinx.ext.intersphinx', ] # Add any paths that contain templates here, relative to this directory. templates_path = ['_templates'] # The suffix of source filenames. source_suffix = '.rst' # The encoding of source files. #source_encoding = 'utf-8-sig' # The master toctree document. master_doc = 'index' # General information about the project. project = u'Pylint' copyright = u'2003-2017, Logilab, PyCQA and contributors' # The version info for the project you're documenting, acts as replacement for # |version| and |release|, also used in various other places throughout the # built documents. # # The short X.Y version. from pylint.__pkginfo__ import version # The full version, including alpha/beta/rc tags. release = version # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. #language = None # There are two options for replacing |today|: either, you set today to some # non-false value, then it is used: #today = '' # Else, today_fmt is used as the format for a strftime call. #today_fmt = '%B %d, %Y' # List of patterns, relative to source directory, that match files and # directories to ignore when looking for source files. exclude_patterns = ['_build'] # The reST default role (used for this markup: `text`) to use for all documents. #default_role = None # If true, '()' will be appended to :func: etc. cross-reference text. #add_function_parentheses = True # If true, the current module name will be prepended to all description # unit titles (such as .. function::). #add_module_names = True # If true, sectionauthor and moduleauthor directives will be shown in the # output. They are ignored by default. #show_authors = False # The name of the Pygments (syntax highlighting) style to use. pygments_style = 'sphinx' # A list of ignored prefixes for module index sorting. #modindex_common_prefix = [] # -- Options for HTML output --------------------------------------------------- # The theme to use for HTML and HTML Help pages. See the documentation for # a list of builtin themes. html_theme = 'nature' # Theme options are theme-specific and customize the look and feel of a theme # further. For a list of options available for each theme, see the # documentation. #html_theme_options = {} # Add any paths that contain custom themes here, relative to this directory. #html_theme_path = [] # The name for this set of Sphinx documents. If None, it defaults to # " v documentation". #html_title = None # A shorter title for the navigation bar. Default is the same as html_title. #html_short_title = None # The name of an image file (relative to this directory) to place at the top # of the sidebar. #html_logo = None # The name of an image file (within the static path) to use as favicon of the # docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 # pixels large. #html_favicon = None # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, # so a file named "default.css" will overwrite the builtin "default.css". html_static_path = ['_static'] # If not '', a 'Last updated on:' timestamp is inserted at every page bottom, # using the given strftime format. #html_last_updated_fmt = '%b %d, %Y' # If true, SmartyPants will be used to convert quotes and dashes to # typographically correct entities. #html_use_smartypants = True # Custom sidebar templates, maps document names to template names. #html_sidebars = {} # Additional templates that should be rendered to pages, maps page names to # template names. #html_additional_pages = {} # If false, no module index is generated. #html_domain_indices = True # If false, no index is generated. #html_use_index = True # If true, the index is split into individual pages for each letter. #html_split_index = False # If true, links to the reST sources are added to the pages. #html_show_sourcelink = True # If true, "Created using Sphinx" is shown in the HTML footer. Default is True. #html_show_sphinx = True # If true, "(C) Copyright ..." is shown in the HTML footer. Default is True. #html_show_copyright = True # If true, an OpenSearch description file will be output, and all pages will # contain a tag referring to it. The value of this option must be the # base URL from which the finished HTML is served. #html_use_opensearch = '' # This is the file name suffix for HTML files (e.g. ".xhtml"). #html_file_suffix = None # Output file base name for HTML help builder. htmlhelp_basename = 'Pylintdoc' # -- Options for LaTeX output -------------------------------------------------- # The paper size ('letter' or 'a4'). #latex_paper_size = 'letter' # The font size ('10pt', '11pt' or '12pt'). #latex_font_size = '10pt' # Grouping the document tree into LaTeX files. List of tuples # (source start file, target name, title, author, documentclass [howto/manual]). latex_documents = [ ('index', 'Pylint.tex', u'Pylint Documentation', u'Logilab, PyCQA and contributors', 'manual'), ] # The name of an image file (relative to this directory) to place at the top of # the title page. #latex_logo = None # For "manual" documents, if this is true, then toplevel headings are parts, # not chapters. #latex_use_parts = False # If true, show page references after internal links. #latex_show_pagerefs = False # If true, show URL addresses after external links. #latex_show_urls = False # Additional stuff for the LaTeX preamble. #latex_preamble = '' # Documents to append as an appendix to all manuals. #latex_appendices = [] # If false, no module index is generated. #latex_domain_indices = True # -- Options for manual page output -------------------------------------------- # One entry per manual page. List of tuples # (source start file, name, description, authors, manual section). man_pages = [ ('index', 'pylint', u'Pylint Documentation', [u'Logilab, PyCQA and contributors'], 1) ] intersphinx_mapping = { 'astroid': ('http://astroid.readthedocs.io/en/latest/', None), 'python': ('https://docs.python.org/3', None), } pylint-1.8.3/doc/development_guide/0000755000076500000240000000000013253004373020057 5ustar claudiustaff00000000000000pylint-1.8.3/doc/development_guide/contribute.rst0000644000076500000240000001365113253004246022774 0ustar claudiustaff00000000000000.. -*- coding: utf-8 -*- ============== Contributing ============== Bug reports, feedback --------------------- You think you have found a bug in Pylint? Well, this may be the case since Pylint is under heavy development. Please take the time to check if it is already in the issue tracker at https://github.com/PyCQA/pylint If you cannot find it in the tracker, create a new issue there or discuss your problem on the code-quality@python.org mailing list. The code-quality mailing list is also a nice place to provide feedback about Pylint, since it is shared with other tools that aim at improving the quality of python code. Note that if you don't find something you have expected in Pylint's issue tracker, it may be because it is an issue with one of its dependencies, namely astroid: * https://github.com/PyCQA/astroid Mailing lists ------------- You can subscribe to this mailing list at http://mail.python.org/mailman/listinfo/code-quality Archives are available at http://mail.python.org/pipermail/code-quality/ Archives before April 2013 are available at http://lists.logilab.org/pipermail/python-projects/ .. _repository: Repository ---------- Pylint is developed using the git_ distributed version control system. You can clone Pylint and its dependencies from :: git clone https://github.com/PyCQA/pylint git clone https://github.com/PyCQA/astroid .. _git: https://git-scm.com/ Got a change for Pylint? Below are a few steps you should take to make sure your patch gets accepted. - Test your code - Pylint is very well tested, with a high good code coverage. It has two types of tests, usual unittests and functional tests. The usual unittests can be found under `/test` directory and they can be used for testing almost anything Pylint related. But for the ease of testing Pylint's messages, we also have the concept of functional tests. - You should also run all the tests to ensure that your change isn't breaking one. You can run the tests using the tox_ package, as in:: python -m tox python -m tox -epy27 # for Python 2.7 suite only python -m tox -epylint # for running Pylint over Pylint's codebase - To run only a specific test suite, use a pattern for the test filename (**without** the ``.py`` extension), as in:: python -m tox -e py27 -- -k test_functional python -m tox -e py27 -- -k \*func\* - Add a short entry to the ChangeLog describing the change, except for internal implementation only changes. Not usually required, but for changes other than small bugs we also add a couple of sentences in the release document for that release, (`What's New` section) - Add yourself to the `CONTRIBUTORS` file, if you are not already there. - Write a comprehensive commit message - Relate your change to an issue in the tracker if such an issue exists (see `Closing issues via commit messages`_ of the GitHub documentation for more information on this) - Document your change, if it is a non-trivial one. - Send a pull request from GitHub (see `About pull requests`_ for more insight about this topic) .. _functional_tests: Functional Tests ---------------- These are residing under '/test/functional' and they are formed of multiple components. First, each Python file is considered to be a test case and it should be accompanied by a .txt file, having the same name, with the messages that are supposed to be emitted by the given test file. In the Python file, each line for which Pylint is supposed to emit a message has to be annotated with a comment in the form ``# [message_symbol]``, as in:: a, b, c = 1 # [unbalanced-tuple-unpacking] If multiple messages are expected on the same line, then this syntax can be used:: a, b, c = 1.test # [unbalanced-tuple-unpacking, no-member] The syntax of the .txt file has to be this:: symbol:line_number:function_or_class:Expected message For example, this is a valid message line:: abstract-class-instantiated:79:main:Abstract class 'BadClass' with abstract methods instantiated If the Python file is expected to not emit any errors, then the .txt file has to be empty. If you need special control over Pylint's flag, you can also create a .rc file, which can have sections of Pylint's configuration. During development, it's sometimes helpful to run all functional tests in your current environment in order to have faster feedback. Run with:: python pylint/test/test_functional.py .. _`Closing issues via commit messages`: https://help.github.com/articles/closing-issues-via-commit-messages/ .. _`About pull requests`: https://help.github.com/articles/using-pull-requests/ .. _tox: http://tox.readthedocs.io/en/latest/ Tips for Getting Started with Pylint Development ------------------------------------------------ * Read the :ref:`technical-reference`. It gives a short walkthrough of the pylint codebase and will help you identify where you will need to make changes for what you are trying to implement. * :func:`astroid.extract_node` is your friend. Most checkers are AST based, so you will likely need to interact with :mod:`astroid`. A short example of how to use :func:`astroid.extract_node` is given :ref:`here `. * When fixing a bug for a specific check, search the code for the warning message to find where the warning is raised, and therefore where the logic for that code exists. A Typical Development Workflow ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #. Create a virtualenv in which to work:: $ tox #. Write the tests. See :ref:`functional_tests`. #. Check that the tests fail:: $ tox #. Fix pylint! #. Make sure your tests pass:: $ tox It is also possible to give tox a `pytest specifier `_ to run only your test:: $ tox pylint/test/test_functional.py::test_functional #. Package up and submit your changes as outlined in `repository`_. pylint-1.8.3/doc/development_guide/documentation.rst0000644000076500000240000000065613224376051023474 0ustar claudiustaff00000000000000.. -*- coding: utf-8 -*- ============== Building the documentation ============== When you would want to build the documentation for your self, you certainly can. Here's how... The bare minimum ---------------- .. sourcecode:: bash $ python3 -m virtualenv venv $ . venv/bin/activate $ pip install Sphinx $ git clone https://github.com/PyCQA/pylint $ cd pylint $ python3 setup.py install $ cd doc $ make html pylint-1.8.3/doc/development_guide/index.rst0000644000076500000240000000014713224376051021725 0ustar claudiustaff00000000000000 Development =========== .. toctree:: :maxdepth: 2 :titlesonly: contribute documentation pylint-1.8.3/doc/exts/0000755000076500000240000000000013253004373015343 5ustar claudiustaff00000000000000pylint-1.8.3/doc/exts/pylint_extensions.py0000755000076500000240000001011413246205362021516 0ustar claudiustaff00000000000000#!/usr/bin/env python # Licensed under the GPL: https://www.gnu.org/licenses/old-licenses/gpl-2.0.html # For details: https://github.com/PyCQA/pylint/blob/master/COPYING """Script used to generate the extensions file before building the actual documentation.""" import os import re import sys import pkg_resources import six import sphinx from pylint.lint import PyLinter # Some modules have been renamed and deprecated under their old names. # Skip documenting these modules since: # 1) They are deprecated, why document them moving forward? # 2) We can't load the deprecated module and the newly renamed module at the # same time without getting naming conflicts DEPRECATED_MODULES = [ 'check_docs', # ==> docparams ] def builder_inited(app): """Output full documentation in ReST format for all extension modules""" # PACKAGE/docs/exts/pylint_extensions.py --> PACKAGE/ base_path = os.path.dirname( os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) # PACKAGE/ --> PACKAGE/pylint/extensions ext_path = os.path.join(base_path, 'pylint', 'extensions') modules = [] doc_files = {} for filename in os.listdir(ext_path): name, ext = os.path.splitext(filename) if name[0] == '_' or name in DEPRECATED_MODULES: continue if ext == '.py': modules.append('pylint.extensions.%s' % name) elif ext == '.rst': doc_files['pylint.extensions.' + name] = os.path.join(ext_path, filename) modules.sort() if not modules: sys.exit("No Pylint extensions found?") linter = PyLinter() linter.load_plugin_modules(modules) extensions_doc = os.path.join(base_path, 'doc', 'technical_reference', 'extensions.rst') with open(extensions_doc, 'w') as stream: stream.write("Optional Pylint checkers in the extensions module\n") stream.write("=================================================\n\n") stream.write("Pylint provides the following optional plugins:\n\n") for module in modules: stream.write("- :ref:`{0}`\n".format(module)) stream.write("\n") stream.write("You can activate any or all of these extensions " "by adding a ``load-plugins`` line to the ``MASTER`` " "section of your ``.pylintrc``, for example::\n") stream.write("\n load-plugins=pylint.extensions.docparams," "pylint.extensions.docstyle\n\n") by_module = get_plugins_info(linter, doc_files) for module, info in sorted(six.iteritems(by_module)): linter._print_checker_doc(info['name'], info, stream=stream) def get_plugins_info(linter, doc_files): by_module = {} for checker in linter.get_checkers(): if checker.name == 'master': continue module = checker.__module__ # Plugins only - skip over core checkers if re.match("pylint.checkers", module): continue # Find any .rst documentation associated with this plugin doc = "" doc_file = doc_files.get(module) if doc_file: with open(doc_file, 'r') as f: doc = f.read() try: by_module[module]['options'] += checker.options_and_values() by_module[module]['msgs'].update(checker.msgs) by_module[module]['reports'] += checker.reports by_module[module]['doc'] += doc by_module[module]['name'] += checker.name by_module[module]['module'] += module except KeyError: by_module[module] = { 'options': list(checker.options_and_values()), 'msgs': dict(checker.msgs), 'reports': list(checker.reports), 'doc': doc, 'name': checker.name, 'module': module, } return by_module def setup(app): app.connect('builder-inited', builder_inited) return {'version': sphinx.__display_version__} if __name__ == "__main__": builder_inited(None) pylint-1.8.3/doc/exts/pylint_features.py0000755000076500000240000000207013246205362021137 0ustar claudiustaff00000000000000#!/usr/bin/env python # Licensed under the GPL: https://www.gnu.org/licenses/old-licenses/gpl-2.0.html # For details: https://github.com/PyCQA/pylint/blob/master/COPYING """Script used to generate the features file before building the actual documentation.""" import os import sys import sphinx from pylint.lint import PyLinter def builder_inited(app): # PACKAGE/docs/exts/pylint_extensions.py --> PACKAGE/ base_path = os.path.dirname( os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) linter = PyLinter() linter.load_default_plugins() features = os.path.join(base_path, 'doc', 'technical_reference', 'features.rst') with open(features, 'w') as stream: stream.write("Pylint features\n") stream.write("===============\n\n") stream.write(".. generated by pylint --full-documentation\n\n") linter.print_full_documentation(stream) def setup(app): app.connect('builder-inited', builder_inited) return {'version': sphinx.__display_version__} if __name__ == "__main__": builder_inited(None) pylint-1.8.3/doc/faq.rst0000644000076500000240000002037113253004246015663 0ustar claudiustaff00000000000000.. -*- coding: utf-8 -*- .. _faq: ========================== Frequently Asked Questions ========================== 1. About Pylint =============== 1.1 What is Pylint? -------------------- Pylint is a `static code checker`_, meaning it can analyse your code without actually running it. Pylint checks for errors, tries to enforce a coding standard, and tries to enforce a coding style. .. _`static code checker`: http://en.wikipedia.org/wiki/Static_code_analysis 2. Installation =============== 2.1 How do I install Pylint? ---------------------------- Everything should be explained on :ref:`installation`. 2.2 What kind of versioning system does Pylint use? --------------------------------------------------- Pylint uses the git distributed version control system. The URL of the repository is: https://github.com/PyCQA/pylint . To get the latest version of Pylint from the repository, simply invoke :: git clone https://github.com/PyCQA/pylint .. _git: http://git-scm.com/ 2.3 What are Pylint's dependencies? ----------------------------------- Pylint depends on astroid_ and a couple of other packages. It should be compatible with any Python version greater than 2.7.0 and it is also working on PyPy. .. _`astroid`: https://github.com/PyCQA/astroid 2.4 What versions of Python is Pylint supporting? -------------------------------------------------- Since Pylint 1.8, we support only Python 2.7 and Python 3.4+. If code uses new Python 3.6 syntax, minimal required version is Pylint 1.7. Using this strategy really helps in maintaining a code base compatible with both versions and from this benefits not only the maintainers, but the end users as well, because it's easier to add and test new features. 3. Running Pylint ================= 3.1 Can I give pylint a file as an argument instead of a module? ----------------------------------------------------------------- Pylint expects the name of a package or module as its argument. As a convenience, you can give it a file name if it's possible to guess a module name from the file's path using the python path. Some examples : "pylint mymodule.py" should always work since the current working directory is automatically added on top of the python path "pylint directory/mymodule.py" will work if "directory" is a python package (i.e. has an __init__.py file), an implicit namespace package or if "directory" is in the python path. "pylint /whatever/directory/mymodule.py" will work if either: - "/whatever/directory" is in the python path - your cwd is "/whatever/directory" - "directory" is a python package and "/whatever" is in the python path - "directory" is an implicit namespace package and is in the python path. - "directory" is a python package and your cwd is "/whatever" and so on... 3.2 Where is the persistent data stored to compare between successive runs? ---------------------------------------------------------------------------- Analysis data are stored as a pickle file in a directory which is localized using the following rules: * value of the PYLINTHOME environment variable if set * ".pylint.d" subdirectory of the user's home directory if it is found (not always findable on Windows platforms) * ".pylint.d" directory in the current directory 3.3 How do I find the option name (for pylintrc) corresponding to a specific command line option? -------------------------------------------------------------------------------------------------------- You can always generate a sample pylintrc file with --generate-rcfile Every option present on the command line before this will be included in the rc file For example:: pylint --disable=bare-except,invalid-name --class-rgx='[A-Z][a-z]+' --generate-rcfile 3.4 I'd rather not run Pylint from the command line. Can I integrate it with my editor? --------------------------------------------------------------------------------------- Much probably. Read :ref:`ide-integration` 4. Message Control ================== 4.1 Is it possible to locally disable a particular message? ----------------------------------------------------------- Yes, this feature has been added in Pylint 0.11. This may be done by adding "#pylint: disable=some-message,another-one" at the desired block level or at the end of the desired line of code 4.2 Is there a way to disable a message for a particular module only? --------------------------------------------------------------------- Yes, you can disable or enable (globally disabled) messages at the module level by adding the corresponding option in a comment at the top of the file: :: # pylint: disable=wildcard-import, method-hidden # pylint: enable=too-many-lines 4.3 How can I tell Pylint to never check a given module? -------------------------------------------------------- With Pylint < 0.25, add "#pylint: disable-all" at the beginning of the module. Pylint 0.26.1 and up have renamed that directive to "#pylint: skip-file" (but the first version will be kept for backward compatibility). In order to ease finding which modules are ignored an Information-level message `file-ignored` is emitted. With recent versions of Pylint, if you use the old syntax, an additional `deprecated-disable-all` message is emitted. 4.4 Do I have to remember all these numbers? -------------------------------------------- No, starting from 0.25.3, you can use symbolic names for messages:: # pylint: disable=fixme, line-too-long 4.5 I have a callback function where I have no control over received arguments. How do I avoid getting unused argument warnings? ---------------------------------------------------------------------------------------------------------------------------------- Prefix (ui) the callback's name by `cb_`, as in cb_onclick(...). By doing so arguments usage won't be checked. Another solution is to use one of the names defined in the "dummy-variables" configuration variable for unused argument ("_" and "dummy" by default). 4.6 What is the format of the configuration file? --------------------------------------------------- Pylint uses ConfigParser from the standard library to parse the configuration file. It means that if you need to disable a lot of messages, you can use tricks like: :: # disable wildcard-import, method-hidden and too-many-lines because I do # not want it disable= wildcard-import, method-hidden, too-many-lines 4.7 Why are there a bunch of messages disabled by default? ---------------------------------------------------------- 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. 5. Classes and Inheritance ========================== 5.1 When is Pylint considering a class as an abstract class? ------------------------------------------------------------- A class is considered as an abstract class if at least one of its methods is doing nothing but raising NotImplementedError. 5.2 How do I avoid "access to undefined member" messages in my mixin classes? ------------------------------------------------------------------------------- To do so you have to set the ignore-mixin-members option to "yes" (this is the default value) and to name your mixin class with a name which ends with "mixin" (whatever case). 6. Troubleshooting ================== 6.1 Pylint gave my code a negative rating out of ten. That can't be right! -------------------------------------------------------------------------- Even though the final rating Pylint renders is nominally out of ten, there's no lower bound on it. By default, the formula to calculate score is :: 10.0 - ((float(5 * error + warning + refactor + convention) / statement) * 10) However, this option can be changed in the Pylint rc file. If having negative values really bugs you, you can set the formula to be the maximum of 0 and the above expression. 6.2 I think I found a bug in Pylint. What should I do? ------------------------------------------------------- Read :ref:`Bug reports, feedback` 6.3 I have a question about Pylint that isn't answered here. ------------------------------------------------------------ Read :ref:`Mailing lists` pylint-1.8.3/doc/how_tos/0000755000076500000240000000000013253004373016042 5ustar claudiustaff00000000000000pylint-1.8.3/doc/how_tos/custom_checkers.rst0000644000076500000240000002251413246205362021764 0ustar claudiustaff00000000000000.. _write_a_checker: How to Write a Checker ====================== You can find some simple examples in the distribution (`custom.py `_ and `custom_raw.py `_). .. TODO Create custom_token.py There are three kinds of checkers: * Raw checkers, which analyse each module as a raw file stream. * Token checkers, which analyse a file using the list of tokens that represent the source code in the file. * AST checkers, which work on an AST representation of the module. The AST representation is provided by the :mod:`astroid` library. :mod:`astroid` adds additional information and methods over :mod:`ast` in the standard library, to make tree navigation and code introspection easier. .. TODO Writing a Raw Checker .. TODO Writing a Token Checker Writing an AST Checker ---------------------- Let's implement a checker to make sure that all ``return`` nodes in a function return a unique constant. Firstly we will need to fill in some required boilerplate: .. code-block:: python import astroid from pylint.checkers import BaseChecker from pylint.interfaces import IAstroidChecker class UniqueReturnChecker(BaseChecker): __implements__ = IAstroidChecker name = 'unique-returns' priority = -1 msgs = { 'W0001': ( 'Returns a non-unique constant.', 'non-unique-returns', 'All constants returned in a function should be unique.' ), } options = ( ( 'ignore-ints', { 'default': False, 'type': 'yn', 'metavar' : '', 'help': 'Allow returning non-unique integers', } ), ) So far we have defined the following required components of our checker: * A name. The name is used to generate a special configuration section for the checker, when options have been provided. * A priority. This must be to be lower than 0. The checkers are ordered by the priority when run, from the most negative to the most positive. * A message dictionary. Each checker is being used for finding problems in your code, the problems being displayed to the user through **messages**. The message dictionary should specify what messages the checker is going to emit. It has the following format:: msgs = { 'message-id': ( 'displayed-message', 'message-symbol', 'message-help' ) } * The ``message-id`` should be a 5-digit number, prefixed with a **message category**. There are multiple message categories, these being ``C``, ``W``, ``E``, ``F``, ``R``, standing for ``Convention``, ``Warning``, ``Error``, ``Fatal`` and ``Refactoring``. The rest of the 5 digits should not conflict with existing checkers and they should be consistent across the checker. For instance, the first two digits should not be different across the checker. * The ``displayed-message`` is used for displaying the message to the user, once it is emitted. * The ``message-symbol`` is an alias of the message id and it can be used wherever the message id can be used. * The ``message-help`` is used when calling ``pylint --help-msg``. We have also defined an optional component of the checker. The options list defines any user configurable options. It has the following format:: options = ( 'option-symbol': {'argparse-like-kwarg': 'value'}, ) * The ``option-symbol`` is a unique name for the option. This is used on the command line and in config files. The hyphen is replaced by an underscore when used in the checker, similarly to how you would use :class:`argparse.Namespace`. Next we'll track when we enter and leave a function. .. code-block:: python def __init__(self, linter=None): super(UniqueReturnChecker, self).__init__(linter) self._function_stack = [] def visit_functiondef(self, node): self._function_stack.append([]) def leave_functiondef(self, node): self._function_stack.pop() In the constructor we initialise a stack to keep a list of return nodes for each function. An AST checker is a visitor, and should implement ``visit_`` or ``leave_`` methods for the nodes it's interested in. In this case we have implemented ``visit_functiondef`` and ``leave_functiondef`` to add a new list of return nodes for this function, and to remove the list of return nodes when we leave the function. Finally we'll implement the check. We will define a ``visit_return`` function, which is called with a :class:`.astroid.node_classes.Return` node. .. _astroid_extract_node: .. TODO We can shorten/remove this bit once astroid has API docs. We'll need to be able to figure out what attributes a :class:`.astroid.node_classes.Return` node has available. We can use :func:`astroid.extract_node` for this:: >>> node = astroid.extract_node("return 5") >>> node >>> help(node) >>> node.value We could also construct a more complete example:: >>> node_a, node_b = astroid.extract_node(""" ... def test(): ... if True: ... return 5 #@ ... return 5 #@ """) >>> node_a.value >>> node_a.value.value 5 >>> node_a.value.value == node_b.value.value True For :func:`astroid.extract_node`, you can use ``#@`` at the end of a line to choose which statements will be extracted into nodes. For more information on :func:`astroid.extract_node`, see the `astroid documentation `_. Now we know how to use the astroid node, we can implement our check. .. code-block:: python def visit_return(self, node): if not isinstance(node.value, astroid.node_classes.Const): return for other_return in self._function_stack[-1]: if (node.value.value == other_return.value.value and not (self.config.ignore_ints and node.value.pytype() == int)): self.add_message( 'non-unique-returns', node=node, ) self._function_stack[-1].append(node) Once we have established that the source code has failed our check, we use :func:`~.BaseChecker.add_message` to emit our failure message. Finally, we need to register the checker with pylint. Add the ``register`` function to the top level of the file. .. code-block:: python def register(linter): linter.register_checker(UniqueReturnChecker(linter)) We are now ready to debug and test our checker! Debugging a Checker ------------------- It is very simple to get to a point where we can use :mod:`pdb`. We'll need a small test case. Put the following into a Python file: .. code-block:: python def test(): if True: return 5 return 5 def test2(): if True: return 1 return 5 After inserting pdb into our checker and installing it, we can run pylint with only our checker:: $ pylint --load-plugins=my_plugin --disable=all --enable=non-unique-returns test.py (Pdb) Now we can debug our checker! .. Note:: ``my_plugin`` refers to a module called ``my_plugin.py``. This module can be made available to pylint by putting this module's parent directory in your ``PYTHONPATH`` environment variable or by adding the ``my_plugin.py`` file to the ``pylint/checkers`` directory if running from source. Testing a Checker ----------------- Pylint is very well suited to test driven development. You can implement the template of the checker, produce all of your test cases and check that they fail, implement the checker, then check that all of your test cases work. Pylint provides a :class:`pylint.testutils.CheckerTestCase` to make test cases very simple. We can use the example code that we used for debugging as our test cases. .. code-block:: python import my_plugin import pylint.testutils class TestUniqueReturnChecker(pylint.testutils.CheckerTestCase): CHECKER_CLASS = my_plugin.UniqueReturnChecker def test_finds_non_unique_ints(self): func_node, return_node_a, return_node_b = astroid.extract_node(""" def test(): #@ if True: return 5 #@ return 5 #@ """) self.checker.visit_functiondef(func_node) self.checker.visit_return(return_node_a) with self.assertAddsMessages( pylint.testutils.Message( msg_id='non-unique-returns', node=return_node_b, ), ): self.checker.visit_return(return_node_b) def test_ignores_unique_ints(self): func_node, return_node_a, return_node_b = astroid.extract_node(""" def test(): #@ if True: return 1 #@ return 5 #@ """) with self.assertNoMessages(): self.checker.visit_functiondef(func_node) self.checker.visit_return(return_node_a) self.checker.visit_return(return_node_b) Once again we are using :func:`astroid.extract_node` to construct our test cases. :class:`pylint.testutils.CheckerTestCase` has created the linter and checker for us, we simply simulate a traversal of the AST tree using the nodes that we are interested in. pylint-1.8.3/doc/how_tos/index.rst0000644000076500000240000000017613246205362017712 0ustar claudiustaff00000000000000How To Guides ============= .. toctree:: :maxdepth: 2 :titlesonly: custom_checkers plugins transform_plugins pylint-1.8.3/doc/how_tos/plugins.rst0000644000076500000240000000256413246205362020267 0ustar claudiustaff00000000000000.. -*- coding: utf-8 -*- How To Write a Pylint Plugin ============================ Pylint provides support for writing two types of extensions. First, there is the concept of **checkers**, which can be used for finding problems in your code. Secondly, there is also the concept of **transform plugin**, which represents a way through which the inference and the capabilities of Pylint can be enhanced and tailored to a particular module, library of framework. In general, a plugin is a module which should have a function ``register``, which takes an instance of ``pylint.lint.PyLinter`` as input. So a basic hello-world plugin can be implemented as: .. sourcecode:: python # Inside hello_plugin.py def register(linter): print 'Hello world' We can run this plugin by placing this module in the PYTHONPATH and invoking **pylint** as: .. sourcecode:: bash $ pylint -E --load-plugins hello_plugin foo.py Hello world Depending if we need a **transform plugin** or a **checker**, this might not be enough. For the former, this is enough to declare the module as a plugin, but in the case of the latter, we need to register our checker with the linter object, by calling the following inside the ``register`` function:: linter.register_checker(OurChecker(linter)) For more information on writing a checker see :ref:`write_a_checker`. pylint-1.8.3/doc/how_tos/transform_plugins.rst0000644000076500000240000000754513246205362022366 0ustar claudiustaff00000000000000 Transform plugins ^^^^^^^^^^^^^^^^^ Why write a plugin? ------------------- Pylint is a static analysis tool and Python is a dynamically typed language. So there will be cases where Pylint cannot analyze files properly (this problem can happen in statically typed languages also if reflection or dynamic evaluation is used). The plugins are a way to tell Pylint how to handle such cases, since only the user would know what needs to be done. They are usually operating on the AST level, by modifying or changing it in a way which can ease its understanding by Pylint. Example ------- Let us run Pylint on a module from the Python source: `warnings.py`_ and see what happens: .. sourcecode:: bash amitdev$ pylint -E Lib/warnings.py E:297,36: Instance of 'WarningMessage' has no 'message' member (no-member) E:298,36: Instance of 'WarningMessage' has no 'filename' member (no-member) E:298,51: Instance of 'WarningMessage' has no 'lineno' member (no-member) E:298,64: Instance of 'WarningMessage' has no 'line' member (no-member) Did we catch a genuine error? Let's open the code and look at ``WarningMessage`` class: .. sourcecode:: python class WarningMessage(object): """Holds the result of a single showwarning() call.""" _WARNING_DETAILS = ("message", "category", "filename", "lineno", "file", "line") def __init__(self, message, category, filename, lineno, file=None, line=None): local_values = locals() for attr in self._WARNING_DETAILS: setattr(self, attr, local_values[attr]) self._category_name = category.__name__ if category else None def __str__(self): ... Ah, the fields (``message``, ``category`` etc) are not defined statically on the class. Instead they are added using ``setattr``. Pylint would have a tough time figuring this out. Enter Plugin ------------ We can write a transform plugin to tell Pylint how to analyze this properly. One way to fix our example with a plugin would be to transform the ``WarningMessage`` class, by setting the attributes so that Pylint can see them. This can be done by registering a transform function. We can transform any node in the parsed AST like Module, Class, Function etc. In our case we need to transform a class. It can be done so: .. sourcecode:: python import astroid from astroid import MANAGER def register(linter): # Needed for registering the plugin. pass def transform(cls): if cls.name == 'WarningMessage': import warnings for f in warnings.WarningMessage._WARNING_DETAILS: cls.locals[f] = [astroid.Class(f, None)] MANAGER.register_transform(astroid.Class, transform) Let's go through the plugin. First, we need to register a class transform, which is done via the ``register_transform`` function in ``MANAGER``. It takes the node type and function as parameters. We need to change a class, so we use ``astroid.Class``. We also pass a ``transform`` function which does the actual transformation. ``transform`` function is simple as well. If the class is ``WarningMessage`` then we add the attributes to its locals (we are not bothered about type of attributes, so setting them as class will do. But we could set them to any type we want). That's it. Note: We don't need to do anything in the ``register`` function of the plugin since we are not modifying anything in the linter itself. Lets run Pylint with this plugin and see: .. sourcecode:: bash amitdev$ pylint -E --load-plugins warning_plugin Lib/warnings.py amitdev$ All the false positives associated with ``WarningMessage`` are now gone. This is just an example, any code transformation can be done by plugins. See `astroid/brain`_ for real life examples of transform plugins. .. _`warnings.py`: http://hg.python.org/cpython/file/2.7/Lib/warnings.py .. _`astroid/brain`: https://github.com/PyCQA/astroid/tree/master/astroid/brain pylint-1.8.3/doc/index.rst0000644000076500000240000000040613246205362016224 0ustar claudiustaff00000000000000 Pylint User Manual ================== .. toctree:: :maxdepth: 2 :titlesonly: intro tutorial user_guide/index.rst how_tos/index.rst technical_reference/index.rst development_guide/index.rst faq backlinks whatsnew/index.rst pylint-1.8.3/doc/intro.rst0000644000076500000240000000462613224376051016260 0ustar claudiustaff00000000000000.. -*- coding: utf-8 -*- ============== Introduction ============== What is Pylint? --------------- Pylint is a tool that checks for errors in Python code, tries to enforce a coding standard and looks for code smells. It can also look for certain type errors, it can recommend suggestions about how particular blocks can be refactored and can offer you details about the code's complexity. Other similar projects would include the now defunct pychecker_, pyflakes_, flake8_ and mypy_. The default coding style used by Pylint is close to `PEP 008`_. Pylint will display a number of messages as it analyzes the code and it can also be used for displaying some statistics about the number of warnings and errors found in different files. The messages are classified under various categories such as errors and warnings. Last but not least, the code is given an overall mark, based on the number and severity of the warnings and errors. .. _pychecker: http://pychecker.sf.net .. _pyflakes: https://github.com/pyflakes/pyflakes .. _flake8: https://gitlab.com/pycqa/flake8/ .. _mypy: https://github.com/JukkaL/mypy .. _`PEP 008`: http://www.python.org/dev/peps/pep-0008/ .. _`Guido's style guide`: http://www.python.org/doc/essays/styleguide.html .. _`refactoring book`: http://www.refactoring.com/ What Pylint is not? ------------------- What Pylint says is not to be taken as gospel and Pylint isn't smarter than you are: it may warn you about things that you have conscientiously done. Pylint tries hard to report as few false positives as possible for errors, but it may be too verbose with warnings. That's for example because it tries to detect things that may be dangerous in a context, but are not in others, or because it checks for some things that you don't care about. Generally, you shouldn't expect Pylint to be totally quiet about your code, so don't necessarily be alarmed if it gives you a hell lot of messages for your project! The best way to tackle pylint's verboseness is to: * enable or disable the messages or message categories that you want to be activated or not for when pylint is analyzing your code. This can be done easily through a command line flag. For instance, disabling all convention messages is simple as a ``--disable=C`` option added to pylint command. * create a custom configuration file, tailored to your needs. You can generate one using pylint's command ``--generate-rcfile``. pylint-1.8.3/doc/make.bat0000644000076500000240000001250513224376051015773 0ustar claudiustaff00000000000000@ECHO OFF REM Command file for Sphinx documentation if "%SPHINXBUILD%" == "" ( set SPHINXBUILD=sphinx-build ) set BUILDDIR=_build set ALLSPHINXOPTS=-d %BUILDDIR%/doctrees %SPHINXOPTS% . set I18NSPHINXOPTS=%SPHINXOPTS% . if NOT "%PAPER%" == "" ( set ALLSPHINXOPTS=-D latex_paper_size=%PAPER% %ALLSPHINXOPTS% set I18NSPHINXOPTS=-D latex_paper_size=%PAPER% %I18NSPHINXOPTS% ) if "%1" == "" goto help if "%1" == "help" ( :help echo.Please use `make ^` where ^ is one of echo. html to make standalone HTML files echo. dirhtml to make HTML files named index.html in directories echo. singlehtml to make a single large HTML file echo. pickle to make pickle files echo. json to make JSON files echo. htmlhelp to make HTML files and a HTML help project echo. qthelp to make HTML files and a qthelp project echo. devhelp to make HTML files and a Devhelp project echo. epub to make an epub echo. latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter echo. text to make text files echo. man to make manual pages echo. texinfo to make Texinfo files echo. gettext to make PO message catalogs echo. changes to make an overview over all changed/added/deprecated items echo. linkcheck to check all external links for integrity echo. doctest to run all doctests embedded in the documentation if enabled goto end ) if "%1" == "clean" ( for /d %%i in (%BUILDDIR%\*) do rmdir /q /s %%i del /q /s %BUILDDIR%\* goto end ) if "%1" == "html" ( rm -f features.rst echo Pylint features > reference_guide/features.rst echo =============== >> reference_guide/features.rst echo >> reference_guide/features.rst echo .. generated by pylint --full-documentation >> reference_guide/features.rst echo >> reference_guide/features.rst python -m pylint --full-documentation >> reference_guide/features.rst %SPHINXBUILD% -b html %ALLSPHINXOPTS% %BUILDDIR%/html if errorlevel 1 exit /b 1 echo. echo.Build finished. The HTML pages are in %BUILDDIR%/html. goto end ) if "%1" == "dirhtml" ( %SPHINXBUILD% -b dirhtml %ALLSPHINXOPTS% %BUILDDIR%/dirhtml if errorlevel 1 exit /b 1 echo. echo.Build finished. The HTML pages are in %BUILDDIR%/dirhtml. goto end ) if "%1" == "singlehtml" ( %SPHINXBUILD% -b singlehtml %ALLSPHINXOPTS% %BUILDDIR%/singlehtml if errorlevel 1 exit /b 1 echo. echo.Build finished. The HTML pages are in %BUILDDIR%/singlehtml. goto end ) if "%1" == "pickle" ( %SPHINXBUILD% -b pickle %ALLSPHINXOPTS% %BUILDDIR%/pickle if errorlevel 1 exit /b 1 echo. echo.Build finished; now you can process the pickle files. goto end ) if "%1" == "json" ( %SPHINXBUILD% -b json %ALLSPHINXOPTS% %BUILDDIR%/json if errorlevel 1 exit /b 1 echo. echo.Build finished; now you can process the JSON files. goto end ) if "%1" == "htmlhelp" ( %SPHINXBUILD% -b htmlhelp %ALLSPHINXOPTS% %BUILDDIR%/htmlhelp if errorlevel 1 exit /b 1 echo. echo.Build finished; now you can run HTML Help Workshop with the ^ .hhp project file in %BUILDDIR%/htmlhelp. goto end ) if "%1" == "qthelp" ( %SPHINXBUILD% -b qthelp %ALLSPHINXOPTS% %BUILDDIR%/qthelp if errorlevel 1 exit /b 1 echo. echo.Build finished; now you can run "qcollectiongenerator" with the ^ .qhcp project file in %BUILDDIR%/qthelp, like this: echo.^> qcollectiongenerator %BUILDDIR%\qthelp\a.qhcp echo.To view the help file: echo.^> assistant -collectionFile %BUILDDIR%\qthelp\a.ghc goto end ) if "%1" == "devhelp" ( %SPHINXBUILD% -b devhelp %ALLSPHINXOPTS% %BUILDDIR%/devhelp if errorlevel 1 exit /b 1 echo. echo.Build finished. goto end ) if "%1" == "epub" ( %SPHINXBUILD% -b epub %ALLSPHINXOPTS% %BUILDDIR%/epub if errorlevel 1 exit /b 1 echo. echo.Build finished. The epub file is in %BUILDDIR%/epub. goto end ) if "%1" == "latex" ( %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex if errorlevel 1 exit /b 1 echo. echo.Build finished; the LaTeX files are in %BUILDDIR%/latex. goto end ) if "%1" == "text" ( %SPHINXBUILD% -b text %ALLSPHINXOPTS% %BUILDDIR%/text if errorlevel 1 exit /b 1 echo. echo.Build finished. The text files are in %BUILDDIR%/text. goto end ) if "%1" == "man" ( %SPHINXBUILD% -b man %ALLSPHINXOPTS% %BUILDDIR%/man if errorlevel 1 exit /b 1 echo. echo.Build finished. The manual pages are in %BUILDDIR%/man. goto end ) if "%1" == "texinfo" ( %SPHINXBUILD% -b texinfo %ALLSPHINXOPTS% %BUILDDIR%/texinfo if errorlevel 1 exit /b 1 echo. echo.Build finished. The Texinfo files are in %BUILDDIR%/texinfo. goto end ) if "%1" == "gettext" ( %SPHINXBUILD% -b gettext %I18NSPHINXOPTS% %BUILDDIR%/locale if errorlevel 1 exit /b 1 echo. echo.Build finished. The message catalogs are in %BUILDDIR%/locale. goto end ) if "%1" == "changes" ( %SPHINXBUILD% -b changes %ALLSPHINXOPTS% %BUILDDIR%/changes if errorlevel 1 exit /b 1 echo. echo.The overview file is in %BUILDDIR%/changes. goto end ) if "%1" == "linkcheck" ( %SPHINXBUILD% -b linkcheck %ALLSPHINXOPTS% %BUILDDIR%/linkcheck if errorlevel 1 exit /b 1 echo. echo.Link check complete; look for any errors in the above output ^ or in %BUILDDIR%/linkcheck/output.txt. goto end ) if "%1" == "doctest" ( %SPHINXBUILD% -b doctest %ALLSPHINXOPTS% %BUILDDIR%/doctest if errorlevel 1 exit /b 1 echo. echo.Testing of doctests in the sources finished, look at the ^ results in %BUILDDIR%/doctest/output.txt. goto end ) :end pylint-1.8.3/doc/Makefile0000644000076500000240000001246313224376051016031 0ustar claudiustaff00000000000000# Makefile for Sphinx documentation # # You can set these variables from the command line. SPHINXOPTS = SPHINXBUILD = sphinx-build PAPER = BUILDDIR = _build PYTHONPATH = # Internal variables. PAPEROPT_a4 = -D latex_paper_size=a4 PAPEROPT_letter = -D latex_paper_size=letter ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . .PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest all help: @echo "Please use \`make ' where is one of" @echo " html to make standalone HTML files" @echo " dirhtml to make HTML files named index.html in directories" @echo " singlehtml to make a single large HTML file" @echo " pickle to make pickle files" @echo " json to make JSON files" @echo " htmlhelp to make HTML files and a HTML help project" @echo " qthelp to make HTML files and a qthelp project" @echo " devhelp to make HTML files and a Devhelp project" @echo " epub to make an epub" @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" @echo " latexpdf to make LaTeX files and run them through pdflatex" @echo " text to make text files" @echo " man to make manual pages" @echo " changes to make an overview of all changed/added/deprecated items" @echo " linkcheck to check all external links for integrity" @echo " doctest to run all doctests embedded in the documentation (if enabled)" clean: -rm -rf $(BUILDDIR)/* -rm -f reference_guide/features.rst -rm -f extensions.rst html: features.rst extensions.rst $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html @echo @echo "Build finished. The HTML pages are in $(BUILDDIR)/html." dirhtml: $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml @echo @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml." singlehtml: $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml @echo @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml." pickle: $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle @echo @echo "Build finished; now you can process the pickle files." json: $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json @echo @echo "Build finished; now you can process the JSON files." htmlhelp: $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp @echo @echo "Build finished; now you can run HTML Help Workshop with the" \ ".hhp project file in $(BUILDDIR)/htmlhelp." qthelp: $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp @echo @echo "Build finished; now you can run "qcollectiongenerator" with the" \ ".qhcp project file in $(BUILDDIR)/qthelp, like this:" @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/Pylint.qhcp" @echo "To view the help file:" @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/Pylint.qhc" devhelp: $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp @echo @echo "Build finished." @echo "To view the help file:" @echo "# mkdir -p $$HOME/.local/share/devhelp/Pylint" @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/Pylint" @echo "# devhelp" epub: $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub @echo @echo "Build finished. The epub file is in $(BUILDDIR)/epub." latex: $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex @echo @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex." @echo "Run \`make' in that directory to run these through (pdf)latex" \ "(use \`make latexpdf' here to do that automatically)." latexpdf: $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex @echo "Running LaTeX files through pdflatex..." $(MAKE) -C $(BUILDDIR)/latex all-pdf @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." text: $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text @echo @echo "Build finished. The text files are in $(BUILDDIR)/text." man: $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man @echo @echo "Build finished. The manual pages are in $(BUILDDIR)/man." changes: $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes @echo @echo "The overview file is in $(BUILDDIR)/changes." linkcheck: $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck @echo @echo "Link check complete; look for any errors in the above output " \ "or in $(BUILDDIR)/linkcheck/output.txt." doctest: $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest @echo "Testing of doctests in the sources finished, look at the " \ "results in $(BUILDDIR)/doctest/output.txt." extensions.rst: exts/pylint_extensions.py extensions.rst: ../pylint/utils.py extensions.rst: $(shell find ../pylint/extensions -type f -regex '.*\.py') extensions.rst: $(shell find ../pylint/extensions -type f -regex '.*\.rst') rm -f extensions.rst PYTHONPATH=$(PYTHONPATH) ./exts/pylint_extensions.py features.rst: exts/pylint_features.py features.rst: ../pylint/utils.py features.rst: $(shell find ../pylint/checkers -type f -regex '.*\.py') rm -f features.rst PYTHONPATH=$(PYTHONPATH) ./exts/pylint_features.py gen-examples: chmod u+w ../examples/pylintrc pylint --generate-rcfile > ../examples/pylintrc gen-man: chmod u+w ../man/pylint.1 pylint --generate-man > ../man/pylint.1 all: html gen-man gen-examples pylint-1.8.3/doc/technical_reference/0000755000076500000240000000000013253004373020330 5ustar claudiustaff00000000000000pylint-1.8.3/doc/technical_reference/checkers.rst0000644000076500000240000000043513246205362022656 0ustar claudiustaff00000000000000Checkers -------- All of the default pylint checkers exist in ``pylint.checkers``. This is where most of pylint's brains exist. Most checkers are AST based and so use :mod:`astroid`. ``pylint.checkers.utils`` provides a large number of utility methods for dealing with :mod:`astroid`. pylint-1.8.3/doc/technical_reference/index.rst0000644000076500000240000000032613246205362022175 0ustar claudiustaff00000000000000.. _technical-reference: Technical Reference =================== .. TODO Configuration .. TODO Messages .. TODO Reports .. toctree:: :maxdepth: 2 :titlesonly: startup checkers extensions features pylint-1.8.3/doc/technical_reference/startup.rst0000644000076500000240000000175313246205362022575 0ustar claudiustaff00000000000000Startup and the Linter Class ---------------------------- The two main classes in :mod:`pylint.lint` are :class:`.pylint.lint.Run` and :class:`.pylint.lint.PyLinter`. The :class:`.pylint.lint.Run` object is responsible for starting up pylint. It does some basic checking of the given command line options to find the initial hook to run, find the config file to use, and find which plugins have been specified. It can then create the master :class:`.pylint.lint.PyLinter` instance and initialise it with the config file and plugins that were discovered when preprocessing the command line options. Finally the :class:`.pylint.lint.Run` object launches any child linters for parallel jobs, and starts the linting process. The :class:`.pylint.lint.PyLinter` is responsible for coordinating the linting process. It parses the configuration and provides it for the checkers and other plugins, it handles the messages emitted by the checkers, it handles the output reporting, and it launches the checkers. pylint-1.8.3/doc/tutorial.rst0000644000076500000240000003367213246205362016773 0ustar claudiustaff00000000000000 ======== Tutorial ======== :Author: Robert Kirkpatrick Intro ----- Beginner to coding standards? Pylint can be your guide to reveal what's really going on behind the scenes and help you to become a more aware programmer. Sharing code is a rewarding endeavor. Putting your code ``out there`` can be either an act of philanthropy, ``coming of age``, or a basic extension of belief in open source. Whatever the motivation, your good intentions may not have the desired outcome if people find your code hard to use or understand. The Python community has formalized some recommended programming styles to help everyone write code in a common, agreed-upon style that makes the most sense for shared code. This style is captured in PEP-8_. Pylint can be a quick and easy way of seeing if your code has captured the essence of PEP-8 and is therefore ``friendly`` to other potential users. Perhaps you're not ready to share your code but you'd like to learn a bit more about writing better code and don't know where to start. Pylint can tell you where you may have run astray and point you in the direction to figure out what you have done and how to do better. This tutorial is all about approaching coding standards with little or no knowledge of in-depth programming or the code standards themselves. It's the equivalent of skipping the manual and jumping right in. My command line prompt for these examples is: .. sourcecode:: bash robertk01 Desktop$ .. _PEP-8: http://www.python.org/dev/peps/pep-0008/ Getting Started --------------- Running Pylint with no arguments will invoke the help dialogue and give you an idea of the arguments available to you. Do that now, i.e.: .. sourcecode:: bash robertk01 Desktop$ pylint ... a bunch of stuff ... A couple of the options that we'll focus on here are: :: Master: --generate-rcfile= Commands: --help-msg= Commands: --help-msg= Message control: --disable= Reports: --files-output= --reports= --output-format= Also pay attention to the last bit of help output. This gives you a hint of what Pylint is going to ``pick on``: :: Output: Using the default text output, the message format is : MESSAGE_TYPE: LINE_NUM:[OBJECT:] MESSAGE There are 5 kind of message types : * (C) convention, for programming standard violation * (R) refactor, for bad code smell * (W) warning, for python specific problems * (E) error, for much probably bugs in the code * (F) fatal, if an error occurred which prevented pylint from doing further processing. When Pylint is first run on a fresh piece of code, a common complaint is that it is too ``noisy``. The current default configuration is set to enforce all possible warnings. We'll use some of the options I noted above to make it suit your preferences a bit better (and thus make it emit messages only when needed). Your First Pylint'ing --------------------- We'll use a basic python script as fodder for our tutorial. I borrowed extensively from the code here: http://www.daniweb.com/code/snippet748.html The starting code we will use is called simplecaeser.py and is here in its entirety: .. sourcecode:: python 1 #!/usr/bin/env python 2 3 import string 4 5 shift = 3 6 choice = raw_input("would you like to encode or decode?") 7 word = (raw_input("Please enter text")) 8 letters = string.ascii_letters + string.punctuation + string.digits 9 encoded = '' 10 if choice == "encode": 11 for letter in word: 12 if letter == ' ': 13 encoded = encoded + ' ' 14 else: 15 x = letters.index(letter) + shift 16 encoded=encoded + letters[x] 17 if choice == "decode": 18 for letter in word: 19 if letter == ' ': 20 encoded = encoded + ' ' 21 else: 22 x = letters.index(letter) - shift 23 encoded = encoded + letters[x] 24 25 print encoded Let's get started. If we run this: .. sourcecode:: bash robertk01 Desktop$ pylint simplecaeser.py No config file found, using default configuration ************* Module simplecaeser C: 1, 0: Missing module docstring (missing-docstring) W: 3, 0: Uses of a deprecated module 'string' (deprecated-module) C: 5, 0: Invalid constant name "shift" (invalid-name) C: 6, 0: Invalid constant name "choice" (invalid-name) C: 7, 0: Invalid constant name "word" (invalid-name) C: 8, 0: Invalid constant name "letters" (invalid-name) C: 9, 0: Invalid constant name "encoded" (invalid-name) C: 16,12: Operator not preceded by a space encoded=encoded + letters[x] ^ (no-space-before-operator) Report ====== 19 statements analysed. Duplication ----------- +-------------------------+------+---------+-----------+ | |now |previous |difference | +=========================+======+=========+===========+ |nb duplicated lines |0 |0 |= | +-------------------------+------+---------+-----------+ |percent duplicated lines |0.000 |0.000 |= | +-------------------------+------+---------+-----------+ Raw metrics ----------- +----------+-------+------+---------+-----------+ |type |number |% |previous |difference | +==========+=======+======+=========+===========+ |code |21 |87.50 |21 |= | +----------+-------+------+---------+-----------+ |docstring |0 |0.00 |0 |= | +----------+-------+------+---------+-----------+ |comment |1 |4.17 |1 |= | +----------+-------+------+---------+-----------+ |empty |2 |8.33 |2 |= | +----------+-------+------+---------+-----------+ Statistics by type ------------------ +---------+-------+-----------+-----------+------------+---------+ |type |number |old number |difference |%documented |%badname | +=========+=======+===========+===========+============+=========+ |module |1 |1 |= |0.00 |0.00 | +---------+-------+-----------+-----------+------------+---------+ |class |0 |0 |= |0.00 |0.00 | +---------+-------+-----------+-----------+------------+---------+ |method |0 |0 |= |0.00 |0.00 | +---------+-------+-----------+-----------+------------+---------+ |function |0 |0 |= |0.00 |0.00 | +---------+-------+-----------+-----------+------------+---------+ Messages by category -------------------- +-----------+-------+---------+-----------+ |type |number |previous |difference | +===========+=======+=========+===========+ |convention |7 |7 |= | +-----------+-------+---------+-----------+ |refactor |0 |0 |= | +-----------+-------+---------+-----------+ |warning |1 |1 |= | +-----------+-------+---------+-----------+ |error |0 |0 |= | +-----------+-------+---------+-----------+ Messages -------- +-------------------------+------------+ |message id |occurrences | +=========================+============+ |invalid-name |5 | +-------------------------+------------+ |no-space-before-operator |1 | +-------------------------+------------+ |missing-docstring |1 | +-------------------------+------------+ |deprecated-module |1 | +-------------------------+------------+ Global evaluation ----------------- Your code has been rated at 5.79/10 Wow. That's a lot of stuff. The first part is the 'messages' section while the second part is the 'report' section. There are two points I want to tackle here. First point is that all the tables of statistics (i.e. the report) are a bit overwhelming so I want to silence them. To do that, I will use the **--reports=n** option. .. tip:: Many of Pylint's commonly used command line options have shortcuts. for example, **--reports=n** can be abbreviated to **-rn**. Pylint's man page lists all these shortcuts. Second, previous experience taught me that the default output for the messages needed a bit more info. We can see the first line is: :: "C: 1: Missing docstring (missing-docstring)" This basically means that line 1 violates a convention ``C``. It's telling me I really should have a docstring. I agree, but what if I didn't fully understand what rule I violated. Knowing only that I violated a convention isn't much help if I'm a newbie. Another information there is the message symbol between parens, ``missing-docstring`` here. If I want to read up a bit more about that, I can go back to the command line and try this: .. sourcecode:: bash robertk01 Desktop$ pylint --help-msg=missing-docstring No config file found, using default configuration :missing-docstring (C0111): *Missing docstring* Used when a module, function, class or method has no docstring. Some special methods like __init__ doesn't necessarily require a docstring. This message belongs to the basic checker. Yeah, ok. That one was a bit of a no-brainer but I have run into error messages that left me with no clue about what went wrong, simply because I was unfamiliar with the underlying mechanism of code theory. One error that puzzled my newbie mind was: :: :too-many-instance-attributes (R0902): *Too many instance attributes (%s/%s)* I get it now thanks to Pylint pointing it out to me. If you don't get that one, pour a fresh cup of coffee and look into it - let your programmer mind grow! The Next Step ------------- Now that we got some configuration stuff out of the way, let's see what we can do with the remaining warnings. If we add a docstring to describe what the code is meant to do that will help. I'm also going to be a bit cowboy and ignore the ``deprecated-module`` message because I like to take risks in life. A deprecation warning means that future versions of Python may not support that code so my code may break in the future. There are 5 ``invalid-name`` messages that we will get to later. Lastly, I violated the convention of using spaces around an operator such as "=" so I'll fix that too. To sum up, I'll add a docstring to line 2, put spaces around the = sign on line 16 and use the ``--disable=deprecated-module`` to ignore the deprecation warning. Here is the updated code: .. sourcecode:: python 1 #!/usr/bin/env python 2 """This script prompts a user to enter a message to encode or decode 3 using a classic Caeser shift substitution (3 letter shift)""" 4 5 import string 6 7 shift = 3 8 choice = raw_input("would you like to encode or decode?") 9 word = (raw_input("Please enter text")) 10 letters = string.ascii_letters + string.punctuation + string.digits 11 encoded = '' 12 if choice == "encode": 13 for letter in word: 14 if letter == ' ': 15 encoded = encoded + ' ' 16 else: 17 x = letters.index(letter) + shift 18 encoded = encoded + letters[x] 19 if choice == "decode": 20 for letter in word: 21 if letter == ' ': 22 encoded = encoded + ' ' 23 else: 24 x = letters.index(letter) - shift 25 encoded = encoded + letters[x] 26 27 print encoded And here is what happens when we run it with our ``--disable=deprecated-module`` option: .. sourcecode:: bash robertk01 Desktop$ pylint --reports=n --disable=deprecated-module simplecaeser.py No config file found, using default configuration ************* Module simplecaeser C: 7, 0: Invalid constant name "shift" (invalid-name) C: 8, 0: Invalid constant name "choice" (invalid-name) C: 9, 0: Invalid constant name "word" (invalid-name) C: 10, 0: Invalid constant name "letters" (invalid-name) C: 11, 0: Invalid constant name "encoded" (invalid-name) Nice! We're down to just the ``invalid-name`` messages. There are fairly well defined conventions around naming things like instance variables, functions, classes, etc. The conventions focus on the use of UPPERCASE and lowercase as well as the characters that separate multiple words in the name. This lends itself well to checking via a regular expression, thus the **should match (([A-Z\_][A-Z1-9\_]*)|(__.*__))$**. In this case Pylint is telling me that those variables appear to be constants and should be all UPPERCASE. This is an in-house convention that lives with Pylint since its inception. You too can create your own in-house naming conventions but for the purpose of this tutorial, we want to stick to the PEP-8 standard. In this case, the variables I declared should follow the convention of all lowercase. The appropriate rule would be something like: "should match [a-z\_][a-z0-9\_]{2,30}$". Notice the lowercase letters in the regular expression (a-z versus A-Z). If we run that rule using a ``--const-rgx='[a-z\_][a-z0-9\_]{2,30}$'`` option, it will now be quite quiet: .. sourcecode:: bash robertk01 Desktop$ pylint --reports=n --disable=deprecated-module --const-rgx='[a-z_][a-z0-9_]{2,30}$' simplecaeser.py No config file found, using default configuration Regular expressions can be quite a beast so take my word on this particular example but go ahead and `read up`_ on them if you want. .. tip:: It would really be a pain to have to use all these options on the command line all the time. That's what the configuration file is for. We can configure our Pylint to store our options for us so we don't have to declare them on the command line. Using the configuration file is a nice way of formalizing your rules and quickly sharing them with others. Invoking ``pylint --generate-rcfile`` will create a sample rcfile with all the options set and explained in comments. That's it for the basic intro. More tutorials will follow. .. _`read up`: http://docs.python.org/library/re.html pylint-1.8.3/doc/user_guide/0000755000076500000240000000000013253004373016513 5ustar claudiustaff00000000000000pylint-1.8.3/doc/user_guide/ide-integration.rst0000644000076500000240000001615513253004246022336 0ustar claudiustaff00000000000000.. _ide-integration: ########################### Editor and IDE integration ########################### To use Pylint with: - Emacs_, see http://www.emacswiki.org/emacs/PythonProgrammingInEmacs#toc8, - Vim_, see http://www.vim.org/scripts/script.php?script_id=891, - `Visual Studio`_, see https://docs.microsoft.com/visualstudio/python/code-pylint, - Eclipse_ and PyDev_, see http://pydev.org/manual_adv_pylint.html, - Komodo_, see http://mateusz.loskot.net/posts/2006/01/15/running-pylint-from-komodo/, - gedit_, see https://launchpad.net/gedit-pylint-2 or https://wiki.gnome.org/Apps/Gedit/PylintPlugin, - WingIDE_, see http://www.wingware.com/doc/edit/pylint, - PyCharm_, see :ref:`the section below `, - TextMate_, see :ref:`the section below ` Pylint is integrated in: - `Visual Studio`_, see the `Python > Run PyLint` command on a project's context menu. - Eric_ IDE, see the `Project > Check` menu, - Spyder_, see http://packages.python.org/spyder/pylint.html, - pyscripter_, see the `Tool -> Tools` menu. .. _Emacs: http://www.gnu.org/software/emacs/ .. _Vim: http://www.vim.org/ .. _Visual Studio: https://www.visualstudio.com/ .. _Eclipse: https://www.eclipse.org/ .. _Eric: http://eric-ide.python-projects.org/ .. _pyscripter: http://code.google.com/p/pyscripter/ .. _pydev: http://pydev.org .. _Komodo: http://www.activestate.com/Products/Komodo/ .. _gedit: https://wiki.gnome.org/Apps/Gedit .. _WingIDE: http://www.wingware.com/ .. _spyder: http://code.google.com/p/spyderlib/ .. _PyCharm: http://www.jetbrains.com/pycharm/ .. _TextMate: http://macromates.com Using Pylint thru flymake in Emacs ================================== To enable flymake for Python, insert the following into your .emacs: .. sourcecode:: common-lisp ;; Configure flymake for Python (when (load "flymake" t) (defun flymake-pylint-init () (let* ((temp-file (flymake-init-create-temp-buffer-copy 'flymake-create-temp-inplace)) (local-file (file-relative-name temp-file (file-name-directory buffer-file-name)))) (list "epylint" (list local-file)))) (add-to-list 'flymake-allowed-file-name-masks '("\\.py\\'" flymake-pylint-init))) ;; Set as a minor mode for Python (add-hook 'python-mode-hook '(lambda () (flymake-mode))) Above stuff is in ``pylint/elisp/pylint-flymake.el``, which should be automatically installed on Debian systems, in which cases you don't have to put it in your ``.emacs`` file. Other things you may find useful to set: .. sourcecode:: common-lisp ;; Configure to wait a bit longer after edits before starting (setq-default flymake-no-changes-timeout '3) ;; Keymaps to navigate to the errors (add-hook 'python-mode-hook '(lambda () (define-key python-mode-map "\C-cn" 'flymake-goto-next-error))) (add-hook 'python-mode-hook '(lambda () (define-key python-mode-map "\C-cp" 'flymake-goto-prev-error))) Finally, by default flymake only displays the extra information about the error when you hover the mouse over the highlighted line. The following will use the minibuffer to display messages when you the cursor is on the line. .. sourcecode:: common-lisp ;; To avoid having to mouse hover for the error message, these functions make flymake error messages ;; appear in the minibuffer (defun show-fly-err-at-point () "If the cursor is sitting on a flymake error, display the message in the minibuffer" (require 'cl) (interactive) (let ((line-no (line-number-at-pos))) (dolist (elem flymake-err-info) (if (eq (car elem) line-no) (let ((err (car (second elem)))) (message "%s" (flymake-ler-text err))))))) (add-hook 'post-command-hook 'show-fly-err-at-point) Alternative, if you only wish to pollute the minibuffer after an explicit flymake-goto-* then use the following instead of a post-command-hook .. sourcecode:: common-lisp (defadvice flymake-goto-next-error (after display-message activate compile) "Display the error in the mini-buffer rather than having to mouse over it" (show-fly-err-at-point)) (defadvice flymake-goto-prev-error (after display-message activate compile) "Display the error in the mini-buffer rather than having to mouse over it" (show-fly-err-at-point)) .. _pylint_in_pycharm: Integrate Pylint with PyCharm ============================= Install Pylint the usual way:: pip install pylint Remember the path at which it's installed:: which pylint Within PyCharm: #. Navigate to the preferences window #. Select "External Tools" #. Click the plus sign at the bottom of the dialog to add a new external task #. In the dialog, populate the following fields: :Name: Pylint :Description: A Python source code analyzer which looks for programming errors, helps enforcing a coding standard and sniffs for some code smells. :Synchronize files after execution: unchecked :Program: ``/path/to/pylint`` :Parameters: ``$FilePath$`` #. Click OK The option to check the current file with Pylint should now be available in *Tools* > *External Tools* > *Pylint*. .. _pylint_in_textmate: Integrate Pylint with TextMate ============================== Install Pylint in the usual way:: pip install pylint Install the `Python bundle for TextMate `_: #. select *TextMate* > *Preferences* #. select the *Bundles* tab #. find and tick the *Python* bundle in the list You should now see it in *Bundles* > *Python*. In *Preferences*, select the *Variables* tab. If a ``TM_PYCHECKER`` variable is not already listed, add it, with the value ``pylint``. The default keyboard shortcut to run the syntax checker is *Control-Shift-V* - open a ``.py`` file in Textmate, and try it. You should see the output in a new window: PyCheckMate 1.2 – Pylint 1.4.4 No config file found, using default configuration Then all is well, and most likely Pylint will have expressed some opinions about your Python code (or will exit with ``0`` if your code already conforms to its expectations). If you receive a message: Please install PyChecker, PyFlakes, Pylint, PEP 8 or flake8 for more extensive code checking. That means that Pylint wasn't found, which is likely an issue with command paths - TextMate needs be looking for Pylint on the right paths. Check where Pylint has been installed, using ``which``:: $ which pylint /usr/local/bin/pylint The output will tell you where Pylint can be found; in this case, in ``/usr/local/bin``. #. select *TextMate* > *Preferences* #. select the *Variables* tab #. find and check that a ``PATH`` variable exists, and that it contains the appropriate path (if the path to Pylint were ``/usr/local/bin/pylint`` as above, then the variable would need to contain ``/usr/local/bin``). An actual example in this case might be ``$PATH:/opt/local/bin:/usr/local/bin:/usr/texbin``, which includes other paths. ... and try running Pylint again. pylint-1.8.3/doc/user_guide/index.rst0000644000076500000240000000022713224376051020360 0ustar claudiustaff00000000000000 User Guide ========== .. toctree:: :maxdepth: 2 :titlesonly: installation run output message-control options ide-integrationpylint-1.8.3/doc/user_guide/installation.rst0000644000076500000240000000071113246205362021750 0ustar claudiustaff00000000000000.. _installation: Installation ------------ Python packages ''''''''''''''' Pylint should be easily installable using pip. .. code-block:: sh python -m pip install pylint Source distribution installation '''''''''''''''''''''''''''''''' From the source distribution, extract the tarball, go to the extracted directory and simply run :: python setup.py install Or you can install it in editable mode, using :: python setup.py develop pylint-1.8.3/doc/user_guide/message-control.rst0000644000076500000240000000457213224376051022362 0ustar claudiustaff00000000000000 Messages control ---------------- An example available from the examples directory: .. sourcecode:: python """pylint option block-disable""" __revision__ = None class Foo(object): """block-disable test""" def __init__(self): pass def meth1(self, arg): """this issues a message""" print self def meth2(self, arg): """and this one not""" # pylint: disable=unused-argument print self\ + "foo" def meth3(self): """test one line disabling""" # no error print self.bla # pylint: disable=no-member # error print self.blop def meth4(self): """test re-enabling""" # pylint: disable=no-member # no error print self.bla print self.blop # pylint: enable=no-member # error print self.blip def meth5(self): """test IF sub-block re-enabling""" # pylint: disable=no-member # no error print self.bla if self.blop: # pylint: enable=no-member # error print self.blip else: # no error print self.blip # no error print self.blip def meth6(self): """test TRY/EXCEPT sub-block re-enabling""" # pylint: disable=no-member # no error print self.bla try: # pylint: enable=no-member # error print self.blip except UndefinedName: # pylint: disable=undefined-variable # no error print self.blip # no error print self.blip def meth7(self): """test one line block opening disabling""" if self.blop: # pylint: disable=no-member # error print self.blip else: # error print self.blip # error print self.blip def meth8(self): """test late disabling""" # error print self.blip # pylint: disable=no-member # no error print self.bla print self.blop pylint-1.8.3/doc/user_guide/options.rst0000644000076500000240000001605713246205362020754 0ustar claudiustaff00000000000000.. -*- coding: utf-8 -*- =============== Configuration =============== Naming Styles ------------- Introduction ~~~~~~~~~~~~ Pylint recognizes a number of different name types internally. With a few exceptions, the type of the name is governed by the location the assignment to a name is found in, and not the type of object assigned. +--------------------+---------------------------------------------------------------------------------------------------+ | Name Type | Description | +====================+===================================================================================================+ | ``module`` | Module and package names, same as the file names. | +--------------------+---------------------------------------------------------------------------------------------------+ | ``const`` | Module-level constants, any variable defined at module level that is not bound to a class object. | +--------------------+---------------------------------------------------------------------------------------------------+ | ``class`` | Names in ``class`` statements, as well as names bound to class objects at module level. | +--------------------+---------------------------------------------------------------------------------------------------+ | ``function`` | Functions, toplevel or nested in functions or methods. | +--------------------+---------------------------------------------------------------------------------------------------+ | ``method`` | Methods, functions defined in class bodies. Includes static and class methods. | +--------------------+---------------------------------------------------------------------------------------------------+ | ``attr`` | Attributes created on class instances inside methods. | +--------------------+---------------------------------------------------------------------------------------------------+ | ``argument`` | Arguments to any function type, including lambdas. | +--------------------+---------------------------------------------------------------------------------------------------+ | ``variable`` | Local variables in function scopes. | +--------------------+---------------------------------------------------------------------------------------------------+ | ``class-attribute``| Attributes defined in class bodies. | +--------------------+---------------------------------------------------------------------------------------------------+ | ``inlinevar`` | Loop variables in list comprehensions and generator expressions. | +--------------------+---------------------------------------------------------------------------------------------------+ Default behavior ~~~~~~~~~~~~~~~~ By default, Pylint will enforce PEP8_-suggested names. Predefined Naming Styles ~~~~~~~~~~~~~~~~~~~~~~~~ Pylint provides set of predefined naming styles. Those predefined naming styles may be used to adjust Pylint configuration to coding style used in linted project. Following predefined naming styles are available: * ``snake_case`` * ``camelCase`` * ``PascalCase`` * ``UPPER_CASE`` * ``any`` - fake style which does not enforce any limitations Following options are exposed: .. option:: --module-naming-style=