Update the suspicious builder to detect unused rules, and remove currently unusued rules.

This commit is contained in:
Ezio Melotti 2013-03-28 18:01:11 +02:00
parent 75da35747e
commit 144c269cc8
2 changed files with 11 additions and 40 deletions

View File

@ -1,9 +1,6 @@
c-api/arg,,:ref,"PyArg_ParseTuple(args, ""O|O:ref"", &object, &callback)"
c-api/list,,:high,list[low:high]
c-api/list,,:high,list[low:high] = itemlist
c-api/sequence,,:i2,o[i1:i2]
c-api/sequence,,:i2,o[i1:i2] = v
c-api/sequence,,:i2,del o[i1:i2]
c-api/unicode,,:end,str[start:end]
distutils/setupscript,,::,
extending/embedding,,:numargs,"if(!PyArg_ParseTuple(args, "":numargs""))"
@ -11,7 +8,6 @@ extending/extending,,:set,"if (PyArg_ParseTuple(args, ""O:set_callback"", &temp)
extending/extending,,:myfunction,"PyArg_ParseTuple(args, ""D:myfunction"", &c);"
extending/newtypes,,:call,"if (!PyArg_ParseTuple(args, ""sss:call"", &arg1, &arg2, &arg3)) {"
extending/windows,,:initspam,/export:initspam
howto/cporting,,:add,"if (!PyArg_ParseTuple(args, ""ii:add_ints"", &one, &two))"
howto/cporting,,:encode,"if (!PyArg_ParseTuple(args, ""O:encode_object"", &myobj))"
howto/cporting,,:say,"if (!PyArg_ParseTuple(args, ""U:say_hello"", &name))"
howto/curses,,:black,"They are: 0:black, 1:red, 2:green, 3:yellow, 4:blue, 5:magenta, 6:cyan, and"
@ -46,7 +42,6 @@ howto/logging,,:This,DEBUG:root:This message should go to the log file
howto/regex,,::,
howto/regex,,:foo,(?:foo)
howto/urllib2,,:example,"for example ""joe@password:example.com"""
howto/webservers,,.. image:,.. image:: http.png
library/audioop,,:ipos,"# factor = audioop.findfactor(in_test[ipos*2:ipos*2+len(out_test)],"
library/cookie,,`,!#$%&'*+-.^_`|~
library/datetime,,:MM,
@ -73,12 +68,6 @@ library/imaplib,,:SS,"""DD-Mmm-YYYY HH:MM:SS"
library/itertools,,:stop,elements from seq[start:stop:step]
library/itertools,,:step,elements from seq[start:stop:step]
library/linecache,,:sys,"sys:x:3:3:sys:/dev:/bin/sh"
library/logging,,:And,
library/logging,,:package1,
library/logging,,:package2,
library/logging,,:root,
library/logging,,:This,
library/logging,,:port,host:port
library/logging.handlers,,:port,host:port
library/mmap,,:i2,obj[i1:i2]
library/multiprocessing,,:queue,">>> QueueManager.register('get_queue', callable=lambda:queue)"
@ -89,28 +78,20 @@ library/multiprocessing,,`,# `Pool.imap()` (which will save on the amount of cod
library/multiprocessing,,`,# A test file for the `multiprocessing` package
library/multiprocessing,,`,# A test of `multiprocessing.Pool` class
library/multiprocessing,,`,# Add more tasks using `put()`
library/multiprocessing,,`,# create server for a `HostManager` object
library/multiprocessing,,`,# Depends on `multiprocessing` package -- tested with `processing-0.60`
library/multiprocessing,,`,# in the original order then consider using `Pool.map()` or
library/multiprocessing,,`,# Not sure if we should synchronize access to `socket.accept()` method by
library/multiprocessing,,`,# object. (We import `multiprocessing.reduction` to enable this pickling.)
library/multiprocessing,,`,# register the Foo class; make `f()` and `g()` accessible via proxy
library/multiprocessing,,`,# register the Foo class; make `g()` and `_h()` accessible via proxy
library/multiprocessing,,`,# register the generator function baz; use `GeneratorProxy` to make proxies
library/multiprocessing,,`,`Cluster` is a subclass of `SyncManager` so it allows creation of
library/multiprocessing,,`,`hostname` gives the name of the host. If hostname is not
library/multiprocessing,,`,`slots` is used to specify the number of slots for processes on
library/optparse,,:len,"del parser.rargs[:len(value)]"
library/os.path,,:foo,c:foo
library/parser,,`,"""Make a function that raises an argument to the exponent `exp`."""
library/pdb,,:lineno,filename:lineno
library/pdb,,:lineno,filename:lineno
library/posix,,`,"CFLAGS=""`getconf LFS_CFLAGS`"" OPT=""-g -O2 $CFLAGS"""
library/profile,,:lineno,ncalls tottime percall cumtime percall filename:lineno(function)
library/profile,,:lineno,filename:lineno(function)
library/pyexpat,,:elem1,<py:elem1 />
library/pyexpat,,:py,"xmlns:py = ""http://www.python.org/ns/"">"
library/repr,,`,"return `obj`"
library/smtplib,,:port,"as well as a regular host:port server."
library/socket,,::,'5aef:2b::8'
library/sqlite3,,:memory,
@ -124,8 +105,6 @@ library/ssl,,:ops,Email Address []:ops@myserver.mygroup.myorganization.com
library/ssl,,:Some,"Locality Name (eg, city) []:Some City"
library/ssl,,:US,Country Name (2 letter code) [AU]:US
library/stdtypes,,:len,s[len(s):len(s)]
library/stdtypes,,:len,s[len(s):len(s)]
library/string,,:end,s[start:end]
library/string,,:end,s[start:end]
library/subprocess,,`,"output=`mycmd myarg`"
library/subprocess,,`,"output=`dmesg | grep hda`"
@ -147,13 +126,8 @@ license,,`,THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AN
reference/datamodel,,:step,a[i:j:step]
reference/datamodel,,:max,
reference/expressions,,:index,x[index:index]
reference/expressions,,:datum,{key:datum...}
reference/expressions,,`,`expressions...`
reference/expressions,,`,"""`"""
reference/expressions,,`,"""`"""
reference/grammar,,:output,#diagram:output
reference/grammar,,:rules,#diagram:rules
reference/grammar,,:token,#diagram:token
reference/grammar,,`,'`' testlist1 '`'
reference/lexical_analysis,,:fileencoding,# vim:fileencoding=<encoding-name>
reference/lexical_analysis,,`,", : . ` = ;"
@ -176,8 +150,6 @@ using/cmdline,,:line,action:message:category:module:line
using/cmdline,,:message,action:message:category:module:line
using/cmdline,,:module,action:message:category:module:line
using/cmdline,,:errorhandler,:errorhandler
using/windows,162,`,`` this fixes syntax highlighting errors in some editors due to the \\\\ hackery
using/windows,170,`,``
whatsnew/2.0,418,:len,
whatsnew/2.3,,::,
whatsnew/2.3,,:config,
@ -191,30 +163,18 @@ whatsnew/2.4,,:System,
whatsnew/2.5,,:memory,:memory:
whatsnew/2.5,,:step,[start:stop:step]
whatsnew/2.5,,:stop,[start:stop:step]
distutils/examples,267,`,This is the description of the ``foobar`` package.
faq/programming,,:reduce,"print (lambda Ru,Ro,Iu,Io,IM,Sx,Sy:reduce(lambda x,y:x+y,map(lambda y,"
faq/programming,,:reduce,"Sx=Sx,Sy=Sy:reduce(lambda x,y:x+y,map(lambda x,xc=Ru,yc=yc,Ru=Ru,Ro=Ro,"
faq/programming,,:chr,">=4.0) or 1+f(xc,yc,x*x-y*y+xc,2.0*x*y+yc,k-1,f):f(xc,yc,x,y,k,f):chr("
faq/programming,,::,for x in sequence[::-1]:
faq/windows,229,:EOF,@setlocal enableextensions & python -x %~f0 %* & goto :EOF
faq/windows,393,:REG,.py :REG_SZ: c:\<path to python>\python.exe -u %s %s
library/bisect,,:hi,all(val >= x for val in a[i:hi])
library/bisect,,:hi,all(val > x for val in a[i:hi])
library/http.client,52,:port,host:port
library/nntplib,,:bytes,:bytes
library/nntplib,,:lines,:lines
library/nntplib,,:lines,"['xref', 'from', ':lines', ':bytes', 'references', 'date', 'message-id', 'subject']"
library/nntplib,,:bytes,"['xref', 'from', ':lines', ':bytes', 'references', 'date', 'message-id', 'subject']"
library/pickle,567,:memory,"conn = sqlite3.connect("":memory:"")"
library/profile,293,:lineno,"(sort by filename:lineno),"
library/socket,,::,"(10, 1, 6, '', ('2001:888:2000:d::a2', 80, 0, 0))]"
library/stdtypes,,:end,s[start:end]
library/stdtypes,,:end,s[start:end]
license,,`,* THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
license,,`,* THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
license,,`,"``Software''), to deal in the Software without restriction, including"
license,,`,"THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,"
reference/lexical_analysis,704,`,$ ? `
whatsnew/2.7,735,:Sunday,'2009:4:Sunday'
whatsnew/2.7,862,::,"export PYTHONWARNINGS=all,error:::Cookie:0"
whatsnew/2.7,862,:Cookie,"export PYTHONWARNINGS=all,error:::Cookie:0"

1 c-api/arg :ref PyArg_ParseTuple(args, "O|O:ref", &object, &callback)
2 c-api/list :high list[low:high]
c-api/list :high list[low:high] = itemlist
3 c-api/sequence :i2 o[i1:i2]
c-api/sequence :i2 o[i1:i2] = v
c-api/sequence :i2 del o[i1:i2]
4 c-api/unicode :end str[start:end]
5 distutils/setupscript ::
6 extending/embedding :numargs if(!PyArg_ParseTuple(args, ":numargs"))
8 extending/extending :myfunction PyArg_ParseTuple(args, "D:myfunction", &c);
9 extending/newtypes :call if (!PyArg_ParseTuple(args, "sss:call", &arg1, &arg2, &arg3)) {
10 extending/windows :initspam /export:initspam
howto/cporting :add if (!PyArg_ParseTuple(args, "ii:add_ints", &one, &two))
11 howto/cporting :encode if (!PyArg_ParseTuple(args, "O:encode_object", &myobj))
12 howto/cporting :say if (!PyArg_ParseTuple(args, "U:say_hello", &name))
13 howto/curses :black They are: 0:black, 1:red, 2:green, 3:yellow, 4:blue, 5:magenta, 6:cyan, and
42 howto/regex ::
43 howto/regex :foo (?:foo)
44 howto/urllib2 :example for example "joe@password:example.com"
howto/webservers .. image: .. image:: http.png
45 library/audioop :ipos # factor = audioop.findfactor(in_test[ipos*2:ipos*2+len(out_test)],
46 library/cookie ` !#$%&'*+-.^_`|~
47 library/datetime :MM
68 library/itertools :stop elements from seq[start:stop:step]
69 library/itertools :step elements from seq[start:stop:step]
70 library/linecache :sys sys:x:3:3:sys:/dev:/bin/sh
library/logging :And
library/logging :package1
library/logging :package2
library/logging :root
library/logging :This
library/logging :port host:port
71 library/logging.handlers :port host:port
72 library/mmap :i2 obj[i1:i2]
73 library/multiprocessing :queue >>> QueueManager.register('get_queue', callable=lambda:queue)
78 library/multiprocessing ` # A test file for the `multiprocessing` package
79 library/multiprocessing ` # A test of `multiprocessing.Pool` class
80 library/multiprocessing ` # Add more tasks using `put()`
library/multiprocessing ` # create server for a `HostManager` object
library/multiprocessing ` # Depends on `multiprocessing` package -- tested with `processing-0.60`
81 library/multiprocessing ` # in the original order then consider using `Pool.map()` or
82 library/multiprocessing ` # Not sure if we should synchronize access to `socket.accept()` method by
83 library/multiprocessing ` # object. (We import `multiprocessing.reduction` to enable this pickling.)
84 library/multiprocessing ` # register the Foo class; make `f()` and `g()` accessible via proxy
85 library/multiprocessing ` # register the Foo class; make `g()` and `_h()` accessible via proxy
86 library/multiprocessing ` # register the generator function baz; use `GeneratorProxy` to make proxies
library/multiprocessing ` `Cluster` is a subclass of `SyncManager` so it allows creation of
library/multiprocessing ` `hostname` gives the name of the host. If hostname is not
library/multiprocessing ` `slots` is used to specify the number of slots for processes on
87 library/optparse :len del parser.rargs[:len(value)]
88 library/os.path :foo c:foo
library/parser ` "Make a function that raises an argument to the exponent `exp`."
library/pdb :lineno filename:lineno
89 library/pdb :lineno filename:lineno
90 library/posix ` CFLAGS="`getconf LFS_CFLAGS`" OPT="-g -O2 $CFLAGS"
91 library/profile :lineno ncalls tottime percall cumtime percall filename:lineno(function)
92 library/profile :lineno filename:lineno(function)
93 library/pyexpat :elem1 <py:elem1 />
94 library/pyexpat :py xmlns:py = "http://www.python.org/ns/">
library/repr ` return `obj`
95 library/smtplib :port as well as a regular host:port server.
96 library/socket :: '5aef:2b::8'
97 library/sqlite3 :memory
105 library/ssl :Some Locality Name (eg, city) []:Some City
106 library/ssl :US Country Name (2 letter code) [AU]:US
107 library/stdtypes :len s[len(s):len(s)]
library/stdtypes :len s[len(s):len(s)]
library/string :end s[start:end]
108 library/string :end s[start:end]
109 library/subprocess ` output=`mycmd myarg`
110 library/subprocess ` output=`dmesg | grep hda`
126 reference/datamodel :step a[i:j:step]
127 reference/datamodel :max
128 reference/expressions :index x[index:index]
reference/expressions :datum {key:datum...}
129 reference/expressions ` `expressions...`
130 reference/expressions ` "`"
reference/expressions ` "`"
reference/grammar :output #diagram:output
reference/grammar :rules #diagram:rules
reference/grammar :token #diagram:token
131 reference/grammar ` '`' testlist1 '`'
132 reference/lexical_analysis :fileencoding # vim:fileencoding=<encoding-name>
133 reference/lexical_analysis ` , : . ` = ;
150 using/cmdline :message action:message:category:module:line
151 using/cmdline :module action:message:category:module:line
152 using/cmdline :errorhandler :errorhandler
using/windows 162 ` `` this fixes syntax highlighting errors in some editors due to the \\\\ hackery
using/windows 170 ` ``
153 whatsnew/2.0 418 :len
154 whatsnew/2.3 ::
155 whatsnew/2.3 :config
163 whatsnew/2.5 :memory :memory:
164 whatsnew/2.5 :step [start:stop:step]
165 whatsnew/2.5 :stop [start:stop:step]
distutils/examples 267 ` This is the description of the ``foobar`` package.
166 faq/programming :reduce print (lambda Ru,Ro,Iu,Io,IM,Sx,Sy:reduce(lambda x,y:x+y,map(lambda y,
167 faq/programming :reduce Sx=Sx,Sy=Sy:reduce(lambda x,y:x+y,map(lambda x,xc=Ru,yc=yc,Ru=Ru,Ro=Ro,
168 faq/programming :chr >=4.0) or 1+f(xc,yc,x*x-y*y+xc,2.0*x*y+yc,k-1,f):f(xc,yc,x,y,k,f):chr(
169 faq/programming :: for x in sequence[::-1]:
faq/windows 229 :EOF @setlocal enableextensions & python -x %~f0 %* & goto :EOF
faq/windows 393 :REG .py :REG_SZ: c:\<path to python>\python.exe -u %s %s
170 library/bisect :hi all(val >= x for val in a[i:hi])
171 library/bisect :hi all(val > x for val in a[i:hi])
library/http.client 52 :port host:port
library/nntplib :bytes :bytes
library/nntplib :lines :lines
library/nntplib :lines ['xref', 'from', ':lines', ':bytes', 'references', 'date', 'message-id', 'subject']
library/nntplib :bytes ['xref', 'from', ':lines', ':bytes', 'references', 'date', 'message-id', 'subject']
library/pickle 567 :memory conn = sqlite3.connect(":memory:")
library/profile 293 :lineno (sort by filename:lineno),
172 library/socket :: (10, 1, 6, '', ('2001:888:2000:d::a2', 80, 0, 0))]
173 library/stdtypes :end s[start:end]
library/stdtypes :end s[start:end]
174 license ` * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
175 license ` * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
176 license ` ``Software''), to deal in the Software without restriction, including
177 license ` THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,
reference/lexical_analysis 704 ` $ ? `
178 whatsnew/2.7 735 :Sunday '2009:4:Sunday'
179 whatsnew/2.7 862 :: export PYTHONWARNINGS=all,error:::Cookie:0
180 whatsnew/2.7 862 :Cookie export PYTHONWARNINGS=all,error:::Cookie:0

View File

@ -66,6 +66,10 @@ class Rule:
# None -> don't care
self.issue = issue # the markup fragment that triggered this rule
self.line = line # text of the container element (single line only)
self.used = False
def __repr__(self):
return '{0.docname},,{0.issue},{0.line}'.format(self)
@ -105,6 +109,12 @@ class CheckSuspiciousMarkupBuilder(Builder):
doctree.walk(visitor)
def finish(self):
unused_rules = [rule for rule in self.rules if not rule.used]
if unused_rules:
self.warn('Found %s/%s unused rules:' %
(len(unused_rules), len(self.rules)))
for rule in unused_rules:
self.info(repr(rule))
return
def check_issue(self, line, lineno, issue):
@ -129,6 +139,7 @@ class CheckSuspiciousMarkupBuilder(Builder):
if (rule.lineno is not None) and \
abs(rule.lineno - lineno) > 5: continue
# if it came this far, the rule matched
rule.used = True
return True
return False