DOC options must be a dict when used with extends_documentation_fragment (#21745)

* Fix string formatting
* Provide better tracebacks
* When options is None and extends_documentation_fragment is in use, add an error that options must be a dict
* If options was specified and not a dict, then error
This commit is contained in:
Matt Martz 2017-02-21 19:42:39 -06:00 committed by Matt Clay
parent 404b2864ef
commit b143fdea54
2 changed files with 13 additions and 5 deletions

View file

@ -117,7 +117,7 @@ def get_docstring(filename, verbose=False):
elif isinstance(doc[key], MutableSequence): elif isinstance(doc[key], MutableSequence):
doc[key] = sorted(frozenset(doc[key] + value)) doc[key] = sorted(frozenset(doc[key] + value))
else: else:
raise Exception("Attempt to extend a documentation fragement (%s) of unknown type: %s" (fragment_name, filename)) raise Exception("Attempt to extend a documentation fragement (%s) of unknown type: %s" % (fragment_name, filename))
elif 'EXAMPLES' == theid: elif 'EXAMPLES' == theid:
plainexamples = child.value.s[1:] # Skip first empty line plainexamples = child.value.s[1:] # Skip first empty line

View file

@ -28,6 +28,7 @@ import re
import subprocess import subprocess
import sys import sys
import tempfile import tempfile
import traceback
from collections import OrderedDict from collections import OrderedDict
from contextlib import contextmanager from contextlib import contextmanager
@ -569,13 +570,20 @@ class ModuleValidator(Validator):
303, 303,
'DOCUMENTATION fragment missing: %s' % fragment 'DOCUMENTATION fragment missing: %s' % fragment
)) ))
except Exception as e: except Exception:
self.traces.append(e) self.traces.append(traceback.format_exc())
self.errors.append(( self.errors.append((
304, 304,
'Unknown DOCUMENTATION error, see TRACE' 'Unknown DOCUMENTATION error, see TRACE'
)) ))
if 'options' in doc and doc['options'] is None and doc.get('extends_documentation_fragment'):
self.errors.append((
305,
('DOCUMENTATION.options must be a dictionary/hash when used '
'with DOCUMENTATION.extends_documentation_fragment')
))
self._validate_docs_schema(doc, doc_schema, 'DOCUMENTATION', 305) self._validate_docs_schema(doc, doc_schema, 'DOCUMENTATION', 305)
self._check_version_added(doc) self._check_version_added(doc)
self._check_for_new_args(doc) self._check_for_new_args(doc)
@ -760,8 +768,8 @@ class ModuleValidator(Validator):
self.errors.append((401, 'Python SyntaxError while parsing module')) self.errors.append((401, 'Python SyntaxError while parsing module'))
try: try:
compile(self.text, self.path, 'exec') compile(self.text, self.path, 'exec')
except Exception as e: except Exception:
self.traces.append(e) self.traces.append(traceback.format_exc())
return return
if self._python_module(): if self._python_module():