python-ddd-framework 0.7.1__py3-none-any.whl → 0.7.2__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.
- python_ddd_framework/fastapi/filters.py +9 -1
- python_ddd_framework/fastapi/parameters.py +2 -1
- python_ddd_framework/invocation/callables.py +31 -19
- python_ddd_framework/invocation/dispatcher.py +2 -1
- python_ddd_framework/invocation/execution.py +14 -3
- python_ddd_framework/invocation/interception.py +11 -2
- python_ddd_framework/invocation/managed_services.py +28 -11
- python_ddd_framework/invocation/methods.py +63 -12
- {python_ddd_framework-0.7.1.dist-info → python_ddd_framework-0.7.2.dist-info}/METADATA +7 -1
- {python_ddd_framework-0.7.1.dist-info → python_ddd_framework-0.7.2.dist-info}/RECORD +14 -14
- {python_ddd_framework-0.7.1.dist-info → python_ddd_framework-0.7.2.dist-info}/WHEEL +1 -1
- {python_ddd_framework-0.7.1.dist-info → python_ddd_framework-0.7.2.dist-info}/entry_points.txt +0 -0
- {python_ddd_framework-0.7.1.dist-info → python_ddd_framework-0.7.2.dist-info}/licenses/LICENSE +0 -0
- {python_ddd_framework-0.7.1.dist-info → python_ddd_framework-0.7.2.dist-info}/licenses/src/python_ddd_framework/background_jobs/pgqueuer/UPSTREAM_LICENSE.txt +0 -0
|
@@ -87,7 +87,11 @@ async def _run_filters(
|
|
|
87
87
|
context: ActionFilterContext,
|
|
88
88
|
target: Callable[[], Awaitable[object]],
|
|
89
89
|
) -> object:
|
|
90
|
+
if not registrations:
|
|
91
|
+
return await target()
|
|
92
|
+
|
|
90
93
|
async def invoke(index: int) -> object:
|
|
94
|
+
nonlocal invoke
|
|
91
95
|
if index == len(registrations):
|
|
92
96
|
return await target()
|
|
93
97
|
instance = await container.get(registrations[index].filter_type)
|
|
@@ -97,7 +101,11 @@ async def _run_filters(
|
|
|
97
101
|
finally:
|
|
98
102
|
continuation.active = False
|
|
99
103
|
|
|
100
|
-
|
|
104
|
+
try:
|
|
105
|
+
return await invoke(0)
|
|
106
|
+
finally:
|
|
107
|
+
# 保留原失效检查,只解除已结束 filter 链对请求执行状态的引用。
|
|
108
|
+
del invoke
|
|
101
109
|
|
|
102
110
|
|
|
103
111
|
def _validate_filters(registrations: Sequence[ServiceFilter], container: AsyncContainer) -> None:
|
|
@@ -52,7 +52,8 @@ class _HttpParameterValidator:
|
|
|
52
52
|
for name in self._validators:
|
|
53
53
|
if name in actual:
|
|
54
54
|
arguments = _InvocationArguments((actual[name],), {})
|
|
55
|
-
|
|
55
|
+
# HTTP Filter 会获得参数引用,始终保留独立于服务拦截链的改参快照。
|
|
56
|
+
arguments.mark_validated(capture_structure=True)
|
|
56
57
|
arguments.exposed = True
|
|
57
58
|
snapshots[name] = arguments
|
|
58
59
|
return snapshots
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"""调用签名的 DI
|
|
1
|
+
"""调用签名的 DI 分类与参数装配;实例解析和作用域仍归原生容器。"""
|
|
2
2
|
|
|
3
3
|
from __future__ import annotations
|
|
4
4
|
|
|
@@ -9,7 +9,7 @@ from types import MappingProxyType, SimpleNamespace
|
|
|
9
9
|
from typing import Annotated, Any, TypeVar, get_args, get_origin, get_type_hints
|
|
10
10
|
|
|
11
11
|
from dishka import AsyncContainer, BaseScope, DependencyKey
|
|
12
|
-
from dishka.integrations.base import default_parse_dependency
|
|
12
|
+
from dishka.integrations.base import default_parse_dependency
|
|
13
13
|
|
|
14
14
|
_R = TypeVar("_R")
|
|
15
15
|
|
|
@@ -124,22 +124,8 @@ class _CallablePlan:
|
|
|
124
124
|
# 先验证全部业务实参,再解析任何依赖,避免错误调用触发 resource factory。
|
|
125
125
|
bound = self.signature.bind(*args, **kwargs)
|
|
126
126
|
bound.apply_defaults()
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
return self.dependencies.get(parameter.name)
|
|
130
|
-
|
|
131
|
-
async def target(*args: object, **kwargs: object) -> _R:
|
|
132
|
-
return await function(*args, **kwargs)
|
|
133
|
-
|
|
134
|
-
# 原函数可能被多个 Application 共享;只给当前调用的 native wrapper 提供签名。
|
|
135
|
-
target.__signature__ = inspect.signature(function) # type: ignore[attr-defined]
|
|
136
|
-
target.__annotations__ = {}
|
|
137
|
-
injected = wrap_injection(
|
|
138
|
-
func=target,
|
|
139
|
-
container_getter=lambda args, kwargs: container,
|
|
140
|
-
is_async=True,
|
|
141
|
-
parse_dependency=parse,
|
|
142
|
-
)
|
|
127
|
+
# 编译与执行之间可能改变签名元数据;无 DI 的快路径也保留原生边界检查。
|
|
128
|
+
signature = inspect.signature(function)
|
|
143
129
|
# DI 参数从签名移除后位置会变化;普通业务参数按名称交给原函数。
|
|
144
130
|
positional = tuple(
|
|
145
131
|
bound.arguments[name]
|
|
@@ -151,7 +137,33 @@ class _CallablePlan:
|
|
|
151
137
|
for name, value in bound.arguments.items()
|
|
152
138
|
if self.signature.parameters[name].kind is not inspect.Parameter.POSITIONAL_ONLY
|
|
153
139
|
}
|
|
154
|
-
|
|
140
|
+
if not self.dependencies:
|
|
141
|
+
return await function(*positional, **named)
|
|
142
|
+
|
|
143
|
+
# 与原生注入一致,当前签名决定有效 DI 参数及解析顺序,分类仍来自编译计划。
|
|
144
|
+
dependencies = {
|
|
145
|
+
name: self.dependencies[name]
|
|
146
|
+
for name in signature.parameters
|
|
147
|
+
if name in self.dependencies
|
|
148
|
+
}
|
|
149
|
+
if dependencies:
|
|
150
|
+
# 保留原生注入剥离 DI 后的签名校验;畸形元数据须在资源获取前失败。
|
|
151
|
+
inspect.Signature(
|
|
152
|
+
parameters=[
|
|
153
|
+
parameter.replace(annotation=Any)
|
|
154
|
+
for name, parameter in signature.parameters.items()
|
|
155
|
+
if name not in dependencies
|
|
156
|
+
],
|
|
157
|
+
return_annotation=signature.return_annotation,
|
|
158
|
+
)
|
|
159
|
+
for name, dependency in dependencies.items():
|
|
160
|
+
# 原生常量直接提供值,不触发同 key 的 Provider;其余依赖仍由容器拥有。
|
|
161
|
+
named[name] = (
|
|
162
|
+
dependency.get_const_value()
|
|
163
|
+
if dependency.is_const()
|
|
164
|
+
else await container.get(dependency.type_hint, dependency.component)
|
|
165
|
+
)
|
|
166
|
+
return await function(*positional, **named)
|
|
155
167
|
|
|
156
168
|
|
|
157
169
|
async def _call_in_scope(
|
|
@@ -41,8 +41,13 @@ class _InterceptorPipeline:
|
|
|
41
41
|
callback: Callable[[], Awaitable[object]],
|
|
42
42
|
) -> object:
|
|
43
43
|
registrations = self.steps[stage]
|
|
44
|
+
# 空扩展链仍执行原阶段逻辑;不创建自引用的递归闭包,避免把回调
|
|
45
|
+
# 及其 scope 状态留到循环 GC 才释放。
|
|
46
|
+
if not registrations:
|
|
47
|
+
return await callback()
|
|
44
48
|
|
|
45
49
|
async def proceed(index: int) -> object:
|
|
50
|
+
nonlocal proceed
|
|
46
51
|
if index == len(registrations):
|
|
47
52
|
return await callback()
|
|
48
53
|
interceptor = await container.get(registrations[index].interceptor)
|
|
@@ -52,7 +57,11 @@ class _InterceptorPipeline:
|
|
|
52
57
|
finally:
|
|
53
58
|
invocation._close()
|
|
54
59
|
|
|
55
|
-
|
|
60
|
+
try:
|
|
61
|
+
return await proceed(0)
|
|
62
|
+
finally:
|
|
63
|
+
# continuation 已失效;解除递归 cell,避免旧 invocation 继续持有执行回调。
|
|
64
|
+
del proceed
|
|
56
65
|
|
|
57
66
|
|
|
58
67
|
@dataclass(slots=True)
|
|
@@ -80,12 +89,14 @@ class _InvocationArguments:
|
|
|
80
89
|
or (self.exposed and self._structure([]) != self._validated_structure)
|
|
81
90
|
)
|
|
82
91
|
|
|
83
|
-
def mark_validated(self) -> None:
|
|
92
|
+
def mark_validated(self, *, capture_structure: bool) -> None:
|
|
84
93
|
# 只在验证成功后记录规范化结果;快照与调用共同归属当前 pipeline。
|
|
85
94
|
self._validated_args = self.args
|
|
86
95
|
self._validated_kwargs = dict(self.kwargs)
|
|
87
96
|
self._validated_nodes = []
|
|
88
|
-
self._validated_structure =
|
|
97
|
+
self._validated_structure = (
|
|
98
|
+
self._structure(self._validated_nodes) if capture_structure else None
|
|
99
|
+
)
|
|
89
100
|
# 不重置 exposed:早期扩展可能保留参数引用,并在后续阶段原地修改同一对象。
|
|
90
101
|
|
|
91
102
|
def _structure(self, retained: list[object]) -> object:
|
|
@@ -220,15 +220,24 @@ class _EntryInterceptionCatalog:
|
|
|
220
220
|
)
|
|
221
221
|
|
|
222
222
|
stages = tuple(
|
|
223
|
-
stage
|
|
223
|
+
stage
|
|
224
|
+
for stage in InterceptionStage
|
|
225
|
+
if stage is not InterceptionStage.METHOD and entry.steps[stage]
|
|
224
226
|
)
|
|
227
|
+
if not stages:
|
|
228
|
+
return await boundary()
|
|
225
229
|
|
|
226
230
|
async def run(index: int) -> object:
|
|
231
|
+
nonlocal run
|
|
227
232
|
if index == len(stages):
|
|
228
233
|
return await boundary()
|
|
229
234
|
return await pipeline.run(stages[index], container, lambda: run(index + 1))
|
|
230
235
|
|
|
231
|
-
|
|
236
|
+
try:
|
|
237
|
+
return await run(0)
|
|
238
|
+
finally:
|
|
239
|
+
# 各阶段已退出;不让递归编排额外保留参数、scope 和事务边界回调。
|
|
240
|
+
del run
|
|
232
241
|
|
|
233
242
|
|
|
234
243
|
async def _invoke_managed_entry(
|
|
@@ -25,6 +25,7 @@ from ..unit_of_work.options import (
|
|
|
25
25
|
)
|
|
26
26
|
from .managed_proxy import _ManagedServiceProxy
|
|
27
27
|
from .methods import (
|
|
28
|
+
_class_policy_fingerprint,
|
|
28
29
|
_compile_method,
|
|
29
30
|
_CompiledMethod,
|
|
30
31
|
_policy_fingerprint,
|
|
@@ -42,25 +43,41 @@ def _managed_names(candidate: type[object]) -> tuple[str, ...]:
|
|
|
42
43
|
)
|
|
43
44
|
names: list[str] = []
|
|
44
45
|
# 类级标记覆盖公开方法;显式方法标记即使位于非公开方法也必须接受形态校验。
|
|
45
|
-
members = {
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
46
|
+
members: dict[str, object] = {}
|
|
47
|
+
for base in reversed(candidate.__mro__):
|
|
48
|
+
members.update(vars(base))
|
|
49
|
+
# 原生 object 成员不携带策略;按身份移除未覆盖项,保留用户声明及其顺序。
|
|
50
|
+
for name, value in vars(object).items():
|
|
51
|
+
if name in members and members[name] is value:
|
|
52
|
+
del members[name]
|
|
53
|
+
public = set(_public_method_names(candidate, is_contract=False)) if class_marked else set()
|
|
49
54
|
for name, value in members.items():
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
+
# 类标记已覆盖公开方法时,无需再逐属性判断该方法是否显式标记。
|
|
56
|
+
marked = name in public
|
|
57
|
+
if not marked:
|
|
58
|
+
targets = (
|
|
59
|
+
(value, value.__func__)
|
|
60
|
+
if isinstance(value, (staticmethod, classmethod))
|
|
61
|
+
else (value,)
|
|
62
|
+
)
|
|
63
|
+
marked = any(
|
|
64
|
+
hasattr(target, attribute) for target in targets for attribute in attributes
|
|
65
|
+
)
|
|
66
|
+
if marked:
|
|
55
67
|
_require_async_instance_method(candidate, name, role="managed service")
|
|
56
68
|
names.append(name)
|
|
57
69
|
return tuple(names)
|
|
58
70
|
|
|
59
71
|
|
|
60
72
|
def _assert_methods(candidate: type[object], methods: Mapping[str, _CompiledMethod]) -> None:
|
|
61
|
-
|
|
73
|
+
names = _managed_names(candidate)
|
|
74
|
+
# 每次解析仍读取当前声明;同一类的策略只在本次同步核对内共用,
|
|
75
|
+
# 不跨请求缓存,后续类级/继承策略修改仍会与编译值发生差异。
|
|
76
|
+
class_policy = _class_policy_fingerprint(candidate)
|
|
77
|
+
if tuple(methods) != names or any(
|
|
62
78
|
getattr(candidate, name) is not method.implementation_method
|
|
63
|
-
or _policy_fingerprint(candidate, method.implementation_method)
|
|
79
|
+
or _policy_fingerprint(candidate, method.implementation_method, class_policy=class_policy)
|
|
80
|
+
!= method.policy_fingerprint
|
|
64
81
|
for name, method in methods.items()
|
|
65
82
|
):
|
|
66
83
|
raise ApplicationServiceDefinitionError(
|
|
@@ -3,9 +3,10 @@
|
|
|
3
3
|
from __future__ import annotations
|
|
4
4
|
|
|
5
5
|
import inspect
|
|
6
|
+
import keyword
|
|
6
7
|
from collections.abc import Awaitable, Callable, Mapping
|
|
7
8
|
from dataclasses import dataclass, field, replace
|
|
8
|
-
from types import MappingProxyType
|
|
9
|
+
from types import FunctionType, MappingProxyType
|
|
9
10
|
from typing import Any, cast, get_type_hints
|
|
10
11
|
|
|
11
12
|
from pydantic import ConfigDict, TypeAdapter, validate_call
|
|
@@ -199,15 +200,36 @@ _POLICY_ATTRIBUTES = (
|
|
|
199
200
|
_AUDITING_ATTRIBUTE,
|
|
200
201
|
)
|
|
201
202
|
|
|
203
|
+
_PolicyRows = tuple[tuple[object, ...], ...]
|
|
204
|
+
_ClassPolicyFingerprint = tuple[bool, _PolicyRows]
|
|
202
205
|
|
|
203
|
-
|
|
206
|
+
|
|
207
|
+
def _policy_values(target: object) -> _PolicyRows:
|
|
208
|
+
namespace = vars(target)
|
|
209
|
+
if any(attribute in namespace for attribute in _POLICY_ATTRIBUTES):
|
|
210
|
+
return (tuple(namespace.get(attribute) for attribute in _POLICY_ATTRIBUTES),)
|
|
211
|
+
return ()
|
|
212
|
+
|
|
213
|
+
|
|
214
|
+
def _class_policy_fingerprint(implementation: type[object]) -> _ClassPolicyFingerprint:
|
|
204
215
|
return (
|
|
205
216
|
issubclass(implementation, ValidationEnabled),
|
|
206
|
-
tuple(
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
217
|
+
tuple(row for target in implementation.__mro__ for row in _policy_values(target)),
|
|
218
|
+
)
|
|
219
|
+
|
|
220
|
+
|
|
221
|
+
def _policy_fingerprint(
|
|
222
|
+
implementation: type[object],
|
|
223
|
+
method: object,
|
|
224
|
+
*,
|
|
225
|
+
class_policy: _ClassPolicyFingerprint | None = None,
|
|
226
|
+
) -> tuple[object, ...]:
|
|
227
|
+
validation, rows = (
|
|
228
|
+
_class_policy_fingerprint(implementation) if class_policy is None else class_policy
|
|
229
|
+
)
|
|
230
|
+
return (
|
|
231
|
+
validation,
|
|
232
|
+
(*rows, *_policy_values(method)),
|
|
211
233
|
)
|
|
212
234
|
|
|
213
235
|
|
|
@@ -278,11 +300,7 @@ def _require_async_instance_method(
|
|
|
278
300
|
symbol=symbol,
|
|
279
301
|
reason=f"public {role} methods must use async def",
|
|
280
302
|
)
|
|
281
|
-
|
|
282
|
-
if not parameters or parameters[0].kind not in (
|
|
283
|
-
inspect.Parameter.POSITIONAL_ONLY,
|
|
284
|
-
inspect.Parameter.POSITIONAL_OR_KEYWORD,
|
|
285
|
-
):
|
|
303
|
+
if not _has_positional_receiver(method):
|
|
286
304
|
# Catalog 与 HTTP generator 都会剥离 receiver;缺少首个位置参数时不能伪装成实例方法。
|
|
287
305
|
raise ApplicationServiceDefinitionError(
|
|
288
306
|
symbol=symbol,
|
|
@@ -291,6 +309,39 @@ def _require_async_instance_method(
|
|
|
291
309
|
return cast(Callable[..., Awaitable[object]], method)
|
|
292
310
|
|
|
293
311
|
|
|
312
|
+
def _has_positional_receiver(method: FunctionType) -> bool:
|
|
313
|
+
# 普通 Python 函数的位置参数由 code 直接声明;完整签名/类型仍在编译时解析。
|
|
314
|
+
# 包装、自定义签名和惰性注解沿用 inspect,不能从包装函数的 *args 推断 receiver。
|
|
315
|
+
code = method.__code__
|
|
316
|
+
count = code.co_argcount + code.co_kwonlyargcount
|
|
317
|
+
count += bool(code.co_flags & inspect.CO_VARARGS) + bool(code.co_flags & inspect.CO_VARKEYWORDS)
|
|
318
|
+
names = code.co_varnames[:count]
|
|
319
|
+
special = any(
|
|
320
|
+
hasattr(method, name)
|
|
321
|
+
for name in (
|
|
322
|
+
"__wrapped__",
|
|
323
|
+
"__signature__",
|
|
324
|
+
"__text_signature__",
|
|
325
|
+
"_partialmethod",
|
|
326
|
+
"__partialmethod__",
|
|
327
|
+
"__annotate__",
|
|
328
|
+
)
|
|
329
|
+
)
|
|
330
|
+
if (
|
|
331
|
+
special
|
|
332
|
+
or len(set(names)) != len(names)
|
|
333
|
+
or any(not name.isidentifier() or keyword.iskeyword(name) for name in names)
|
|
334
|
+
or len(method.__defaults__ or ()) > code.co_argcount
|
|
335
|
+
):
|
|
336
|
+
# 手工替换 code 的非法参数及特殊声明仍由原生 Signature 报告,不能静默放行。
|
|
337
|
+
parameters = tuple(inspect.signature(method).parameters.values())
|
|
338
|
+
return bool(parameters) and parameters[0].kind in (
|
|
339
|
+
inspect.Parameter.POSITIONAL_ONLY,
|
|
340
|
+
inspect.Parameter.POSITIONAL_OR_KEYWORD,
|
|
341
|
+
)
|
|
342
|
+
return code.co_argcount > 0
|
|
343
|
+
|
|
344
|
+
|
|
294
345
|
def _resolved_signature(
|
|
295
346
|
method: Callable[..., Awaitable[object]],
|
|
296
347
|
) -> tuple[inspect.Signature, dict[str, object]]:
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: python-ddd-framework
|
|
3
|
-
Version: 0.7.
|
|
3
|
+
Version: 0.7.2
|
|
4
4
|
Summary: Modular DDD application framework with project CLI and bundled templates
|
|
5
5
|
License-Expression: LicenseRef-Proprietary
|
|
6
6
|
License-File: LICENSE
|
|
@@ -312,6 +312,12 @@ New `ddd` modules contain the full responsibility directories and necessary comp
|
|
|
312
312
|
|
|
313
313
|
See the [migration guide](docs/development.md#数据库聚合与迁移) and [verification record](docs/status.md#http-回收与迁移来源判定未发布).
|
|
314
314
|
|
|
315
|
+
## Invocation performance (0.7.2)
|
|
316
|
+
|
|
317
|
+
Function calls avoid regenerating DI wrappers, empty extension chains skip unnecessary work, and completed filter/interceptor chains release execution references sooner. Managed declaration checks continue to detect dynamic method and policy changes.
|
|
318
|
+
|
|
319
|
+
Public APIs, DI scopes, authorization, validation, Unit of Work, exception and cancellation behavior are unchanged. No application-code, configuration or data migration is required. Follow the existing [upgrade procedure](#upgrading); validation evidence and performance limits are recorded in [release status](docs/status.md#当前发布).
|
|
320
|
+
|
|
315
321
|
<a id="streaming-and-access-migration-07-unreleased"></a>
|
|
316
322
|
|
|
317
323
|
## Streaming and access migration (0.7)
|
|
@@ -226,14 +226,14 @@ python_ddd_framework/fastapi/background.py,sha256=MZASgFRz1tQkzMo7A33ZA41qS90wpb
|
|
|
226
226
|
python_ddd_framework/fastapi/contracts.py,sha256=I9EFDcAuv_Xlv1iNxKWIo4krt3-vkfJgV4ngPKWhxPM,11888
|
|
227
227
|
python_ddd_framework/fastapi/error_handlers.py,sha256=jH8tbW9nGd_znwhZHSDZv3KwN7k59FFi0QZQWpCWLcg,4492
|
|
228
228
|
python_ddd_framework/fastapi/errors.py,sha256=XPhxj-WyWQ2wj1q1JkalnyVi2UaOKHbFk_-RbMnS5Ok,984
|
|
229
|
-
python_ddd_framework/fastapi/filters.py,sha256=
|
|
229
|
+
python_ddd_framework/fastapi/filters.py,sha256=grn6wcVASSVqbXEBA_JWV2OVolwqjL503nhMHnWwJrs,4177
|
|
230
230
|
python_ddd_framework/fastapi/health.py,sha256=Gjoebhx-6fH4go48xmw3dfo9qUKhVHBxcZfbxkB5Ndg,1703
|
|
231
231
|
python_ddd_framework/fastapi/http.py,sha256=W0jFoqVYOc_rvT7BGa9m1btEThixX7o0ujt_TMxegsg,2725
|
|
232
232
|
python_ddd_framework/fastapi/http_router.py,sha256=pgfzy7zcUgy8bNOUTIRn7vgeSHLLcVcVbufLute_m_Y,9254
|
|
233
233
|
python_ddd_framework/fastapi/manual_action.py,sha256=1HMqRttXK1JiN3uuKGmYuss9hRAzussI-dilGhGfns8,5992
|
|
234
234
|
python_ddd_framework/fastapi/middleware.py,sha256=uIT3KFyVPy-ruBvNzjANclqLp4RAx3X01F9_yN3JEMQ,3968
|
|
235
235
|
python_ddd_framework/fastapi/module.py,sha256=aqVUC0Ups8IzdUR-BFc7hgAh7hHB5fcWNMmzc02TOOo,633
|
|
236
|
-
python_ddd_framework/fastapi/parameters.py,sha256=
|
|
236
|
+
python_ddd_framework/fastapi/parameters.py,sha256=8Ff3hdvexxasSiABE7jAlwxu3o8pkzaD1rwJIu2DAmY,3989
|
|
237
237
|
python_ddd_framework/fastapi/realtime/__init__.py,sha256=-GtZxXilBiLP3-jQpRa7HPKOMLFNh1sWeV_bcP9iONo,360
|
|
238
238
|
python_ddd_framework/fastapi/realtime/authentication.py,sha256=sIBB3387KV_O2TZ23_bDqP4jBjkWgmPvAaPkL1Y_AXE,7401
|
|
239
239
|
python_ddd_framework/fastapi/realtime/connection.py,sha256=YSEaRbmKpcrNx8sfh0t4Dn5_CkC4TJjOv5yqbco3Xsc,6099
|
|
@@ -295,19 +295,19 @@ python_ddd_framework/identity/stores.py,sha256=0_cSsGmfaC9I2-7tbQhYH_yXUXefFpm2O
|
|
|
295
295
|
python_ddd_framework/identity/tokens.py,sha256=9DMz1NEp2xswGCj0ja-9knpzrZinRsk2JQJdCRo8qeA,3345
|
|
296
296
|
python_ddd_framework/invocation/__init__.py,sha256=AsJHV0LS2mpvY9XLeVnCrVWa2p7z-WiqL5zDBjxAxC0,146
|
|
297
297
|
python_ddd_framework/invocation/arguments.py,sha256=7LRZfOifZwWHc9EqtQYda83sBrqptFQE9HvK092VWs4,2769
|
|
298
|
-
python_ddd_framework/invocation/callables.py,sha256=
|
|
298
|
+
python_ddd_framework/invocation/callables.py,sha256=CgkrA4etBxo7E_Emh5DPgAsbSpvL8lfyioU7qF5Wz_g,7400
|
|
299
299
|
python_ddd_framework/invocation/contracts.py,sha256=VxT-kj4v90cq1yUx9lTs-enDeqzofRG5pecPqiazcWE,908
|
|
300
300
|
python_ddd_framework/invocation/contribution.py,sha256=DcNZg4qRhDX7eXypQaesGIhRtsyyZ4iNn5ATg6U8Qpg,2017
|
|
301
|
-
python_ddd_framework/invocation/dispatcher.py,sha256=
|
|
301
|
+
python_ddd_framework/invocation/dispatcher.py,sha256=oORWvyaZkvM1zEO6k2bXUzDQDI2yS1Q7nblPwii6Jj8,10813
|
|
302
302
|
python_ddd_framework/invocation/entries.py,sha256=0ubnHAkqY7uFgW4QJtdYw9__KPsKuNJmcvw-VdksMJo,1080
|
|
303
303
|
python_ddd_framework/invocation/entrypoints.py,sha256=9VKoYHW2LM8uwSyrbOGHHujWboy8f8YmCEOjUwfX5N0,4183
|
|
304
|
-
python_ddd_framework/invocation/execution.py,sha256=
|
|
304
|
+
python_ddd_framework/invocation/execution.py,sha256=1bFm7ZoPNG42Yf29ZNNsExLaKtR72IZURjpWO96PGpw,7770
|
|
305
305
|
python_ddd_framework/invocation/function_runtime.py,sha256=0i3_BNgiBAo6e9u4L5C2E9_6t-9EfaPsAgcRTv3aAaQ,1999
|
|
306
|
-
python_ddd_framework/invocation/interception.py,sha256=
|
|
306
|
+
python_ddd_framework/invocation/interception.py,sha256=EcIDmhuvMct60vJ3Nm8bCVkaFdAyKD-S4u1L4Y6Hfh8,10230
|
|
307
307
|
python_ddd_framework/invocation/interceptors.py,sha256=WwgKI1Wb4MYj2tJpuizKGfHpPNceSOdXOglXTOBZ_0M,1123
|
|
308
308
|
python_ddd_framework/invocation/managed_proxy.py,sha256=IebejX2Z4hVkxRSFfnlsbYCWxeE5vM7eWKzeIM487PU,4411
|
|
309
|
-
python_ddd_framework/invocation/managed_services.py,sha256=
|
|
310
|
-
python_ddd_framework/invocation/methods.py,sha256=
|
|
309
|
+
python_ddd_framework/invocation/managed_services.py,sha256=Rc4LvdmdfK_aYUjuYK5o-Y0Ln3Chhi2cWX0uFQxA0C8,11490
|
|
310
|
+
python_ddd_framework/invocation/methods.py,sha256=61_1zRkHvMoEFMRvRgjoSK8s7VKnT1hF3VPFL_kwFdM,15223
|
|
311
311
|
python_ddd_framework/invocation/module.py,sha256=FQldD1G9vlsiw48JLwQV9ZfM-tnsTuGGJO2tmQv3Vb0,4387
|
|
312
312
|
python_ddd_framework/invocation/policies.py,sha256=1RE1yQKZN2NMPZOQXQcqVIwaInb0Oz3EFqujqxTfXFw,1879
|
|
313
313
|
python_ddd_framework/invocation/runtime.py,sha256=U7dziK1Rq-gmElCM6VnBvyegHj947Ax87R-6Wu6QDI0,18519
|
|
@@ -452,9 +452,9 @@ python_ddd_framework/unit_of_work/module.py,sha256=EjsUtCG7w56NmLU_xqBRiwJ65Mw5h
|
|
|
452
452
|
python_ddd_framework/unit_of_work/options.py,sha256=AVcEmwwn39qvj8PLQetBeGzdU_eblABGuNLDIQU5tyI,3365
|
|
453
453
|
python_ddd_framework/validation/__init__.py,sha256=nTN_BgIXMLHeUtMgSj2hpisWc1_sk6UWTapk30oh1us,100
|
|
454
454
|
python_ddd_framework/validation/models.py,sha256=Ydz5ZYgqYMPZEXi9A3DA6beN5lD9AcMaImnxDf1aRXs,1737
|
|
455
|
-
python_ddd_framework-0.7.
|
|
456
|
-
python_ddd_framework-0.7.
|
|
457
|
-
python_ddd_framework-0.7.
|
|
458
|
-
python_ddd_framework-0.7.
|
|
459
|
-
python_ddd_framework-0.7.
|
|
460
|
-
python_ddd_framework-0.7.
|
|
455
|
+
python_ddd_framework-0.7.2.dist-info/licenses/LICENSE,sha256=2sSWLZdtk4EhG2GlwpksXzmyux-G6Qiov0D27lE_bqw,805
|
|
456
|
+
python_ddd_framework-0.7.2.dist-info/licenses/src/python_ddd_framework/background_jobs/pgqueuer/UPSTREAM_LICENSE.txt,sha256=0lCGUd5Pke2Up1Kqn1kRnHcwLlBz60E8xvR7WL4k_kE,1066
|
|
457
|
+
python_ddd_framework-0.7.2.dist-info/WHEEL,sha256=1dD_GoEqEIxQ7VnrUExgdj_eExY4b4UgfR0iBlGKVac,80
|
|
458
|
+
python_ddd_framework-0.7.2.dist-info/entry_points.txt,sha256=CMy4XBD8IKGUfHwe0YBmHmSJtjfnA3yyDHqsMZCLsc8,447
|
|
459
|
+
python_ddd_framework-0.7.2.dist-info/METADATA,sha256=HZlFBzL92XgY7oq4rysrnDh7zhe0CWxRTVnz1gUwa6U,66019
|
|
460
|
+
python_ddd_framework-0.7.2.dist-info/RECORD,,
|
{python_ddd_framework-0.7.1.dist-info → python_ddd_framework-0.7.2.dist-info}/entry_points.txt
RENAMED
|
File without changes
|
{python_ddd_framework-0.7.1.dist-info → python_ddd_framework-0.7.2.dist-info}/licenses/LICENSE
RENAMED
|
File without changes
|