Source code for swagger_spec_compatibility.rules.removed_properties_from_request_objects_with_additional_properties_set_to_false

# -*- coding: utf-8 -*-
from __future__ import absolute_import
from __future__ import print_function
from __future__ import unicode_literals

import typing

from bravado_core.spec import Spec

from swagger_spec_compatibility.rules.common import BaseRule
from swagger_spec_compatibility.rules.common import Level
from swagger_spec_compatibility.rules.common import RuleType
from swagger_spec_compatibility.rules.common import ValidationMessage
from swagger_spec_compatibility.util import is_path_in_top_level_paths
from swagger_spec_compatibility.walkers import format_path
from swagger_spec_compatibility.walkers.additional_properties import AdditionalPropertiesDifferWalker
from swagger_spec_compatibility.walkers.additional_properties import DiffType
from swagger_spec_compatibility.walkers.request_parameters import RequestParametersWalker


[docs]class RemovedPropertiesFromRequestObjectsWithAdditionalPropertiesSetToFalse(BaseRule): description = \ 'If the object is defined with additionalProperties set to False then the object will not allow presence of ' \ 'properties not defined on the properties section of the object definition. Removing a definition of an ' \ 'existing property makes objects sent from a client, that is using "old" Swagger specs, to the server be ' \ 'considered invalid by the backend.' error_code = 'REQ-E003' error_level = Level.ERROR rule_type = RuleType.REQUEST_CONTRACT short_name = 'Removing properties from an object with additionalProperties set to False used as request parameter'
[docs] @classmethod def validate(cls, left_spec, right_spec): # type: (Spec, Spec) -> typing.Iterable[ValidationMessage] request_parameter_paths = RequestParametersWalker(left_spec, right_spec).walk() for additional_properties_diff in AdditionalPropertiesDifferWalker(left_spec, right_spec).walk(): if additional_properties_diff.diff_type != DiffType.PROPERTIES: continue if additional_properties_diff.properties and not additional_properties_diff.properties.old: continue if not is_path_in_top_level_paths(request_parameter_paths, additional_properties_diff.path): continue yield cls.validation_message(format_path(additional_properties_diff.path))