daknode 0.3.3__tar.gz → 0.3.4__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {daknode-0.3.3 → daknode-0.3.4}/PKG-INFO +1 -1
- daknode-0.3.4/daknode/api/events/poll_inbox_events.py +279 -0
- daknode-0.3.4/daknode/api/send/__init__.py +1 -0
- {daknode-0.3.3 → daknode-0.3.4}/daknode/models/__init__.py +6 -0
- daknode-0.3.4/daknode/models/inbox_event.py +154 -0
- daknode-0.3.4/daknode/models/inbox_event_page.py +116 -0
- daknode-0.3.4/daknode/models/poll_inbox_events_start.py +8 -0
- {daknode-0.3.3 → daknode-0.3.4}/pyproject.toml +1 -1
- {daknode-0.3.3 → daknode-0.3.4}/README.md +0 -0
- {daknode-0.3.3 → daknode-0.3.4}/daknode/__init__.py +0 -0
- {daknode-0.3.3 → daknode-0.3.4}/daknode/api/__init__.py +0 -0
- {daknode-0.3.3 → daknode-0.3.4}/daknode/api/block_rules/__init__.py +0 -0
- {daknode-0.3.3 → daknode-0.3.4}/daknode/api/block_rules/create_block_rule.py +0 -0
- {daknode-0.3.3 → daknode-0.3.4}/daknode/api/block_rules/create_inbox_block_rule.py +0 -0
- {daknode-0.3.3 → daknode-0.3.4}/daknode/api/block_rules/delete_block_rule.py +0 -0
- {daknode-0.3.3 → daknode-0.3.4}/daknode/api/block_rules/list_block_rules.py +0 -0
- {daknode-0.3.3 → daknode-0.3.4}/daknode/api/block_rules/list_inbox_block_rules.py +0 -0
- {daknode-0.3.3 → daknode-0.3.4}/daknode/api/consent/__init__.py +0 -0
- {daknode-0.3.3 → daknode-0.3.4}/daknode/api/consent/create_consent.py +0 -0
- {daknode-0.3.3 → daknode-0.3.4}/daknode/api/consent/revoke.py +0 -0
- {daknode-0.3.3 → daknode-0.3.4}/daknode/api/control_plane/__init__.py +0 -0
- {daknode-0.3.3 → daknode-0.3.4}/daknode/api/control_plane/close_workspace.py +0 -0
- {daknode-0.3.3 → daknode-0.3.4}/daknode/api/control_plane/create_workspace.py +0 -0
- {daknode-0.3.3 → daknode-0.3.4}/daknode/api/control_plane/list_workspaces.py +0 -0
- {daknode-0.3.3 → daknode-0.3.4}/daknode/api/control_plane/read_workspace.py +0 -0
- {daknode-0.3.3 → daknode-0.3.4}/daknode/api/control_plane/update_workspace.py +0 -0
- {daknode-0.3.3 → daknode-0.3.4}/daknode/api/dead_letters/__init__.py +0 -0
- {daknode-0.3.3 → daknode-0.3.4}/daknode/api/dead_letters/list_dead_letters.py +0 -0
- {daknode-0.3.3 → daknode-0.3.4}/daknode/api/dead_letters/replay_dead_letter.py +0 -0
- {daknode-0.3.3 → daknode-0.3.4}/daknode/api/domains/__init__.py +0 -0
- {daknode-0.3.3 → daknode-0.3.4}/daknode/api/domains/disable_domain.py +0 -0
- {daknode-0.3.3 → daknode-0.3.4}/daknode/api/domains/get_domain.py +0 -0
- {daknode-0.3.3 → daknode-0.3.4}/daknode/api/domains/list_domains.py +0 -0
- {daknode-0.3.3 → daknode-0.3.4}/daknode/api/domains/register_domain.py +0 -0
- {daknode-0.3.3 → daknode-0.3.4}/daknode/api/domains/verify_domain.py +0 -0
- {daknode-0.3.3/daknode/api/inboxes → daknode-0.3.4/daknode/api/events}/__init__.py +0 -0
- {daknode-0.3.3/daknode/api/messages → daknode-0.3.4/daknode/api/inboxes}/__init__.py +0 -0
- {daknode-0.3.3 → daknode-0.3.4}/daknode/api/inboxes/create_inbox.py +0 -0
- {daknode-0.3.3 → daknode-0.3.4}/daknode/api/inboxes/delete_inbox.py +0 -0
- {daknode-0.3.3 → daknode-0.3.4}/daknode/api/inboxes/get_inbox.py +0 -0
- {daknode-0.3.3 → daknode-0.3.4}/daknode/api/inboxes/list_inboxes.py +0 -0
- {daknode-0.3.3 → daknode-0.3.4}/daknode/api/inboxes/register_webhook.py +0 -0
- {daknode-0.3.3 → daknode-0.3.4}/daknode/api/inboxes/rotate_webhook_secret.py +0 -0
- {daknode-0.3.3 → daknode-0.3.4}/daknode/api/inboxes/update_inbox.py +0 -0
- {daknode-0.3.3/daknode/api/metrics → daknode-0.3.4/daknode/api/messages}/__init__.py +0 -0
- {daknode-0.3.3 → daknode-0.3.4}/daknode/api/messages/download_raw_message.py +0 -0
- {daknode-0.3.3 → daknode-0.3.4}/daknode/api/messages/download_received_attachment.py +0 -0
- {daknode-0.3.3 → daknode-0.3.4}/daknode/api/messages/get_message.py +0 -0
- {daknode-0.3.3 → daknode-0.3.4}/daknode/api/messages/get_thread.py +0 -0
- {daknode-0.3.3 → daknode-0.3.4}/daknode/api/messages/list_messages.py +0 -0
- {daknode-0.3.3 → daknode-0.3.4}/daknode/api/messages/list_received_attachments.py +0 -0
- {daknode-0.3.3 → daknode-0.3.4}/daknode/api/messages/list_threads.py +0 -0
- {daknode-0.3.3/daknode/api/privacy → daknode-0.3.4/daknode/api/metrics}/__init__.py +0 -0
- {daknode-0.3.3 → daknode-0.3.4}/daknode/api/metrics/inbox_metrics.py +0 -0
- {daknode-0.3.3 → daknode-0.3.4}/daknode/api/metrics/workspace_metrics.py +0 -0
- {daknode-0.3.3/daknode/api/public → daknode-0.3.4/daknode/api/privacy}/__init__.py +0 -0
- {daknode-0.3.3 → daknode-0.3.4}/daknode/api/privacy/create_erasure_request.py +0 -0
- {daknode-0.3.3 → daknode-0.3.4}/daknode/api/privacy/read_erasure_request.py +0 -0
- {daknode-0.3.3/daknode/api/search → daknode-0.3.4/daknode/api/public}/__init__.py +0 -0
- {daknode-0.3.3 → daknode-0.3.4}/daknode/api/public/agent_signup.py +0 -0
- {daknode-0.3.3 → daknode-0.3.4}/daknode/api/public/agent_verify.py +0 -0
- {daknode-0.3.3/daknode/api/send → daknode-0.3.4/daknode/api/search}/__init__.py +0 -0
- {daknode-0.3.3 → daknode-0.3.4}/daknode/api/search/search.py +0 -0
- {daknode-0.3.3 → daknode-0.3.4}/daknode/api/send/forward_message.py +0 -0
- {daknode-0.3.3 → daknode-0.3.4}/daknode/api/send/send.py +0 -0
- {daknode-0.3.3 → daknode-0.3.4}/daknode/client.py +0 -0
- {daknode-0.3.3 → daknode-0.3.4}/daknode/errors.py +0 -0
- {daknode-0.3.3 → daknode-0.3.4}/daknode/models/attachment_out.py +0 -0
- {daknode-0.3.3 → daknode-0.3.4}/daknode/models/block_rule_create.py +0 -0
- {daknode-0.3.3 → daknode-0.3.4}/daknode/models/block_rule_out.py +0 -0
- {daknode-0.3.3 → daknode-0.3.4}/daknode/models/block_rule_page.py +0 -0
- {daknode-0.3.3 → daknode-0.3.4}/daknode/models/check_domain_request.py +0 -0
- {daknode-0.3.3 → daknode-0.3.4}/daknode/models/consent_request.py +0 -0
- {daknode-0.3.3 → daknode-0.3.4}/daknode/models/consent_response.py +0 -0
- {daknode-0.3.3 → daknode-0.3.4}/daknode/models/create_erasure_request_response_create_erasure_request.py +0 -0
- {daknode-0.3.3 → daknode-0.3.4}/daknode/models/create_in.py +0 -0
- {daknode-0.3.3 → daknode-0.3.4}/daknode/models/daily_usage.py +0 -0
- {daknode-0.3.3 → daknode-0.3.4}/daknode/models/dead_letter_response.py +0 -0
- {daknode-0.3.3 → daknode-0.3.4}/daknode/models/delivery_cohort.py +3 -3
- {daknode-0.3.3 → daknode-0.3.4}/daknode/models/delivery_cohort_current_status.py +0 -0
- {daknode-0.3.3 → daknode-0.3.4}/daknode/models/delivery_cohort_provider_outcomes.py +0 -0
- {daknode-0.3.3 → daknode-0.3.4}/daknode/models/dns_record.py +0 -0
- {daknode-0.3.3 → daknode-0.3.4}/daknode/models/domain_out.py +0 -0
- {daknode-0.3.3 → daknode-0.3.4}/daknode/models/domain_page.py +0 -0
- {daknode-0.3.3 → daknode-0.3.4}/daknode/models/erasure_request_body.py +0 -0
- {daknode-0.3.3 → daknode-0.3.4}/daknode/models/forward_message_response_forward_message.py +0 -0
- {daknode-0.3.3 → daknode-0.3.4}/daknode/models/forward_request.py +0 -0
- {daknode-0.3.3 → daknode-0.3.4}/daknode/models/http_validation_error.py +0 -0
- {daknode-0.3.3 → daknode-0.3.4}/daknode/models/inbox_create_request.py +0 -0
- {daknode-0.3.3 → daknode-0.3.4}/daknode/models/inbox_deleted.py +0 -0
- {daknode-0.3.3 → daknode-0.3.4}/daknode/models/inbox_out.py +0 -0
- {daknode-0.3.3 → daknode-0.3.4}/daknode/models/inbox_page.py +0 -0
- {daknode-0.3.3 → daknode-0.3.4}/daknode/models/inbox_response.py +0 -0
- {daknode-0.3.3 → daknode-0.3.4}/daknode/models/inbox_update_request.py +0 -0
- {daknode-0.3.3 → daknode-0.3.4}/daknode/models/message_out.py +0 -0
- {daknode-0.3.3 → daknode-0.3.4}/daknode/models/message_page.py +0 -0
- {daknode-0.3.3 → daknode-0.3.4}/daknode/models/metrics_out.py +3 -3
- {daknode-0.3.3 → daknode-0.3.4}/daknode/models/metrics_window.py +0 -0
- {daknode-0.3.3 → daknode-0.3.4}/daknode/models/outgoing_attachment.py +0 -0
- {daknode-0.3.3 → daknode-0.3.4}/daknode/models/read_erasure_request_response_read_erasure_request.py +0 -0
- {daknode-0.3.3 → daknode-0.3.4}/daknode/models/register_domain_request.py +0 -0
- {daknode-0.3.3 → daknode-0.3.4}/daknode/models/replay_response.py +0 -0
- {daknode-0.3.3 → daknode-0.3.4}/daknode/models/revoke_request.py +0 -0
- {daknode-0.3.3 → daknode-0.3.4}/daknode/models/revoke_response_revoke.py +0 -0
- {daknode-0.3.3 → daknode-0.3.4}/daknode/models/search_match.py +0 -0
- {daknode-0.3.3 → daknode-0.3.4}/daknode/models/search_request.py +0 -0
- {daknode-0.3.3 → daknode-0.3.4}/daknode/models/search_response.py +0 -0
- {daknode-0.3.3 → daknode-0.3.4}/daknode/models/send_request.py +0 -0
- {daknode-0.3.3 → daknode-0.3.4}/daknode/models/send_response_send.py +0 -0
- {daknode-0.3.3 → daknode-0.3.4}/daknode/models/signup_in.py +0 -0
- {daknode-0.3.3 → daknode-0.3.4}/daknode/models/signup_out.py +0 -0
- {daknode-0.3.3 → daknode-0.3.4}/daknode/models/thread_detail_out.py +0 -0
- {daknode-0.3.3 → daknode-0.3.4}/daknode/models/thread_out.py +0 -0
- {daknode-0.3.3 → daknode-0.3.4}/daknode/models/thread_page.py +0 -0
- {daknode-0.3.3 → daknode-0.3.4}/daknode/models/timeline_item_out.py +0 -0
- {daknode-0.3.3 → daknode-0.3.4}/daknode/models/update_in.py +0 -0
- {daknode-0.3.3 → daknode-0.3.4}/daknode/models/usage_counts.py +0 -0
- {daknode-0.3.3 → daknode-0.3.4}/daknode/models/validation_error.py +0 -0
- {daknode-0.3.3 → daknode-0.3.4}/daknode/models/validation_error_context.py +0 -0
- {daknode-0.3.3 → daknode-0.3.4}/daknode/models/verify_in.py +0 -0
- {daknode-0.3.3 → daknode-0.3.4}/daknode/models/verify_out.py +0 -0
- {daknode-0.3.3 → daknode-0.3.4}/daknode/models/webhook_register_request.py +0 -0
- {daknode-0.3.3 → daknode-0.3.4}/daknode/models/workspace_list_out.py +0 -0
- {daknode-0.3.3 → daknode-0.3.4}/daknode/models/workspace_out.py +0 -0
- {daknode-0.3.3 → daknode-0.3.4}/daknode/py.typed +0 -0
- {daknode-0.3.3 → daknode-0.3.4}/daknode/types.py +0 -0
|
@@ -0,0 +1,279 @@
|
|
|
1
|
+
from http import HTTPStatus
|
|
2
|
+
from typing import Any, Optional, Union, cast
|
|
3
|
+
|
|
4
|
+
import httpx
|
|
5
|
+
|
|
6
|
+
from ...client import AuthenticatedClient, Client
|
|
7
|
+
from ...types import Response, UNSET
|
|
8
|
+
from ... import errors
|
|
9
|
+
|
|
10
|
+
from ...models.http_validation_error import HTTPValidationError
|
|
11
|
+
from ...models.inbox_event_page import InboxEventPage
|
|
12
|
+
from ...models.poll_inbox_events_start import PollInboxEventsStart
|
|
13
|
+
from ...types import UNSET, Unset
|
|
14
|
+
from typing import cast
|
|
15
|
+
from typing import cast, Union
|
|
16
|
+
from typing import Union
|
|
17
|
+
from uuid import UUID
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def _get_kwargs(
|
|
22
|
+
inbox_id: UUID,
|
|
23
|
+
*,
|
|
24
|
+
cursor: Union[None, Unset, str] = UNSET,
|
|
25
|
+
start: Union[Unset, PollInboxEventsStart] = PollInboxEventsStart.BEGINNING,
|
|
26
|
+
limit: Union[Unset, int] = 25,
|
|
27
|
+
wait_seconds: Union[Unset, int] = 0,
|
|
28
|
+
|
|
29
|
+
) -> dict[str, Any]:
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
params: dict[str, Any] = {}
|
|
35
|
+
|
|
36
|
+
json_cursor: Union[None, Unset, str]
|
|
37
|
+
if isinstance(cursor, Unset):
|
|
38
|
+
json_cursor = UNSET
|
|
39
|
+
else:
|
|
40
|
+
json_cursor = cursor
|
|
41
|
+
params["cursor"] = json_cursor
|
|
42
|
+
|
|
43
|
+
json_start: Union[Unset, str] = UNSET
|
|
44
|
+
if not isinstance(start, Unset):
|
|
45
|
+
json_start = start.value
|
|
46
|
+
|
|
47
|
+
params["start"] = json_start
|
|
48
|
+
|
|
49
|
+
params["limit"] = limit
|
|
50
|
+
|
|
51
|
+
params["wait_seconds"] = wait_seconds
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
params = {k: v for k, v in params.items() if v is not UNSET and v is not None}
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
_kwargs: dict[str, Any] = {
|
|
58
|
+
"method": "get",
|
|
59
|
+
"url": "/v1/inboxes/{inbox_id}/events".format(inbox_id=inbox_id,),
|
|
60
|
+
"params": params,
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
return _kwargs
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
def _parse_response(*, client: Union[AuthenticatedClient, Client], response: httpx.Response) -> Optional[Union[HTTPValidationError, InboxEventPage]]:
|
|
68
|
+
if response.status_code == 200:
|
|
69
|
+
response_200 = InboxEventPage.from_dict(response.json())
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
return response_200
|
|
74
|
+
if response.status_code == 422:
|
|
75
|
+
response_422 = HTTPValidationError.from_dict(response.json())
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
return response_422
|
|
80
|
+
if client.raise_on_unexpected_status:
|
|
81
|
+
raise errors.UnexpectedStatus(response.status_code, response.content)
|
|
82
|
+
else:
|
|
83
|
+
return None
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
def _build_response(*, client: Union[AuthenticatedClient, Client], response: httpx.Response) -> Response[Union[HTTPValidationError, InboxEventPage]]:
|
|
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
|
+
)
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
def sync_detailed(
|
|
96
|
+
inbox_id: UUID,
|
|
97
|
+
*,
|
|
98
|
+
client: AuthenticatedClient,
|
|
99
|
+
cursor: Union[None, Unset, str] = UNSET,
|
|
100
|
+
start: Union[Unset, PollInboxEventsStart] = PollInboxEventsStart.BEGINNING,
|
|
101
|
+
limit: Union[Unset, int] = 25,
|
|
102
|
+
wait_seconds: Union[Unset, int] = 0,
|
|
103
|
+
|
|
104
|
+
) -> Response[Union[HTTPValidationError, InboxEventPage]]:
|
|
105
|
+
""" Poll Inbox Events
|
|
106
|
+
|
|
107
|
+
Poll retained inbound message availability; persist next_cursor and deduplicate IDs.
|
|
108
|
+
|
|
109
|
+
No webhook registration needed. An empty response still has a tail cursor.
|
|
110
|
+
Cursors expire after one hour: restart from beginning and deduplicate on id.
|
|
111
|
+
This is not a complete webhook/audit catalogue; fetch content via the message API.
|
|
112
|
+
|
|
113
|
+
Args:
|
|
114
|
+
inbox_id (UUID):
|
|
115
|
+
cursor (Union[None, Unset, str]):
|
|
116
|
+
start (Union[Unset, PollInboxEventsStart]): Default: PollInboxEventsStart.BEGINNING.
|
|
117
|
+
limit (Union[Unset, int]): Default: 25.
|
|
118
|
+
wait_seconds (Union[Unset, int]): Default: 0.
|
|
119
|
+
|
|
120
|
+
Raises:
|
|
121
|
+
errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True.
|
|
122
|
+
httpx.TimeoutException: If the request takes longer than Client.timeout.
|
|
123
|
+
|
|
124
|
+
Returns:
|
|
125
|
+
Response[Union[HTTPValidationError, InboxEventPage]]
|
|
126
|
+
"""
|
|
127
|
+
|
|
128
|
+
|
|
129
|
+
kwargs = _get_kwargs(
|
|
130
|
+
inbox_id=inbox_id,
|
|
131
|
+
cursor=cursor,
|
|
132
|
+
start=start,
|
|
133
|
+
limit=limit,
|
|
134
|
+
wait_seconds=wait_seconds,
|
|
135
|
+
|
|
136
|
+
)
|
|
137
|
+
|
|
138
|
+
response = client.get_httpx_client().request(
|
|
139
|
+
**kwargs,
|
|
140
|
+
)
|
|
141
|
+
|
|
142
|
+
return _build_response(client=client, response=response)
|
|
143
|
+
|
|
144
|
+
def sync(
|
|
145
|
+
inbox_id: UUID,
|
|
146
|
+
*,
|
|
147
|
+
client: AuthenticatedClient,
|
|
148
|
+
cursor: Union[None, Unset, str] = UNSET,
|
|
149
|
+
start: Union[Unset, PollInboxEventsStart] = PollInboxEventsStart.BEGINNING,
|
|
150
|
+
limit: Union[Unset, int] = 25,
|
|
151
|
+
wait_seconds: Union[Unset, int] = 0,
|
|
152
|
+
|
|
153
|
+
) -> Optional[Union[HTTPValidationError, InboxEventPage]]:
|
|
154
|
+
""" Poll Inbox Events
|
|
155
|
+
|
|
156
|
+
Poll retained inbound message availability; persist next_cursor and deduplicate IDs.
|
|
157
|
+
|
|
158
|
+
No webhook registration needed. An empty response still has a tail cursor.
|
|
159
|
+
Cursors expire after one hour: restart from beginning and deduplicate on id.
|
|
160
|
+
This is not a complete webhook/audit catalogue; fetch content via the message API.
|
|
161
|
+
|
|
162
|
+
Args:
|
|
163
|
+
inbox_id (UUID):
|
|
164
|
+
cursor (Union[None, Unset, str]):
|
|
165
|
+
start (Union[Unset, PollInboxEventsStart]): Default: PollInboxEventsStart.BEGINNING.
|
|
166
|
+
limit (Union[Unset, int]): Default: 25.
|
|
167
|
+
wait_seconds (Union[Unset, int]): Default: 0.
|
|
168
|
+
|
|
169
|
+
Raises:
|
|
170
|
+
errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True.
|
|
171
|
+
httpx.TimeoutException: If the request takes longer than Client.timeout.
|
|
172
|
+
|
|
173
|
+
Returns:
|
|
174
|
+
Union[HTTPValidationError, InboxEventPage]
|
|
175
|
+
"""
|
|
176
|
+
|
|
177
|
+
|
|
178
|
+
return sync_detailed(
|
|
179
|
+
inbox_id=inbox_id,
|
|
180
|
+
client=client,
|
|
181
|
+
cursor=cursor,
|
|
182
|
+
start=start,
|
|
183
|
+
limit=limit,
|
|
184
|
+
wait_seconds=wait_seconds,
|
|
185
|
+
|
|
186
|
+
).parsed
|
|
187
|
+
|
|
188
|
+
async def asyncio_detailed(
|
|
189
|
+
inbox_id: UUID,
|
|
190
|
+
*,
|
|
191
|
+
client: AuthenticatedClient,
|
|
192
|
+
cursor: Union[None, Unset, str] = UNSET,
|
|
193
|
+
start: Union[Unset, PollInboxEventsStart] = PollInboxEventsStart.BEGINNING,
|
|
194
|
+
limit: Union[Unset, int] = 25,
|
|
195
|
+
wait_seconds: Union[Unset, int] = 0,
|
|
196
|
+
|
|
197
|
+
) -> Response[Union[HTTPValidationError, InboxEventPage]]:
|
|
198
|
+
""" Poll Inbox Events
|
|
199
|
+
|
|
200
|
+
Poll retained inbound message availability; persist next_cursor and deduplicate IDs.
|
|
201
|
+
|
|
202
|
+
No webhook registration needed. An empty response still has a tail cursor.
|
|
203
|
+
Cursors expire after one hour: restart from beginning and deduplicate on id.
|
|
204
|
+
This is not a complete webhook/audit catalogue; fetch content via the message API.
|
|
205
|
+
|
|
206
|
+
Args:
|
|
207
|
+
inbox_id (UUID):
|
|
208
|
+
cursor (Union[None, Unset, str]):
|
|
209
|
+
start (Union[Unset, PollInboxEventsStart]): Default: PollInboxEventsStart.BEGINNING.
|
|
210
|
+
limit (Union[Unset, int]): Default: 25.
|
|
211
|
+
wait_seconds (Union[Unset, int]): Default: 0.
|
|
212
|
+
|
|
213
|
+
Raises:
|
|
214
|
+
errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True.
|
|
215
|
+
httpx.TimeoutException: If the request takes longer than Client.timeout.
|
|
216
|
+
|
|
217
|
+
Returns:
|
|
218
|
+
Response[Union[HTTPValidationError, InboxEventPage]]
|
|
219
|
+
"""
|
|
220
|
+
|
|
221
|
+
|
|
222
|
+
kwargs = _get_kwargs(
|
|
223
|
+
inbox_id=inbox_id,
|
|
224
|
+
cursor=cursor,
|
|
225
|
+
start=start,
|
|
226
|
+
limit=limit,
|
|
227
|
+
wait_seconds=wait_seconds,
|
|
228
|
+
|
|
229
|
+
)
|
|
230
|
+
|
|
231
|
+
response = await client.get_async_httpx_client().request(
|
|
232
|
+
**kwargs
|
|
233
|
+
)
|
|
234
|
+
|
|
235
|
+
return _build_response(client=client, response=response)
|
|
236
|
+
|
|
237
|
+
async def asyncio(
|
|
238
|
+
inbox_id: UUID,
|
|
239
|
+
*,
|
|
240
|
+
client: AuthenticatedClient,
|
|
241
|
+
cursor: Union[None, Unset, str] = UNSET,
|
|
242
|
+
start: Union[Unset, PollInboxEventsStart] = PollInboxEventsStart.BEGINNING,
|
|
243
|
+
limit: Union[Unset, int] = 25,
|
|
244
|
+
wait_seconds: Union[Unset, int] = 0,
|
|
245
|
+
|
|
246
|
+
) -> Optional[Union[HTTPValidationError, InboxEventPage]]:
|
|
247
|
+
""" Poll Inbox Events
|
|
248
|
+
|
|
249
|
+
Poll retained inbound message availability; persist next_cursor and deduplicate IDs.
|
|
250
|
+
|
|
251
|
+
No webhook registration needed. An empty response still has a tail cursor.
|
|
252
|
+
Cursors expire after one hour: restart from beginning and deduplicate on id.
|
|
253
|
+
This is not a complete webhook/audit catalogue; fetch content via the message API.
|
|
254
|
+
|
|
255
|
+
Args:
|
|
256
|
+
inbox_id (UUID):
|
|
257
|
+
cursor (Union[None, Unset, str]):
|
|
258
|
+
start (Union[Unset, PollInboxEventsStart]): Default: PollInboxEventsStart.BEGINNING.
|
|
259
|
+
limit (Union[Unset, int]): Default: 25.
|
|
260
|
+
wait_seconds (Union[Unset, int]): Default: 0.
|
|
261
|
+
|
|
262
|
+
Raises:
|
|
263
|
+
errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True.
|
|
264
|
+
httpx.TimeoutException: If the request takes longer than Client.timeout.
|
|
265
|
+
|
|
266
|
+
Returns:
|
|
267
|
+
Union[HTTPValidationError, InboxEventPage]
|
|
268
|
+
"""
|
|
269
|
+
|
|
270
|
+
|
|
271
|
+
return (await asyncio_detailed(
|
|
272
|
+
inbox_id=inbox_id,
|
|
273
|
+
client=client,
|
|
274
|
+
cursor=cursor,
|
|
275
|
+
start=start,
|
|
276
|
+
limit=limit,
|
|
277
|
+
wait_seconds=wait_seconds,
|
|
278
|
+
|
|
279
|
+
)).parsed
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
""" Contains endpoint functions for accessing the API """
|
|
@@ -23,6 +23,8 @@ from .forward_request import ForwardRequest
|
|
|
23
23
|
from .http_validation_error import HTTPValidationError
|
|
24
24
|
from .inbox_create_request import InboxCreateRequest
|
|
25
25
|
from .inbox_deleted import InboxDeleted
|
|
26
|
+
from .inbox_event import InboxEvent
|
|
27
|
+
from .inbox_event_page import InboxEventPage
|
|
26
28
|
from .inbox_out import InboxOut
|
|
27
29
|
from .inbox_page import InboxPage
|
|
28
30
|
from .inbox_response import InboxResponse
|
|
@@ -32,6 +34,7 @@ from .message_page import MessagePage
|
|
|
32
34
|
from .metrics_out import MetricsOut
|
|
33
35
|
from .metrics_window import MetricsWindow
|
|
34
36
|
from .outgoing_attachment import OutgoingAttachment
|
|
37
|
+
from .poll_inbox_events_start import PollInboxEventsStart
|
|
35
38
|
from .read_erasure_request_response_read_erasure_request import ReadErasureRequestResponseReadErasureRequest
|
|
36
39
|
from .register_domain_request import RegisterDomainRequest
|
|
37
40
|
from .replay_response import ReplayResponse
|
|
@@ -82,6 +85,8 @@ __all__ = (
|
|
|
82
85
|
"HTTPValidationError",
|
|
83
86
|
"InboxCreateRequest",
|
|
84
87
|
"InboxDeleted",
|
|
88
|
+
"InboxEvent",
|
|
89
|
+
"InboxEventPage",
|
|
85
90
|
"InboxOut",
|
|
86
91
|
"InboxPage",
|
|
87
92
|
"InboxResponse",
|
|
@@ -91,6 +96,7 @@ __all__ = (
|
|
|
91
96
|
"MetricsOut",
|
|
92
97
|
"MetricsWindow",
|
|
93
98
|
"OutgoingAttachment",
|
|
99
|
+
"PollInboxEventsStart",
|
|
94
100
|
"ReadErasureRequestResponseReadErasureRequest",
|
|
95
101
|
"RegisterDomainRequest",
|
|
96
102
|
"ReplayResponse",
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
from collections.abc import Mapping
|
|
2
|
+
from typing import Any, TypeVar, Optional, BinaryIO, TextIO, TYPE_CHECKING, Generator
|
|
3
|
+
|
|
4
|
+
from attrs import define as _attrs_define
|
|
5
|
+
from attrs import field as _attrs_field
|
|
6
|
+
|
|
7
|
+
from ..types import UNSET, Unset
|
|
8
|
+
|
|
9
|
+
from ..types import UNSET, Unset
|
|
10
|
+
from dateutil.parser import isoparse
|
|
11
|
+
from typing import cast
|
|
12
|
+
from typing import Literal, Union, cast
|
|
13
|
+
from uuid import UUID
|
|
14
|
+
import datetime
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
T = TypeVar("T", bound="InboxEvent")
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
@_attrs_define
|
|
26
|
+
class InboxEvent:
|
|
27
|
+
"""
|
|
28
|
+
Attributes:
|
|
29
|
+
channel (str):
|
|
30
|
+
id (UUID):
|
|
31
|
+
inbox_id (UUID):
|
|
32
|
+
message_id (UUID):
|
|
33
|
+
occurred_at (datetime.datetime):
|
|
34
|
+
sequence_number (int):
|
|
35
|
+
thread_id (UUID):
|
|
36
|
+
type_ (Union[Literal['message.received'], Unset]): Default: 'message.received'.
|
|
37
|
+
"""
|
|
38
|
+
|
|
39
|
+
channel: str
|
|
40
|
+
id: UUID
|
|
41
|
+
inbox_id: UUID
|
|
42
|
+
message_id: UUID
|
|
43
|
+
occurred_at: datetime.datetime
|
|
44
|
+
sequence_number: int
|
|
45
|
+
thread_id: UUID
|
|
46
|
+
type_: Union[Literal['message.received'], Unset] = 'message.received'
|
|
47
|
+
additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
def to_dict(self) -> dict[str, Any]:
|
|
54
|
+
channel = self.channel
|
|
55
|
+
|
|
56
|
+
id = str(self.id)
|
|
57
|
+
|
|
58
|
+
inbox_id = str(self.inbox_id)
|
|
59
|
+
|
|
60
|
+
message_id = str(self.message_id)
|
|
61
|
+
|
|
62
|
+
occurred_at = self.occurred_at.isoformat()
|
|
63
|
+
|
|
64
|
+
sequence_number = self.sequence_number
|
|
65
|
+
|
|
66
|
+
thread_id = str(self.thread_id)
|
|
67
|
+
|
|
68
|
+
type_ = self.type_
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
field_dict: dict[str, Any] = {}
|
|
72
|
+
field_dict.update(self.additional_properties)
|
|
73
|
+
field_dict.update({
|
|
74
|
+
"channel": channel,
|
|
75
|
+
"id": id,
|
|
76
|
+
"inbox_id": inbox_id,
|
|
77
|
+
"message_id": message_id,
|
|
78
|
+
"occurred_at": occurred_at,
|
|
79
|
+
"sequence_number": sequence_number,
|
|
80
|
+
"thread_id": thread_id,
|
|
81
|
+
})
|
|
82
|
+
if type_ is not UNSET:
|
|
83
|
+
field_dict["type"] = type_
|
|
84
|
+
|
|
85
|
+
return field_dict
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
@classmethod
|
|
90
|
+
def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T:
|
|
91
|
+
d = dict(src_dict)
|
|
92
|
+
channel = d.pop("channel")
|
|
93
|
+
|
|
94
|
+
id = UUID(d.pop("id"))
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
inbox_id = UUID(d.pop("inbox_id"))
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
message_id = UUID(d.pop("message_id"))
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
occurred_at = isoparse(d.pop("occurred_at"))
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
sequence_number = d.pop("sequence_number")
|
|
115
|
+
|
|
116
|
+
thread_id = UUID(d.pop("thread_id"))
|
|
117
|
+
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
|
|
121
|
+
type_ = cast(Union[Literal['message.received'], Unset] , d.pop("type", UNSET))
|
|
122
|
+
if type_ != 'message.received'and not isinstance(type_, Unset):
|
|
123
|
+
raise ValueError(f"type must match const 'message.received', got '{type_}'")
|
|
124
|
+
|
|
125
|
+
inbox_event = cls(
|
|
126
|
+
channel=channel,
|
|
127
|
+
id=id,
|
|
128
|
+
inbox_id=inbox_id,
|
|
129
|
+
message_id=message_id,
|
|
130
|
+
occurred_at=occurred_at,
|
|
131
|
+
sequence_number=sequence_number,
|
|
132
|
+
thread_id=thread_id,
|
|
133
|
+
type_=type_,
|
|
134
|
+
)
|
|
135
|
+
|
|
136
|
+
|
|
137
|
+
inbox_event.additional_properties = d
|
|
138
|
+
return inbox_event
|
|
139
|
+
|
|
140
|
+
@property
|
|
141
|
+
def additional_keys(self) -> list[str]:
|
|
142
|
+
return list(self.additional_properties.keys())
|
|
143
|
+
|
|
144
|
+
def __getitem__(self, key: str) -> Any:
|
|
145
|
+
return self.additional_properties[key]
|
|
146
|
+
|
|
147
|
+
def __setitem__(self, key: str, value: Any) -> None:
|
|
148
|
+
self.additional_properties[key] = value
|
|
149
|
+
|
|
150
|
+
def __delitem__(self, key: str) -> None:
|
|
151
|
+
del self.additional_properties[key]
|
|
152
|
+
|
|
153
|
+
def __contains__(self, key: str) -> bool:
|
|
154
|
+
return key in self.additional_properties
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
from collections.abc import Mapping
|
|
2
|
+
from typing import Any, TypeVar, Optional, BinaryIO, TextIO, TYPE_CHECKING, Generator
|
|
3
|
+
|
|
4
|
+
from attrs import define as _attrs_define
|
|
5
|
+
from attrs import field as _attrs_field
|
|
6
|
+
|
|
7
|
+
from ..types import UNSET, Unset
|
|
8
|
+
|
|
9
|
+
from typing import cast
|
|
10
|
+
|
|
11
|
+
if TYPE_CHECKING:
|
|
12
|
+
from ..models.inbox_event import InboxEvent
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
T = TypeVar("T", bound="InboxEventPage")
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
@_attrs_define
|
|
23
|
+
class InboxEventPage:
|
|
24
|
+
"""
|
|
25
|
+
Attributes:
|
|
26
|
+
has_more (bool):
|
|
27
|
+
items (list['InboxEvent']):
|
|
28
|
+
next_cursor (str):
|
|
29
|
+
poll_after_seconds (int):
|
|
30
|
+
"""
|
|
31
|
+
|
|
32
|
+
has_more: bool
|
|
33
|
+
items: list['InboxEvent']
|
|
34
|
+
next_cursor: str
|
|
35
|
+
poll_after_seconds: int
|
|
36
|
+
additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
def to_dict(self) -> dict[str, Any]:
|
|
43
|
+
from ..models.inbox_event import InboxEvent
|
|
44
|
+
has_more = self.has_more
|
|
45
|
+
|
|
46
|
+
items = []
|
|
47
|
+
for items_item_data in self.items:
|
|
48
|
+
items_item = items_item_data.to_dict()
|
|
49
|
+
items.append(items_item)
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
next_cursor = self.next_cursor
|
|
54
|
+
|
|
55
|
+
poll_after_seconds = self.poll_after_seconds
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
field_dict: dict[str, Any] = {}
|
|
59
|
+
field_dict.update(self.additional_properties)
|
|
60
|
+
field_dict.update({
|
|
61
|
+
"has_more": has_more,
|
|
62
|
+
"items": items,
|
|
63
|
+
"next_cursor": next_cursor,
|
|
64
|
+
"poll_after_seconds": poll_after_seconds,
|
|
65
|
+
})
|
|
66
|
+
|
|
67
|
+
return field_dict
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
@classmethod
|
|
72
|
+
def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T:
|
|
73
|
+
from ..models.inbox_event import InboxEvent
|
|
74
|
+
d = dict(src_dict)
|
|
75
|
+
has_more = d.pop("has_more")
|
|
76
|
+
|
|
77
|
+
items = []
|
|
78
|
+
_items = d.pop("items")
|
|
79
|
+
for items_item_data in (_items):
|
|
80
|
+
items_item = InboxEvent.from_dict(items_item_data)
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
items.append(items_item)
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
next_cursor = d.pop("next_cursor")
|
|
88
|
+
|
|
89
|
+
poll_after_seconds = d.pop("poll_after_seconds")
|
|
90
|
+
|
|
91
|
+
inbox_event_page = cls(
|
|
92
|
+
has_more=has_more,
|
|
93
|
+
items=items,
|
|
94
|
+
next_cursor=next_cursor,
|
|
95
|
+
poll_after_seconds=poll_after_seconds,
|
|
96
|
+
)
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
inbox_event_page.additional_properties = d
|
|
100
|
+
return inbox_event_page
|
|
101
|
+
|
|
102
|
+
@property
|
|
103
|
+
def additional_keys(self) -> list[str]:
|
|
104
|
+
return list(self.additional_properties.keys())
|
|
105
|
+
|
|
106
|
+
def __getitem__(self, key: str) -> Any:
|
|
107
|
+
return self.additional_properties[key]
|
|
108
|
+
|
|
109
|
+
def __setitem__(self, key: str, value: Any) -> None:
|
|
110
|
+
self.additional_properties[key] = value
|
|
111
|
+
|
|
112
|
+
def __delitem__(self, key: str) -> None:
|
|
113
|
+
del self.additional_properties[key]
|
|
114
|
+
|
|
115
|
+
def __contains__(self, key: str) -> bool:
|
|
116
|
+
return key in self.additional_properties
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
@@ -14,8 +14,8 @@ from typing import Union
|
|
|
14
14
|
import datetime
|
|
15
15
|
|
|
16
16
|
if TYPE_CHECKING:
|
|
17
|
-
from ..models.delivery_cohort_provider_outcomes import DeliveryCohortProviderOutcomes
|
|
18
17
|
from ..models.delivery_cohort_current_status import DeliveryCohortCurrentStatus
|
|
18
|
+
from ..models.delivery_cohort_provider_outcomes import DeliveryCohortProviderOutcomes
|
|
19
19
|
|
|
20
20
|
|
|
21
21
|
|
|
@@ -54,8 +54,8 @@ class DeliveryCohort:
|
|
|
54
54
|
|
|
55
55
|
|
|
56
56
|
def to_dict(self) -> dict[str, Any]:
|
|
57
|
-
from ..models.delivery_cohort_provider_outcomes import DeliveryCohortProviderOutcomes
|
|
58
57
|
from ..models.delivery_cohort_current_status import DeliveryCohortCurrentStatus
|
|
58
|
+
from ..models.delivery_cohort_provider_outcomes import DeliveryCohortProviderOutcomes
|
|
59
59
|
accepted_sends = self.accepted_sends
|
|
60
60
|
|
|
61
61
|
current_status = self.current_status.to_dict()
|
|
@@ -96,8 +96,8 @@ class DeliveryCohort:
|
|
|
96
96
|
|
|
97
97
|
@classmethod
|
|
98
98
|
def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T:
|
|
99
|
-
from ..models.delivery_cohort_provider_outcomes import DeliveryCohortProviderOutcomes
|
|
100
99
|
from ..models.delivery_cohort_current_status import DeliveryCohortCurrentStatus
|
|
100
|
+
from ..models.delivery_cohort_provider_outcomes import DeliveryCohortProviderOutcomes
|
|
101
101
|
d = dict(src_dict)
|
|
102
102
|
accepted_sends = d.pop("accepted_sends")
|
|
103
103
|
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
@@ -13,10 +13,10 @@ from typing import Union
|
|
|
13
13
|
from uuid import UUID
|
|
14
14
|
|
|
15
15
|
if TYPE_CHECKING:
|
|
16
|
-
from ..models.usage_counts import UsageCounts
|
|
17
16
|
from ..models.delivery_cohort import DeliveryCohort
|
|
18
17
|
from ..models.daily_usage import DailyUsage
|
|
19
18
|
from ..models.metrics_window import MetricsWindow
|
|
19
|
+
from ..models.usage_counts import UsageCounts
|
|
20
20
|
|
|
21
21
|
|
|
22
22
|
|
|
@@ -53,10 +53,10 @@ class MetricsOut:
|
|
|
53
53
|
|
|
54
54
|
|
|
55
55
|
def to_dict(self) -> dict[str, Any]:
|
|
56
|
-
from ..models.usage_counts import UsageCounts
|
|
57
56
|
from ..models.delivery_cohort import DeliveryCohort
|
|
58
57
|
from ..models.daily_usage import DailyUsage
|
|
59
58
|
from ..models.metrics_window import MetricsWindow
|
|
59
|
+
from ..models.usage_counts import UsageCounts
|
|
60
60
|
daily = []
|
|
61
61
|
for daily_item_data in self.daily:
|
|
62
62
|
daily_item = daily_item_data.to_dict()
|
|
@@ -104,10 +104,10 @@ class MetricsOut:
|
|
|
104
104
|
|
|
105
105
|
@classmethod
|
|
106
106
|
def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T:
|
|
107
|
-
from ..models.usage_counts import UsageCounts
|
|
108
107
|
from ..models.delivery_cohort import DeliveryCohort
|
|
109
108
|
from ..models.daily_usage import DailyUsage
|
|
110
109
|
from ..models.metrics_window import MetricsWindow
|
|
110
|
+
from ..models.usage_counts import UsageCounts
|
|
111
111
|
d = dict(src_dict)
|
|
112
112
|
daily = []
|
|
113
113
|
_daily = d.pop("daily")
|
|
File without changes
|
|
File without changes
|
{daknode-0.3.3 → daknode-0.3.4}/daknode/models/read_erasure_request_response_read_erasure_request.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|