ChangeLog for Pylint
====================

2014-08-24 -- 1.3.1

    * 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.    

    * 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.
    
    * Properly handle unicode format strings for Python 2.
      Closes issue #296.
 
    * 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.

    * Fix a crash encountered when looking for attribute docstrings.

    * Fix a crash which ocurred while checking for 'method-hidden',
      when the parent frame was something different than a function.
 

2014-07-26  --  1.3.0

    * 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.


2014-04-30  --  1.2.1
    * 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).



2014-04-18  --  1.2.0
    * 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)



2013-12-22  --  1.1.0
    * 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)



2013-08-06  --  1.0.0
    * 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



2013-04-25  --  0.28.0
    * 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]



2013-02-26  --  0.27.0
    * #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 <F5> 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)



2012-10-05  --  0.26.0
    * #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)



2012-07-17  --  0.25.2
    * #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



2011-12-08  --  0.25.1
    * #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.



2011-10-07  --  0.25.0
    * #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



2011-07-18  --  0.24.0
    * #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



2011-01-11  --  0.23.0
    * 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.



2010-11-15  --  0.22.0
    * python versions: minimal python3.x support; drop python < 2.5 support



2010-10-27  --  0.21.4
    * fix #48066: pylint crashes when redirecting output containing non-ascii characters

    * fix #19799: "pylint -blah" exit with status 2

    * update documentation



2010-09-28  --  0.21.3
    * 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.



2010-08-26  --  0.21.2
    * fix #36193: import checker raise exception on cyclic import

    * fix #28796: regression in --generated-members introduced pylint 0.20

    * some documentation cleanups



2010-06-04  --  0.21.1
    * 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)



2010-05-11  --  0.21.0
    * 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



2010-03-01  --  0.20.0
    * 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



2009-12-18  --  0.19.0
    * implement #18947, #5561: checker for function arguments

    * include James Lingard string format checker

    * include simple message (ids) listing by Vincent Férotin (#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 Férotin)



2009-03-25  --  0.18.0
    * 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



2009-03-19  --  0.17.0
    * 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



2009-01-28  --  0.16.0
    * 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



2008-10-13  --  0.15.2
    * 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



2008-09-15  --  0.15.1
    * 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



2008-09-10  --  0.15.0
    * 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



2008-01-14  --  0.14.0
    * 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)



2007-06-07  --  0.13.2
    * 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



2007-03-02  --  0.13.1
    * fix some unexplained 0.13.0 packaging issue which led to a bunch of
      files missing from the distribution



2007-02-28  --  0.13.0
    * 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



2006-11-23  --  0.12.2
    * 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



2006-09-25  --  0.12.1
    * 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__



2006-08-10  --  0.12.0
    * usability changes:

        - parseable, html and color options are now handled by a single
	output-format option
        - enable-<checkerid> 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



2006-04-19  --  0.11.0
    * 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



2006-03-06  --  0.10.0
    * 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



2006-01-10  --  0.9.0
    * 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



2005-11-07  --  0.8.1
    * 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)



2005-10-21  --  0.8.0
    * 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)



2005-05-27  --  0.7.0
    * 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



2005-04-14  --  0.6.4
    * 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



2005-02-24  --  0.6.3
    * 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



2005-02-16  --  0.6.2
    * 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



2005-02-04  --  0.6.1
    * 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)



2005-01-20  --  0.6.0
    * 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



2004-10-19  --  0.5.0
    * 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



2004-07-08  --  0.4.2
    * fix pylint emacs mode

    * fix classes checkers to handler twisted interfaces



2004-05-14  --  0.4.1
    * 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



2004-05-10  --  0.4.0
    * 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



2004-02-17  --  0.3.3
    * 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



2003-12-23  --  0.3.2
    * 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



2003-12-05  --  0.3.1
    * bug fix in format and classes checkers

    * remove print statement from imports checkers

    * provide a simple tk gui, essentially useful for windows users



2003-11-20  --  0.3.0
    * 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



2003-10-10  --  0.2.1
    * 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



2003-09-12  --  0.2.0
    * 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



2003-06-18  --  0.1.2
    * bug fix release

    * remove dependency to pyreverse



2003-06-01  --  0.1.1
    * much more functionalities !



2003-05-19  --  0.1
    * initial release



