def get_operation(self, link, operation_id, tag=None, schema_defs=None): operation = { 'operationId': operation_id } if link.title: operation['summary'] = link.title if link.description: operation['description'] = link.description if tag: operation['tags'] = [tag] if link.get_path_fields() or link.get_query_fields(): operation['parameters'] = [ self.get_parameter(field, schema_defs) for field in link.get_path_fields() + link.get_query_fields() ] if link.get_body_field(): schema = link.get_body_field().schema if schema is None: content_info = {} else: content_info = { 'schema': JSONSchemaCodec().encode_to_data_structure( schema, schema_defs, '#/components/schemas/' ) } operation['requestBody'] = { 'content': { link.encoding: content_info } } if link.response is not None: operation['responses'] = { str(link.response.status_code): { 'description': '', 'content': { link.response.encoding: { 'schema': JSONSchemaCodec().encode_to_data_structure( link.response.schema, schema_defs, '#/components/schemas/' ) } } } } return operation
def get_schema_definitions(self, swagger): definitions = {} schemas = lookup(swagger, ['components', 'schemas'], {}) for key, value in schemas.items(): definitions[key] = JSONSchemaCodec().decode_from_data_structure( value) return definitions
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'][len('#/components/schemas/'):] schema = schema_definitions.get(ref) else: schema = JSONSchemaCodec().decode_from_data_structure(schema) return Field( name=name, location=location, description=description, required=required, schema=schema, example=example )
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"][len("#/components/schemas/"):] schema = schema_definitions.get(ref) else: schema = JSONSchemaCodec().decode_from_data_structure(schema) return Field( name=name, location=location, description=description, required=required, schema=schema, example=example, )
def get_schema_definitions(self, data): definitions = {} schemas = lookup(data, ["components", "schemas"], {}) for key, value in schemas.items(): definitions[key] = JSONSchemaCodec().decode_from_data_structure( value) return definitions
def get_operation(self, link, operation_id, tag=None, schema_defs=None): operation = {"operationId": operation_id} if link.title: operation["summary"] = link.title if link.description: operation["description"] = link.description if tag: operation["tags"] = [tag] if link.get_path_fields() or link.get_query_fields(): operation["parameters"] = [ self.get_parameter(field, schema_defs) for field in link.get_path_fields() + link.get_query_fields() ] if link.get_body_field(): schema = link.get_body_field().schema if schema is None: content_info = {} else: content_info = { "schema": JSONSchemaCodec().encode_to_data_structure( schema, schema_defs, "#/components/schemas/") } operation["requestBody"] = { "content": { link.encoding: content_info } } if link.response is not None: operation["responses"] = { str(link.response.status_code): { "description": "", "content": { link.response.encoding: { "schema": JSONSchemaCodec().encode_to_data_structure( link.response.schema, schema_defs, "#/components/schemas/", ) } }, } } return operation
def get_parameter(self, field, schema_defs=None): parameter = {'name': field.name, 'in': field.location} if field.required: parameter['required'] = True if field.description: parameter['description'] = field.description if field.schema: parameter['schema'] = JSONSchemaCodec().encode_to_data_structure( field.schema, schema_defs, '#/components/schemas/') return parameter
def get_parameter(self, field, schema_defs=None): parameter = {"name": field.name, "in": field.location} if field.required: parameter["required"] = True if field.description: parameter["description"] = field.description if field.schema: parameter["schema"] = JSONSchemaCodec().encode_to_data_structure( field.schema, schema_defs, "#/components/schemas/") return parameter
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) else: schema = JSONSchemaCodec().decode_from_data_structure( body_schema) fields += [Field(name="body", 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 # 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) else: schema = JSONSchemaCodec().decode_from_data_structure( body_schema) if isinstance(schema, validators.Object): for key, value in schema.properties.items(): fields += [Field(name=key, location='form', schema=value)] return Link(name=name, url=urljoin(base_url, path), method=operation, title=title, description=description, fields=fields, encoding=encoding)
def test_json_schema(schema, value, is_valid, description): validator = JSONSchemaCodec().decode_from_data_structure(schema) was_valid = validator.is_valid(value) assert was_valid == is_valid, description