Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
branch: master
Fetching contributors…

Cannot retrieve contributors at this time

240 lines (209 sloc) 10.542 kb
Goals for next minor release:
-----------------------------
* Make sure all PyCheckerModule tokens are keyed on alias (Function and
Module should now be done)
* Run pychecker on itself and clean up
* make sure that PyCheckerModule.functions/variables/classes/modules key
on alias for consistency
* Add other non-pure python extensions like .so
* it should be possible to mark imports that are unused but with side effects
as not unused; either with a directive inside __main__ for that import
specifically, or by inspecting the code and noticing there's more than
imports and class defs in __main__
* Add warning for duplicated elif conditions
* Check for "if s.find(str):" s/b "if s.find(str) >= 0:" where s is a string
* Add warning for: x % x is always 0
* Add warning when using listcomp variable (x) outside of [... for x in ...]
* Add warning for import overriding builtin (from os import *)
* Add warning if defining a module name that's also in the stdlib
* Add decorator so you can do:
@pychecker(maxlocals=42)
def myfunc():
* Support function attributes in addition to __pychecker__
* Add warning when iterating over a dict (keys, values, items) and mutating it
* Add warning for __special_ or __special or _special__ etc.
* Add warning about redefining a function/method with different signatures
* Add warning when base class has similar name and same signature:
class Base:
def foobar():
class Sub(Base):
def foobaz(): # damn, I wanted to override foobar
* If unknown name, suggest similar names
* Check for return from finally (disables exception, default off?)
* Add another boolean warning for: if bool(xxx):
* Need way to configure broken (and non-broken) versions of evil C extensions
* Add estimated difficulty to research/fix error
* Shouldn't warn about using return value for generators
* Suppress argument (self) name warnings if func has no impl?
* Add warning for a variable that is constant
ie, initialized and used, but never changed
* Add warning for catching AttributeError when there is no attr access
ZeroDivisionError w/no division?
KeyError UnboundLocalError IndexError IndentationError ImportError
* Add warning for a import b & b import a (import loops)
* Check that classes with __slots__ don't get/set any other attributes
* Expectations of __methods__, constness (don't modify in __nonzero__)
* Add warning if dict has duplicate keys when creating from literals
* __new__ should use cls, not self???
* If arg has default value of None, check that arg is assigned some value
* check if returning self from __str__()
* check for str1 in str2 == otherValue
* Fix dependancy problem w/checkReturnValues & checkImplicitReturns
* check for use of self.attr before setting self.attr in __init__ method
* Handle sys.exit() as non-returnable condition
* Warn about non-escaping backslashes???
* vars() should use locals, like locals(), hmmm, it should already ...
Goals for next major release (0.9):
-----------------------------------
* Improve handling when importing packages (ie, don't import modules)
- Make a base class to handle stack operations
- Override base class with classes to handle module scope, functions, etc.
- Process module and create Module/Class/Function objects w/o dir(), etc.
- Finish tests: 44
* Add a config option to ignore certain cantankerous modules
* Add warning for global statement inside a conditional
* Fix spurious warnings for unreachable code checks
* Fix most of the FIXMEs
* Add check for import module (from within package p-should be import p.module)
- don't use relative imports, should always use absolute paths
* If there is a warnings for unused varargs parameter (varArgumentsUsed), why
not for kwargs ?
Longer Term goals:
------------------
* Add check for magic #s/consts
(need dict of consts, count, max count, consts to ignore)
* Add check for unsupported operand type(s) for * + / etc
* Store types of globals, class attributes, function & method return values
* Output stats about pychecker's job, good, bad, otherwise...
annotate code for problem areas, well checked areas, etc.
* Add original line warnings for those that refer to another place
(e.g., overridden method doesn't match signature)
* Add capability to check features from a specified version of python
which is different from runtime interpreter
* Security checks for known issues. Adrian Likins @redhat recommends
looking at http://www.securesw.com/rats/
* Make check for 'self' a list instead of a string
* Check function return values - partially complete
* Add check that private functions are used in module/class
* Add check for using object members outside of class
* Add portability checks for win32/unix
* Add check for except: pass
* Spell check doc strings
# need to read source code for these:
* Add warning for unnecessary global stmts
* Add check for implicit string concatentation
* Add check for creating tuple when don't want a tuple, like: 1,
or not creating tuple when want one, like: (1)
* Warn when using () with statements (assert, print, del, if, while)
* Add check for <>, should use !=
* Find lines that end w/semi-colons (;)
* inconsistent camel-case
Fixing testsuite:
-----------------
Tested on 2010-12-18, after 2.7 fixes:
On Fedora 14, system Python 2.7:
7 TESTS FAILED: test13 test34 test44 test70 test71 test77 test85
On Fedora 14, source Python 2.6:
6 TESTS FAILED: test13 test34 test44 test70 test71 test77
On Fedora 14, source Python 2.5:
6 TESTS FAILED: test13 test34 test44 test70 test71 test77
On Fedora 14, source Python 2.4:
4 TESTS FAILED: test13 test44 test70 test77
On Fedora 14, source Python 2.3:
8 TESTS FAILED: test103 test13 test44 test68 test70 test77 test78 test85
On Fedora 14, source Python 2.2:
11 TESTS FAILED: test101 test103 test13 test1 test34 test3 test44 test58 test77 test78 test85
Tested on 2009-06-27:
On Fedora 9, system Python 2.5:
TESTS FAILED: test103 test13 test22 test44 test48 test53 test70 test71 test77 test78 test87
On Fedora 9, Python 2.4 built by hand:
TESTS FAILED: test13 test44 test70 test78 test88
On Fedora 9, Python 2.3 built by hand:
TESTS FAILED: test103 test13 test44 test68 test70 test77 test78 test85
On Fedora 9, Python 2.2 built by hand:
all tests fail due to a bug in this_mod.__filename__
test76: when adding the patch on 2011-01-07 to process nested functions
in order, line numbers for warnings changed from 6 to 7.
Not clear which should be correct; it seems like a should be 6
and d should be 7 ?
test103: a generator statement run twice should not generate a warning, but
does in python 2.3 and 2.5, but not 2.4
test22: two constant warnings went away since python 2.5
test26: fails in 2.6
test34: fails in 2.5, 2.6
locale.py added a currency method which uses digits as a local var;
this shadows global defined in the test. Not sure if this is
a valid warning that should be flagged (due to from ... import *)
I would argue no, since locale.py being good or bad shouldn't
change based on where it's imported from.
Formatter was added to string.py, without docstring, so looks like
a valid new warning.
test36: fails in 2.6
test44: test44.py imports * from import44, which has a class Ccc named the
same but whose init takes an extra argument.
test48: line 57 (the single character '5') no longer triggers statement
has no effect warning since python 2.5
test53: the operator ~~ stopped generating a warning since python 2.5
test59: fails in 2.6
test68: only fails in python 2.3
test70: 5 conditional warnings went away since python 2.5; but test fails in all
test71: unreachable code moved from test a to test c; since 2.5
In the pre-2.5 warnings, the line numbers don't point at the
unreachable code, but the statement before.
In 2.5 and later, the right blocks don't even get found; it looks
like this is because the implicit return None is gone from the byte
code; compare:
2.6, py-dis test_input.test71.a
...
9 25 LOAD_FAST 0 (x)
28 PRINT_ITEM
29 PRINT_NEWLINE
2.4, py-dis test_input.test71.a
9 25 LOAD_FAST 0 (x)
28 PRINT_ITEM
29 PRINT_NEWLINE
30 LOAD_CONST 0 (None)
33 RETURN_VALUE
So the implied return None is not found as a terminal
Aditionally, b disassembles differently too:
2.6, py-dis test_intput.test71.b
...
13 13 LOAD_FAST 0 (x)
16 RETURN_VALUE
>> 17 POP_TOP
2.4, py-dis test_intput.test71.b
13 13 LOAD_FAST 0 (x)
16 RETURN_VALUE
17 JUMP_FORWARD 1 (to 21)
>> 20 POP_TOP
index 9 is different
test77: doesn't get error formatting exception value; since 2.5
gets linenumber wrong (698 and not 704) in 2.3
test78: generated output has, at offset 0x35, [?1034h.Warnings; expected
output does not have this; since 2.3
test85: 9: Using a conditional statement with a constant value (true)
fails in 2.3, works in 2.4/2.5/2.6
test87: the expected output is able to clearly identify the line number
of a broken up statement; the current output is not and blames
the first line of the broken up statement; since python 2.5
test88: DeprecationWarning for whrandom pointing to the prefix path instead
of expected /usr/lib
Test questions
--------------
test3: why does 'dict shadows builtin' trigger in 2.3 but not 2.4/2.5 ?
Bugs
----
figure out why running pychecker on test/input/test_dict.py fails in 2.6
while it doesn't when you copy it to ./test.py and run it on that
(Probably because there is also test/__init__.py and it is trying to import
that instead ?)
- fix pychecker flumotion/twisted/credentials.py versus
flumotion.twisted.credentials
- flumotion/common/options.py: _gobject is not defined problem; add test
Admin
-----
* make website's index.html generate README so we don't have to update
in two places
* moap updates to automate release process
* update pychecker.doap with older releases
* add rss feed
Jump to Line
Something went wrong with that request. Please try again.