El paquete se divide en un núcleo pequeño y dos módulos funcionales.
src/DKOps/
├── launcher.py crea la SparkSession y el EnvironmentConfig
├── environment_config.py resuelve catálogos, rutas y entorno
├── logger_config.py AppLogger y LoggableMixin
├── ingestion/ de Landing a Silver
└── table_governance/ contratos, escritura, lectura y migraciones
ingestion/
├── engine.py IngestionEngine, el orquestador
├── bronze_ingestor.py Landing a Bronze
├── silver_promoter.py Bronze a Silver
├── contracts/ IngestionContract y su loader
├── readers/ lectores de fuentes y su factory
├── strategies/ las cuatro estrategias de promoción
├── enrichment/metadata.py columnas técnicas de ingesta
└── ops/ops_logger.py tabla de control operativo
flowchart LR
subgraph contracts["Contratos JSON"]
BC["ingestion/batch"]
SC["ingestion/streaming"]
SV["ingestion/silver"]
end
subgraph engine["IngestionEngine"]
BI["BronzeIngestor"]
SS["run_streaming()"]
SP["SilverPromoter"]
end
subgraph strategies["Estrategias"]
FM["full_merge"]
CM["cdc_merge"]
IR["incremental_replace"]
AD["append_dedup"]
end
BC --> BI
SC --> SS
SV --> SP
SP --> FM & CM & IR & AD
Componente
Responsabilidad
IngestionEngine
Carga los contratos y expone ingest_bronze(), run_streaming(), promote_silver() y status().
BronzeIngestor
Lee la fuente, añade columnas técnicas y escribe en Bronze.
SilverPromoter
Lee Bronze y delega la escritura en la estrategia del contrato.
SourceReaderFactory
Elige el reader adecuado según el formato y el runtime.
MetadataEnricher
Añade _ingested_at, _ingested_date y _source_file.
IngestionOpsLogger
Registra el inicio y el cierre de cada dataset en una tabla Delta.