Skip to content

Commit 7f98102

Browse files
authored
BUG: Allow no . at end if indented (#239)
* BUG: Allow no . at end if indented * BUG: Returns, too * MAINT: Simplify * MAINT: Clean up the returns check, too * BUG: Debug cruft * MAINT: Unify * MAINT: Unify sanitizing and processing of desc * STY: Cleaner * STY: extend rather than +=
1 parent 7da2a4b commit 7f98102

File tree

2 files changed

+40
-28
lines changed

2 files changed

+40
-28
lines changed

numpydoc/tests/test_validate.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,10 @@ def plot(self, kind, color="blue", **kwargs):
3636
Parameters
3737
----------
3838
kind : str
39-
Kind of matplotlib plot.
39+
Kind of matplotlib plot, e.g.::
40+
41+
'foo'
42+
4043
color : str, default 'blue'
4144
Color name or rgb code.
4245
**kwargs
@@ -91,6 +94,8 @@ def sample(self):
9194
float
9295
Random number generated.
9396
97+
- Make sure you set a seed for reproducibility
98+
9499
See Also
95100
--------
96101
related : Something related.
@@ -115,6 +120,8 @@ def random_letters(self):
115120
letters : str
116121
String of random letters.
117122
123+
.. versionadded:: 0.1
124+
118125
See Also
119126
--------
120127
related : Something related.

numpydoc/validate.py

Lines changed: 32 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,9 @@
9090
"EX01": "No examples section found",
9191
}
9292

93+
# Ignore these when evaluating end-of-line-"." checks
94+
IGNORE_STARTS = (" ", "* ", "- ")
95+
9396

9497
def error(code, **kwargs):
9598
"""
@@ -260,7 +263,7 @@ def doc_parameters(self):
260263
parameters = collections.OrderedDict()
261264
for names, type_, desc in self.doc["Parameters"]:
262265
for name in names.split(", "):
263-
parameters[name] = (type_, "".join(desc))
266+
parameters[name] = (type_, desc)
264267
return parameters
265268

266269
@property
@@ -329,16 +332,6 @@ def directives_without_two_colons(self):
329332
def parameter_type(self, param):
330333
return self.doc_parameters[param][0]
331334

332-
def parameter_desc(self, param):
333-
desc = self.doc_parameters[param][1]
334-
# Find and strip out any sphinx directives
335-
for directive in DIRECTIVES:
336-
full_directive = ".. {}".format(directive)
337-
if full_directive in desc:
338-
# Only retain any description before the directive
339-
desc = desc[: desc.index(full_directive)]
340-
return desc
341-
342335
@property
343336
def see_also(self):
344337
result = collections.OrderedDict()
@@ -408,6 +401,30 @@ def deprecated(self):
408401
return ".. deprecated:: " in (self.summary + self.extended_summary)
409402

410403

404+
def _check_desc(desc, code_no_desc, code_no_upper, code_no_period, **kwargs):
405+
# Find and strip out any sphinx directives
406+
desc = "\n".join(desc)
407+
for directive in DIRECTIVES:
408+
full_directive = ".. {}".format(directive)
409+
if full_directive in desc:
410+
# Only retain any description before the directive
411+
desc = desc[: desc.index(full_directive)].rstrip("\n")
412+
desc = desc.split("\n")
413+
414+
errs = list()
415+
if not "".join(desc):
416+
errs.append(error(code_no_desc, **kwargs))
417+
else:
418+
if desc[0][0].isalpha() and not desc[0][0].isupper():
419+
errs.append(error(code_no_upper, **kwargs))
420+
# Not ending in "." is only an error if the last bit is not
421+
# indented (e.g., quote or code block)
422+
if not desc[-1].endswith(".") and \
423+
not desc[-1].startswith(IGNORE_STARTS):
424+
errs.append(error(code_no_period, **kwargs))
425+
return errs
426+
427+
411428
def validate(func_name):
412429
"""
413430
Validate the docstring.
@@ -516,7 +533,7 @@ def validate(func_name):
516533
# PR03: Wrong parameters order
517534
errs += doc.parameter_mismatches
518535

519-
for param in doc.doc_parameters:
536+
for param, kind_desc in doc.doc_parameters.items():
520537
if not param.startswith("*"): # Check can ignore var / kwargs
521538
if not doc.parameter_type(param):
522539
if ":" in param:
@@ -541,13 +558,8 @@ def validate(func_name):
541558
wrong_type=wrong_type,
542559
)
543560
)
544-
if not doc.parameter_desc(param):
545-
errs.append(error("PR07", param_name=param))
546-
else:
547-
if doc.parameter_desc(param)[0].isalpha() and not doc.parameter_desc(param)[0].isupper():
548-
errs.append(error("PR08", param_name=param))
549-
if doc.parameter_desc(param)[-1] != ".":
550-
errs.append(error("PR09", param_name=param))
561+
errs.extend(_check_desc(
562+
kind_desc[1], "PR07", "PR08", "PR09", param_name=param))
551563

552564
if doc.is_function_or_method:
553565
if not doc.returns:
@@ -557,14 +569,7 @@ def validate(func_name):
557569
if len(doc.returns) == 1 and doc.returns[0].name:
558570
errs.append(error("RT02"))
559571
for name_or_type, type_, desc in doc.returns:
560-
if not desc:
561-
errs.append(error("RT03"))
562-
else:
563-
desc = " ".join(desc)
564-
if desc[0].isalpha() and not desc[0].isupper():
565-
errs.append(error("RT04"))
566-
if not desc.endswith("."):
567-
errs.append(error("RT05"))
572+
errs.extend(_check_desc(desc, "RT03", "RT04", "RT05"))
568573

569574
if not doc.yields and "yield" in doc.method_source:
570575
errs.append(error("YD01"))

0 commit comments

Comments
 (0)