mirror of
https://github.com/ansible-collections/community.general.git
synced 2024-09-14 20:13:21 +02:00
Improved documentation error handling
This commit is contained in:
parent
ddf0474a76
commit
60a2165987
1 changed files with 56 additions and 29 deletions
|
@ -74,7 +74,7 @@ class Validator(object):
|
||||||
|
|
||||||
for trace in self.traces:
|
for trace in self.traces:
|
||||||
print('TRACE:')
|
print('TRACE:')
|
||||||
print(trace)
|
print('\n '.join((' %s' % trace).splitlines()))
|
||||||
for error in self.errors:
|
for error in self.errors:
|
||||||
print('ERROR: %s' % error)
|
print('ERROR: %s' % error)
|
||||||
ret.append(1)
|
ret.append(1)
|
||||||
|
@ -339,53 +339,59 @@ class ModuleValidator(Validator):
|
||||||
return docs
|
return docs
|
||||||
|
|
||||||
def _validate_docs(self):
|
def _validate_docs(self):
|
||||||
sys_stdout = sys.stdout
|
|
||||||
sys_stderr = sys.stderr
|
|
||||||
sys.stdout = sys.stderr = buf = StringIO()
|
|
||||||
# instead of adding noqa to the above, do something with buf
|
|
||||||
assert buf
|
|
||||||
setattr(sys.stdout, 'encoding', sys_stdout.encoding)
|
|
||||||
setattr(sys.stderr, 'encoding', sys_stderr.encoding)
|
|
||||||
doc_info = self._get_docs()
|
doc_info = self._get_docs()
|
||||||
try:
|
try:
|
||||||
doc, examples, ret = get_docstring(self.path, verbose=True)
|
doc = yaml.safe_load(doc_info['DOCUMENTATION']['value'])
|
||||||
trace = None
|
|
||||||
except yaml.YAMLError as e:
|
except yaml.YAMLError as e:
|
||||||
doc = None
|
doc = None
|
||||||
examples = doc_info['EXAMPLES']['value']
|
|
||||||
ret = doc_info['RETURN']['value']
|
|
||||||
trace = e
|
|
||||||
finally:
|
|
||||||
sys.stdout = sys_stdout
|
|
||||||
sys.stderr = sys_stderr
|
|
||||||
if trace:
|
|
||||||
# This offsets the error line number to where the
|
# This offsets the error line number to where the
|
||||||
# DOCUMENTATION starts so we can just go to that line in the
|
# DOCUMENTATION starts so we can just go to that line in the
|
||||||
# module
|
# module
|
||||||
trace.problem_mark.line += (
|
e.problem_mark.line += (
|
||||||
doc_info['DOCUMENTATION']['lineno'] - 1
|
doc_info['DOCUMENTATION']['lineno'] - 1
|
||||||
)
|
)
|
||||||
trace.problem_mark.name = '%s.DOCUMENTATION' % self.name
|
e.problem_mark.name = '%s.DOCUMENTATION' % self.name
|
||||||
self.traces.append(trace)
|
self.traces.append(e)
|
||||||
self.errors.append('DOCUMENTATION is not valid YAML. Line %d '
|
self.errors.append('DOCUMENTATION is not valid YAML. Line %d '
|
||||||
'column %d' %
|
'column %d' %
|
||||||
(trace.problem_mark.line + 1,
|
(e.problem_mark.line + 1,
|
||||||
trace.problem_mark.column + 1))
|
e.problem_mark.column + 1))
|
||||||
if not bool(doc):
|
except AttributeError:
|
||||||
self.errors.append('No DOCUMENTATION provided')
|
self.errors.append('No DOCUMENTATION provided')
|
||||||
else:
|
else:
|
||||||
|
sys_stdout = sys.stdout
|
||||||
|
sys_stderr = sys.stderr
|
||||||
|
sys.stdout = sys.stderr = buf = StringIO()
|
||||||
|
# instead of adding noqa to the above, do something with buf
|
||||||
|
assert buf
|
||||||
|
setattr(sys.stdout, 'encoding', sys_stdout.encoding)
|
||||||
|
setattr(sys.stderr, 'encoding', sys_stderr.encoding)
|
||||||
|
try:
|
||||||
|
get_docstring(self.path, verbose=True)
|
||||||
|
except AssertionError:
|
||||||
|
fragment = doc['extends_documentation_fragment']
|
||||||
|
self.errors.append('DOCUMENTATION fragment missing: %s' % fragment)
|
||||||
|
except Exception as e:
|
||||||
|
self.traces.append(e)
|
||||||
|
self.errors.append('Unknown DOCUMENTATION error, see TRACE')
|
||||||
|
finally:
|
||||||
|
sys.stdout = sys_stdout
|
||||||
|
sys.stderr = sys_stderr
|
||||||
|
|
||||||
self._check_version_added(doc)
|
self._check_version_added(doc)
|
||||||
self._check_for_new_args(doc)
|
self._check_for_new_args(doc)
|
||||||
if not bool(examples):
|
|
||||||
|
if not bool(doc_info['EXAMPLES']['value']):
|
||||||
self.errors.append('No EXAMPLES provided')
|
self.errors.append('No EXAMPLES provided')
|
||||||
if not bool(ret):
|
|
||||||
|
if not bool(doc_info['RETURN']['value']):
|
||||||
if self._is_new_module():
|
if self._is_new_module():
|
||||||
self.errors.append('No RETURN documentation provided')
|
self.errors.append('No RETURN documentation provided')
|
||||||
else:
|
else:
|
||||||
self.warnings.append('No RETURN provided')
|
self.warnings.append('No RETURN provided')
|
||||||
else:
|
else:
|
||||||
try:
|
try:
|
||||||
yaml.safe_load(ret)
|
yaml.safe_load(doc_info['RETURN']['value'])
|
||||||
except yaml.YAMLError as e:
|
except yaml.YAMLError as e:
|
||||||
e.problem_mark.line += (
|
e.problem_mark.line += (
|
||||||
doc_info['RETURN']['lineno'] - 1
|
doc_info['RETURN']['lineno'] - 1
|
||||||
|
@ -429,9 +435,30 @@ class ModuleValidator(Validator):
|
||||||
if self._is_new_module():
|
if self._is_new_module():
|
||||||
return
|
return
|
||||||
|
|
||||||
existing = module_loader.find_plugin(self.name, mod_type='.py')
|
sys_stdout = sys.stdout
|
||||||
existing_doc, _, _ = get_docstring(existing, verbose=True)
|
sys_stderr = sys.stderr
|
||||||
existing_options = existing_doc.get('options', {})
|
sys.stdout = sys.stderr = buf = StringIO()
|
||||||
|
# instead of adding noqa to the above, do something with buf
|
||||||
|
assert buf
|
||||||
|
setattr(sys.stdout, 'encoding', sys_stdout.encoding)
|
||||||
|
setattr(sys.stderr, 'encoding', sys_stderr.encoding)
|
||||||
|
try:
|
||||||
|
existing = module_loader.find_plugin(self.name, mod_type='.py')
|
||||||
|
existing_doc, _, _ = get_docstring(existing, verbose=True)
|
||||||
|
existing_options = existing_doc.get('options', {})
|
||||||
|
except AssertionError:
|
||||||
|
fragment = doc['extends_documentation_fragment']
|
||||||
|
self.errors.append('Existing DOCUMENTATION fragment missing: %s' %
|
||||||
|
fragment)
|
||||||
|
return
|
||||||
|
except Exception as e:
|
||||||
|
self.traces.append(e)
|
||||||
|
self.errors.append('Unknown existing DOCUMENTATION error, see '
|
||||||
|
'TRACE')
|
||||||
|
return
|
||||||
|
finally:
|
||||||
|
sys.stdout = sys_stdout
|
||||||
|
sys.stderr = sys_stderr
|
||||||
|
|
||||||
options = doc.get('options', {})
|
options = doc.get('options', {})
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue