mic-struct 0.0.1__tar.gz → 0.0.2__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 (196) hide show
  1. {mic_struct-0.0.1 → mic_struct-0.0.2}/CHANGELOG.md +18 -1
  2. {mic_struct-0.0.1 → mic_struct-0.0.2}/PKG-INFO +1 -1
  3. {mic_struct-0.0.1 → mic_struct-0.0.2}/pyproject.toml +1 -1
  4. {mic_struct-0.0.1 → mic_struct-0.0.2}/src/mic/__init__.py +1 -1
  5. {mic_struct-0.0.1 → mic_struct-0.0.2}/src/mic/healthcheck/readiness.py +33 -4
  6. {mic_struct-0.0.1 → mic_struct-0.0.2}/.gitignore +0 -0
  7. {mic_struct-0.0.1 → mic_struct-0.0.2}/LICENSE +0 -0
  8. {mic_struct-0.0.1 → mic_struct-0.0.2}/README.md +0 -0
  9. {mic_struct-0.0.1 → mic_struct-0.0.2}/src/mic/_lazy.py +0 -0
  10. {mic_struct-0.0.1 → mic_struct-0.0.2}/src/mic/auth/__init__.py +0 -0
  11. {mic_struct-0.0.1 → mic_struct-0.0.2}/src/mic/auth/revoke_blacklist.py +0 -0
  12. {mic_struct-0.0.1 → mic_struct-0.0.2}/src/mic/auth/service_auth.py +0 -0
  13. {mic_struct-0.0.1 → mic_struct-0.0.2}/src/mic/authz/__init__.py +0 -0
  14. {mic_struct-0.0.1 → mic_struct-0.0.2}/src/mic/authz/base.py +0 -0
  15. {mic_struct-0.0.1 → mic_struct-0.0.2}/src/mic/authz/errors.py +0 -0
  16. {mic_struct-0.0.1 → mic_struct-0.0.2}/src/mic/authz/in_memory.py +0 -0
  17. {mic_struct-0.0.1 → mic_struct-0.0.2}/src/mic/authz/opa.py +0 -0
  18. {mic_struct-0.0.1 → mic_struct-0.0.2}/src/mic/authz/openfga.py +0 -0
  19. {mic_struct-0.0.1 → mic_struct-0.0.2}/src/mic/cache/__init__.py +0 -0
  20. {mic_struct-0.0.1 → mic_struct-0.0.2}/src/mic/cache/backends.py +0 -0
  21. {mic_struct-0.0.1 → mic_struct-0.0.2}/src/mic/cache/cluster/__init__.py +0 -0
  22. {mic_struct-0.0.1 → mic_struct-0.0.2}/src/mic/cache/cluster/consistent_hash.py +0 -0
  23. {mic_struct-0.0.1 → mic_struct-0.0.2}/src/mic/cache/cluster/redis_cluster.py +0 -0
  24. {mic_struct-0.0.1 → mic_struct-0.0.2}/src/mic/cli/__init__.py +0 -0
  25. {mic_struct-0.0.1 → mic_struct-0.0.2}/src/mic/cli/builder.py +0 -0
  26. {mic_struct-0.0.1 → mic_struct-0.0.2}/src/mic/cli/spec.py +0 -0
  27. {mic_struct-0.0.1 → mic_struct-0.0.2}/src/mic/client/__init__.py +0 -0
  28. {mic_struct-0.0.1 → mic_struct-0.0.2}/src/mic/client/async_service_client.py +0 -0
  29. {mic_struct-0.0.1 → mic_struct-0.0.2}/src/mic/client/service_client.py +0 -0
  30. {mic_struct-0.0.1 → mic_struct-0.0.2}/src/mic/contracts/__init__.py +0 -0
  31. {mic_struct-0.0.1 → mic_struct-0.0.2}/src/mic/contracts/envelope.py +0 -0
  32. {mic_struct-0.0.1 → mic_struct-0.0.2}/src/mic/contracts/strict_schema.py +0 -0
  33. {mic_struct-0.0.1 → mic_struct-0.0.2}/src/mic/datastorage/__init__.py +0 -0
  34. {mic_struct-0.0.1 → mic_struct-0.0.2}/src/mic/datastorage/base.py +0 -0
  35. {mic_struct-0.0.1 → mic_struct-0.0.2}/src/mic/datastorage/document/__init__.py +0 -0
  36. {mic_struct-0.0.1 → mic_struct-0.0.2}/src/mic/datastorage/document/engine.py +0 -0
  37. {mic_struct-0.0.1 → mic_struct-0.0.2}/src/mic/datastorage/document/in_memory.py +0 -0
  38. {mic_struct-0.0.1 → mic_struct-0.0.2}/src/mic/datastorage/graph/__init__.py +0 -0
  39. {mic_struct-0.0.1 → mic_struct-0.0.2}/src/mic/datastorage/graph/engine.py +0 -0
  40. {mic_struct-0.0.1 → mic_struct-0.0.2}/src/mic/datastorage/keyvalue/__init__.py +0 -0
  41. {mic_struct-0.0.1 → mic_struct-0.0.2}/src/mic/datastorage/keyvalue/in_memory.py +0 -0
  42. {mic_struct-0.0.1 → mic_struct-0.0.2}/src/mic/datastorage/sql/__init__.py +0 -0
  43. {mic_struct-0.0.1 → mic_struct-0.0.2}/src/mic/datastorage/sql/engine.py +0 -0
  44. {mic_struct-0.0.1 → mic_struct-0.0.2}/src/mic/eventbus/__init__.py +0 -0
  45. {mic_struct-0.0.1 → mic_struct-0.0.2}/src/mic/eventbus/base.py +0 -0
  46. {mic_struct-0.0.1 → mic_struct-0.0.2}/src/mic/eventbus/in_memory.py +0 -0
  47. {mic_struct-0.0.1 → mic_struct-0.0.2}/src/mic/eventbus/redis_streams.py +0 -0
  48. {mic_struct-0.0.1 → mic_struct-0.0.2}/src/mic/fastapi/__init__.py +0 -0
  49. {mic_struct-0.0.1 → mic_struct-0.0.2}/src/mic/fastapi/_resolve.py +0 -0
  50. {mic_struct-0.0.1 → mic_struct-0.0.2}/src/mic/fastapi/middlewares.py +0 -0
  51. {mic_struct-0.0.1 → mic_struct-0.0.2}/src/mic/fastapi/router.py +0 -0
  52. {mic_struct-0.0.1 → mic_struct-0.0.2}/src/mic/grpc/__init__.py +0 -0
  53. {mic_struct-0.0.1 → mic_struct-0.0.2}/src/mic/grpc/client.py +0 -0
  54. {mic_struct-0.0.1 → mic_struct-0.0.2}/src/mic/grpc/errors.py +0 -0
  55. {mic_struct-0.0.1 → mic_struct-0.0.2}/src/mic/grpc/interceptors.py +0 -0
  56. {mic_struct-0.0.1 → mic_struct-0.0.2}/src/mic/grpc/rpc_spec.py +0 -0
  57. {mic_struct-0.0.1 → mic_struct-0.0.2}/src/mic/grpc/server.py +0 -0
  58. {mic_struct-0.0.1 → mic_struct-0.0.2}/src/mic/grpc/spec.py +0 -0
  59. {mic_struct-0.0.1 → mic_struct-0.0.2}/src/mic/healthcheck/__init__.py +0 -0
  60. {mic_struct-0.0.1 → mic_struct-0.0.2}/src/mic/http/__init__.py +0 -0
  61. {mic_struct-0.0.1 → mic_struct-0.0.2}/src/mic/http/api_key.py +0 -0
  62. {mic_struct-0.0.1 → mic_struct-0.0.2}/src/mic/http/auth_gate.py +0 -0
  63. {mic_struct-0.0.1 → mic_struct-0.0.2}/src/mic/http/basic_auth.py +0 -0
  64. {mic_struct-0.0.1 → mic_struct-0.0.2}/src/mic/http/bearer.py +0 -0
  65. {mic_struct-0.0.1 → mic_struct-0.0.2}/src/mic/http/correlation.py +0 -0
  66. {mic_struct-0.0.1 → mic_struct-0.0.2}/src/mic/http/csrf.py +0 -0
  67. {mic_struct-0.0.1 → mic_struct-0.0.2}/src/mic/http/request_context.py +0 -0
  68. {mic_struct-0.0.1 → mic_struct-0.0.2}/src/mic/http/route_spec.py +0 -0
  69. {mic_struct-0.0.1 → mic_struct-0.0.2}/src/mic/idempotency/__init__.py +0 -0
  70. {mic_struct-0.0.1 → mic_struct-0.0.2}/src/mic/idempotency/store.py +0 -0
  71. {mic_struct-0.0.1 → mic_struct-0.0.2}/src/mic/litestar/__init__.py +0 -0
  72. {mic_struct-0.0.1 → mic_struct-0.0.2}/src/mic/litestar/_resolve.py +0 -0
  73. {mic_struct-0.0.1 → mic_struct-0.0.2}/src/mic/litestar/middlewares.py +0 -0
  74. {mic_struct-0.0.1 → mic_struct-0.0.2}/src/mic/litestar/router.py +0 -0
  75. {mic_struct-0.0.1 → mic_struct-0.0.2}/src/mic/locking/__init__.py +0 -0
  76. {mic_struct-0.0.1 → mic_struct-0.0.2}/src/mic/locking/base.py +0 -0
  77. {mic_struct-0.0.1 → mic_struct-0.0.2}/src/mic/locking/in_memory.py +0 -0
  78. {mic_struct-0.0.1 → mic_struct-0.0.2}/src/mic/locking/lock_handle.py +0 -0
  79. {mic_struct-0.0.1 → mic_struct-0.0.2}/src/mic/locking/redis_backend.py +0 -0
  80. {mic_struct-0.0.1 → mic_struct-0.0.2}/src/mic/locking/scope.py +0 -0
  81. {mic_struct-0.0.1 → mic_struct-0.0.2}/src/mic/model/__init__.py +0 -0
  82. {mic_struct-0.0.1 → mic_struct-0.0.2}/src/mic/model/errors.py +0 -0
  83. {mic_struct-0.0.1 → mic_struct-0.0.2}/src/mic/observability/__init__.py +0 -0
  84. {mic_struct-0.0.1 → mic_struct-0.0.2}/src/mic/observability/caller.py +0 -0
  85. {mic_struct-0.0.1 → mic_struct-0.0.2}/src/mic/observability/circuit_breaker_metrics.py +0 -0
  86. {mic_struct-0.0.1 → mic_struct-0.0.2}/src/mic/observability/log_context_middleware.py +0 -0
  87. {mic_struct-0.0.1 → mic_struct-0.0.2}/src/mic/observability/logging.py +0 -0
  88. {mic_struct-0.0.1 → mic_struct-0.0.2}/src/mic/observability/metrics.py +0 -0
  89. {mic_struct-0.0.1 → mic_struct-0.0.2}/src/mic/observability/metrics_backend.py +0 -0
  90. {mic_struct-0.0.1 → mic_struct-0.0.2}/src/mic/observability/metrics_guard.py +0 -0
  91. {mic_struct-0.0.1 → mic_struct-0.0.2}/src/mic/observability/redact_logs.py +0 -0
  92. {mic_struct-0.0.1 → mic_struct-0.0.2}/src/mic/observability/redact_traces.py +0 -0
  93. {mic_struct-0.0.1 → mic_struct-0.0.2}/src/mic/observability/sentry.py +0 -0
  94. {mic_struct-0.0.1 → mic_struct-0.0.2}/src/mic/observability/tracing.py +0 -0
  95. {mic_struct-0.0.1 → mic_struct-0.0.2}/src/mic/observability/tracing_middleware.py +0 -0
  96. {mic_struct-0.0.1 → mic_struct-0.0.2}/src/mic/outbox/__init__.py +0 -0
  97. {mic_struct-0.0.1 → mic_struct-0.0.2}/src/mic/outbox/base.py +0 -0
  98. {mic_struct-0.0.1 → mic_struct-0.0.2}/src/mic/outbox/dispatcher.py +0 -0
  99. {mic_struct-0.0.1 → mic_struct-0.0.2}/src/mic/outbox/event.py +0 -0
  100. {mic_struct-0.0.1 → mic_struct-0.0.2}/src/mic/outbox/in_memory.py +0 -0
  101. {mic_struct-0.0.1 → mic_struct-0.0.2}/src/mic/outbox/sanitize.py +0 -0
  102. {mic_struct-0.0.1 → mic_struct-0.0.2}/src/mic/outbox/sql.py +0 -0
  103. {mic_struct-0.0.1 → mic_struct-0.0.2}/src/mic/py.typed +0 -0
  104. {mic_struct-0.0.1 → mic_struct-0.0.2}/src/mic/queue/__init__.py +0 -0
  105. {mic_struct-0.0.1 → mic_struct-0.0.2}/src/mic/queue/base.py +0 -0
  106. {mic_struct-0.0.1 → mic_struct-0.0.2}/src/mic/queue/in_memory.py +0 -0
  107. {mic_struct-0.0.1 → mic_struct-0.0.2}/src/mic/queue/kafka.py +0 -0
  108. {mic_struct-0.0.1 → mic_struct-0.0.2}/src/mic/queue/nats.py +0 -0
  109. {mic_struct-0.0.1 → mic_struct-0.0.2}/src/mic/ratelimit/__init__.py +0 -0
  110. {mic_struct-0.0.1 → mic_struct-0.0.2}/src/mic/ratelimit/base.py +0 -0
  111. {mic_struct-0.0.1 → mic_struct-0.0.2}/src/mic/ratelimit/in_memory.py +0 -0
  112. {mic_struct-0.0.1 → mic_struct-0.0.2}/src/mic/ratelimit/middleware.py +0 -0
  113. {mic_struct-0.0.1 → mic_struct-0.0.2}/src/mic/ratelimit/redis_backend.py +0 -0
  114. {mic_struct-0.0.1 → mic_struct-0.0.2}/src/mic/ratelimit/spec.py +0 -0
  115. {mic_struct-0.0.1 → mic_struct-0.0.2}/src/mic/read_models/__init__.py +0 -0
  116. {mic_struct-0.0.1 → mic_struct-0.0.2}/src/mic/read_models/counter.py +0 -0
  117. {mic_struct-0.0.1 → mic_struct-0.0.2}/src/mic/read_models/leaderboard.py +0 -0
  118. {mic_struct-0.0.1 → mic_struct-0.0.2}/src/mic/read_models/membership_set.py +0 -0
  119. {mic_struct-0.0.1 → mic_struct-0.0.2}/src/mic/read_models/timeline.py +0 -0
  120. {mic_struct-0.0.1 → mic_struct-0.0.2}/src/mic/read_models/unique_count.py +0 -0
  121. {mic_struct-0.0.1 → mic_struct-0.0.2}/src/mic/realtime/__init__.py +0 -0
  122. {mic_struct-0.0.1 → mic_struct-0.0.2}/src/mic/realtime/auth.py +0 -0
  123. {mic_struct-0.0.1 → mic_struct-0.0.2}/src/mic/realtime/backend.py +0 -0
  124. {mic_struct-0.0.1 → mic_struct-0.0.2}/src/mic/realtime/endpoint.py +0 -0
  125. {mic_struct-0.0.1 → mic_struct-0.0.2}/src/mic/realtime/redis_streams.py +0 -0
  126. {mic_struct-0.0.1 → mic_struct-0.0.2}/src/mic/realtime/room.py +0 -0
  127. {mic_struct-0.0.1 → mic_struct-0.0.2}/src/mic/resilience/__init__.py +0 -0
  128. {mic_struct-0.0.1 → mic_struct-0.0.2}/src/mic/resilience/circuit_breaker.py +0 -0
  129. {mic_struct-0.0.1 → mic_struct-0.0.2}/src/mic/response_cache/__init__.py +0 -0
  130. {mic_struct-0.0.1 → mic_struct-0.0.2}/src/mic/response_cache/_stampede.py +0 -0
  131. {mic_struct-0.0.1 → mic_struct-0.0.2}/src/mic/response_cache/_storage.py +0 -0
  132. {mic_struct-0.0.1 → mic_struct-0.0.2}/src/mic/response_cache/middleware.py +0 -0
  133. {mic_struct-0.0.1 → mic_struct-0.0.2}/src/mic/response_cache/rule.py +0 -0
  134. {mic_struct-0.0.1 → mic_struct-0.0.2}/src/mic/shard/__init__.py +0 -0
  135. {mic_struct-0.0.1 → mic_struct-0.0.2}/src/mic/shard/selector.py +0 -0
  136. {mic_struct-0.0.1 → mic_struct-0.0.2}/src/mic/shard/session_factory.py +0 -0
  137. {mic_struct-0.0.1 → mic_struct-0.0.2}/template/cookiecutter.json +0 -0
  138. {mic_struct-0.0.1 → mic_struct-0.0.2}/template/hooks/post_gen_project.py +0 -0
  139. {mic_struct-0.0.1 → mic_struct-0.0.2}/template/hooks/pre_gen_project.py +0 -0
  140. {mic_struct-0.0.1 → mic_struct-0.0.2}/template/{{cookiecutter.service_name}}/.gitignore +0 -0
  141. {mic_struct-0.0.1 → mic_struct-0.0.2}/template/{{cookiecutter.service_name}}/.python-version +0 -0
  142. {mic_struct-0.0.1 → mic_struct-0.0.2}/template/{{cookiecutter.service_name}}/README.md +0 -0
  143. {mic_struct-0.0.1 → mic_struct-0.0.2}/template/{{cookiecutter.service_name}}/alembic/env.py +0 -0
  144. {mic_struct-0.0.1 → mic_struct-0.0.2}/template/{{cookiecutter.service_name}}/alembic/script.py.mako +0 -0
  145. {mic_struct-0.0.1 → mic_struct-0.0.2}/template/{{cookiecutter.service_name}}/alembic/versions/20260507_baseline_widgets.py +0 -0
  146. {mic_struct-0.0.1 → mic_struct-0.0.2}/template/{{cookiecutter.service_name}}/alembic.ini +0 -0
  147. {mic_struct-0.0.1 → mic_struct-0.0.2}/template/{{cookiecutter.service_name}}/app/__init__.py +0 -0
  148. {mic_struct-0.0.1 → mic_struct-0.0.2}/template/{{cookiecutter.service_name}}/app/bootstrap/__init__.py +0 -0
  149. {mic_struct-0.0.1 → mic_struct-0.0.2}/template/{{cookiecutter.service_name}}/app/bootstrap/config/__init__.py +0 -0
  150. {mic_struct-0.0.1 → mic_struct-0.0.2}/template/{{cookiecutter.service_name}}/app/bootstrap/config/settings.py +0 -0
  151. {mic_struct-0.0.1 → mic_struct-0.0.2}/template/{{cookiecutter.service_name}}/app/bootstrap/context/__init__.py +0 -0
  152. {mic_struct-0.0.1 → mic_struct-0.0.2}/template/{{cookiecutter.service_name}}/app/bootstrap/context/execution_context.py +0 -0
  153. {mic_struct-0.0.1 → mic_struct-0.0.2}/template/{{cookiecutter.service_name}}/app/bootstrap/providers/__init__.py +0 -0
  154. {mic_struct-0.0.1 → mic_struct-0.0.2}/template/{{cookiecutter.service_name}}/app/bootstrap/providers/auth.py +0 -0
  155. {mic_struct-0.0.1 → mic_struct-0.0.2}/template/{{cookiecutter.service_name}}/app/bootstrap/providers/database.py +0 -0
  156. {mic_struct-0.0.1 → mic_struct-0.0.2}/template/{{cookiecutter.service_name}}/app/bootstrap/startup/__init__.py +0 -0
  157. {mic_struct-0.0.1 → mic_struct-0.0.2}/template/{{cookiecutter.service_name}}/app/bootstrap/startup/http_routes.py +0 -0
  158. {mic_struct-0.0.1 → mic_struct-0.0.2}/template/{{cookiecutter.service_name}}/app/bootstrap/startup/http_runtime.py +0 -0
  159. {mic_struct-0.0.1 → mic_struct-0.0.2}/template/{{cookiecutter.service_name}}/app/bootstrap/wiring/__init__.py +0 -0
  160. {mic_struct-0.0.1 → mic_struct-0.0.2}/template/{{cookiecutter.service_name}}/app/bootstrap/wiring/system.py +0 -0
  161. {mic_struct-0.0.1 → mic_struct-0.0.2}/template/{{cookiecutter.service_name}}/app/bootstrap/wiring/widgets.py +0 -0
  162. {mic_struct-0.0.1 → mic_struct-0.0.2}/template/{{cookiecutter.service_name}}/app/entrypoints/__init__.py +0 -0
  163. {mic_struct-0.0.1 → mic_struct-0.0.2}/template/{{cookiecutter.service_name}}/app/entrypoints/cli/__init__.py +0 -0
  164. {mic_struct-0.0.1 → mic_struct-0.0.2}/template/{{cookiecutter.service_name}}/app/entrypoints/http/__init__.py +0 -0
  165. {mic_struct-0.0.1 → mic_struct-0.0.2}/template/{{cookiecutter.service_name}}/app/entrypoints/http/main.py +0 -0
  166. {mic_struct-0.0.1 → mic_struct-0.0.2}/template/{{cookiecutter.service_name}}/app/frameworks/__init__.py +0 -0
  167. {mic_struct-0.0.1 → mic_struct-0.0.2}/template/{{cookiecutter.service_name}}/app/frameworks/cli/__init__.py +0 -0
  168. {mic_struct-0.0.1 → mic_struct-0.0.2}/template/{{cookiecutter.service_name}}/app/frameworks/fastapi/__init__.py +0 -0
  169. {mic_struct-0.0.1 → mic_struct-0.0.2}/template/{{cookiecutter.service_name}}/app/frameworks/fastapi/middlewares/__init__.py +0 -0
  170. {mic_struct-0.0.1 → mic_struct-0.0.2}/template/{{cookiecutter.service_name}}/app/frameworks/fastapi/middlewares/auth.py +0 -0
  171. {mic_struct-0.0.1 → mic_struct-0.0.2}/template/{{cookiecutter.service_name}}/app/frameworks/litestar/__init__.py +0 -0
  172. {mic_struct-0.0.1 → mic_struct-0.0.2}/template/{{cookiecutter.service_name}}/app/modules/__init__.py +0 -0
  173. {mic_struct-0.0.1 → mic_struct-0.0.2}/template/{{cookiecutter.service_name}}/app/modules/system/__init__.py +0 -0
  174. {mic_struct-0.0.1 → mic_struct-0.0.2}/template/{{cookiecutter.service_name}}/app/modules/system/controller/__init__.py +0 -0
  175. {mic_struct-0.0.1 → mic_struct-0.0.2}/template/{{cookiecutter.service_name}}/app/modules/system/controller/health.py +0 -0
  176. {mic_struct-0.0.1 → mic_struct-0.0.2}/template/{{cookiecutter.service_name}}/app/modules/system/controller/readiness.py +0 -0
  177. {mic_struct-0.0.1 → mic_struct-0.0.2}/template/{{cookiecutter.service_name}}/app/modules/system/interface/__init__.py +0 -0
  178. {mic_struct-0.0.1 → mic_struct-0.0.2}/template/{{cookiecutter.service_name}}/app/modules/system/interface/http/__init__.py +0 -0
  179. {mic_struct-0.0.1 → mic_struct-0.0.2}/template/{{cookiecutter.service_name}}/app/modules/system/interface/http/routes.py +0 -0
  180. {mic_struct-0.0.1 → mic_struct-0.0.2}/template/{{cookiecutter.service_name}}/app/modules/widgets/__init__.py +0 -0
  181. {mic_struct-0.0.1 → mic_struct-0.0.2}/template/{{cookiecutter.service_name}}/app/modules/widgets/controller/__init__.py +0 -0
  182. {mic_struct-0.0.1 → mic_struct-0.0.2}/template/{{cookiecutter.service_name}}/app/modules/widgets/controller/create_widget.py +0 -0
  183. {mic_struct-0.0.1 → mic_struct-0.0.2}/template/{{cookiecutter.service_name}}/app/modules/widgets/controller/read_widget.py +0 -0
  184. {mic_struct-0.0.1 → mic_struct-0.0.2}/template/{{cookiecutter.service_name}}/app/modules/widgets/interface/__init__.py +0 -0
  185. {mic_struct-0.0.1 → mic_struct-0.0.2}/template/{{cookiecutter.service_name}}/app/modules/widgets/interface/http/__init__.py +0 -0
  186. {mic_struct-0.0.1 → mic_struct-0.0.2}/template/{{cookiecutter.service_name}}/app/modules/widgets/interface/http/payloads.py +0 -0
  187. {mic_struct-0.0.1 → mic_struct-0.0.2}/template/{{cookiecutter.service_name}}/app/modules/widgets/interface/http/routes.py +0 -0
  188. {mic_struct-0.0.1 → mic_struct-0.0.2}/template/{{cookiecutter.service_name}}/app/modules/widgets/model/__init__.py +0 -0
  189. {mic_struct-0.0.1 → mic_struct-0.0.2}/template/{{cookiecutter.service_name}}/app/modules/widgets/model/persistence/__init__.py +0 -0
  190. {mic_struct-0.0.1 → mic_struct-0.0.2}/template/{{cookiecutter.service_name}}/app/modules/widgets/model/persistence/widget.py +0 -0
  191. {mic_struct-0.0.1 → mic_struct-0.0.2}/template/{{cookiecutter.service_name}}/app/modules/widgets/model/repositories/__init__.py +0 -0
  192. {mic_struct-0.0.1 → mic_struct-0.0.2}/template/{{cookiecutter.service_name}}/app/platform/__init__.py +0 -0
  193. {mic_struct-0.0.1 → mic_struct-0.0.2}/template/{{cookiecutter.service_name}}/app/platform/services/__init__.py +0 -0
  194. {mic_struct-0.0.1 → mic_struct-0.0.2}/template/{{cookiecutter.service_name}}/app/shared/__init__.py +0 -0
  195. {mic_struct-0.0.1 → mic_struct-0.0.2}/template/{{cookiecutter.service_name}}/pyproject.toml +0 -0
  196. {mic_struct-0.0.1 → mic_struct-0.0.2}/template/{{cookiecutter.service_name}}/tools/bump_service.py +0 -0
@@ -5,7 +5,24 @@ All notable changes to **mic-struct** are documented in this file.
5
5
  The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
- ## [0.0.1] — 2026-05-22
8
+ ## [Unreleased]
9
+
10
+ ## [0.0.2] — 2026-05-22
11
+
12
+ ### Fixed — `mic.healthcheck` : préservation du nom du probe sur exception (RDL-627)
13
+
14
+ `make_db_probe` et `make_callable_probe` capturent désormais l'exception
15
+ **à l'intérieur** du probe et retournent un `ProbeResult` unhealthy en
16
+ **préservant le `name`** canonique (+ `latency_ms`), au lieu de laisser
17
+ l'erreur remonter à `ReadinessChecker._run_probe_safely`, qui retombait sur
18
+ `getattr(probe, "__name__", "unknown_probe")` = `"_probe"` (nom perdu).
19
+ `make_cache_probe` avait déjà ce comportement — les trois factories sont
20
+ maintenant cohérentes.
21
+
22
+ Permet aux consumers (ex. rdlink-api `providers/readiness.py`, qui écrivait
23
+ ses probes `database`/`schema` à la main *uniquement* pour garder le nom)
24
+ d'utiliser directement les factories mic comme socle. Rétro-compatible : un
25
+ probe sain est inchangé ; seul le chemin d'exception gagne le nom correct.
9
26
 
10
27
  First public release of `mic-struct` — the building blocks below have
11
28
  been consolidated, hardened, and locked behind a 100 % line + branch
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mic-struct
3
- Version: 0.0.1
3
+ Version: 0.0.2
4
4
  Summary: Model/Interface/Controller boilerplate for Python services — FastAPI/Litestar parity, JWT service auth, SQLModel storage, Prometheus + JSON logs, cookiecutter scaffold
5
5
  Project-URL: Homepage, https://gitlab.com/mic-struct/mic-struct
6
6
  Project-URL: Documentation, https://gitlab.com/mic-struct/mic-struct/-/blob/master/README.md
@@ -7,7 +7,7 @@ name = "mic-struct"
7
7
  # First public release. Pre-1.0 (0.x) : per semver, minor bumps may carry
8
8
  # breaking changes. Consumers constrain with ">=0.0.1,<1.0.0" (the existing
9
9
  # ">=0.0.1.dev0,<1.0.0" pins also accept this release).
10
- version = "0.0.1"
10
+ version = "0.0.2"
11
11
  description = "Model/Interface/Controller boilerplate for Python services — FastAPI/Litestar parity, JWT service auth, SQLModel storage, Prometheus + JSON logs, cookiecutter scaffold"
12
12
  readme = "README.md"
13
13
  requires-python = ">=3.14"
@@ -5,5 +5,5 @@ Cf. README.md et CONTRIBUTING.md.
5
5
 
6
6
  from __future__ import annotations
7
7
 
8
- __version__ = "0.0.1"
8
+ __version__ = "0.0.2"
9
9
  __all__ = ["__version__"]
@@ -147,11 +147,27 @@ def make_db_probe(
147
147
  Accepte n'importe quel :class:`mic.datastorage.DataStorage` (``SqlDataStorage``,
148
148
  ``DocumentDataStorage``, ``GraphDataStorage``, ...) — tous ont la méthode
149
149
  ``check_health`` par contrat ABC.
150
+
151
+ Si ``check_health()`` **lève** (engine raise-based plutôt que bool), le
152
+ probe capture l'exception et retourne un ``ProbeResult`` unhealthy en
153
+ **préservant le ``name``** (sans laisser l'erreur remonter à
154
+ :func:`_run_probe_safely`, qui perdrait le nom canonique). Un consumer
155
+ n'a donc plus besoin d'écrire un probe try/except à la main juste pour
156
+ garder le nom.
150
157
  """
151
158
 
152
159
  def _probe() -> ProbeResult:
153
160
  t0 = time_fn()
154
- ok = storage.check_health()
161
+ try:
162
+ ok = storage.check_health()
163
+ except Exception as exc:
164
+ elapsed_ms = (time_fn() - t0) * 1000.0
165
+ return ProbeResult(
166
+ name=name,
167
+ healthy=False,
168
+ message=f"{type(exc).__name__}: {exc}",
169
+ latency_ms=round(elapsed_ms, 2),
170
+ )
155
171
  elapsed_ms = (time_fn() - t0) * 1000.0
156
172
  return ProbeResult(
157
173
  name=name,
@@ -210,13 +226,26 @@ def make_callable_probe(
210
226
  """Construit un probe à partir d'un callable bool. Pour les cas
211
227
  custom (upstream HTTP, message broker, ...).
212
228
 
213
- ``fn`` retourne ``True`` si OK, ``False`` sinon. Si ``fn`` lève,
214
- le probe capture en ``healthy=False`` avec le message.
229
+ ``fn`` retourne ``True`` si OK, ``False`` sinon. Si ``fn`` **lève**, le
230
+ probe capture l'exception et retourne ``healthy=False`` en **préservant
231
+ le ``name``** (l'erreur ne remonte pas à :func:`_run_probe_safely`, qui
232
+ retomberait sur ``"_probe"``). Le nom canonique est donc garanti dans le
233
+ ``ProbeResult``, succès comme échec — plus besoin d'un probe maison juste
234
+ pour ça.
215
235
  """
216
236
 
217
237
  def _probe() -> ProbeResult:
218
238
  t0 = time_fn()
219
- ok = fn()
239
+ try:
240
+ ok = fn()
241
+ except Exception as exc:
242
+ elapsed_ms = (time_fn() - t0) * 1000.0
243
+ return ProbeResult(
244
+ name=name,
245
+ healthy=False,
246
+ message=f"{type(exc).__name__}: {exc}",
247
+ latency_ms=round(elapsed_ms, 2),
248
+ )
220
249
  elapsed_ms = (time_fn() - t0) * 1000.0
221
250
  return ProbeResult(
222
251
  name=name,
File without changes
File without changes
File without changes
File without changes
File without changes