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.
- funora/__init__.py +265 -0
- funora/_account.py +661 -0
- funora/_aclient.py +1484 -0
- funora/_budget.py +579 -0
- funora/_calc.py +182 -0
- funora/_canonical.py +235 -0
- funora/_catalog.py +473 -0
- funora/_chat_history.py +367 -0
- funora/_chats.py +392 -0
- funora/_chips.py +403 -0
- funora/_classify.py +466 -0
- funora/_client.py +1490 -0
- funora/_currency_switch.py +130 -0
- funora/_cursor.py +120 -0
- funora/_delivered.py +233 -0
- funora/_diff.py +752 -0
- funora/_engine.py +4795 -0
- funora/_extract.py +124 -0
- funora/_field_schema.py +112 -0
- funora/_fileio.py +58 -0
- funora/_gate.py +69 -0
- funora/_hops.py +101 -0
- funora/_host.py +120 -0
- funora/_identity.py +284 -0
- funora/_json.py +31 -0
- funora/_listen.py +312 -0
- funora/_lot_form.py +331 -0
- funora/_market.py +406 -0
- funora/_matching.py +147 -0
- funora/_money.py +279 -0
- funora/_monitoring.py +396 -0
- funora/_observed.py +237 -0
- funora/_order.py +552 -0
- funora/_order_details.py +281 -0
- funora/_orders.py +807 -0
- funora/_outbound.py +453 -0
- funora/_own_lots.py +301 -0
- funora/_poll.py +410 -0
- funora/_price_audit.py +281 -0
- funora/_proxies.py +232 -0
- funora/_raise.py +150 -0
- funora/_refund.py +102 -0
- funora/_result.py +157 -0
- funora/_retry.py +213 -0
- funora/_review_write.py +138 -0
- funora/_reviews.py +584 -0
- funora/_runner.py +651 -0
- funora/_secret.py +385 -0
- funora/_showcase.py +362 -0
- funora/_signals.py +375 -0
- funora/_skeleton.py +752 -0
- funora/_snapshot.py +276 -0
- funora/_state.py +279 -0
- funora/_stock.py +32 -0
- funora/_thread.py +574 -0
- funora/_transport.py +1023 -0
- funora/_updates.py +292 -0
- funora/_verdicts.py +91 -0
- funora/_viewing.py +143 -0
- funora/_watch.py +825 -0
- funora/_watch_state.py +237 -0
- funora/_whoami.py +546 -0
- funora/bot/__init__.py +52 -0
- funora/bot/_delivery.py +341 -0
- funora/bot/_outbox.py +261 -0
- funora/bot/_runtime.py +447 -0
- funora/bot/_spool.py +534 -0
- funora/budget.py +311 -0
- funora/capabilities.py +297 -0
- funora/conformance.py +758 -0
- funora/contract.py +73 -0
- funora/errors.py +996 -0
- funora/events.py +189 -0
- funora/extraction.py +420 -0
- funora/observe.py +560 -0
- funora/operations.py +671 -0
- funora/py.typed +0 -0
- funora/reconciliation.py +51 -0
- funora/response_classes.py +155 -0
- funora/retry.py +238 -0
- funora/send_outcome.py +78 -0
- funora/skeleton_format.py +77 -0
- funora-0.0.1.dev2.dist-info/METADATA +294 -0
- funora-0.0.1.dev2.dist-info/RECORD +87 -0
- funora-0.0.1.dev2.dist-info/WHEEL +4 -0
- funora-0.0.1.dev2.dist-info/entry_points.txt +2 -0
- 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
|
+
}
|