Skip to content
This repository was archived by the owner on Nov 3, 2023. It is now read-only.

Commit c47068d

Browse files
committed
Merge pull request #170 from Nurdok/D403-weaker
Make D403 weaker to avoid false positives
2 parents f7c12a8 + 28fdee7 commit c47068d

File tree

7 files changed

+89
-46
lines changed

7 files changed

+89
-46
lines changed

.travis.yml

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,6 @@ matrix:
1313
env: TOXENV=py26
1414
- python: 2.7
1515
env: TOXENV=py27
16-
- python: 3.2
17-
env: TOXENV=py32
1816
- python: 3.3
1917
env: TOXENV=py33
2018
- python: 3.4

README.rst

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ custom checks can be easily added, for example to cover
1010
NumPy `docstring conventions
1111
<https://github.com/numpy/numpy/blob/master/doc/HOWTO_DOCUMENT.rst.txt>`_.
1212

13-
**pep257** supports Python 2.6, 2.7, 3.2, 3.3, 3.4, 3.5, pypy and pypy3.
13+
**pep257** supports Python 2.6, 2.7, 3.3, 3.4, 3.5, pypy and pypy3.
1414

1515
Quick Start
1616
-----------

src/pep257.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
from __future__ import with_statement
1515

1616
import os
17+
import string
1718
import sys
1819
import ast
1920
import copy
@@ -152,6 +153,10 @@ class Module(Definition):
152153
module = property(lambda self: self)
153154
all = property(lambda self: self._all)
154155

156+
def __init__(self, *args, **kwargs):
157+
super(Module, self).__init__(*args, **kwargs)
158+
self.name = self.name.lower()
159+
155160
def __str__(self):
156161
return 'at module level'
157162

@@ -1618,6 +1623,11 @@ def check_capitalized(self, function, docstring):
16181623
"""
16191624
if docstring:
16201625
first_word = ast.literal_eval(docstring).split()[0]
1626+
if first_word == first_word.upper():
1627+
return
1628+
for char in first_word:
1629+
if char not in string.ascii_letters and char != "'":
1630+
return
16211631
if first_word != first_word.capitalize():
16221632
return D403(first_word.capitalize(), first_word)
16231633

src/tests/test_cases/capitalization.py

Lines changed: 38 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,43 @@ def empty_docstring():
1818
""""""
1919

2020

21-
@expect("D403: First word of the first line should be properly capitalized "
22-
"('Get', not 'GET')")
2321
def all_caps():
2422
"""GET the request."""
23+
24+
25+
def non_letter_characters():
26+
"""Create/Edit the doodli-do."""
27+
28+
29+
def more_non_letter_characters():
30+
"""(Un)register the user."""
31+
32+
33+
def even_more_non_letter():
34+
"""'laser' the planet."""
35+
36+
37+
def dash():
38+
"""git-push it."""
39+
40+
41+
def digit_in_word():
42+
"""sha1 the string."""
43+
44+
45+
@expect("D403: First word of the first line should be properly capitalized "
46+
"(\"Don't\", not \"Don'T\")")
47+
def partial_caps():
48+
"""Don'T do that."""
49+
50+
51+
@expect("D403: First word of the first line should be properly capitalized "
52+
"('Return', not 'ReTurn')")
53+
def more_partial_caps():
54+
"""ReTurn the field."""
55+
56+
57+
@expect("D403: First word of the first line should be properly capitalized "
58+
"('A', not 'a')")
59+
def just_one_more_example():
60+
"""a function."""

src/tests/test_cases/test.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -303,5 +303,5 @@ def inner_function():
303303
"""Do inner something."""
304304
return 0
305305

306-
expect(__file__ if __file__[-1] != 'c' else __file__[:-1],
306+
expect(__file__.lower() if __file__[-1] != 'c' else __file__[:-1].lower(),
307307
'D100: Missing docstring in public module')

src/tests/test_pep257.py

Lines changed: 38 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -109,12 +109,11 @@ def parse_errors(err):
109109
while lines:
110110
curr_line = lines.pop(0)
111111
filename = curr_line[:curr_line.find(py_ext) + len(py_ext)]
112-
if os.path.isfile(filename):
113-
if lines:
114-
err_line = lines.pop(0).strip()
115-
err_code = err_line.split(':')[0]
116-
basename = os.path.basename(filename)
117-
result.setdefault(basename, set()).add(err_code)
112+
if lines:
113+
err_line = lines.pop(0).strip()
114+
err_code = err_line.split(':')[0]
115+
basename = os.path.basename(filename)
116+
result.setdefault(basename, set()).add(err_code)
118117

119118
return result
120119

@@ -495,10 +494,10 @@ def foo():
495494
err = parse_errors(err)
496495

497496
assert code == 1
498-
assert 'base.py' in err
499-
assert 'a.py' not in err
500-
assert 'D100' not in err['base.py']
501-
assert 'D103' in err['base.py']
497+
assert 'base.py' in err, err
498+
assert 'a.py' not in err, err
499+
assert 'D100' not in err['base.py'], err
500+
assert 'D103' in err['base.py'], err
502501

503502

504503
def test_config_file_cumulative_add_select():
@@ -539,10 +538,10 @@ def foo():
539538
err = parse_errors(err)
540539

541540
assert code == 1
542-
assert 'base.py' in err
543-
assert 'a.py' in err
544-
assert err['base.py'] == set(['D100'])
545-
assert err['a.py'] == set(['D100', 'D103'])
541+
assert 'base.py' in err, err
542+
assert 'a.py' in err, err
543+
assert err['base.py'] == set(['D100']), err
544+
assert err['a.py'] == set(['D100', 'D103']), err
546545

547546

548547
def test_config_file_convention_overrides_select():
@@ -578,9 +577,9 @@ def test_config_file_convention_overrides_select():
578577
_, err, code = env.invoke_pep257()
579578

580579
assert code == 1
581-
assert 'D100' in err
582-
assert 'base.py' not in err
583-
assert 'a.py' in err
580+
assert 'D100' in err, err
581+
assert 'base.py' not in err, err
582+
assert 'a.py' in err, err
584583

585584

586585
def test_cli_overrides_config_file():
@@ -616,10 +615,10 @@ def foo():
616615
_, err, code = env.invoke_pep257(args="--convention=pep257")
617616

618617
assert code == 1
619-
assert 'D100' in err
620-
assert 'D103' not in err
621-
assert 'base.py' in err
622-
assert 'a.py' not in err
618+
assert 'D100' in err, err
619+
assert 'D103' not in err, err
620+
assert 'base.py' in err, err
621+
assert 'a.py' not in err, err
623622

624623

625624
def test_cli_match_overrides_config_file():
@@ -656,10 +655,10 @@ def foo():
656655
_, err, code = env.invoke_pep257(args="--match=a.py --match-dir=A")
657656

658657
assert code == 1
659-
assert 'D100' in err
660-
assert 'D103' not in err
661-
assert 'base.py' not in err
662-
assert 'a.py' in err
658+
assert 'D100' in err, err
659+
assert 'D103' not in err, err
660+
assert 'base.py' not in err, err
661+
assert 'a.py' in err, err
663662

664663

665664
def test_config_file_convention_overrides_ignore():
@@ -698,10 +697,10 @@ def foo():
698697
_, err, code = env.invoke_pep257()
699698

700699
assert code == 1
701-
assert 'D100' in err
702-
assert 'D103' in err
703-
assert 'base.py' not in err
704-
assert 'a.py' in err
700+
assert 'D100' in err, err
701+
assert 'D103' in err, err
702+
assert 'base.py' not in err, err
703+
assert 'a.py' in err, err
705704

706705

707706
def test_config_file_ignore_overrides_select():
@@ -743,10 +742,10 @@ def bar():
743742
err = parse_errors(err)
744743

745744
assert code == 1
746-
assert 'base.py' in err
747-
assert 'a.py' in err
748-
assert err['base.py'] == set(['D100'])
749-
assert err['a.py'] == set(['D100', 'D101'])
745+
assert 'base.py' in err, err
746+
assert 'a.py' in err, err
747+
assert err['base.py'] == set(['D100']), err
748+
assert err['a.py'] == set(['D100', 'D101']), err
750749

751750

752751
def test_config_file_nearest_to_checked_file():
@@ -800,12 +799,12 @@ def bar():
800799
err = parse_errors(err)
801800

802801
assert code == 1
803-
assert 'base.py' in err
804-
assert 'a.py' in err
805-
assert 'b.py' in err
806-
assert err['base.py'] == set(['D101', 'D102'])
807-
assert err['a.py'] == set(['D101', 'D102'])
808-
assert err['b.py'] == set(['D102'])
802+
assert 'base.py' in err, err
803+
assert 'a.py' in err, err
804+
assert 'b.py' in err, err
805+
assert err['base.py'] == set(['D101', 'D102']), err
806+
assert err['a.py'] == set(['D101', 'D102']), err
807+
assert err['b.py'] == set(['D102']), err
809808

810809

811810
def test_config_file_nearest_match_re():

tox.ini

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
# install tox" and then run "tox" from this directory.
55

66
[tox]
7-
envlist = py26, py27, py32, py33, py34, py35, pypy, pypy3, docs
7+
envlist = py26, py27, py33, py34, py35, pypy, pypy3, docs
88

99
[testenv]
1010
# Make sure reading the UTF-8 from test.py works regardless of the locale used.

0 commit comments

Comments
 (0)