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 # Allow path info and operation info to override the base url. base_url = lookup(path_info, ["servers", 0, "url"], default=base_url) base_url = lookup(operation_info, ["servers", 0, "url"], default=base_url) # 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 ] # TODO: Handle media type generically here... body_schema = lookup( operation_info, ["requestBody", "content", "application/json", "schema"] ) encoding = None if body_schema: encoding = "application/json" if "$ref" in body_schema: ref = body_schema["$ref"] schema = schema_definitions.get(ref) field_name = ref[len("#/components/schemas/") :].lower() else: schema = typesystem.from_json_schema( body_schema, definitions=schema_definitions ) field_name = "body" field_name = lookup( operation_info, ["requestBody", "x-name"], default=field_name ) fields += [Field(name=field_name, location="body", schema=schema)] return Link( name=name, url=urljoin(base_url, path), method=operation, title=title, description=description, fields=fields, encoding=encoding, )
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 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 # Allow path info and operation info to override the base url. base_url = lookup(path_info, ['servers', 0, 'url'], default=base_url) base_url = lookup(operation_info, ['servers', 0, 'url'], default=base_url) # 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 ] # TODO: Handle media type generically here... body_schema = lookup( operation_info, ['requestBody', 'content', 'application/json', 'schema']) encoding = None if body_schema: encoding = 'application/json' if '$ref' in body_schema: ref = body_schema['$ref'][len('#/components/schemas/'):] schema = schema_definitions.get(ref) field_name = ref.lower() else: schema = JSONSchema().decode_from_data_structure(body_schema) field_name = 'body' field_name = lookup(operation_info, ['requestBody', 'x-name'], default=field_name) fields += [Field(name=field_name, location='body', schema=schema)] return Link(name=name, url=urljoin(base_url, path), method=operation, title=title, description=description, fields=fields, encoding=encoding)
def generate_link(self, url, method, handler, name): fields = self.generate_fields(url, method, handler) response = self.generate_response(handler) encoding = None if any([f.location == 'body' for f in fields]): encoding = 'application/json' return Link(url=url, method=method, name=name, encoding=encoding, fields=fields, response=response, description=handler.__doc__)
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 # Allow path info and operation info to override the base url. base_url = lookup(path_info, ["servers", 0, "url"], default=base_url) base_url = lookup(operation_info, ["servers", 0, "url"], default=base_url) # 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" 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, )
class User(types.Type): name = validators.String(max_length=10) age = validators.Integer(minimum=0, allow_null=True, default=None) def type_body_param(user: User): return {"user": user} def schema_enforced_body_param(user: ValidatedRequestData): return {"user": user} document = Document([ # Path parameters Link(url='/str_path_param/{param}/', method='GET', name='str_path_param'), Link(url='/int_path_param/{param}/', method='GET', name='int_path_param'), Link(url='/schema_enforced_str_path_param/{param}/', method='GET', name='schema_enforced_str_path_param', fields=[ Field(name='param', location='path', required=True, schema=validators.String(max_length=3)) ]), Link(url='/schema_enforced_int_path_param/{param}/', method='GET', name='schema_enforced_int_path_param', fields=[ Field(name='param',
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=typesystem.Object( properties={ field.name: typesystem.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, )