mirror of
https://github.com/sphinx-doc/sphinx.git
synced 2025-02-25 18:55:22 -06:00
check_sources.py is now ported to 3.x
This commit is contained in:
parent
46e5c123d5
commit
acd1eaf9d7
2
Makefile
2
Makefile
@ -1,4 +1,4 @@
|
||||
PYTHON ?= python
|
||||
PYTHON ?= python3
|
||||
|
||||
export PYTHONPATH = $(shell echo "$$PYTHONPATH"):./sphinx
|
||||
|
||||
|
@ -16,6 +16,12 @@ import cStringIO
|
||||
from optparse import OptionParser
|
||||
from os.path import join, splitext, abspath
|
||||
|
||||
if sys.version_info >= (3, 0):
|
||||
def b(s):
|
||||
return s.encode('utf-8')
|
||||
else:
|
||||
b = str
|
||||
|
||||
|
||||
checkers = {}
|
||||
|
||||
@ -30,26 +36,26 @@ def checker(*suffixes, **kwds):
|
||||
|
||||
|
||||
name_mail_re = r'[\w ]+(<.*?>)?'
|
||||
copyright_re = re.compile(r'^ :copyright: Copyright 200\d(-20\d\d)? '
|
||||
r'by %s(, %s)*[,.]$' %
|
||||
(name_mail_re, name_mail_re))
|
||||
license_re = re.compile(r" :license: (.*?).\n")
|
||||
copyright_2_re = re.compile(r'^ %s(, %s)*[,.]$' %
|
||||
(name_mail_re, name_mail_re))
|
||||
coding_re = re.compile(r'coding[:=]\s*([-\w.]+)')
|
||||
not_ix_re = re.compile(r'\bnot\s+\S+?\s+i[sn]\s\S+')
|
||||
is_const_re = re.compile(r'if.*?==\s+(None|False|True)\b')
|
||||
copyright_re = re.compile(b(r'^ :copyright: Copyright 200\d(-20\d\d)? '
|
||||
r'by %s(, %s)*[,.]$' %
|
||||
(name_mail_re, name_mail_re)))
|
||||
license_re = re.compile(b(r" :license: (.*?).\n"))
|
||||
copyright_2_re = re.compile(b(r'^ %s(, %s)*[,.]$' %
|
||||
(name_mail_re, name_mail_re)))
|
||||
coding_re = re.compile(b(r'coding[:=]\s*([-\w.]+)'))
|
||||
not_ix_re = re.compile(b(r'\bnot\s+\S+?\s+i[sn]\s\S+'))
|
||||
is_const_re = re.compile(b(r'if.*?==\s+(None|False|True)\b'))
|
||||
|
||||
misspellings = ["developement", "adress", "verificate", # ALLOW-MISSPELLING
|
||||
"informations"] # ALLOW-MISSPELLING
|
||||
misspellings = [b("developement"), b("adress"), # ALLOW-MISSPELLING
|
||||
b("verificate"), b("informations")] # ALLOW-MISSPELLING
|
||||
|
||||
|
||||
@checker('.py')
|
||||
def check_syntax(fn, lines):
|
||||
try:
|
||||
compile(''.join(lines), fn, "exec")
|
||||
except SyntaxError, err:
|
||||
yield 0, "not compilable: %s" % err
|
||||
if sys.version_info < (3, 0):
|
||||
@checker('.py')
|
||||
def check_syntax(fn, lines):
|
||||
try:
|
||||
compile(b('').join(lines), fn, "exec")
|
||||
except SyntaxError, err:
|
||||
yield 0, "not compilable: %s" % err
|
||||
|
||||
|
||||
@checker('.py')
|
||||
@ -61,8 +67,8 @@ def check_style_and_encoding(fn, lines):
|
||||
if lno < 2:
|
||||
co = coding_re.search(line)
|
||||
if co:
|
||||
encoding = co.group(1)
|
||||
if line.strip().startswith('#'):
|
||||
encoding = co.group(1).decode('ascii')
|
||||
if line.strip().startswith(b('#')):
|
||||
continue
|
||||
#m = not_ix_re.search(line)
|
||||
#if m:
|
||||
@ -82,7 +88,7 @@ def check_style_and_encoding(fn, lines):
|
||||
def check_fileheader(fn, lines):
|
||||
# line number correction
|
||||
c = 1
|
||||
if lines[0:1] == ['#!/usr/bin/env python\n']:
|
||||
if lines[0:1] == [b('#!/usr/bin/env python\n')]:
|
||||
lines = lines[1:]
|
||||
c = 2
|
||||
|
||||
@ -91,38 +97,38 @@ def check_fileheader(fn, lines):
|
||||
for lno, l in enumerate(lines):
|
||||
llist.append(l)
|
||||
if lno == 0:
|
||||
if l == '# -*- coding: rot13 -*-\n':
|
||||
if l == b('# -*- coding: rot13 -*-\n'):
|
||||
# special-case pony package
|
||||
return
|
||||
elif l != '# -*- coding: utf-8 -*-\n':
|
||||
elif l != b('# -*- coding: utf-8 -*-\n'):
|
||||
yield 1, "missing coding declaration"
|
||||
elif lno == 1:
|
||||
if l != '"""\n' and l != 'r"""\n':
|
||||
if l != b('"""\n') and l != b('r"""\n'):
|
||||
yield 2, 'missing docstring begin (""")'
|
||||
else:
|
||||
docopen = True
|
||||
elif docopen:
|
||||
if l == '"""\n':
|
||||
if l == b('"""\n'):
|
||||
# end of docstring
|
||||
if lno <= 4:
|
||||
yield lno+c, "missing module name in docstring"
|
||||
break
|
||||
|
||||
if l != "\n" and l[:4] != ' ' and docopen:
|
||||
if l != b("\n") and l[:4] != b(' ') and docopen:
|
||||
yield lno+c, "missing correct docstring indentation"
|
||||
|
||||
if lno == 2:
|
||||
# if not in package, don't check the module name
|
||||
modname = fn[:-3].replace('/', '.').replace('.__init__', '')
|
||||
while modname:
|
||||
if l.lower()[4:-1] == modname:
|
||||
if l.lower()[4:-1] == b(modname):
|
||||
break
|
||||
modname = '.'.join(modname.split('.')[1:])
|
||||
else:
|
||||
yield 3, "wrong module name in docstring heading"
|
||||
modnamelen = len(l.strip())
|
||||
elif lno == 3:
|
||||
if l.strip() != modnamelen * "~":
|
||||
if l.strip() != modnamelen * b("~"):
|
||||
yield 4, "wrong module name underline, should be ~~~...~"
|
||||
|
||||
else:
|
||||
@ -145,16 +151,16 @@ def check_fileheader(fn, lines):
|
||||
@checker('.py', '.html', '.rst')
|
||||
def check_whitespace_and_spelling(fn, lines):
|
||||
for lno, line in enumerate(lines):
|
||||
if "\t" in line:
|
||||
if b("\t") in line:
|
||||
yield lno+1, "OMG TABS!!!1 "
|
||||
if line[:-1].rstrip(' \t') != line[:-1]:
|
||||
if line[:-1].rstrip(b(' \t')) != line[:-1]:
|
||||
yield lno+1, "trailing whitespace"
|
||||
for word in misspellings:
|
||||
if word in line and 'ALLOW-MISSPELLING' not in line:
|
||||
if word in line and b('ALLOW-MISSPELLING') not in line:
|
||||
yield lno+1, '"%s" used' % word
|
||||
|
||||
|
||||
bad_tags = ('<u>', '<s>', '<strike>', '<center>', '<font')
|
||||
bad_tags = map(b, ['<u>', '<s>', '<strike>', '<center>', '<font'])
|
||||
|
||||
@checker('.html')
|
||||
def check_xhtml(fn, lines):
|
||||
@ -211,7 +217,7 @@ def main(argv):
|
||||
print "Checking %s..." % fn
|
||||
|
||||
try:
|
||||
f = open(fn, 'r')
|
||||
f = open(fn, 'rb')
|
||||
try:
|
||||
lines = list(f)
|
||||
finally:
|
||||
|
Loading…
Reference in New Issue
Block a user