def generate_path_validator(api_path, path_definition, parameters, context, **kwargs): """ Generates a callable for validating the parameters in a response object. """ path_level_parameters = dereference_parameter_list( path_definition.get('parameters', []), context, ) operation_level_parameters = dereference_parameter_list( parameters, context, ) all_parameters = merge_parameter_lists( path_level_parameters, operation_level_parameters, ) # PATH in_path_parameters = filter_parameters(all_parameters, in_=PATH) return chain_reduce_partial( attrgetter('path'), generate_path_parameters_validator(api_path, in_path_parameters, context), )
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 path_to_regex(api_path, path_parameters, operation_parameters=None, global_parameters=None): if global_parameters is None: global_parameters = {} if operation_parameters is None: operation_parameters = [] pattern = path_to_pattern( api_path=api_path, parameters=merge_parameter_lists( global_parameters.values(), dereference_parameter_list(path_parameters, global_parameters), dereference_parameter_list(operation_parameters, global_parameters), ), ) return re.compile(pattern)
def path_to_regex(api_path, path_parameters, operation_parameters=None, context=None): if context is None: context = {} if operation_parameters is None: operation_parameters = [] pattern = path_to_pattern( api_path=api_path, parameters=merge_parameter_lists( context.get('parameters', {}).values(), dereference_parameter_list(path_parameters, context), dereference_parameter_list(operation_parameters, context), ), ) return re.compile(pattern)
def generate_parameters_validator(api_path, path_definition, parameters, context, **kwargs): """ Generates a validator function to validate. - request.path against the path parameters. - request.query against the query parameters. - request.headers against the header parameters. - TODO: request.body against the body parameters. - TODO: request.formData against any form data. """ # TODO: figure out how to merge this with the same code in response # validation. validators = ValidationDict() path_level_parameters = dereference_parameter_list( path_definition.get('parameters', []), context, ) operation_level_parameters = dereference_parameter_list( parameters, context, ) all_parameters = merge_parameter_lists( path_level_parameters, operation_level_parameters, ) # PATH in_path_parameters = filter_parameters(all_parameters, in_=PATH) validators.add_validator( 'path', chain_reduce_partial( operator.attrgetter('path'), generate_path_parameters_validator(api_path, in_path_parameters, context), ), ) # QUERY in_query_parameters = filter_parameters(all_parameters, in_=QUERY) validators.add_validator( 'query', chain_reduce_partial( operator.attrgetter('query_data'), functools.partial( validate_query_parameters, query_parameters=in_query_parameters, context=context, ), ), ) # HEADERS in_header_parameters = filter_parameters(all_parameters, in_=HEADER) validators.add_validator( 'headers', chain_reduce_partial( operator.attrgetter('headers'), generate_header_validator(in_header_parameters, context), ), ) # FORM_DATA # in_form_data_parameters = filter_parameters(all_parameters, in_=FORM_DATA) # validators.add_validator( # 'form_data', # chain_reduce_partial( # operator.attrgetter('data'), # generate_form_data_validator(in_form_data_parameters, context), # ) # ) # REQUEST_BODY in_request_body_parameters = filter_parameters(all_parameters, in_=BODY) validators.add_validator( 'request_body', chain_reduce_partial( operator.attrgetter('data'), generate_request_body_validator(in_request_body_parameters, context), )) return generate_object_validator(field_validators=validators)
def generate_parameters_validator(api_path, path_definition, parameters, context, **kwargs): """ Generates a validator function to validate. - request.path against the path parameters. - request.query against the query parameters. - request.headers against the header parameters. - TODO: request.body against the body parameters. - TODO: request.formData against any form data. """ # TODO: figure out how to merge this with the same code in response # validation. validators = ValidationDict() path_level_parameters = dereference_parameter_list( path_definition.get('parameters', []), context, ) operation_level_parameters = dereference_parameter_list( parameters, context, ) all_parameters = merge_parameter_lists( path_level_parameters, operation_level_parameters, ) # PATH in_path_parameters = filter_parameters(all_parameters, in_=PATH) validators.add_validator( 'path', chain_reduce_partial( attrgetter('path'), generate_path_parameters_validator(api_path, in_path_parameters, context), ), ) # QUERY in_query_parameters = filter_parameters(all_parameters, in_=QUERY) validators.add_validator( 'query', chain_reduce_partial( attrgetter('query_data'), functools.partial( validate_query_parameters, query_parameters=in_query_parameters, context=context, ), ), ) # HEADERS in_header_parameters = filter_parameters(all_parameters, in_=HEADER) validators.add_validator( 'headers', chain_reduce_partial( attrgetter('headers'), generate_header_validator(in_header_parameters, context), ), ) # FORM_DATA # in_form_data_parameters = filter_parameters(all_parameters, in_=FORM_DATA) # validators.add_validator( # 'form_data', # chain_reduce_partial( # attrgetter('data'), # generate_form_data_validator(in_form_data_parameters, context), # ) # ) # REQUEST_BODY in_request_body_parameters = filter_parameters(all_parameters, in_=BODY) validators.add_validator( 'request_body', chain_reduce_partial( attrgetter('data'), generate_request_body_validator(in_request_body_parameters, context), ) ) return generate_object_validator(field_validators=validators)