mirror of
https://github.com/davidhalter/parso.git
synced 2025-12-06 04:44:29 +08:00
Create the first tests for the pydocstyle finder.
This commit is contained in:
@@ -4,11 +4,14 @@ Some Python files have been taken from the standard library and are therefore
|
||||
PSF licensed. Modifications on these files are dual licensed (both MIT and
|
||||
PSF). These files are:
|
||||
|
||||
- parso/pgen2
|
||||
- parso/pgen2/*
|
||||
- parso/tokenize.py
|
||||
- parso/token.py
|
||||
- test/test_pgen2.py
|
||||
|
||||
Also some test files under test/normalizer_issue_files have been copied from
|
||||
https://github.com/PyCQA/pycodestyle (Expat License == MIT License).
|
||||
|
||||
-------------------------------------------------------------------------------
|
||||
The MIT License (MIT)
|
||||
|
||||
|
||||
@@ -53,25 +53,20 @@ class PEP8Normalizer(Normalizer):
|
||||
for child in node.children:
|
||||
# Here we can simply check if it's an except, because otherwise
|
||||
# it would be an except_clause.
|
||||
if child == 'except':
|
||||
self.add_issue(722, 'Do not use bare except, specify exception instead', node)
|
||||
if child.type == 'keyword' and child.value == 'except':
|
||||
self.add_issue(722, 'Do not use bare except, specify exception instead', child)
|
||||
elif typ == 'comparison':
|
||||
odd = False
|
||||
for child in node.children:
|
||||
if odd:
|
||||
if child not in ('is', '=='):
|
||||
break
|
||||
else:
|
||||
if child.type != 'atom_expr':
|
||||
break
|
||||
trailer = child.children[-1]
|
||||
atom = child.children[-1]
|
||||
if not (trailer.type == 'trailer' and atom.type == 'name'
|
||||
and atom.value == 'type'):
|
||||
break
|
||||
odd = not odd
|
||||
else:
|
||||
continue
|
||||
if len(child.children) > 2:
|
||||
continue
|
||||
trailer = child.children[1]
|
||||
atom = child.children[0]
|
||||
if trailer.type == 'trailer' and atom.type == 'name' \
|
||||
and atom.value == 'type':
|
||||
self.add_issue(721, "Do not compare types, use 'isinstance()", node)
|
||||
break
|
||||
|
||||
if typ in IMPORT_TYPES:
|
||||
module = node.parent
|
||||
|
||||
78
test/normalizer_issue_files/E72.py
Normal file
78
test/normalizer_issue_files/E72.py
Normal file
@@ -0,0 +1,78 @@
|
||||
#: E721
|
||||
if type(res) == type(42):
|
||||
pass
|
||||
#: E721
|
||||
if type(res) != type(""):
|
||||
pass
|
||||
|
||||
import types
|
||||
|
||||
if res == types.IntType:
|
||||
pass
|
||||
|
||||
import types
|
||||
|
||||
#: E721:3
|
||||
if type(res) is not types.ListType:
|
||||
pass
|
||||
#: E721:7 E721:35
|
||||
assert type(res) == type(False) or type(res) == type(None)
|
||||
#: E721:7
|
||||
assert type(res) == type([])
|
||||
#: E721:7
|
||||
assert type(res) == type(())
|
||||
#: E721:7
|
||||
assert type(res) == type((0,))
|
||||
#: E721:7
|
||||
assert type(res) == type((0))
|
||||
#: E721:7
|
||||
assert type(res) != type((1, ))
|
||||
#: E721:7
|
||||
assert type(res) is type((1, ))
|
||||
#: E721:7
|
||||
assert type(res) is not type((1, ))
|
||||
|
||||
# Okay
|
||||
import types
|
||||
|
||||
if isinstance(res, int):
|
||||
pass
|
||||
if isinstance(res, str):
|
||||
pass
|
||||
if isinstance(res, types.MethodType):
|
||||
pass
|
||||
|
||||
#: E721:3 E721:25
|
||||
if type(a) != type(b) or type(a) == type(ccc):
|
||||
pass
|
||||
#: E721
|
||||
type(a) != type(b)
|
||||
#: E721
|
||||
1 != type(b)
|
||||
#: E721
|
||||
type(b) != 1
|
||||
1 != 1
|
||||
|
||||
try:
|
||||
pass
|
||||
#: E722
|
||||
except:
|
||||
pass
|
||||
try:
|
||||
pass
|
||||
except Exception:
|
||||
pass
|
||||
#: E722
|
||||
except:
|
||||
pass
|
||||
# Okay
|
||||
fake_code = """"
|
||||
try:
|
||||
do_something()
|
||||
except:
|
||||
pass
|
||||
"""
|
||||
try:
|
||||
pass
|
||||
except Exception:
|
||||
pass
|
||||
29
test/normalizer_issue_files/LICENSE
Normal file
29
test/normalizer_issue_files/LICENSE
Normal file
@@ -0,0 +1,29 @@
|
||||
Copyright © 2006-2009 Johann C. Rocholl <johann@rocholl.net>
|
||||
Copyright © 2009-2014 Florent Xicluna <florent.xicluna@gmail.com>
|
||||
Copyright © 2014-2016 Ian Lee <IanLee1521@gmail.com>
|
||||
Copyright © 2014-2017 Dave Halter <davidhalter88@gmail.com>
|
||||
|
||||
Dave: The files in this folder were ported from pydocstyle and some
|
||||
modifications where made.
|
||||
|
||||
Licensed under the terms of the Expat License
|
||||
|
||||
Permission is hereby granted, free of charge, to any person
|
||||
obtaining a copy of this software and associated documentation files
|
||||
(the "Software"), to deal in the Software without restriction,
|
||||
including without limitation the rights to use, copy, modify, merge,
|
||||
publish, distribute, sublicense, and/or sell copies of the Software,
|
||||
and to permit persons to whom the Software is furnished to do so,
|
||||
subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be
|
||||
included in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
||||
BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
||||
ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
44
test/test_normalizer_issues_files.py
Normal file
44
test/test_normalizer_issues_files.py
Normal file
@@ -0,0 +1,44 @@
|
||||
"""
|
||||
To easily verify if our normalizer raises the right error codes, just use the
|
||||
tests of pydocstyle.
|
||||
"""
|
||||
|
||||
import re
|
||||
from textwrap import dedent
|
||||
|
||||
import parso
|
||||
|
||||
|
||||
def collect_errors(code):
|
||||
for line_nr, line in enumerate(code.splitlines(), 1):
|
||||
match = re.match(r'(\s*)#: (.*)$', line)
|
||||
if match is not None:
|
||||
codes = match.group(2)
|
||||
for code in codes.split():
|
||||
column = len(match.group(1))
|
||||
if ':' in code:
|
||||
code, _, add_indent = code.partition(':')
|
||||
column += int(add_indent)
|
||||
|
||||
yield "%s@(%s,%s)" % (code, line_nr + 1, column)
|
||||
|
||||
|
||||
def test_normalizer_issue(normalizer_issue_file):
|
||||
with open(normalizer_issue_file.path) as f:
|
||||
code = f.read()
|
||||
|
||||
desired = list(collect_errors(code))
|
||||
|
||||
module = parso.parse(code)
|
||||
issues = module._get_normalizer_issues()
|
||||
|
||||
i = set("E%s@(%s,%s)" % (i.code, i.start_pos[0], i.start_pos[1]) for i in issues)
|
||||
d = set(desired)
|
||||
assert i == d, dedent("""
|
||||
Test %r failed (%s of %s passed).
|
||||
not raised = %s
|
||||
unspecified = %s
|
||||
""") % (
|
||||
normalizer_issue_file.name, len(i & d), len(d),
|
||||
sorted(d - i), sorted(i - d)
|
||||
)
|
||||
Reference in New Issue
Block a user