retab 0.0.36__py3-none-any.whl → 0.0.38__py3-none-any.whl

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.
Files changed (123) hide show
  1. retab/__init__.py +4 -0
  2. {uiform → retab}/_resource.py +5 -5
  3. {uiform → retab}/_utils/ai_models.py +2 -2
  4. {uiform → retab}/_utils/benchmarking.py +15 -16
  5. {uiform → retab}/_utils/chat.py +29 -34
  6. {uiform → retab}/_utils/display.py +0 -3
  7. {uiform → retab}/_utils/json_schema.py +9 -14
  8. {uiform → retab}/_utils/mime.py +11 -14
  9. {uiform → retab}/_utils/responses.py +16 -10
  10. {uiform → retab}/_utils/stream_context_managers.py +1 -1
  11. {uiform → retab}/_utils/usage/usage.py +31 -31
  12. {uiform → retab}/client.py +54 -53
  13. {uiform → retab}/resources/consensus/client.py +19 -38
  14. {uiform → retab}/resources/consensus/completions.py +36 -59
  15. {uiform → retab}/resources/consensus/completions_stream.py +35 -47
  16. {uiform → retab}/resources/consensus/responses.py +37 -86
  17. {uiform → retab}/resources/consensus/responses_stream.py +41 -89
  18. retab/resources/documents/client.py +455 -0
  19. {uiform → retab}/resources/documents/extractions.py +192 -101
  20. {uiform → retab}/resources/evals.py +56 -43
  21. retab/resources/evaluations/__init__.py +3 -0
  22. retab/resources/evaluations/client.py +301 -0
  23. retab/resources/evaluations/documents.py +233 -0
  24. retab/resources/evaluations/iterations.py +452 -0
  25. {uiform → retab}/resources/files.py +2 -2
  26. {uiform → retab}/resources/jsonlUtils.py +225 -221
  27. retab/resources/models.py +73 -0
  28. retab/resources/processors/automations/client.py +244 -0
  29. {uiform → retab}/resources/processors/automations/endpoints.py +79 -120
  30. retab/resources/processors/automations/links.py +294 -0
  31. {uiform → retab}/resources/processors/automations/logs.py +30 -19
  32. retab/resources/processors/automations/mailboxes.py +397 -0
  33. retab/resources/processors/automations/outlook.py +337 -0
  34. {uiform → retab}/resources/processors/automations/tests.py +22 -25
  35. {uiform → retab}/resources/processors/client.py +181 -166
  36. {uiform → retab}/resources/schemas.py +78 -66
  37. {uiform → retab}/resources/secrets/external_api_keys.py +1 -5
  38. retab/resources/secrets/webhook.py +64 -0
  39. {uiform → retab}/resources/usage.py +41 -4
  40. {uiform → retab}/types/ai_models.py +17 -17
  41. {uiform → retab}/types/automations/cron.py +19 -12
  42. {uiform → retab}/types/automations/endpoints.py +7 -4
  43. {uiform → retab}/types/automations/links.py +7 -3
  44. {uiform → retab}/types/automations/mailboxes.py +10 -10
  45. {uiform → retab}/types/automations/outlook.py +15 -11
  46. {uiform → retab}/types/automations/webhooks.py +1 -1
  47. retab/types/browser_canvas.py +3 -0
  48. retab/types/chat.py +8 -0
  49. {uiform → retab}/types/completions.py +12 -15
  50. retab/types/consensus.py +19 -0
  51. {uiform → retab}/types/db/annotations.py +3 -3
  52. {uiform → retab}/types/db/files.py +8 -6
  53. {uiform → retab}/types/documents/create_messages.py +20 -22
  54. {uiform → retab}/types/documents/extractions.py +71 -26
  55. {uiform → retab}/types/evals.py +5 -5
  56. retab/types/evaluations/__init__.py +31 -0
  57. retab/types/evaluations/documents.py +30 -0
  58. retab/types/evaluations/iterations.py +112 -0
  59. retab/types/evaluations/model.py +73 -0
  60. retab/types/events.py +79 -0
  61. {uiform → retab}/types/extractions.py +36 -13
  62. retab/types/inference_settings.py +15 -0
  63. retab/types/jobs/base.py +54 -0
  64. retab/types/jobs/batch_annotation.py +12 -0
  65. {uiform → retab}/types/jobs/evaluation.py +1 -2
  66. {uiform → retab}/types/logs.py +37 -34
  67. retab/types/metrics.py +32 -0
  68. {uiform → retab}/types/mime.py +22 -20
  69. {uiform → retab}/types/modalities.py +10 -10
  70. retab/types/predictions.py +19 -0
  71. {uiform → retab}/types/schemas/enhance.py +4 -2
  72. {uiform → retab}/types/schemas/evaluate.py +7 -4
  73. {uiform → retab}/types/schemas/generate.py +6 -3
  74. {uiform → retab}/types/schemas/layout.py +1 -1
  75. {uiform → retab}/types/schemas/object.py +16 -17
  76. {uiform → retab}/types/schemas/templates.py +1 -3
  77. {uiform → retab}/types/secrets/external_api_keys.py +0 -1
  78. {uiform → retab}/types/standards.py +18 -1
  79. {retab-0.0.36.dist-info → retab-0.0.38.dist-info}/METADATA +78 -77
  80. retab-0.0.38.dist-info/RECORD +107 -0
  81. retab-0.0.38.dist-info/top_level.txt +1 -0
  82. retab-0.0.36.dist-info/RECORD +0 -96
  83. retab-0.0.36.dist-info/top_level.txt +0 -1
  84. uiform/__init__.py +0 -4
  85. uiform/_utils/benchmarking copy.py +0 -588
  86. uiform/resources/documents/client.py +0 -255
  87. uiform/resources/models.py +0 -45
  88. uiform/resources/processors/automations/client.py +0 -78
  89. uiform/resources/processors/automations/links.py +0 -356
  90. uiform/resources/processors/automations/mailboxes.py +0 -435
  91. uiform/resources/processors/automations/outlook.py +0 -444
  92. uiform/resources/secrets/webhook.py +0 -62
  93. uiform/types/chat.py +0 -8
  94. uiform/types/consensus.py +0 -10
  95. uiform/types/events.py +0 -76
  96. uiform/types/jobs/base.py +0 -150
  97. uiform/types/jobs/batch_annotation.py +0 -22
  98. {uiform → retab}/_utils/__init__.py +0 -0
  99. {uiform → retab}/_utils/usage/__init__.py +0 -0
  100. {uiform → retab}/py.typed +0 -0
  101. {uiform → retab}/resources/__init__.py +0 -0
  102. {uiform → retab}/resources/consensus/__init__.py +0 -0
  103. {uiform → retab}/resources/documents/__init__.py +0 -0
  104. {uiform → retab}/resources/finetuning.py +0 -0
  105. {uiform → retab}/resources/openai_example.py +0 -0
  106. {uiform → retab}/resources/processors/__init__.py +0 -0
  107. {uiform → retab}/resources/processors/automations/__init__.py +0 -0
  108. {uiform → retab}/resources/prompt_optimization.py +0 -0
  109. {uiform → retab}/resources/secrets/__init__.py +0 -0
  110. {uiform → retab}/resources/secrets/client.py +0 -0
  111. {uiform → retab}/types/__init__.py +0 -0
  112. {uiform → retab}/types/automations/__init__.py +0 -0
  113. {uiform → retab}/types/db/__init__.py +0 -0
  114. {uiform → retab}/types/documents/__init__.py +0 -0
  115. {uiform → retab}/types/documents/correct_orientation.py +0 -0
  116. {uiform → retab}/types/jobs/__init__.py +0 -0
  117. {uiform → retab}/types/jobs/finetune.py +0 -0
  118. {uiform → retab}/types/jobs/prompt_optimization.py +0 -0
  119. {uiform → retab}/types/jobs/webcrawl.py +0 -0
  120. {uiform → retab}/types/pagination.py +0 -0
  121. {uiform → retab}/types/schemas/__init__.py +0 -0
  122. {uiform → retab}/types/secrets/__init__.py +0 -0
  123. {retab-0.0.36.dist-info → retab-0.0.38.dist-info}/WHEEL +0 -0
@@ -1,435 +0,0 @@
1
- import datetime
2
- import json
3
- from io import IOBase
4
- from pathlib import Path
5
- from typing import Any, Dict, List, Literal, Optional
6
-
7
- import httpx
8
- from openai.types.chat.chat_completion_reasoning_effort import ChatCompletionReasoningEffort
9
- from PIL.Image import Image
10
- from pydantic import HttpUrl
11
-
12
- from ...._resource import AsyncAPIResource, SyncAPIResource
13
- from ...._utils.ai_models import assert_valid_model_extraction
14
- from ...._utils.mime import prepare_mime_document
15
- from ....types.automations.mailboxes import ListMailboxes, Mailbox, UpdateMailboxRequest
16
- from ....types.documents.extractions import UiParsedChatCompletion
17
- from ....types.logs import AutomationLog, ExternalRequestLog
18
- from ....types.mime import BaseMIMEData, EmailData, MIMEData
19
- from ....types.modalities import Modality
20
- from ....types.standards import PreparedRequest
21
-
22
-
23
- class MailBoxesMixin:
24
- def prepare_create(
25
- self,
26
- email: str,
27
- name: str,
28
- json_schema: Dict[str, Any],
29
- webhook_url: HttpUrl,
30
- # email specific opitonals Fields
31
- authorized_domains: List[str] = [],
32
- authorized_emails: List[str] = [],
33
- # HTTP Config Optional Fields
34
- webhook_headers: Dict[str, str] = {},
35
- # DocumentExtraction Config
36
- image_resolution_dpi: int = 96,
37
- browser_canvas: Literal['A3', 'A4', 'A5'] = 'A4',
38
- modality: Modality = "native",
39
- model: str = "gpt-4o-mini",
40
- temperature: float = 0,
41
- reasoning_effort: ChatCompletionReasoningEffort = "medium",
42
- ) -> PreparedRequest:
43
- assert_valid_model_extraction(model)
44
-
45
- data = {
46
- "email": email,
47
- "name": name,
48
- "webhook_url": webhook_url,
49
- "webhook_headers": webhook_headers,
50
- "json_schema": json_schema,
51
- "authorized_domains": authorized_domains,
52
- "authorized_emails": authorized_emails,
53
- "image_resolution_dpi": image_resolution_dpi,
54
- "browser_canvas": browser_canvas,
55
- "modality": modality,
56
- "model": model,
57
- "temperature": temperature,
58
- "reasoning_effort": reasoning_effort,
59
- }
60
-
61
- # Validate the data
62
- mailbox_data = Mailbox.model_validate(data)
63
- return PreparedRequest(method="POST", url="/v1/deployments/mailboxes", data=mailbox_data.model_dump(mode="json"))
64
-
65
- def prepare_list(
66
- self,
67
- before: str | None = None,
68
- after: str | None = None,
69
- limit: int = 10,
70
- order: Literal["asc", "desc"] | None = "desc",
71
- email: Optional[str] = None,
72
- name: Optional[str] = None,
73
- webhook_url: Optional[str] = None,
74
- schema_id: Optional[str] = None,
75
- schema_data_id: Optional[str] = None,
76
- ) -> PreparedRequest:
77
- params = {
78
- "before": before,
79
- "after": after,
80
- "limit": limit,
81
- "order": order,
82
- "email": email,
83
- "name": name,
84
- "webhook_url": webhook_url,
85
- "schema_id": schema_id,
86
- "schema_data_id": schema_data_id,
87
- }
88
- # Remove None values
89
- params = {k: v for k, v in params.items() if v is not None}
90
-
91
- return PreparedRequest(method="GET", url="/v1/deployments/mailboxes", params=params)
92
-
93
- def prepare_get(self, email: str) -> PreparedRequest:
94
- return PreparedRequest(method="GET", url=f"/v1/processors/automations/mailboxes/{email}")
95
-
96
- def prepare_update(
97
- self,
98
- email: str,
99
- name: Optional[str] = None,
100
- webhook_url: Optional[HttpUrl] = None,
101
- webhook_headers: Optional[Dict[str, str]] = None,
102
- authorized_domains: Optional[List[str]] = None,
103
- authorized_emails: Optional[List[str]] = None,
104
- image_resolution_dpi: Optional[int] = None,
105
- browser_canvas: Optional[Literal['A3', 'A4', 'A5']] = None,
106
- modality: Optional[Modality] = None,
107
- model: Optional[str] = None,
108
- temperature: Optional[float] = None,
109
- reasoning_effort: Optional[ChatCompletionReasoningEffort] = None,
110
- json_schema: Optional[Dict[str, Any]] = None,
111
- ) -> PreparedRequest:
112
- # Build data dict excluding None values
113
- data = {
114
- k: v for k, v in {
115
- "name": name,
116
- "webhook_url": webhook_url,
117
- "webhook_headers": webhook_headers,
118
- "authorized_domains": authorized_domains,
119
- "authorized_emails": authorized_emails,
120
- "image_resolution_dpi": image_resolution_dpi,
121
- "browser_canvas": browser_canvas,
122
- "modality": modality,
123
- "model": model,
124
- "temperature": temperature,
125
- "reasoning_effort": reasoning_effort,
126
- "json_schema": json_schema,
127
- }.items() if v is not None
128
- }
129
-
130
- if "model" in data:
131
- assert_valid_model_extraction(data["model"])
132
-
133
- update_mailbox_request = UpdateMailboxRequest.model_validate(data)
134
- return PreparedRequest(
135
- method="PUT",
136
- url=f"/v1/processors/automations/mailboxes/{email}",
137
- data=update_mailbox_request.model_dump(mode="json")
138
- )
139
-
140
- def prepare_delete(self, email: str) -> PreparedRequest:
141
- return PreparedRequest(method="DELETE", url=f"/v1/processors/automations/mailboxes/{email}", raise_for_status=True)
142
-
143
- class Mailboxes(SyncAPIResource, MailBoxesMixin):
144
- """Emails API wrapper for managing email automation configurations"""
145
-
146
- def __init__(self, client: Any) -> None:
147
- super().__init__(client=client)
148
- self.tests = TestMailboxes(client=client)
149
-
150
- def create(
151
- self,
152
- email: str,
153
- name: str,
154
- json_schema: Dict[str, Any],
155
- webhook_url: HttpUrl,
156
- # email specific opitonals Fields
157
- authorized_domains: List[str] = [],
158
- authorized_emails: List[str] = [],
159
- # HTTP Config Optional Fields
160
- webhook_headers: Dict[str, str] = {},
161
- # DocumentExtraction Config
162
- image_resolution_dpi: int = 96,
163
- browser_canvas: Literal['A3', 'A4', 'A5'] = 'A4',
164
- modality: Modality = "native",
165
- model: str = "gpt-4o-mini",
166
- temperature: float = 0,
167
- reasoning_effort: ChatCompletionReasoningEffort = "medium",
168
- ) -> Mailbox:
169
- """Create a new email automation configuration.
170
-
171
- Args:
172
- email: Email address for the mailbox
173
- json_schema: JSON schema to validate extracted email data
174
- webhook_url: Webhook URL to receive processed emails
175
- webhook_headers: Webhook headers to send with processed emails
176
- authorized_domains: List of authorized domains for the mailbox
177
- authorized_emails: List of authorized emails for the mailbox
178
- image_resolution_dpi: Image resolution DPI
179
- browser_canvas: Browser canvas size
180
- modality: Processing modality (currently only "native" supported)
181
- model: AI model to use for processing
182
- temperature: Model temperature setting
183
- reasoning_effort: The effort level for the model to reason about the input data.
184
-
185
- Returns:
186
- Mailbox: The created mailbox configuration
187
- """
188
-
189
- request = self.prepare_create(
190
- email, name, json_schema, webhook_url, authorized_domains, authorized_emails, webhook_headers, image_resolution_dpi, browser_canvas, modality, model, temperature, reasoning_effort
191
- )
192
- response = self._client._prepared_request(request)
193
-
194
- print(f"Email automation created. Mailbox available at https://www.uiform.com/dashboard/processors/{response['id']}")
195
-
196
- return Mailbox.model_validate(response)
197
-
198
- def list(
199
- self,
200
- before: str | None = None,
201
- after: str | None = None,
202
- limit: int = 10,
203
- order: Literal["asc", "desc"] | None = "desc",
204
- email: Optional[str] = None,
205
- webhook_url: Optional[str] = None,
206
- schema_id: Optional[str] = None,
207
- schema_data_id: Optional[str] = None,
208
- ) -> ListMailboxes:
209
- """List all email automation configurations.
210
-
211
- Args:
212
- before: Optional cursor for pagination - get results before this log ID
213
- after: Optional cursor for pagination - get results after this log ID
214
- limit: Maximum number of logs to return (1-100, default 10)
215
- order: Sort order by creation time - "asc" or "desc" (default "desc")
216
- email: Optional email address filter
217
- webhook_url: Optional webhook URL filter
218
- schema_id: Optional schema ID filter
219
- schema_data_id: Optional schema data ID filter
220
-
221
- Returns:
222
- ListMailboxes: List of mailbox configurations
223
- """
224
- request = self.prepare_list(before, after, limit, order, email, webhook_url, schema_id, schema_data_id)
225
- response = self._client._prepared_request(request)
226
- return ListMailboxes.model_validate(response)
227
-
228
- def get(self, email: str) -> Mailbox:
229
- """Get a specific email automation configuration.
230
-
231
- Args:
232
- email: Email address of the mailbox
233
-
234
- Returns:
235
- Mailbox: The mailbox configuration
236
- """
237
- request = self.prepare_get(email)
238
- response = self._client._prepared_request(request)
239
- return Mailbox.model_validate(response)
240
-
241
- def update(
242
- self,
243
- email: str,
244
- name: Optional[str] = None,
245
- webhook_url: Optional[HttpUrl] = None,
246
- webhook_headers: Optional[Dict[str, str]] = None,
247
- authorized_domains: Optional[List[str]] = None,
248
- authorized_emails: Optional[List[str]] = None,
249
- image_resolution_dpi: Optional[int] = None,
250
- browser_canvas: Optional[Literal['A3', 'A4', 'A5']] = None,
251
- modality: Optional[Modality] = None,
252
- model: Optional[str] = None,
253
- temperature: Optional[float] = None,
254
- reasoning_effort: Optional[ChatCompletionReasoningEffort] = None,
255
- json_schema: Optional[Dict[str, Any]] = None,
256
- ) -> Mailbox:
257
- """Update an email automation configuration.
258
-
259
- Args:
260
- email: Email address of the mailbox to update
261
- webhook_url: New webhook configuration
262
- webhook_headers: New webhook configuration
263
- max_file_size: New webhook configuration
264
- file_payload: New webhook configuration
265
- follow_up: New webhook configuration
266
- authorized_domains: New webhook configuration
267
- authorized_emails: New webhook configuration
268
- image_resolution_dpi: New image resolution DPI
269
- browser_canvas: New browser canvas size
270
- modality: New processing modality
271
- model: New AI model
272
- temperature: New temperature setting
273
- reasoning_effort: New reasoning effort
274
- json_schema: New JSON schema
275
-
276
- Returns:
277
- Mailbox: The updated mailbox configuration
278
- """
279
- request = self.prepare_update(
280
- email, name, webhook_url, webhook_headers, authorized_domains, authorized_emails, image_resolution_dpi, browser_canvas, modality, model, temperature, reasoning_effort, json_schema
281
- )
282
- response = self._client._prepared_request(request)
283
- return Mailbox.model_validate(response)
284
-
285
- def delete(self, email: str) -> None:
286
- """Delete an email automation configuration.
287
-
288
- Args:
289
- email: Email address of the mailbox to delete
290
- """
291
- request = self.prepare_delete(email)
292
- response = self._client._prepared_request(request)
293
- return None
294
-
295
- class AsyncMailboxes(AsyncAPIResource, MailBoxesMixin):
296
- def __init__(self, client: Any) -> None:
297
- super().__init__(client=client)
298
- self.tests = AsyncTestMailboxes(client=client)
299
-
300
- async def create(
301
- self,
302
- email: str,
303
- name: str,
304
- json_schema: Dict[str, Any],
305
- webhook_url: HttpUrl,
306
- authorized_domains: List[str] = [],
307
- authorized_emails: List[str] = [],
308
- webhook_headers: Dict[str, str] = {},
309
- image_resolution_dpi: int = 96,
310
- browser_canvas: Literal['A3', 'A4', 'A5'] = 'A4',
311
- modality: Modality = "native",
312
- model: str = "gpt-4o-mini",
313
- temperature: float = 0,
314
- reasoning_effort: ChatCompletionReasoningEffort = "medium",
315
- ) -> Mailbox:
316
- request = self.prepare_create(
317
- email, name, json_schema, webhook_url, authorized_domains, authorized_emails, webhook_headers, image_resolution_dpi, browser_canvas, modality, model, temperature, reasoning_effort
318
- )
319
- response = await self._client._prepared_request(request)
320
-
321
- print(f"Email automation created. Mailbox available at https://www.uiform.com/dashboard/processors/{response['id']}")
322
-
323
- return Mailbox.model_validate(response)
324
-
325
- async def list(
326
- self,
327
- before: str | None = None,
328
- after: str | None = None,
329
- limit: int = 10,
330
- order: Literal["asc", "desc"] | None = "desc",
331
- email: Optional[str] = None,
332
- name: Optional[str] = None,
333
- webhook_url: Optional[str] = None,
334
- schema_id: Optional[str] = None,
335
- schema_data_id: Optional[str] = None,
336
- ) -> ListMailboxes:
337
- request = self.prepare_list(before, after, limit, order, email, webhook_url, schema_id, schema_data_id)
338
- response = await self._client._prepared_request(request)
339
- return ListMailboxes.model_validate(response)
340
-
341
- async def get(self, email: str) -> Mailbox:
342
- request = self.prepare_get(email)
343
- response = await self._client._prepared_request(request)
344
- return Mailbox.model_validate(response)
345
-
346
- async def update(
347
- self,
348
- email: str,
349
- name: Optional[str] = None,
350
- webhook_url: Optional[HttpUrl] = None,
351
- webhook_headers: Optional[Dict[str, str]] = None,
352
- authorized_domains: Optional[List[str]] = None,
353
- authorized_emails: Optional[List[str]] = None,
354
- image_resolution_dpi: Optional[int] = None,
355
- browser_canvas: Optional[Literal['A3', 'A4', 'A5']] = None,
356
- modality: Optional[Modality] = None,
357
- model: Optional[str] = None,
358
- temperature: Optional[float] = None,
359
- reasoning_effort: Optional[ChatCompletionReasoningEffort] = None,
360
- json_schema: Optional[Dict[str, Any]] = None,
361
- ) -> Mailbox:
362
- request = self.prepare_update(
363
- email, name, webhook_url, webhook_headers, authorized_domains, authorized_emails, image_resolution_dpi, browser_canvas, modality, model, temperature, reasoning_effort, json_schema
364
- )
365
- response = await self._client._prepared_request(request)
366
- return Mailbox.model_validate(response)
367
-
368
- async def delete(self, email: str) -> None:
369
- request = self.prepare_delete(email)
370
- await self._client._prepared_request(request)
371
- return None
372
-
373
-
374
- class TestMailboxesMixin:
375
- def prepare_forward(
376
- self,
377
- email: str,
378
- document: Path | str | IOBase | HttpUrl | MIMEData,
379
- verbose: bool = True,
380
- ) -> PreparedRequest:
381
- mime_document = prepare_mime_document(document)
382
- return PreparedRequest(method="POST", url=f"/v1/processors/automations/mailboxes/tests/forward/{email}", data={"document": mime_document.model_dump()})
383
-
384
- def print_forward_verbose(self, email_data: EmailData) -> None:
385
- print(f"\nTEST EMAIL FORWARDING RESULTS:")
386
- print(f"\n#########################")
387
- print(f"Email ID: {email_data.id}")
388
- print(f"Subject: {email_data.subject}")
389
- print(f"From: {email_data.sender}")
390
- print(f"To: {', '.join(str(r) for r in email_data.recipients_to)}")
391
- if email_data.recipients_cc:
392
- print(f"CC: {', '.join(str(r) for r in email_data.recipients_cc)}")
393
- print(f"Sent at: {email_data.sent_at}")
394
- print(f"Attachments: {len(email_data.attachments)}")
395
- if email_data.body_plain:
396
- print("\nBody Preview:")
397
- print(email_data.body_plain[:500] + "..." if len(email_data.body_plain) > 500 else email_data.body_plain)
398
-
399
- class TestMailboxes(SyncAPIResource, TestMailboxesMixin):
400
- def forward(
401
- self,
402
- email: str,
403
- document: Path | str | IOBase | HttpUrl | MIMEData,
404
- verbose: bool = True,
405
- ) -> EmailData:
406
- """Mock endpoint that simulates the complete email forwarding process with sample data.
407
-
408
- Args:
409
- email: Email address of the mailbox to mock
410
-
411
- Returns:
412
- DocumentExtractResponse: The simulated extraction response
413
- """
414
- request = self.prepare_forward(email, document, verbose)
415
- response = self._client._prepared_request(request)
416
-
417
- email_data = EmailData.model_validate(response)
418
-
419
- if verbose:
420
- self.print_forward_verbose(email_data)
421
- return email_data
422
-
423
- class AsyncTestMailboxes(AsyncAPIResource, TestMailboxesMixin):
424
- async def forward(
425
- self,
426
- email: str,
427
- document: Path | str | IOBase | HttpUrl | MIMEData,
428
- verbose: bool = True,
429
- ) -> EmailData:
430
- request = self.prepare_forward(email, document, verbose)
431
- response = await self._client._prepared_request(request)
432
- email_data = EmailData.model_validate(response)
433
- if verbose:
434
- self.print_forward_verbose(email_data)
435
- return email_data