[PATCH 2 of 7] contrib: split pypats list in check-code.py
FUJIWARA Katsunori
foozy at lares.dti.ne.jp
Thu Feb 28 13:16:12 EST 2019
# HG changeset patch
# User FUJIWARA Katsunori <foozy at lares.dti.ne.jp>
# Date 1551376385 -32400
# Fri Mar 01 02:53:05 2019 +0900
# Node ID bbc5686632c8fe35372c3095e3cedb1823472831
# Parent c3bccf551e129e0ed8dd7c3c0b5d06cd4314a42a
# Available At https://bitbucket.org/foozy/mercurial-wip
# hg pull https://bitbucket.org/foozy/mercurial-wip -r bbc5686632c8
# EXP-Topic tests-check-embedded-code
contrib: split pypats list in check-code.py
This is a part of preparation to apply checking with check-code.py on
code fragments embedded in *.t test scripts.
Ideally, all patterns in "pypats" before this patch should be applied
on not only normal *.py files but also code fragments embedded in *.t
test scripts. But fixing test scripts for some patterns requires
many changes, and has less profit than effort.
Therefore, this patch splits pypats list into two below:
- commonpypats, which are applied on all (= including code fragments
embedded in *.t test scripts) *.py files
- pypats, which are applied only on normal *.py
diff --git a/contrib/check-code.py b/contrib/check-code.py
--- a/contrib/check-code.py
+++ b/contrib/check-code.py
@@ -231,7 +231,8 @@ utestfilters = [
(r"( +)(#([^!][^\n]*\S)?)", repcomment),
]
-pypats = [
+# common patterns to check *.py
+commonpypats = [
[
(r'\\$', 'Use () to wrap long lines in Python, not \\'),
(r'^\s*def\s*\w+\s*\(.*,\s*\(',
@@ -262,7 +263,6 @@ pypats = [
# a pass at the same indent level, which is bogus
r'(?P=indent)pass[ \t\n#]'
), 'omit superfluous pass'),
- (r'.{81}', "line too long"),
(r'[^\n]\Z', "no trailing newline"),
(r'(\S[ \t]+|^[ \t]+)\n', "trailing whitespace"),
# (r'^\s+[^_ \n][^_. \n]+_[^_\n]+\s*=',
@@ -300,7 +300,6 @@ pypats = [
"wrong whitespace around ="),
(r'\([^()]*( =[^=]|[^<>!=]= )',
"no whitespace around = for named parameters"),
- (r'raise Exception', "don't raise generic exceptions"),
(r'raise [^,(]+, (\([^\)]+\)|[^,\(\)]+)$',
"don't use old-style two-argument raise, use Exception(message)"),
(r' is\s+(not\s+)?["\'0-9-]', "object comparison with literal"),
@@ -316,21 +315,12 @@ pypats = [
"use opener.read() instead"),
(r'opener\([^)]*\).write\(',
"use opener.write() instead"),
- (r'[\s\(](open|file)\([^)]*\)\.read\(',
- "use util.readfile() instead"),
- (r'[\s\(](open|file)\([^)]*\)\.write\(',
- "use util.writefile() instead"),
- (r'^[\s\(]*(open(er)?|file)\([^)]*\)(?!\.close\(\))',
- "always assign an opened file to a variable, and close it afterwards"),
- (r'[\s\(](open|file)\([^)]*\)\.(?!close\(\))',
- "always assign an opened file to a variable, and close it afterwards"),
(r'(?i)descend[e]nt', "the proper spelling is descendAnt"),
(r'\.debug\(\_', "don't mark debug messages for translation"),
(r'\.strip\(\)\.split\(\)', "no need to strip before splitting"),
(r'^\s*except\s*:', "naked except clause", r'#.*re-raises'),
(r'^\s*except\s([^\(,]+|\([^\)]+\))\s*,',
'legacy exception syntax; use "as" instead of ","'),
- (r':\n( )*( ){1,3}[^ ]', "must indent 4 spaces"),
(r'release\(.*wlock, .*lock\)', "wrong lock release order"),
(r'\bdef\s+__bool__\b', "__bool__ should be __nonzero__ in Python 2"),
(r'os\.path\.join\(.*, *(""|\'\')\)',
@@ -340,7 +330,6 @@ pypats = [
(r'def.*[( ]\w+=\{\}', "don't use mutable default arguments"),
(r'\butil\.Abort\b', "directly use error.Abort"),
(r'^@(\w*\.)?cachefunc', "module-level @cachefunc is risky, please avoid"),
- (r'^import atexit', "don't use atexit, use ui.atexit"),
(r'^import Queue', "don't use Queue, use pycompat.queue.Queue + "
"pycompat.queue.Empty"),
(r'^import cStringIO', "don't use cStringIO.StringIO, use util.stringio"),
@@ -359,6 +348,34 @@ pypats = [
"don't convert rev to node before passing to revision(nodeorrev)"),
(r'platform\.system\(\)', "don't use platform.system(), use pycompat"),
+ ],
+ # warnings
+ [
+ ]
+]
+
+# patterns to check normal *.py files
+pypats = [
+ [
+ # Ideally, these should be placed in "commonpypats" for
+ # consistency of coding rules in Mercurial source tree.
+ # But on the other hand, these are not so seriously required for
+ # python code fragments embedded in test scripts. Fixing test
+ # scripts for these patterns requires many changes, and has less
+ # profit than effort.
+ (r'.{81}', "line too long"),
+ (r'raise Exception', "don't raise generic exceptions"),
+ (r'[\s\(](open|file)\([^)]*\)\.read\(',
+ "use util.readfile() instead"),
+ (r'[\s\(](open|file)\([^)]*\)\.write\(',
+ "use util.writefile() instead"),
+ (r'^[\s\(]*(open(er)?|file)\([^)]*\)(?!\.close\(\))',
+ "always assign an opened file to a variable, and close it afterwards"),
+ (r'[\s\(](open|file)\([^)]*\)\.(?!close\(\))',
+ "always assign an opened file to a variable, and close it afterwards"),
+ (r':\n( )*( ){1,3}[^ ]', "must indent 4 spaces"),
+ (r'^import atexit', "don't use atexit, use ui.atexit"),
+
# rules depending on implementation of repquote()
(r' x+[xpqo%APM][\'"]\n\s+[\'"]x',
'string join across lines with no space'),
@@ -377,21 +394,26 @@ pypats = [
# because _preparepats forcibly adds "\n" into [^...],
# even though this regexp wants match it against "\n")''',
"missing _() in ui message (use () to hide false-positives)"),
- ],
+ ] + commonpypats[0],
# warnings
[
# rules depending on implementation of repquote()
(r'(^| )pp +xxxxqq[ \n][^\n]', "add two newlines after '.. note::'"),
- ]
+ ] + commonpypats[1]
]
-pyfilters = [
+# common filters to convert *.py
+commonpyfilters = [
(r"""(?msx)(?P<comment>\#.*?$)|
((?P<quote>('''|\"\"\"|(?<!')'(?!')|(?<!")"(?!")))
(?P<text>(([^\\]|\\.)*?))
(?P=quote))""", reppython),
]
+# filters to convert normal *.py files
+pyfilters = [
+] + commonpyfilters
+
# non-filter patterns
pynfpats = [
[
More information about the Mercurial-devel
mailing list