mirror of
https://github.com/ansible-collections/community.general.git
synced 2025-06-14 04:09:11 -07:00
Port ansible doc for plugins to use DOCUMENTATION variables
* Using docstrings conflicts with the standard use of docstrings * PYTHON_OPTIMIZE=2 will omit docstrings. Using docstrings makes future changes to the plugin and module code subject to the requirement that we ensure it won't be run with optimization.
This commit is contained in:
parent
9bc330c89b
commit
cc343a4376
68 changed files with 368 additions and 412 deletions
|
@ -24,18 +24,6 @@ def read_docstring(filename, verbose=True, ignore_errors=True):
|
|||
Parse DOCUMENTATION from YAML and return the YAML doc or None together with EXAMPLES, as plain text.
|
||||
"""
|
||||
|
||||
# FIXME: Should refactor this so that we have a docstring parsing
|
||||
# function and a separate variable parsing function
|
||||
# Can have a function one higher that invokes whichever is needed
|
||||
#
|
||||
# Should look roughly like this:
|
||||
# get_plugin_doc(filename, verbose=False)
|
||||
# documentation = extract_docstring(plugin_ast, identifier, verbose=False)
|
||||
# if not documentation and not (filter or test):
|
||||
# documentation = extract_variables(plugin_ast)
|
||||
# documentation['metadata'] = extract_metadata(plugin_ast)
|
||||
# return documentation
|
||||
|
||||
data = {
|
||||
'doc': None,
|
||||
'plainexamples': None,
|
||||
|
@ -52,40 +40,29 @@ def read_docstring(filename, verbose=True, ignore_errors=True):
|
|||
try:
|
||||
b_module_data = open(filename, 'rb').read()
|
||||
M = ast.parse(b_module_data)
|
||||
try:
|
||||
display.debug('Attempt first docstring is yaml docs')
|
||||
docstring = yaml.load(M.body[0].value.s)
|
||||
for string in string_to_vars.keys():
|
||||
if string in docstring:
|
||||
data[string_to_vars[string]] = docstring[string]
|
||||
display.debug('assigned :%s' % string_to_vars[string])
|
||||
except Exception as e:
|
||||
display.debug('failed docstring parsing: %s' % str(e))
|
||||
|
||||
if 'docs' not in data or not data['docs']:
|
||||
display.debug('Fallback to vars parsing')
|
||||
for child in M.body:
|
||||
if isinstance(child, ast.Assign):
|
||||
for t in child.targets:
|
||||
try:
|
||||
theid = t.id
|
||||
except AttributeError:
|
||||
# skip errors can happen when trying to use the normal code
|
||||
display.warning("Failed to assign id for %s on %s, skipping" % (t, filename))
|
||||
continue
|
||||
for child in M.body:
|
||||
if isinstance(child, ast.Assign):
|
||||
for t in child.targets:
|
||||
try:
|
||||
theid = t.id
|
||||
except AttributeError:
|
||||
# skip errors can happen when trying to use the normal code
|
||||
display.warning("Failed to assign id for %s on %s, skipping" % (t, filename))
|
||||
continue
|
||||
|
||||
if theid in string_to_vars:
|
||||
varkey = string_to_vars[theid]
|
||||
if isinstance(child.value, ast.Dict):
|
||||
data[varkey] = ast.literal_eval(child.value)
|
||||
if theid in string_to_vars:
|
||||
varkey = string_to_vars[theid]
|
||||
if isinstance(child.value, ast.Dict):
|
||||
data[varkey] = ast.literal_eval(child.value)
|
||||
else:
|
||||
if theid == 'DOCUMENTATION':
|
||||
# string should be yaml
|
||||
data[varkey] = AnsibleLoader(child.value.s, file_name=filename).get_single_data()
|
||||
else:
|
||||
if theid == 'DOCUMENTATION':
|
||||
# string should be yaml
|
||||
data[varkey] = AnsibleLoader(child.value.s, file_name=filename).get_single_data()
|
||||
else:
|
||||
# not yaml, should be a simple string
|
||||
data[varkey] = child.value.s
|
||||
display.debug('assigned :%s' % varkey)
|
||||
# not yaml, should be a simple string
|
||||
data[varkey] = child.value.s
|
||||
display.debug('assigned :%s' % varkey)
|
||||
|
||||
# Metadata is per-file and a dict rather than per-plugin/function and yaml
|
||||
data['metadata'] = extract_metadata(module_ast=M)[0]
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue