def get_field(self, parameter, schema_definitions): """ Return a single field in a link. """ name = parameter.get("name") location = parameter.get("in") description = parameter.get("description") required = parameter.get("required", False) schema = parameter.get("schema") example = parameter.get("example") if schema is not None: if "$ref" in schema: ref = schema["$ref"] schema = schema_definitions.get(ref) else: schema = typesystem.from_json_schema( schema, definitions=schema_definitions) return Field( name=name, location=location, description=description, required=required, schema=schema, example=example, )
def get_schema_definitions(self, data): definitions = typesystem.SchemaDefinitions() schemas = lookup(data, ["components", "schemas"], {}) for key, value in schemas.items(): ref = f"#/components/schemas/{key}" definitions[ref] = typesystem.from_json_schema( value, definitions=definitions) return definitions
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, )