tigrbl-typing 0.1.12.dev1__tar.gz → 0.4.0.dev2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {tigrbl_typing-0.1.12.dev1 → tigrbl_typing-0.4.0.dev2}/PKG-INFO +10 -1
- {tigrbl_typing-0.1.12.dev1 → tigrbl_typing-0.4.0.dev2}/README.md +4 -0
- {tigrbl_typing-0.1.12.dev1 → tigrbl_typing-0.4.0.dev2}/pyproject.toml +10 -2
- {tigrbl_typing-0.1.12.dev1 → tigrbl_typing-0.4.0.dev2}/tigrbl_typing/phases.py +67 -15
- {tigrbl_typing-0.1.12.dev1 → tigrbl_typing-0.4.0.dev2}/tigrbl_typing/status/utils.py +12 -0
- {tigrbl_typing-0.1.12.dev1 → tigrbl_typing-0.4.0.dev2}/tigrbl_typing/__init__.py +0 -0
- {tigrbl_typing-0.1.12.dev1 → tigrbl_typing-0.4.0.dev2}/tigrbl_typing/channel.py +0 -0
- {tigrbl_typing-0.1.12.dev1 → tigrbl_typing-0.4.0.dev2}/tigrbl_typing/gw/__init__.py +0 -0
- {tigrbl_typing-0.1.12.dev1 → tigrbl_typing-0.4.0.dev2}/tigrbl_typing/gw/raw.py +0 -0
- {tigrbl_typing-0.1.12.dev1 → tigrbl_typing-0.4.0.dev2}/tigrbl_typing/protocols.py +0 -0
- {tigrbl_typing-0.1.12.dev1 → tigrbl_typing-0.4.0.dev2}/tigrbl_typing/request.py +0 -0
- {tigrbl_typing-0.1.12.dev1 → tigrbl_typing-0.4.0.dev2}/tigrbl_typing/status/__init__.py +0 -0
- {tigrbl_typing-0.1.12.dev1 → tigrbl_typing-0.4.0.dev2}/tigrbl_typing/status/converters.py +0 -0
- {tigrbl_typing-0.1.12.dev1 → tigrbl_typing-0.4.0.dev2}/tigrbl_typing/status/exceptions.py +0 -0
- {tigrbl_typing-0.1.12.dev1 → tigrbl_typing-0.4.0.dev2}/tigrbl_typing/status/mappings.py +0 -0
- {tigrbl_typing-0.1.12.dev1 → tigrbl_typing-0.4.0.dev2}/tigrbl_typing/types/__init__.py +0 -0
- {tigrbl_typing-0.1.12.dev1 → tigrbl_typing-0.4.0.dev2}/tigrbl_typing/types/authn_abc.py +0 -0
- {tigrbl_typing-0.1.12.dev1 → tigrbl_typing-0.4.0.dev2}/tigrbl_typing/types/channel.py +0 -0
- {tigrbl_typing-0.1.12.dev1 → tigrbl_typing-0.4.0.dev2}/tigrbl_typing/types/op.py +0 -0
- {tigrbl_typing-0.1.12.dev1 → tigrbl_typing-0.4.0.dev2}/tigrbl_typing/types/uuid.py +0 -0
- {tigrbl_typing-0.1.12.dev1 → tigrbl_typing-0.4.0.dev2}/tigrbl_typing/vendor/__init__.py +0 -0
- {tigrbl_typing-0.1.12.dev1 → tigrbl_typing-0.4.0.dev2}/tigrbl_typing/vendor/pydantic.py +0 -0
- {tigrbl_typing-0.1.12.dev1 → tigrbl_typing-0.4.0.dev2}/tigrbl_typing/vendor/sqlalchemy.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: tigrbl-typing
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.4.0.dev2
|
|
4
4
|
Summary: Typing protocols and shared type helpers for the Tigrbl framework.
|
|
5
5
|
License-Expression: Apache-2.0
|
|
6
6
|
Keywords: tigrbl,sdk,standards,framework
|
|
@@ -16,6 +16,11 @@ Classifier: Programming Language :: Python
|
|
|
16
16
|
Classifier: Programming Language :: Python :: 3
|
|
17
17
|
Classifier: Programming Language :: Python :: 3 :: Only
|
|
18
18
|
Requires-Dist: pydantic (>=2.10,<3)
|
|
19
|
+
Project-URL: Discord, https://discord.gg/K4YTAPapjR
|
|
20
|
+
Project-URL: Homepage, https://github.com/tigrbl/tigrbl
|
|
21
|
+
Project-URL: Issues, https://github.com/tigrbl/tigrbl/issues
|
|
22
|
+
Project-URL: Organization, https://github.com/tigrbl
|
|
23
|
+
Project-URL: Repository, https://github.com/tigrbl/tigrbl/tree/master/pkgs/core/tigrbl_typing
|
|
19
24
|
Description-Content-Type: text/markdown
|
|
20
25
|
|
|
21
26
|
# tigrbl_typing
|
|
@@ -36,6 +41,10 @@ It is not the authoritative location for repository governance, current target s
|
|
|
36
41
|
|
|
37
42
|
## Package identity
|
|
38
43
|
|
|
44
|
+
- canonical repository: `https://github.com/tigrbl/tigrbl`
|
|
45
|
+
- organization: `https://github.com/tigrbl`
|
|
46
|
+
- social: `https://discord.gg/K4YTAPapjR`
|
|
47
|
+
- package path: `https://github.com/tigrbl/tigrbl/tree/master/pkgs/core/tigrbl_typing`
|
|
39
48
|
- workspace path: `pkgs/core/tigrbl_typing`
|
|
40
49
|
- workspace class: core Python package
|
|
41
50
|
- implementation layout: `tigrbl_typing/`
|
|
@@ -16,6 +16,10 @@ It is not the authoritative location for repository governance, current target s
|
|
|
16
16
|
|
|
17
17
|
## Package identity
|
|
18
18
|
|
|
19
|
+
- canonical repository: `https://github.com/tigrbl/tigrbl`
|
|
20
|
+
- organization: `https://github.com/tigrbl`
|
|
21
|
+
- social: `https://discord.gg/K4YTAPapjR`
|
|
22
|
+
- package path: `https://github.com/tigrbl/tigrbl/tree/master/pkgs/core/tigrbl_typing`
|
|
19
23
|
- workspace path: `pkgs/core/tigrbl_typing`
|
|
20
24
|
- workspace class: core Python package
|
|
21
25
|
- implementation layout: `tigrbl_typing/`
|
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "tigrbl-typing"
|
|
3
|
-
version = "0.
|
|
3
|
+
version = "0.4.0.dev2"
|
|
4
4
|
description = "Typing protocols and shared type helpers for the Tigrbl framework."
|
|
5
5
|
license = "Apache-2.0"
|
|
6
6
|
readme = "README.md"
|
|
7
|
-
repository = "http://github.com/swarmauri/swarmauri-sdk"
|
|
8
7
|
requires-python = ">=3.10,<3.14"
|
|
9
8
|
classifiers = [
|
|
10
9
|
"Development Status :: 1 - Planning",
|
|
@@ -17,11 +16,20 @@ classifiers = [
|
|
|
17
16
|
"Programming Language :: Python :: 3 :: Only",
|
|
18
17
|
]
|
|
19
18
|
authors = [{ name = "Jacob Stewart", email = "jacob@swarmauri.com" }]
|
|
19
|
+
|
|
20
20
|
dependencies = [
|
|
21
21
|
"pydantic>=2.10,<3",
|
|
22
22
|
]
|
|
23
23
|
keywords = ["tigrbl", "sdk", "standards", "framework"]
|
|
24
24
|
|
|
25
|
+
|
|
26
|
+
[project.urls]
|
|
27
|
+
Organization = "https://github.com/tigrbl"
|
|
28
|
+
Discord = "https://discord.gg/K4YTAPapjR"
|
|
29
|
+
Homepage = "https://github.com/tigrbl/tigrbl"
|
|
30
|
+
Repository = "https://github.com/tigrbl/tigrbl/tree/master/pkgs/core/tigrbl_typing"
|
|
31
|
+
Issues = "https://github.com/tigrbl/tigrbl/issues"
|
|
32
|
+
|
|
25
33
|
[build-system]
|
|
26
34
|
requires = ["poetry-core>=1.0.0"]
|
|
27
35
|
build-backend = "poetry.core.masonry.api"
|
|
@@ -3,6 +3,18 @@ from __future__ import annotations
|
|
|
3
3
|
from enum import Enum
|
|
4
4
|
from typing import Literal, Tuple
|
|
5
5
|
|
|
6
|
+
PHASE_ALIASES: dict[str, str] = {
|
|
7
|
+
"END_TX": "TX_COMMIT",
|
|
8
|
+
"ON_END_TX_ERROR": "ON_TX_COMMIT_ERROR",
|
|
9
|
+
"ON_ROLLBACK": "TX_ROLLBACK",
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
def normalize_phase(name: str | None) -> str | None:
|
|
14
|
+
if name is None:
|
|
15
|
+
return None
|
|
16
|
+
return PHASE_ALIASES.get(str(name), str(name))
|
|
17
|
+
|
|
6
18
|
HookPhase = Literal[
|
|
7
19
|
"PRE_TX_BEGIN",
|
|
8
20
|
"START_TX",
|
|
@@ -10,7 +22,7 @@ HookPhase = Literal[
|
|
|
10
22
|
"HANDLER",
|
|
11
23
|
"POST_HANDLER",
|
|
12
24
|
"PRE_COMMIT",
|
|
13
|
-
"
|
|
25
|
+
"TX_COMMIT",
|
|
14
26
|
"POST_COMMIT",
|
|
15
27
|
"POST_RESPONSE",
|
|
16
28
|
"ON_ERROR",
|
|
@@ -20,26 +32,28 @@ HookPhase = Literal[
|
|
|
20
32
|
"ON_HANDLER_ERROR",
|
|
21
33
|
"ON_POST_HANDLER_ERROR",
|
|
22
34
|
"ON_PRE_COMMIT_ERROR",
|
|
23
|
-
"
|
|
35
|
+
"ON_TX_COMMIT_ERROR",
|
|
24
36
|
"ON_POST_COMMIT_ERROR",
|
|
25
37
|
"ON_POST_RESPONSE_ERROR",
|
|
26
|
-
"
|
|
38
|
+
"TX_ROLLBACK",
|
|
27
39
|
]
|
|
28
40
|
|
|
29
41
|
Phase = Literal[
|
|
30
42
|
"INGRESS_BEGIN",
|
|
31
43
|
"INGRESS_PARSE",
|
|
32
|
-
"
|
|
44
|
+
"INGRESS_DISPATCH",
|
|
33
45
|
"PRE_TX_BEGIN",
|
|
34
46
|
"START_TX",
|
|
35
47
|
"PRE_HANDLER",
|
|
36
48
|
"HANDLER",
|
|
37
49
|
"POST_HANDLER",
|
|
38
50
|
"PRE_COMMIT",
|
|
39
|
-
"
|
|
51
|
+
"TX_COMMIT",
|
|
40
52
|
"POST_COMMIT",
|
|
41
53
|
"EGRESS_SHAPE",
|
|
42
54
|
"EGRESS_FINALIZE",
|
|
55
|
+
"EMIT",
|
|
56
|
+
"POST_EMIT",
|
|
43
57
|
"POST_RESPONSE",
|
|
44
58
|
"ON_ERROR",
|
|
45
59
|
"ON_PRE_TX_BEGIN_ERROR",
|
|
@@ -48,10 +62,10 @@ Phase = Literal[
|
|
|
48
62
|
"ON_HANDLER_ERROR",
|
|
49
63
|
"ON_POST_HANDLER_ERROR",
|
|
50
64
|
"ON_PRE_COMMIT_ERROR",
|
|
51
|
-
"
|
|
65
|
+
"ON_TX_COMMIT_ERROR",
|
|
52
66
|
"ON_POST_COMMIT_ERROR",
|
|
53
67
|
"ON_POST_RESPONSE_ERROR",
|
|
54
|
-
"
|
|
68
|
+
"TX_ROLLBACK",
|
|
55
69
|
]
|
|
56
70
|
|
|
57
71
|
|
|
@@ -62,7 +76,7 @@ class PHASE(str, Enum):
|
|
|
62
76
|
HANDLER = "HANDLER"
|
|
63
77
|
POST_HANDLER = "POST_HANDLER"
|
|
64
78
|
PRE_COMMIT = "PRE_COMMIT"
|
|
65
|
-
|
|
79
|
+
TX_COMMIT = "TX_COMMIT"
|
|
66
80
|
POST_COMMIT = "POST_COMMIT"
|
|
67
81
|
POST_RESPONSE = "POST_RESPONSE"
|
|
68
82
|
ON_ERROR = "ON_ERROR"
|
|
@@ -72,27 +86,36 @@ class PHASE(str, Enum):
|
|
|
72
86
|
ON_HANDLER_ERROR = "ON_HANDLER_ERROR"
|
|
73
87
|
ON_POST_HANDLER_ERROR = "ON_POST_HANDLER_ERROR"
|
|
74
88
|
ON_PRE_COMMIT_ERROR = "ON_PRE_COMMIT_ERROR"
|
|
75
|
-
|
|
89
|
+
ON_TX_COMMIT_ERROR = "ON_TX_COMMIT_ERROR"
|
|
76
90
|
ON_POST_COMMIT_ERROR = "ON_POST_COMMIT_ERROR"
|
|
77
91
|
ON_POST_RESPONSE_ERROR = "ON_POST_RESPONSE_ERROR"
|
|
78
|
-
|
|
92
|
+
TX_ROLLBACK = "TX_ROLLBACK"
|
|
93
|
+
|
|
94
|
+
@classmethod
|
|
95
|
+
def _missing_(cls, value: object):
|
|
96
|
+
normalized = normalize_phase(str(value)) if value is not None else None
|
|
97
|
+
if normalized != value:
|
|
98
|
+
return cls(normalized)
|
|
99
|
+
return None
|
|
79
100
|
|
|
80
101
|
|
|
81
102
|
HOOK_PHASES: Tuple[HookPhase, ...] = tuple(p.value for p in PHASE)
|
|
82
103
|
PHASES: Tuple[Phase, ...] = (
|
|
83
104
|
"INGRESS_BEGIN",
|
|
84
105
|
"INGRESS_PARSE",
|
|
85
|
-
"
|
|
106
|
+
"INGRESS_DISPATCH",
|
|
86
107
|
"PRE_TX_BEGIN",
|
|
87
108
|
"START_TX",
|
|
88
109
|
"PRE_HANDLER",
|
|
89
110
|
"HANDLER",
|
|
90
111
|
"POST_HANDLER",
|
|
91
112
|
"PRE_COMMIT",
|
|
92
|
-
"
|
|
113
|
+
"TX_COMMIT",
|
|
93
114
|
"POST_COMMIT",
|
|
94
115
|
"EGRESS_SHAPE",
|
|
95
116
|
"EGRESS_FINALIZE",
|
|
117
|
+
"EMIT",
|
|
118
|
+
"POST_EMIT",
|
|
96
119
|
"POST_RESPONSE",
|
|
97
120
|
"ON_ERROR",
|
|
98
121
|
"ON_PRE_TX_BEGIN_ERROR",
|
|
@@ -101,10 +124,39 @@ PHASES: Tuple[Phase, ...] = (
|
|
|
101
124
|
"ON_HANDLER_ERROR",
|
|
102
125
|
"ON_POST_HANDLER_ERROR",
|
|
103
126
|
"ON_PRE_COMMIT_ERROR",
|
|
104
|
-
"
|
|
127
|
+
"ON_TX_COMMIT_ERROR",
|
|
105
128
|
"ON_POST_COMMIT_ERROR",
|
|
106
129
|
"ON_POST_RESPONSE_ERROR",
|
|
107
|
-
"
|
|
130
|
+
"TX_ROLLBACK",
|
|
108
131
|
)
|
|
109
132
|
|
|
110
|
-
|
|
133
|
+
|
|
134
|
+
def compile_protocol_phase_projection(proto: str) -> dict[str, object]:
|
|
135
|
+
stream_like = proto in {"http.stream", "https.stream", "http.sse", "https.sse"}
|
|
136
|
+
phase_order = (
|
|
137
|
+
"INGRESS_PARSE",
|
|
138
|
+
"INGRESS_DISPATCH",
|
|
139
|
+
"PRE_HANDLER",
|
|
140
|
+
"HANDLER",
|
|
141
|
+
"POST_HANDLER",
|
|
142
|
+
"EMIT",
|
|
143
|
+
"POST_EMIT",
|
|
144
|
+
)
|
|
145
|
+
if not stream_like:
|
|
146
|
+
phase_order = phase_order[:5] + ("EGRESS_SHAPE", "EGRESS_FINALIZE") + phase_order[5:]
|
|
147
|
+
return {
|
|
148
|
+
"proto": proto,
|
|
149
|
+
"phase_order": phase_order,
|
|
150
|
+
"phases": tuple({"phase": phase} for phase in phase_order),
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
__all__ = [
|
|
154
|
+
"PHASE",
|
|
155
|
+
"PHASES",
|
|
156
|
+
"HOOK_PHASES",
|
|
157
|
+
"Phase",
|
|
158
|
+
"HookPhase",
|
|
159
|
+
"PHASE_ALIASES",
|
|
160
|
+
"compile_protocol_phase_projection",
|
|
161
|
+
"normalize_phase",
|
|
162
|
+
]
|
|
@@ -44,6 +44,17 @@ def _is_asyncpg_constraint_error(exc: BaseException) -> bool:
|
|
|
44
44
|
)
|
|
45
45
|
|
|
46
46
|
|
|
47
|
+
def is_persistence_exception(exc: BaseException) -> bool:
|
|
48
|
+
if _is_asyncpg_constraint_error(exc):
|
|
49
|
+
return True
|
|
50
|
+
candidates = tuple(
|
|
51
|
+
typ
|
|
52
|
+
for typ in (DBAPIError, IntegrityError, OperationalError)
|
|
53
|
+
if isinstance(typ, type)
|
|
54
|
+
)
|
|
55
|
+
return bool(candidates) and isinstance(exc, candidates)
|
|
56
|
+
|
|
57
|
+
|
|
47
58
|
def _limit(s: str, n: int = 4000) -> str:
|
|
48
59
|
return s if len(s) <= n else s[: n - 3] + "..."
|
|
49
60
|
|
|
@@ -105,6 +116,7 @@ __all__ = [
|
|
|
105
116
|
"OperationalError",
|
|
106
117
|
"NoResultFound",
|
|
107
118
|
"_is_asyncpg_constraint_error",
|
|
119
|
+
"is_persistence_exception",
|
|
108
120
|
"_limit",
|
|
109
121
|
"_stringify_exc",
|
|
110
122
|
"_format_validation",
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|