funora 0.0.1.dev2__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 (87) hide show
  1. funora/__init__.py +265 -0
  2. funora/_account.py +661 -0
  3. funora/_aclient.py +1484 -0
  4. funora/_budget.py +579 -0
  5. funora/_calc.py +182 -0
  6. funora/_canonical.py +235 -0
  7. funora/_catalog.py +473 -0
  8. funora/_chat_history.py +367 -0
  9. funora/_chats.py +392 -0
  10. funora/_chips.py +403 -0
  11. funora/_classify.py +466 -0
  12. funora/_client.py +1490 -0
  13. funora/_currency_switch.py +130 -0
  14. funora/_cursor.py +120 -0
  15. funora/_delivered.py +233 -0
  16. funora/_diff.py +752 -0
  17. funora/_engine.py +4795 -0
  18. funora/_extract.py +124 -0
  19. funora/_field_schema.py +112 -0
  20. funora/_fileio.py +58 -0
  21. funora/_gate.py +69 -0
  22. funora/_hops.py +101 -0
  23. funora/_host.py +120 -0
  24. funora/_identity.py +284 -0
  25. funora/_json.py +31 -0
  26. funora/_listen.py +312 -0
  27. funora/_lot_form.py +331 -0
  28. funora/_market.py +406 -0
  29. funora/_matching.py +147 -0
  30. funora/_money.py +279 -0
  31. funora/_monitoring.py +396 -0
  32. funora/_observed.py +237 -0
  33. funora/_order.py +552 -0
  34. funora/_order_details.py +281 -0
  35. funora/_orders.py +807 -0
  36. funora/_outbound.py +453 -0
  37. funora/_own_lots.py +301 -0
  38. funora/_poll.py +410 -0
  39. funora/_price_audit.py +281 -0
  40. funora/_proxies.py +232 -0
  41. funora/_raise.py +150 -0
  42. funora/_refund.py +102 -0
  43. funora/_result.py +157 -0
  44. funora/_retry.py +213 -0
  45. funora/_review_write.py +138 -0
  46. funora/_reviews.py +584 -0
  47. funora/_runner.py +651 -0
  48. funora/_secret.py +385 -0
  49. funora/_showcase.py +362 -0
  50. funora/_signals.py +375 -0
  51. funora/_skeleton.py +752 -0
  52. funora/_snapshot.py +276 -0
  53. funora/_state.py +279 -0
  54. funora/_stock.py +32 -0
  55. funora/_thread.py +574 -0
  56. funora/_transport.py +1023 -0
  57. funora/_updates.py +292 -0
  58. funora/_verdicts.py +91 -0
  59. funora/_viewing.py +143 -0
  60. funora/_watch.py +825 -0
  61. funora/_watch_state.py +237 -0
  62. funora/_whoami.py +546 -0
  63. funora/bot/__init__.py +52 -0
  64. funora/bot/_delivery.py +341 -0
  65. funora/bot/_outbox.py +261 -0
  66. funora/bot/_runtime.py +447 -0
  67. funora/bot/_spool.py +534 -0
  68. funora/budget.py +311 -0
  69. funora/capabilities.py +297 -0
  70. funora/conformance.py +758 -0
  71. funora/contract.py +73 -0
  72. funora/errors.py +996 -0
  73. funora/events.py +189 -0
  74. funora/extraction.py +420 -0
  75. funora/observe.py +560 -0
  76. funora/operations.py +671 -0
  77. funora/py.typed +0 -0
  78. funora/reconciliation.py +51 -0
  79. funora/response_classes.py +155 -0
  80. funora/retry.py +238 -0
  81. funora/send_outcome.py +78 -0
  82. funora/skeleton_format.py +77 -0
  83. funora-0.0.1.dev2.dist-info/METADATA +294 -0
  84. funora-0.0.1.dev2.dist-info/RECORD +87 -0
  85. funora-0.0.1.dev2.dist-info/WHEEL +4 -0
  86. funora-0.0.1.dev2.dist-info/entry_points.txt +2 -0
  87. funora-0.0.1.dev2.dist-info/licenses/LICENSE +201 -0
funora/errors.py ADDED
@@ -0,0 +1,996 @@
1
+ r"""Иерархия ошибок Funora.
2
+
3
+ Файл порождён из спецификации, править его руками нельзя: правка исчезнет при
4
+ следующей сборке. Источник - spec/errors/errors.yaml в репозитории Funora-spec.
5
+ Перестроить: .venv\Scripts\python.exe tools/codegen.py
6
+
7
+ Числовой код abi_code одинаков во всех шести SDK и не переиспользуется
8
+ никогда: код, освободившийся после удаления ошибки, остаётся занятым
9
+ навсегда, иначе старый клиент истолкует новую ошибку как прежнюю.
10
+
11
+ Имя TimeoutError затеняет встроенное. Это разрешено спецификацией и не
12
+ требует переименования: имена ошибок одинаковы во всех реализациях, и
13
+ уступать одному языку значило бы разойтись с пятью остальными. Внутри
14
+ пакета встроенное исключение доступно как builtins.TimeoutError.
15
+ """
16
+
17
+ from __future__ import annotations
18
+
19
+ from typing import ClassVar, Final
20
+
21
+ __all__ = [
22
+ "FunoraError",
23
+ "ConfigurationError",
24
+ "AuthenticationError",
25
+ "ValidationError",
26
+ "CapabilityError",
27
+ "TransportError",
28
+ "ProtocolError",
29
+ "DomainError",
30
+ "StateError",
31
+ "HandlerError",
32
+ "BudgetError",
33
+ "UsageError",
34
+ "InvalidCredentialsError",
35
+ "SessionExpiredError",
36
+ "AccessBlockedError",
37
+ "ChallengeRequiredError",
38
+ "CurrencyMismatchError",
39
+ "UnsupportedCapabilityError",
40
+ "ExperimentalCapabilityError",
41
+ "NotImplementedOperationError",
42
+ "TimeoutError",
43
+ "NetworkError",
44
+ "RateLimitedError",
45
+ "RemoteServerError",
46
+ "ProtocolChangedError",
47
+ "ParseError",
48
+ "UnexpectedResponseError",
49
+ "EntityNotFoundError",
50
+ "ConflictError",
51
+ "PreconditionFailedError",
52
+ "CursorIncompatibleError",
53
+ "StateSchemaIncompatibleError",
54
+ "HandlerTimeoutError",
55
+ "HandlerCancelledError",
56
+ "BudgetExhaustedError",
57
+ "UnobservedFieldError",
58
+ "IncompleteResultError",
59
+ "ERROR_BY_STABLE_ID",
60
+ "ERROR_BY_ABI_CODE",
61
+ ]
62
+
63
+
64
+ class FunoraError(Exception):
65
+ """Базовый тип всех ошибок Funora.
66
+
67
+ Повтор не поможет.
68
+
69
+ Attributes:
70
+ stable_id (str): Устойчивый идентификатор "funora.error".
71
+ abi_code (int): Числовой код 1000, общий для всех SDK.
72
+ retryable (bool): Допустим ли повтор: False.
73
+ side_effects_possible (bool): Могло ли действие произойти: False.
74
+ user_actionable (bool): Исправляется ли вызывающим: False.
75
+ since_spec (str): Версия спецификации "0.1.0".
76
+ """
77
+
78
+ stable_id: ClassVar[str] = "funora.error"
79
+ abi_code: ClassVar[int] = 1000
80
+ retryable: ClassVar[bool] = False
81
+ side_effects_possible: ClassVar[bool] = False
82
+ user_actionable: ClassVar[bool] = False
83
+ since_spec: ClassVar[str] = "0.1.0"
84
+
85
+
86
+ class ConfigurationError(FunoraError):
87
+ """Клиент собран неверно; повтор не поможет, нужно исправить конфигурацию.
88
+
89
+ Повтор не поможет, исправляется тем, кто вызвал.
90
+
91
+ Attributes:
92
+ stable_id (str): Устойчивый идентификатор "funora.configuration".
93
+ abi_code (int): Числовой код 1100, общий для всех SDK.
94
+ retryable (bool): Допустим ли повтор: False.
95
+ side_effects_possible (bool): Могло ли действие произойти: False.
96
+ user_actionable (bool): Исправляется ли вызывающим: True.
97
+ since_spec (str): Версия спецификации "0.1.0".
98
+ """
99
+
100
+ stable_id: ClassVar[str] = "funora.configuration"
101
+ abi_code: ClassVar[int] = 1100
102
+ retryable: ClassVar[bool] = False
103
+ side_effects_possible: ClassVar[bool] = False
104
+ user_actionable: ClassVar[bool] = True
105
+ since_spec: ClassVar[str] = "0.1.0"
106
+
107
+
108
+ class AuthenticationError(FunoraError):
109
+ """Не удалось подтвердить личность владельца сессии.
110
+
111
+ Повтор не поможет, исправляется тем, кто вызвал.
112
+
113
+ Attributes:
114
+ stable_id (str): Устойчивый идентификатор "funora.auth".
115
+ abi_code (int): Числовой код 1200, общий для всех SDK.
116
+ retryable (bool): Допустим ли повтор: False.
117
+ side_effects_possible (bool): Могло ли действие произойти: False.
118
+ user_actionable (bool): Исправляется ли вызывающим: True.
119
+ since_spec (str): Версия спецификации "0.1.0".
120
+ """
121
+
122
+ stable_id: ClassVar[str] = "funora.auth"
123
+ abi_code: ClassVar[int] = 1200
124
+ retryable: ClassVar[bool] = False
125
+ side_effects_possible: ClassVar[bool] = False
126
+ user_actionable: ClassVar[bool] = True
127
+ since_spec: ClassVar[str] = "0.1.0"
128
+
129
+
130
+ class ValidationError(FunoraError):
131
+ """Аргументы вызова не прошли проверку до отправки запроса.
132
+
133
+ Повтор не поможет, исправляется тем, кто вызвал.
134
+
135
+ Attributes:
136
+ stable_id (str): Устойчивый идентификатор "funora.validation".
137
+ abi_code (int): Числовой код 1300, общий для всех SDK.
138
+ retryable (bool): Допустим ли повтор: False.
139
+ side_effects_possible (bool): Могло ли действие произойти: False.
140
+ user_actionable (bool): Исправляется ли вызывающим: True.
141
+ since_spec (str): Версия спецификации "0.1.0".
142
+ """
143
+
144
+ stable_id: ClassVar[str] = "funora.validation"
145
+ abi_code: ClassVar[int] = 1300
146
+ retryable: ClassVar[bool] = False
147
+ side_effects_possible: ClassVar[bool] = False
148
+ user_actionable: ClassVar[bool] = True
149
+ since_spec: ClassVar[str] = "0.1.0"
150
+
151
+
152
+ class CapabilityError(FunoraError):
153
+ """Запрошенная возможность недоступна в текущем адаптере или для этого аккаунта.
154
+
155
+ Повтор не поможет, исправляется тем, кто вызвал.
156
+
157
+ Attributes:
158
+ stable_id (str): Устойчивый идентификатор "funora.capability".
159
+ abi_code (int): Числовой код 1400, общий для всех SDK.
160
+ retryable (bool): Допустим ли повтор: False.
161
+ side_effects_possible (bool): Могло ли действие произойти: False.
162
+ user_actionable (bool): Исправляется ли вызывающим: True.
163
+ since_spec (str): Версия спецификации "0.1.0".
164
+ """
165
+
166
+ stable_id: ClassVar[str] = "funora.capability"
167
+ abi_code: ClassVar[int] = 1400
168
+ retryable: ClassVar[bool] = False
169
+ side_effects_possible: ClassVar[bool] = False
170
+ user_actionable: ClassVar[bool] = True
171
+ since_spec: ClassVar[str] = "0.1.0"
172
+
173
+
174
+ class TransportError(FunoraError):
175
+ """Сетевой уровень. side_effects_possible=true по умолчанию: запрос мог дойти до
176
+ площадки и быть выполненным до того, как оборвался ответ. Автоматический повтор
177
+ допустим только для операций с safety=safe или при наличии ключа
178
+ идемпотентности; в остальных случаях требуется сверка состояния.
179
+
180
+ Повтор допустим, действие могло произойти несмотря на ошибку.
181
+
182
+ Attributes:
183
+ stable_id (str): Устойчивый идентификатор "funora.transport".
184
+ abi_code (int): Числовой код 1500, общий для всех SDK.
185
+ retryable (bool): Допустим ли повтор: True.
186
+ side_effects_possible (bool): Могло ли действие произойти: True.
187
+ user_actionable (bool): Исправляется ли вызывающим: False.
188
+ since_spec (str): Версия спецификации "0.1.0".
189
+ """
190
+
191
+ stable_id: ClassVar[str] = "funora.transport"
192
+ abi_code: ClassVar[int] = 1500
193
+ retryable: ClassVar[bool] = True
194
+ side_effects_possible: ClassVar[bool] = True
195
+ user_actionable: ClassVar[bool] = False
196
+ since_spec: ClassVar[str] = "0.1.0"
197
+
198
+
199
+ class ProtocolError(FunoraError):
200
+ """Ответ площадки не соответствует тому, что ожидает адаптер.
201
+
202
+ Повтор не поможет.
203
+
204
+ Attributes:
205
+ stable_id (str): Устойчивый идентификатор "funora.protocol".
206
+ abi_code (int): Числовой код 1600, общий для всех SDK.
207
+ retryable (bool): Допустим ли повтор: False.
208
+ side_effects_possible (bool): Могло ли действие произойти: False.
209
+ user_actionable (bool): Исправляется ли вызывающим: False.
210
+ since_spec (str): Версия спецификации "0.1.0".
211
+ """
212
+
213
+ stable_id: ClassVar[str] = "funora.protocol"
214
+ abi_code: ClassVar[int] = 1600
215
+ retryable: ClassVar[bool] = False
216
+ side_effects_possible: ClassVar[bool] = False
217
+ user_actionable: ClassVar[bool] = False
218
+ since_spec: ClassVar[str] = "0.1.0"
219
+
220
+
221
+ class DomainError(FunoraError):
222
+ """Запрос корректен, но противоречит состоянию предметной области.
223
+
224
+ Повтор не поможет, исправляется тем, кто вызвал.
225
+
226
+ Attributes:
227
+ stable_id (str): Устойчивый идентификатор "funora.domain".
228
+ abi_code (int): Числовой код 1700, общий для всех SDK.
229
+ retryable (bool): Допустим ли повтор: False.
230
+ side_effects_possible (bool): Могло ли действие произойти: False.
231
+ user_actionable (bool): Исправляется ли вызывающим: True.
232
+ since_spec (str): Версия спецификации "0.1.0".
233
+ """
234
+
235
+ stable_id: ClassVar[str] = "funora.domain"
236
+ abi_code: ClassVar[int] = 1700
237
+ retryable: ClassVar[bool] = False
238
+ side_effects_possible: ClassVar[bool] = False
239
+ user_actionable: ClassVar[bool] = True
240
+ since_spec: ClassVar[str] = "0.1.0"
241
+
242
+
243
+ class StateError(FunoraError):
244
+ """Проблема с персистентным состоянием клиента.
245
+
246
+ Повтор не поможет, исправляется тем, кто вызвал.
247
+
248
+ Attributes:
249
+ stable_id (str): Устойчивый идентификатор "funora.state".
250
+ abi_code (int): Числовой код 1800, общий для всех SDK.
251
+ retryable (bool): Допустим ли повтор: False.
252
+ side_effects_possible (bool): Могло ли действие произойти: False.
253
+ user_actionable (bool): Исправляется ли вызывающим: True.
254
+ since_spec (str): Версия спецификации "0.1.0".
255
+ """
256
+
257
+ stable_id: ClassVar[str] = "funora.state"
258
+ abi_code: ClassVar[int] = 1800
259
+ retryable: ClassVar[bool] = False
260
+ side_effects_possible: ClassVar[bool] = False
261
+ user_actionable: ClassVar[bool] = True
262
+ since_spec: ClassVar[str] = "0.1.0"
263
+
264
+
265
+ class HandlerError(FunoraError):
266
+ """Ошибка внутри пользовательского обработчика.
267
+
268
+ Повтор не поможет, действие могло произойти несмотря на ошибку, исправляется тем,
269
+ кто вызвал.
270
+
271
+ Attributes:
272
+ stable_id (str): Устойчивый идентификатор "funora.handler".
273
+ abi_code (int): Числовой код 1850, общий для всех SDK.
274
+ retryable (bool): Допустим ли повтор: False.
275
+ side_effects_possible (bool): Могло ли действие произойти: True.
276
+ user_actionable (bool): Исправляется ли вызывающим: True.
277
+ since_spec (str): Версия спецификации "0.1.0".
278
+ """
279
+
280
+ stable_id: ClassVar[str] = "funora.handler"
281
+ abi_code: ClassVar[int] = 1850
282
+ retryable: ClassVar[bool] = False
283
+ side_effects_possible: ClassVar[bool] = True
284
+ user_actionable: ClassVar[bool] = True
285
+ since_spec: ClassVar[str] = "0.1.0"
286
+
287
+
288
+ class BudgetError(FunoraError):
289
+ """Локальное ограничение SDK не позволило выполнить операцию.
290
+
291
+ Повтор не поможет, исправляется тем, кто вызвал.
292
+
293
+ Attributes:
294
+ stable_id (str): Устойчивый идентификатор "funora.budget".
295
+ abi_code (int): Числовой код 1900, общий для всех SDK.
296
+ retryable (bool): Допустим ли повтор: False.
297
+ side_effects_possible (bool): Могло ли действие произойти: False.
298
+ user_actionable (bool): Исправляется ли вызывающим: True.
299
+ since_spec (str): Версия спецификации "0.1.0".
300
+ """
301
+
302
+ stable_id: ClassVar[str] = "funora.budget"
303
+ abi_code: ClassVar[int] = 1900
304
+ retryable: ClassVar[bool] = False
305
+ side_effects_possible: ClassVar[bool] = False
306
+ user_actionable: ClassVar[bool] = True
307
+ since_spec: ClassVar[str] = "0.1.0"
308
+
309
+
310
+ class UsageError(FunoraError):
311
+ """SDK использован неверно. Повтор не поможет, данные ни при чём, исправлять надо
312
+ вызывающий код.
313
+
314
+ Повтор не поможет, исправляется тем, кто вызвал.
315
+
316
+ Attributes:
317
+ stable_id (str): Устойчивый идентификатор "funora.usage".
318
+ abi_code (int): Числовой код 1950, общий для всех SDK.
319
+ retryable (bool): Допустим ли повтор: False.
320
+ side_effects_possible (bool): Могло ли действие произойти: False.
321
+ user_actionable (bool): Исправляется ли вызывающим: True.
322
+ since_spec (str): Версия спецификации "0.1.0".
323
+ """
324
+
325
+ stable_id: ClassVar[str] = "funora.usage"
326
+ abi_code: ClassVar[int] = 1950
327
+ retryable: ClassVar[bool] = False
328
+ side_effects_possible: ClassVar[bool] = False
329
+ user_actionable: ClassVar[bool] = True
330
+ since_spec: ClassVar[str] = "0.1.0"
331
+
332
+
333
+ class InvalidCredentialsError(AuthenticationError):
334
+ """Ключ не принят площадкой. Повторять запрещено - серия попыток выглядит как подбор.
335
+
336
+ Повтор не поможет, исправляется тем, кто вызвал.
337
+
338
+ Attributes:
339
+ stable_id (str): Устойчивый идентификатор "funora.auth.invalid_credentials".
340
+ abi_code (int): Числовой код 1201, общий для всех SDK.
341
+ retryable (bool): Допустим ли повтор: False.
342
+ side_effects_possible (bool): Могло ли действие произойти: False.
343
+ user_actionable (bool): Исправляется ли вызывающим: True.
344
+ since_spec (str): Версия спецификации "0.1.0".
345
+ """
346
+
347
+ stable_id: ClassVar[str] = "funora.auth.invalid_credentials"
348
+ abi_code: ClassVar[int] = 1201
349
+ retryable: ClassVar[bool] = False
350
+ side_effects_possible: ClassVar[bool] = False
351
+ user_actionable: ClassVar[bool] = True
352
+ since_spec: ClassVar[str] = "0.1.0"
353
+
354
+
355
+ class SessionExpiredError(AuthenticationError):
356
+ """Сессия была валидной и перестала быть. Обнаруживается в том числе по ответу HTTP 200
357
+ с формой логина - самый опасный случай, потому что для парсера он выглядит как
358
+ обычная страница.
359
+
360
+ Повтор не поможет, исправляется тем, кто вызвал.
361
+
362
+ Attributes:
363
+ stable_id (str): Устойчивый идентификатор "funora.auth.session_expired".
364
+ abi_code (int): Числовой код 1202, общий для всех SDK.
365
+ retryable (bool): Допустим ли повтор: False.
366
+ side_effects_possible (bool): Могло ли действие произойти: False.
367
+ user_actionable (bool): Исправляется ли вызывающим: True.
368
+ since_spec (str): Версия спецификации "0.1.0".
369
+ """
370
+
371
+ stable_id: ClassVar[str] = "funora.auth.session_expired"
372
+ abi_code: ClassVar[int] = 1202
373
+ retryable: ClassVar[bool] = False
374
+ side_effects_possible: ClassVar[bool] = False
375
+ user_actionable: ClassVar[bool] = True
376
+ since_spec: ClassVar[str] = "0.1.0"
377
+
378
+
379
+ class AccessBlockedError(AuthenticationError):
380
+ """Площадка отказала в доступе аккаунту или адресу. Поведение fail-closed: опрос
381
+ останавливается, автоматический короткий backoff запрещён.
382
+
383
+ Повтор не поможет, исправляется тем, кто вызвал.
384
+
385
+ Attributes:
386
+ stable_id (str): Устойчивый идентификатор "funora.auth.access_blocked".
387
+ abi_code (int): Числовой код 1203, общий для всех SDK.
388
+ retryable (bool): Допустим ли повтор: False.
389
+ side_effects_possible (bool): Могло ли действие произойти: False.
390
+ user_actionable (bool): Исправляется ли вызывающим: True.
391
+ since_spec (str): Версия спецификации "0.1.0".
392
+ """
393
+
394
+ stable_id: ClassVar[str] = "funora.auth.access_blocked"
395
+ abi_code: ClassVar[int] = 1203
396
+ retryable: ClassVar[bool] = False
397
+ side_effects_possible: ClassVar[bool] = False
398
+ user_actionable: ClassVar[bool] = True
399
+ since_spec: ClassVar[str] = "0.1.0"
400
+
401
+
402
+ class ChallengeRequiredError(AuthenticationError):
403
+ """Площадка требует прохождения проверки. Funora её не обходит и не решает - это явная
404
+ не-цель проекта. Ошибка существует, чтобы отличить проверку от поломки разметки:
405
+ без неё клиент продолжит стучаться и подтвердит подозрение.
406
+
407
+ Повтор не поможет, исправляется тем, кто вызвал.
408
+
409
+ Attributes:
410
+ stable_id (str): Устойчивый идентификатор "funora.auth.challenge_required".
411
+ abi_code (int): Числовой код 1204, общий для всех SDK.
412
+ retryable (bool): Допустим ли повтор: False.
413
+ side_effects_possible (bool): Могло ли действие произойти: False.
414
+ user_actionable (bool): Исправляется ли вызывающим: True.
415
+ since_spec (str): Версия спецификации "0.1.0".
416
+ """
417
+
418
+ stable_id: ClassVar[str] = "funora.auth.challenge_required"
419
+ abi_code: ClassVar[int] = 1204
420
+ retryable: ClassVar[bool] = False
421
+ side_effects_possible: ClassVar[bool] = False
422
+ user_actionable: ClassVar[bool] = True
423
+ since_spec: ClassVar[str] = "0.1.0"
424
+
425
+
426
+ class CurrencyMismatchError(ValidationError):
427
+ """Арифметика между суммами в разных валютах запрещена.
428
+
429
+ Повтор не поможет, исправляется тем, кто вызвал.
430
+
431
+ Attributes:
432
+ stable_id (str): Устойчивый идентификатор "funora.validation.currency_mismatch".
433
+ abi_code (int): Числовой код 1301, общий для всех SDK.
434
+ retryable (bool): Допустим ли повтор: False.
435
+ side_effects_possible (bool): Могло ли действие произойти: False.
436
+ user_actionable (bool): Исправляется ли вызывающим: True.
437
+ since_spec (str): Версия спецификации "0.1.0".
438
+ """
439
+
440
+ stable_id: ClassVar[str] = "funora.validation.currency_mismatch"
441
+ abi_code: ClassVar[int] = 1301
442
+ retryable: ClassVar[bool] = False
443
+ side_effects_possible: ClassVar[bool] = False
444
+ user_actionable: ClassVar[bool] = True
445
+ since_spec: ClassVar[str] = "0.1.0"
446
+
447
+
448
+ class UnsupportedCapabilityError(CapabilityError):
449
+ """Возможность отсутствует по позитивному свидетельству: страница получена, отпечаток
450
+ совпал, элемента функции нет. Не выставляется по ошибке сети.
451
+
452
+ Повтор не поможет, исправляется тем, кто вызвал.
453
+
454
+ Attributes:
455
+ stable_id (str): Устойчивый идентификатор "funora.capability.unsupported".
456
+ abi_code (int): Числовой код 1401, общий для всех SDK.
457
+ retryable (bool): Допустим ли повтор: False.
458
+ side_effects_possible (bool): Могло ли действие произойти: False.
459
+ user_actionable (bool): Исправляется ли вызывающим: True.
460
+ since_spec (str): Версия спецификации "0.1.0".
461
+ """
462
+
463
+ stable_id: ClassVar[str] = "funora.capability.unsupported"
464
+ abi_code: ClassVar[int] = 1401
465
+ retryable: ClassVar[bool] = False
466
+ side_effects_possible: ClassVar[bool] = False
467
+ user_actionable: ClassVar[bool] = True
468
+ since_spec: ClassVar[str] = "0.1.0"
469
+
470
+
471
+ class ExperimentalCapabilityError(CapabilityError):
472
+ """Возможность помечена experimental и требует явного включения.
473
+
474
+ Повтор не поможет, исправляется тем, кто вызвал.
475
+
476
+ Attributes:
477
+ stable_id (str): Устойчивый идентификатор "funora.capability.experimental".
478
+ abi_code (int): Числовой код 1402, общий для всех SDK.
479
+ retryable (bool): Допустим ли повтор: False.
480
+ side_effects_possible (bool): Могло ли действие произойти: False.
481
+ user_actionable (bool): Исправляется ли вызывающим: True.
482
+ since_spec (str): Версия спецификации "0.1.0".
483
+ """
484
+
485
+ stable_id: ClassVar[str] = "funora.capability.experimental"
486
+ abi_code: ClassVar[int] = 1402
487
+ retryable: ClassVar[bool] = False
488
+ side_effects_possible: ClassVar[bool] = False
489
+ user_actionable: ClassVar[bool] = True
490
+ since_spec: ClassVar[str] = "0.1.0"
491
+
492
+
493
+ class NotImplementedOperationError(CapabilityError, AttributeError):
494
+ """Операция объявлена контрактом и не написана этой реализацией. Отличается от
495
+ unsupported тем, что говорит о SDK, а не о площадке: площадка функцию имеет,
496
+ руки не дошли.
497
+
498
+ Повтор не поможет.
499
+
500
+ Attributes:
501
+ stable_id (str): Устойчивый идентификатор "funora.capability.not_implemented".
502
+ abi_code (int): Числовой код 1403, общий для всех SDK.
503
+ retryable (bool): Допустим ли повтор: False.
504
+ side_effects_possible (bool): Могло ли действие произойти: False.
505
+ user_actionable (bool): Исправляется ли вызывающим: False.
506
+ since_spec (str): Версия спецификации "0.6.0".
507
+ """
508
+
509
+ stable_id: ClassVar[str] = "funora.capability.not_implemented"
510
+ abi_code: ClassVar[int] = 1403
511
+ retryable: ClassVar[bool] = False
512
+ side_effects_possible: ClassVar[bool] = False
513
+ user_actionable: ClassVar[bool] = False
514
+ since_spec: ClassVar[str] = "0.6.0"
515
+
516
+
517
+ class TimeoutError(TransportError):
518
+ """Ответ не получен вовремя. Исход операции неизвестен - это ambiguous timeout, и
519
+ повтор небезопасной операции без сверки состояния запрещён.
520
+
521
+ Повтор допустим, действие могло произойти несмотря на ошибку.
522
+
523
+ Attributes:
524
+ stable_id (str): Устойчивый идентификатор "funora.transport.timeout".
525
+ abi_code (int): Числовой код 1501, общий для всех SDK.
526
+ retryable (bool): Допустим ли повтор: True.
527
+ side_effects_possible (bool): Могло ли действие произойти: True.
528
+ user_actionable (bool): Исправляется ли вызывающим: False.
529
+ since_spec (str): Версия спецификации "0.1.0".
530
+ """
531
+
532
+ stable_id: ClassVar[str] = "funora.transport.timeout"
533
+ abi_code: ClassVar[int] = 1501
534
+ retryable: ClassVar[bool] = True
535
+ side_effects_possible: ClassVar[bool] = True
536
+ user_actionable: ClassVar[bool] = False
537
+ since_spec: ClassVar[str] = "0.1.0"
538
+
539
+
540
+ class NetworkError(TransportError):
541
+ """Соединение не установлено или разорвано. Исход неизвестен, если разрыв произошёл
542
+ после отправки: повтор небезопасной операции требует сверки состояния.
543
+
544
+ Повтор допустим, действие могло произойти несмотря на ошибку.
545
+
546
+ Attributes:
547
+ stable_id (str): Устойчивый идентификатор "funora.transport.network".
548
+ abi_code (int): Числовой код 1502, общий для всех SDK.
549
+ retryable (bool): Допустим ли повтор: True.
550
+ side_effects_possible (bool): Могло ли действие произойти: True.
551
+ user_actionable (bool): Исправляется ли вызывающим: False.
552
+ since_spec (str): Версия спецификации "0.1.0".
553
+ """
554
+
555
+ stable_id: ClassVar[str] = "funora.transport.network"
556
+ abi_code: ClassVar[int] = 1502
557
+ retryable: ClassVar[bool] = True
558
+ side_effects_possible: ClassVar[bool] = True
559
+ user_actionable: ClassVar[bool] = False
560
+ since_spec: ClassVar[str] = "0.1.0"
561
+
562
+
563
+ class RateLimitedError(TransportError):
564
+ """Площадка ответила ограничением. Регистрируется не на запросе, а на бюджете аккаунта:
565
+ источников запросов много, и по отдельности они друг о друге не знают.
566
+
567
+ Повтор допустим.
568
+
569
+ Attributes:
570
+ stable_id (str): Устойчивый идентификатор "funora.transport.rate_limited".
571
+ abi_code (int): Числовой код 1503, общий для всех SDK.
572
+ retryable (bool): Допустим ли повтор: True.
573
+ side_effects_possible (bool): Могло ли действие произойти: False.
574
+ user_actionable (bool): Исправляется ли вызывающим: False.
575
+ since_spec (str): Версия спецификации "0.1.0".
576
+ """
577
+
578
+ stable_id: ClassVar[str] = "funora.transport.rate_limited"
579
+ abi_code: ClassVar[int] = 1503
580
+ retryable: ClassVar[bool] = True
581
+ side_effects_possible: ClassVar[bool] = False
582
+ user_actionable: ClassVar[bool] = False
583
+ since_spec: ClassVar[str] = "0.1.0"
584
+
585
+
586
+ class RemoteServerError(TransportError):
587
+ """Площадка вернула ошибку на своей стороне. Запрос мог быть частично выполнен, поэтому
588
+ повтор небезопасной операции допустим только после сверки состояния.
589
+
590
+ Повтор допустим, действие могло произойти несмотря на ошибку.
591
+
592
+ Attributes:
593
+ stable_id (str): Устойчивый идентификатор "funora.transport.remote_server".
594
+ abi_code (int): Числовой код 1504, общий для всех SDK.
595
+ retryable (bool): Допустим ли повтор: True.
596
+ side_effects_possible (bool): Могло ли действие произойти: True.
597
+ user_actionable (bool): Исправляется ли вызывающим: False.
598
+ since_spec (str): Версия спецификации "0.1.0".
599
+ """
600
+
601
+ stable_id: ClassVar[str] = "funora.transport.remote_server"
602
+ abi_code: ClassVar[int] = 1504
603
+ retryable: ClassVar[bool] = True
604
+ side_effects_possible: ClassVar[bool] = True
605
+ user_actionable: ClassVar[bool] = False
606
+ since_spec: ClassVar[str] = "0.1.0"
607
+
608
+
609
+ class ProtocolChangedError(ProtocolError):
610
+ """Отпечаток страницы не совпал: разметка изменилась. Выдаётся вместо пустого
611
+ результата - тихий пустой список неотличим от «данных нет» и стоит дороже всего.
612
+ Выставляется только если не сработала ни одна негативная сигнатура (логин,
613
+ проверка, блокировка): иначе это состояние доступа, а не поломка.
614
+
615
+ Повтор не поможет.
616
+
617
+ Attributes:
618
+ stable_id (str): Устойчивый идентификатор "funora.protocol.changed".
619
+ abi_code (int): Числовой код 1601, общий для всех SDK.
620
+ retryable (bool): Допустим ли повтор: False.
621
+ side_effects_possible (bool): Могло ли действие произойти: False.
622
+ user_actionable (bool): Исправляется ли вызывающим: False.
623
+ since_spec (str): Версия спецификации "0.1.0".
624
+ """
625
+
626
+ stable_id: ClassVar[str] = "funora.protocol.changed"
627
+ abi_code: ClassVar[int] = 1601
628
+ retryable: ClassVar[bool] = False
629
+ side_effects_possible: ClassVar[bool] = False
630
+ user_actionable: ClassVar[bool] = False
631
+ since_spec: ClassVar[str] = "0.1.0"
632
+
633
+
634
+ class ParseError(ProtocolError):
635
+ """Структура найдена, но значение не приводится к доменному типу.
636
+
637
+ Повтор не поможет.
638
+
639
+ Attributes:
640
+ stable_id (str): Устойчивый идентификатор "funora.protocol.parse".
641
+ abi_code (int): Числовой код 1602, общий для всех SDK.
642
+ retryable (bool): Допустим ли повтор: False.
643
+ side_effects_possible (bool): Могло ли действие произойти: False.
644
+ user_actionable (bool): Исправляется ли вызывающим: False.
645
+ since_spec (str): Версия спецификации "0.1.0".
646
+ """
647
+
648
+ stable_id: ClassVar[str] = "funora.protocol.parse"
649
+ abi_code: ClassVar[int] = 1602
650
+ retryable: ClassVar[bool] = False
651
+ side_effects_possible: ClassVar[bool] = False
652
+ user_actionable: ClassVar[bool] = False
653
+ since_spec: ClassVar[str] = "0.1.0"
654
+
655
+
656
+ class UnexpectedResponseError(ProtocolError):
657
+ """Ответ не относится к ожидаемой странице или принадлежит другому аккаунту.
658
+
659
+ Повтор не поможет.
660
+
661
+ Attributes:
662
+ stable_id (str): Устойчивый идентификатор "funora.protocol.unexpected_response".
663
+ abi_code (int): Числовой код 1603, общий для всех SDK.
664
+ retryable (bool): Допустим ли повтор: False.
665
+ side_effects_possible (bool): Могло ли действие произойти: False.
666
+ user_actionable (bool): Исправляется ли вызывающим: False.
667
+ since_spec (str): Версия спецификации "0.1.0".
668
+ """
669
+
670
+ stable_id: ClassVar[str] = "funora.protocol.unexpected_response"
671
+ abi_code: ClassVar[int] = 1603
672
+ retryable: ClassVar[bool] = False
673
+ side_effects_possible: ClassVar[bool] = False
674
+ user_actionable: ClassVar[bool] = False
675
+ since_spec: ClassVar[str] = "0.1.0"
676
+
677
+
678
+ class EntityNotFoundError(DomainError):
679
+ """Сущность не найдена.
680
+
681
+ Повтор не поможет, исправляется тем, кто вызвал.
682
+
683
+ Attributes:
684
+ stable_id (str): Устойчивый идентификатор "funora.domain.not_found".
685
+ abi_code (int): Числовой код 1701, общий для всех SDK.
686
+ retryable (bool): Допустим ли повтор: False.
687
+ side_effects_possible (bool): Могло ли действие произойти: False.
688
+ user_actionable (bool): Исправляется ли вызывающим: True.
689
+ since_spec (str): Версия спецификации "0.1.0".
690
+ """
691
+
692
+ stable_id: ClassVar[str] = "funora.domain.not_found"
693
+ abi_code: ClassVar[int] = 1701
694
+ retryable: ClassVar[bool] = False
695
+ side_effects_possible: ClassVar[bool] = False
696
+ user_actionable: ClassVar[bool] = True
697
+ since_spec: ClassVar[str] = "0.1.0"
698
+
699
+
700
+ class ConflictError(DomainError):
701
+ """Состояние изменилось параллельно.
702
+
703
+ Повтор не поможет, исправляется тем, кто вызвал.
704
+
705
+ Attributes:
706
+ stable_id (str): Устойчивый идентификатор "funora.domain.conflict".
707
+ abi_code (int): Числовой код 1702, общий для всех SDK.
708
+ retryable (bool): Допустим ли повтор: False.
709
+ side_effects_possible (bool): Могло ли действие произойти: False.
710
+ user_actionable (bool): Исправляется ли вызывающим: True.
711
+ since_spec (str): Версия спецификации "0.1.0".
712
+ """
713
+
714
+ stable_id: ClassVar[str] = "funora.domain.conflict"
715
+ abi_code: ClassVar[int] = 1702
716
+ retryable: ClassVar[bool] = False
717
+ side_effects_possible: ClassVar[bool] = False
718
+ user_actionable: ClassVar[bool] = True
719
+ since_spec: ClassVar[str] = "0.1.0"
720
+
721
+
722
+ class PreconditionFailedError(DomainError):
723
+ """Не выполнено обязательное предусловие, например `expected_revision` при изменении
724
+ цены. Защищает от перетирания параллельной правки.
725
+
726
+ Повтор не поможет, исправляется тем, кто вызвал.
727
+
728
+ Attributes:
729
+ stable_id (str): Устойчивый идентификатор "funora.domain.precondition_failed".
730
+ abi_code (int): Числовой код 1703, общий для всех SDK.
731
+ retryable (bool): Допустим ли повтор: False.
732
+ side_effects_possible (bool): Могло ли действие произойти: False.
733
+ user_actionable (bool): Исправляется ли вызывающим: True.
734
+ since_spec (str): Версия спецификации "0.1.0".
735
+ """
736
+
737
+ stable_id: ClassVar[str] = "funora.domain.precondition_failed"
738
+ abi_code: ClassVar[int] = 1703
739
+ retryable: ClassVar[bool] = False
740
+ side_effects_possible: ClassVar[bool] = False
741
+ user_actionable: ClassVar[bool] = True
742
+ since_spec: ClassVar[str] = "0.1.0"
743
+
744
+
745
+ class CursorIncompatibleError(StateError):
746
+ """Курсор принадлежит другой версии формата или другому семейству адаптера. Молчаливое
747
+ чтение с начала запрещено: оно даёт лавину повторной обработки.
748
+
749
+ Повтор не поможет, исправляется тем, кто вызвал.
750
+
751
+ Attributes:
752
+ stable_id (str): Устойчивый идентификатор "funora.state.cursor_incompatible".
753
+ abi_code (int): Числовой код 1801, общий для всех SDK.
754
+ retryable (bool): Допустим ли повтор: False.
755
+ side_effects_possible (bool): Могло ли действие произойти: False.
756
+ user_actionable (bool): Исправляется ли вызывающим: True.
757
+ since_spec (str): Версия спецификации "0.1.0".
758
+ """
759
+
760
+ stable_id: ClassVar[str] = "funora.state.cursor_incompatible"
761
+ abi_code: ClassVar[int] = 1801
762
+ retryable: ClassVar[bool] = False
763
+ side_effects_possible: ClassVar[bool] = False
764
+ user_actionable: ClassVar[bool] = True
765
+ since_spec: ClassVar[str] = "0.1.0"
766
+
767
+
768
+ class StateSchemaIncompatibleError(StateError):
769
+ """Версия схемы сохранённого состояния не поддерживается этой версией SDK.
770
+
771
+ Повтор не поможет, исправляется тем, кто вызвал.
772
+
773
+ Attributes:
774
+ stable_id (str): Устойчивый идентификатор "funora.state.schema_incompatible".
775
+ abi_code (int): Числовой код 1802, общий для всех SDK.
776
+ retryable (bool): Допустим ли повтор: False.
777
+ side_effects_possible (bool): Могло ли действие произойти: False.
778
+ user_actionable (bool): Исправляется ли вызывающим: True.
779
+ since_spec (str): Версия спецификации "0.1.0".
780
+ """
781
+
782
+ stable_id: ClassVar[str] = "funora.state.schema_incompatible"
783
+ abi_code: ClassVar[int] = 1802
784
+ retryable: ClassVar[bool] = False
785
+ side_effects_possible: ClassVar[bool] = False
786
+ user_actionable: ClassVar[bool] = True
787
+ since_spec: ClassVar[str] = "0.1.0"
788
+
789
+
790
+ class HandlerTimeoutError(HandlerError):
791
+ """Обработчик не уложился в отведённое время. Существует отдельно, чтобы конфигурация
792
+ «повторять при TransportError» физически не могла перезапустить частично
793
+ выполненный обработчик вместе с уже совершёнными записями.
794
+
795
+ Повтор не поможет, действие могло произойти несмотря на ошибку, исправляется тем,
796
+ кто вызвал.
797
+
798
+ Attributes:
799
+ stable_id (str): Устойчивый идентификатор "funora.handler.timeout".
800
+ abi_code (int): Числовой код 1851, общий для всех SDK.
801
+ retryable (bool): Допустим ли повтор: False.
802
+ side_effects_possible (bool): Могло ли действие произойти: True.
803
+ user_actionable (bool): Исправляется ли вызывающим: True.
804
+ since_spec (str): Версия спецификации "0.1.0".
805
+ """
806
+
807
+ stable_id: ClassVar[str] = "funora.handler.timeout"
808
+ abi_code: ClassVar[int] = 1851
809
+ retryable: ClassVar[bool] = False
810
+ side_effects_possible: ClassVar[bool] = True
811
+ user_actionable: ClassVar[bool] = True
812
+ since_spec: ClassVar[str] = "0.1.0"
813
+
814
+
815
+ class HandlerCancelledError(HandlerError):
816
+ """Обработчик отменён кооперативно.
817
+
818
+ Повтор не поможет, действие могло произойти несмотря на ошибку.
819
+
820
+ Attributes:
821
+ stable_id (str): Устойчивый идентификатор "funora.handler.cancelled".
822
+ abi_code (int): Числовой код 1852, общий для всех SDK.
823
+ retryable (bool): Допустим ли повтор: False.
824
+ side_effects_possible (bool): Могло ли действие произойти: True.
825
+ user_actionable (bool): Исправляется ли вызывающим: False.
826
+ since_spec (str): Версия спецификации "0.1.0".
827
+ """
828
+
829
+ stable_id: ClassVar[str] = "funora.handler.cancelled"
830
+ abi_code: ClassVar[int] = 1852
831
+ retryable: ClassVar[bool] = False
832
+ side_effects_possible: ClassVar[bool] = True
833
+ user_actionable: ClassVar[bool] = False
834
+ since_spec: ClassVar[str] = "0.1.0"
835
+
836
+
837
+ class BudgetExhaustedError(BudgetError):
838
+ """Бюджет запросов исчерпан, запрос не отправлялся. Возвращается в том числе при
839
+ регистрации наблюдения, стоимость которого не помещается в бюджет.
840
+
841
+ Повтор не поможет, исправляется тем, кто вызвал.
842
+
843
+ Attributes:
844
+ stable_id (str): Устойчивый идентификатор "funora.budget.exhausted".
845
+ abi_code (int): Числовой код 1901, общий для всех SDK.
846
+ retryable (bool): Допустим ли повтор: False.
847
+ side_effects_possible (bool): Могло ли действие произойти: False.
848
+ user_actionable (bool): Исправляется ли вызывающим: True.
849
+ since_spec (str): Версия спецификации "0.1.0".
850
+ """
851
+
852
+ stable_id: ClassVar[str] = "funora.budget.exhausted"
853
+ abi_code: ClassVar[int] = 1901
854
+ retryable: ClassVar[bool] = False
855
+ side_effects_possible: ClassVar[bool] = False
856
+ user_actionable: ClassVar[bool] = True
857
+ since_spec: ClassVar[str] = "0.1.0"
858
+
859
+
860
+ class UnobservedFieldError(UsageError):
861
+ """Прочитано значение поля, которого не было на странице. Отличается от пустого
862
+ значения: пустое наблюдалось, этого не наблюдалось вовсе, и подставить вместо
863
+ него что-либо может только вызывающий, потому что только он знает, чем это
864
+ грозит его задаче.
865
+
866
+ Повтор не поможет, исправляется тем, кто вызвал.
867
+
868
+ Attributes:
869
+ stable_id (str): Устойчивый идентификатор "funora.usage.unobserved_field".
870
+ abi_code (int): Числовой код 1951, общий для всех SDK.
871
+ retryable (bool): Допустим ли повтор: False.
872
+ side_effects_possible (bool): Могло ли действие произойти: False.
873
+ user_actionable (bool): Исправляется ли вызывающим: True.
874
+ since_spec (str): Версия спецификации "0.1.0".
875
+ """
876
+
877
+ stable_id: ClassVar[str] = "funora.usage.unobserved_field"
878
+ abi_code: ClassVar[int] = 1951
879
+ retryable: ClassVar[bool] = False
880
+ side_effects_possible: ClassVar[bool] = False
881
+ user_actionable: ClassVar[bool] = True
882
+ since_spec: ClassVar[str] = "0.1.0"
883
+
884
+
885
+ class IncompleteResultError(UsageError):
886
+ """Запрошены записи заведомо неполного результата без признания неполноты. Неполный
887
+ результат выдаётся только тому, кто сказал, что готов его принять: молча
888
+ отданный, он неотличим от полного, и именно так теряются оплаченные заказы.
889
+
890
+ Повтор не поможет, исправляется тем, кто вызвал.
891
+
892
+ Attributes:
893
+ stable_id (str): Устойчивый идентификатор "funora.usage.incomplete_result".
894
+ abi_code (int): Числовой код 1952, общий для всех SDK.
895
+ retryable (bool): Допустим ли повтор: False.
896
+ side_effects_possible (bool): Могло ли действие произойти: False.
897
+ user_actionable (bool): Исправляется ли вызывающим: True.
898
+ since_spec (str): Версия спецификации "0.1.0".
899
+ """
900
+
901
+ stable_id: ClassVar[str] = "funora.usage.incomplete_result"
902
+ abi_code: ClassVar[int] = 1952
903
+ retryable: ClassVar[bool] = False
904
+ side_effects_possible: ClassVar[bool] = False
905
+ user_actionable: ClassVar[bool] = True
906
+ since_spec: ClassVar[str] = "0.1.0"
907
+
908
+
909
+ #: Поиск класса по устойчивому идентификатору.
910
+ #:
911
+ #: Нужен там, где ошибка приходит извне процесса: из журнала, из очереди,
912
+ #: от другой реализации. Идентификатор устойчив между версиями, имя класса
913
+ #: языка - нет.
914
+ ERROR_BY_STABLE_ID: Final[dict[str, type[Exception]]] = {
915
+ "funora.error": FunoraError,
916
+ "funora.configuration": ConfigurationError,
917
+ "funora.auth": AuthenticationError,
918
+ "funora.validation": ValidationError,
919
+ "funora.capability": CapabilityError,
920
+ "funora.transport": TransportError,
921
+ "funora.protocol": ProtocolError,
922
+ "funora.domain": DomainError,
923
+ "funora.state": StateError,
924
+ "funora.handler": HandlerError,
925
+ "funora.budget": BudgetError,
926
+ "funora.usage": UsageError,
927
+ "funora.auth.invalid_credentials": InvalidCredentialsError,
928
+ "funora.auth.session_expired": SessionExpiredError,
929
+ "funora.auth.access_blocked": AccessBlockedError,
930
+ "funora.auth.challenge_required": ChallengeRequiredError,
931
+ "funora.validation.currency_mismatch": CurrencyMismatchError,
932
+ "funora.capability.unsupported": UnsupportedCapabilityError,
933
+ "funora.capability.experimental": ExperimentalCapabilityError,
934
+ "funora.capability.not_implemented": NotImplementedOperationError,
935
+ "funora.transport.timeout": TimeoutError,
936
+ "funora.transport.network": NetworkError,
937
+ "funora.transport.rate_limited": RateLimitedError,
938
+ "funora.transport.remote_server": RemoteServerError,
939
+ "funora.protocol.changed": ProtocolChangedError,
940
+ "funora.protocol.parse": ParseError,
941
+ "funora.protocol.unexpected_response": UnexpectedResponseError,
942
+ "funora.domain.not_found": EntityNotFoundError,
943
+ "funora.domain.conflict": ConflictError,
944
+ "funora.domain.precondition_failed": PreconditionFailedError,
945
+ "funora.state.cursor_incompatible": CursorIncompatibleError,
946
+ "funora.state.schema_incompatible": StateSchemaIncompatibleError,
947
+ "funora.handler.timeout": HandlerTimeoutError,
948
+ "funora.handler.cancelled": HandlerCancelledError,
949
+ "funora.budget.exhausted": BudgetExhaustedError,
950
+ "funora.usage.unobserved_field": UnobservedFieldError,
951
+ "funora.usage.incomplete_result": IncompleteResultError,
952
+ }
953
+
954
+ #: Поиск класса по числовому коду.
955
+ #:
956
+ #: Код одинаков во всех шести SDK, поэтому по нему ошибка опознаётся при
957
+ #: передаче между реализациями.
958
+ ERROR_BY_ABI_CODE: Final[dict[int, type[Exception]]] = {
959
+ 1000: FunoraError,
960
+ 1100: ConfigurationError,
961
+ 1200: AuthenticationError,
962
+ 1300: ValidationError,
963
+ 1400: CapabilityError,
964
+ 1500: TransportError,
965
+ 1600: ProtocolError,
966
+ 1700: DomainError,
967
+ 1800: StateError,
968
+ 1850: HandlerError,
969
+ 1900: BudgetError,
970
+ 1950: UsageError,
971
+ 1201: InvalidCredentialsError,
972
+ 1202: SessionExpiredError,
973
+ 1203: AccessBlockedError,
974
+ 1204: ChallengeRequiredError,
975
+ 1301: CurrencyMismatchError,
976
+ 1401: UnsupportedCapabilityError,
977
+ 1402: ExperimentalCapabilityError,
978
+ 1403: NotImplementedOperationError,
979
+ 1501: TimeoutError,
980
+ 1502: NetworkError,
981
+ 1503: RateLimitedError,
982
+ 1504: RemoteServerError,
983
+ 1601: ProtocolChangedError,
984
+ 1602: ParseError,
985
+ 1603: UnexpectedResponseError,
986
+ 1701: EntityNotFoundError,
987
+ 1702: ConflictError,
988
+ 1703: PreconditionFailedError,
989
+ 1801: CursorIncompatibleError,
990
+ 1802: StateSchemaIncompatibleError,
991
+ 1851: HandlerTimeoutError,
992
+ 1852: HandlerCancelledError,
993
+ 1901: BudgetExhaustedError,
994
+ 1951: UnobservedFieldError,
995
+ 1952: IncompleteResultError,
996
+ }