90
90
"EX01" : "No examples section found" ,
91
91
}
92
92
93
+ # Ignore these when evaluating end-of-line-"." checks
94
+ IGNORE_STARTS = (" " , "* " , "- " )
95
+
93
96
94
97
def error (code , ** kwargs ):
95
98
"""
@@ -260,7 +263,7 @@ def doc_parameters(self):
260
263
parameters = collections .OrderedDict ()
261
264
for names , type_ , desc in self .doc ["Parameters" ]:
262
265
for name in names .split (", " ):
263
- parameters [name ] = (type_ , "" . join ( desc ) )
266
+ parameters [name ] = (type_ , desc )
264
267
return parameters
265
268
266
269
@property
@@ -329,16 +332,6 @@ def directives_without_two_colons(self):
329
332
def parameter_type (self , param ):
330
333
return self .doc_parameters [param ][0 ]
331
334
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
-
342
335
@property
343
336
def see_also (self ):
344
337
result = collections .OrderedDict ()
@@ -408,6 +401,30 @@ def deprecated(self):
408
401
return ".. deprecated:: " in (self .summary + self .extended_summary )
409
402
410
403
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
+
411
428
def validate (func_name ):
412
429
"""
413
430
Validate the docstring.
@@ -516,7 +533,7 @@ def validate(func_name):
516
533
# PR03: Wrong parameters order
517
534
errs += doc .parameter_mismatches
518
535
519
- for param in doc .doc_parameters :
536
+ for param , kind_desc in doc .doc_parameters . items () :
520
537
if not param .startswith ("*" ): # Check can ignore var / kwargs
521
538
if not doc .parameter_type (param ):
522
539
if ":" in param :
@@ -541,13 +558,8 @@ def validate(func_name):
541
558
wrong_type = wrong_type ,
542
559
)
543
560
)
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 ))
551
563
552
564
if doc .is_function_or_method :
553
565
if not doc .returns :
@@ -557,14 +569,7 @@ def validate(func_name):
557
569
if len (doc .returns ) == 1 and doc .returns [0 ].name :
558
570
errs .append (error ("RT02" ))
559
571
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" ))
568
573
569
574
if not doc .yields and "yield" in doc .method_source :
570
575
errs .append (error ("YD01" ))
0 commit comments