def resolve(self, parameter: inspect.Parameter, path_params: ValidatedPathParams, query_params: ValidatedQueryParams): params = path_params if (parameter.name in path_params) else query_params has_default = parameter.default is not parameter.empty allow_null = parameter.default is None param_validator = { parameter.empty: validators.Any(), str: validators.String(allow_null=allow_null), int: validators.Integer(allow_null=allow_null), float: validators.Number(allow_null=allow_null), bool: validators.Boolean(allow_null=allow_null) }[parameter.annotation] validator = validators.Object( properties=[(parameter.name, param_validator)], required=[] if has_default else [parameter.name]) try: params = validator.validate(params, allow_coerce=True) except validators.ValidationError as exc: raise exceptions.NotFound(exc.detail) return params.get(parameter.name, parameter.default)
def get_link(self, base_url, path, path_info, operation, operation_info, schema_definitions): """ Return a single link in the document. """ name = operation_info.get('operationId') title = operation_info.get('summary') description = operation_info.get('description') if name is None: name = _simple_slugify(title) if not name: return None # Parameters are taken both from the path info, and from the operation. parameters = path_info.get('parameters', []) parameters += operation_info.get('parameters', []) fields = [ self.get_field(parameter, schema_definitions) for parameter in parameters ] default_encoding = None if any([field.location == 'body' for field in fields]): default_encoding = 'application/json' elif any([field.location == 'formData' for field in fields]): default_encoding = 'application/x-www-form-urlencoded' form_fields = [ field for field in fields if field.location == 'formData' ] body_field = Field( name='body', location='body', schema=validators.Object(properties={ field.name: validators.Any() if field.schema is None else field.schema for field in form_fields }, required=[ field.name for field in form_fields if field.required ])) fields = [ field for field in fields if field.location != 'formData' ] fields.append(body_field) encoding = lookup(operation_info, ['consumes', 0], default_encoding) return Link(name=name, url=urljoin(base_url, path), method=operation, title=title, description=description, fields=fields, encoding=encoding)
def resolve(self, route: Route, query_params: http.QueryParams) -> ValidatedQueryParams: query_fields = route.link.get_query_fields() validator = validators.Object( properties=[(field.name, field.schema if field.schema else validators.Any()) for field in query_fields], required=[field.name for field in query_fields if field.required]) try: query_params = validator.validate(query_params, allow_coerce=True) except validators.ValidationError as exc: raise exceptions.BadRequest(exc.detail) return ValidatedQueryParams(query_params)
def resolve(self, route: Route, path_params: http.PathParams) -> ValidatedPathParams: path_fields = route.link.get_path_fields() validator = validators.Object( properties=[(field.name, field.schema if field.schema else validators.Any()) for field in path_fields], required=[field.name for field in path_fields]) try: path_params = validator.validate(path_params, allow_coerce=True) except validators.ValidationError as exc: raise exceptions.NotFound(exc.detail) return ValidatedPathParams(path_params)
def decode(struct): typestrings = get_typestrings(struct) if is_any(typestrings, struct): return validators.Any() allow_null = False if "null" in typestrings: allow_null = True typestrings.remove("null") if len(typestrings) == 1: return load_type(typestrings.pop(), struct, allow_null) else: items = [load_type(typename, struct, False) for typename in typestrings] return validators.Union(items=items, allow_null=allow_null)
def request(self, name: str, **params): link = self.lookup_link(name) validator = validators.Object( properties={field.name: validators.Any() for field in link.fields}, required=[field.name for field in link.fields if field.required], additional_properties=False) validator.validate(params) method = link.method url = self.get_url(link, params) query_params = self.get_query_params(link, params) (content, encoding) = self.get_content_and_encoding(link, params) return self.transport.send(method, url, query_params=query_params, content=content, encoding=encoding)
def request(self, operation_id: str, **params): link = self.lookup_operation(operation_id) validator = validators.Object( properties={field.name: validators.Any() for field in link.fields}, required=[field.name for field in link.fields if field.required], additional_properties=False) try: validator.validate(params) except exceptions.ValidationError as exc: raise exceptions.ClientError(messages=exc.messages) from None method = link.method url = self.get_url(link, params) query_params = self.get_query_params(link, params) (content, encoding) = self.get_content_and_encoding(link, params) return self.transport.send(method, url, query_params=query_params, content=content, encoding=encoding)
OPEN_API = validators.Object( def_name='OpenAPI', title='OpenAPI', properties=[ ('openapi', validators.String()), ('info', validators.Ref('Info')), ('servers', validators.Array(items=validators.Ref('Server'))), ('paths', validators.Ref('Paths')), ('components', validators.Ref('Components')), ('security', validators.Ref('SecurityRequirement')), ('tags', validators.Array(items=validators.Ref('Tag'))), ('externalDocs', validators.Ref('ExternalDocumentation')), ], pattern_properties={ '^x-': validators.Any(), }, additional_properties=False, required=['openapi', 'info'], definitions={ 'Info': validators.Object( properties=[ ('title', validators.String()), ('description', validators.String(format='textarea')), ('termsOfService', validators.String(format='url')), ('contact', validators.Ref('Contact')), ('license', validators.Ref('License')), ('version', validators.String()), ], pattern_properties={ '^x-': validators.Any(),
properties={"$ref": validators.String(pattern="^#/components/responses/")}) SWAGGER = validators.Object( def_name="Swagger", title="Swagger", properties=[ ("swagger", validators.String()), ("info", validators.Ref("Info")), ("paths", validators.Ref("Paths")), ("host", validators.String()), ("basePath", validators.String()), ("schemes", validators.Array(items=validators.String())), ("consumes", validators.Array(items=validators.String())), ("produces", validators.Array(items=validators.String())), ("definitions", validators.Object(additional_properties=validators.Any())), ( "parameters", validators.Object( additional_properties=validators.Ref("Parameters")), ), ( "responses", validators.Object( additional_properties=validators.Ref("Responses")), ), ( "securityDefinitions", validators.Object( additional_properties=validators.Ref("SecurityScheme")), ),
OPEN_API = validators.Object( def_name="OpenAPI", title="OpenAPI", properties=[ ("openapi", validators.String()), ("info", validators.Ref("Info")), ("servers", validators.Array(items=validators.Ref("Server"))), ("paths", validators.Ref("Paths")), ("components", validators.Ref("Components")), ("security", validators.Array(items=validators.Ref("SecurityRequirement"))), ("tags", validators.Array(items=validators.Ref("Tag"))), ("externalDocs", validators.Ref("ExternalDocumentation")), ], pattern_properties={"^x-": validators.Any()}, additional_properties=False, required=["openapi", "info", "paths"], definitions={ "Info": validators.Object( properties=[ ("title", validators.String()), ("description", validators.String(format="textarea")), ("termsOfService", validators.String(format="url")), ("contact", validators.Ref("Contact")), ("license", validators.Ref("License")), ("version", validators.String()), ], pattern_properties={"^x-": validators.Any()}, additional_properties=False,
class DataIn(types.Type): name = validators.String(max_length=100) request_id = validators.Any() payload = validators.String()
class SuperHero(types.Type): id = validators.Integer(allow_null=True) name = validators.String(allow_null=True) ID = validators.Any(allow_null=True) ALIGN = validators.Any(allow_null=True) ALIVE = validators.Any(allow_null=True)
class BlockType(types.Type): index = validators.Integer() timestamp = validators.DateTime() data = validators.Any() previous_hash = validators.String() hash = validators.String()
('description', validators.String(format='textarea')), ('url', validators.String(format='url')) ], required=['url']), 'Parameter': validators.Object( properties=[('name', validators.String()), ('in', validators.String( enum=['query', 'header', 'path', 'cookie'])), ('description', validators.String(format='textarea')), ('required', validators.Boolean()), ('deprecated', validators.Boolean()), ('allowEmptyValue', validators.Boolean()), ('schema', JSON_SCHEMA | SCHEMA_REF), ('example', validators.Any()) # TODO: Other fields ], required=['name', 'in']), 'RequestBody': validators.Object( properties=[('description', validators.String()), ('content', validators.Object( additional_properties=validators.Ref('MediaType')) ), ('required', validators.Boolean())]), 'MediaType': validators.Object( properties=[('schema', JSON_SCHEMA | SCHEMA_REF), ('example', validators.Any()) # TODO 'examples', 'encoding'
OPEN_API = validators.Object( def_name='OpenAPI', title='OpenAPI', properties=[ ('openapi', validators.String()), ('info', validators.Ref('Info')), ('servers', validators.Array(items=validators.Ref('Server'))), ('paths', validators.Ref('Paths')), ('components', validators.Ref('Components')), ('security', validators.Array(items=validators.Ref('SecurityRequirement'))), ('tags', validators.Array(items=validators.Ref('Tag'))), ('externalDocs', validators.Ref('ExternalDocumentation')), ], pattern_properties={ '^x-': validators.Any(), }, additional_properties=False, required=['openapi', 'info', 'paths'], definitions={ 'Info': validators.Object( properties=[ ('title', validators.String()), ('description', validators.String(format='textarea')), ('termsOfService', validators.String(format='url')), ('contact', validators.Ref('Contact')), ('license', validators.Ref('License')), ('version', validators.String()), ], pattern_properties={ '^x-': validators.Any(),
properties={'$ref': validators.String(pattern='^#/components/responses/')}) SWAGGER = validators.Object( def_name='Swagger', title='Swagger', properties=[ ('swagger', validators.String()), ('info', validators.Ref('Info')), ('paths', validators.Ref('Paths')), ('host', validators.String()), ('basePath', validators.String()), ('schemes', validators.Array(items=validators.String())), ('consumes', validators.Array(items=validators.String())), ('produces', validators.Array(items=validators.String())), ('definitions', validators.Object(additional_properties=validators.Any())), ('parameters', validators.Object( additional_properties=validators.Ref('Parameters'))), ('responses', validators.Object(additional_properties=validators.Ref('Responses'))), ('securityDefinitions', validators.Object( additional_properties=validators.Ref('SecurityScheme'))), ('security', validators.Array(items=validators.Ref('SecurityRequirement'))), ('tags', validators.Array(items=validators.Ref('Tag'))), ('externalDocs', validators.Ref('ExternalDocumentation')), ], pattern_properties={ '^x-': validators.Any(),
properties={'$ref': validators.String(pattern='^#/responses/')}) SWAGGER = validators.Object( def_name='Swagger', title='Swagger', properties=[ ('swagger', validators.String()), ('info', validators.Ref('Info')), ('paths', validators.Ref('Paths')), ('host', validators.String()), ('basePath', validators.String()), ('schemes', validators.Array(items=validators.String())), ('consumes', validators.Array(items=validators.String())), ('produces', validators.Array(items=validators.String())), ('definitions', validators.Object(additional_properties=validators.Any())), ('parameters', validators.Object( additional_properties=validators.Ref('Parameters'))), ('responses', validators.Object(additional_properties=validators.Ref('Responses'))), ('securityDefinitions', validators.Object( additional_properties=validators.Ref('SecurityScheme'))), ('security', validators.Array(items=validators.Ref('SecurityRequirement'))), ('tags', validators.Array(items=validators.Ref('Tag'))), ('externalDocs', validators.Ref('ExternalDocumentation')), ], pattern_properties={ '^x-': validators.Any(),