Version 0.8.9 - 02 February 2002 * Add -3/--properties warning when using properties with classic classes * Add more warnings for statements with no effect * Fix crash due to import module problems * Fix crash with nested scopes * Fix spurious warnings about module attributes and importing * Fix spurious warnings in Python 2.2 when using builtin classes (eg, socket) * Fix spurious warning for format string problem when using % at module scope * Fix spurious warning for implicit returns when doing while 1: * Fix spurious warning for inconsistent return types when objects are subclasses * Don't warn about inconsistent return types from __getattr[ibute]__ * Always assume readline module is used if input/raw_input is used Version 0.8.8 - 13 January 2002 * Add -F/--config option to specify pycheckrc file to use Always read $HOME/.pycheckrc, .pycheckrc, and -F options in that order * Add -0/--abstract option to warn that subclass should override a base class whose method(s) only raise exceptions * Add -6/--exec option to warn when using the exec statement * Add -7/--slots option to warn about __slots__ usage problems * Add --emptyslots option to warn about empty __slots__ * Add check if __getattr[ibute]__ returns None, should raise an exception * Allow pychecker to be imported (in your code do: import pychecker.check) * Using vars() for format string argument works like locals() * Make unusedNames a prefix, so emptyVal, unusedVal, etc are also ignored * Fix -a/--initattr warning to actually warn when attributes are set outside of __init__(), but not in __init__() * Fix case where an implicit return did not generate a warning * Fix spurious warnings when using nested scopes, code should be checked now * Fix spurious warnings for unreachable code (not enough to enable, yet) * Fix spurious warnings for integer division from: (x + 100.0) / 10 * Fix spurious warnings for implicit returns when raise in except: clause * Fix various spurious warnings when using Python 2.2 * Fix spurious warning for overridden method mismatch when using exec * Fix spurious warning when doing len(filter(lambda x: ..., ...)) * Fix spurious warnings from some from ... import ... and deriving classes Version 0.8.7 - 05 January 2002 * Add -2/--constcond option to warn if using a constant in a conditional statement (if '': ; while 'str': ; etc) * Add -1/--constant1 option to warn when using if 1: or while 1: etc. * Add -8/--unreachable option to warn about unreachable code * Add -9/--members option to warn about unused data members * Add -w/--shadow for local variable shadowing global variable * Add warning statements with no effect (load var, but do nothing) * Handle string multiplication (helps format strings) code like this doesn't generate a warning now: '%d ' * 3 % (1, 2, 3) * Fix -C/--implicitreturns option so it works, turn it on by default * Fix spurious warning when accessing 'static' class members that are methods (e.g. class C(B): __super_init = B.__init__) (still a problem w/2.2) * Fix some strange spurious warnings and exceptions * Handle nested scopes better, includes fixing a crash and eliminating some spurious warnings Version 0.8.6 - 16 November 2001 * Add -5/--maxrefs for maximum # of identifier references (Law of Demeter) * Fix problem where user defined classes weren't checked for valid attributes * Allow use of __pychecker__ in class scope * Fix a lot of global function arg counts for Python 2.2 (many constructors can take no arguments now) * Fix spurious warning (Function return types are inconsistent) when multiple returns w/a constant & a local variable of same type * Fix spurious warning for format strings when using a dict local variable * Rename pychecker.sh script to pychecker on Unix Version 0.8.5 - 17 October 2001 * Add check for using builtin function/method const (None) return value (e.g., not_a_new_list = [].sort()) * Add check for builtin object method calls for right # args (e.g., [].count(), {}.keys(), file.seek(0)) * Add check for object method calls for right # args (calling object when type is known, ie instatiated locally) * Add check for modifying a parameter that has a default value (e.g., def func(mutable = []): mutable.append(0)) * Add check for using future keywords (e.g., yield) * Add check for using unary positive on variables (e.g., +x) * Add check for recursive calls to __repr__ implementations (`self`) * Add -X/--reimport option to turn off various module reimport warnings * Add -V/--version option for printing PyChecker version * Fix some spurious warnings for inconsistent return value types * Fix spurious warning from calling functions like: zip(*args) * Fix -F/--rcfile option so it really works Version 0.8.4 - 24 September 2001 * Allow warning suppressions to be specified as regular expressions * Add -z/--no-varargsused to ignore *args for functions w/variable args * Add warning checks when deleting variables * Add check for except Error1, Error2 : # should be except (Error1, Error2) : * Fix spurious warning when using parameter as dict for format string * Fix spurious warning when using lambda in __init__ * Add check that pychecker/checker.py is same version as other files * Get setup.py to work on windows, etc. if don't have /tmp Version 0.8.3 - 12 August 2001 * Fix internal errors when doing % on non-strings and other format problems * Fix spurious warning when using a constant {} with a format mapping Version 0.8.2 - 12 August 2001 * Check format strings even if using global & local constants * Add check that [].append() only takes one argument * Add check that # parameters are correct for builtin functions * Add warnings for --, ++, ~~: "Operator (%s) doesn't exist, statement has no effect" * Add -Q/--quiet to be real quiet, only output warning msgs, nothing else * Add -y/--classattr config option (warning was not configurable before) (warn if class attribute doesn't exist) * Add -x/--miximport config option (warning was not configurable before) (warn if mixing: import/from ... import) * Add -u/--callinit config option (warning was not configurable before) (warn if Subclass.__init__() not called) * Add constants together on stack when get + to avoid some spurious warnings * Fix method and attribute checks for None and Ellipsis * Fix spurious warnings when doing a local import and use module in lambda * Fix spurious warnings when object attribute has same name as class * Fix Object (x) has no attribute warnings for Python 2.2a1 built-in types * Change default behaviour to not warn about missing doc strings Version 0.8.1 - 9 August 2001 * Fix internal error when referencing a list constant: [1,2,3][1] * Fix internal error for Python 1.5 not catching unicode syntax error * Fix deprecation warning for Python 2.2a1 with xrange * Fix spurious warning (No module attribute) when doing import x.y as y * Fix spurious warning (Base __init__() not called) when using *args or **kw * Fix 'No module attribute' warning when doing: import foo.bar as bar * Spell overridden write Version 0.8 - 6 August 2001 * Add check for accessing list as list[1,2], should be slice 1:2 * Add -J/maxargs to warn when using too many arguments * Add -K/maxlocals to warn when using too many local variables * Add -D/intdivide to warn when using integer division * Add -O/objattrs to warn when using object.attribute that doesn't exist * Add -M/reimportself to warn when a module imports itself * Add -E/unusednames to provide a list of unused names to ignore (default is: [ '_', 'empty', 'unused' ]) * Major refactoring of warn.py -> utils, msgs, Warning, CodeChecks * Fix spurious warnings for No class attribute for dynamic classes * Fix spurious warnings when using objects from blacklisted modules (Instantiating object with arguments, but no constructor, etc) * Fix spurious warnings when using lambdas * Fix spurious warning (No global Y) when using: from X import Y (problem in python 1.5/1.6 only) Version 0.7.5 - 22 July 2001 * Suppress warnings on a per module/function/class/method basis with new suppressions = {} in .pycheckrc * Suppress warnings by setting __pychecker__ in source code * Change long argument behaviour --arg sets arg to true, --no-arg sets arg to false (also works for warning suppression) * Add -U/--reuseattr check if function/class/method names are reused * Add -T/--argsused check for unused method/function arguments * Add -G/--selfused ignore if self is unused in a method (requires --argsused) * Add -q/--stdlib to disable warnings from the standard library * Add -o/--override warning when a method has different signature than one being overridden in a base class * Add -F/--rcfile to generate a .pycheckrc file * Fix checking files in standard library before local file * Fix spurious warning when using from X import Y and imports in methods (Module (m) re-imported) * Fix spurious warning when doing: from X import Y, Z * Fix spurious warning when deriving from Exception() and instantiating object with multiple arguments * Fix method argument checks when calling base class methods * Fix error msg to base constructors (msg count was wrong) * Fix access to builtin module attributes (e.g., sys.exc_value) generating 'No attribute warnings' * Fix tests (forgot to add : after line number in expected results) Version 0.7 - 16 July 2001 * Improve import warning messages, add from checks * checker.py -h prints defaults after processing .pycheckrc file * Add config option -k/--pkgimport to disable unused imports from __init__.py * Add warning for variable used before being set * Improve format string checks/warnings * Check arguments to constructors * Check that self is first arg to base constructor * Add -e/--errors option to only warn about likely errors * Make 'self' configurable as the first argument to methods * Add check that there is a c'tor when instantiating an object and passing arguments * Add config option (-N/--initreturn) to turn off warnings when returning None from __init__() * Fix internal error with python 2.1 which defines a new op: LOAD_DEREF * Check in lambda functions for module/variable use * Fix inability to evaluate { 1: 'a' } inline, led to incorrect __init__() not called warnings * Fix exception when class overrides __special__() methods & raise exception * Fix check in format strings when using '%*g %*.*g', etc * Add check for static class attributes * Fix checking of module attributes * Fix wrong filename in 'Base class (xxx) __init__() not called' when doing a from X import * * Fix 'No attribute found' for very dynamic classes (may also work for classes that use __getattr__) Version 0.6.1 - 27 June 2001 * Fix bug which caused an exception from some import code * Fix bug in determining if there is an implicit return Version 0.6 - 25 June 2001 * Check format strings: "%s %s %s" % (v1, v2, v3, v4) for arg counts * Warn when format strings do: '%(var) %(var2)' * Fix Local variable (xxx) not used, when have: "%(xxx)s" % locals() * Warn when local variable (xxx) doesn't exist and have: "%(xxx)s" % locals() * Install script in /usr/local/bin to invoke PyChecker * Don't produce unused global warnings when using a module in parameters * Don't produce unused global warnings when using a module in class variables * Add check when using method as an attribute (if self.method and x == y:) * Add check for right # of args to object construction * Add check for right # of args to function calls in other modules * Check for returning a value from __init__ * Fix using from XX import YY ; from XX import ZZ causing re-import warning * Fix UNABLE TO IMPORT errors for files that don't end with a newline * Support for checking consistent return values -- not complete produces too many false positives Version 0.5 - 29 May 2001 * Catch internal errors "gracefully" and turn into a warning * Add checking of most module scoped code * Add pychecker subdir to imports to prevent filename conflicts * Don't produce unused local variable warning if variable name == '_' * Add -g/--allglobals option to report all global warnings, not just first * Add -V/--varlist option to selectively ignore variable not used warnings * Add test script and expected results * Print all instructions when using debug (-d/--debug) * Overhaul internal stack handling so we can look for more problems * Fix glob'ing problems (all args after glob were ignored) * Fix spurious Base class __init__ not called * Fix exception on code like: ['xxx'].index('xxx') * Fix exception on code like: func(kw=(a < b)) * Fix line numbers for import statements Version 0.4 - 23 April 2001 * Add .pycheckrc file processing to specify options (like on command line) * Add new warning if module.Attribute doesn't exist * Add new warning: Module (%s) re-imported locally * Add glob'ing support for windows * Handle apply(BaseClass.__init__(self, args)) * Fix command line handling so you can pass module, package, or filename * Fix **kwArgs warning if named parameter is not first * Don't exit from checker when import checker from interpreter Version 0.3 - 17 April 2001 * Fix some checker crashes (oops) * Add warnings for code complexity (lines/branches/returns per function) * Add more configuration options * Don't produce spurious warning for: x(y, { 'a': 'b' }) * Fix warnings that indicate they are from a base class file, rather than real file * Fix warnings for **kwArgs not allowed, but using named args * Add configuration option for warning when using attribute as a function (off by default, old behaviour was on) Version 0.2.5 - 12 April 2001 * Add back support for Python 1.5.2 (again) (I sure like 2.0 more with the [ for ] and string methods.) * Add new warning for unused local variables * Add command line switches Version 0.2 - 10 April 2001 * Move tests into a sub-directory so import test doesn't import pychecker/test * Add more test files * Add '.' to the python path so it doesn't need to be done in env't * Print a warning at the end for each file that couldn't be import'ed * Improve stack handling to improve error handling * Try to get base class __init__ checking to work for both: import X.Y from X import Y Version 0.1.1 - 8 April 2001 * Add support for Python 1.5.2 Version 0.1 - 7 April 2001 * Initial release