def validate(self, attrs): with ErrorCollection(inner=True) as errors: for api_path, path_definition in attrs.items(): path_parameter_names = set(get_parameter_names_from_path(api_path)) if path_definition is None: continue api_path_level_parameters = dereference_parameter_list( path_definition.get('parameters', []), parameter_definitions=self.context.get('parameters', {}), ) path_request_methods = set(REQUEST_METHODS).intersection( path_definition.keys(), ) if not path_request_methods: for parameter in api_path_level_parameters: if parameter['name'] not in path_parameter_names: errors[api_path].append( MESSAGES["path"]["missing_parameter"].format( parameter['name'], api_path, ), ) for method, operation_definition in path_definition.items(): if method not in REQUEST_METHODS: continue if operation_definition is None: operation_definition = {} operation_level_parameters = dereference_parameter_list( operation_definition.get('parameters', []), parameter_definitions=self.context.get('parameters', {}), ) parameters_in_path = filter_parameters( merge_parameter_lists( api_path_level_parameters, operation_level_parameters, ), in_=PATH, ) for parameter in parameters_in_path: if parameter['name'] not in path_parameter_names: key = "{method}:{api_path}".format( method=method.upper(), api_path=api_path, ) errors[key].append( MESSAGES["path"]["missing_parameter"].format( parameter['name'], api_path, ), ) return super(PathsSerializer, self).validate(attrs)
def test_getting_names_from_parametrized_path(): path = "/get/{username}/also/{with_underscores}/and/{id}" names = get_parameter_names_from_path(path) assert len(names) == 3 assert ("username", "with_underscores", "id") == names
def test_non_parametrized_path_returns_empty(): path = "/get/with/no-parameters" names = get_parameter_names_from_path(path) assert len(names) == 0