pycharter 0.0.22__py3-none-any.whl → 0.0.24__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- api/main.py +27 -1
- api/models/docs.py +68 -0
- api/models/evolution.py +117 -0
- api/models/tracking.py +111 -0
- api/models/validation.py +46 -6
- api/routes/v1/__init__.py +14 -1
- api/routes/v1/docs.py +187 -0
- api/routes/v1/evolution.py +337 -0
- api/routes/v1/templates.py +211 -27
- api/routes/v1/tracking.py +301 -0
- api/routes/v1/validation.py +68 -31
- pycharter/__init__.py +268 -58
- pycharter/data/templates/contract/template_coercion_rules.yaml +57 -0
- pycharter/data/templates/contract/template_contract.yaml +122 -0
- pycharter/data/templates/contract/template_metadata.yaml +68 -0
- pycharter/data/templates/contract/template_schema.yaml +100 -0
- pycharter/data/templates/contract/template_validation_rules.yaml +75 -0
- pycharter/data/templates/etl/README.md +224 -0
- pycharter/data/templates/etl/extract_cloud_azure.yaml +24 -0
- pycharter/data/templates/etl/extract_cloud_gcs.yaml +25 -0
- pycharter/data/templates/etl/extract_cloud_s3.yaml +30 -0
- pycharter/data/templates/etl/extract_database.yaml +34 -0
- pycharter/data/templates/etl/extract_database_ssh.yaml +40 -0
- pycharter/data/templates/etl/extract_file_csv.yaml +21 -0
- pycharter/data/templates/etl/extract_file_glob.yaml +25 -0
- pycharter/data/templates/etl/extract_file_json.yaml +24 -0
- pycharter/data/templates/etl/extract_file_parquet.yaml +20 -0
- pycharter/data/templates/etl/extract_http_paginated.yaml +79 -0
- pycharter/data/templates/etl/extract_http_path_params.yaml +38 -0
- pycharter/data/templates/etl/extract_http_simple.yaml +62 -0
- pycharter/data/templates/etl/load_cloud_azure.yaml +24 -0
- pycharter/data/templates/etl/load_cloud_gcs.yaml +22 -0
- pycharter/data/templates/etl/load_cloud_s3.yaml +27 -0
- pycharter/data/templates/etl/load_file.yaml +34 -0
- pycharter/data/templates/etl/load_insert.yaml +18 -0
- pycharter/data/templates/etl/load_postgresql.yaml +39 -0
- pycharter/data/templates/etl/load_sqlite.yaml +21 -0
- pycharter/data/templates/etl/load_truncate_and_load.yaml +20 -0
- pycharter/data/templates/etl/load_upsert.yaml +25 -0
- pycharter/data/templates/etl/load_with_dlq.yaml +34 -0
- pycharter/data/templates/etl/load_with_ssh_tunnel.yaml +35 -0
- pycharter/data/templates/etl/pipeline_http_to_db.yaml +75 -0
- pycharter/data/templates/etl/transform_combined.yaml +48 -0
- pycharter/data/templates/etl/transform_custom_function.yaml +58 -0
- pycharter/data/templates/etl/transform_jsonata.yaml +51 -0
- pycharter/data/templates/etl/transform_simple.yaml +59 -0
- pycharter/db/schemas/.ipynb_checkpoints/data_contract-checkpoint.py +160 -0
- pycharter/docs_generator/__init__.py +43 -0
- pycharter/docs_generator/generator.py +465 -0
- pycharter/docs_generator/renderers.py +247 -0
- pycharter/etl_generator/__init__.py +168 -80
- pycharter/etl_generator/builder.py +121 -0
- pycharter/etl_generator/config_loader.py +394 -0
- pycharter/etl_generator/config_validator.py +418 -0
- pycharter/etl_generator/context.py +132 -0
- pycharter/etl_generator/expression.py +499 -0
- pycharter/etl_generator/extractors/__init__.py +30 -0
- pycharter/etl_generator/extractors/base.py +70 -0
- pycharter/etl_generator/extractors/cloud_storage.py +530 -0
- pycharter/etl_generator/extractors/database.py +221 -0
- pycharter/etl_generator/extractors/factory.py +185 -0
- pycharter/etl_generator/extractors/file.py +475 -0
- pycharter/etl_generator/extractors/http.py +895 -0
- pycharter/etl_generator/extractors/streaming.py +57 -0
- pycharter/etl_generator/loaders/__init__.py +41 -0
- pycharter/etl_generator/loaders/base.py +35 -0
- pycharter/etl_generator/loaders/cloud.py +87 -0
- pycharter/etl_generator/loaders/cloud_storage_loader.py +275 -0
- pycharter/etl_generator/loaders/database.py +274 -0
- pycharter/etl_generator/loaders/factory.py +180 -0
- pycharter/etl_generator/loaders/file.py +72 -0
- pycharter/etl_generator/loaders/file_loader.py +130 -0
- pycharter/etl_generator/pipeline.py +743 -0
- pycharter/etl_generator/protocols.py +54 -0
- pycharter/etl_generator/result.py +63 -0
- pycharter/etl_generator/schemas/__init__.py +49 -0
- pycharter/etl_generator/transformers/__init__.py +49 -0
- pycharter/etl_generator/transformers/base.py +63 -0
- pycharter/etl_generator/transformers/config.py +45 -0
- pycharter/etl_generator/transformers/custom_function.py +101 -0
- pycharter/etl_generator/transformers/jsonata_transformer.py +56 -0
- pycharter/etl_generator/transformers/operations.py +218 -0
- pycharter/etl_generator/transformers/pipeline.py +54 -0
- pycharter/etl_generator/transformers/simple_operations.py +131 -0
- pycharter/quality/__init__.py +25 -0
- pycharter/quality/tracking/__init__.py +64 -0
- pycharter/quality/tracking/collector.py +318 -0
- pycharter/quality/tracking/exporters.py +238 -0
- pycharter/quality/tracking/models.py +194 -0
- pycharter/quality/tracking/store.py +385 -0
- pycharter/runtime_validator/__init__.py +20 -7
- pycharter/runtime_validator/builder.py +328 -0
- pycharter/runtime_validator/validator.py +311 -7
- pycharter/runtime_validator/validator_core.py +61 -0
- pycharter/schema_evolution/__init__.py +61 -0
- pycharter/schema_evolution/compatibility.py +270 -0
- pycharter/schema_evolution/diff.py +496 -0
- pycharter/schema_evolution/models.py +201 -0
- pycharter/shared/__init__.py +56 -0
- pycharter/shared/errors.py +296 -0
- pycharter/shared/protocols.py +234 -0
- {pycharter-0.0.22.dist-info → pycharter-0.0.24.dist-info}/METADATA +146 -26
- pycharter-0.0.24.dist-info/RECORD +543 -0
- {pycharter-0.0.22.dist-info → pycharter-0.0.24.dist-info}/WHEEL +1 -1
- ui/static/404/index.html +1 -1
- ui/static/404.html +1 -1
- ui/static/__next.__PAGE__.txt +1 -1
- ui/static/__next._full.txt +1 -1
- ui/static/__next._head.txt +1 -1
- ui/static/__next._index.txt +1 -1
- ui/static/__next._tree.txt +1 -1
- ui/static/_next/static/chunks/26dfc590f7714c03.js +1 -0
- ui/static/_next/static/chunks/34d289e6db2ef551.js +1 -0
- ui/static/_next/static/chunks/99508d9d5869cc27.js +1 -0
- ui/static/_next/static/chunks/b313c35a6ba76574.js +1 -0
- ui/static/_not-found/__next._full.txt +1 -1
- ui/static/_not-found/__next._head.txt +1 -1
- ui/static/_not-found/__next._index.txt +1 -1
- ui/static/_not-found/__next._not-found.__PAGE__.txt +1 -1
- ui/static/_not-found/__next._not-found.txt +1 -1
- ui/static/_not-found/__next._tree.txt +1 -1
- ui/static/_not-found/index.html +1 -1
- ui/static/_not-found/index.txt +1 -1
- ui/static/contracts/__next._full.txt +2 -2
- ui/static/contracts/__next._head.txt +1 -1
- ui/static/contracts/__next._index.txt +1 -1
- ui/static/contracts/__next._tree.txt +1 -1
- ui/static/contracts/__next.contracts.__PAGE__.txt +2 -2
- ui/static/contracts/__next.contracts.txt +1 -1
- ui/static/contracts/index.html +1 -1
- ui/static/contracts/index.txt +2 -2
- ui/static/documentation/__next._full.txt +1 -1
- ui/static/documentation/__next._head.txt +1 -1
- ui/static/documentation/__next._index.txt +1 -1
- ui/static/documentation/__next._tree.txt +1 -1
- ui/static/documentation/__next.documentation.__PAGE__.txt +1 -1
- ui/static/documentation/__next.documentation.txt +1 -1
- ui/static/documentation/index.html +2 -2
- ui/static/documentation/index.txt +1 -1
- ui/static/index.html +1 -1
- ui/static/index.txt +1 -1
- ui/static/metadata/__next._full.txt +1 -1
- ui/static/metadata/__next._head.txt +1 -1
- ui/static/metadata/__next._index.txt +1 -1
- ui/static/metadata/__next._tree.txt +1 -1
- ui/static/metadata/__next.metadata.__PAGE__.txt +1 -1
- ui/static/metadata/__next.metadata.txt +1 -1
- ui/static/metadata/index.html +1 -1
- ui/static/metadata/index.txt +1 -1
- ui/static/quality/__next._full.txt +2 -2
- ui/static/quality/__next._head.txt +1 -1
- ui/static/quality/__next._index.txt +1 -1
- ui/static/quality/__next._tree.txt +1 -1
- ui/static/quality/__next.quality.__PAGE__.txt +2 -2
- ui/static/quality/__next.quality.txt +1 -1
- ui/static/quality/index.html +2 -2
- ui/static/quality/index.txt +2 -2
- ui/static/rules/__next._full.txt +1 -1
- ui/static/rules/__next._head.txt +1 -1
- ui/static/rules/__next._index.txt +1 -1
- ui/static/rules/__next._tree.txt +1 -1
- ui/static/rules/__next.rules.__PAGE__.txt +1 -1
- ui/static/rules/__next.rules.txt +1 -1
- ui/static/rules/index.html +1 -1
- ui/static/rules/index.txt +1 -1
- ui/static/schemas/__next._full.txt +1 -1
- ui/static/schemas/__next._head.txt +1 -1
- ui/static/schemas/__next._index.txt +1 -1
- ui/static/schemas/__next._tree.txt +1 -1
- ui/static/schemas/__next.schemas.__PAGE__.txt +1 -1
- ui/static/schemas/__next.schemas.txt +1 -1
- ui/static/schemas/index.html +1 -1
- ui/static/schemas/index.txt +1 -1
- ui/static/settings/__next._full.txt +1 -1
- ui/static/settings/__next._head.txt +1 -1
- ui/static/settings/__next._index.txt +1 -1
- ui/static/settings/__next._tree.txt +1 -1
- ui/static/settings/__next.settings.__PAGE__.txt +1 -1
- ui/static/settings/__next.settings.txt +1 -1
- ui/static/settings/index.html +1 -1
- ui/static/settings/index.txt +1 -1
- ui/static/static/404/index.html +1 -1
- ui/static/static/404.html +1 -1
- ui/static/static/__next.__PAGE__.txt +1 -1
- ui/static/static/__next._full.txt +2 -2
- ui/static/static/__next._head.txt +1 -1
- ui/static/static/__next._index.txt +2 -2
- ui/static/static/__next._tree.txt +2 -2
- ui/static/static/_next/static/chunks/13d4a0fbd74c1ee4.js +1 -0
- ui/static/static/_next/static/chunks/2edb43b48432ac04.js +441 -0
- ui/static/static/_next/static/chunks/d2363397e1b2bcab.css +1 -0
- ui/static/static/_next/static/chunks/f7d1a90dd75d2572.js +1 -0
- ui/static/static/_not-found/__next._full.txt +2 -2
- ui/static/static/_not-found/__next._head.txt +1 -1
- ui/static/static/_not-found/__next._index.txt +2 -2
- ui/static/static/_not-found/__next._not-found.__PAGE__.txt +1 -1
- ui/static/static/_not-found/__next._not-found.txt +1 -1
- ui/static/static/_not-found/__next._tree.txt +2 -2
- ui/static/static/_not-found/index.html +1 -1
- ui/static/static/_not-found/index.txt +2 -2
- ui/static/static/contracts/__next._full.txt +3 -3
- ui/static/static/contracts/__next._head.txt +1 -1
- ui/static/static/contracts/__next._index.txt +2 -2
- ui/static/static/contracts/__next._tree.txt +2 -2
- ui/static/static/contracts/__next.contracts.__PAGE__.txt +2 -2
- ui/static/static/contracts/__next.contracts.txt +1 -1
- ui/static/static/contracts/index.html +1 -1
- ui/static/static/contracts/index.txt +3 -3
- ui/static/static/documentation/__next._full.txt +3 -3
- ui/static/static/documentation/__next._head.txt +1 -1
- ui/static/static/documentation/__next._index.txt +2 -2
- ui/static/static/documentation/__next._tree.txt +2 -2
- ui/static/static/documentation/__next.documentation.__PAGE__.txt +2 -2
- ui/static/static/documentation/__next.documentation.txt +1 -1
- ui/static/static/documentation/index.html +2 -2
- ui/static/static/documentation/index.txt +3 -3
- ui/static/static/index.html +1 -1
- ui/static/static/index.txt +2 -2
- ui/static/static/metadata/__next._full.txt +2 -2
- ui/static/static/metadata/__next._head.txt +1 -1
- ui/static/static/metadata/__next._index.txt +2 -2
- ui/static/static/metadata/__next._tree.txt +2 -2
- ui/static/static/metadata/__next.metadata.__PAGE__.txt +1 -1
- ui/static/static/metadata/__next.metadata.txt +1 -1
- ui/static/static/metadata/index.html +1 -1
- ui/static/static/metadata/index.txt +2 -2
- ui/static/static/quality/__next._full.txt +2 -2
- ui/static/static/quality/__next._head.txt +1 -1
- ui/static/static/quality/__next._index.txt +2 -2
- ui/static/static/quality/__next._tree.txt +2 -2
- ui/static/static/quality/__next.quality.__PAGE__.txt +1 -1
- ui/static/static/quality/__next.quality.txt +1 -1
- ui/static/static/quality/index.html +2 -2
- ui/static/static/quality/index.txt +2 -2
- ui/static/static/rules/__next._full.txt +2 -2
- ui/static/static/rules/__next._head.txt +1 -1
- ui/static/static/rules/__next._index.txt +2 -2
- ui/static/static/rules/__next._tree.txt +2 -2
- ui/static/static/rules/__next.rules.__PAGE__.txt +1 -1
- ui/static/static/rules/__next.rules.txt +1 -1
- ui/static/static/rules/index.html +1 -1
- ui/static/static/rules/index.txt +2 -2
- ui/static/static/schemas/__next._full.txt +2 -2
- ui/static/static/schemas/__next._head.txt +1 -1
- ui/static/static/schemas/__next._index.txt +2 -2
- ui/static/static/schemas/__next._tree.txt +2 -2
- ui/static/static/schemas/__next.schemas.__PAGE__.txt +1 -1
- ui/static/static/schemas/__next.schemas.txt +1 -1
- ui/static/static/schemas/index.html +1 -1
- ui/static/static/schemas/index.txt +2 -2
- ui/static/static/settings/__next._full.txt +2 -2
- ui/static/static/settings/__next._head.txt +1 -1
- ui/static/static/settings/__next._index.txt +2 -2
- ui/static/static/settings/__next._tree.txt +2 -2
- ui/static/static/settings/__next.settings.__PAGE__.txt +1 -1
- ui/static/static/settings/__next.settings.txt +1 -1
- ui/static/static/settings/index.html +1 -1
- ui/static/static/settings/index.txt +2 -2
- ui/static/static/static/.gitkeep +0 -0
- ui/static/static/static/404/index.html +1 -0
- ui/static/static/static/404.html +1 -0
- ui/static/static/static/__next.__PAGE__.txt +10 -0
- ui/static/static/static/__next._full.txt +30 -0
- ui/static/static/static/__next._head.txt +7 -0
- ui/static/static/static/__next._index.txt +9 -0
- ui/static/static/static/__next._tree.txt +2 -0
- ui/static/static/static/_next/static/chunks/222442f6da32302a.js +1 -0
- ui/static/static/static/_next/static/chunks/247eb132b7f7b574.js +1 -0
- ui/static/static/static/_next/static/chunks/297d55555b71baba.js +1 -0
- ui/static/static/static/_next/static/chunks/2ab439ce003cd691.js +1 -0
- ui/static/static/static/_next/static/chunks/414e77373f8ff61c.js +1 -0
- ui/static/static/static/_next/static/chunks/49ca65abd26ae49e.js +1 -0
- ui/static/static/static/_next/static/chunks/652ad0aa26265c47.js +2 -0
- ui/static/static/static/_next/static/chunks/9667e7a3d359eb39.js +1 -0
- ui/static/static/static/_next/static/chunks/9c23f44fff36548a.js +1 -0
- ui/static/static/static/_next/static/chunks/a6dad97d9634a72d.js +1 -0
- ui/static/static/static/_next/static/chunks/b32a0963684b9933.js +4 -0
- ui/static/static/static/_next/static/chunks/c69f6cba366bd988.js +1 -0
- ui/static/static/static/_next/static/chunks/db913959c675cea6.js +1 -0
- ui/static/static/static/_next/static/chunks/f061a4be97bfc3b3.js +1 -0
- ui/static/static/static/_next/static/chunks/f2e7afeab1178138.js +1 -0
- ui/static/static/static/_next/static/chunks/ff1a16fafef87110.js +1 -0
- ui/static/static/static/_next/static/chunks/turbopack-ffcb7ab6794027ef.js +3 -0
- ui/static/static/static/_next/static/tNTkVW6puVXC4bAm4WrHl/_buildManifest.js +11 -0
- ui/static/static/static/_next/static/tNTkVW6puVXC4bAm4WrHl/_ssgManifest.js +1 -0
- ui/static/static/static/_not-found/__next._full.txt +17 -0
- ui/static/static/static/_not-found/__next._head.txt +7 -0
- ui/static/static/static/_not-found/__next._index.txt +9 -0
- ui/static/static/static/_not-found/__next._not-found.__PAGE__.txt +5 -0
- ui/static/static/static/_not-found/__next._not-found.txt +4 -0
- ui/static/static/static/_not-found/__next._tree.txt +2 -0
- ui/static/static/static/_not-found/index.html +1 -0
- ui/static/static/static/_not-found/index.txt +17 -0
- ui/static/static/static/contracts/__next._full.txt +21 -0
- ui/static/static/static/contracts/__next._head.txt +7 -0
- ui/static/static/static/contracts/__next._index.txt +9 -0
- ui/static/static/static/contracts/__next._tree.txt +2 -0
- ui/static/static/static/contracts/__next.contracts.__PAGE__.txt +9 -0
- ui/static/static/static/contracts/__next.contracts.txt +4 -0
- ui/static/static/static/contracts/index.html +1 -0
- ui/static/static/static/contracts/index.txt +21 -0
- ui/static/static/static/documentation/__next._full.txt +21 -0
- ui/static/static/static/documentation/__next._head.txt +7 -0
- ui/static/static/static/documentation/__next._index.txt +9 -0
- ui/static/static/static/documentation/__next._tree.txt +2 -0
- ui/static/static/static/documentation/__next.documentation.__PAGE__.txt +9 -0
- ui/static/static/static/documentation/__next.documentation.txt +4 -0
- ui/static/static/static/documentation/index.html +93 -0
- ui/static/static/static/documentation/index.txt +21 -0
- ui/static/static/static/index.html +1 -0
- ui/static/static/static/index.txt +30 -0
- ui/static/static/static/metadata/__next._full.txt +21 -0
- ui/static/static/static/metadata/__next._head.txt +7 -0
- ui/static/static/static/metadata/__next._index.txt +9 -0
- ui/static/static/static/metadata/__next._tree.txt +2 -0
- ui/static/static/static/metadata/__next.metadata.__PAGE__.txt +9 -0
- ui/static/static/static/metadata/__next.metadata.txt +4 -0
- ui/static/static/static/metadata/index.html +1 -0
- ui/static/static/static/metadata/index.txt +21 -0
- ui/static/static/static/quality/__next._full.txt +21 -0
- ui/static/static/static/quality/__next._head.txt +7 -0
- ui/static/static/static/quality/__next._index.txt +9 -0
- ui/static/static/static/quality/__next._tree.txt +2 -0
- ui/static/static/static/quality/__next.quality.__PAGE__.txt +9 -0
- ui/static/static/static/quality/__next.quality.txt +4 -0
- ui/static/static/static/quality/index.html +2 -0
- ui/static/static/static/quality/index.txt +21 -0
- ui/static/static/static/rules/__next._full.txt +21 -0
- ui/static/static/static/rules/__next._head.txt +7 -0
- ui/static/static/static/rules/__next._index.txt +9 -0
- ui/static/static/static/rules/__next._tree.txt +2 -0
- ui/static/static/static/rules/__next.rules.__PAGE__.txt +9 -0
- ui/static/static/static/rules/__next.rules.txt +4 -0
- ui/static/static/static/rules/index.html +1 -0
- ui/static/static/static/rules/index.txt +21 -0
- ui/static/static/static/schemas/__next._full.txt +21 -0
- ui/static/static/static/schemas/__next._head.txt +7 -0
- ui/static/static/static/schemas/__next._index.txt +9 -0
- ui/static/static/static/schemas/__next._tree.txt +2 -0
- ui/static/static/static/schemas/__next.schemas.__PAGE__.txt +9 -0
- ui/static/static/static/schemas/__next.schemas.txt +4 -0
- ui/static/static/static/schemas/index.html +1 -0
- ui/static/static/static/schemas/index.txt +21 -0
- ui/static/static/static/settings/__next._full.txt +21 -0
- ui/static/static/static/settings/__next._head.txt +7 -0
- ui/static/static/static/settings/__next._index.txt +9 -0
- ui/static/static/static/settings/__next._tree.txt +2 -0
- ui/static/static/static/settings/__next.settings.__PAGE__.txt +9 -0
- ui/static/static/static/settings/__next.settings.txt +4 -0
- ui/static/static/static/settings/index.html +1 -0
- ui/static/static/static/settings/index.txt +21 -0
- ui/static/static/static/validation/__next._full.txt +21 -0
- ui/static/static/static/validation/__next._head.txt +7 -0
- ui/static/static/static/validation/__next._index.txt +9 -0
- ui/static/static/static/validation/__next._tree.txt +2 -0
- ui/static/static/static/validation/__next.validation.__PAGE__.txt +9 -0
- ui/static/static/static/validation/__next.validation.txt +4 -0
- ui/static/static/static/validation/index.html +1 -0
- ui/static/static/static/validation/index.txt +21 -0
- ui/static/static/validation/__next._full.txt +2 -2
- ui/static/static/validation/__next._head.txt +1 -1
- ui/static/static/validation/__next._index.txt +2 -2
- ui/static/static/validation/__next._tree.txt +2 -2
- ui/static/static/validation/__next.validation.__PAGE__.txt +1 -1
- ui/static/static/validation/__next.validation.txt +1 -1
- ui/static/static/validation/index.html +1 -1
- ui/static/static/validation/index.txt +2 -2
- ui/static/validation/__next._full.txt +2 -2
- ui/static/validation/__next._head.txt +1 -1
- ui/static/validation/__next._index.txt +1 -1
- ui/static/validation/__next._tree.txt +1 -1
- ui/static/validation/__next.validation.__PAGE__.txt +2 -2
- ui/static/validation/__next.validation.txt +1 -1
- ui/static/validation/index.html +1 -1
- ui/static/validation/index.txt +2 -2
- pycharter/data/templates/template_coercion_rules.yaml +0 -15
- pycharter/data/templates/template_contract.yaml +0 -587
- pycharter/data/templates/template_metadata.yaml +0 -38
- pycharter/data/templates/template_schema.yaml +0 -22
- pycharter/data/templates/template_transform_advanced.yaml +0 -50
- pycharter/data/templates/template_transform_simple.yaml +0 -59
- pycharter/data/templates/template_validation_rules.yaml +0 -29
- pycharter/etl_generator/extraction.py +0 -916
- pycharter/etl_generator/factory.py +0 -174
- pycharter/etl_generator/orchestrator.py +0 -1650
- pycharter/integrations/__init__.py +0 -19
- pycharter/integrations/kafka.py +0 -178
- pycharter/integrations/streaming.py +0 -100
- pycharter-0.0.22.dist-info/RECORD +0 -358
- {pycharter-0.0.22.dist-info → pycharter-0.0.24.dist-info}/entry_points.txt +0 -0
- {pycharter-0.0.22.dist-info → pycharter-0.0.24.dist-info}/licenses/LICENSE +0 -0
- {pycharter-0.0.22.dist-info → pycharter-0.0.24.dist-info}/top_level.txt +0 -0
- /ui/static/_next/static/{0rYA78L88aUyD2Uh38hhX → 2gKjNv6YvE6BcIdFthBLs}/_buildManifest.js +0 -0
- /ui/static/_next/static/{0rYA78L88aUyD2Uh38hhX → 2gKjNv6YvE6BcIdFthBLs}/_ssgManifest.js +0 -0
- /ui/static/static/_next/static/{tNTkVW6puVXC4bAm4WrHl → 0rYA78L88aUyD2Uh38hhX}/_buildManifest.js +0 -0
- /ui/static/static/_next/static/{tNTkVW6puVXC4bAm4WrHl → 0rYA78L88aUyD2Uh38hhX}/_ssgManifest.js +0 -0
- /ui/static/{_next → static/_next}/static/chunks/c4fa4f4114b7c352.js +0 -0
- /ui/static/static/{_next → static/_next}/static/chunks/4e310fe5005770a3.css +0 -0
- /ui/static/{_next → static/static/_next}/static/chunks/5e04d10c4a7b58a3.js +0 -0
- /ui/static/static/{_next → static/_next}/static/chunks/5fc14c00a2779dc5.js +0 -0
- /ui/static/{_next → static/static/_next}/static/chunks/75d88a058d8ffaa6.js +0 -0
- /ui/static/{_next → static/static/_next}/static/chunks/8c89634cf6bad76f.js +0 -0
- /ui/static/static/{_next → static/_next}/static/chunks/b584574fdc8ab13e.js +0 -0
- /ui/static/static/{_next → static/_next}/static/chunks/d5989c94d3614b3a.js +0 -0
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
# Template: JSONata Transformation
|
|
2
|
+
# Copy to your pipeline directory as transform.yaml
|
|
3
|
+
# Requires: pip install pyjsonata
|
|
4
|
+
#
|
|
5
|
+
# JSONata is a query and transformation language for JSON
|
|
6
|
+
# Docs: https://jsonata.org/
|
|
7
|
+
|
|
8
|
+
title: jsonata_transformation
|
|
9
|
+
description: Transform data using JSONata expressions
|
|
10
|
+
version: "1.0.0"
|
|
11
|
+
|
|
12
|
+
# Mode: record (per-record) or batch (all records at once)
|
|
13
|
+
jsonata:
|
|
14
|
+
mode: record
|
|
15
|
+
|
|
16
|
+
# JSONata expression
|
|
17
|
+
# Available variables:
|
|
18
|
+
# $ - current record (in record mode) or array (in batch mode)
|
|
19
|
+
# $now() - current timestamp
|
|
20
|
+
# $uuid() - generate UUID
|
|
21
|
+
|
|
22
|
+
expression: |
|
|
23
|
+
{
|
|
24
|
+
"id": id,
|
|
25
|
+
"full_name": firstName & " " & lastName,
|
|
26
|
+
"email": $lowercase(email),
|
|
27
|
+
"age": $number(age),
|
|
28
|
+
"is_adult": age >= 18,
|
|
29
|
+
"tags": $split(tags_string, ","),
|
|
30
|
+
"created_at": $now()
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
# Example: Batch mode for aggregations
|
|
34
|
+
# jsonata:
|
|
35
|
+
# mode: batch
|
|
36
|
+
# expression: |
|
|
37
|
+
# {
|
|
38
|
+
# "total_records": $count($),
|
|
39
|
+
# "total_amount": $sum($.amount),
|
|
40
|
+
# "records": $
|
|
41
|
+
# }
|
|
42
|
+
|
|
43
|
+
# Example: Filter and transform
|
|
44
|
+
# jsonata:
|
|
45
|
+
# mode: batch
|
|
46
|
+
# expression: |
|
|
47
|
+
# $[status = "active"].{
|
|
48
|
+
# "id": id,
|
|
49
|
+
# "name": name,
|
|
50
|
+
# "score_normalized": score / 100
|
|
51
|
+
# }
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
# Template: Simple Transformations
|
|
2
|
+
# Copy to your pipeline directory as transform.yaml
|
|
3
|
+
#
|
|
4
|
+
# Transformation order: rename → convert → defaults → add → select → drop
|
|
5
|
+
#
|
|
6
|
+
# Usage with Pipeline:
|
|
7
|
+
# pipeline = (
|
|
8
|
+
# Pipeline(HTTPExtractor(...))
|
|
9
|
+
# | Rename({"old": "new"})
|
|
10
|
+
# | Convert({"price": float})
|
|
11
|
+
# | PostgresLoader(...)
|
|
12
|
+
# )
|
|
13
|
+
|
|
14
|
+
title: simple_transformation
|
|
15
|
+
description: Rename, convert, defaults, add, select, drop
|
|
16
|
+
version: "1.0.0"
|
|
17
|
+
|
|
18
|
+
transform:
|
|
19
|
+
# Rename fields
|
|
20
|
+
rename:
|
|
21
|
+
oldFieldName: new_field_name
|
|
22
|
+
userId: user_id
|
|
23
|
+
createdAt: created_at
|
|
24
|
+
|
|
25
|
+
# Convert field types
|
|
26
|
+
# Supported: int, integer, float, str, string, bool, boolean, datetime
|
|
27
|
+
convert:
|
|
28
|
+
price: float
|
|
29
|
+
quantity: int
|
|
30
|
+
is_active: bool
|
|
31
|
+
created_at: datetime
|
|
32
|
+
|
|
33
|
+
# Set default values for missing/null fields
|
|
34
|
+
defaults:
|
|
35
|
+
status: "pending"
|
|
36
|
+
region: "unknown"
|
|
37
|
+
count: 0
|
|
38
|
+
|
|
39
|
+
# Add new computed fields
|
|
40
|
+
# Supported expressions: ${field}, now(), uuid(), literal values
|
|
41
|
+
add:
|
|
42
|
+
full_name: "${first_name} ${last_name}"
|
|
43
|
+
processed_at: "now()"
|
|
44
|
+
record_id: "uuid()"
|
|
45
|
+
source: "api"
|
|
46
|
+
|
|
47
|
+
# Keep only these fields (omit to keep all)
|
|
48
|
+
select:
|
|
49
|
+
- id
|
|
50
|
+
- user_id
|
|
51
|
+
- full_name
|
|
52
|
+
- email
|
|
53
|
+
- status
|
|
54
|
+
- processed_at
|
|
55
|
+
|
|
56
|
+
# Remove these fields (applied after select)
|
|
57
|
+
drop:
|
|
58
|
+
- _internal_id
|
|
59
|
+
- _metadata
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Pydantic models for data contract validation.
|
|
3
|
+
|
|
4
|
+
These models ensure that data contracts strictly adhere to the database table design.
|
|
5
|
+
Based on the database schema:
|
|
6
|
+
- data_contracts table
|
|
7
|
+
- schemas table
|
|
8
|
+
- metadata_records table
|
|
9
|
+
- owners table
|
|
10
|
+
- coercion_rules table
|
|
11
|
+
- validation_rules table
|
|
12
|
+
"""
|
|
13
|
+
|
|
14
|
+
from typing import Any, Dict, List, Optional
|
|
15
|
+
|
|
16
|
+
from pydantic import BaseModel, Field, field_validator
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class SchemaComponent(BaseModel):
|
|
20
|
+
"""
|
|
21
|
+
Schema component - required field.
|
|
22
|
+
|
|
23
|
+
Must be a valid JSON Schema object. Stored in schemas table.
|
|
24
|
+
"""
|
|
25
|
+
type: str = Field(..., description="JSON Schema type (e.g., 'object')")
|
|
26
|
+
properties: Optional[Dict[str, Any]] = Field(None, description="JSON Schema properties")
|
|
27
|
+
required: Optional[List[str]] = Field(None, description="Required fields")
|
|
28
|
+
version: Optional[str] = Field(None, max_length=50, description="Schema version")
|
|
29
|
+
title: Optional[str] = Field(None, description="Schema title")
|
|
30
|
+
|
|
31
|
+
model_config = {
|
|
32
|
+
"extra": "allow", # Allow additional JSON Schema fields
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
class MetadataComponent(BaseModel):
|
|
37
|
+
"""
|
|
38
|
+
Metadata component - optional field.
|
|
39
|
+
|
|
40
|
+
Stored in metadata_records table. Matches database column constraints.
|
|
41
|
+
"""
|
|
42
|
+
version: Optional[str] = Field(None, max_length=50, description="Metadata version")
|
|
43
|
+
title: Optional[str] = Field(None, max_length=255, description="Title (matches metadata_records.title)")
|
|
44
|
+
status: Optional[str] = Field(None, max_length=50, description="Status: active, deprecated, or draft")
|
|
45
|
+
type: Optional[str] = Field(None, max_length=50, description="Type (matches metadata_records.type)")
|
|
46
|
+
description: Optional[str] = Field(None, description="Description")
|
|
47
|
+
created_by: Optional[str] = Field(None, max_length=255, description="Created by (matches metadata_records.created_by)")
|
|
48
|
+
updated_by: Optional[str] = Field(None, max_length=255, description="Updated by (matches metadata_records.updated_by)")
|
|
49
|
+
|
|
50
|
+
# Ownership fields (stored in metadata_records as JSON arrays)
|
|
51
|
+
business_owners: Optional[List[str]] = Field(None, description="Business owners (stored in metadata_records.business_owners as JSON)")
|
|
52
|
+
bu_sme: Optional[List[str]] = Field(None, description="BU SMEs (stored in metadata_records.bu_sme as JSON)")
|
|
53
|
+
it_application_owners: Optional[List[str]] = Field(None, description="IT Application Owners (stored in metadata_records.it_application_owners as JSON)")
|
|
54
|
+
it_sme: Optional[List[str]] = Field(None, description="IT SMEs (stored in metadata_records.it_sme as JSON)")
|
|
55
|
+
support_lead: Optional[List[str]] = Field(None, description="Support Lead (stored in metadata_records.support_lead as JSON)")
|
|
56
|
+
|
|
57
|
+
@field_validator("status")
|
|
58
|
+
@classmethod
|
|
59
|
+
def validate_status(cls, v: Optional[str]) -> Optional[str]:
|
|
60
|
+
"""Validate status enum values."""
|
|
61
|
+
if v is not None and v not in ["active", "deprecated", "draft"]:
|
|
62
|
+
raise ValueError("status must be one of: active, deprecated, draft")
|
|
63
|
+
return v
|
|
64
|
+
|
|
65
|
+
model_config = {
|
|
66
|
+
"extra": "allow", # Allow additional metadata fields (stored as JSON in database)
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
class OwnershipComponent(BaseModel):
|
|
71
|
+
"""
|
|
72
|
+
Ownership component - optional field.
|
|
73
|
+
|
|
74
|
+
Stored in owners table. Matches database column constraints.
|
|
75
|
+
"""
|
|
76
|
+
owner: Optional[str] = Field(None, max_length=255, description="Primary owner (matches owners.owner)")
|
|
77
|
+
team: Optional[str] = Field(None, max_length=255, description="Team name (matches owners.team)")
|
|
78
|
+
additional_info: Optional[Dict[str, Any]] = Field(None, description="Additional info (stored in owners.additional_info as JSON)")
|
|
79
|
+
|
|
80
|
+
model_config = {
|
|
81
|
+
"extra": "allow", # Allow additional ownership fields
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
class GovernanceRulesComponent(BaseModel):
|
|
86
|
+
"""
|
|
87
|
+
Governance rules component - optional field.
|
|
88
|
+
|
|
89
|
+
Stored in metadata_records.governance_rules as JSON.
|
|
90
|
+
"""
|
|
91
|
+
model_config = {
|
|
92
|
+
"extra": "allow", # Governance rules can contain any structure (stored as JSON)
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
class CoercionRulesComponent(BaseModel):
|
|
97
|
+
"""
|
|
98
|
+
Coercion rules component - optional field.
|
|
99
|
+
|
|
100
|
+
Stored in coercion_rules table. Structure matches database design.
|
|
101
|
+
"""
|
|
102
|
+
version: Optional[str] = Field(None, max_length=50, description="Coercion rules version")
|
|
103
|
+
rules: Optional[Dict[str, str]] = Field(None, description="Coercion rules mapping field names to coercion function names")
|
|
104
|
+
|
|
105
|
+
model_config = {
|
|
106
|
+
"extra": "allow", # Allow additional fields in coercion rules
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
class ValidationRulesComponent(BaseModel):
|
|
111
|
+
"""
|
|
112
|
+
Validation rules component - optional field.
|
|
113
|
+
|
|
114
|
+
Stored in validation_rules table. Structure matches database design.
|
|
115
|
+
"""
|
|
116
|
+
version: Optional[str] = Field(None, max_length=50, description="Validation rules version")
|
|
117
|
+
rules: Optional[Dict[str, Dict[str, Any]]] = Field(None, description="Validation rules mapping field names to validation configurations")
|
|
118
|
+
|
|
119
|
+
model_config = {
|
|
120
|
+
"extra": "allow", # Allow additional fields in validation rules
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
|
|
124
|
+
class VersionsComponent(BaseModel):
|
|
125
|
+
"""
|
|
126
|
+
Versions component - optional field.
|
|
127
|
+
|
|
128
|
+
Tracks versions of all components. Stored in data_contracts table version columns.
|
|
129
|
+
"""
|
|
130
|
+
schema: Optional[str] = Field(None, max_length=50, description="Schema version")
|
|
131
|
+
metadata: Optional[str] = Field(None, max_length=50, description="Metadata version")
|
|
132
|
+
coercion_rules: Optional[str] = Field(None, max_length=50, description="Coercion rules version")
|
|
133
|
+
validation_rules: Optional[str] = Field(None, max_length=50, description="Validation rules version")
|
|
134
|
+
|
|
135
|
+
model_config = {
|
|
136
|
+
"extra": "forbid", # Versions should only contain these fields
|
|
137
|
+
"populate_by_name": True,
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
|
|
141
|
+
class DataContractSchema(BaseModel):
|
|
142
|
+
"""
|
|
143
|
+
Pydantic model for validating data contract structure.
|
|
144
|
+
|
|
145
|
+
Ensures contracts strictly adhere to the database table design.
|
|
146
|
+
All fields match the database schema constraints.
|
|
147
|
+
"""
|
|
148
|
+
schema: SchemaComponent = Field(..., description="JSON Schema definition (required, stored in schemas table)")
|
|
149
|
+
metadata: Optional[MetadataComponent] = Field(None, description="Metadata (optional, stored in metadata_records table)")
|
|
150
|
+
ownership: Optional[OwnershipComponent] = Field(None, description="Ownership (optional, stored in owners table)")
|
|
151
|
+
governance_rules: Optional[GovernanceRulesComponent] = Field(None, description="Governance rules (optional, stored in metadata_records.governance_rules as JSON)")
|
|
152
|
+
coercion_rules: Optional[CoercionRulesComponent] = Field(None, description="Coercion rules (optional, stored in coercion_rules table)")
|
|
153
|
+
validation_rules: Optional[ValidationRulesComponent] = Field(None, description="Validation rules (optional, stored in validation_rules table)")
|
|
154
|
+
versions: Optional[VersionsComponent] = Field(None, description="Version tracking (optional, stored in data_contracts table)")
|
|
155
|
+
|
|
156
|
+
model_config = {
|
|
157
|
+
"extra": "forbid", # Only allow defined fields to ensure strict adherence to database schema
|
|
158
|
+
"populate_by_name": True,
|
|
159
|
+
}
|
|
160
|
+
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Documentation Generator - Generate documentation from data contracts.
|
|
3
|
+
|
|
4
|
+
This module provides tools to generate human-readable documentation
|
|
5
|
+
from ContractMetadata objects, supporting multiple output formats.
|
|
6
|
+
|
|
7
|
+
Primary Interface:
|
|
8
|
+
- DocsGenerator: Main class for generating documentation
|
|
9
|
+
- generate_docs: Convenience function for quick documentation generation
|
|
10
|
+
|
|
11
|
+
Renderers:
|
|
12
|
+
- MarkdownRenderer: Render documentation as Markdown
|
|
13
|
+
- HTMLRenderer: Render documentation as HTML
|
|
14
|
+
|
|
15
|
+
Example:
|
|
16
|
+
>>> from pycharter import parse_contract_file
|
|
17
|
+
>>> from pycharter.docs_generator import generate_docs, DocsGenerator
|
|
18
|
+
>>>
|
|
19
|
+
>>> # Quick generation
|
|
20
|
+
>>> contract = parse_contract_file("contract.yaml")
|
|
21
|
+
>>> markdown = generate_docs(contract)
|
|
22
|
+
>>>
|
|
23
|
+
>>> # Custom configuration
|
|
24
|
+
>>> generator = DocsGenerator(renderer=HTMLRenderer())
|
|
25
|
+
>>> html = generator.generate(contract)
|
|
26
|
+
"""
|
|
27
|
+
|
|
28
|
+
from pycharter.docs_generator.generator import DocsGenerator, generate_docs
|
|
29
|
+
from pycharter.docs_generator.renderers import (
|
|
30
|
+
DocsRenderer,
|
|
31
|
+
HTMLRenderer,
|
|
32
|
+
MarkdownRenderer,
|
|
33
|
+
)
|
|
34
|
+
|
|
35
|
+
__all__ = [
|
|
36
|
+
# Primary interface
|
|
37
|
+
"DocsGenerator",
|
|
38
|
+
"generate_docs",
|
|
39
|
+
# Renderers
|
|
40
|
+
"DocsRenderer",
|
|
41
|
+
"MarkdownRenderer",
|
|
42
|
+
"HTMLRenderer",
|
|
43
|
+
]
|