From 86e8d21667fa7a876f4fc079127bb4074e27148e Mon Sep 17 00:00:00 2001 From: Matt Martz Date: Mon, 24 Sep 2018 16:38:04 -0500 Subject: Perform full RETURN schema validation in one step, don't try to loop (#46079) --- test/sanity/validate-modules/main.py | 13 ++++--- test/sanity/validate-modules/schema.py | 70 ++++++++++++++++++---------------- test/sanity/validate-modules/utils.py | 1 - 3 files changed, 45 insertions(+), 39 deletions(-) diff --git a/test/sanity/validate-modules/main.py b/test/sanity/validate-modules/main.py index 1eb35f7631..a0315124c4 100755 --- a/test/sanity/validate-modules/main.py +++ b/test/sanity/validate-modules/main.py @@ -823,10 +823,15 @@ class ModuleValidator(Validator): else: error_message = error + if path: + combined_path = '%s.%s' % (name, '.'.join(path)) + else: + combined_path = name + self.reporter.error( path=self.object_path, code=error_code, - msg='%s.%s: %s' % (name, '.'.join(path), error_message) + msg='%s: %s' % (combined_path, error_message) ) def _validate_docs(self): @@ -980,7 +985,6 @@ class ModuleValidator(Validator): msg='No EXAMPLES provided' ) else: - examples_exists = True _, errors, traces = parse_yaml(doc_info['EXAMPLES']['value'], doc_info['EXAMPLES']['lineno'], self.name, 'EXAMPLES', load_all=True) @@ -997,7 +1001,6 @@ class ModuleValidator(Validator): ) if not bool(doc_info['RETURN']['value']): - returns_exists = True if self._is_new_module(): self.reporter.error( path=self.object_path, @@ -1014,9 +1017,7 @@ class ModuleValidator(Validator): data, errors, traces = parse_yaml(doc_info['RETURN']['value'], doc_info['RETURN']['lineno'], self.name, 'RETURN') - if data: - for ret_key in data: - self._validate_docs_schema(data[ret_key], return_schema(data[ret_key]), 'RETURN.%s' % ret_key, 319) + self._validate_docs_schema(data, return_schema, 'RETURN', 319) for error in errors: self.reporter.error( diff --git a/test/sanity/validate-modules/schema.py b/test/sanity/validate-modules/schema.py index 49219983c6..82855ca8c2 100644 --- a/test/sanity/validate-modules/schema.py +++ b/test/sanity/validate-modules/schema.py @@ -16,9 +16,10 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see . -from voluptuous import PREVENT_EXTRA, All, Any, Length, Required, Schema, Self +from voluptuous import ALLOW_EXTRA, PREVENT_EXTRA, All, Any, Length, Required, Schema, Self from ansible.module_utils.six import string_types list_string_types = list(string_types) +any_string_types = Any(*string_types) def sequence_of_sequences(min=None, max=None): @@ -91,34 +92,41 @@ option_schema = Schema( list_dict_option_schema = [{str_type: option_schema} for str_type in string_types] -def return_schema(data): - - return_schema_dict = { - Required('description'): Any(list_string_types, *string_types), - Required('returned'): Any(*string_types), - Required('type'): Any('string', 'list', 'boolean', 'dict', 'complex', 'bool', 'float', 'int', 'dictionary', 'str'), - 'version_added': Any(float, *string_types), - 'sample': Any(None, list, dict, int, float, *string_types), - 'example': Any(None, list, dict, int, float, *string_types) - } - if isinstance(data, dict): - if 'type' in data and (data['type'] == 'complex'): - # This will just check if the schema has a 'contains' value. - # It won't recursively validate the contents of the 'contains' field - additional_schema = { - Required('contains'): Any(dict, list, *string_types) - } - return_schema_dict.update(additional_schema) - - return Schema( - return_schema_dict, - extra=PREVENT_EXTRA +def return_contains(v): + schema = Schema( + { + Required('contains'): Any(dict, list, *string_types) + }, + extra=ALLOW_EXTRA ) + if v.get('type') == 'complex': + return schema(v) + return v + + +return_schema = Any( + All( + Schema( + { + any_string_types: { + Required('description'): Any(list_string_types, *string_types), + Required('returned'): Any(*string_types), + Required('type'): Any('string', 'list', 'boolean', 'dict', 'complex', 'bool', 'float', 'int', 'dictionary', 'str'), + 'version_added': Any(float, *string_types), + 'sample': Any(None, list, dict, int, float, *string_types), + 'example': Any(None, list, dict, int, float, *string_types), + 'contains': object, + } + } + ), + Schema({any_string_types: return_contains}) + ), + Schema(type(None)), +) -def deprecation_schema(): - - deprecation_schema_dict = { +deprecation_schema = Schema( + { # Only list branches that are deprecated or may have docs stubs in # Deprecation cycle changed at 2.4 (though not retroactively) # 2.3 -> removed_in: "2.5" + n for docs stub @@ -127,11 +135,9 @@ def deprecation_schema(): Required('why'): Any(*string_types), Required('alternative'): Any(*string_types), 'removed': Any(True), - } - return Schema( - deprecation_schema_dict, - extra=PREVENT_EXTRA - ) + }, + extra=PREVENT_EXTRA +) def doc_schema(module_name): @@ -155,7 +161,7 @@ def doc_schema(module_name): if deprecated_module: deprecation_required_scheme = { - Required('deprecated'): Any(deprecation_schema()), + Required('deprecated'): Any(deprecation_schema), } doc_schema_dict.update(deprecation_required_scheme) diff --git a/test/sanity/validate-modules/utils.py b/test/sanity/validate-modules/utils.py index de60a4efc2..121abe0afc 100644 --- a/test/sanity/validate-modules/utils.py +++ b/test/sanity/validate-modules/utils.py @@ -26,7 +26,6 @@ import yaml.reader from ansible.module_utils._text import to_text from ansible.module_utils.basic import AnsibleModule -from ansible.module_utils.parsing.convert_bool import boolean class AnsibleTextIOWrapper(TextIOWrapper): -- cgit v1.2.1