sincpro-framework 3.24.2__tar.gz → 3.26.0__tar.gz

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.
Files changed (569) hide show
  1. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/PKG-INFO +2 -2
  2. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/pyproject.toml +2 -2
  3. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/__init__.py +7 -0
  4. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/auth/domain/exceptions.py +13 -0
  5. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/common/failures/__init__.py +20 -1
  6. sincpro_framework-3.26.0/sincpro_framework/common/failures/problem.py +288 -0
  7. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/context/domain/keys.py +3 -0
  8. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/object_storage/__init__.py +14 -2
  9. sincpro_framework-3.26.0/sincpro_framework/data_layer/object_storage/adapters/http_source.py +172 -0
  10. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/object_storage/adapters/local.py +30 -5
  11. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/object_storage/adapters/s3_compatible.py +46 -21
  12. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/object_storage/domain/exceptions.py +32 -1
  13. sincpro_framework-3.26.0/sincpro_framework/data_layer/object_storage/domain/fetch.py +18 -0
  14. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/object_storage/domain/object_store.py +63 -7
  15. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/object_storage/entrypoint/object_storage.py +72 -9
  16. sincpro_framework-3.26.0/sincpro_framework/data_layer/object_storage/services/__init__.py +3 -0
  17. sincpro_framework-3.26.0/sincpro_framework/data_layer/object_storage/services/contents.py +88 -0
  18. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/object_storage/services/objects.py +15 -69
  19. sincpro_framework-3.26.0/sincpro_framework/data_layer/object_storage/services/transfers.py +159 -0
  20. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/orm/sqlalchemy/domain/custom_fields.py +11 -8
  21. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/orm/sqlalchemy/services/model_introspection.py +6 -4
  22. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/ddd/__init__.py +13 -2
  23. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/ddd/entity/__init__.py +1 -3
  24. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/ddd/entity/entity.py +9 -7
  25. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/ddd/entity/entity_meta.py +21 -26
  26. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/ddd/exceptions.py +11 -0
  27. sincpro_framework-3.26.0/sincpro_framework/ddd/exchange_rates.py +58 -0
  28. sincpro_framework-3.26.0/sincpro_framework/ddd/iso_4217.py +46 -0
  29. sincpro_framework-3.26.0/sincpro_framework/ddd/money.py +504 -0
  30. sincpro_framework-3.26.0/sincpro_framework/ddd/multi_currency.py +253 -0
  31. sincpro_framework-3.26.0/sincpro_framework/ddd/multi_language.py +137 -0
  32. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/ddd/query.py +69 -16
  33. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/entrypoints/__init__.py +7 -0
  34. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/entrypoints/adapters/fastapi/problems.py +54 -147
  35. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/entrypoints/adapters/fastapi/wire.py +28 -8
  36. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/entrypoints/adapters/grpc/wire.py +10 -27
  37. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/entrypoints/adapters/mcp/__init__.py +1 -1
  38. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/entrypoints/adapters/mcp/mcp.py +60 -10
  39. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/entrypoints/adapters/rest/routing.py +17 -45
  40. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/entrypoints/adapters/rest/serving.py +27 -9
  41. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/entrypoints/adapters/rpc/errors.py +49 -42
  42. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/entrypoints/adapters/rpc/serving.py +38 -7
  43. sincpro_framework-3.26.0/sincpro_framework/entrypoints/domain/exceptions.py +29 -0
  44. sincpro_framework-3.26.0/sincpro_framework/entrypoints/domain/readiness.py +38 -0
  45. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/entrypoints/entrypoint/fastapi.py +8 -4
  46. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/entrypoints/entrypoint/grpc.py +8 -5
  47. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/entrypoints/entrypoint/mcp.py +2 -2
  48. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/entrypoints/entrypoint/rest.py +6 -2
  49. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/entrypoints/entrypoint/rpc.py +21 -9
  50. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/entrypoints/services/gateway.py +9 -2
  51. sincpro_framework-3.26.0/sincpro_framework/entrypoints/services/readiness.py +148 -0
  52. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/observability/field_paths.py +15 -3
  53. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/observability/metrics/entrypoint/facade.py +8 -6
  54. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/runtime/testing/__init__.py +3 -1
  55. sincpro_framework-3.26.0/sincpro_framework/runtime/testing/contracts/exchange_rates.py +52 -0
  56. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/runtime/testing/contracts/object_store.py +20 -1
  57. sincpro_framework-3.24.2/sincpro_framework/data_layer/object_storage/services/__init__.py +0 -2
  58. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/LICENSE.md +0 -0
  59. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/README.md +0 -0
  60. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/aio/__init__.py +0 -0
  61. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/aio/bus.py +0 -0
  62. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/aio/bus.pyi +0 -0
  63. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/auth/__init__.py +0 -0
  64. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/auth/adapters/__init__.py +0 -0
  65. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/auth/adapters/api_key_provider.py +0 -0
  66. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/auth/adapters/role_permissions.py +0 -0
  67. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/auth/adapters/service_token_provider.py +0 -0
  68. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/auth/adapters/static_provider.py +0 -0
  69. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/auth/domain/__init__.py +0 -0
  70. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/auth/domain/identity.py +0 -0
  71. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/auth/domain/permissions.py +0 -0
  72. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/auth/domain/provider.py +0 -0
  73. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/auth/entrypoint/__init__.py +0 -0
  74. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/auth/entrypoint/access_control.py +0 -0
  75. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/auth/entrypoint/asgi.py +0 -0
  76. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/auth/entrypoint/security.py +0 -0
  77. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/auth/infrastructure/__init__.py +0 -0
  78. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/auth/infrastructure/security_context.py +0 -0
  79. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/auth/services/__init__.py +0 -0
  80. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/auth/services/guard.py +0 -0
  81. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/bus.py +0 -0
  82. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/bus.pyi +0 -0
  83. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/bus_pipeline/__init__.py +0 -0
  84. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/bus_pipeline/events.py +0 -0
  85. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/bus_pipeline/incomes/__init__.py +0 -0
  86. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/bus_pipeline/incomes/events.py +0 -0
  87. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/bus_pipeline/incomes/incomes.py +0 -0
  88. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/bus_pipeline/incomes/listeners.py +0 -0
  89. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/bus_pipeline/incomes/mixins/__init__.py +0 -0
  90. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/bus_pipeline/incomes/mixins/bus_incomes.py +0 -0
  91. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/bus_pipeline/interceptors/__init__.py +0 -0
  92. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/bus_pipeline/interceptors/interceptor.py +0 -0
  93. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/bus_pipeline/interceptors/mixins/__init__.py +0 -0
  94. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/bus_pipeline/interceptors/mixins/bus_interceptors.py +0 -0
  95. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/bus_pipeline/listeners.py +0 -0
  96. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/bus_pipeline/outcomes/__init__.py +0 -0
  97. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/bus_pipeline/outcomes/events.py +0 -0
  98. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/bus_pipeline/outcomes/listeners.py +0 -0
  99. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/bus_pipeline/outcomes/mixins/__init__.py +0 -0
  100. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/bus_pipeline/outcomes/mixins/bus_outcomes.py +0 -0
  101. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/bus_pipeline/outcomes/outcomes.py +0 -0
  102. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/circuit_breaker/__init__.py +0 -0
  103. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/circuit_breaker/circuit_breaker.py +0 -0
  104. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/common/__init__.py +0 -0
  105. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/common/aws/__init__.py +0 -0
  106. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/common/aws/clients.py +0 -0
  107. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/common/failures/classification.py +0 -0
  108. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/common/ids/__init__.py +0 -0
  109. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/common/ids/uuid7.py +0 -0
  110. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/common/naming/__init__.py +0 -0
  111. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/common/naming/case.py +0 -0
  112. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/common/naming/registered_name.py +0 -0
  113. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/common/ordering/__init__.py +0 -0
  114. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/common/ordering/placement.py +0 -0
  115. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/common/reads/__init__.py +0 -0
  116. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/common/reads/noting.py +0 -0
  117. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/common/serialization/__init__.py +0 -0
  118. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/common/serialization/values.py +0 -0
  119. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/common/transport/__init__.py +0 -0
  120. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/common/transport/grpc.py +0 -0
  121. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/conf/sincpro_framework_conf.yml +0 -0
  122. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/context/__init__.py +0 -0
  123. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/context/adapters/__init__.py +0 -0
  124. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/context/adapters/codecs.py +0 -0
  125. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/context/adapters/entries.py +0 -0
  126. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/context/adapters/propagation.py +0 -0
  127. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/context/adapters/stores.py +0 -0
  128. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/context/domain/__init__.py +0 -0
  129. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/context/domain/codec.py +0 -0
  130. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/context/domain/drafts.py +0 -0
  131. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/context/domain/exceptions.py +0 -0
  132. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/context/domain/execution.py +0 -0
  133. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/context/domain/level.py +0 -0
  134. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/context/domain/node.py +0 -0
  135. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/context/domain/owner.py +0 -0
  136. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/context/domain/providers.py +0 -0
  137. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/context/domain/sessions.py +0 -0
  138. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/context/domain/store.py +0 -0
  139. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/context/domain/travel.py +0 -0
  140. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/context/entrypoint/__init__.py +0 -0
  141. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/context/entrypoint/bus.py +0 -0
  142. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/context/entrypoint/bus_context.py +0 -0
  143. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/context/entrypoint/bus_store.py +0 -0
  144. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/context/entrypoint/executions.py +0 -0
  145. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/context/entrypoint/facade.py +0 -0
  146. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/context/entrypoint/propagation.py +0 -0
  147. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/context/entrypoint/providers.py +0 -0
  148. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/context/entrypoint/resolution.py +0 -0
  149. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/context/entrypoint/scopes.py +0 -0
  150. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/context/entrypoint/threads.py +0 -0
  151. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/context/infrastructure/__init__.py +0 -0
  152. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/context/infrastructure/closed_scopes.py +0 -0
  153. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/context/infrastructure/distributed.py +0 -0
  154. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/context/infrastructure/outage.py +0 -0
  155. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/context/infrastructure/shared.py +0 -0
  156. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/context/infrastructure/travel.py +0 -0
  157. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/context/infrastructure/tree.py +0 -0
  158. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/context/services/__init__.py +0 -0
  159. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/context/services/drafts.py +0 -0
  160. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/context/services/executions.py +0 -0
  161. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/context/services/nodes.py +0 -0
  162. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/context/services/propagation.py +0 -0
  163. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/context/services/providers.py +0 -0
  164. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/context/services/sessions.py +0 -0
  165. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/__init__.py +0 -0
  166. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/caching/__init__.py +0 -0
  167. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/caching/adapters/__init__.py +0 -0
  168. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/caching/adapters/eviction.py +0 -0
  169. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/caching/adapters/json_codec.py +0 -0
  170. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/caching/adapters/key_value_records.py +0 -0
  171. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/caching/adapters/keys.py +0 -0
  172. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/caching/adapters/observers.py +0 -0
  173. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/caching/domain/__init__.py +0 -0
  174. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/caching/domain/codec.py +0 -0
  175. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/caching/domain/eviction.py +0 -0
  176. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/caching/domain/exceptions.py +0 -0
  177. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/caching/domain/failure.py +0 -0
  178. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/caching/domain/freshness.py +0 -0
  179. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/caching/domain/idempotency_records.py +0 -0
  180. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/caching/domain/idempotent_command.py +0 -0
  181. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/caching/domain/observer.py +0 -0
  182. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/caching/domain/policies.py +0 -0
  183. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/caching/domain/validation.py +0 -0
  184. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/caching/entrypoint/__init__.py +0 -0
  185. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/caching/entrypoint/bus_caching.py +0 -0
  186. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/caching/entrypoint/facades.py +0 -0
  187. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/caching/infrastructure/__init__.py +0 -0
  188. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/caching/infrastructure/clock.py +0 -0
  189. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/caching/infrastructure/flight.py +0 -0
  190. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/caching/services/__init__.py +0 -0
  191. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/caching/services/cache.py +0 -0
  192. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/caching/services/idempotency.py +0 -0
  193. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/caching/services/query_caching.py +0 -0
  194. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/data_analysis/__init__.py +0 -0
  195. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/data_analysis/arrow.py +0 -0
  196. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/data_analysis/cache.py +0 -0
  197. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/data_analysis/frame.py +0 -0
  198. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/exceptions.py +0 -0
  199. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/migrations/__init__.py +0 -0
  200. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/migrations/adapters/__init__.py +0 -0
  201. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/migrations/adapters/in_memory.py +0 -0
  202. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/migrations/adapters/manifest.py +0 -0
  203. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/migrations/domain/__init__.py +0 -0
  204. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/migrations/domain/context_migrations.py +0 -0
  205. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/migrations/domain/engine.py +0 -0
  206. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/migrations/domain/exceptions.py +0 -0
  207. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/migrations/domain/status.py +0 -0
  208. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/migrations/domain/step.py +0 -0
  209. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/migrations/entrypoint/__init__.py +0 -0
  210. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/migrations/entrypoint/command_line.py +0 -0
  211. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/migrations/entrypoint/orchestrator.py +0 -0
  212. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/migrations/infrastructure/__init__.py +0 -0
  213. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/migrations/infrastructure/step_ids.py +0 -0
  214. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/migrations/services/__init__.py +0 -0
  215. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/migrations/services/authoring.py +0 -0
  216. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/migrations/services/moves.py +0 -0
  217. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/migrations/services/system.py +0 -0
  218. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/migrations/services/timeline.py +0 -0
  219. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/object_storage/adapters/__init__.py +0 -0
  220. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/object_storage/adapters/in_memory.py +0 -0
  221. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/object_storage/domain/__init__.py +0 -0
  222. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/object_storage/domain/publication.py +0 -0
  223. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/object_storage/entrypoint/__init__.py +0 -0
  224. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/object_storage/services/ids.py +0 -0
  225. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/object_storage/services/publications.py +0 -0
  226. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/orm/__init__.py +0 -0
  227. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/orm/sqlalchemy/__init__.py +0 -0
  228. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/orm/sqlalchemy/adapters/__init__.py +0 -0
  229. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/orm/sqlalchemy/adapters/migrations/__init__.py +0 -0
  230. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/orm/sqlalchemy/adapters/migrations/engine.py +0 -0
  231. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/orm/sqlalchemy/adapters/migrations/environment/env.py +0 -0
  232. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/orm/sqlalchemy/adapters/migrations/environment/script.py.mako +0 -0
  233. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/orm/sqlalchemy/adapters/numbering.py +0 -0
  234. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/orm/sqlalchemy/adapters/runtime_use_cases.py +0 -0
  235. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/orm/sqlalchemy/domain/__init__.py +0 -0
  236. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/orm/sqlalchemy/domain/consolidation.py +0 -0
  237. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/orm/sqlalchemy/domain/relations.py +0 -0
  238. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/orm/sqlalchemy/domain/transaction.py +0 -0
  239. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/orm/sqlalchemy/entrypoint/__init__.py +0 -0
  240. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/orm/sqlalchemy/entrypoint/aggregate_repository.py +0 -0
  241. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/orm/sqlalchemy/entrypoint/idempotency_records.py +0 -0
  242. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/orm/sqlalchemy/entrypoint/mapping.py +0 -0
  243. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/orm/sqlalchemy/entrypoint/repository.py +0 -0
  244. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/orm/sqlalchemy/entrypoint/template_table/__init__.py +0 -0
  245. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/orm/sqlalchemy/entrypoint/template_table/archive.py +0 -0
  246. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/orm/sqlalchemy/entrypoint/template_table/audit.py +0 -0
  247. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/orm/sqlalchemy/entrypoint/template_table/entity.py +0 -0
  248. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/orm/sqlalchemy/entrypoint/template_table/events.py +0 -0
  249. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/orm/sqlalchemy/entrypoint/template_table/idempotency.py +0 -0
  250. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/orm/sqlalchemy/entrypoint/template_table/numbering.py +0 -0
  251. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/orm/sqlalchemy/entrypoint/template_table/properties.py +0 -0
  252. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/orm/sqlalchemy/entrypoint/template_table/runtime_use_cases.py +0 -0
  253. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/orm/sqlalchemy/infrastructure/__init__.py +0 -0
  254. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/orm/sqlalchemy/infrastructure/change_tracking.py +0 -0
  255. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/orm/sqlalchemy/infrastructure/database.py +0 -0
  256. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/orm/sqlalchemy/infrastructure/engine_errors.py +0 -0
  257. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/orm/sqlalchemy/infrastructure/flushing.py +0 -0
  258. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/orm/sqlalchemy/infrastructure/in_place_changes.py +0 -0
  259. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/orm/sqlalchemy/infrastructure/mapping_registry.py +0 -0
  260. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/orm/sqlalchemy/infrastructure/observability.py +0 -0
  261. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/orm/sqlalchemy/infrastructure/read_tracking.py +0 -0
  262. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/orm/sqlalchemy/infrastructure/transaction_hooks.py +0 -0
  263. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/orm/sqlalchemy/infrastructure/transaction_opening.py +0 -0
  264. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/orm/sqlalchemy/infrastructure/unit_in_play.py +0 -0
  265. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/orm/sqlalchemy/services/__init__.py +0 -0
  266. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/orm/sqlalchemy/services/aggregation.py +0 -0
  267. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/orm/sqlalchemy/services/cache_invalidation.py +0 -0
  268. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/orm/sqlalchemy/services/cascade.py +0 -0
  269. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/orm/sqlalchemy/services/data_mapper.py +0 -0
  270. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/orm/sqlalchemy/services/event_mapping.py +0 -0
  271. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/orm/sqlalchemy/services/extension_mapping.py +0 -0
  272. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/orm/sqlalchemy/services/extension_typing.py +0 -0
  273. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/orm/sqlalchemy/services/extension_writing.py +0 -0
  274. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/orm/sqlalchemy/services/relation_resolver.py +0 -0
  275. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/orm/sqlalchemy/services/sql_translator.py +0 -0
  276. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/orm/sqlalchemy/services/upsert.py +0 -0
  277. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/orm/sqlalchemy/services/workflows/__init__.py +0 -0
  278. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/orm/sqlalchemy/services/workflows/reading.py +0 -0
  279. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/orm/sqlalchemy/services/workflows/repository_state.py +0 -0
  280. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/orm/sqlalchemy/services/workflows/unit_of_work.py +0 -0
  281. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/orm/sqlalchemy/services/workflows/writing.py +0 -0
  282. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/repositories/__init__.py +0 -0
  283. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/repositories/memory_numbering.py +0 -0
  284. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/repositories/memory_repository.py +0 -0
  285. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/repositories/memory_unit.py +0 -0
  286. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/store/__init__.py +0 -0
  287. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/store/adapters/__init__.py +0 -0
  288. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/store/adapters/dynamodb.py +0 -0
  289. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/store/adapters/in_memory.py +0 -0
  290. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/store/adapters/memcached.py +0 -0
  291. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/store/adapters/redis.py +0 -0
  292. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/store/domain/__init__.py +0 -0
  293. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/store/domain/exceptions.py +0 -0
  294. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/store/domain/key_value.py +0 -0
  295. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/store/domain/lease.py +0 -0
  296. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/store/infrastructure/__init__.py +0 -0
  297. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/store/infrastructure/client.py +0 -0
  298. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/store/services/__init__.py +0 -0
  299. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/store/services/bypass.py +0 -0
  300. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/data_layer/store/services/leases.py +0 -0
  301. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/ddd/criteria/__init__.py +0 -0
  302. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/ddd/criteria/domain/__init__.py +0 -0
  303. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/ddd/criteria/domain/criteria.py +0 -0
  304. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/ddd/criteria/domain/expression.py +0 -0
  305. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/ddd/criteria/domain/grouping.py +0 -0
  306. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/ddd/criteria/domain/pagination.py +0 -0
  307. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/ddd/criteria/domain/resolution.py +0 -0
  308. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/ddd/criteria/domain/sort.py +0 -0
  309. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/ddd/criteria/domain/strict.py +0 -0
  310. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/ddd/criteria/domain/values.py +0 -0
  311. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/ddd/criteria/entrypoint/__init__.py +0 -0
  312. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/ddd/criteria/entrypoint/aggregation.py +0 -0
  313. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/ddd/criteria/entrypoint/evaluation.py +0 -0
  314. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/ddd/criteria/entrypoint/resolution.py +0 -0
  315. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/ddd/criteria/services/__init__.py +0 -0
  316. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/ddd/criteria/services/axes.py +0 -0
  317. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/ddd/criteria/services/comparison.py +0 -0
  318. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/ddd/criteria/services/dynamic_values.py +0 -0
  319. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/ddd/criteria/services/evaluation.py +0 -0
  320. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/ddd/criteria/services/reading.py +0 -0
  321. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/ddd/editing/__init__.py +0 -0
  322. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/ddd/editing/drafts.py +0 -0
  323. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/ddd/editing/editing.py +0 -0
  324. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/ddd/editing/edits.py +0 -0
  325. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/ddd/editing/preview.py +0 -0
  326. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/ddd/entity/computed.py +0 -0
  327. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/ddd/entity/derivations.py +0 -0
  328. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/ddd/entity/entity_collection.py +0 -0
  329. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/ddd/entity/extensions.py +0 -0
  330. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/ddd/entity/mixins/__init__.py +0 -0
  331. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/ddd/entity/mixins/archivable.py +0 -0
  332. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/ddd/entity/mixins/audited.py +0 -0
  333. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/ddd/entity/mixins/event_sourced.py +0 -0
  334. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/ddd/entity/presentation.py +0 -0
  335. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/ddd/entity/relations.py +0 -0
  336. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/ddd/entity/utils/__init__.py +0 -0
  337. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/ddd/entity/utils/annotations.py +0 -0
  338. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/ddd/events/__init__.py +0 -0
  339. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/ddd/events/domain_event.py +0 -0
  340. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/ddd/events/mixins/__init__.py +0 -0
  341. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/ddd/events/mixins/change_tracking.py +0 -0
  342. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/ddd/events/mixins/deliverable.py +0 -0
  343. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/ddd/reads/__init__.py +0 -0
  344. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/ddd/reads/defaults.py +0 -0
  345. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/ddd/reads/reads.py +0 -0
  346. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/ddd/repositories/__init__.py +0 -0
  347. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/ddd/repositories/aggregate_repository.py +0 -0
  348. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/ddd/repositories/capabilities.py +0 -0
  349. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/ddd/repositories/fingerprint.py +0 -0
  350. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/ddd/repositories/hooks.py +0 -0
  351. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/ddd/repositories/mixins/__init__.py +0 -0
  352. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/ddd/repositories/mixins/change_tracking.py +0 -0
  353. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/ddd/repositories/numbering.py +0 -0
  354. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/ddd/repositories/repository.py +0 -0
  355. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/ddd/value_object.py +0 -0
  356. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/dependencies.py +0 -0
  357. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/entrypoints/adapters/__init__.py +0 -0
  358. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/entrypoints/adapters/aws_lambda/__init__.py +0 -0
  359. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/entrypoints/adapters/aws_lambda/sqs.py +0 -0
  360. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/entrypoints/adapters/cron/__init__.py +0 -0
  361. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/entrypoints/adapters/cron/adapters/__init__.py +0 -0
  362. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/entrypoints/adapters/cron/adapters/clocks.py +0 -0
  363. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/entrypoints/adapters/cron/adapters/in_memory_runs.py +0 -0
  364. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/entrypoints/adapters/cron/adapters/key_value_runs.py +0 -0
  365. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/entrypoints/adapters/cron/domain/__init__.py +0 -0
  366. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/entrypoints/adapters/cron/domain/clock.py +0 -0
  367. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/entrypoints/adapters/cron/domain/cron.py +0 -0
  368. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/entrypoints/adapters/cron/domain/runs.py +0 -0
  369. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/entrypoints/adapters/cron/domain/schedule.py +0 -0
  370. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/entrypoints/adapters/cron/gateway/__init__.py +0 -0
  371. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/entrypoints/adapters/cron/gateway/gateway.py +0 -0
  372. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/entrypoints/adapters/cron/gateway/process.py +0 -0
  373. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/entrypoints/adapters/cron/registry.py +0 -0
  374. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/entrypoints/adapters/fastapi/__init__.py +0 -0
  375. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/entrypoints/adapters/fastapi/calling.py +0 -0
  376. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/entrypoints/adapters/fastapi/exceptions.py +0 -0
  377. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/entrypoints/adapters/grpc/__init__.py +0 -0
  378. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/entrypoints/adapters/grpc/client.py +0 -0
  379. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/entrypoints/adapters/grpc/exceptions.py +0 -0
  380. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/entrypoints/adapters/grpc/naming.py +0 -0
  381. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/entrypoints/adapters/grpc/proto.py +0 -0
  382. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/entrypoints/adapters/mcp/auth.py +0 -0
  383. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/entrypoints/adapters/mcp/exceptions.py +0 -0
  384. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/entrypoints/adapters/mcp/wire.py +0 -0
  385. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/entrypoints/adapters/queue/__init__.py +0 -0
  386. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/entrypoints/adapters/queue/channels.py +0 -0
  387. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/entrypoints/adapters/queue/flavours.py +0 -0
  388. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/entrypoints/adapters/queue/inbox.py +0 -0
  389. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/entrypoints/adapters/queue/sqs.py +0 -0
  390. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/entrypoints/adapters/queue/verdicts.py +0 -0
  391. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/entrypoints/adapters/queue/wire.py +0 -0
  392. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/entrypoints/adapters/rest/__init__.py +0 -0
  393. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/entrypoints/adapters/rest/exceptions.py +0 -0
  394. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/entrypoints/adapters/rest/openapi.py +0 -0
  395. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/entrypoints/adapters/rpc/__init__.py +0 -0
  396. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/entrypoints/adapters/rpc/exceptions.py +0 -0
  397. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/entrypoints/adapters/rpc/jrpc.py +0 -0
  398. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/entrypoints/adapters/rpc/wire.py +0 -0
  399. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/entrypoints/domain/__init__.py +0 -0
  400. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/entrypoints/domain/bindings.py +0 -0
  401. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/entrypoints/domain/layers.py +0 -0
  402. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/entrypoints/domain/packed.py +0 -0
  403. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/entrypoints/domain/surface.py +0 -0
  404. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/entrypoints/entrypoint/__init__.py +0 -0
  405. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/entrypoints/entrypoint/aws_lambda.py +0 -0
  406. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/entrypoints/entrypoint/decorators.py +0 -0
  407. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/entrypoints/entrypoint/queue.py +0 -0
  408. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/entrypoints/entrypoint/workers.py +0 -0
  409. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/entrypoints/infrastructure/__init__.py +0 -0
  410. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/entrypoints/infrastructure/http.py +0 -0
  411. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/entrypoints/infrastructure/json_schema.py +0 -0
  412. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/entrypoints/infrastructure/registry.py +0 -0
  413. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/entrypoints/services/__init__.py +0 -0
  414. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/entrypoints/services/catalog.py +0 -0
  415. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/entrypoints/services/scalar_execution.py +0 -0
  416. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/error_handler.py +0 -0
  417. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/event_driven/__init__.py +0 -0
  418. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/event_driven/adapters/__init__.py +0 -0
  419. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/event_driven/adapters/aws/__init__.py +0 -0
  420. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/event_driven/adapters/aws/attributes.py +0 -0
  421. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/event_driven/adapters/aws/queues.py +0 -0
  422. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/event_driven/adapters/background_queue.py +0 -0
  423. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/event_driven/adapters/faststream/__init__.py +0 -0
  424. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/event_driven/adapters/faststream/queue.py +0 -0
  425. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/event_driven/adapters/repository_queue.py +0 -0
  426. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/event_driven/adapters/sync_queue.py +0 -0
  427. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/event_driven/domain/__init__.py +0 -0
  428. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/event_driven/domain/broker.py +0 -0
  429. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/event_driven/domain/envelope.py +0 -0
  430. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/event_driven/domain/failure.py +0 -0
  431. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/event_driven/domain/queue.py +0 -0
  432. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/event_driven/domain/relay.py +0 -0
  433. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/event_driven/domain/subscribes.py +0 -0
  434. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/event_driven/entrypoint/__init__.py +0 -0
  435. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/event_driven/entrypoint/publisher.py +0 -0
  436. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/event_driven/entrypoint/relay.py +0 -0
  437. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/event_driven/entrypoint/subscriber.py +0 -0
  438. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/event_driven/services/__init__.py +0 -0
  439. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/event_driven/services/dispatch.py +0 -0
  440. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/event_driven/services/publication.py +0 -0
  441. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/event_driven/services/relaying.py +0 -0
  442. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/exceptions.py +0 -0
  443. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/introspection/__init__.py +0 -0
  444. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/introspection/inspector.py +0 -0
  445. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/introspection/operations.py +0 -0
  446. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/ioc.py +0 -0
  447. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/observability/__init__.py +0 -0
  448. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/observability/api.py +0 -0
  449. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/observability/correlation.py +0 -0
  450. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/observability/domain.py +0 -0
  451. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/observability/errors/__init__.py +0 -0
  452. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/observability/errors/record_error.py +0 -0
  453. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/observability/errors/setup.py +0 -0
  454. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/observability/failure.py +0 -0
  455. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/observability/http.py +0 -0
  456. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/observability/metrics/__init__.py +0 -0
  457. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/observability/metrics/adapters/__init__.py +0 -0
  458. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/observability/metrics/adapters/in_memory.py +0 -0
  459. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/observability/metrics/adapters/otel.py +0 -0
  460. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/observability/metrics/adapters/prometheus.py +0 -0
  461. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/observability/metrics/domain/__init__.py +0 -0
  462. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/observability/metrics/domain/bus_observability.py +0 -0
  463. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/observability/metrics/domain/declarations.py +0 -0
  464. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/observability/metrics/domain/instruments.py +0 -0
  465. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/observability/metrics/domain/naming.py +0 -0
  466. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/observability/metrics/domain/recorder.py +0 -0
  467. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/observability/metrics/entrypoint/__init__.py +0 -0
  468. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/observability/metrics/infrastructure/__init__.py +0 -0
  469. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/observability/metrics/infrastructure/active.py +0 -0
  470. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/observability/metrics/infrastructure/registry.py +0 -0
  471. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/observability/metrics/services/__init__.py +0 -0
  472. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/observability/metrics/services/declaring.py +0 -0
  473. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/observability/metrics/services/labels.py +0 -0
  474. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/observability/metrics/services/measuring.py +0 -0
  475. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/observability/metrics/services/outcomes.py +0 -0
  476. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/observability/metrics/services/recording.py +0 -0
  477. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/observability/metrics/testing.py +0 -0
  478. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/observability/mixins/__init__.py +0 -0
  479. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/observability/mixins/bus_observability.py +0 -0
  480. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/observability/otlp.py +0 -0
  481. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/observability/registry.py +0 -0
  482. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/observability/tracing/__init__.py +0 -0
  483. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/observability/tracing/attributes.py +0 -0
  484. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/observability/tracing/propagation.py +0 -0
  485. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/observability/tracing/setup.py +0 -0
  486. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/observability/tracing/span_context.py +0 -0
  487. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/observability/tracing/span_error.py +0 -0
  488. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/observability/tracing/span_execution.py +0 -0
  489. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/pipelines/__init__.py +0 -0
  490. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/pipelines/domain/__init__.py +0 -0
  491. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/pipelines/domain/exceptions.py +0 -0
  492. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/pipelines/domain/reads.py +0 -0
  493. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/pipelines/domain/recipe.py +0 -0
  494. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/pipelines/domain/run.py +0 -0
  495. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/pipelines/entrypoint/__init__.py +0 -0
  496. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/pipelines/entrypoint/bus_pipelines.py +0 -0
  497. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/pipelines/entrypoint/pipeline.py +0 -0
  498. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/pipelines/entrypoint/reads.py +0 -0
  499. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/pipelines/services/__init__.py +0 -0
  500. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/pipelines/services/recorder.py +0 -0
  501. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/pipelines/services/runs.py +0 -0
  502. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/py.typed +0 -0
  503. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/registry.py +0 -0
  504. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/remote_execution/__init__.py +0 -0
  505. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/remote_execution/adapters/__init__.py +0 -0
  506. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/remote_execution/adapters/grpc.py +0 -0
  507. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/remote_execution/adapters/http.py +0 -0
  508. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/remote_execution/domain/__init__.py +0 -0
  509. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/remote_execution/domain/address.py +0 -0
  510. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/remote_execution/domain/exceptions.py +0 -0
  511. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/remote_execution/domain/failure_codec.py +0 -0
  512. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/remote_execution/domain/payload.py +0 -0
  513. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/remote_execution/domain/transport.py +0 -0
  514. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/remote_execution/entrypoint/__init__.py +0 -0
  515. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/remote_execution/entrypoint/grpc.py +0 -0
  516. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/remote_execution/entrypoint/host_process.py +0 -0
  517. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/remote_execution/entrypoint/hosted_context.py +0 -0
  518. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/remote_execution/entrypoint/hosts.py +0 -0
  519. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/remote_execution/entrypoint/http.py +0 -0
  520. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/remote_execution/infrastructure/__init__.py +0 -0
  521. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/remote_execution/infrastructure/configuration.py +0 -0
  522. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/remote_execution/services/__init__.py +0 -0
  523. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/remote_execution/services/hosted_execution.py +0 -0
  524. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/remote_execution/services/transports.py +0 -0
  525. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/runtime/__init__.py +0 -0
  526. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/runtime/runtime_use_cases/__init__.py +0 -0
  527. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/runtime/runtime_use_cases/domain.py +0 -0
  528. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/runtime/runtime_use_cases/exceptions.py +0 -0
  529. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/runtime/runtime_use_cases/in_memory.py +0 -0
  530. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/runtime/runtime_use_cases/loading.py +0 -0
  531. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/runtime/runtime_use_cases/registry.py +0 -0
  532. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/runtime/testing/analysis/__init__.py +0 -0
  533. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/runtime/testing/analysis/architecture.py +0 -0
  534. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/runtime/testing/analysis/function_order.py +0 -0
  535. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/runtime/testing/analysis/settings_scope.py +0 -0
  536. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/runtime/testing/contracts/__init__.py +0 -0
  537. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/runtime/testing/contracts/auth_provider.py +0 -0
  538. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/runtime/testing/contracts/caching_strategies.py +0 -0
  539. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/runtime/testing/contracts/computed_fields.py +0 -0
  540. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/runtime/testing/contracts/extension.py +0 -0
  541. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/runtime/testing/contracts/idempotency_records.py +0 -0
  542. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/runtime/testing/contracts/key_value_store.py +0 -0
  543. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/runtime/testing/doubles/__init__.py +0 -0
  544. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/runtime/testing/doubles/auth.py +0 -0
  545. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/runtime/testing/doubles/clock.py +0 -0
  546. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/runtime/testing/doubles/context.py +0 -0
  547. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/runtime/testing/doubles/dependencies.py +0 -0
  548. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/runtime/testing/doubles/events.py +0 -0
  549. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/runtime/testing/exceptions.py +0 -0
  550. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/settings/__init__.py +0 -0
  551. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/settings/adapters/__init__.py +0 -0
  552. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/settings/adapters/aws.py +0 -0
  553. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/settings/adapters/environment.py +0 -0
  554. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/settings/adapters/yaml_file.py +0 -0
  555. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/settings/domain/__init__.py +0 -0
  556. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/settings/domain/config.py +0 -0
  557. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/settings/domain/description.py +0 -0
  558. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/settings/entrypoint/__init__.py +0 -0
  559. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/settings/entrypoint/building.py +0 -0
  560. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/settings/services/__init__.py +0 -0
  561. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/settings/services/building.py +0 -0
  562. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/settings/services/description.py +0 -0
  563. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/settings/services/resolution.py +0 -0
  564. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/sincpro_abstractions.py +0 -0
  565. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/sincpro_abstractions.pyi +0 -0
  566. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/sincpro_conf.py +0 -0
  567. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/sincpro_logger.py +0 -0
  568. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/use_bus.py +0 -0
  569. {sincpro_framework-3.24.2 → sincpro_framework-3.26.0}/sincpro_framework/use_bus.pyi +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sincpro-framework
3
- Version: 3.24.2
3
+ Version: 3.26.0
4
4
  Summary: Sincpro framework to use DDD, Clean architecture, Hexagonal architecture
5
5
  License: MIT
6
6
  License-File: LICENSE.md
@@ -34,7 +34,7 @@ Requires-Dist: boto3 (>=1.35) ; extra == "aws"
34
34
  Requires-Dist: dependency-injector (>=4.49.1,<5.0.0)
35
35
  Requires-Dist: duckdb-engine (>=0.17.0,<0.18.0) ; extra == "duckdb"
36
36
  Requires-Dist: fastapi (>=0.115) ; extra == "fastapi"
37
- Requires-Dist: fastmcp (>=3.4.10,<4) ; extra == "mcp"
37
+ Requires-Dist: fastmcp (>=3.4.10,<5) ; extra == "mcp"
38
38
  Requires-Dist: faststream (>=0.7,<0.8) ; extra == "faststream"
39
39
  Requires-Dist: grpcio (>=1.60) ; extra == "grpc"
40
40
  Requires-Dist: grpcio-health-checking (>=1.60) ; extra == "grpc"
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "sincpro-framework"
3
- version = "3.24.2"
3
+ version = "3.26.0"
4
4
  description = "Sincpro framework to use DDD, Clean architecture, Hexagonal architecture"
5
5
  authors = ["Gutierrez Andres <andru1236@gmail.com>"]
6
6
  readme = "README.md"
@@ -23,7 +23,7 @@ opentelemetry-sdk = {version = ">=1.45.1", optional = true}
23
23
  opentelemetry-exporter-otlp-proto-grpc = {version = ">=1.45.1", optional = true}
24
24
  opentelemetry-exporter-otlp-proto-http = {version = ">=1.45.1", optional = true}
25
25
  sentry-sdk = {version = ">=2.0", optional = true}
26
- fastmcp = {version = ">=3.4.10,<4", optional = true}
26
+ fastmcp = {version = ">=3.4.10,<5", optional = true}
27
27
  starlette = {version = ">=1.0", optional = true}
28
28
  fastapi = {version = ">=0.115", optional = true}
29
29
  grpcio = {version = ">=1.60", optional = true}
@@ -13,12 +13,16 @@ around it: context, persistence, events, caching, observability and transports.
13
13
 
14
14
  @cache.ttl(timedelta(minutes=5)) the service's cache, beside every bus's own
15
15
 
16
+ problem_of(error) a failure as every wire tells it — kind, reason,
17
+ status, what to do next — for a route of one's own
18
+
16
19
  The top level holds what nearly every project imports; each component has its own package
17
20
  (`sincpro_framework.context` — where `store_context_in` lives —, `.ddd`, `.pipelines`,
18
21
  `.data_layer.store`, `.data_layer.caching`, …).
19
22
  """
20
23
 
21
24
  from .bus_pipeline.interceptors import CallNext, Interceptor
25
+ from .common.failures import NextStep, Problem, problem_of
22
26
  from .data_layer.caching.entrypoint.facades import cache, idempotency
23
27
  from .exceptions import (
24
28
  ClientError,
@@ -51,8 +55,10 @@ __all__ = [
51
55
  "FailureKind",
52
56
  "FrameworkError",
53
57
  "Interceptor",
58
+ "NextStep",
54
59
  "OutcomeUnknownError",
55
60
  "Preview",
61
+ "Problem",
56
62
  "ProgrammingError",
57
63
  "ServiceUnavailableError",
58
64
  "Feature",
@@ -60,6 +66,7 @@ __all__ = [
60
66
  "cache",
61
67
  "idempotency",
62
68
  "logger",
69
+ "problem_of",
63
70
  "TypeDTO",
64
71
  "TypeDTOResponse",
65
72
  ]
@@ -10,6 +10,7 @@ each — authenticate again. `PermissionDenied`, not `PermissionError`: Python's
10
10
 
11
11
  from typing import Any
12
12
 
13
+ from sincpro_framework.common.failures.problem import Problem
13
14
  from sincpro_framework.exceptions import ClientError, FailureKind, ProgrammingError
14
15
 
15
16
 
@@ -39,6 +40,18 @@ class AuthError(ClientError):
39
40
  """
40
41
  return {"kind": self.failure_kind.value, "reason": self.reason}
41
42
 
43
+ def refine_problem(self, problem: Problem) -> Problem:
44
+ """The problem of a refusal: its reason as what the caller reads, its own HTTP status, and
45
+ what else the refusal says — a `step_up`, a missing `requirement` — as extensions."""
46
+ said = {
47
+ name: value
48
+ for name, value in self.refusal_body().items()
49
+ if name not in ("kind", "reason")
50
+ }
51
+ return problem.model_copy(
52
+ update={"detail": self.reason, "status": self.http_status, "extensions": said}
53
+ )
54
+
42
55
 
43
56
  class Unauthenticated(AuthError):
44
57
  """Who is calling is not known well enough. `step_up` names what the caller has to come back
@@ -1,5 +1,6 @@
1
1
  """How every wire tells its caller what kind of failure an error is (`FailureKind`, in the core
2
- `exceptions`): the classification, and how long to wait before a retry."""
2
+ `exceptions`): the classification, how long to wait before a retry, and the `Problem` every wire
3
+ draws — what happened and what to do next."""
3
4
 
4
5
  from sincpro_framework.common.failures.classification import (
5
6
  DEFAULT_RETRY_AFTER,
@@ -12,10 +13,28 @@ from sincpro_framework.common.failures.classification import (
12
13
  retry_after,
13
14
  said_to_the_caller,
14
15
  )
16
+ from sincpro_framework.common.failures.problem import (
17
+ HTTP_STATUS_OF,
18
+ NEXT_STEP_OF,
19
+ TITLE_OF,
20
+ FieldError,
21
+ NextStep,
22
+ Problem,
23
+ pointer,
24
+ problem_of,
25
+ )
15
26
  from sincpro_framework.exceptions import FailureKind
16
27
 
17
28
  __all__ = [
18
29
  "DEFAULT_RETRY_AFTER",
30
+ "FieldError",
31
+ "HTTP_STATUS_OF",
32
+ "NEXT_STEP_OF",
33
+ "NextStep",
34
+ "Problem",
35
+ "TITLE_OF",
36
+ "pointer",
37
+ "problem_of",
19
38
  "PERMANENT",
20
39
  "RETRYABLE",
21
40
  "failure_reason",
@@ -0,0 +1,288 @@
1
+ """`Problem`: one failure as every wire tells it — its kind, a stable reason, what the caller reads,
2
+ and **what to do next** — built once (`problem_of`) and drawn by each wire in its own encoding:
3
+ RFC 9457 on REST, an error's `data` on JSON-RPC, `google.rpc.Status` on gRPC, a tool error on MCP.
4
+
5
+ problem_of(InvoiceNotFound("invoice F-9 does not exist"))
6
+ -> Problem(kind=not_found, reason="INVOICE_NOT_FOUND", title="Not found", status=404,
7
+ detail="invoice F-9 does not exist", next_step=do_not_retry,
8
+ guidance="What the request names does not exist: …", retryable=False)
9
+
10
+ Context: the defaults are the kind's — its title, its HTTP status, its next step and guidance
11
+ (`NEXT_STEP_OF`). An error changes what it means without any table to edit:
12
+
13
+ class InvoiceNotFound(ClientError):
14
+ failure_kind = FailureKind.NOT_FOUND what kind it is
15
+ next_step = NextStep.FIX_REQUEST what the caller does
16
+ guidance = "Check the invoice number on the printed copy."
17
+
18
+ def refine_problem(self, problem: Problem) -> Problem: anything else
19
+ return problem.model_copy(update={"extensions": {"number": self.number}})
20
+
21
+ An error a project does not own (a library's) is translated into one of its own by an error
22
+ handler of the bus — the one place a project maps a failure. Nothing of a failure that is not
23
+ written for the caller (`said_to_the_caller`) is told: no detail, its kind as its reason.
24
+ """
25
+
26
+ from collections.abc import Iterable, Mapping, Sequence
27
+ from datetime import timedelta
28
+ from enum import StrEnum
29
+ from typing import Any
30
+
31
+ from pydantic import ConfigDict, ValidationError
32
+
33
+ from sincpro_framework import exceptions
34
+ from sincpro_framework.common.failures.classification import (
35
+ failure_reason,
36
+ refined_failure_kind,
37
+ retry_after,
38
+ said_to_the_caller,
39
+ )
40
+ from sincpro_framework.sincpro_abstractions import DataTransferObject
41
+
42
+
43
+ class NextStep(StrEnum):
44
+ """What a caller — a person, a client, an agent — does after a failure."""
45
+
46
+ FIX_REQUEST = "fix_request"
47
+ """Correct what was sent, then send it again."""
48
+ AUTHENTICATE = "authenticate"
49
+ """Get a credential, or a fresh one, then send it again."""
50
+ ASK_FOR_ACCESS = "ask_for_access"
51
+ """Do not retry: whoever calls may not do this until someone grants it."""
52
+ DO_NOT_RETRY = "do_not_retry"
53
+ """The same request fails the same way: show the answer and stop."""
54
+ REFRESH_AND_RETRY = "refresh_and_retry"
55
+ """Read what changed, then send the request again on what was read."""
56
+ RETRY_LATER = "retry_later"
57
+ """Send the same request again after `retry_after`."""
58
+ VERIFY_THEN_RETRY = "verify_then_retry"
59
+ """It may have run: check whether it did before sending it again — or send it again with the
60
+ same idempotency key."""
61
+
62
+
63
+ NEXT_STEP_OF: Mapping[exceptions.FailureKind, tuple[NextStep, str]] = {
64
+ exceptions.FailureKind.INVALID: (
65
+ NextStep.FIX_REQUEST,
66
+ "The request does not fit what the use case takes: correct the fields named and send "
67
+ "it again.",
68
+ ),
69
+ exceptions.FailureKind.UNAUTHENTICATED: (
70
+ NextStep.AUTHENTICATE,
71
+ "Who is calling is not known: authenticate, or renew the credential, and send it again.",
72
+ ),
73
+ exceptions.FailureKind.PERMISSION_DENIED: (
74
+ NextStep.ASK_FOR_ACCESS,
75
+ "The caller may not do this: retrying will not help until the access is granted.",
76
+ ),
77
+ exceptions.FailureKind.NOT_FOUND: (
78
+ NextStep.DO_NOT_RETRY,
79
+ "What the request names does not exist: check the identifier; the same request "
80
+ "fails the same way.",
81
+ ),
82
+ exceptions.FailureKind.CONFLICT: (
83
+ NextStep.REFRESH_AND_RETRY,
84
+ "Someone else wrote first: read the current state, then send the request again on it.",
85
+ ),
86
+ exceptions.FailureKind.IN_PROGRESS: (
87
+ NextStep.RETRY_LATER,
88
+ "The same request is still running: wait `retry_after`, then ask again for its answer.",
89
+ ),
90
+ exceptions.FailureKind.KEY_REUSED: (
91
+ NextStep.FIX_REQUEST,
92
+ "The idempotency key was used for another request: a new request needs a new key.",
93
+ ),
94
+ exceptions.FailureKind.DOMAIN: (
95
+ NextStep.DO_NOT_RETRY,
96
+ "A business rule refused the request: show the answer; the same request is refused "
97
+ "the same way.",
98
+ ),
99
+ exceptions.FailureKind.EXHAUSTED: (
100
+ NextStep.RETRY_LATER,
101
+ "A limit was reached: wait `retry_after`, then send the same request again.",
102
+ ),
103
+ exceptions.FailureKind.UNAVAILABLE: (
104
+ NextStep.RETRY_LATER,
105
+ "Something the call needs is down for now: wait `retry_after`, then send the same "
106
+ "request again.",
107
+ ),
108
+ exceptions.FailureKind.UNKNOWN_OUTCOME: (
109
+ NextStep.VERIFY_THEN_RETRY,
110
+ "The request was sent and no answer came back — it may have run: check before sending "
111
+ "it again, or send it with the same idempotency key.",
112
+ ),
113
+ exceptions.FailureKind.INTERNAL: (
114
+ NextStep.RETRY_LATER,
115
+ "The service failed on its side: try again later, and report it with the trace if it "
116
+ "keeps failing.",
117
+ ),
118
+ }
119
+ """What a caller does after each kind of failure, and why — the default an error may change."""
120
+
121
+ TITLE_OF: Mapping[exceptions.FailureKind, str] = {
122
+ exceptions.FailureKind.INVALID: "The request does not validate",
123
+ exceptions.FailureKind.UNAUTHENTICATED: "Who is calling is not known",
124
+ exceptions.FailureKind.PERMISSION_DENIED: "Not allowed",
125
+ exceptions.FailureKind.NOT_FOUND: "Not found",
126
+ exceptions.FailureKind.CONFLICT: "The write collided",
127
+ exceptions.FailureKind.IN_PROGRESS: "The same request is still running",
128
+ exceptions.FailureKind.KEY_REUSED: "The idempotency key was used for another request",
129
+ exceptions.FailureKind.DOMAIN: "The domain refused the request",
130
+ exceptions.FailureKind.EXHAUSTED: "Too many requests",
131
+ exceptions.FailureKind.UNAVAILABLE: "Unavailable for now",
132
+ exceptions.FailureKind.UNKNOWN_OUTCOME: "It may have run — verify before retrying",
133
+ exceptions.FailureKind.INTERNAL: "Internal error",
134
+ }
135
+
136
+ HTTP_STATUS_OF: Mapping[exceptions.FailureKind, int] = {
137
+ exceptions.FailureKind.INVALID: 422,
138
+ exceptions.FailureKind.UNAUTHENTICATED: 401,
139
+ exceptions.FailureKind.PERMISSION_DENIED: 403,
140
+ exceptions.FailureKind.NOT_FOUND: 404,
141
+ exceptions.FailureKind.CONFLICT: 409,
142
+ exceptions.FailureKind.IN_PROGRESS: 409,
143
+ exceptions.FailureKind.KEY_REUSED: 422,
144
+ exceptions.FailureKind.DOMAIN: 422,
145
+ exceptions.FailureKind.EXHAUSTED: 429,
146
+ exceptions.FailureKind.UNAVAILABLE: 503,
147
+ exceptions.FailureKind.UNKNOWN_OUTCOME: 504,
148
+ exceptions.FailureKind.INTERNAL: 500,
149
+ }
150
+ """The HTTP status of each kind — the one REST answers, and any route of a project's own."""
151
+
152
+ RETRYABLE_STEPS = frozenset({NextStep.RETRY_LATER, NextStep.REFRESH_AND_RETRY})
153
+ """The next steps that send the request again without changing it by hand."""
154
+
155
+
156
+ def pointer(location: Sequence[Any]) -> str:
157
+ """A validation error's location as a JSON pointer into the DTO (RFC 6901) — where the value
158
+ came from (`body`, `query`, …) dropped, `~` and `/` escaped.
159
+
160
+ pointer(("body", "lines", 0, "amount")) -> "#/lines/0/amount"
161
+ """
162
+ parts = list(location)
163
+ if parts and parts[0] in ("body", "query", "path", "header", "cookie"):
164
+ parts = parts[1:]
165
+ return "#/" + "/".join(str(one).replace("~", "~0").replace("/", "~1") for one in parts)
166
+
167
+
168
+ class FieldError(DataTransferObject):
169
+ """One field the request got wrong — `pointer` addresses it in the DTO (`#/total`)."""
170
+
171
+ pointer: str
172
+ detail: str
173
+
174
+
175
+ class Problem(DataTransferObject):
176
+ """One failure, as every wire tells it — as JSON, `retry_after` is a number of seconds, as
177
+ the `Retry-After` header says it."""
178
+
179
+ model_config = ConfigDict(ser_json_timedelta="float")
180
+
181
+ kind: exceptions.FailureKind
182
+ """What kind of failure — the same word on every wire."""
183
+ reason: str
184
+ """UPPER_SNAKE, stable: what a client switches on — never the text."""
185
+ title: str
186
+ status: int
187
+ """Its HTTP status — what REST answers, and what a route of a project's own answers."""
188
+ detail: str | None = None
189
+ """What the caller reads of this failure — `None` when nothing of it is the caller's."""
190
+ next_step: NextStep
191
+ guidance: str
192
+ """What to do next, in words — for a person or an agent reading it."""
193
+ retryable: bool
194
+ """Whether sending the request again, as it is or on a fresh read, may succeed."""
195
+ retry_after: timedelta | None = None
196
+ """How long to wait first — `None` when waiting does not help."""
197
+ errors: list[FieldError] = []
198
+ """The fields of the request that did not validate."""
199
+ extensions: dict[str, Any] = {}
200
+ """What the error chose to disclose besides — a missing permission, a step-up, a limit."""
201
+
202
+ @classmethod
203
+ def for_kind(
204
+ cls,
205
+ kind: exceptions.FailureKind,
206
+ reason: str | None = None,
207
+ detail: str | None = None,
208
+ errors: Iterable[FieldError] = (),
209
+ **extensions: Any,
210
+ ) -> "Problem":
211
+ """A problem of `kind` with its defaults — title, status, next step, guidance — and what
212
+ is given; what an entrypoint answers for a failure no error raised (a body that does not
213
+ parse, a route that does not exist).
214
+
215
+ Problem.for_kind(FailureKind.INVALID, "UNREADABLE", "the body is not JSON")
216
+ """
217
+ step, guidance = NEXT_STEP_OF[kind]
218
+ return cls(
219
+ kind=kind,
220
+ reason=reason or kind.value.upper(),
221
+ title=TITLE_OF[kind],
222
+ status=HTTP_STATUS_OF[kind],
223
+ detail=detail,
224
+ next_step=step,
225
+ guidance=guidance,
226
+ retryable=step in RETRYABLE_STEPS,
227
+ errors=list(errors),
228
+ extensions=extensions,
229
+ )
230
+
231
+ def body(self) -> dict[str, Any]:
232
+ """The problem as JSON, as RFC 9457 lays it out: its members and, beside them, what its
233
+ error disclosed (`extensions`) — a member with nothing to say left out.
234
+
235
+ Problem.for_kind(FailureKind.INVALID, "UNREADABLE", "not JSON").body()
236
+ -> {"kind": "invalid", "reason": "UNREADABLE", "title": "…", "status": 422,
237
+ "detail": "not JSON", "next_step": "fix_request", "guidance": "…",
238
+ "retryable": False}
239
+ """
240
+ told = {**self.model_dump(mode="json", exclude={"extensions"}), **self.extensions}
241
+ return {
242
+ name: value for name, value in told.items() if value not in (None, [], {}, "")
243
+ }
244
+
245
+
246
+ def problem_of(error: Exception) -> Problem:
247
+ """The problem every wire answers `error` with.
248
+
249
+ problem_of(InvoiceNotFound("invoice F-9 does not exist"))
250
+ -> Problem(kind=not_found, reason="INVOICE_NOT_FOUND", status=404,
251
+ detail="invoice F-9 does not exist", next_step=do_not_retry, …)
252
+ problem_of(RuntimeError("postgres://admin:pw@db"))
253
+ -> Problem(kind=internal, reason="INTERNAL", status=500, detail=None, …)
254
+
255
+ 1. The kind (`refined_failure_kind`) gives the defaults (`Problem.for_kind`); the reason is
256
+ the error's class when the caller may read the error, its kind otherwise.
257
+ 2. What the caller reads is the error's message only when it was written for the caller.
258
+ 3. A request that did not validate names each field; a retryable kind says how long to wait.
259
+ 4. The error's `next_step` and `guidance`, when it declares them, take the kind's place.
260
+ Final: the error's `refine_problem(problem)`, when it has one, changes anything else — what
261
+ it answers is the problem when it is one.
262
+ """
263
+ kind = refined_failure_kind(error)
264
+ errors = (
265
+ [
266
+ FieldError(pointer=pointer(one.get("loc", ())), detail=str(one.get("msg", "")))
267
+ for one in error.errors(include_url=False)
268
+ ]
269
+ if isinstance(error, ValidationError)
270
+ else []
271
+ )
272
+ problem = Problem.for_kind(
273
+ kind, failure_reason(error, kind), said_to_the_caller(error), errors
274
+ )
275
+ step = getattr(error, "next_step", None)
276
+ step = step if isinstance(step, NextStep) else problem.next_step
277
+ guidance = getattr(error, "guidance", None)
278
+ problem = problem.model_copy(
279
+ update={
280
+ "retry_after": retry_after(error, kind),
281
+ "next_step": step,
282
+ "retryable": step in RETRYABLE_STEPS,
283
+ "guidance": guidance if isinstance(guidance, str) else problem.guidance,
284
+ }
285
+ )
286
+ refine = getattr(error, "refine_problem", None)
287
+ refined = refine(problem) if callable(refine) else problem
288
+ return refined if isinstance(refined, Problem) else problem
@@ -30,6 +30,9 @@ class ContextKey(StrEnum):
30
30
  EXECUTION_ID = "execution_id"
31
31
  CAUSATION_ID = "causation_id"
32
32
  CORRELATION_ID = "correlation_id"
33
+ LANG = "lang"
34
+ """The language of the call, a BCP 47 tag (`es-BO`) — what a `MultiLanguage` and a message
35
+ are read in."""
33
36
  PIPELINE_CONTEXT = "SINCPRO_PIPELINE_CONTEXT"
34
37
  """The run a pipeline's steps belong to — `{"pipeline": …, "run_id": …}` on the node of its
35
38
  execution, so a run at the same time is another branch; in the store, the namespace of every
@@ -7,11 +7,15 @@ entrypoint's, and `ObjectStorage` is injected as any adapter.
7
7
  billing.add_dependency("storage", ObjectStorage(S3CompatibleObjectStore("documents", boto3_client), secret))
8
8
 
9
9
  self.storage.put("exports/invoices.csv", data, "text/csv")
10
+ self.storage.get("exports/invoices.csv") whole, to process it
11
+ self.storage.stream("exports/invoices.csv") by parts, to pass it on
12
+ self.storage.fetch(url, "inbox/scan.pdf", max_bytes=50 * MB) a URL's bytes into the store
10
13
  published = self.storage.publish("exports/invoices.csv", Access.READ, timedelta(hours=1), max_uses=1)
11
14
  self.storage.redeem(published.id, Access.READ) the entrypoint, when the id comes back
12
15
 
13
- domain/ ObjectStore (the port), ObjectRef, StoredObject, Access, Publication, Grant, Refusal;
14
- ObjectNotFound, ObjectAlreadyExists, PublicationRefused
16
+ domain/ ObjectStore (the port), ObjectRef, StoredObject, ObjectStream, Access, Publication, Grant, Refusal;
17
+ ObjectNotFound, ObjectAlreadyExists, PublicationRefused, FetchRefused, FetchFailed,
18
+ FetchRefusal
15
19
  adapters/ InMemoryObjectStore, LocalObjectStore, S3CompatibleObjectStore
16
20
  entrypoint/ ObjectStorage, the facade a project injects
17
21
  """
@@ -22,14 +26,18 @@ from sincpro_framework.data_layer.object_storage.adapters.s3_compatible import (
22
26
  S3CompatibleObjectStore,
23
27
  )
24
28
  from sincpro_framework.data_layer.object_storage.domain.exceptions import (
29
+ FetchFailed,
30
+ FetchRefused,
25
31
  ObjectAlreadyExists,
26
32
  ObjectNotFound,
27
33
  PublicationRefused,
28
34
  )
35
+ from sincpro_framework.data_layer.object_storage.domain.fetch import FetchRefusal
29
36
  from sincpro_framework.data_layer.object_storage.domain.object_store import (
30
37
  Access,
31
38
  ObjectRef,
32
39
  ObjectStore,
40
+ ObjectStream,
33
41
  StoredObject,
34
42
  )
35
43
  from sincpro_framework.data_layer.object_storage.domain.publication import (
@@ -43,6 +51,9 @@ from sincpro_framework.data_layer.object_storage.entrypoint.object_storage impor
43
51
 
44
52
  __all__ = [
45
53
  "Access",
54
+ "FetchFailed",
55
+ "FetchRefusal",
56
+ "FetchRefused",
46
57
  "Grant",
47
58
  "InMemoryObjectStore",
48
59
  "LocalObjectStore",
@@ -51,6 +62,7 @@ __all__ = [
51
62
  "ObjectRef",
52
63
  "ObjectStorage",
53
64
  "ObjectStore",
65
+ "ObjectStream",
54
66
  "Publication",
55
67
  "PublicationRefused",
56
68
  "Refusal",
@@ -0,0 +1,172 @@
1
+ """`HttpSource`: the bytes of a URL as its server sends them, read by a store — the standard library's
2
+ `urllib`, a redirect followed only when told and each hop judged, the bytes counted against a size
3
+ and a time as they come.
4
+
5
+ body = HttpSource().open("https://cdn.acme.bo/scan.pdf", timedelta(seconds=30), {}, False,
6
+ judged, max_bytes=50 * MB)
7
+ body.content_type -> "application/pdf"
8
+ store.put(key, io.BufferedReader(body), …) read to its end, or refused on the way
9
+
10
+ Context: what `urllib` raises is said in object storage's words — a redirect not followed or a
11
+ client error (4xx) is `FetchRefused`, a server error (5xx), a host that cannot be reached or a time
12
+ run out is `FetchFailed` — so the service judges a fetch without knowing HTTP. A refusal raised
13
+ while a store reads is also kept on the body (`refusal`): a store that wraps what its reader raised
14
+ (a bucket's `ExternalServiceError`) is seen through.
15
+ """
16
+
17
+ import io
18
+ import time
19
+ import urllib.error
20
+ import urllib.request
21
+ from collections.abc import Callable, Mapping
22
+ from datetime import timedelta
23
+ from typing import Any
24
+
25
+ from sincpro_framework.data_layer.object_storage.domain.exceptions import (
26
+ FetchFailed,
27
+ FetchRefused,
28
+ )
29
+ from sincpro_framework.data_layer.object_storage.domain.fetch import FetchRefusal
30
+
31
+
32
+ class Redirects(urllib.request.HTTPRedirectHandler):
33
+ """A redirect followed only when told, each new URL judged first."""
34
+
35
+ def __init__(self, follow: bool, judged: Callable[[str], None]) -> None:
36
+ """`follow` the redirects or not; `judged` raises for a URL the fetch does not take."""
37
+ super().__init__()
38
+ self.follow = follow
39
+ self.judged = judged
40
+
41
+ def redirect_request(
42
+ self,
43
+ req: urllib.request.Request,
44
+ fp: Any,
45
+ code: int,
46
+ msg: str,
47
+ headers: Any,
48
+ newurl: str,
49
+ ) -> urllib.request.Request | None:
50
+ """The request to the new URL once it is judged — none when redirects are not followed,
51
+ which `urllib` answers as the redirect's own `HTTPError`."""
52
+ if not self.follow:
53
+ return None
54
+ self.judged(newurl)
55
+ return super().redirect_request(req, fp, code, msg, headers, newurl)
56
+
57
+
58
+ class HttpBody(io.RawIOBase):
59
+ """A URL's bytes as they come, refused past `max_bytes` or once its time ran out."""
60
+
61
+ def __init__(
62
+ self, response: Any, url: str, max_bytes: int | None, deadline: float
63
+ ) -> None:
64
+ """`response` the server's, of `url`; `deadline` on `time.monotonic()`."""
65
+ super().__init__()
66
+ self.response = response
67
+ self.url = url
68
+ self.max_bytes = max_bytes
69
+ self.deadline = deadline
70
+ self.received = 0
71
+ self.refusal: FetchRefused | FetchFailed | None = None
72
+ self.content_type: str | None = response.headers.get("Content-Type")
73
+
74
+ def readable(self) -> bool:
75
+ return True
76
+
77
+ def readinto(self, buffer: Any) -> int:
78
+ """The next bytes into `buffer` — `0` at the end.
79
+
80
+ 1. Past its deadline: `FetchFailed`.
81
+ 2. What has arrived, up to the buffer's size — never waiting for it to fill, so the
82
+ deadline is judged between every part a slow server sends; a connection that fails
83
+ or times out while reading: `FetchFailed`.
84
+ 3. Past `max_bytes`: `FetchRefused` (`TOO_LARGE`).
85
+ Final: what was read; a refusal is kept in `refusal` before it is raised.
86
+ """
87
+ if time.monotonic() > self.deadline:
88
+ self.refusal = FetchFailed(self.url, f"{self.url} did not send its bytes in time")
89
+ raise self.refusal
90
+ view = memoryview(buffer).cast("B")
91
+ try:
92
+ part = self.response.read1(len(view))
93
+ except OSError as error:
94
+ self.refusal = FetchFailed(self.url, f"{self.url} could not be read: {error}")
95
+ raise self.refusal from error
96
+ read = len(part)
97
+ view[:read] = part
98
+ self.received += read
99
+ if self.max_bytes is not None and self.received > self.max_bytes:
100
+ self.refusal = FetchRefused(
101
+ FetchRefusal.TOO_LARGE,
102
+ self.url,
103
+ f"{self.url} sends more than {self.max_bytes} bytes",
104
+ )
105
+ raise self.refusal
106
+ return read
107
+
108
+ def close(self) -> None:
109
+ """Close the server's response with it."""
110
+ if not self.closed:
111
+ self.response.close()
112
+ super().close()
113
+
114
+
115
+ class HttpSource:
116
+ """URLs opened with the standard library."""
117
+
118
+ def open(
119
+ self,
120
+ url: str,
121
+ timeout: timedelta,
122
+ headers: Mapping[str, str],
123
+ follow_redirects: bool,
124
+ judged: Callable[[str], None],
125
+ max_bytes: int | None = None,
126
+ ) -> HttpBody:
127
+ """The body of `url`, asked with `headers`, for a store to read — within `timeout` in
128
+ all, each read of the connection too.
129
+
130
+ 1. Opened with `follow_redirects`, each redirect's URL `judged` first.
131
+ 2. A redirect not followed or a client error (4xx): `FetchRefused`; a server error
132
+ (5xx), a host not reached, a time run out: `FetchFailed`.
133
+ 3. A `Content-Length` past `max_bytes`: `FetchRefused` before a byte is read.
134
+ Final: the body, counted against `max_bytes` and the time left as it is read.
135
+ """
136
+ deadline = time.monotonic() + timeout.total_seconds()
137
+ opener = urllib.request.build_opener(Redirects(follow_redirects, judged))
138
+ try:
139
+ response = opener.open(
140
+ urllib.request.Request(url, headers=dict(headers)),
141
+ timeout=timeout.total_seconds(),
142
+ )
143
+ except urllib.error.HTTPError as error:
144
+ error.close()
145
+ if 300 <= error.code < 400:
146
+ raise FetchRefused(
147
+ FetchRefusal.REDIRECTED,
148
+ url,
149
+ f"{url} answered a redirect ({error.code}) to {error.headers.get('Location')}",
150
+ error.code,
151
+ ) from error
152
+ if error.code < 500:
153
+ raise FetchRefused(
154
+ FetchRefusal.ANSWERED, url, f"{url} answered {error.code}", error.code
155
+ ) from error
156
+ raise FetchFailed(url, f"{url} answered {error.code}", error.code) from error
157
+ except (urllib.error.URLError, OSError) as error:
158
+ raise FetchFailed(url, f"{url} could not be reached: {error}") from error
159
+ declared = response.headers.get("Content-Length")
160
+ if (
161
+ max_bytes is not None
162
+ and declared
163
+ and declared.isdigit()
164
+ and int(declared) > max_bytes
165
+ ):
166
+ response.close()
167
+ raise FetchRefused(
168
+ FetchRefusal.TOO_LARGE,
169
+ url,
170
+ f"{url} sends {declared} bytes, more than {max_bytes}",
171
+ )
172
+ return HttpBody(response, url, max_bytes, deadline)