ormlambda 2.9.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.
@@ -4,6 +4,7 @@ import inspect
4
4
  from mysql.connector import MySQLConnection, errors, errorcode
5
5
  import functools
6
6
 
7
+
7
8
  if TYPE_CHECKING:
8
9
  from ormlambda import Table
9
10
  from ormlambda.components.where.abstract_where import AbstractWhere
@@ -13,6 +14,8 @@ if TYPE_CHECKING:
13
14
  from ormlambda.common.interfaces import IAggregate
14
15
  from ormlambda.common.interfaces.IStatements import WhereTypes
15
16
 
17
+ from ormlambda.utils.foreign_key import ForeignKey
18
+
16
19
  from ormlambda import AbstractSQLStatements
17
20
  from .clauses import DeleteQuery
18
21
  from .clauses import InsertQuery
@@ -29,7 +32,7 @@ from .clauses import Count
29
32
  from .clauses import GroupBy
30
33
 
31
34
 
32
- from ormlambda.utils import ForeignKey, Table
35
+ from ormlambda.utils import Table
33
36
  from ormlambda.common.enums import JoinType
34
37
  from . import functions as func
35
38
 
@@ -46,8 +49,8 @@ def clear_list(f: Callable[..., Any]):
46
49
  return wrapper
47
50
 
48
51
 
49
- class MySQLStatements[T: Table](AbstractSQLStatements[T, MySQLConnection]):
50
- def __init__(self, model: T, repository: IRepositoryBase[MySQLConnection]) -> None:
52
+ class MySQLStatements[T: Table, *Ts](AbstractSQLStatements[T, *Ts, MySQLConnection]):
53
+ def __init__(self, model: tuple[T, *Ts], repository: IRepositoryBase[MySQLConnection]) -> None:
51
54
  super().__init__(model, repository=repository)
52
55
 
53
56
  @property
@@ -141,24 +144,17 @@ class MySQLStatements[T: Table](AbstractSQLStatements[T, MySQLConnection]):
141
144
  self,
142
145
  selection: Callable[[T], tuple] = lambda x: "*",
143
146
  alias=True,
144
- alias_name=None,
147
+ alias_name="count",
145
148
  ) -> IQuery:
146
149
  return Count[T](self._model, selection, alias=alias, alias_name=alias_name)
147
150
 
148
- @override
149
- def join(self, table_left: Table, table_right: Table, *, by: str) -> IStatements_two_generic[T, MySQLConnection]:
150
- where = ForeignKey.MAPPED[table_left.__table_name__][table_right.__table_name__]
151
- join_query = JoinSelector[table_left, Table](table_left, table_right, JoinType(by), where=where)
152
- self._query_list["join"].append(join_query)
153
- return self
154
-
155
151
  @override
156
152
  def where(self, conditions: WhereTypes = lambda: None, **kwargs) -> IStatements_two_generic[T, MySQLConnection]:
157
153
  # FIXME [x]: I've wrapped self._model into tuple to pass it instance attr. Idk if it's correct
158
154
 
159
155
  if isinstance(conditions, Iterable):
160
156
  for x in conditions:
161
- self._query_list["where"].append(WhereCondition[T](function=x, instances=(self._model,), **kwargs))
157
+ self._query_list["where"].append(WhereCondition[T](function=x, instances=self._models, **kwargs))
162
158
  return self
163
159
 
164
160
  where_query = WhereCondition[T](function=conditions, instances=(self._model,), **kwargs)
@@ -188,7 +184,19 @@ class MySQLStatements[T: Table](AbstractSQLStatements[T, MySQLConnection]):
188
184
  return func.Sum[T](self._model, column=column, alias=alias, alias_name=alias_name)
189
185
 
190
186
  @override
191
- def select[TValue, TFlavour, *Ts](self, selector: Optional[Callable[[T], tuple[TValue, *Ts]]] = lambda: None, *, flavour: Optional[Type[TFlavour]] = None, by: JoinType = JoinType.INNER_JOIN):
187
+ def join[*FKTables](self, joins) -> IStatements_two_generic[T, *FKTables, MySQLConnection]:
188
+ if not isinstance(joins[0], tuple):
189
+ joins = (joins,)
190
+ new_tables: list[Type[Table]] = [self._model]
191
+ for table, where in joins:
192
+ new_tables.append(table)
193
+ join_query = JoinSelector[T, type(table)](self._model, table, by=JoinType.INNER_JOIN, where=where)
194
+ self._query_list["join"].append(join_query)
195
+ self._models = new_tables
196
+ return self
197
+
198
+ @override
199
+ def select[TValue, TFlavour, *Ts](self, selector: Optional[Callable[[T, *Ts], tuple[TValue, *Ts]]] = lambda: None, *, flavour: Optional[Type[TFlavour]] = None, by: JoinType = JoinType.INNER_JOIN, **kwargs):
192
200
  if len(inspect.signature(selector).parameters) == 0:
193
201
  # COMMENT: if we do not specify any lambda function we assumed the user want to retreive only elements of the Model itself avoiding other models
194
202
  result = self.select(selector=lambda x: (x,), flavour=flavour, by=by)
@@ -197,19 +205,28 @@ class MySQLStatements[T: Table](AbstractSQLStatements[T, MySQLConnection]):
197
205
  if flavour:
198
206
  return result
199
207
  return () if not result else result[0]
200
- select = Select[T](self._model, lambda_query=selector, by=by, alias=False)
208
+
209
+ joins = self._query_list.pop("join", None)
210
+ select = Select[T, *Ts](
211
+ self._models,
212
+ lambda_query=selector,
213
+ by=by,
214
+ alias=False,
215
+ joins=joins,
216
+ )
201
217
  self._query_list["select"].append(select)
202
218
 
203
- query: str = self._build()
219
+ self._query: str = self._build()
220
+
204
221
  if flavour:
205
- result = self._return_flavour(query, flavour, select)
206
- if issubclass(flavour, tuple) and isinstance(selector(self._model), property):
222
+ result = self._return_flavour(self.query, flavour, select, **kwargs)
223
+ if issubclass(flavour, tuple) and isinstance(selector(*self._models), property):
207
224
  return tuple([x[0] for x in result])
208
225
  return result
209
- return self._return_model(select, query)
226
+ return self._return_model(select, self.query)
210
227
 
211
228
  @override
212
- def select_one[TValue, TFlavour, *Ts](self, selector: Optional[Callable[[T], tuple[TValue, *Ts]]] = lambda: None, *, flavour: Optional[Type[TFlavour]] = None, by: JoinType = JoinType.INNER_JOIN):
229
+ def select_one[TValue, TFlavour, *Ts](self, selector: Optional[Callable[[T, *Ts], tuple[TValue, *Ts]]] = lambda: None, *, flavour: Optional[Type[TFlavour]] = None, by: JoinType = JoinType.INNER_JOIN):
213
230
  self.limit(1)
214
231
  if len(inspect.signature(selector).parameters) == 0:
215
232
  response = self.select(selector=lambda x: (x,), flavour=flavour, by=by)
@@ -226,11 +243,11 @@ class MySQLStatements[T: Table](AbstractSQLStatements[T, MySQLConnection]):
226
243
  return tuple([res[0] for res in response])
227
244
 
228
245
  @override
229
- def group_by[*Ts](self, column: str | Callable[[T], Any]) -> IStatements_two_generic[T, MySQLConnection]:
246
+ def group_by(self, column: str | Callable[[T, *Ts], Any]):
230
247
  if isinstance(column, str):
231
- groupby = GroupBy[T, tuple[*Ts]](self._model, lambda x: column)
248
+ groupby = GroupBy[T, tuple[*Ts]](self._models, lambda x: column)
232
249
  else:
233
- groupby = GroupBy[T, tuple[*Ts]](self._model, column)
250
+ groupby = GroupBy[T, tuple[*Ts]](self._models, column)
234
251
  # Only can be one LIMIT SQL parameter. We only use the last LimitQuery
235
252
  self._query_list["group by"].append(groupby)
236
253
  return self
@@ -240,26 +257,21 @@ class MySQLStatements[T: Table](AbstractSQLStatements[T, MySQLConnection]):
240
257
  def _build(self) -> str:
241
258
  query_list: list[str] = []
242
259
  for x in self.__order__:
243
- sub_query: Optional[list[IQuery]] = self._query_list.get(x, None)
260
+ if len(self._query_list) == 0:
261
+ break
262
+
263
+ sub_query: Optional[list[IQuery]] = self._query_list.pop(x, None)
244
264
  if sub_query is None:
245
265
  continue
246
266
 
247
267
  if isinstance(sub_query[0], WhereCondition):
248
268
  query_ = self.__build_where_clause(sub_query)
249
269
 
250
- # we must check if any join already exists on query string
251
- elif isinstance(sub_query[0], JoinSelector):
252
- select_query: str = self._query_list["select"][0].query
253
- query_ = ""
254
- for join in sub_query:
255
- if join.query not in select_query:
256
- query_ += f"\n{join.query}"
257
-
258
270
  elif isinstance((select := sub_query[0]), Select):
259
271
  query_: str = ""
260
272
  where_joins = self.__create_necessary_inner_join()
261
273
  if where_joins:
262
- select._fk_relationship.update(where_joins)
274
+ select._joins.update(where_joins)
263
275
  query_ = select.query
264
276
 
265
277
  else:
@@ -277,18 +289,21 @@ class MySQLStatements[T: Table](AbstractSQLStatements[T, MySQLConnection]):
277
289
  query += f" {and_} ({clause})"
278
290
  return query
279
291
 
280
- def __create_necessary_inner_join(self) -> Optional[set[tuple[Type[Table], Type[Table]]]]:
292
+ def __create_necessary_inner_join(self) -> Optional[set[JoinSelector]]:
281
293
  # When we applied filters in any table that we wont select any column, we need to add manually all neccessary joins to achieve positive result.
282
294
  if "where" not in self._query_list:
283
295
  return None
284
296
 
285
- res = []
286
297
  for where in self._query_list["where"]:
287
298
  where: AbstractWhere
288
299
 
289
300
  tables = where.get_involved_tables()
290
301
 
291
302
  if tables:
292
- [res.append(x) for x in tables]
293
-
294
- return set(res)
303
+ # FIXME [ ]: Refactor to avoid copy and paste the same code of the '_add_fk_relationship' method
304
+ joins = []
305
+ for ltable, rtable in tables:
306
+ lambda_relationship = ForeignKey.MAPPED[ltable.__table_name__].referenced_tables[rtable.__table_name__].relationship
307
+ joins.append(JoinSelector(ltable, rtable, JoinType.INNER_JOIN, where=lambda_relationship))
308
+ return set(joins)
309
+ return None
ormlambda/model_base.py CHANGED
@@ -10,20 +10,20 @@ from .databases.my_sql import MySQLStatements, MySQLRepository
10
10
  # endregion
11
11
 
12
12
 
13
- class BaseModel[T: Type[Table]]:
13
+ class BaseModel[T: Type[Table], *Ts]:
14
14
  """
15
15
  Class to select the correct AbstractSQLStatements class depends on the repository.
16
16
 
17
17
  Contiene los metodos necesarios para hacer consultas a una tabla
18
18
  """
19
19
 
20
- statements_dicc: dict[Type[IRepositoryBase], Type[AbstractSQLStatements[T, IRepositoryBase]]] = {
20
+ statements_dicc: dict[Type[IRepositoryBase], Type[AbstractSQLStatements[T, *Ts, IRepositoryBase]]] = {
21
21
  MySQLRepository: MySQLStatements,
22
22
  }
23
23
 
24
24
  # region Constructor
25
25
 
26
- def __new__[TRepo](cls, model: T, repository: IRepositoryBase[TRepo]) -> IStatements_two_generic[T, TRepo]:
26
+ def __new__[TRepo](cls, model: tuple[T, *Ts], repository: IRepositoryBase[TRepo]) -> IStatements_two_generic[T, *Ts, TRepo]:
27
27
  if repository is None:
28
28
  raise ValueError("`None` cannot be passed to the `repository` attribute when calling the `BaseModel` class")
29
29
  cls: AbstractSQLStatements[T, TRepo] = cls.statements_dicc.get(type(repository), None)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: ormlambda
3
- Version: 2.9.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
@@ -1,19 +1,21 @@
1
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=W7E3DDeFeQbnBX0ccLqmhUX3dCHHDCADK3bT2wyPEtk,4618
5
- ormlambda/common/abstract_classes/decomposition_query.py,sha256=0k1cTFftZZaRmjuYOEnZ-r7nqljTwcSlz1ZbEElnlbk,12586
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=XJ0hCp7_7wMclPvZmavpdr7unQshOXKZDasgVk6RfwU,10409
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,18 +35,19 @@ 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
44
+ ormlambda/databases/my_sql/clauses/group_by.py,sha256=k2idhaHOfLFwc6XNwhai6LMoAySp6efBTsWCOBVzsc8,1052
42
45
  ormlambda/databases/my_sql/clauses/insert.py,sha256=mnOy62U4go0Ub6tmmgn8DRRWvPN12WRE5lqpCNbyR70,3136
43
- ormlambda/databases/my_sql/clauses/joins.py,sha256=U6JnUvQo7AXyEeK-X1jMvckXefgAB7ugSmJCZhH1XQI,3058
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
49
  ormlambda/databases/my_sql/clauses/order.py,sha256=XTMtR5ObAJxq8eTHp392rykQD991ecJ95dyXXLUpgeU,1680
47
- ormlambda/databases/my_sql/clauses/select.py,sha256=o0gjCt8cZfTkMsJwZcCt0XkSeFa2rlKz-0Ymi7XL5xU,1833
50
+ ormlambda/databases/my_sql/clauses/select.py,sha256=q-rJWbYtfgKEGf-OOH3ToGY90KXGzH3FnKHTc0xsAbM,1962
48
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
@@ -53,9 +56,9 @@ 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=fj_RcMY6QhANvKRyfAnu6PEfvkrpiBXrlTvmeXUf5Vo,8823
57
- ormlambda/databases/my_sql/statements.py,sha256=ukP8ypxegCnxOuIEH99pNgWVUyOP-ELHD6GzfLEWUx4,12045
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
63
  ormlambda/utils/column.py,sha256=SqbX8N63_RwXNrMXuVMOpatDw--aLc47o3kG1sEXhNs,3413
61
64
  ormlambda/utils/dtypes.py,sha256=Ji4QOyKD0n9bKe7yXIIduy9uEX5BaXolQSIsx0NXYJY,7843
@@ -72,7 +75,7 @@ ormlambda/utils/module_tree/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMp
72
75
  ormlambda/utils/module_tree/dfs_traversal.py,sha256=lSF03G63XtJFLp03ueAmsHMBvhUkjptDbK3IugXm8iU,1425
73
76
  ormlambda/utils/module_tree/dynamic_module.py,sha256=zwvjU3U2cz6H2CDp9Gncs5D5bSAyfITNa2SDqFDl8rw,8551
74
77
  ormlambda/utils/table_constructor.py,sha256=ch1geCSJIQnnv_D_uzfYk6do533kjtZyeCIh2t0_dkU,10863
75
- ormlambda-2.9.0.dist-info/LICENSE,sha256=xBprFw8GJLdHMOoUqDk0427EvjIcbEREvXXVFULuuXU,1080
76
- ormlambda-2.9.0.dist-info/METADATA,sha256=t2WNOq0P72brj6Qr1h_PXY0oXRJ85NjY6oYbn7l2REs,8461
77
- ormlambda-2.9.0.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
78
- ormlambda-2.9.0.dist-info/RECORD,,
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,,