9090    "EX01" : "No examples section found" ,
9191}
9292
93+ # Ignore these when evaluating end-of-line-"." checks 
94+ IGNORE_STARTS  =  (" " , "* " , "- " )
95+ 
9396
9497def  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+ 
411428def  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