aury-boot 0.0.26__py3-none-any.whl → 0.0.28__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.
aury/boot/_version.py CHANGED
@@ -28,7 +28,7 @@ version_tuple: VERSION_TUPLE
28
28
  commit_id: COMMIT_ID
29
29
  __commit_id__: COMMIT_ID
30
30
 
31
- __version__ = version = '0.0.26'
32
- __version_tuple__ = version_tuple = (0, 0, 26)
31
+ __version__ = version = '0.0.28'
32
+ __version_tuple__ = version_tuple = (0, 0, 28)
33
33
 
34
34
  __commit_id__ = commit_id = None
@@ -246,6 +246,27 @@ class CacheSettings(BaseModel):
246
246
  )
247
247
 
248
248
 
249
+ class ChannelSettings(BaseModel):
250
+ """流式通道配置(单实例)。
251
+
252
+ 环境变量格式: CHANNEL__{FIELD}
253
+ 示例: CHANNEL__BACKEND, CHANNEL__URL
254
+
255
+ 支持的后端类型:
256
+ - memory: 内存后端(默认,单进程)
257
+ - redis: Redis Pub/Sub(多进程/分布式)
258
+ """
259
+
260
+ backend: str = Field(
261
+ default="",
262
+ description="通道后端 (memory/redis),空字符串表示不启用"
263
+ )
264
+ url: str | None = Field(
265
+ default=None,
266
+ description="Redis URL(当 backend=redis 时需要)"
267
+ )
268
+
269
+
249
270
  class StorageSettings(BaseModel):
250
271
  """对象存储组件接入配置(Application 层)。
251
272
 
@@ -779,6 +800,7 @@ class BaseConfig(BaseSettings):
779
800
  # ========== 数据与缓存 ==========
780
801
  database: DatabaseSettings = Field(default_factory=DatabaseSettings)
781
802
  cache: CacheSettings = Field(default_factory=CacheSettings)
803
+ channel: ChannelSettings = Field(default_factory=ChannelSettings)
782
804
  storage: StorageSettings = Field(default_factory=StorageSettings)
783
805
 
784
806
  # 迁移配置
@@ -879,10 +901,18 @@ class BaseConfig(BaseSettings):
879
901
  """获取所有通道实例配置。
880
902
 
881
903
  从环境变量解析 CHANNEL__{INSTANCE}__{FIELD} 格式的配置。
904
+ 如果没有配置多实例,返回从单实例配置转换的 default 实例。
882
905
  """
883
906
  if self._channels is None:
884
907
  loader = MultiInstanceConfigLoader("CHANNEL", ChannelInstanceConfig)
885
908
  self._channels = loader.load()
909
+ if not self._channels and self.channel.backend:
910
+ self._channels = {
911
+ "default": ChannelInstanceConfig(
912
+ backend=self.channel.backend,
913
+ url=self.channel.url,
914
+ )
915
+ }
886
916
  return self._channels
887
917
 
888
918
  def get_mqs(self) -> dict[str, MQInstanceConfig]:
@@ -929,6 +959,7 @@ __all__ = [
929
959
  "CacheInstanceConfig",
930
960
  "CacheSettings",
931
961
  "ChannelInstanceConfig",
962
+ "ChannelSettings",
932
963
  "DatabaseInstanceConfig",
933
964
  "DatabaseSettings",
934
965
  "EventInstanceConfig",
@@ -75,6 +75,8 @@ mypy {package_name}/
75
75
  2. **[aury_docs/02-repository.md](./aury_docs/02-repository.md)** - Repository 使用
76
76
  - BaseRepository API
77
77
  - Filters 语法(__gt, __like 等)
78
+ - Cursor 分页(推荐,性能更优)
79
+ - 流式查询(大数据处理)
78
80
  - 自动提交机制
79
81
 
80
82
  3. **[aury_docs/03-service.md](./aury_docs/03-service.md)** - Service 编写与事务
@@ -72,6 +72,37 @@ result = await repo.paginate(
72
72
  # - result.has_next: bool # 是否有下一页
73
73
  # - result.has_prev: bool # 是否有上一页
74
74
 
75
+ # === Cursor 分页(推荐,性能更优) ===
76
+ from aury.boot.domain.pagination import CursorPaginationParams
77
+
78
+ # 第一页
79
+ result = await repo.cursor_paginate(
80
+ CursorPaginationParams(limit=20),
81
+ is_active=True,
82
+ )
83
+
84
+ # 下一页(带上 cursor)
85
+ result = await repo.cursor_paginate(
86
+ CursorPaginationParams(cursor=result.next_cursor, limit=20),
87
+ is_active=True,
88
+ )
89
+
90
+ # CursorPaginationResult 结构:
91
+ # - result.items: list[T] # 数据列表
92
+ # - result.next_cursor: str | None # 下一页游标
93
+ # - result.prev_cursor: str | None # 上一页游标
94
+ # - result.has_next: bool # 是否有下一页
95
+ # - result.has_prev: bool # 是否有上一页
96
+
97
+ # === 流式查询(大数据处理) ===
98
+ # 逐条流式处理,不会一次性加载到内存
99
+ async for user in repo.stream(batch_size=1000, is_active=True):
100
+ await process(user)
101
+
102
+ # 批量流式处理
103
+ async for batch in repo.stream_batches(batch_size=1000):
104
+ await bulk_sync_to_es(batch)
105
+
75
106
  # === 创建 ===
76
107
  user = await repo.create({{"name": "Alice", "email": "a@b.com"}})
77
108
  users = await repo.batch_create([{{"name": "A"}}, {{"name": "B"}}]) # 返回实体
@@ -139,12 +139,14 @@ Redis 后端使用 Redis 原生 `PSUBSCRIBE`,内存后端使用 `fnmatch` 实
139
139
  ## 13.5 环境变量
140
140
 
141
141
  ```bash
142
- # 默认实例
142
+ # 单实例配置
143
143
  CHANNEL__BACKEND=memory
144
+ # 或 Redis 后端
145
+ CHANNEL__BACKEND=redis
146
+ CHANNEL__URL=redis://localhost:6379/3
144
147
 
145
- # 多实例(格式:CHANNEL__{{INSTANCE}}__{{FIELD}})
146
- CHANNEL__DEFAULT__BACKEND=redis
147
- CHANNEL__DEFAULT__URL=redis://localhost:6379/3
148
- CHANNEL__NOTIFICATIONS__BACKEND=redis
149
- CHANNEL__NOTIFICATIONS__URL=redis://localhost:6379/4
148
+ # 多实例配置(格式:CHANNEL__{{INSTANCE}}__{{FIELD}})
149
+ CHANNEL__SSE__BACKEND=memory
150
+ CHANNEL__NOTIFICATION__BACKEND=redis
151
+ CHANNEL__NOTIFICATION__URL=redis://localhost:6379/4
150
152
  ```
@@ -2,12 +2,15 @@
2
2
  # =============================================================================
3
3
  # 流式通道配置 (CHANNEL__) - SSE/实时通信
4
4
  # =============================================================================
5
+ # 单实例配置:
6
+ # CHANNEL__BACKEND=memory
7
+ # CHANNEL__BACKEND=redis
8
+ # CHANNEL__URL=redis://localhost:6379/3
9
+ #
5
10
  # 多实例配置 (格式: CHANNEL__{{INSTANCE}}__{{FIELD}}):
6
- # CHANNEL__DEFAULT__BACKEND=memory
7
- # CHANNEL__SHARED__BACKEND=redis
8
- # CHANNEL__SHARED__URL=redis://localhost:6379/3
9
- # CHANNEL__SHARED__KEY_PREFIX=channel:
10
- # CHANNEL__SHARED__TTL=86400
11
+ # CHANNEL__SSE__BACKEND=memory
12
+ # CHANNEL__NOTIFICATION__BACKEND=redis
13
+ # CHANNEL__NOTIFICATION__URL=redis://localhost:6379/3
11
14
 
12
15
  # =============================================================================
13
16
  # 消息队列配置 (MQ__)
@@ -18,6 +18,8 @@ from aury.boot.common.logging import logger
18
18
  from aury.boot.domain.exceptions import VersionConflictError
19
19
  from aury.boot.domain.models import GUID, Base
20
20
  from aury.boot.domain.pagination import (
21
+ CursorPaginationParams,
22
+ CursorPaginationResult,
21
23
  PaginationParams,
22
24
  PaginationResult,
23
25
  SortParams,
@@ -263,6 +265,168 @@ class BaseRepository[ModelType: Base](IRepository[ModelType]):
263
265
  pagination_params=pagination_params,
264
266
  )
265
267
 
268
+ async def cursor_paginate(
269
+ self,
270
+ params: CursorPaginationParams,
271
+ cursor_field: str = "id",
272
+ **filters
273
+ ) -> CursorPaginationResult[ModelType]:
274
+ """基于游标的分页查询。
275
+
276
+ 适用于无限滚动、大数据集等场景,性能优于 offset 分页。
277
+
278
+ Args:
279
+ params: 游标分页参数(cursor, limit, direction)
280
+ cursor_field: 游标字段名,默认 "id",必须是有序且唯一的字段
281
+ **filters: 过滤条件
282
+
283
+ Returns:
284
+ CursorPaginationResult: 包含 items, next_cursor, prev_cursor, has_next, has_prev
285
+
286
+ 示例:
287
+ # 第一页
288
+ result = await repo.cursor_paginate(
289
+ CursorPaginationParams(limit=20),
290
+ status="active"
291
+ )
292
+
293
+ # 下一页
294
+ result = await repo.cursor_paginate(
295
+ CursorPaginationParams(cursor=result.next_cursor, limit=20),
296
+ status="active"
297
+ )
298
+ """
299
+ import base64
300
+ import json
301
+
302
+ query = self._build_base_query()
303
+ query = self._apply_filters(query, **filters)
304
+
305
+ cursor_attr = _get_model_attr(self._model_class, cursor_field)
306
+ if cursor_attr is None:
307
+ raise AttributeError(f"模型 {self._model_class.__name__} 没有 '{cursor_field}' 字段")
308
+
309
+ # 解码 cursor
310
+ cursor_value = None
311
+ if params.cursor:
312
+ try:
313
+ decoded = base64.urlsafe_b64decode(params.cursor.encode()).decode()
314
+ cursor_value = json.loads(decoded)
315
+ except Exception:
316
+ raise ValueError("无效的游标") from None
317
+
318
+ # 根据方向决定查询条件和排序
319
+ is_next = params.direction == "next"
320
+ if cursor_value is not None:
321
+ if is_next:
322
+ query = query.where(cursor_attr > cursor_value)
323
+ else:
324
+ query = query.where(cursor_attr < cursor_value)
325
+
326
+ # 排序
327
+ if is_next:
328
+ query = query.order_by(cursor_attr)
329
+ else:
330
+ query = query.order_by(cursor_attr.desc())
331
+
332
+ # 多取一条判断是否有更多
333
+ query = query.limit(params.limit + 1)
334
+ result = await self._session.execute(query)
335
+ items = list(result.scalars().all())
336
+
337
+ has_more = len(items) > params.limit
338
+ if has_more:
339
+ items = items[:params.limit]
340
+
341
+ # 反向查询时反转结果
342
+ if not is_next:
343
+ items = list(reversed(items))
344
+
345
+ # 生成游标
346
+ def encode_cursor(value) -> str:
347
+ return base64.urlsafe_b64encode(json.dumps(value).encode()).decode()
348
+
349
+ next_cursor = None
350
+ prev_cursor = None
351
+
352
+ if items:
353
+ last_value = getattr(items[-1], cursor_field)
354
+ first_value = getattr(items[0], cursor_field)
355
+
356
+ if is_next:
357
+ if has_more:
358
+ next_cursor = encode_cursor(last_value)
359
+ if cursor_value is not None:
360
+ prev_cursor = encode_cursor(first_value)
361
+ else:
362
+ if cursor_value is not None:
363
+ next_cursor = encode_cursor(last_value)
364
+ if has_more:
365
+ prev_cursor = encode_cursor(first_value)
366
+
367
+ return CursorPaginationResult.create(
368
+ items=items,
369
+ next_cursor=next_cursor,
370
+ prev_cursor=prev_cursor,
371
+ limit=params.limit,
372
+ )
373
+
374
+ async def stream(
375
+ self,
376
+ batch_size: int = 1000,
377
+ **filters
378
+ ):
379
+ """流式查询,使用数据库原生 server-side cursor。
380
+
381
+ 适用于大数据集处理,避免一次性加载所有数据到内存。
382
+
383
+ Args:
384
+ batch_size: 每批次获取的记录数,默认 1000
385
+ **filters: 过滤条件
386
+
387
+ Yields:
388
+ ModelType: 模型实例
389
+
390
+ 示例:
391
+ async for user in repo.stream(batch_size=500, status="active"):
392
+ process(user)
393
+ """
394
+ query = self._build_base_query()
395
+ query = self._apply_filters(query, **filters)
396
+
397
+ async with self._session.stream_scalars(
398
+ query.execution_options(yield_per=batch_size)
399
+ ) as result:
400
+ async for item in result:
401
+ yield item
402
+
403
+ async def stream_batches(
404
+ self,
405
+ batch_size: int = 1000,
406
+ **filters
407
+ ):
408
+ """批量流式查询,每次返回一批数据。
409
+
410
+ Args:
411
+ batch_size: 每批次的记录数,默认 1000
412
+ **filters: 过滤条件
413
+
414
+ Yields:
415
+ list[ModelType]: 一批模型实例
416
+
417
+ 示例:
418
+ async for batch in repo.stream_batches(batch_size=500):
419
+ bulk_process(batch)
420
+ """
421
+ query = self._build_base_query()
422
+ query = self._apply_filters(query, **filters)
423
+
424
+ async with self._session.stream_scalars(
425
+ query.execution_options(yield_per=batch_size)
426
+ ) as result:
427
+ async for partition in result.partitions():
428
+ yield list(partition)
429
+
266
430
  async def count(self, **filters) -> int:
267
431
  query = select(func.count()).select_from(self._model_class)
268
432
  if hasattr(self._model_class, "deleted_at"):
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: aury-boot
3
- Version: 0.0.26
3
+ Version: 0.0.28
4
4
  Summary: Aury Boot - 基于 FastAPI 生态的企业级 API 开发框架
5
5
  Requires-Python: >=3.13
6
6
  Requires-Dist: alembic>=1.17.2
@@ -1,5 +1,5 @@
1
1
  aury/boot/__init__.py,sha256=pCno-EInnpIBa1OtxNYF-JWf9j95Cd2h6vmu0xqa_-4,1791
2
- aury/boot/_version.py,sha256=Fnf259POysYSI-aH6DhnxuHUxCVOFWsQLs4I5Ur_KMA,706
2
+ aury/boot/_version.py,sha256=rsZxmANBVfE-nN63y-ZZ_71Lkm6YP4u4TgVEBJV3mNM,706
3
3
  aury/boot/application/__init__.py,sha256=0o_XmiwFCeAu06VHggS8I1e7_nSMoRq0Hcm0fYfCywU,3071
4
4
  aury/boot/application/adapter/__init__.py,sha256=e1bcSb1bxUMfofTwiCuHBZJk5-STkMCWPF2EJXHQ7UU,3976
5
5
  aury/boot/application/adapter/base.py,sha256=Ar_66fiHPDEmV-1DKnqXKwc53p3pozG31bgTJTEUriY,15763
@@ -14,7 +14,7 @@ aury/boot/application/app/middlewares.py,sha256=BXe2H14FHzJUVpQM6DZUm-zfZRXSXIi1
14
14
  aury/boot/application/app/startup.py,sha256=DHKt3C2G7V5XfFr1SQMl14tNzcuDd9MqUVAxi274HDQ,7873
15
15
  aury/boot/application/config/__init__.py,sha256=Dd-myRSBCM18DXXsi863h0cJG5VFrI10xMRtjnvelGo,1894
16
16
  aury/boot/application/config/multi_instance.py,sha256=RXSp-xP8-bKMDEhq3SeL7T3lS8-vpRlvBEVBuZVjVK4,6475
17
- aury/boot/application/config/settings.py,sha256=o0SAwEpFqoHE7zB3lYyaSCm0cX2NZnTVqUWiSJ-Qdtk,30576
17
+ aury/boot/application/config/settings.py,sha256=-afn5p9rIS4_63OLqfG-mrTl2UergOZb6z8I5GyYOAY,31621
18
18
  aury/boot/application/constants/__init__.py,sha256=DCXs13_VVaQWHqO-qpJoZwRd7HIexiirtw_nu8msTXE,340
19
19
  aury/boot/application/constants/components.py,sha256=VBCgxJ_iZXjEZyUkC13ZCdqPmdKq-lQmU7jQpXnTa2Y,1056
20
20
  aury/boot/application/constants/scheduler.py,sha256=S77FBIvHlyruvlabRWZJ2J1YAs2xWXPQI2yuGdGUDNA,471
@@ -61,7 +61,7 @@ aury/boot/commands/templates/generate/model.py.tpl,sha256=knFwMyGZ7wMpzH4_bQD_V1
61
61
  aury/boot/commands/templates/generate/repository.py.tpl,sha256=xoEg6lPAaLIRDeFy4I0FBsPPVLSy91h6xosAlaCL_mM,590
62
62
  aury/boot/commands/templates/generate/schema.py.tpl,sha256=HIaY5B0UG_S188nQLrZDEJ0q73WPdb7BmCdc0tseZA4,545
63
63
  aury/boot/commands/templates/generate/service.py.tpl,sha256=2hwQ8e4a5d_bIMx_jGDobdmKPMFLBlfQrQVQH4Ym5k4,1842
64
- aury/boot/commands/templates/project/AGENTS.md.tpl,sha256=AzjUt98ojms1CSUT1kNzCNLZFLBW5BGXpSwm0yJzYeI,7797
64
+ aury/boot/commands/templates/project/AGENTS.md.tpl,sha256=-KrVhPqwVaf1IWRIl4L9Yb0LSRihq69ZaZ-ynnGM4W8,7882
65
65
  aury/boot/commands/templates/project/README.md.tpl,sha256=oCeBiukk6Pa3hrCKybkfM2sIRHsPZ15nlwuFTUSFDwY,2459
66
66
  aury/boot/commands/templates/project/admin_console_init.py.tpl,sha256=K81L14thyEhRA8lFCQJVZL_NU22-sBz0xS68MJPeoCo,1541
67
67
  aury/boot/commands/templates/project/config.py.tpl,sha256=H_B05FypBJxTjb7qIL91zC1C9e37Pk7C9gO0-b3CqNs,1009
@@ -70,7 +70,7 @@ aury/boot/commands/templates/project/gitignore.tpl,sha256=OI0nt9u2E9EC-jAMoh3gpq
70
70
  aury/boot/commands/templates/project/main.py.tpl,sha256=Q61ve3o1VkNPv8wcQK7lUosne18JWYeItxoXVNNoYJM,1070
71
71
  aury/boot/commands/templates/project/aury_docs/00-overview.md.tpl,sha256=8Aept3yEAe9cVdRvkddr_oEF-lr2riPXYRzBuw_6DBA,2138
72
72
  aury/boot/commands/templates/project/aury_docs/01-model.md.tpl,sha256=1mQ3hGDxqEZjev4CD5-3dzYRFVonPNcAaStI1UBEUyM,6811
73
- aury/boot/commands/templates/project/aury_docs/02-repository.md.tpl,sha256=yfKPYZ7x74BEF7wFp9u3S7xKr4Ld9MqXOItGZo5NM9Q,6819
73
+ aury/boot/commands/templates/project/aury_docs/02-repository.md.tpl,sha256=JfUVdrIgW7_J6JGCcB-_uP_x-gCtjKiewwGv4Xr44QI,7803
74
74
  aury/boot/commands/templates/project/aury_docs/03-service.md.tpl,sha256=Dg_8RGSeRmmyQrhhpppEoxl-6C5pNe9M2OzVOl1kjSk,13102
75
75
  aury/boot/commands/templates/project/aury_docs/04-schema.md.tpl,sha256=ZwwKhUbLI--PEEmwnuo2fIZrhCEZagBN6fRNDTFCnNk,2891
76
76
  aury/boot/commands/templates/project/aury_docs/05-api.md.tpl,sha256=oPzda3V6ZPDDEW-5MwyzmsMRuu5mXrsRGEq3lj0M-58,2997
@@ -81,7 +81,7 @@ aury/boot/commands/templates/project/aury_docs/09-tasks.md.tpl,sha256=swHOQ_pWPt
81
81
  aury/boot/commands/templates/project/aury_docs/10-storage.md.tpl,sha256=mhe0j0S51ndPJLjaQ6yD8OPYBEO02NHumJVbBvz2qkw,4320
82
82
  aury/boot/commands/templates/project/aury_docs/11-logging.md.tpl,sha256=bwxFCGQsO9cTEbwqJF1xcjsZKP82HRWhIMRUS0c9_ZI,2435
83
83
  aury/boot/commands/templates/project/aury_docs/12-admin.md.tpl,sha256=6z3mN54qP2jtpTFOJBLVexvEv0ZHXYKjncvpZG4yOdw,1883
84
- aury/boot/commands/templates/project/aury_docs/13-channel.md.tpl,sha256=Zw01FNabA2kP2G8jDcjZg-CLndyiMpVYxQzTq8ruLmU,4406
84
+ aury/boot/commands/templates/project/aury_docs/13-channel.md.tpl,sha256=aGpf2phQBMRs6Uh1DfjNl06pC_niea91Sm8sTq_NFec,4443
85
85
  aury/boot/commands/templates/project/aury_docs/14-mq.md.tpl,sha256=4bxLQBbCi0Fue0VQWOPt6acZ5P00BoLkCoLPQe_8k4U,2396
86
86
  aury/boot/commands/templates/project/aury_docs/15-events.md.tpl,sha256=a4wQRgVPuYUGTGmw_lX1HJH_yFTbD30mBz7Arc4zgfs,3361
87
87
  aury/boot/commands/templates/project/aury_docs/16-adapter.md.tpl,sha256=pkmJkZw2Ca6_uYk2jZvAb8DozjBa2tWq_t3gtq1lFSk,11456
@@ -91,7 +91,7 @@ aury/boot/commands/templates/project/env_templates/admin.tpl,sha256=wWt3iybOpBHt
91
91
  aury/boot/commands/templates/project/env_templates/cache.tpl,sha256=_sK-p_FECj4mVvggNvgb4Wu0yGii0Ocz560syG7DU2c,498
92
92
  aury/boot/commands/templates/project/env_templates/database.tpl,sha256=2lWzTKt4X0SpeBBCkrDV90Di4EfoAuqYzhVsh74vTUI,907
93
93
  aury/boot/commands/templates/project/env_templates/log.tpl,sha256=x5rkrEFJISH0gaCcr-wTCbDYtyFnlLNJpY789fqjZgc,754
94
- aury/boot/commands/templates/project/env_templates/messaging.tpl,sha256=ICRLGw2FtJ0bNtkHnpy0CFyILqxOfFLbfejdFLJuuo8,1719
94
+ aury/boot/commands/templates/project/env_templates/messaging.tpl,sha256=ZaNBM4pq0pgkTXbCBx_sgjm8QKEBfW1nSnsKZfHu-HM,1771
95
95
  aury/boot/commands/templates/project/env_templates/rpc.tpl,sha256=FhweCFakawGLSs01a_BkmZo11UhWax2-VCBudHj68WA,1163
96
96
  aury/boot/commands/templates/project/env_templates/scheduler.tpl,sha256=c8Grcs1rgBB58RHlxqmDMPHQl8BnbcqNW473ctmsojU,752
97
97
  aury/boot/commands/templates/project/env_templates/service.tpl,sha256=b-a2GyRyoaunbDj_2kaSw3OFxcugscmPvUBG7w0XO8c,710
@@ -124,7 +124,7 @@ aury/boot/domain/models/mixins.py,sha256=7s4m4fzt0vWX71aTHgsoagjxSZZZ4_xSea_m0D8
124
124
  aury/boot/domain/models/models.py,sha256=hNze58wPZkZ8QG2_pyszDsyKNjz2UgiRDzmneiCWLQs,2728
125
125
  aury/boot/domain/pagination/__init__.py,sha256=HSU_NyLP-ij7ZDUi-ARSSvNkvhW1_wON2Zvu2QlF6HM,11890
126
126
  aury/boot/domain/repository/__init__.py,sha256=dnmN8xFu1ASbLnzL6vx8gMoch7xBGxkJkxs9G1iGLGg,490
127
- aury/boot/domain/repository/impl.py,sha256=CKpCJhgPg5uh3D2h7PVDApM9aT3sk6NNfn5hvP8CEQM,16552
127
+ aury/boot/domain/repository/impl.py,sha256=BeWe6pMBP_OvxX91FmckxAZlM2qejol06If_UBy8FtU,22016
128
128
  aury/boot/domain/repository/interceptors.py,sha256=SCTjRmBYwevAMlJ8U1uw-_McsDetNNQ7q0Da5lmfj_E,1238
129
129
  aury/boot/domain/repository/interface.py,sha256=CmkiqVhhHPx_xcpuBCz11Vr26-govwYBxFsQ8myEVyw,2904
130
130
  aury/boot/domain/repository/query_builder.py,sha256=pFErMzsBql-T6gBX0S4FxIheCkNaGjpSewzcJ2DxrUU,10890
@@ -192,7 +192,7 @@ aury/boot/testing/client.py,sha256=KOg1EemuIVsBG68G5y0DjSxZGcIQVdWQ4ASaHE3o1R0,4
192
192
  aury/boot/testing/factory.py,sha256=8GvwX9qIDu0L65gzJMlrWB0xbmJ-7zPHuwk3eECULcg,5185
193
193
  aury/boot/toolkit/__init__.py,sha256=AcyVb9fDf3CaEmJPNkWC4iGv32qCPyk4BuFKSuNiJRQ,334
194
194
  aury/boot/toolkit/http/__init__.py,sha256=zIPmpIZ9Qbqe25VmEr7jixoY2fkRbLm7NkCB9vKpg6I,11039
195
- aury_boot-0.0.26.dist-info/METADATA,sha256=2M3n6KMCpEnC-1qSDg-b2nvlGwh86HGw15XfljGC2mo,7695
196
- aury_boot-0.0.26.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
197
- aury_boot-0.0.26.dist-info/entry_points.txt,sha256=f9KXEkDIGc0BGkgBvsNx_HMz9VhDjNxu26q00jUpDwQ,49
198
- aury_boot-0.0.26.dist-info/RECORD,,
195
+ aury_boot-0.0.28.dist-info/METADATA,sha256=7fabDsArEBQ_L5MoamQPJa9xmdi19-CLTSGG5YgPQPw,7695
196
+ aury_boot-0.0.28.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
197
+ aury_boot-0.0.28.dist-info/entry_points.txt,sha256=f9KXEkDIGc0BGkgBvsNx_HMz9VhDjNxu26q00jUpDwQ,49
198
+ aury_boot-0.0.28.dist-info/RECORD,,