1
1
from http import HTTPStatus
2
- from typing import Any, Dict, List, Optional, Union, cast
2
+ from typing import Any, Dict, List, Union, cast
3
3
from time import sleep
4
4
import random
5
5
6
6
import httpx
7
7
8
8
from ...client import AuthenticatedClient, Client
9
9
from ...types import Response, UNSET
10
+ from ... import errors
10
11
11
12
{% for relative in endpoint .relative_imports %}
12
13
{{ relative }}
13
14
{% endfor %}
14
15
16
+ SLEEP_TIME = 0.05
17
+ NUM_RETRIES = 3
18
+
15
19
{% from "endpoint_macros.py.jinja" import header_params , cookie_params , query_params , json_body , multipart_body ,
16
20
arguments , client , kwargs , parse_response , docstring %}
17
21
18
- {% set return_string = endpoint .response_type () %}
19
- {% set return_type = endpoint .responses [0].prop .get_type_string () if endpoint .responses [0].prop .get_type_string () != "Any" else None %}
20
- {% set parsed_responses = (endpoint .responses | length > 0) and return_string != "Any" %}
22
+ {% set return_string = endpoint .responses [0].prop .get_type_string () if endpoint .responses [0].prop .get_type_string () != "Any" else "None" %}
23
+ {% set parsed_responses = (endpoint .responses | length > 0) %}
21
24
22
25
def _get_kwargs(
23
26
{{ arguments(endpoint) | indent(4) }}
@@ -48,7 +51,8 @@ def _get_kwargs(
48
51
"headers": headers,
49
52
"cookies": cookies,
50
53
"timeout": client.get_timeout(),
51
- {% if endpoint .form_body_class %}
54
+ "follow_redirects": client.follow_redirects,
55
+ {% if endpoint .form_body %}
52
56
"data": form_data.to_dict(),
53
57
{% elif endpoint .multipart_body %}
54
58
"files": {{ "multipart_" + endpoint.multipart_body.python_name }},
@@ -61,70 +65,72 @@ def _get_kwargs(
61
65
}
62
66
63
67
64
- {% if parsed_responses %}
65
- def _parse_response(*, response: httpx.Response) -> {{ return_type }}:
66
- {% for response in endpoint .responses if response .status_code >= 299 %}
67
- if response.status_code == {{ response.status_code }}:
68
- raise {{ response.prop.class_info.name }}({{ response.source }}, response.status_code)
68
+ def _parse_response(*, client: Client, response: httpx.Response) -> {% if return_string == "None" %} Any{% else %} {{ return_string }}{% endif %} :
69
+ {% for response in endpoint .responses %}
70
+ if response.status_code == HTTPStatus.{{ response.status_code.name }}:
71
+ {% import "property_templates/" + response .prop .template as prop_template %}
72
+ {% if 200 <= response .status_code <= 299 %}
73
+ {% if prop_template .construct %}
74
+ {{ prop_template.construct(response.prop, response.source) | indent(8) }}
75
+ {% else %}
76
+ {{ response.prop.python_name }} = cast({{ response.prop.get_type_string() }}, {{ response.source }})
77
+ {% endif %}
78
+ return {{ response.prop.python_name }}
79
+ {% else %}
80
+ raise {{ response.prop.get_type_string() }}.init_exception({{ response.source }}, response.status_code)
81
+ {% endif %}
69
82
{% endfor %}
70
- {% set ok_response = endpoint .responses [0]%}
71
- {% import "property_templates/" + ok_response .prop .template as ok_response_prop_template %}
72
- {% if ok_response .prop and ok_response .prop .required_properties == [] and ok_response .prop .optional_properties == [] %}
73
- {{ ok_response.prop.python_name }} = {{ ok_response.prop.class_info.name }}({{ ok_response.source }})
74
- {% elif ok_response_prop_template .construct %}
75
- {{ ok_response_prop_template.construct(ok_response.prop, ok_response.source) | indent(8) }}
76
- {% else %}
77
- {{ ok_response.prop.python_name }} = None
78
- {% endif %}
79
- return {{ok_response.prop.python_name}}
80
- {% endif %}
83
+ raise errors.UnexpectedStatus(response.status_code, response.content)
84
+
85
+
86
+ def _build_response(*, client: Client, response: httpx.Response) -> Response[{{ return_string }}]:
87
+ return Response(
88
+ status_code=HTTPStatus(response.status_code),
89
+ content=response.content,
90
+ headers=response.headers,
91
+ parsed=_parse_response(client=client, response=response),
92
+ )
81
93
82
- sleep_time = 0.05
83
- num_retries = 3
84
94
85
95
def sync_detailed(
86
96
{{ arguments(endpoint) | indent(4) }}
87
- ) -> {{return_type}} :
88
- {{ docstring(endpoint, return_type ) | indent(4) }}
97
+ ) -> Response[{{ return_string }}] :
98
+ {{ docstring(endpoint, return_string, is_detailed=true ) | indent(4) }}
89
99
90
100
kwargs = _get_kwargs(
91
101
{{ kwargs(endpoint) }}
92
102
)
93
103
94
104
kwargs['headers'] = {'svix-req-id':f"{random.getrandbits(32)}", **kwargs['headers']}
95
105
96
- retry_count = 0
97
- for retry in range(num_retries):
106
+ for retry_count in range(NUM_RETRIES):
98
107
response = httpx.request(
99
108
verify=client.verify_ssl,
100
109
**kwargs,
101
110
)
102
- if response.status_code >= 500 and retry < num_retries:
103
- retry_count +=1
104
- kwargs['headers']['svix-retry-count']= str(retry_count)
105
- sleep(sleep_time)
106
- sleep_time = sleep_time * 2
111
+ if response.status_code >= 500:
112
+ kwargs['headers']['svix-retry-count'] = str(retry_count)
113
+ sleep(SLEEP_TIME * (2 ** retry_count))
107
114
else:
108
115
break
109
116
110
-
111
- return _parse_response(response=response)
117
+ return _build_response(client=client, response=response)
112
118
113
119
{% if parsed_responses %}
114
120
def sync(
115
121
{{ arguments(endpoint) | indent(4) }}
116
- ) -> {{ return_type }}:
117
- {{ docstring(endpoint, return_type ) | indent(4) }}
122
+ ) -> {{ return_string }}:
123
+ {{ docstring(endpoint, return_string, is_detailed=false ) | indent(4) }}
118
124
119
125
return sync_detailed(
120
126
{{ kwargs(endpoint) }}
121
- )
127
+ ).parsed
122
128
{% endif %}
123
129
124
130
async def asyncio_detailed(
125
131
{{ arguments(endpoint) | indent(4) }}
126
- ) -> {{ return_type }}:
127
- {{ docstring(endpoint, return_type ) | indent(4) }}
132
+ ) -> Response[ {{ return_string }}] :
133
+ {{ docstring(endpoint, return_string, is_detailed=true ) | indent(4) }}
128
134
129
135
kwargs = _get_kwargs(
130
136
{{ kwargs(endpoint) }}
@@ -133,28 +139,25 @@ async def asyncio_detailed(
133
139
kwargs['headers'] = {'svix-req-id':f"{random.getrandbits(32)}", **kwargs['headers']}
134
140
135
141
async with httpx.AsyncClient(verify=client.verify_ssl) as _client:
136
- retry_count = 0
137
- for retry in range(num_retries):
142
+ for retry_count in range(NUM_RETRIES):
138
143
response = await _client.request(
139
144
**kwargs
140
145
)
141
- if response.status_code >= 500 and retry < num_retries:
142
- retry_count +=1
143
- kwargs['headers']['svix-retry-count']= str(retry_count)
144
- sleep(sleep_time)
145
- sleep_time = sleep_time * 2
146
+ if response.status_code >= 500:
147
+ kwargs['headers']['svix-retry-count'] = str(retry_count)
148
+ sleep(SLEEP_TIME * (2 ** retry_count))
146
149
else:
147
150
break
148
151
149
- return _parse_response( response=response)
152
+ return _build_response(client=client, response=response)
150
153
151
154
{% if parsed_responses %}
152
155
async def asyncio(
153
156
{{ arguments(endpoint) | indent(4) }}
154
- ) -> {{ return_type }}:
155
- {{ docstring(endpoint, return_type ) | indent(4) }}
157
+ ) -> {{ return_string }}:
158
+ {{ docstring(endpoint, return_string, is_detailed=false ) | indent(4) }}
156
159
157
160
return (await asyncio_detailed(
158
161
{{ kwargs(endpoint) }}
159
- ))
160
- {% endif %}
162
+ )).parsed
163
+ {% endif %}
0 commit comments