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
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: pycharter
|
|
3
|
-
Version: 0.0.
|
|
3
|
+
Version: 0.0.24
|
|
4
4
|
Summary: A Python package for data contract management with five core services: contract parsing, metadata storage, Pydantic generation, JSON Schema conversion, and runtime validation
|
|
5
5
|
Author-email: semantic developers <na@example.com>
|
|
6
6
|
License-Expression: MIT
|
|
@@ -54,6 +54,11 @@ Requires-Dist: pyspark>=3.5.0; extra == "worker"
|
|
|
54
54
|
Requires-Dist: redis>=5.0.0; extra == "worker"
|
|
55
55
|
Provides-Extra: etl
|
|
56
56
|
Requires-Dist: sshtunnel>=0.4.0; extra == "etl"
|
|
57
|
+
Requires-Dist: boto3>=1.26.0; extra == "etl"
|
|
58
|
+
Requires-Dist: google-cloud-storage>=2.0.0; extra == "etl"
|
|
59
|
+
Requires-Dist: azure-storage-blob>=12.0.0; extra == "etl"
|
|
60
|
+
Requires-Dist: openpyxl>=3.0.0; extra == "etl"
|
|
61
|
+
Requires-Dist: lxml>=4.9.0; extra == "etl"
|
|
57
62
|
Dynamic: license-file
|
|
58
63
|
|
|
59
64
|
# PyCharter
|
|
@@ -159,6 +164,41 @@ pycharter ui dev # Development mode with hot reload
|
|
|
159
164
|
|
|
160
165
|
## π Quick Start
|
|
161
166
|
|
|
167
|
+
### Quick Start: ETL Pipelines
|
|
168
|
+
|
|
169
|
+
Build and run ETL pipelines programmatically (with the `|` operator) or from YAML configs. Pipeline **run()** is async; use `asyncio.run()` from scripts or `await` in async code.
|
|
170
|
+
|
|
171
|
+
```python
|
|
172
|
+
import asyncio
|
|
173
|
+
from pycharter import Pipeline, HTTPExtractor, PostgresLoader, Rename, AddField
|
|
174
|
+
|
|
175
|
+
# Programmatic pipeline
|
|
176
|
+
pipeline = (
|
|
177
|
+
Pipeline(HTTPExtractor(url="https://api.example.com/data"))
|
|
178
|
+
| Rename({"old": "new"})
|
|
179
|
+
| AddField("processed_at", "now()")
|
|
180
|
+
| PostgresLoader(connection_string="...", table="users")
|
|
181
|
+
)
|
|
182
|
+
result = asyncio.run(pipeline.run())
|
|
183
|
+
|
|
184
|
+
# Config-driven: explicit files
|
|
185
|
+
pipeline = Pipeline.from_config_files(
|
|
186
|
+
extract="configs/extract.yaml",
|
|
187
|
+
load="configs/load.yaml",
|
|
188
|
+
variables={"API_KEY": "secret"}
|
|
189
|
+
)
|
|
190
|
+
|
|
191
|
+
# Config-driven: directory (extract.yaml, transform.yaml, load.yaml)
|
|
192
|
+
pipeline = Pipeline.from_config_dir("pipelines/users/")
|
|
193
|
+
|
|
194
|
+
# Config-driven: single file
|
|
195
|
+
pipeline = Pipeline.from_config_file("pipelines/users/pipeline.yaml")
|
|
196
|
+
|
|
197
|
+
result = asyncio.run(pipeline.run())
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
See **ETL Pipelines** under Core Services for error handling (`error_context`, `ErrorMode`) and variable resolution (`PipelineContext(variables={...})`).
|
|
201
|
+
|
|
162
202
|
### Quick Start: Convenience Functions (One-off Use)
|
|
163
203
|
|
|
164
204
|
```python
|
|
@@ -187,14 +227,29 @@ if result.is_valid:
|
|
|
187
227
|
|
|
188
228
|
### Production Use: Validator Class (Recommended)
|
|
189
229
|
|
|
190
|
-
For production code with multiple validations, use the `Validator` class for better performance:
|
|
230
|
+
For production code with multiple validations, use the `Validator` class for better performance. Create validators via **factory methods** or from a metadata store:
|
|
191
231
|
|
|
192
232
|
```python
|
|
193
233
|
from pycharter import Validator
|
|
194
234
|
|
|
195
|
-
#
|
|
196
|
-
validator = Validator(
|
|
197
|
-
|
|
235
|
+
# From directory (expects schema.yaml, coercion_rules.yaml, validation_rules.yaml)
|
|
236
|
+
validator = Validator.from_dir("data/contracts/user")
|
|
237
|
+
|
|
238
|
+
# From explicit files (any filenames)
|
|
239
|
+
validator = Validator.from_files(
|
|
240
|
+
schema="schemas/user.yaml",
|
|
241
|
+
coercion_rules="rules/coercion.yaml",
|
|
242
|
+
validation_rules="rules/validation.yaml"
|
|
243
|
+
)
|
|
244
|
+
|
|
245
|
+
# From a single contract file
|
|
246
|
+
validator = Validator.from_file("user_contract.yaml")
|
|
247
|
+
|
|
248
|
+
# From dictionaries
|
|
249
|
+
validator = Validator.from_dict(schema={...}, coercion_rules={...}, validation_rules={...})
|
|
250
|
+
|
|
251
|
+
# From metadata store (with database)
|
|
252
|
+
validator = Validator(store=store, schema_id="user_schema_v1")
|
|
198
253
|
|
|
199
254
|
# Validate multiple records efficiently (model is cached)
|
|
200
255
|
result1 = validator.validate({"name": "Alice", "age": 30})
|
|
@@ -227,11 +282,12 @@ PyCharter's API is organized into **three tiers** to help you choose the right a
|
|
|
227
282
|
### Tier 1: Primary Interfaces (β Recommended for Production)
|
|
228
283
|
|
|
229
284
|
**Classes** that provide the best performance and most features:
|
|
230
|
-
- **`Validator`** - Primary validation interface (use for multiple validations)
|
|
285
|
+
- **`Validator`** - Primary validation interface (use for multiple validations); create via `from_dir()`, `from_files()`, `from_file()`, `from_dict()` or from store
|
|
286
|
+
- **`Pipeline`** - ETL pipeline (programmatic or config-driven); create via `from_config_files()`, `from_config_dir()`, `from_config_file()` or constructor
|
|
231
287
|
- **`QualityCheck`** - Primary quality assurance interface
|
|
232
288
|
- **`MetadataStoreClient`** - Base class for metadata stores
|
|
233
289
|
|
|
234
|
-
**When to use**: Production code, batch processing, when you need to validate multiple records.
|
|
290
|
+
**When to use**: Production code, batch processing, when you need to validate multiple records or run ETL pipelines.
|
|
235
291
|
|
|
236
292
|
### Tier 2: Convenience Functions (Quick Start)
|
|
237
293
|
|
|
@@ -525,20 +581,24 @@ PyCharter provides validation through three tiers:
|
|
|
525
581
|
```python
|
|
526
582
|
from pycharter import Validator, SQLiteMetadataStore
|
|
527
583
|
|
|
528
|
-
# Option 1: From
|
|
529
|
-
validator = Validator(
|
|
584
|
+
# Option 1: From directory (schema.yaml, coercion_rules.yaml, validation_rules.yaml)
|
|
585
|
+
validator = Validator.from_dir("data/contracts/user")
|
|
586
|
+
result = validator.validate({"name": "Alice", "age": 30})
|
|
587
|
+
|
|
588
|
+
# Option 2: From explicit files
|
|
589
|
+
validator = Validator.from_files(schema="schemas/user.yaml", coercion_rules="rules/coercion.yaml")
|
|
590
|
+
result = validator.validate({"name": "Alice", "age": 30})
|
|
591
|
+
|
|
592
|
+
# Option 3: From single contract file
|
|
593
|
+
validator = Validator.from_file("user_contract.yaml")
|
|
530
594
|
result = validator.validate({"name": "Alice", "age": 30})
|
|
531
595
|
|
|
532
|
-
# Option
|
|
596
|
+
# Option 4: From metadata store (with database)
|
|
533
597
|
store = SQLiteMetadataStore("metadata.db")
|
|
534
598
|
store.connect()
|
|
535
599
|
validator = Validator(store=store, schema_id="user_schema_v1")
|
|
536
600
|
result = validator.validate({"name": "Alice", "age": 30})
|
|
537
601
|
|
|
538
|
-
# Option 3: From contract file
|
|
539
|
-
validator = Validator(contract_file="user_contract.yaml")
|
|
540
|
-
result = validator.validate({"name": "Alice", "age": 30})
|
|
541
|
-
|
|
542
602
|
# Batch validation (efficient - model cached)
|
|
543
603
|
results = validator.validate_batch([data1, data2, data3])
|
|
544
604
|
```
|
|
@@ -579,6 +639,55 @@ results = validate_batch(UserModel, [data1, data2, data3])
|
|
|
579
639
|
|
|
580
640
|
---
|
|
581
641
|
|
|
642
|
+
### 5b. π ETL Pipelines (`pycharter.etl_generator`)
|
|
643
|
+
|
|
644
|
+
**Purpose**: Build and run ETL pipelines programmatically (with the `|` operator) or from YAML configs. No assumptions about project layoutβyou specify file paths or use a directory with standard filenames.
|
|
645
|
+
|
|
646
|
+
**When to Use**: When you need to extract, transform, and load data from config-driven or code-defined pipelines (HTTP, files, databases, cloud storage β transforms β Postgres, files, cloud).
|
|
647
|
+
|
|
648
|
+
**How It Works**:
|
|
649
|
+
- **Programmatic**: `Pipeline(extractor) | transformer | loader`; chain with `|`; call `await pipeline.run()`.
|
|
650
|
+
- **Config-driven**: Load from explicit files (`from_config_files`), from a directory with `extract.yaml`, `transform.yaml`, `load.yaml` (`from_config_dir`), or from a single `pipeline.yaml` (`from_config_file`).
|
|
651
|
+
- **Variables**: Pass `PipelineContext(variables={"API_KEY": "x"})` or `variables={...}` in factory methods; `${VAR}` and `${VAR:-default}` in configs are resolved from these (no built-in `CONTRACT_DIR`).
|
|
652
|
+
- **Async**: `run()` is async; use `asyncio.run(pipeline.run())` in scripts or `await pipeline.run()` in async code.
|
|
653
|
+
- **Error handling**: Optional `error_context` with `ErrorMode` (STRICT, LENIENT, COLLECT) controls whether extraction/load failures raise or are collected in `result.errors`.
|
|
654
|
+
|
|
655
|
+
**Example**:
|
|
656
|
+
```python
|
|
657
|
+
import asyncio
|
|
658
|
+
from pycharter import Pipeline, PipelineContext, HTTPExtractor, PostgresLoader, Rename, AddField
|
|
659
|
+
|
|
660
|
+
# Programmatic
|
|
661
|
+
pipeline = (
|
|
662
|
+
Pipeline(HTTPExtractor(url="https://api.example.com/users"))
|
|
663
|
+
| Rename({"userName": "name"})
|
|
664
|
+
| AddField("processed_at", "now()")
|
|
665
|
+
| PostgresLoader(connection_string="...", table="users")
|
|
666
|
+
)
|
|
667
|
+
result = asyncio.run(pipeline.run())
|
|
668
|
+
|
|
669
|
+
# Config-driven (explicit files)
|
|
670
|
+
pipeline = Pipeline.from_config_files(
|
|
671
|
+
extract="configs/extract.yaml",
|
|
672
|
+
load="configs/load.yaml",
|
|
673
|
+
variables={"API_KEY": "secret"}
|
|
674
|
+
)
|
|
675
|
+
|
|
676
|
+
# Config-driven (directory: extract.yaml, transform.yaml, load.yaml)
|
|
677
|
+
pipeline = Pipeline.from_config_dir("pipelines/users/")
|
|
678
|
+
|
|
679
|
+
# Config-driven (single file)
|
|
680
|
+
pipeline = Pipeline.from_config_file("pipelines/users/pipeline.yaml")
|
|
681
|
+
|
|
682
|
+
result = asyncio.run(pipeline.run())
|
|
683
|
+
```
|
|
684
|
+
|
|
685
|
+
**Exceptions**: Pipeline and config loading use PyCharterβs exception hierarchy: `PyCharterError` (base), `ConfigError`, `ConfigValidationError`, `ExpressionError`. See **Exceptions** under API Reference.
|
|
686
|
+
|
|
687
|
+
**See** `pycharter/etl_generator/ASYNC_AND_EXECUTION.md` for async usage and error modes.
|
|
688
|
+
|
|
689
|
+
---
|
|
690
|
+
|
|
582
691
|
### 6. π Quality Assurance (`pycharter.quality`)
|
|
583
692
|
|
|
584
693
|
**Purpose**: Data quality assurance pipeline that polices data according to data contracts, calculates quality metrics, tracks violations, and generates quality reports.
|
|
@@ -699,7 +808,7 @@ def process_user_data_quick(raw_data):
|
|
|
699
808
|
|
|
700
809
|
---
|
|
701
810
|
|
|
702
|
-
### 7. π REST API (`api/`)
|
|
811
|
+
### 7. π REST API (`api/`) (`api/`)
|
|
703
812
|
|
|
704
813
|
**Purpose**: Expose all PyCharter services as REST API endpoints.
|
|
705
814
|
|
|
@@ -747,6 +856,7 @@ See `api/README.md` for complete API documentation.
|
|
|
747
856
|
| **Pydantic Generator** | JSON Schema | Pydantic models | Storage β Model Generation |
|
|
748
857
|
| **JSON Schema Converter** | Pydantic models | JSON Schema | (Bidirectional) |
|
|
749
858
|
| **Runtime Validator** | Pydantic models + Data | `ValidationResult` | Model Generation β Validation |
|
|
859
|
+
| **ETL Pipelines** | Config files or code | `PipelineResult` | Extract β Transform β Load |
|
|
750
860
|
| **Quality Assurance** | Contract + Data | `QualityReport` | Validation β Quality Monitoring |
|
|
751
861
|
|
|
752
862
|
Each service is designed to be **independent** yet **composable**, allowing you to use them individually or together as part of a complete data contract management system.
|
|
@@ -790,12 +900,9 @@ Product = from_file("product_schema.json", "Product")
|
|
|
790
900
|
```python
|
|
791
901
|
from pycharter import Validator
|
|
792
902
|
|
|
793
|
-
# From
|
|
794
|
-
validator = Validator(
|
|
795
|
-
|
|
796
|
-
|
|
797
|
-
# From contract file
|
|
798
|
-
validator = Validator(contract_file="article_contract.yaml")
|
|
903
|
+
# From directory or single file
|
|
904
|
+
validator = Validator.from_dir("data/contracts/article")
|
|
905
|
+
# or: validator = Validator.from_file("article_contract.yaml")
|
|
799
906
|
result = validator.validate({"title": "My Article", "published": True})
|
|
800
907
|
```
|
|
801
908
|
|
|
@@ -1014,11 +1121,12 @@ PyCharter's API is organized into three tiers to help you choose the right appro
|
|
|
1014
1121
|
```python
|
|
1015
1122
|
from pycharter import Validator
|
|
1016
1123
|
|
|
1017
|
-
# Create validator
|
|
1018
|
-
validator = Validator(
|
|
1019
|
-
validator = Validator(
|
|
1020
|
-
validator = Validator(
|
|
1021
|
-
validator = Validator(
|
|
1124
|
+
# Create validator via factory methods or store
|
|
1125
|
+
validator = Validator.from_dir("data/contracts/user")
|
|
1126
|
+
validator = Validator.from_files(schema="schema.yaml", coercion_rules="coercion.yaml")
|
|
1127
|
+
validator = Validator.from_file("contract.yaml")
|
|
1128
|
+
validator = Validator.from_dict(schema={...}, coercion_rules={...})
|
|
1129
|
+
validator = Validator(store=store, schema_id="user_schema") # from metadata store
|
|
1022
1130
|
|
|
1023
1131
|
# Validate data
|
|
1024
1132
|
result = validator.validate(data)
|
|
@@ -1089,6 +1197,18 @@ store.connect()
|
|
|
1089
1197
|
- **`MongoDBMetadataStore(connection_string: str)`** - MongoDB database
|
|
1090
1198
|
- **`RedisMetadataStore(connection_string: str)`** - Redis database
|
|
1091
1199
|
|
|
1200
|
+
### Exceptions
|
|
1201
|
+
|
|
1202
|
+
PyCharter uses a small exception hierarchy for config and pipeline errors. Catch **`PyCharterError`** to handle any PyCharter failure:
|
|
1203
|
+
|
|
1204
|
+
- **`PyCharterError`** - Base for all PyCharter exceptions
|
|
1205
|
+
- **`ConfigError`** - Config loading/parsing failures (missing file, invalid YAML)
|
|
1206
|
+
- **`ConfigValidationError`** - Schema validation failures (e.g. missing required `type` field)
|
|
1207
|
+
- **`ConfigLoadError`** - Config file load errors
|
|
1208
|
+
- **`ExpressionError`** - Expression evaluation failures (e.g. invalid syntax in AddField)
|
|
1209
|
+
|
|
1210
|
+
Pipeline **`run(error_context=...)`** supports **`ErrorMode`**: **STRICT** (raise on failure), **LENIENT** (log and continue), **COLLECT** (append to `result.errors`). Import from `pycharter.shared.errors`.
|
|
1211
|
+
|
|
1092
1212
|
## π― Design Principles & Requirements
|
|
1093
1213
|
|
|
1094
1214
|
Charter is designed to meet the following core requirements:
|