diff --git a/lib/ansible/parsing/plugin_docs.py b/lib/ansible/parsing/plugin_docs.py index 0f48b0080f..7512b46ef4 100644 --- a/lib/ansible/parsing/plugin_docs.py +++ b/lib/ansible/parsing/plugin_docs.py @@ -8,6 +8,7 @@ __metaclass__ = type import ast import yaml +from ansible.parsing.metadata import extract_metadata from ansible.parsing.yaml.loader import AnsibleLoader try: @@ -23,6 +24,18 @@ 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, @@ -34,11 +47,11 @@ def read_docstring(filename, verbose=True, ignore_errors=True): 'DOCUMENTATION': 'doc', 'EXAMPLES': 'plainexamples', 'RETURN': 'returndocs', - 'ANSIBLE_METADATA': 'metadata' } try: - M = ast.parse(''.join(open(filename))) + 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) @@ -66,7 +79,7 @@ def read_docstring(filename, verbose=True, ignore_errors=True): if isinstance(child.value, ast.Dict): data[varkey] = ast.literal_eval(child.value) else: - if theid in ['DOCUMENTATION', 'ANSIBLE_METADATA']: + if theid == 'DOCUMENTATION': # string should be yaml data[varkey] = AnsibleLoader(child.value.s, file_name=filename).get_single_data() else: @@ -74,6 +87,14 @@ def read_docstring(filename, verbose=True, ignore_errors=True): 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] + + # remove version + if data['metadata']: + for x in ('version', 'metadata_version'): + if x in data['metadata']: + del data['metadata'][x] except: if verbose: display.error("unable to parse %s" % filename)