modmex-lambda 0.1.0__py3-none-any.whl → 0.2.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.
modmex_lambda/__init__.py CHANGED
@@ -13,7 +13,12 @@ if TYPE_CHECKING:
13
13
  )
14
14
  from .event_handler.request import Request
15
15
  from .event_sources import event_source
16
- from .event_handler.dependencies.depends import Depends
16
+ from .event_handler.dependencies.depends import (
17
+ DefaultDependencyResolver,
18
+ DependencyResolver,
19
+ Depends,
20
+ InjectorDependencyResolver,
21
+ )
17
22
  from .logging import Logger
18
23
  from .parser import event_parser, parse
19
24
  from .validation import ModmexValidator, ValidationError
@@ -26,7 +31,10 @@ _EXPORTS = {
26
31
  "parse": ("modmex_lambda.parser", "parse"),
27
32
  "event_parser": ("modmex_lambda.parser", "event_parser"),
28
33
  "event_source": ("modmex_lambda.event_sources", "event_source"),
34
+ "DefaultDependencyResolver": ("modmex_lambda.event_handler.dependencies.depends", "DefaultDependencyResolver"),
35
+ "DependencyResolver": ("modmex_lambda.event_handler.dependencies.depends", "DependencyResolver"),
29
36
  "Depends": ("modmex_lambda.event_handler.dependencies.depends", "Depends"),
37
+ "InjectorDependencyResolver": ("modmex_lambda.event_handler.dependencies.depends", "InjectorDependencyResolver"),
30
38
  "Logger": ("modmex_lambda.logging", "Logger"),
31
39
  "ModmexValidator": ("modmex_lambda.validation", "ModmexValidator"),
32
40
  "ValidationError": ("modmex_lambda.validation", "ValidationError"),
@@ -40,7 +48,10 @@ __all__ = [
40
48
  "parse",
41
49
  "event_parser",
42
50
  "event_source",
51
+ "DefaultDependencyResolver",
52
+ "DependencyResolver",
43
53
  "Depends",
54
+ "InjectorDependencyResolver",
44
55
  "Logger",
45
56
  "ModmexValidator",
46
57
  "ValidationError",
@@ -10,13 +10,16 @@ if TYPE_CHECKING:
10
10
  ApiGatewayRestResolver,
11
11
  Response,
12
12
  )
13
- from .dependencies.depends import Depends
13
+ from .dependencies.depends import DefaultDependencyResolver, DependencyResolver, Depends, InjectorDependencyResolver
14
14
 
15
15
  _EXPORTS = {
16
16
  "ApiGatewayHttpResolver": ("modmex_lambda.event_handler.api_gateway", "ApiGatewayHttpResolver"),
17
17
  "ApiGatewayRestResolver": ("modmex_lambda.event_handler.api_gateway", "ApiGatewayRestResolver"),
18
18
  "Response": ("modmex_lambda.event_handler.api_gateway", "Response"),
19
+ "DefaultDependencyResolver": ("modmex_lambda.event_handler.dependencies.depends", "DefaultDependencyResolver"),
20
+ "DependencyResolver": ("modmex_lambda.event_handler.dependencies.depends", "DependencyResolver"),
19
21
  "Depends": ("modmex_lambda.event_handler.dependencies.depends", "Depends"),
22
+ "InjectorDependencyResolver": ("modmex_lambda.event_handler.dependencies.depends", "InjectorDependencyResolver"),
20
23
  "content_types": ("modmex_lambda.event_handler.content_types", None),
21
24
  }
22
25
 
@@ -24,7 +27,10 @@ __all__ = [
24
27
  "ApiGatewayHttpResolver",
25
28
  "ApiGatewayRestResolver",
26
29
  "Response",
30
+ "DefaultDependencyResolver",
31
+ "DependencyResolver",
27
32
  "Depends",
33
+ "InjectorDependencyResolver",
28
34
  "content_types",
29
35
  ]
30
36
 
@@ -27,6 +27,7 @@ from modmex_lambda.data_classes.api_gateway_proxy_event import APIGatewayProxyEv
27
27
  from modmex_lambda.shared.types import AnyCallableT
28
28
  from modmex_lambda.event_handler.types import IApiGatewayResolver
29
29
  from modmex_lambda.event_handler.dependencies.dependency_middleware import DependencyMiddleware
30
+ from modmex_lambda.event_handler.dependencies.depends import DefaultDependencyResolver, DependencyResolver
30
31
  from modmex_lambda.event_handler.middlewares import NextMiddleware
31
32
  from modmex_lambda.event_handler.cors import CORSConfig
32
33
  from modmex_lambda.shared.json_encoder import JSONEncoder
@@ -104,6 +105,7 @@ class ApiGatewayResolver(BaseRouter, IApiGatewayResolver):
104
105
  strip_prefixes: list[str | Pattern] | None = None,
105
106
  json_body_deserializer: Callable[[str], dict] | None = None,
106
107
  logger: Any | None = None,
108
+ dependency_resolver: DependencyResolver | None = None,
107
109
  ) -> None:
108
110
  self._cors = cors
109
111
  self._cors_enabled = cors is not None
@@ -118,6 +120,7 @@ class ApiGatewayResolver(BaseRouter, IApiGatewayResolver):
118
120
  self._router_middlewares: list[Middleware] = []
119
121
 
120
122
  self._logger = logger
123
+ self.dependency_resolver = dependency_resolver or DefaultDependencyResolver()
121
124
  self.dependency_overrides: dict[Callable[..., Any], Callable[..., Any]] = {}
122
125
  self.current_event = None
123
126
  self.current_context = None
@@ -0,0 +1,13 @@
1
+ from modmex_lambda.event_handler.dependencies.depends import (
2
+ DefaultDependencyResolver,
3
+ DependencyResolver,
4
+ Depends,
5
+ InjectorDependencyResolver,
6
+ )
7
+
8
+ __all__ = [
9
+ "DefaultDependencyResolver",
10
+ "DependencyResolver",
11
+ "Depends",
12
+ "InjectorDependencyResolver",
13
+ ]
@@ -131,12 +131,15 @@ def get_dependant(
131
131
 
132
132
  depends = _get_depends_from_annotation(param.annotation)
133
133
  if depends is not None:
134
+ depends = depends.resolve_for_annotation(param.annotation)
134
135
  _inherit_local_namespace(parent=call, dependency=depends.dependency)
135
136
  dependant.dependencies.append(
136
137
  DependencyParam(
137
138
  param_name=param_name,
138
139
  depends=depends,
139
- dependant=get_dependant(path=path, call=depends.dependency),
140
+ dependant=Dependant(call=depends.dependency)
141
+ if inspect.isclass(depends.dependency)
142
+ else get_dependant(path=path, call=depends.dependency),
140
143
  ),
141
144
  )
142
145
  continue
@@ -2,7 +2,8 @@
2
2
 
3
3
  from __future__ import annotations
4
4
 
5
- from typing import Annotated, Any, Callable, get_args, get_origin, get_type_hints
5
+ import inspect
6
+ from typing import Annotated, Any, Callable, Protocol, get_args, get_origin, get_type_hints
6
7
 
7
8
  from modmex_lambda.event_handler.dependencies.compat import ModelField
8
9
  from modmex_lambda.event_handler.dependencies.types import CacheKey
@@ -43,15 +44,83 @@ class DependencyResolutionError(Exception):
43
44
  """Raised when a dependency cannot be resolved."""
44
45
 
45
46
 
47
+ class DependencyResolver(Protocol):
48
+ """Resolves a dependency token into the value passed to a route handler."""
49
+
50
+ def resolve(
51
+ self,
52
+ dependency: Callable[..., Any] | type[Any],
53
+ *,
54
+ values: dict[str, Any] | None = None,
55
+ request: Request | None = None,
56
+ ) -> Any:
57
+ ...
58
+
59
+
60
+ class DefaultDependencyResolver:
61
+ """Default resolver that calls dependency functions with solved values."""
62
+
63
+ def resolve(
64
+ self,
65
+ dependency: Callable[..., Any] | type[Any],
66
+ *,
67
+ values: dict[str, Any] | None = None,
68
+ request: Request | None = None,
69
+ ) -> Any:
70
+ return dependency(**(values or {}))
71
+
72
+
73
+ class InjectorDependencyResolver:
74
+ """Optional adapter for the ``injector`` package."""
75
+
76
+ def __init__(self, injector: Any) -> None:
77
+ self.injector = injector
78
+
79
+ def resolve(
80
+ self,
81
+ dependency: Callable[..., Any] | type[Any],
82
+ *,
83
+ values: dict[str, Any] | None = None,
84
+ request: Request | None = None,
85
+ ) -> Any:
86
+ kwargs = values or {}
87
+
88
+ if hasattr(self.injector, "call_with_injection") and not inspect.isclass(dependency):
89
+ return self.injector.call_with_injection(dependency, kwargs=kwargs)
90
+
91
+ if not kwargs and inspect.isclass(dependency) and hasattr(self.injector, "get"):
92
+ return self.injector.get(dependency)
93
+
94
+ return dependency(**kwargs)
95
+
96
+
46
97
  class Depends:
47
- def __init__(self, dependency: Callable[..., Any], *, use_cache: bool = True) -> None:
48
- if not callable(dependency):
98
+ def __init__(
99
+ self,
100
+ dependency: Callable[..., Any] | type[Any] | None = None,
101
+ *,
102
+ use_cache: bool = True,
103
+ ) -> None:
104
+ if dependency is not None and not callable(dependency):
49
105
  raise DependencyResolutionError(
50
106
  f"Depends() requires a callable, got {type(dependency).__name__}: {dependency!r}",
51
107
  )
52
108
  self.dependency = dependency
53
109
  self.use_cache = use_cache
54
110
 
111
+ def resolve_for_annotation(self, annotation: Any) -> Depends:
112
+ if self.dependency is not None:
113
+ return self
114
+
115
+ if get_origin(annotation) is Annotated:
116
+ dependency = get_args(annotation)[0]
117
+ if callable(dependency):
118
+ return Depends(dependency, use_cache=self.use_cache)
119
+
120
+ raise DependencyResolutionError(
121
+ "Depends() without a callable requires a callable parameter annotation",
122
+ )
123
+
55
124
 
56
125
  class _DependencyNode:
57
126
  """Lightweight node in a dependency tree."""
@@ -101,12 +170,17 @@ def build_dependency_tree(func: Callable[..., Any]) -> DependencyTree:
101
170
  depends = _get_depends_from_annotation(annotation)
102
171
  if depends is None:
103
172
  continue
173
+ depends = depends.resolve_for_annotation(annotation)
104
174
 
105
175
  dependencies.append(
106
176
  _DependencyNode(
107
177
  param_name=param_name,
108
178
  depends=depends,
109
- sub_tree=build_dependency_tree(depends.dependency),
179
+ sub_tree=(
180
+ DependencyTree()
181
+ if inspect.isclass(depends.dependency)
182
+ else build_dependency_tree(depends.dependency)
183
+ ),
110
184
  ),
111
185
  )
112
186
 
@@ -119,12 +193,14 @@ def solve_dependencies(
119
193
  request: Request | None = None,
120
194
  dependency_overrides: dict[Callable[..., Any], Callable[..., Any]] | None = None,
121
195
  dependency_cache: dict[Callable[..., Any], Any] | None = None,
196
+ dependency_resolver: DependencyResolver | None = None,
122
197
  ) -> dict[str, Any]:
123
198
  """Resolve all Depends parameters for a route or lightweight dependency tree."""
124
199
  from modmex_lambda.event_handler.request import Request as RequestClass
125
200
 
126
201
  cache = dependency_cache if dependency_cache is not None else {}
127
202
  overrides = dependency_overrides or {}
203
+ resolver = dependency_resolver or DefaultDependencyResolver()
128
204
  values: dict[str, Any] = {}
129
205
 
130
206
  for dep in dependant.dependencies:
@@ -139,11 +215,12 @@ def solve_dependencies(
139
215
  request=request,
140
216
  dependency_overrides=overrides,
141
217
  dependency_cache=cache,
218
+ dependency_resolver=resolver,
142
219
  )
143
220
  sub_values.update(_request_injection_values(dependency, request, RequestClass))
144
221
 
145
222
  try:
146
- solved = dependency(**sub_values)
223
+ solved = resolver.resolve(dependency, values=sub_values, request=request)
147
224
  except Exception as exc:
148
225
  dep_name = getattr(dependency, "__name__", repr(dependency))
149
226
  raise DependencyResolutionError(
@@ -177,7 +254,10 @@ def _request_injection_values(
177
254
  __all__ = [
178
255
  "Dependant",
179
256
  "DependencyParam",
257
+ "DependencyResolver",
258
+ "DefaultDependencyResolver",
180
259
  "Depends",
260
+ "InjectorDependencyResolver",
181
261
  "_get_depends_from_annotation",
182
262
  "build_dependency_tree",
183
263
  "solve_dependencies",
@@ -492,6 +492,7 @@ class RouteEndpointInvoker:
492
492
  dependant=route.dependant,
493
493
  request=app.request,
494
494
  dependency_overrides=app.dependency_overrides or None,
495
+ dependency_resolver=app.dependency_resolver,
495
496
  ),
496
497
  )
497
498
 
@@ -4,6 +4,7 @@ from typing import Any, Callable, TypeVar, Union
4
4
 
5
5
  from abc import ABC
6
6
  from modmex_lambda.data_classes.api_gateway_proxy_event import APIGatewayProxyEvent, APIGatewayProxyEventV2
7
+ from modmex_lambda.event_handler.dependencies.depends import DependencyResolver
7
8
  from modmex_lambda.event_handler.request import Request
8
9
  from modmex_lambda.event_handler.response import Response
9
10
 
@@ -11,6 +12,7 @@ from modmex_lambda.event_handler.response import Response
11
12
  class IApiGatewayResolver(ABC):
12
13
  context: dict[str, Any]
13
14
  current_event: Union[APIGatewayProxyEvent, APIGatewayProxyEventV2]
15
+ dependency_resolver: DependencyResolver
14
16
  dependency_overrides: dict[Callable[..., Any], Callable[..., Any]]
15
17
  _dependency_middleware: Callable[..., Any]
16
18
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: modmex-lambda
3
- Version: 0.1.0
3
+ Version: 0.2.0
4
4
  Summary: Ultra-lightweight AWS Lambda utilities for API Gateway routing and event handling.
5
5
  Author: Modmex
6
6
  License: MIT
@@ -9,6 +9,8 @@ Requires-Python: >=3.10
9
9
  Requires-Dist: modmex<2.0.0,>=1.1.10
10
10
  Provides-Extra: dev
11
11
  Requires-Dist: pytest>=8.0; extra == 'dev'
12
+ Provides-Extra: injector
13
+ Requires-Dist: injector<1.0.0,>=0.24.0; extra == 'injector'
12
14
  Description-Content-Type: text/markdown
13
15
 
14
16
  # modmex-lambda
@@ -26,11 +28,17 @@ logging with a small dependency footprint.
26
28
  pip install modmex-lambda
27
29
  ```
28
30
 
29
- For local development:
31
+
32
+ To use the optional `injector` integration:
33
+
34
+ ```bash
35
+ pip install "modmex-lambda[injector]"
36
+ ```
37
+
38
+ With Poetry:
30
39
 
31
40
  ```bash
32
- poetry install --extras dev
33
- poetry run pytest -q
41
+ poetry add "modmex-lambda[injector]"
34
42
  ```
35
43
 
36
44
  ## API Gateway Resolvers
@@ -236,6 +244,69 @@ def get_user(
236
244
  return repository.get_user(user_id)
237
245
  ```
238
246
 
247
+ For constructor-heavy services, install the optional `injector` extra and pass
248
+ an `InjectorDependencyResolver` to the app. `Depends()` without a callable uses
249
+ the parameter annotation as the dependency token.
250
+
251
+ ```python
252
+ from typing import Annotated
253
+
254
+ from injector import Injector, Module, inject, provider, singleton
255
+ from modmex_lambda import ApiGatewayHttpResolver, Depends, InjectorDependencyResolver
256
+ from modmex_lambda.event_handler.params import Path
257
+
258
+
259
+ class Settings:
260
+ def __init__(self, tenant_id: str):
261
+ self.tenant_id = tenant_id
262
+
263
+
264
+ class UserRepository:
265
+ def __init__(self, settings: Settings):
266
+ self.settings = settings
267
+
268
+ def get_user(self, user_id: int) -> dict:
269
+ return {"id": user_id, "tenant_id": self.settings.tenant_id}
270
+
271
+
272
+ class UserService:
273
+ def __init__(self, repository: UserRepository):
274
+ self.repository = repository
275
+
276
+ def get_user(self, user_id: int) -> dict:
277
+ return self.repository.get_user(user_id)
278
+
279
+
280
+ class AppModule(Module):
281
+ @singleton
282
+ @provider
283
+ def provide_settings(self) -> Settings:
284
+ return Settings(tenant_id="mx")
285
+
286
+ @singleton
287
+ @provider
288
+ @inject
289
+ def provide_repository(self, settings: Settings) -> UserRepository:
290
+ return UserRepository(settings)
291
+
292
+ @singleton
293
+ @provider
294
+ @inject
295
+ def provide_service(self, repository: UserRepository) -> UserService:
296
+ return UserService(repository)
297
+
298
+
299
+ container = Injector([AppModule()])
300
+ app = ApiGatewayHttpResolver(dependency_resolver=InjectorDependencyResolver(container))
301
+
302
+ @app.get("/users/<user_id>")
303
+ def get_user(
304
+ user_id: Annotated[int, Path()],
305
+ service: Annotated[UserService, Depends()],
306
+ ):
307
+ return service.get_user(user_id)
308
+ ```
309
+
239
310
  Disable dependency caching when a dependency must run every time:
240
311
 
241
312
  ```python
@@ -1,4 +1,4 @@
1
- modmex_lambda/__init__.py,sha256=3gWLZwuPGrvvjTsycbsvGd4Noh4bEj87MwP32IyNrjU,1966
1
+ modmex_lambda/__init__.py,sha256=qgc6KWY3oA15AsKqC1DkSKrwsXd4l2I8rlLOcIglJn8,2511
2
2
  modmex_lambda/event_sources.py,sha256=eLTEN1g9JF2Nk09fMcJn43dBz8BKwCOrtxmZkzr99sM,1714
3
3
  modmex_lambda/exceptions.py,sha256=GL6ZZKhXr0BqfCsGwzookBrUJ1M7JIU2Ju3vWdyna_s,128
4
4
  modmex_lambda/logging.py,sha256=FFINAvMu25d0Ieow-Wa8fEjr9xvtRtPgtLixsDGFPHc,3335
@@ -15,8 +15,8 @@ modmex_lambda/data_classes/api_gateway_proxy_event.py,sha256=fetGgKG4QFpPXu0lImt
15
15
  modmex_lambda/data_classes/api_gateway_websocket_event.py,sha256=EGFqQ4SrC-ssb509UzfNLWpPm7gdtleoYz5Pvb2fIwU,1031
16
16
  modmex_lambda/data_classes/cognito_user_pool_event.py,sha256=DwHa9xtqpFYnFKdUi1Y9RRgxvkVGJQXhFkRh7_4iAf4,18582
17
17
  modmex_lambda/data_classes/common.py,sha256=8saOnaCxH25G-jQumUJMg6CuOhuJ6ugw4vAWH-Fn4Ls,13656
18
- modmex_lambda/event_handler/__init__.py,sha256=4uB7HhYgShpgXJECQhvxJId8Y1Cbkz69M0rpuSxN0I8,1327
19
- modmex_lambda/event_handler/api_gateway.py,sha256=YdgeyObhdPsBApQxnSQd-JykqJ6WKsrIqgKw5r9X8d0,11795
18
+ modmex_lambda/event_handler/__init__.py,sha256=yIiz_l7FFZOARIZ2oFCL4ESIFt078zxv-GslZjx78Go,1831
19
+ modmex_lambda/event_handler/api_gateway.py,sha256=Yeucrol7ovZ6uaytRN7QhLxOOs_O-9EtgEjuw1dJ0Rs,12051
20
20
  modmex_lambda/event_handler/constants.py,sha256=x53p_BZw2lmISpkO5v6d1nfuP-De9uUsUtwgJLaBHKw,28
21
21
  modmex_lambda/event_handler/content_types.py,sha256=FcnCaAVhEOewQXAbkStMBNC63NFMxqwmEFnXcGholug,282
22
22
  modmex_lambda/event_handler/cors.py,sha256=j8H81NdPxqRl5ikW8Wdf7o6pEIx7dGkAsCtSysYI1nc,3516
@@ -27,14 +27,14 @@ modmex_lambda/event_handler/middlewares.py,sha256=oOsQ0nOl7lc_N-kt8wTx7qOXNE5VtR
27
27
  modmex_lambda/event_handler/params.py,sha256=nNhLKduyeQ6TI9Zli32_XtRM93e973igOOZSY0vcpy4,544
28
28
  modmex_lambda/event_handler/request.py,sha256=f5TMv6muYfYOsLbZMPdd6kRMza8U2-UiyNmvuB5grH4,1705
29
29
  modmex_lambda/event_handler/response.py,sha256=izW9v_0E91UsQKX6-W26wnuAy-YP2_kTPbA5OW9L3tM,1988
30
- modmex_lambda/event_handler/routing.py,sha256=ofRSEfWxxAayThjgsBzZ6ZQaSFwtFxnpp1LDp-za2vY,16077
30
+ modmex_lambda/event_handler/routing.py,sha256=MqwHvf9d4qu_1U-qxx85q5m22BQ3kAzfhPeJeMUyaTs,16146
31
31
  modmex_lambda/event_handler/routing_fallbacks.py,sha256=vx23xyg4vEKCqGg1bxBP0OxRsN8NbMkAdehfcNiqwjw,3669
32
- modmex_lambda/event_handler/types.py,sha256=VKl50yStngGK1vBsPVDLQnO8zffgqL9T1StPIVY82qo,1060
33
- modmex_lambda/event_handler/dependencies/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
32
+ modmex_lambda/event_handler/types.py,sha256=VRYaZVipqvwT_PyJ5teGADPIDyt_xRpqJ4bmqhd-lIA,1184
33
+ modmex_lambda/event_handler/dependencies/__init__.py,sha256=KqYkgjAYNlZ2_PIDWAQSG4syIgeTdVmDQC5_lVjfyKI,288
34
34
  modmex_lambda/event_handler/dependencies/compat.py,sha256=MPEJ9EKNja_ys4XLGIm8vTgN7Z96nmuqYHTvixHFR9A,7599
35
- modmex_lambda/event_handler/dependencies/dependant.py,sha256=LWo2r6BZkOKo26tXr5g9vJ_C9Yrixf6iiFsAfM66JXw,9306
35
+ modmex_lambda/event_handler/dependencies/dependant.py,sha256=0Y_-AemuI3DRMgtI9RDdHBFRRIfALulq9Ouqd0Ha8Nk,9496
36
36
  modmex_lambda/event_handler/dependencies/dependency_middleware.py,sha256=c_N7UgtbAVYC6xbfn_MaW7zYQxi5pSSdTeIRaz703Ak,14999
37
- modmex_lambda/event_handler/dependencies/depends.py,sha256=X174dJZ_m6kYvcUvy2IJ7UuLRDV8lH2Jgiht5PQRt8w,5932
37
+ modmex_lambda/event_handler/dependencies/depends.py,sha256=t9FlQpbNc4d7N4YqpeKNwAuyWwfNkwb0TX8o2OTNbXo,8451
38
38
  modmex_lambda/event_handler/dependencies/params.py,sha256=bc208GHiXCfm1V-GLeIMm8-ypZ8P8Q9qUKQkK2Vh1Fg,10085
39
39
  modmex_lambda/event_handler/dependencies/types.py,sha256=5VA8zl-EjQDNKXOrNT7sRv_vNs40Lz8aMP-sf-lf8sk,376
40
40
  modmex_lambda/shared/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -42,7 +42,7 @@ modmex_lambda/shared/cookies.py,sha256=E2hTuht5_Xljw9zOQLW6vjsOWEpQSIqD2D3Tl1Co_
42
42
  modmex_lambda/shared/headers_serializer.py,sha256=Ao-wpx0cmy9E2ACrh7R7RIDUF0h24gax1AMtY_MjIWQ,2505
43
43
  modmex_lambda/shared/json_encoder.py,sha256=Mo4tlrhWvlBhhRYoPt2PAP6b_KsEKbk1pK6e5q0gbuk,1297
44
44
  modmex_lambda/shared/types.py,sha256=lH3i9MF7EQa1et8dD_qagEjlNzqznNHc0YZawp3toMc,134
45
- modmex_lambda-0.1.0.dist-info/METADATA,sha256=HOUUd4hbMrZTGBW045M_ltsC9-myVmZiUV9Jt51JHRo,8936
46
- modmex_lambda-0.1.0.dist-info/WHEEL,sha256=mffPy8wBnZQn2VnJUU5jE99KsxaSfiyMHV9Yt0aLVxs,87
47
- modmex_lambda-0.1.0.dist-info/licenses/LICENSE,sha256=_C2TDTOsYeJvE4vn9VB51laKvleBKbdNnn96wJVtXhQ,1063
48
- modmex_lambda-0.1.0.dist-info/RECORD,,
45
+ modmex_lambda-0.2.0.dist-info/METADATA,sha256=J_gbX6PVZhgRU5pv3fnY3pGeL1Mc1NzO9EznRQ4BTcI,10816
46
+ modmex_lambda-0.2.0.dist-info/WHEEL,sha256=mffPy8wBnZQn2VnJUU5jE99KsxaSfiyMHV9Yt0aLVxs,87
47
+ modmex_lambda-0.2.0.dist-info/licenses/LICENSE,sha256=_C2TDTOsYeJvE4vn9VB51laKvleBKbdNnn96wJVtXhQ,1063
48
+ modmex_lambda-0.2.0.dist-info/RECORD,,