telegrinder 0.3.4__py3-none-any.whl → 0.4.0__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.
Potentially problematic release.
This version of telegrinder might be problematic. Click here for more details.
- telegrinder/__init__.py +148 -149
- telegrinder/api/__init__.py +9 -8
- telegrinder/api/api.py +101 -93
- telegrinder/api/error.py +20 -16
- telegrinder/api/response.py +20 -20
- telegrinder/api/token.py +36 -36
- telegrinder/bot/__init__.py +72 -66
- telegrinder/bot/bot.py +83 -76
- telegrinder/bot/cute_types/__init__.py +19 -17
- telegrinder/bot/cute_types/base.py +184 -258
- telegrinder/bot/cute_types/callback_query.py +400 -385
- telegrinder/bot/cute_types/chat_join_request.py +62 -61
- telegrinder/bot/cute_types/chat_member_updated.py +157 -160
- telegrinder/bot/cute_types/inline_query.py +44 -43
- telegrinder/bot/cute_types/message.py +2590 -2637
- telegrinder/bot/cute_types/pre_checkout_query.py +42 -0
- telegrinder/bot/cute_types/update.py +112 -104
- telegrinder/bot/cute_types/utils.py +62 -95
- telegrinder/bot/dispatch/__init__.py +59 -55
- telegrinder/bot/dispatch/abc.py +76 -77
- telegrinder/bot/dispatch/context.py +96 -98
- telegrinder/bot/dispatch/dispatch.py +254 -202
- telegrinder/bot/dispatch/handler/__init__.py +13 -13
- telegrinder/bot/dispatch/handler/abc.py +23 -24
- telegrinder/bot/dispatch/handler/audio_reply.py +44 -44
- telegrinder/bot/dispatch/handler/base.py +57 -57
- telegrinder/bot/dispatch/handler/document_reply.py +44 -44
- telegrinder/bot/dispatch/handler/func.py +129 -135
- telegrinder/bot/dispatch/handler/media_group_reply.py +44 -43
- telegrinder/bot/dispatch/handler/message_reply.py +36 -36
- telegrinder/bot/dispatch/handler/photo_reply.py +44 -44
- telegrinder/bot/dispatch/handler/sticker_reply.py +37 -37
- telegrinder/bot/dispatch/handler/video_reply.py +44 -44
- telegrinder/bot/dispatch/middleware/__init__.py +3 -3
- telegrinder/bot/dispatch/middleware/abc.py +97 -22
- telegrinder/bot/dispatch/middleware/global_middleware.py +70 -0
- telegrinder/bot/dispatch/process.py +151 -157
- telegrinder/bot/dispatch/return_manager/__init__.py +15 -13
- telegrinder/bot/dispatch/return_manager/abc.py +104 -108
- telegrinder/bot/dispatch/return_manager/callback_query.py +20 -20
- telegrinder/bot/dispatch/return_manager/inline_query.py +15 -15
- telegrinder/bot/dispatch/return_manager/message.py +36 -36
- telegrinder/bot/dispatch/return_manager/pre_checkout_query.py +20 -0
- telegrinder/bot/dispatch/view/__init__.py +15 -13
- telegrinder/bot/dispatch/view/abc.py +45 -41
- telegrinder/bot/dispatch/view/base.py +231 -200
- telegrinder/bot/dispatch/view/box.py +140 -129
- telegrinder/bot/dispatch/view/callback_query.py +16 -17
- telegrinder/bot/dispatch/view/chat_join_request.py +11 -16
- telegrinder/bot/dispatch/view/chat_member.py +37 -39
- telegrinder/bot/dispatch/view/inline_query.py +16 -17
- telegrinder/bot/dispatch/view/message.py +43 -44
- telegrinder/bot/dispatch/view/pre_checkout_query.py +16 -0
- telegrinder/bot/dispatch/view/raw.py +116 -114
- telegrinder/bot/dispatch/waiter_machine/__init__.py +17 -17
- telegrinder/bot/dispatch/waiter_machine/actions.py +14 -13
- telegrinder/bot/dispatch/waiter_machine/hasher/__init__.py +8 -8
- telegrinder/bot/dispatch/waiter_machine/hasher/callback.py +55 -55
- telegrinder/bot/dispatch/waiter_machine/hasher/hasher.py +59 -57
- telegrinder/bot/dispatch/waiter_machine/hasher/message.py +51 -51
- telegrinder/bot/dispatch/waiter_machine/hasher/state.py +20 -19
- telegrinder/bot/dispatch/waiter_machine/machine.py +251 -172
- telegrinder/bot/dispatch/waiter_machine/middleware.py +94 -89
- telegrinder/bot/dispatch/waiter_machine/short_state.py +57 -68
- telegrinder/bot/polling/__init__.py +4 -4
- telegrinder/bot/polling/abc.py +25 -25
- telegrinder/bot/polling/polling.py +139 -131
- telegrinder/bot/rules/__init__.py +85 -62
- telegrinder/bot/rules/abc.py +213 -206
- telegrinder/bot/rules/callback_data.py +122 -163
- telegrinder/bot/rules/chat_join.py +45 -43
- telegrinder/bot/rules/command.py +126 -126
- telegrinder/bot/rules/enum_text.py +33 -36
- telegrinder/bot/rules/func.py +28 -26
- telegrinder/bot/rules/fuzzy.py +24 -24
- telegrinder/bot/rules/id.py +24 -0
- telegrinder/bot/rules/inline.py +58 -56
- telegrinder/bot/rules/integer.py +21 -20
- telegrinder/bot/rules/is_from.py +127 -127
- telegrinder/bot/rules/logic.py +18 -0
- telegrinder/bot/rules/markup.py +42 -43
- telegrinder/bot/rules/mention.py +14 -14
- telegrinder/bot/rules/message.py +15 -17
- telegrinder/bot/rules/message_entities.py +33 -35
- telegrinder/bot/rules/node.py +33 -27
- telegrinder/bot/rules/payload.py +81 -0
- telegrinder/bot/rules/payment_invoice.py +29 -0
- telegrinder/bot/rules/regex.py +36 -37
- telegrinder/bot/rules/rule_enum.py +72 -72
- telegrinder/bot/rules/start.py +42 -42
- telegrinder/bot/rules/state.py +35 -37
- telegrinder/bot/rules/text.py +38 -33
- telegrinder/bot/rules/update.py +15 -15
- telegrinder/bot/scenario/__init__.py +5 -5
- telegrinder/bot/scenario/abc.py +17 -19
- telegrinder/bot/scenario/checkbox.py +174 -176
- telegrinder/bot/scenario/choice.py +48 -51
- telegrinder/client/__init__.py +12 -4
- telegrinder/client/abc.py +100 -75
- telegrinder/client/aiohttp.py +134 -130
- telegrinder/client/form_data.py +31 -0
- telegrinder/client/sonic.py +212 -0
- telegrinder/model.py +208 -315
- telegrinder/modules.py +239 -237
- telegrinder/msgspec_json.py +14 -14
- telegrinder/msgspec_utils.py +478 -410
- telegrinder/node/__init__.py +86 -25
- telegrinder/node/attachment.py +163 -87
- telegrinder/node/base.py +288 -160
- telegrinder/node/callback_query.py +54 -53
- telegrinder/node/command.py +34 -33
- telegrinder/node/composer.py +163 -198
- telegrinder/node/container.py +33 -27
- telegrinder/node/either.py +82 -0
- telegrinder/node/event.py +54 -65
- telegrinder/node/file.py +51 -0
- telegrinder/node/me.py +15 -16
- telegrinder/node/payload.py +78 -0
- telegrinder/node/polymorphic.py +67 -48
- telegrinder/node/rule.py +72 -76
- telegrinder/node/scope.py +36 -38
- telegrinder/node/source.py +87 -71
- telegrinder/node/text.py +53 -41
- telegrinder/node/tools/__init__.py +3 -3
- telegrinder/node/tools/generator.py +36 -40
- telegrinder/py.typed +0 -0
- telegrinder/rules.py +1 -62
- telegrinder/tools/__init__.py +152 -93
- telegrinder/tools/adapter/__init__.py +19 -0
- telegrinder/tools/adapter/abc.py +49 -0
- telegrinder/tools/adapter/dataclass.py +56 -0
- telegrinder/{bot/rules → tools}/adapter/errors.py +5 -5
- telegrinder/{bot/rules → tools}/adapter/event.py +63 -65
- telegrinder/{bot/rules → tools}/adapter/node.py +46 -48
- telegrinder/{bot/rules → tools}/adapter/raw_event.py +27 -27
- telegrinder/{bot/rules → tools}/adapter/raw_update.py +30 -30
- telegrinder/tools/buttons.py +106 -80
- telegrinder/tools/callback_data_serilization/__init__.py +5 -0
- telegrinder/tools/callback_data_serilization/abc.py +51 -0
- telegrinder/tools/callback_data_serilization/json_ser.py +60 -0
- telegrinder/tools/callback_data_serilization/msgpack_ser.py +172 -0
- telegrinder/tools/error_handler/__init__.py +7 -7
- telegrinder/tools/error_handler/abc.py +30 -33
- telegrinder/tools/error_handler/error.py +9 -9
- telegrinder/tools/error_handler/error_handler.py +179 -193
- telegrinder/tools/formatting/__init__.py +83 -63
- telegrinder/tools/formatting/deep_links.py +541 -0
- telegrinder/tools/formatting/{html.py → html_formatter.py} +266 -294
- telegrinder/tools/formatting/spec_html_formats.py +71 -117
- telegrinder/tools/functional.py +8 -12
- telegrinder/tools/global_context/__init__.py +7 -7
- telegrinder/tools/global_context/abc.py +63 -63
- telegrinder/tools/global_context/global_context.py +387 -412
- telegrinder/tools/global_context/telegrinder_ctx.py +27 -27
- telegrinder/tools/i18n/__init__.py +7 -7
- telegrinder/tools/i18n/abc.py +30 -30
- telegrinder/tools/i18n/middleware/__init__.py +3 -3
- telegrinder/tools/i18n/middleware/abc.py +22 -25
- telegrinder/tools/i18n/simple.py +43 -43
- telegrinder/tools/input_file_directory.py +30 -0
- telegrinder/tools/keyboard.py +128 -128
- telegrinder/tools/lifespan.py +105 -0
- telegrinder/tools/limited_dict.py +32 -37
- telegrinder/tools/loop_wrapper/__init__.py +4 -4
- telegrinder/tools/loop_wrapper/abc.py +20 -15
- telegrinder/tools/loop_wrapper/loop_wrapper.py +169 -224
- telegrinder/tools/magic.py +307 -157
- telegrinder/tools/parse_mode.py +6 -6
- telegrinder/tools/state_storage/__init__.py +4 -4
- telegrinder/tools/state_storage/abc.py +31 -35
- telegrinder/tools/state_storage/memory.py +25 -25
- telegrinder/tools/strings.py +13 -0
- telegrinder/types/__init__.py +268 -260
- telegrinder/types/enums.py +711 -701
- telegrinder/types/input_file.py +51 -0
- telegrinder/types/methods.py +5055 -4633
- telegrinder/types/objects.py +7058 -6950
- telegrinder/verification_utils.py +30 -32
- {telegrinder-0.3.4.dist-info → telegrinder-0.4.0.dist-info}/LICENSE +22 -22
- telegrinder-0.4.0.dist-info/METADATA +144 -0
- telegrinder-0.4.0.dist-info/RECORD +182 -0
- {telegrinder-0.3.4.dist-info → telegrinder-0.4.0.dist-info}/WHEEL +1 -1
- telegrinder/bot/rules/adapter/__init__.py +0 -17
- telegrinder/bot/rules/adapter/abc.py +0 -31
- telegrinder/node/message.py +0 -14
- telegrinder/node/update.py +0 -15
- telegrinder/tools/formatting/links.py +0 -38
- telegrinder/tools/kb_set/__init__.py +0 -4
- telegrinder/tools/kb_set/base.py +0 -15
- telegrinder/tools/kb_set/yaml.py +0 -63
- telegrinder-0.3.4.dist-info/METADATA +0 -110
- telegrinder-0.3.4.dist-info/RECORD +0 -165
|
@@ -1,121 +1,75 @@
|
|
|
1
|
-
import dataclasses
|
|
2
|
-
import typing
|
|
3
|
-
|
|
4
|
-
from telegrinder.types.enums import ProgrammingLanguage
|
|
5
|
-
|
|
6
|
-
SpecialFormat: typing.TypeAlias = typing.Union[
|
|
7
|
-
"
|
|
8
|
-
"
|
|
9
|
-
"
|
|
10
|
-
"
|
|
11
|
-
"
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
@dataclasses.dataclass(repr=False, slots=True)
|
|
28
|
-
class
|
|
29
|
-
__formatter_name__
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
@dataclasses.dataclass(repr=False, slots=True)
|
|
36
|
-
class
|
|
37
|
-
__formatter_name__ = "
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
string: str | None = None
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
@dataclasses.dataclass(repr=False, slots=True)
|
|
44
|
-
class
|
|
45
|
-
__formatter_name__ = "
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
@dataclasses.dataclass(repr=False, slots=True)
|
|
52
|
-
class
|
|
53
|
-
__formatter_name__ = "
|
|
54
|
-
|
|
55
|
-
string: str
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
@dataclasses.dataclass(repr=False, slots=True)
|
|
60
|
-
class
|
|
61
|
-
__formatter_name__ = "
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
string: str
|
|
72
|
-
lang: str | ProgrammingLanguage | None = None
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
@dataclasses.dataclass(repr=False, slots=True)
|
|
76
|
-
class TgEmoji(BaseSpecFormat):
|
|
77
|
-
__formatter_name__ = "tg_emoji"
|
|
78
|
-
|
|
79
|
-
string: str
|
|
80
|
-
emoji_id: int
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
@dataclasses.dataclass(repr=False, slots=True)
|
|
84
|
-
class StartBotLink(BaseSpecFormat):
|
|
85
|
-
__formatter_name__ = "start_bot_link"
|
|
86
|
-
|
|
87
|
-
bot_id: str | int
|
|
88
|
-
data: str
|
|
89
|
-
string: str | None
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
@dataclasses.dataclass(repr=False, slots=True)
|
|
93
|
-
class StartGroupLink(BaseSpecFormat):
|
|
94
|
-
__formatter_name__ = "start_group_link"
|
|
95
|
-
|
|
96
|
-
bot_id: str | int
|
|
97
|
-
data: str
|
|
98
|
-
string: str | None = None
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
@dataclasses.dataclass(repr=False, slots=True)
|
|
102
|
-
class ResolveDomain(BaseSpecFormat):
|
|
103
|
-
__formatter_name__ = "resolve_domain"
|
|
104
|
-
|
|
105
|
-
username: str
|
|
106
|
-
string: str | None = None
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
__all__ = (
|
|
110
|
-
"BaseSpecFormat",
|
|
111
|
-
"ChannelBoostLink",
|
|
112
|
-
"InviteChatLink",
|
|
1
|
+
import dataclasses
|
|
2
|
+
import typing
|
|
3
|
+
|
|
4
|
+
from telegrinder.types.enums import ProgrammingLanguage
|
|
5
|
+
|
|
6
|
+
SpecialFormat: typing.TypeAlias = typing.Union[
|
|
7
|
+
"BlockQuote",
|
|
8
|
+
"Link",
|
|
9
|
+
"Mention",
|
|
10
|
+
"PreCode",
|
|
11
|
+
"TgEmoji",
|
|
12
|
+
]
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
def is_spec_format(obj: typing.Any) -> typing.TypeGuard[SpecialFormat]:
|
|
16
|
+
return dataclasses.is_dataclass(obj) and hasattr(obj, "__formatter_name__") and isinstance(obj, Base)
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
@dataclasses.dataclass(repr=False)
|
|
20
|
+
class Base:
|
|
21
|
+
__formatter_name__: typing.ClassVar[str] = dataclasses.field(init=False, repr=False)
|
|
22
|
+
|
|
23
|
+
def __repr__(self) -> str:
|
|
24
|
+
return f"<Special formatter {self.__class__.__name__!r} -> {self.__formatter_name__!r}>"
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
@dataclasses.dataclass(repr=False, slots=True)
|
|
28
|
+
class Mention(Base):
|
|
29
|
+
__formatter_name__ = "mention"
|
|
30
|
+
|
|
31
|
+
string: str
|
|
32
|
+
user_id: int
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
@dataclasses.dataclass(repr=False, slots=True)
|
|
36
|
+
class Link(Base):
|
|
37
|
+
__formatter_name__ = "link"
|
|
38
|
+
|
|
39
|
+
href: str
|
|
40
|
+
string: str | None = None
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
@dataclasses.dataclass(repr=False, slots=True)
|
|
44
|
+
class PreCode(Base):
|
|
45
|
+
__formatter_name__ = "pre_code"
|
|
46
|
+
|
|
47
|
+
string: str
|
|
48
|
+
lang: str | ProgrammingLanguage | None = None
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
@dataclasses.dataclass(repr=False, slots=True)
|
|
52
|
+
class TgEmoji(Base):
|
|
53
|
+
__formatter_name__ = "tg_emoji"
|
|
54
|
+
|
|
55
|
+
string: str
|
|
56
|
+
emoji_id: int
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
@dataclasses.dataclass(repr=False, slots=True)
|
|
60
|
+
class BlockQuote(Base):
|
|
61
|
+
__formatter_name__ = "block_quote"
|
|
62
|
+
|
|
63
|
+
string: str
|
|
64
|
+
expandable: bool = False
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
__all__ = (
|
|
68
|
+
"Base",
|
|
69
|
+
"BlockQuote",
|
|
113
70
|
"Link",
|
|
114
71
|
"Mention",
|
|
115
72
|
"PreCode",
|
|
116
|
-
"ResolveDomain",
|
|
117
73
|
"SpecialFormat",
|
|
118
|
-
"
|
|
119
|
-
|
|
120
|
-
"TgEmoji",
|
|
121
|
-
)
|
|
74
|
+
"TgEmoji",
|
|
75
|
+
)
|
telegrinder/tools/functional.py
CHANGED
|
@@ -1,12 +1,8 @@
|
|
|
1
|
-
import
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
return Some(value) if value is not None else Nothing()
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
__all__ = ("from_optional",)
|
|
1
|
+
from fntypes import Nothing, Option, Some
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
def from_optional[Value](value: Value | None, /) -> Option[Value]:
|
|
5
|
+
return Some(value) if value is not None else Nothing()
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
__all__ = ("from_optional",)
|
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
from .abc import ABCGlobalContext, CtxVar, GlobalCtxVar
|
|
2
|
-
from .global_context import GlobalContext, ctx_var
|
|
3
|
-
from .telegrinder_ctx import TelegrinderContext
|
|
4
|
-
|
|
5
|
-
__all__ = (
|
|
1
|
+
from .abc import ABCGlobalContext, CtxVar, GlobalCtxVar
|
|
2
|
+
from .global_context import GlobalContext, ctx_var
|
|
3
|
+
from .telegrinder_ctx import TelegrinderContext
|
|
4
|
+
|
|
5
|
+
__all__ = (
|
|
6
6
|
"ABCGlobalContext",
|
|
7
7
|
"CtxVar",
|
|
8
8
|
"GlobalContext",
|
|
9
9
|
"GlobalCtxVar",
|
|
10
10
|
"TelegrinderContext",
|
|
11
|
-
"ctx_var",
|
|
12
|
-
)
|
|
11
|
+
"ctx_var",
|
|
12
|
+
)
|
|
@@ -1,66 +1,66 @@
|
|
|
1
|
-
from __future__ import annotations
|
|
2
|
-
|
|
3
|
-
import dataclasses
|
|
4
|
-
from abc import ABC, abstractmethod
|
|
5
|
-
|
|
6
|
-
import typing_extensions as typing
|
|
7
|
-
|
|
8
|
-
T = typing.TypeVar("T", default=typing.Any)
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
@dataclasses.dataclass(repr=False, frozen=True)
|
|
12
|
-
class CtxVar(typing.Generic[T]):
|
|
13
|
-
value: T
|
|
14
|
-
const: bool = dataclasses.field(default=False, kw_only=True)
|
|
15
|
-
|
|
16
|
-
def __repr__(self) -> str:
|
|
17
|
-
return "<{}(value={!r})>".format(
|
|
18
|
-
("Const" if self.const else "") + CtxVar.__name__,
|
|
19
|
-
self.value,
|
|
20
|
-
)
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
@dataclasses.dataclass(repr=False, frozen=True)
|
|
24
|
-
class GlobalCtxVar(typing.Generic[T]):
|
|
25
|
-
name: str
|
|
26
|
-
value: T
|
|
27
|
-
const: bool = dataclasses.field(default=False, kw_only=True)
|
|
28
|
-
|
|
29
|
-
def __repr__(self) -> str:
|
|
30
|
-
return "<{}({}={})>".format(
|
|
31
|
-
self.__class__.__name__,
|
|
32
|
-
self.name,
|
|
33
|
-
repr(CtxVar(self.value, const=self.const)),
|
|
34
|
-
)
|
|
35
|
-
|
|
36
|
-
@classmethod
|
|
37
|
-
def collect(cls, name: str, ctx_value: T | CtxVariable[T]) -> typing.Self:
|
|
38
|
-
ctx_value = CtxVar(ctx_value) if not isinstance(ctx_value, CtxVar | GlobalCtxVar) else ctx_value
|
|
39
|
-
params = ctx_value.__dict__
|
|
40
|
-
params["name"] = name
|
|
41
|
-
return cls(**params)
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
class ABCGlobalContext(ABC, typing.Generic[T]):
|
|
45
|
-
@abstractmethod
|
|
46
|
-
def __getattr__(self, __name: str) -> typing.Any:
|
|
47
|
-
pass
|
|
48
|
-
|
|
49
|
-
@abstractmethod
|
|
50
|
-
def __setattr__(self, __name: str, __value: T | CtxVariable[T]) -> None:
|
|
51
|
-
pass
|
|
52
|
-
|
|
53
|
-
@abstractmethod
|
|
54
|
-
def __delattr__(self, __name: str) -> None:
|
|
55
|
-
pass
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
CtxVariable = CtxVar[T] | GlobalCtxVar[T]
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
__all__ = (
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import dataclasses
|
|
4
|
+
from abc import ABC, abstractmethod
|
|
5
|
+
|
|
6
|
+
import typing_extensions as typing
|
|
7
|
+
|
|
8
|
+
T = typing.TypeVar("T", default=typing.Any)
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
@dataclasses.dataclass(repr=False, frozen=True)
|
|
12
|
+
class CtxVar(typing.Generic[T]):
|
|
13
|
+
value: T
|
|
14
|
+
const: bool = dataclasses.field(default=False, kw_only=True)
|
|
15
|
+
|
|
16
|
+
def __repr__(self) -> str:
|
|
17
|
+
return "<{}(value={!r})>".format(
|
|
18
|
+
("Const" if self.const else "") + CtxVar.__name__,
|
|
19
|
+
self.value,
|
|
20
|
+
)
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
@dataclasses.dataclass(repr=False, frozen=True)
|
|
24
|
+
class GlobalCtxVar(typing.Generic[T]):
|
|
25
|
+
name: str
|
|
26
|
+
value: T
|
|
27
|
+
const: bool = dataclasses.field(default=False, kw_only=True)
|
|
28
|
+
|
|
29
|
+
def __repr__(self) -> str:
|
|
30
|
+
return "<{}({}={})>".format(
|
|
31
|
+
self.__class__.__name__,
|
|
32
|
+
self.name,
|
|
33
|
+
repr(CtxVar(self.value, const=self.const)),
|
|
34
|
+
)
|
|
35
|
+
|
|
36
|
+
@classmethod
|
|
37
|
+
def collect(cls, name: str, ctx_value: T | CtxVariable[T]) -> typing.Self:
|
|
38
|
+
ctx_value = CtxVar(ctx_value) if not isinstance(ctx_value, CtxVar | GlobalCtxVar) else ctx_value
|
|
39
|
+
params = ctx_value.__dict__
|
|
40
|
+
params["name"] = name
|
|
41
|
+
return cls(**params)
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
class ABCGlobalContext(ABC, typing.Generic[T]):
|
|
45
|
+
@abstractmethod
|
|
46
|
+
def __getattr__(self, __name: str) -> typing.Any:
|
|
47
|
+
pass
|
|
48
|
+
|
|
49
|
+
@abstractmethod
|
|
50
|
+
def __setattr__(self, __name: str, __value: T | CtxVariable[T]) -> None:
|
|
51
|
+
pass
|
|
52
|
+
|
|
53
|
+
@abstractmethod
|
|
54
|
+
def __delattr__(self, __name: str) -> None:
|
|
55
|
+
pass
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
CtxVariable = CtxVar[T] | GlobalCtxVar[T]
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
__all__ = (
|
|
62
62
|
"ABCGlobalContext",
|
|
63
63
|
"CtxVar",
|
|
64
64
|
"CtxVariable",
|
|
65
|
-
"GlobalCtxVar",
|
|
66
|
-
)
|
|
65
|
+
"GlobalCtxVar",
|
|
66
|
+
)
|