MIC — fondations agnostiques (contracts, model, http, auth, client, observability, healthcheck, resilience, cli, grpc).
Project description
mic-core
Fondations agnostiques du framework MIC (Model / Interface / Controller).
mic-core est le socle : il ne dépend d'aucune brique de persistance ni de
plateforme (voir le DAG platform → data → core dans
../README.md).
Modules
| Module | Rôle |
|---|---|
mic.contracts |
Contrats / DTO partagés inter-couches |
mic.model |
Erreurs de domaine (DomainError, TransientError), value objects |
mic.http |
Spécifications HTTP agnostiques (HttpRouteSpec, HttpResponseSpec, HttpCookieSpec, HttpRequestContext) |
mic.fastapi |
Adaptateur FastAPI (router builder, middlewares) — extra [fastapi] |
mic.litestar |
Adaptateur Litestar — extra [litestar] |
mic.auth |
JWT service-to-service (signer/verifier) — extra [auth] |
mic.client |
Client HTTP inter-services (httpx) — extra [client] |
mic.observability |
Logs JSON, métriques Prometheus, traces OTel — extra [observability] / [full-observability] |
mic.healthcheck |
Sondes liveness/readiness |
mic.resilience |
Circuit breaker, retry, timeouts |
mic.cli |
Squelette CLI (argparse stdlib) — extra [cli] |
mic.grpc |
Transport gRPC — extra [grpc] |
mic.event_replay |
Replay d'events archivés vers un bus (CLI mic-events-replay) |
Le paquet est un namespace PEP 420 (pas de mic/__init__.py) : import mic.*
reste identique côté consommateur, qu'on installe mic-core seul ou avec
mic-datastore / mic-platform.
Replay d'events (mic-events-replay)
Rejoue des events archivés (DLQ outbox exportée en JSON, ou archive ClickHouse long-terme) vers un sink. Cas d'usage : audit forensic, bug-fix rétroactif (un handler a swallow des events pendant N heures → on les rejoue après fix), amorçage d'un nouveau read-model depuis l'historique.
# Dry-run (compte uniquement) depuis un dump JSON
mic-events-replay --from-json dump.json \
--topic mail.send --from 2026-06-22T08:00:00Z --to 2026-06-22T10:00:00Z
# Source ClickHouse + filtre payload (répétable)
mic-events-replay --from-clickhouse http://clickhouse.svc:8123 \
--topic mail.send --from 2026-06-22T08:00:00Z --to 2026-06-22T10:00:00Z \
--filter to_email=user@example.com
# Sink NATS JetStream (republie avec header x-replay) — extra mic-datastore[nats]
mic-events-replay --from-clickhouse http://clickhouse.svc:8123 \
--topic mail.send --from ... --to ... \
--to-nats nats://nats-0:4222,nats://nats-1:4222 --nats-stream events
Sinks : aucun = dry-run ; --target module:callable = callback sync ;
--to-nats = NATS JetStream. Exit 0 = OK, 1 = aucun event matché
(topic/range mal pinnés ?), 2 = erreur de setup.
Convention header x-replay
Chaque event republié via --to-nats porte deux headers transport
(le payload n'est pas réécrit — flag transparent) :
| Header | Valeur |
|---|---|
x-replay |
true |
x-replay-batch-id |
UUID unique par invocation (corrélation / traçabilité) |
⚠️ Les consumers doivent être idempotents — un replay redélivre des events
déjà traités. Un consumer idempotent (clé dérivée de event_id / original_id,
ou opérations naturellement idempotentes) absorbe les replays sans effet de
bord ; le header x-replay lui permet en plus de tracer ou ignorer
explicitement un replay sans changer son décodage de payload. Le support des
headers est fourni par mic.queue (cf. mic-datastore).
Installation
pip install "mic-core[fastapi,auth,client,observability]"
Extras
| Extra | Tire |
|---|---|
fastapi |
fastapi + uvicorn[standard] + starlette |
litestar |
litestar |
auth |
pyjwt |
client |
httpx |
observability |
prometheus-client + opentelemetry-api |
sentry |
sentry-sdk (+ urllib3 patché) |
tracing |
opentelemetry-sdk + exporter OTLP |
full-observability |
observability + sentry + tracing |
grpc |
grpcio + grpcio-health-checking |
cli |
(rien — argparse stdlib) |
Versionnage
mic-core démarre en 0.x (pré-releases dev/rc sur TestPyPI). Il graduera
en 1.0 une fois les frontières prouvées et les services migrés (fin du split,
cf. ADR-0001).
En 0.x, un bump minor peut porter un changement cassant (SemVer 0.x) —
contraindre avec >=0.1,<1.
Release
Voir ../../RELEASING.md § « Release par paquet »
(make release-pkg PKG=core VERSION=x.y.z → tag core-vX.Y.Z).
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file mic_core-0.1.15.tar.gz.
File metadata
- Download URL: mic_core-0.1.15.tar.gz
- Upload date:
- Size: 115.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.6
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8c19fc73c874144237848863e08cdcb1d047a9c5618591aaf68a2c8c6dd18419
|
|
| MD5 |
94a3d859e9a6d5696a2c0ae5c5ba373f
|
|
| BLAKE2b-256 |
996c15627976097cbbd77620b469252437a1047aa60b96c700ab47978283e13a
|
File details
Details for the file mic_core-0.1.15-py3-none-any.whl.
File metadata
- Download URL: mic_core-0.1.15-py3-none-any.whl
- Upload date:
- Size: 152.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.6
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
45fd948bad853c692342e48f6f5b6a8ef239b9244e33295444e96e736b872858
|
|
| MD5 |
4c4a39361b65d9a59d080f08964ba372
|
|
| BLAKE2b-256 |
66c539c3a46dbb5825ef1b13382f9b03f7495ea88b7b06fa837a12d73b0b2fed
|