예제 #1
0
    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,
        )
예제 #2
0
    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)
예제 #3
0
    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)
예제 #4
0
 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__)
예제 #5
0
    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,
        )
예제 #6
0
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',
예제 #7
0
    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,
        )