File: protocols.py

package info (click to toggle)
python-openapi-core 0.22.0-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 2,104 kB
  • sloc: python: 19,979; makefile: 44
file content (123 lines) | stat: -rw-r--r-- 3,646 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
"""OpenAPI core protocols"""

from typing import Any
from typing import Mapping
from typing import Optional
from typing import Protocol
from typing import Union
from typing import runtime_checkable

from werkzeug.datastructures import Headers

from openapi_core.datatypes import RequestParameters

# Type alias for headers that accepts both Mapping and werkzeug Headers
HeadersType = Union[Mapping[str, Any], Headers]


@runtime_checkable
class BaseRequest(Protocol):
    parameters: RequestParameters

    @property
    def method(self) -> str:
        """The request method, as lowercase string."""

    @property
    def body(self) -> Optional[bytes]:
        """The request body, as bytes (None if not provided)."""

    @property
    def content_type(self) -> str:
        """The content type with parameters (e.g., charset, boundary, etc.) and always lowercase."""


@runtime_checkable
class Request(BaseRequest, Protocol):
    """Request protocol.

    Attributes:
        host_url: Url with scheme and host.
            For example: https://localhost:8000
        path: Request path.
        full_url_pattern: The matched url with scheme, host and path pattern.
            For example: https://localhost:8000/api/v1/pets
                         https://localhost:8000/api/v1/pets/{pet_id}
        method: The request method, as lowercase string.
        parameters: A RequestParameters object. Needs to support path attribute setter
            to write resolved path parameters.
        content_type: The content type with parameters (e.g., charset, boundary, etc.)
            and always lowercase.
        body: The request body, as bytes (None if not provided).
    """

    @property
    def host_url(self) -> str:
        """Url with scheme and host. For example: https://localhost:8000"""

    @property
    def path(self) -> str:
        """Request path."""


@runtime_checkable
class WebhookRequest(BaseRequest, Protocol):
    """Webhook request protocol.

    Attributes:
        name: Webhook name.
        method: The request method, as lowercase string.
        parameters: A RequestParameters object. Needs to support path attribute setter
            to write resolved path parameters.
        content_type: The content type with parameters (e.g., charset, boundary, etc.)
            and always lowercase.
        body: The request body, as bytes (None if not provided).
    """

    @property
    def name(self) -> str:
        """Webhook name."""


@runtime_checkable
class SupportsPathPattern(Protocol):
    """Supports path_pattern protocol.

    You also need to provide path variables in RequestParameters.

    Attributes:
        path_pattern: The matched path pattern.
            For example: /api/v1/pets/{pet_id}
    """

    @property
    def path_pattern(self) -> str:
        """The matched path pattern. For example: /api/v1/pets/{pet_id}"""


@runtime_checkable
class Response(Protocol):
    """Response protocol.

    Attributes:
        status_code: The status code as integer.
        headers: Response headers as Headers.
        content_type: The content type with parameters and always lowercase.
        data: The response body, as bytes (None if not provided).
    """

    @property
    def status_code(self) -> int:
        """The status code as integer."""

    @property
    def content_type(self) -> str:
        """The content type with parameters and always lowercase."""

    @property
    def headers(self) -> HeadersType:
        """Response headers as Headers."""

    @property
    def data(self) -> Optional[bytes]:
        """The response body, as bytes (None if not provided)."""