ormlambda 2.8.0__py3-none-any.whl → 2.9.4__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.
@@ -1,75 +1,21 @@
1
+ from __future__ import annotations
2
+ from decimal import Decimal
3
+ from typing import Any, Optional, Type, dataclass_transform, overload, TYPE_CHECKING
1
4
  import base64
2
5
  import datetime
3
- from decimal import Decimal
4
- from typing import Any, Iterable, Optional, Type, dataclass_transform, get_type_hints
5
6
  import json
6
7
 
7
- from .dtypes import get_query_clausule
8
- from .module_tree.dfs_traversal import DFSTraversal
9
- from .column import Column
10
-
11
- from .foreign_key import ForeignKey, TableInfo
12
-
13
- MISSING = Column()
14
-
15
-
16
- class Field:
17
- def __init__(self, name: str, type_: Type, default: object) -> None:
18
- self.name: str = name
19
- self.type_: Type = type_
20
- self.default: Column = default
21
-
22
- def __repr__(self) -> str:
23
- return f"{Field.__name__}(name = {self.name}, type_ = {self.type_}, default = {self.default})"
24
-
25
- @property
26
- def has_default(self) -> bool:
27
- return self.default is not MISSING
8
+ import shapely as sph
28
9
 
29
- @property
30
- def init_arg(self) -> str:
31
- # default = f"={self.default_name if self.has_default else None}"
32
- default = f"={None}"
33
10
 
34
- return f"{self.name}: {self.type_name}{default}"
35
-
36
- @property
37
- def default_name(self) -> str:
38
- return f"_dflt_{self.name}"
39
-
40
- @property
41
- def type_name(self) -> str:
42
- return f"_type_{self.name}"
43
-
44
- @property
45
- def assginment(self) -> str:
46
- return f"self._{self.name} = {self.default.__to_string__(self.name,self.name,self.type_name)}"
47
-
48
-
49
- def delete_special_variables(dicc: dict[str, object]) -> None:
50
- keys = tuple(dicc.keys())
51
- for key in keys:
52
- if key.startswith("__"):
53
- del dicc[key]
54
-
55
-
56
- def get_fields[T](cls: Type[T]) -> Iterable[Field]:
57
- # COMMENT: Used the 'get_type_hints' method to resolve typing when 'from __future__ import annotations' is in use
58
- annotations = {key: val for key, val in get_type_hints(cls).items() if not key.startswith("_")}
59
-
60
- # delete_special_variables(annotations)
61
- fields = []
62
- for name, type_ in annotations.items():
63
- # type_ must by Column object
64
- field_type = type_
65
- if hasattr(type_, "__origin__") and type_.__origin__ is Column: # __origin__ to get type of Generic value
66
- field_type = type_.__args__[0]
67
- default: Column = getattr(cls, name, MISSING)
68
- fields.append(Field(name, field_type, default))
11
+ from .column import Column
12
+ from .dtypes import get_query_clausule
13
+ from .fields import get_fields
14
+ from .foreign_key import ForeignKey, TableInfo
15
+ from .module_tree.dfs_traversal import DFSTraversal
69
16
 
70
- # Update __annotations__ to create Columns
71
- cls.__annotations__[name] = Column[field_type]
72
- return fields
17
+ if TYPE_CHECKING:
18
+ from .fields import Field
73
19
 
74
20
 
75
21
  @dataclass_transform()
@@ -78,23 +24,32 @@ def __init_constructor__[T](cls: Type[T]) -> Type[T]:
78
24
  # TODOL: I don't know if it's better to create a global dictionary like in commit '7de69443d7a8e7264b8d5d604c95da0e5d7e9cc0'
79
25
  setattr(cls, "__properties_mapped__", {})
80
26
  fields = get_fields(cls)
81
- locals_ = {}
82
- init_args = []
27
+
28
+ locals_: dict[str, Any] = {}
29
+ init_args: list[str] = ["self"]
30
+ assignments: list[str] = []
83
31
 
84
32
  for field in fields:
85
- if not field.name.startswith("__"):
86
- locals_[field.type_name] = field.type_
33
+ if field.name.startswith("__"):
34
+ continue
35
+
36
+ locals_[field.type_name] = field.type_
37
+ locals_[field.default_name] = field.default.column_value
87
38
 
88
- init_args.append(field.init_arg)
89
- locals_[field.default_name] = None # field.default.column_value
90
- __create_properties(cls, field)
39
+ init_args.append(field.init_arg)
40
+ assignments.append(field.assginment)
41
+ __create_properties(cls, field)
42
+
43
+ string_locals_ = ", ".join(locals_)
44
+ string_init_args = ", ".join(init_args)
45
+ string_assignments = "\n\t\t".join(assignments)
91
46
 
92
47
  wrapper_fn = "\n".join(
93
48
  [
94
- f"def wrapper({', '.join(locals_.keys())}):",
95
- f" def __init__(self, {', '.join(init_args)}):",
96
- "\n".join([f" {f.assginment}" for f in fields]) or " pass",
97
- " return __init__",
49
+ f"def wrapper({string_locals_}):",
50
+ f"\n\tdef __init__({string_init_args}):",
51
+ f"\n\t\t{string_assignments}",
52
+ "\treturn __init__",
98
53
  ]
99
54
  )
100
55
 
@@ -109,11 +64,11 @@ def __init_constructor__[T](cls: Type[T]) -> Type[T]:
109
64
 
110
65
  def __create_properties(cls: Type["Table"], field: Field) -> property:
111
66
  _name: str = f"_{field.name}"
112
- type_ = field.type_
67
+
113
68
  # we need to get Table attributes (Column class) and then called __getattribute__ or __setattr__ to make changes inside of Column
114
69
  prop = property(
115
- fget=lambda self: __transform_getter(getattr(self, _name), type_),
116
- fset=lambda self, value: __transform_setter(getattr(self, _name), value, type_),
70
+ fget=lambda self: getattr(self, _name).__getattribute__("column_value"),
71
+ fset=lambda self, value: getattr(self, _name).__setattr__("column_value", value),
117
72
  )
118
73
 
119
74
  # set property in public name
@@ -122,22 +77,6 @@ def __create_properties(cls: Type["Table"], field: Field) -> property:
122
77
  return None
123
78
 
124
79
 
125
- def __transform_getter[T](obj: object, type_: T) -> T:
126
- return obj.__getattribute__("column_value")
127
-
128
- # if type_ is str and isinstance(eval(obj), Iterable):
129
- # getter = eval(obj)
130
- # return getter
131
-
132
-
133
- def __transform_setter[T](obj: object, value: Any, type_: T) -> None:
134
- return obj.__setattr__("column_value", value)
135
-
136
- # if type_ is list:
137
- # setter = str(setter)
138
- # return None
139
-
140
-
141
80
  class TableMeta(type):
142
81
  def __new__[T](cls: "Table", name: str, bases: tuple, dct: dict[str, Any]) -> Type[T]:
143
82
  """
@@ -244,6 +183,7 @@ class Table(metaclass=TableMeta):
244
183
  Decimal: str,
245
184
  bytes: byte_to_string,
246
185
  set: list,
186
+ sph.Point: lambda x: sph.to_wkt(x, rounding_precision=-1),
247
187
  }
248
188
 
249
189
  if (dtype := type(_value)) in transform_map:
@@ -324,3 +264,35 @@ class Table(metaclass=TableMeta):
324
264
  )
325
265
  )
326
266
  return False
267
+
268
+ @classmethod
269
+ def get_property_name(cls, _property: property) -> str:
270
+ name: str = cls.__properties_mapped__.get(_property, None)
271
+ if not name:
272
+ raise KeyError(f"Class '{cls.__name__}' has not propery '{_property}' mapped.")
273
+ return name
274
+
275
+ @overload
276
+ @classmethod
277
+ def get_column(cls, column: str) -> Column: ...
278
+ @overload
279
+ @classmethod
280
+ def get_column(cls, column: property) -> Column: ...
281
+ @overload
282
+ @classmethod
283
+ def get_column[TProp](cls, column: property, value: TProp) -> Column[TProp]: ...
284
+ @overload
285
+ @classmethod
286
+ def get_column[TProp](cls, column: str, value: TProp) -> Column[TProp]: ...
287
+ @classmethod
288
+ def get_column[TProp](cls, column: str | property, value: Optional[TProp] = None) -> Column[TProp]:
289
+ if isinstance(column, property):
290
+ _column = cls.get_property_name(column)
291
+ elif isinstance(column, str) and column in cls.get_columns():
292
+ _column = column
293
+ else:
294
+ raise ValueError(f"'Column' param with value'{column}' is not expected.")
295
+
296
+ instance_table: Table = cls(**{_column: value})
297
+
298
+ return getattr(instance_table, f"_{_column}")
@@ -1,14 +1,15 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: ormlambda
3
- Version: 2.8.0
3
+ Version: 2.9.4
4
4
  Summary: ORM designed to interact with the database (currently with MySQL) using lambda functions and nested functions
5
5
  Author: p-hzamora
6
6
  Author-email: p.hzamora@icloud.com
7
7
  Requires-Python: >=3.12,<4.0
8
8
  Classifier: Programming Language :: Python :: 3
9
9
  Classifier: Programming Language :: Python :: 3.12
10
- Requires-Dist: fluent-validation (>=3.1.0,<4.0.0)
10
+ Requires-Dist: fluent-validation (==4.3.1)
11
11
  Requires-Dist: mysql-connector-python (>=9.0.0,<10.0.0)
12
+ Requires-Dist: shapely (>=2.0.6,<3.0.0)
12
13
  Description-Content-Type: text/markdown
13
14
 
14
15
  ![PyPI version](https://img.shields.io/pypi/v/ormlambda.svg)
@@ -1,19 +1,21 @@
1
- ormlambda/__init__.py,sha256=L-Enc4FPmW3ldBMnWOU3gLn9i4FEc7sQzLWy2mIEti8,538
1
+ ormlambda/__init__.py,sha256=lWQxjf2cQ2bXenNaDpoy2Bar6imiPlzc4nK0hkIYhC0,723
2
2
  ormlambda/common/__init__.py,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
3
3
  ormlambda/common/abstract_classes/__init__.py,sha256=tk2J4Mn_nD-1ZjtMVBE5FH7KR_8ppN_1Kx1s6c38GjM,167
4
- ormlambda/common/abstract_classes/abstract_model.py,sha256=0mGoW-MF0bX1VrAp2AJZ8Nk_BV7N_2NtzZoUFCg5Wm4,4595
5
- ormlambda/common/abstract_classes/decomposition_query.py,sha256=c-Vo0f2dnVCv9Qsmqt9AZaZAYvyYhtZFdc3HKyHCMZ0,11396
4
+ ormlambda/common/abstract_classes/abstract_model.py,sha256=xmpr7_Hn5r1bRG2UtOKdhlZgXUqgFGuTTXsmm4LqmEI,5100
5
+ ormlambda/common/abstract_classes/decomposition_query.py,sha256=vX4H-QLGo7mEuDgyXuKSd_1RySywN3fSislrmU4M-No,13791
6
6
  ormlambda/common/abstract_classes/non_query_base.py,sha256=5jhvyT7OZaJxlGp9XMP3vQ4ei5QQZBn-fFtJnD640mE,980
7
7
  ormlambda/common/abstract_classes/query_base.py,sha256=6qUFPwsVx45kUW3b66pHiSyjhcH4mzbdkddlGeUnG7c,266
8
8
  ormlambda/common/enums/__init__.py,sha256=4lVKCHi1JalwgNzjsAXqX-C54NJEH83y2v5baMO8fN4,103
9
9
  ormlambda/common/enums/condition_types.py,sha256=mDPMrtzZu4IYv3-q5Zw4NNgwUoNAx4lih5SIDFRn1Qo,309
10
10
  ormlambda/common/enums/join_type.py,sha256=7LEhE34bzYOwJxe8yxPJo_EjQpGylgClAPX1Wt3z4n4,292
11
+ ormlambda/common/errors/__init__.py,sha256=cWFOYuAauXxzYyGKVP97Uy0EIim5D8ewoTyK-hXkonY,184
11
12
  ormlambda/common/interfaces/IAggregate.py,sha256=i9zZIYrstP2oolUYqR-udeQQl7M0NwSzrr-VUL0b5HI,271
12
- ormlambda/common/interfaces/IDecompositionQuery.py,sha256=dHdCxezbWwy-c4U4po2hQB8f_wa0wGFvA2TKaHBx0Do,1363
13
+ ormlambda/common/interfaces/ICustomAlias.py,sha256=_4r8ew9trUY_DJWdYUZXhJCe_I62HUr7ZdsmW6Ln98M,121
14
+ ormlambda/common/interfaces/IDecompositionQuery.py,sha256=7B4cnbJbyESk8GltS1A8wCXr56T_6kZJNIij66CcvPA,1447
13
15
  ormlambda/common/interfaces/INonQueryCommand.py,sha256=7CjLW4sKqkR5zUIGvhRXOtzTs6vypJW1a9EJHlgCw2c,260
14
16
  ormlambda/common/interfaces/IQueryCommand.py,sha256=hfzCosK4-n8RJIb2PYs8b0qU3TNmfYluZXBf47KxxKs,331
15
- ormlambda/common/interfaces/IRepositoryBase.py,sha256=zGm7tDrFLKj3FMYN-MWI-em3INws27g2yByNYYMx0qk,1126
16
- ormlambda/common/interfaces/IStatements.py,sha256=df3pGRFSwyBcFct0ntMy8E9RNCHreXTO-qirdetS05M,10674
17
+ ormlambda/common/interfaces/IRepositoryBase.py,sha256=M4pD4t6tXo5WaRhwu2vsza1FoAj2S-rEJKjPfKeSRn0,1134
18
+ ormlambda/common/interfaces/IStatements.py,sha256=RQpOy3REjRf9SV9kDo0ohEzfkzkVBxD_gSiM-Dii5-Y,12821
17
19
  ormlambda/common/interfaces/__init__.py,sha256=00ca9a-u_A8DzyEyxPfBMxfqLKFzzUgJaeNmoRitAbA,360
18
20
  ormlambda/components/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
19
21
  ormlambda/components/delete/IDelete.py,sha256=06ZEdbKBxsHSwsGMBu0E1om4WJjojZAm-L3b95eQrcc,139
@@ -33,19 +35,20 @@ ormlambda/components/where/abstract_where.py,sha256=93tIJBC81OUUVV6il7mISibBwqJe
33
35
  ormlambda/databases/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
34
36
  ormlambda/databases/my_sql/__init__.py,sha256=3PbOp4WqxJzFOSRwBozqyNtQi25cLLdiJFPDzEnSI70,115
35
37
  ormlambda/databases/my_sql/clauses/__init__.py,sha256=F7p---sNQBefi_dgydV6Wp1YuOwDzvSQOdbcjWtBi2k,767
38
+ ormlambda/databases/my_sql/clauses/alias.py,sha256=yRBEJ1IlL7j8ZozjR-4jtQNkJZDweu-1VNLJEOyA4o8,887
36
39
  ormlambda/databases/my_sql/clauses/count.py,sha256=UFJD-ELp-xvOyPbvYX37GvRZsP8M_axambnI7_h91yA,1177
37
40
  ormlambda/databases/my_sql/clauses/create_database.py,sha256=WnWaAuhxeE71NZKXW37WZ-msRqjum7TFCSRK1IGdSTE,1279
38
41
  ormlambda/databases/my_sql/clauses/delete.py,sha256=nUKNQgwF5YUfzk2icWpecYjrGk5DeXpp7eiwtWCf_3c,1924
39
42
  ormlambda/databases/my_sql/clauses/drop_database.py,sha256=nMM0YUbcH0D9X3bU70Uc6S_dsIrAZy-IrYuIKrQZNrg,505
40
43
  ormlambda/databases/my_sql/clauses/drop_table.py,sha256=meX4e-pVPQ7UwlPSHV5e9HHRblI1BlkLSc7ssl8WUiI,592
41
- ormlambda/databases/my_sql/clauses/group_by.py,sha256=xG8YhdaDWBm99EFMkzCsBJNhHOJy5lvXmpaHu3jClro,1042
42
- ormlambda/databases/my_sql/clauses/insert.py,sha256=LO9H8VVK3j62dICXqpEUXKxOHPxkD1LGvogmDq2zmho,2805
43
- ormlambda/databases/my_sql/clauses/joins.py,sha256=U6JnUvQo7AXyEeK-X1jMvckXefgAB7ugSmJCZhH1XQI,3058
44
+ ormlambda/databases/my_sql/clauses/group_by.py,sha256=k2idhaHOfLFwc6XNwhai6LMoAySp6efBTsWCOBVzsc8,1052
45
+ ormlambda/databases/my_sql/clauses/insert.py,sha256=mnOy62U4go0Ub6tmmgn8DRRWvPN12WRE5lqpCNbyR70,3136
46
+ ormlambda/databases/my_sql/clauses/joins.py,sha256=2SHRAah4FDzYwCDfpqz9SLU0cFH20mL-epP_FCPgBxM,4402
44
47
  ormlambda/databases/my_sql/clauses/limit.py,sha256=a4lI8FVRKpfXwBQTXdkbVtlQkmzcjE20ymiCy1IaSc4,391
45
48
  ormlambda/databases/my_sql/clauses/offset.py,sha256=81170JhsQndjKlDfQj1ll-tiYHQbW8SuU4IE3mhQF7Y,395
46
- ormlambda/databases/my_sql/clauses/order.py,sha256=RVqyEtD0InnOPAmRvjtNJ-vrAy0V9OHMLoFB8TkpX0I,1137
47
- ormlambda/databases/my_sql/clauses/select.py,sha256=unJBteFK5D360KnIPyqz8OMaVJqXJlI5Kkp6u0JJ1vU,1574
48
- ormlambda/databases/my_sql/clauses/update.py,sha256=3Htw0_PT3EckEiF214-V2r63lcNoRBroKZI9yg48Ddg,1867
49
+ ormlambda/databases/my_sql/clauses/order.py,sha256=XTMtR5ObAJxq8eTHp392rykQD991ecJ95dyXXLUpgeU,1680
50
+ ormlambda/databases/my_sql/clauses/select.py,sha256=q-rJWbYtfgKEGf-OOH3ToGY90KXGzH3FnKHTc0xsAbM,1962
51
+ ormlambda/databases/my_sql/clauses/update.py,sha256=d2nSLiGe8OUk0ASgGxchit_1DL-Yg8U-DUtBbgpfkto,1571
49
52
  ormlambda/databases/my_sql/clauses/upsert.py,sha256=eW2pQ4ax-GKuXiaWKoSRSS1GrHuILJBsmj83ADbBQ34,1951
50
53
  ormlambda/databases/my_sql/clauses/where_condition.py,sha256=UgU5vnTqFAx91wKwnECpww5tETDZ9F7IdC_SiZOgZhI,8336
51
54
  ormlambda/databases/my_sql/functions/__init__.py,sha256=hA8t3mUpV2p-pO4TVp5rjC5Yp7aIkWPsS8NpLi3DUh0,171
@@ -53,12 +56,13 @@ ormlambda/databases/my_sql/functions/concat.py,sha256=cZztl5eSATpYMKVKfyPbul6Ooc
53
56
  ormlambda/databases/my_sql/functions/max.py,sha256=zrO_RBKsHhyokEmSpPI6Yg5OY6Jf4GGp2RveBJdOuuA,1190
54
57
  ormlambda/databases/my_sql/functions/min.py,sha256=SEVuUdIJNz9zM5za1kLTWalFkhErjsjyBb8SU8n0F94,1190
55
58
  ormlambda/databases/my_sql/functions/sum.py,sha256=akKYr2dI8TZS5MDvybfHn_idhPOvEH0cj6mDRQIHe-M,1188
56
- ormlambda/databases/my_sql/repository.py,sha256=fSAAmO_T5mC1bodOVZn5CY9JSfRq4VhsdlWT1JLl7Zw,6927
57
- ormlambda/databases/my_sql/statements.py,sha256=inUEyLUl3Z6TxE7PpJUWw0SZBoO_JbnrS_XL_wCyHn4,11873
58
- ormlambda/model_base.py,sha256=RrAATQWX_bHJ0ZQ5sCHyJKA4NiR7ZJY4I6dqhnGWWAc,1216
59
+ ormlambda/databases/my_sql/repository.py,sha256=6qrP-JC4tvUxin3ixGKBeuqvU9cl9mkjNCdwjWZQA9Y,9059
60
+ ormlambda/databases/my_sql/statements.py,sha256=h7tcyCnGaT2nvWyGhfepLTfgn8bMi5f_Bi_09jOfZm4,12455
61
+ ormlambda/model_base.py,sha256=_UGTnin-yUi9ecT-28YY6TniIPdrje-jMFD3QXyZD6c,1243
59
62
  ormlambda/utils/__init__.py,sha256=ywMdWqmA2jHj19-W-S04yfaYF5hv4IZ1lZDq0B8Jnjs,142
60
- ormlambda/utils/column.py,sha256=5FAGzCU4yvNS4MhwJJ5i73h7RvHD5UCVox0NdzMsMiE,1945
61
- ormlambda/utils/dtypes.py,sha256=1kRsT5JggNS1DMWgSUdBb67CefQHnZ-VTN1WI7nN2yQ,7879
63
+ ormlambda/utils/column.py,sha256=SqbX8N63_RwXNrMXuVMOpatDw--aLc47o3kG1sEXhNs,3413
64
+ ormlambda/utils/dtypes.py,sha256=Ji4QOyKD0n9bKe7yXIIduy9uEX5BaXolQSIsx0NXYJY,7843
65
+ ormlambda/utils/fields.py,sha256=jyUJXJKblhLGqFGgAXkWJeE0FYLd5Ywd7H2pjQsfz8c,2128
62
66
  ormlambda/utils/foreign_key.py,sha256=ewGLPtf1MrFogvwGm_jsSnOLAH2G9virXvLcc3co36I,2973
63
67
  ormlambda/utils/lambda_disassembler/__init__.py,sha256=q23_F2Vp1_XgVpQSbWQPM5wxzRCZOr7ZMb9X5VG_YxU,229
64
68
  ormlambda/utils/lambda_disassembler/dis_types.py,sha256=Myuo9-KSBIJSyr9jfLSDDe1jbrzyOqZNLufv6ODHm98,4824
@@ -70,8 +74,8 @@ ormlambda/utils/lambda_disassembler/tree_instruction.py,sha256=QUnhG89WKJyAlEWAj
70
74
  ormlambda/utils/module_tree/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
71
75
  ormlambda/utils/module_tree/dfs_traversal.py,sha256=lSF03G63XtJFLp03ueAmsHMBvhUkjptDbK3IugXm8iU,1425
72
76
  ormlambda/utils/module_tree/dynamic_module.py,sha256=zwvjU3U2cz6H2CDp9Gncs5D5bSAyfITNa2SDqFDl8rw,8551
73
- ormlambda/utils/table_constructor.py,sha256=8Apm44K6MiYMK3PQyK74MUV18OatbFI9eDLAVklQO0w,11660
74
- ormlambda-2.8.0.dist-info/LICENSE,sha256=xBprFw8GJLdHMOoUqDk0427EvjIcbEREvXXVFULuuXU,1080
75
- ormlambda-2.8.0.dist-info/METADATA,sha256=HV3vUXqD2StgsPEk4VwRtPLp44DRjIUgSoMTRsWAkNw,8428
76
- ormlambda-2.8.0.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
77
- ormlambda-2.8.0.dist-info/RECORD,,
77
+ ormlambda/utils/table_constructor.py,sha256=ch1geCSJIQnnv_D_uzfYk6do533kjtZyeCIh2t0_dkU,10863
78
+ ormlambda-2.9.4.dist-info/LICENSE,sha256=xBprFw8GJLdHMOoUqDk0427EvjIcbEREvXXVFULuuXU,1080
79
+ ormlambda-2.9.4.dist-info/METADATA,sha256=URSNrN9Sg-EsXEJ-XI7iBDBXmB-V7rTCX1jvysybIb8,8461
80
+ ormlambda-2.9.4.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
81
+ ormlambda-2.9.4.dist-info/RECORD,,