pycharter 0.0.24__tar.gz → 0.0.25__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.
- pycharter-0.0.25/MANIFEST.in +22 -0
- {pycharter-0.0.24/pycharter.egg-info → pycharter-0.0.25}/PKG-INFO +1 -1
- {pycharter-0.0.24 → pycharter-0.0.25}/pyproject.toml +11 -9
- {pycharter-0.0.24 → pycharter-0.0.25}/setup.py +6 -5
- pycharter-0.0.25/src/pycharter/api/README.md +340 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/api/__init__.py +1 -1
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/api/dependencies/__init__.py +2 -2
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/api/main.py +2 -2
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/api/models/__init__.py +4 -4
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/api/routes/v1/__init__.py +1 -1
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/api/routes/v1/contracts.py +4 -4
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/api/routes/v1/docs.py +2 -2
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/api/routes/v1/evolution.py +2 -2
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/api/routes/v1/metadata.py +5 -5
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/api/routes/v1/quality.py +3 -3
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/api/routes/v1/schemas.py +1 -1
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/api/routes/v1/settings.py +1 -1
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/api/routes/v1/tracking.py +1 -1
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/api/routes/v1/validation.py +2 -2
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/api/routes/v1/validation_jobs.py +3 -3
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/cli.py +8 -10
- pycharter-0.0.25/src/pycharter/data/templates/contract/README.md +144 -0
- pycharter-0.0.25/src/pycharter/db/README.md +179 -0
- pycharter-0.0.25/src/pycharter/db/schemas/README.md +96 -0
- pycharter-0.0.25/src/pycharter/etl_generator/ASYNC_AND_EXECUTION.md +91 -0
- pycharter-0.0.25/src/pycharter/etl_generator/INTERFACES.md +143 -0
- pycharter-0.0.25/src/pycharter/etl_generator/README.md +271 -0
- pycharter-0.0.25/src/pycharter/etl_generator/TRANSFORMATION_GUIDE.md +452 -0
- pycharter-0.0.25/src/pycharter/etl_generator/schemas/extract.json +234 -0
- pycharter-0.0.25/src/pycharter/etl_generator/schemas/load.json +202 -0
- pycharter-0.0.25/src/pycharter/etl_generator/schemas/pipeline.json +94 -0
- pycharter-0.0.25/src/pycharter/etl_generator/schemas/transform.json +171 -0
- pycharter-0.0.25/src/pycharter/metadata_store/README.md +229 -0
- pycharter-0.0.25/src/pycharter/quality/README.md +235 -0
- pycharter-0.0.25/src/pycharter/ui/.eslintrc.json +4 -0
- pycharter-0.0.25/src/pycharter/ui/README.md +186 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/__init__.py +3 -3
- pycharter-0.0.25/src/pycharter/ui/components.json +17 -0
- pycharter-0.0.25/src/pycharter/ui/package-lock.json +6608 -0
- pycharter-0.0.25/src/pycharter/ui/package.json +36 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/server.py +7 -8
- pycharter-0.0.25/src/pycharter/ui/static/_next/static/2gKjNv6YvE6BcIdFthBLs/_clientMiddlewareManifest.json +1 -0
- pycharter-0.0.25/src/pycharter/ui/static/static/_next/static/0rYA78L88aUyD2Uh38hhX/_clientMiddlewareManifest.json +1 -0
- pycharter-0.0.25/src/pycharter/ui/static/static/static/_next/static/tNTkVW6puVXC4bAm4WrHl/_clientMiddlewareManifest.json +1 -0
- pycharter-0.0.25/src/pycharter/ui/tsconfig.json +42 -0
- pycharter-0.0.25/src/pycharter/worker/README.md +187 -0
- pycharter-0.0.25/src/pycharter/worker/backends/__init__.py +8 -0
- pycharter-0.0.25/src/pycharter/worker/backends/base.py +46 -0
- pycharter-0.0.25/src/pycharter/worker/backends/spark.py +233 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/worker/cli.py +1 -1
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/worker/processor.py +2 -2
- pycharter-0.0.25/src/pycharter/worker/queue/__init__.py +8 -0
- pycharter-0.0.25/src/pycharter/worker/queue/redis_queue.py +147 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter.egg-info}/PKG-INFO +1 -1
- pycharter-0.0.25/src/pycharter.egg-info/SOURCES.txt +590 -0
- pycharter-0.0.25/src/pycharter.egg-info/top_level.txt +1 -0
- pycharter-0.0.24/MANIFEST.in +0 -26
- pycharter-0.0.24/pycharter.egg-info/SOURCES.txt +0 -561
- pycharter-0.0.24/pycharter.egg-info/top_level.txt +0 -4
- {pycharter-0.0.24 → pycharter-0.0.25}/LICENSE +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25}/README.md +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25}/setup.cfg +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/__init__.py +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/api/dependencies/database.py +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/api/dependencies/store.py +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/api/models/contracts.py +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/api/models/docs.py +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/api/models/evolution.py +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/api/models/metadata.py +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/api/models/metadata_entities.py +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/api/models/quality.py +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/api/models/schemas.py +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/api/models/tracking.py +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/api/models/validation.py +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/api/routes/__init__.py +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/api/routes/v1/templates.py +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/api/utils.py +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/config.py +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/contract_builder/__init__.py +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/contract_builder/builder.py +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/contract_parser/__init__.py +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/contract_parser/parser.py +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/data/__init__.py +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/data/templates/contract/template_coercion_rules.yaml +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/data/templates/contract/template_contract.yaml +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/data/templates/contract/template_metadata.yaml +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/data/templates/contract/template_schema.yaml +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/data/templates/contract/template_validation_rules.yaml +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/data/templates/etl/README.md +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/data/templates/etl/extract_cloud_azure.yaml +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/data/templates/etl/extract_cloud_gcs.yaml +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/data/templates/etl/extract_cloud_s3.yaml +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/data/templates/etl/extract_database.yaml +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/data/templates/etl/extract_database_ssh.yaml +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/data/templates/etl/extract_file_csv.yaml +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/data/templates/etl/extract_file_glob.yaml +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/data/templates/etl/extract_file_json.yaml +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/data/templates/etl/extract_file_parquet.yaml +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/data/templates/etl/extract_http_paginated.yaml +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/data/templates/etl/extract_http_path_params.yaml +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/data/templates/etl/extract_http_simple.yaml +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/data/templates/etl/load_cloud_azure.yaml +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/data/templates/etl/load_cloud_gcs.yaml +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/data/templates/etl/load_cloud_s3.yaml +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/data/templates/etl/load_file.yaml +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/data/templates/etl/load_insert.yaml +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/data/templates/etl/load_postgresql.yaml +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/data/templates/etl/load_sqlite.yaml +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/data/templates/etl/load_truncate_and_load.yaml +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/data/templates/etl/load_upsert.yaml +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/data/templates/etl/load_with_dlq.yaml +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/data/templates/etl/load_with_ssh_tunnel.yaml +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/data/templates/etl/pipeline_http_to_db.yaml +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/data/templates/etl/transform_combined.yaml +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/data/templates/etl/transform_custom_function.yaml +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/data/templates/etl/transform_jsonata.yaml +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/data/templates/etl/transform_simple.yaml +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/db/__init__.py +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/db/cli.py +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/db/migrations/README +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/db/migrations/env.py +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/db/migrations/script.py.mako +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/db/migrations/versions/20250115120000_add_tier2_tier3_entities.py +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/db/migrations/versions/20251209163657_799b73fe9f6c_initial_schema.py +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/db/migrations/versions/20251209164144_ae0efda02aa1_initial_schema.py +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/db/migrations/versions/20251217160146_f9995dc0f4b3_add_quality_tables.py +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/db/migrations/versions/20251217164915_8b08d78068e3_add_data_version_tracking.py +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/db/migrations/versions/20260110083000_a1b2c3d4e5f6_add_dead_letter_queue_table.py +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/db/migrations/versions/20260120000000_add_name_title_validation_constraints.py +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/db/migrations/versions/20260121000000_remove_artifact_versions_from_data_contracts.py +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/db/migrations/versions/20260122000000_change_artifact_unique_constraints_to_title_version.py +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/db/migrations/versions/__init__.py +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/db/models/__init__.py +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/db/models/api_endpoint.py +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/db/models/base.py +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/db/models/coercion_rule.py +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/db/models/compliance_framework.py +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/db/models/data_contract.py +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/db/models/data_dependency.py +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/db/models/data_feed.py +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/db/models/dlq.py +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/db/models/domain.py +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/db/models/environment.py +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/db/models/metadata_record.py +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/db/models/owner.py +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/db/models/quality_metric.py +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/db/models/quality_violation.py +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/db/models/schema.py +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/db/models/storage_location.py +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/db/models/system.py +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/db/models/tag.py +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/db/models/validation_rule.py +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/db/schemas/.ipynb_checkpoints/data_contract-checkpoint.py +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/db/schemas/__init__.py +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/db/schemas/data_contract.py +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/docs_generator/__init__.py +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/docs_generator/generator.py +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/docs_generator/renderers.py +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/etl_generator/__init__.py +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/etl_generator/builder.py +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/etl_generator/checkpoint.py +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/etl_generator/config_generator.py +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/etl_generator/config_loader.py +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/etl_generator/config_validator.py +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/etl_generator/context.py +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/etl_generator/database.py +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/etl_generator/dlq.py +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/etl_generator/expression.py +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/etl_generator/extractors/__init__.py +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/etl_generator/extractors/base.py +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/etl_generator/extractors/cloud_storage.py +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/etl_generator/extractors/database.py +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/etl_generator/extractors/factory.py +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/etl_generator/extractors/file.py +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/etl_generator/extractors/http.py +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/etl_generator/extractors/streaming.py +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/etl_generator/loaders/__init__.py +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/etl_generator/loaders/base.py +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/etl_generator/loaders/cloud.py +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/etl_generator/loaders/cloud_storage_loader.py +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/etl_generator/loaders/database.py +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/etl_generator/loaders/factory.py +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/etl_generator/loaders/file.py +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/etl_generator/loaders/file_loader.py +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/etl_generator/pipeline.py +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/etl_generator/progress.py +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/etl_generator/protocols.py +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/etl_generator/result.py +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/etl_generator/schemas/__init__.py +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/etl_generator/transformers/__init__.py +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/etl_generator/transformers/base.py +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/etl_generator/transformers/config.py +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/etl_generator/transformers/custom_function.py +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/etl_generator/transformers/jsonata_transformer.py +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/etl_generator/transformers/operations.py +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/etl_generator/transformers/pipeline.py +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/etl_generator/transformers/simple_operations.py +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/json_schema_converter/__init__.py +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/json_schema_converter/converter.py +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/json_schema_converter/reverse_converter.py +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/metadata_store/__init__.py +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/metadata_store/client.py +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/metadata_store/in_memory.py +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/metadata_store/mongodb.py +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/metadata_store/postgres.py +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/metadata_store/redis.py +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/metadata_store/sqlite.py +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/py.typed +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/pydantic_generator/__init__.py +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/pydantic_generator/converter.py +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/pydantic_generator/generator.py +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/quality/__init__.py +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/quality/check.py +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/quality/cli.py +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/quality/metrics.py +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/quality/models.py +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/quality/profiling.py +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/quality/tracking/__init__.py +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/quality/tracking/collector.py +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/quality/tracking/exporters.py +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/quality/tracking/models.py +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/quality/tracking/store.py +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/quality/violations.py +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/runtime_validator/__init__.py +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/runtime_validator/builder.py +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/runtime_validator/decorators.py +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/runtime_validator/utils.py +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/runtime_validator/validator.py +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/runtime_validator/validator_core.py +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/runtime_validator/wrappers.py +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/schema_evolution/__init__.py +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/schema_evolution/compatibility.py +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/schema_evolution/diff.py +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/schema_evolution/models.py +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/shared/__init__.py +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/shared/coercions/__init__.py +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/shared/coercions/builtin.py +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/shared/errors.py +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/shared/json_schema_support.py +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/shared/json_schema_validator.py +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/shared/name_validator.py +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/shared/protocols.py +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/shared/schema_parser.py +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/shared/schema_resolver.py +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/shared/validations/__init__.py +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/shared/validations/builtin.py +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/build.py +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/dev.py +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/.gitkeep +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/404/index.html +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/404.html +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/__next.__PAGE__.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/__next._full.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/__next._head.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/__next._index.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/__next._tree.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/_next/static/2gKjNv6YvE6BcIdFthBLs/_buildManifest.js +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/_next/static/2gKjNv6YvE6BcIdFthBLs/_ssgManifest.js +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/_next/static/chunks/13d4a0fbd74c1ee4.js +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/_next/static/chunks/222442f6da32302a.js +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/_next/static/chunks/247eb132b7f7b574.js +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/_next/static/chunks/26dfc590f7714c03.js +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/_next/static/chunks/297d55555b71baba.js +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/_next/static/chunks/2ab439ce003cd691.js +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/_next/static/chunks/2edb43b48432ac04.js +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/_next/static/chunks/34d289e6db2ef551.js +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/_next/static/chunks/414e77373f8ff61c.js +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/_next/static/chunks/49ca65abd26ae49e.js +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/_next/static/chunks/652ad0aa26265c47.js +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/_next/static/chunks/9667e7a3d359eb39.js +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/_next/static/chunks/99508d9d5869cc27.js +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/_next/static/chunks/9c23f44fff36548a.js +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/_next/static/chunks/a6dad97d9634a72d.js +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/_next/static/chunks/b313c35a6ba76574.js +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/_next/static/chunks/b32a0963684b9933.js +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/_next/static/chunks/c69f6cba366bd988.js +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/_next/static/chunks/d2363397e1b2bcab.css +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/_next/static/chunks/db913959c675cea6.js +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/_next/static/chunks/f061a4be97bfc3b3.js +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/_next/static/chunks/f2e7afeab1178138.js +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/_next/static/chunks/f7d1a90dd75d2572.js +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/_next/static/chunks/ff1a16fafef87110.js +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/_next/static/chunks/turbopack-ffcb7ab6794027ef.js +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/_not-found/__next._full.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/_not-found/__next._head.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/_not-found/__next._index.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/_not-found/__next._not-found.__PAGE__.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/_not-found/__next._not-found.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/_not-found/__next._tree.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/_not-found/index.html +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/_not-found/index.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/contracts/__next._full.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/contracts/__next._head.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/contracts/__next._index.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/contracts/__next._tree.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/contracts/__next.contracts.__PAGE__.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/contracts/__next.contracts.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/contracts/index.html +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/contracts/index.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/documentation/__next._full.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/documentation/__next._head.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/documentation/__next._index.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/documentation/__next._tree.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/documentation/__next.documentation.__PAGE__.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/documentation/__next.documentation.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/documentation/index.html +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/documentation/index.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/index.html +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/index.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/metadata/__next._full.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/metadata/__next._head.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/metadata/__next._index.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/metadata/__next._tree.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/metadata/__next.metadata.__PAGE__.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/metadata/__next.metadata.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/metadata/index.html +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/metadata/index.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/quality/__next._full.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/quality/__next._head.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/quality/__next._index.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/quality/__next._tree.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/quality/__next.quality.__PAGE__.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/quality/__next.quality.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/quality/index.html +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/quality/index.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/rules/__next._full.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/rules/__next._head.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/rules/__next._index.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/rules/__next._tree.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/rules/__next.rules.__PAGE__.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/rules/__next.rules.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/rules/index.html +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/rules/index.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/schemas/__next._full.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/schemas/__next._head.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/schemas/__next._index.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/schemas/__next._tree.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/schemas/__next.schemas.__PAGE__.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/schemas/__next.schemas.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/schemas/index.html +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/schemas/index.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/settings/__next._full.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/settings/__next._head.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/settings/__next._index.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/settings/__next._tree.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/settings/__next.settings.__PAGE__.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/settings/__next.settings.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/settings/index.html +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/settings/index.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/.gitkeep +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/404/index.html +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/404.html +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/__next.__PAGE__.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/__next._full.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/__next._head.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/__next._index.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/__next._tree.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/_next/static/0rYA78L88aUyD2Uh38hhX/_buildManifest.js +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/_next/static/0rYA78L88aUyD2Uh38hhX/_ssgManifest.js +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/_next/static/chunks/13d4a0fbd74c1ee4.js +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/_next/static/chunks/222442f6da32302a.js +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/_next/static/chunks/247eb132b7f7b574.js +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/_next/static/chunks/297d55555b71baba.js +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/_next/static/chunks/2ab439ce003cd691.js +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/_next/static/chunks/2edb43b48432ac04.js +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/_next/static/chunks/414e77373f8ff61c.js +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/_next/static/chunks/49ca65abd26ae49e.js +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/_next/static/chunks/5e04d10c4a7b58a3.js +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/_next/static/chunks/652ad0aa26265c47.js +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/_next/static/chunks/75d88a058d8ffaa6.js +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/_next/static/chunks/8c89634cf6bad76f.js +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/_next/static/chunks/9667e7a3d359eb39.js +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/_next/static/chunks/9c23f44fff36548a.js +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/_next/static/chunks/a6dad97d9634a72d.js +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/_next/static/chunks/b32a0963684b9933.js +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/_next/static/chunks/c4fa4f4114b7c352.js +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/_next/static/chunks/c69f6cba366bd988.js +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/_next/static/chunks/d2363397e1b2bcab.css +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/_next/static/chunks/db913959c675cea6.js +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/_next/static/chunks/f061a4be97bfc3b3.js +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/_next/static/chunks/f2e7afeab1178138.js +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/_next/static/chunks/f7d1a90dd75d2572.js +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/_next/static/chunks/ff1a16fafef87110.js +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/_next/static/chunks/turbopack-ffcb7ab6794027ef.js +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/_not-found/__next._full.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/_not-found/__next._head.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/_not-found/__next._index.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/_not-found/__next._not-found.__PAGE__.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/_not-found/__next._not-found.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/_not-found/__next._tree.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/_not-found/index.html +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/_not-found/index.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/contracts/__next._full.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/contracts/__next._head.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/contracts/__next._index.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/contracts/__next._tree.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/contracts/__next.contracts.__PAGE__.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/contracts/__next.contracts.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/contracts/index.html +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/contracts/index.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/documentation/__next._full.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/documentation/__next._head.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/documentation/__next._index.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/documentation/__next._tree.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/documentation/__next.documentation.__PAGE__.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/documentation/__next.documentation.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/documentation/index.html +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/documentation/index.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/index.html +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/index.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/metadata/__next._full.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/metadata/__next._head.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/metadata/__next._index.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/metadata/__next._tree.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/metadata/__next.metadata.__PAGE__.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/metadata/__next.metadata.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/metadata/index.html +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/metadata/index.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/quality/__next._full.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/quality/__next._head.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/quality/__next._index.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/quality/__next._tree.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/quality/__next.quality.__PAGE__.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/quality/__next.quality.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/quality/index.html +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/quality/index.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/rules/__next._full.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/rules/__next._head.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/rules/__next._index.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/rules/__next._tree.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/rules/__next.rules.__PAGE__.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/rules/__next.rules.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/rules/index.html +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/rules/index.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/schemas/__next._full.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/schemas/__next._head.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/schemas/__next._index.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/schemas/__next._tree.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/schemas/__next.schemas.__PAGE__.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/schemas/__next.schemas.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/schemas/index.html +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/schemas/index.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/settings/__next._full.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/settings/__next._head.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/settings/__next._index.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/settings/__next._tree.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/settings/__next.settings.__PAGE__.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/settings/__next.settings.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/settings/index.html +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/settings/index.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/static/.gitkeep +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/static/404/index.html +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/static/404.html +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/static/__next.__PAGE__.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/static/__next._full.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/static/__next._head.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/static/__next._index.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/static/__next._tree.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/static/_next/static/chunks/222442f6da32302a.js +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/static/_next/static/chunks/247eb132b7f7b574.js +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/static/_next/static/chunks/297d55555b71baba.js +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/static/_next/static/chunks/2ab439ce003cd691.js +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/static/_next/static/chunks/414e77373f8ff61c.js +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/static/_next/static/chunks/49ca65abd26ae49e.js +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/static/_next/static/chunks/4e310fe5005770a3.css +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/static/_next/static/chunks/5e04d10c4a7b58a3.js +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/static/_next/static/chunks/5fc14c00a2779dc5.js +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/static/_next/static/chunks/652ad0aa26265c47.js +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/static/_next/static/chunks/75d88a058d8ffaa6.js +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/static/_next/static/chunks/8c89634cf6bad76f.js +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/static/_next/static/chunks/9667e7a3d359eb39.js +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/static/_next/static/chunks/9c23f44fff36548a.js +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/static/_next/static/chunks/a6dad97d9634a72d.js +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/static/_next/static/chunks/b32a0963684b9933.js +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/static/_next/static/chunks/b584574fdc8ab13e.js +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/static/_next/static/chunks/c69f6cba366bd988.js +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/static/_next/static/chunks/d5989c94d3614b3a.js +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/static/_next/static/chunks/db913959c675cea6.js +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/static/_next/static/chunks/f061a4be97bfc3b3.js +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/static/_next/static/chunks/f2e7afeab1178138.js +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/static/_next/static/chunks/ff1a16fafef87110.js +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/static/_next/static/chunks/turbopack-ffcb7ab6794027ef.js +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/static/_next/static/tNTkVW6puVXC4bAm4WrHl/_buildManifest.js +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/static/_next/static/tNTkVW6puVXC4bAm4WrHl/_ssgManifest.js +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/static/_not-found/__next._full.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/static/_not-found/__next._head.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/static/_not-found/__next._index.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/static/_not-found/__next._not-found.__PAGE__.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/static/_not-found/__next._not-found.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/static/_not-found/__next._tree.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/static/_not-found/index.html +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/static/_not-found/index.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/static/contracts/__next._full.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/static/contracts/__next._head.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/static/contracts/__next._index.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/static/contracts/__next._tree.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/static/contracts/__next.contracts.__PAGE__.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/static/contracts/__next.contracts.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/static/contracts/index.html +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/static/contracts/index.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/static/documentation/__next._full.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/static/documentation/__next._head.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/static/documentation/__next._index.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/static/documentation/__next._tree.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/static/documentation/__next.documentation.__PAGE__.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/static/documentation/__next.documentation.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/static/documentation/index.html +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/static/documentation/index.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/static/index.html +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/static/index.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/static/metadata/__next._full.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/static/metadata/__next._head.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/static/metadata/__next._index.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/static/metadata/__next._tree.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/static/metadata/__next.metadata.__PAGE__.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/static/metadata/__next.metadata.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/static/metadata/index.html +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/static/metadata/index.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/static/quality/__next._full.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/static/quality/__next._head.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/static/quality/__next._index.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/static/quality/__next._tree.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/static/quality/__next.quality.__PAGE__.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/static/quality/__next.quality.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/static/quality/index.html +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/static/quality/index.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/static/rules/__next._full.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/static/rules/__next._head.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/static/rules/__next._index.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/static/rules/__next._tree.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/static/rules/__next.rules.__PAGE__.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/static/rules/__next.rules.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/static/rules/index.html +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/static/rules/index.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/static/schemas/__next._full.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/static/schemas/__next._head.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/static/schemas/__next._index.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/static/schemas/__next._tree.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/static/schemas/__next.schemas.__PAGE__.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/static/schemas/__next.schemas.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/static/schemas/index.html +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/static/schemas/index.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/static/settings/__next._full.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/static/settings/__next._head.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/static/settings/__next._index.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/static/settings/__next._tree.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/static/settings/__next.settings.__PAGE__.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/static/settings/__next.settings.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/static/settings/index.html +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/static/settings/index.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/static/validation/__next._full.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/static/validation/__next._head.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/static/validation/__next._index.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/static/validation/__next._tree.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/static/validation/__next.validation.__PAGE__.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/static/validation/__next.validation.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/static/validation/index.html +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/static/validation/index.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/validation/__next._full.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/validation/__next._head.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/validation/__next._index.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/validation/__next._tree.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/validation/__next.validation.__PAGE__.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/validation/__next.validation.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/validation/index.html +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/static/validation/index.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/validation/__next._full.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/validation/__next._head.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/validation/__next._index.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/validation/__next._tree.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/validation/__next.validation.__PAGE__.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/validation/__next.validation.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/validation/index.html +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/ui/static/validation/index.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/utils/__init__.py +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/utils/value_injector.py +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter/utils/version.py +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/worker/__init__.py +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src/pycharter}/worker/models.py +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter.egg-info/dependency_links.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter.egg-info/entry_points.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25/src}/pycharter.egg-info/requires.txt +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25}/tests/test_contract_builder.py +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25}/tests/test_contract_parser.py +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25}/tests/test_extractors.py +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25}/tests/test_integration.py +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25}/tests/test_json_schema_compliance.py +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25}/tests/test_json_schema_converter.py +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25}/tests/test_metadata_stores.py +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25}/tests/test_pydantic_generator.py +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25}/tests/test_refs_and_definitions.py +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25}/tests/test_runtime_validator.py +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25}/tests/test_schema_parser.py +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25}/tests/test_value_injector.py +0 -0
- {pycharter-0.0.24 → pycharter-0.0.25}/tests/test_x_validators.py +0 -0
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
include README.md
|
|
2
|
+
include LICENSE
|
|
3
|
+
include pyproject.toml
|
|
4
|
+
# Source layout: all package code under src/
|
|
5
|
+
recursive-include src *.py
|
|
6
|
+
recursive-include src *.yaml
|
|
7
|
+
recursive-include src *.json
|
|
8
|
+
recursive-include src *.mako
|
|
9
|
+
recursive-include src *.md
|
|
10
|
+
recursive-include src *.typed
|
|
11
|
+
# Alembic migration templates
|
|
12
|
+
recursive-include src/pycharter/db/migrations *.mako
|
|
13
|
+
# Pre-built UI static files (build with: pycharter ui build)
|
|
14
|
+
recursive-include src/pycharter/ui/static *
|
|
15
|
+
# Exclude UI source and build artifacts
|
|
16
|
+
prune src/pycharter/ui/node_modules
|
|
17
|
+
prune src/pycharter/ui/.next
|
|
18
|
+
prune src/pycharter/ui/out
|
|
19
|
+
prune src/pycharter/ui/src
|
|
20
|
+
prune src/pycharter/ui/public
|
|
21
|
+
recursive-exclude src/pycharter/ui/src *.ts *.tsx *.js *.json *.md
|
|
22
|
+
recursive-exclude src/pycharter/ui *.ts *.tsx *.config.*
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: pycharter
|
|
3
|
-
Version: 0.0.
|
|
3
|
+
Version: 0.0.25
|
|
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
|
|
@@ -5,7 +5,7 @@ build-backend = "setuptools.build_meta"
|
|
|
5
5
|
|
|
6
6
|
[project]
|
|
7
7
|
name = "pycharter"
|
|
8
|
-
version = "0.0.
|
|
8
|
+
version = "0.0.25"
|
|
9
9
|
description = "A Python package for data contract management with five core services: contract parsing, metadata storage, Pydantic generation, JSON Schema conversion, and runtime validation"
|
|
10
10
|
readme = "README.md"
|
|
11
11
|
requires-python = ">=3.10"
|
|
@@ -82,26 +82,28 @@ etl = [
|
|
|
82
82
|
"lxml>=4.9.0", # For XML file support
|
|
83
83
|
]
|
|
84
84
|
|
|
85
|
-
[tool.setuptools]
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
#
|
|
85
|
+
[tool.setuptools.packages.find]
|
|
86
|
+
where = ["src"]
|
|
87
|
+
include = ["pycharter*"]
|
|
88
|
+
# Single installable package; api, ui, worker are subpackages (pycharter.api, etc.)
|
|
89
|
+
# Custom build commands (UI build) are defined in setup.py
|
|
89
90
|
|
|
90
91
|
[tool.setuptools.package-data]
|
|
91
92
|
pycharter = [
|
|
92
93
|
"py.typed",
|
|
93
|
-
#
|
|
94
|
+
# Migration files and templates
|
|
94
95
|
"db/migrations/versions/*.py",
|
|
95
96
|
"db/migrations/env.py",
|
|
96
97
|
"db/migrations/script.py.mako",
|
|
97
98
|
"db/migrations/README",
|
|
98
|
-
#
|
|
99
|
+
# Template files (contract artifacts; ETL configs)
|
|
99
100
|
"data/templates/contract/*.yaml",
|
|
100
101
|
"data/templates/etl/*.yaml",
|
|
101
102
|
"data/templates/etl/README.md",
|
|
103
|
+
# UI static files (build with: pycharter ui build)
|
|
104
|
+
"ui/static/*",
|
|
105
|
+
"ui/static/**/*",
|
|
102
106
|
]
|
|
103
|
-
# Include UI static files in package (like Airflow's www/static)
|
|
104
|
-
# Note: ui/static/ must be built before packaging (run: pycharter ui build)
|
|
105
107
|
|
|
106
108
|
[project.scripts]
|
|
107
109
|
pycharter = "pycharter.cli:main"
|
|
@@ -24,10 +24,10 @@ class BuildUICommand(build_py):
|
|
|
24
24
|
# Ensure packages attribute exists (needed for build_meta compatibility)
|
|
25
25
|
# The base class accesses self.packages, which comes from self.distribution.packages
|
|
26
26
|
if not hasattr(self.distribution, 'packages') or self.distribution.packages is None:
|
|
27
|
-
# Packages should be set from pyproject.toml, but ensure it exists
|
|
27
|
+
# Packages should be set from pyproject.toml (src layout), but ensure it exists
|
|
28
28
|
try:
|
|
29
29
|
from setuptools import find_packages
|
|
30
|
-
self.distribution.packages = find_packages()
|
|
30
|
+
self.distribution.packages = find_packages(where="src")
|
|
31
31
|
except Exception:
|
|
32
32
|
self.distribution.packages = ["pycharter"]
|
|
33
33
|
|
|
@@ -52,8 +52,8 @@ class BuildUICommand(build_py):
|
|
|
52
52
|
self.build_lib = os.path.join('build', 'lib')
|
|
53
53
|
|
|
54
54
|
def run(self):
|
|
55
|
-
"""Build the UI static files before building the package."""
|
|
56
|
-
ui_dir = Path(__file__).parent / "ui"
|
|
55
|
+
"""Build the UI static files before building the package (src layout)."""
|
|
56
|
+
ui_dir = Path(__file__).parent / "src" / "pycharter" / "ui"
|
|
57
57
|
static_dir = ui_dir / "static"
|
|
58
58
|
out_dir = ui_dir / "out"
|
|
59
59
|
|
|
@@ -142,6 +142,7 @@ if __name__ == "__main__":
|
|
|
142
142
|
from setuptools import find_packages
|
|
143
143
|
|
|
144
144
|
setup(
|
|
145
|
-
|
|
145
|
+
package_dir={"": "src"},
|
|
146
|
+
packages=find_packages(where="src"),
|
|
146
147
|
cmdclass=cmdclass,
|
|
147
148
|
)
|
|
@@ -0,0 +1,340 @@
|
|
|
1
|
+
# PyCharter API
|
|
2
|
+
|
|
3
|
+
REST API wrapper for PyCharter services using FastAPI.
|
|
4
|
+
|
|
5
|
+
## Overview
|
|
6
|
+
|
|
7
|
+
The PyCharter API is located at the root level of the repository (`api/`) and provides HTTP endpoints for all core PyCharter services:
|
|
8
|
+
- **Contract Parsing**: Parse data contract files into components
|
|
9
|
+
- **Contract Building**: Reconstruct contracts from metadata store
|
|
10
|
+
- **Metadata Storage**: Store and retrieve schemas, metadata, and rules
|
|
11
|
+
- **Schema Generation**: Generate Pydantic models from JSON Schemas
|
|
12
|
+
- **Schema Conversion**: Convert Pydantic models to JSON Schemas
|
|
13
|
+
- **Runtime Validation**: Validate data against schemas
|
|
14
|
+
- **Quality Assurance**: Run quality checks, query metrics and violations
|
|
15
|
+
|
|
16
|
+
## Installation
|
|
17
|
+
|
|
18
|
+
Install PyCharter with API dependencies:
|
|
19
|
+
|
|
20
|
+
```bash
|
|
21
|
+
pip install pycharter[api]
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
## Running the API Server
|
|
25
|
+
|
|
26
|
+
### Using the CLI command:
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
pycharter api
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
### Using uvicorn directly:
|
|
33
|
+
|
|
34
|
+
```bash
|
|
35
|
+
uvicorn api.main:app --reload
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
### Using Python:
|
|
39
|
+
|
|
40
|
+
```python
|
|
41
|
+
from api.main import main
|
|
42
|
+
main()
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
## Configuration
|
|
46
|
+
|
|
47
|
+
The API requires a database connection for most endpoints. Configure it using environment variables:
|
|
48
|
+
|
|
49
|
+
### Database URL Configuration
|
|
50
|
+
|
|
51
|
+
The API uses `PYCHARTER_DATABASE_URL` environment variable to connect to the database. You can set it in several ways:
|
|
52
|
+
|
|
53
|
+
#### Method 1: Export in Shell (Recommended)
|
|
54
|
+
|
|
55
|
+
```bash
|
|
56
|
+
# Set the environment variable
|
|
57
|
+
export PYCHARTER_DATABASE_URL="postgresql://user:password@localhost:5432/pycharter"
|
|
58
|
+
|
|
59
|
+
# Then run the API
|
|
60
|
+
pycharter api
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
#### Method 2: Inline with Command
|
|
64
|
+
|
|
65
|
+
```bash
|
|
66
|
+
# Set and run in one line
|
|
67
|
+
PYCHARTER_DATABASE_URL="postgresql://user:password@localhost:5432/pycharter" pycharter api
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
#### Method 3: Add to Shell Profile (Persistent)
|
|
71
|
+
|
|
72
|
+
Add to your `~/.bashrc`, `~/.zshrc`, or `~/.profile`:
|
|
73
|
+
|
|
74
|
+
```bash
|
|
75
|
+
export PYCHARTER_DATABASE_URL="postgresql://user:password@localhost:5432/pycharter"
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
Then reload your shell:
|
|
79
|
+
```bash
|
|
80
|
+
source ~/.bashrc # or source ~/.zshrc
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
#### Method 4: Using a .env File
|
|
84
|
+
|
|
85
|
+
Create a `.env` file in your project root:
|
|
86
|
+
|
|
87
|
+
```bash
|
|
88
|
+
PYCHARTER_DATABASE_URL=postgresql://user:password@localhost:5432/pycharter
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
Then load it before running (requires `python-dotenv`):
|
|
92
|
+
```bash
|
|
93
|
+
export $(cat .env | xargs)
|
|
94
|
+
pycharter api
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
Or use `dotenv-cli`:
|
|
98
|
+
```bash
|
|
99
|
+
pip install dotenv-cli
|
|
100
|
+
dotenv run pycharter api
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
### Alternative Environment Variable
|
|
104
|
+
|
|
105
|
+
PyCharter also supports Airflow-style configuration:
|
|
106
|
+
|
|
107
|
+
```bash
|
|
108
|
+
export PYCHARTER__DATABASE__SQL_ALCHEMY_CONN="postgresql://user:password@localhost:5432/pycharter"
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
### Metadata Store Configuration
|
|
112
|
+
|
|
113
|
+
The API can be configured to use different metadata store backends:
|
|
114
|
+
|
|
115
|
+
```bash
|
|
116
|
+
# Metadata store type (in_memory, postgres, mongodb, redis)
|
|
117
|
+
export PYCHARTER_API_STORE_TYPE=postgres
|
|
118
|
+
|
|
119
|
+
# Connection string for database-backed stores
|
|
120
|
+
export PYCHARTER_API_CONNECTION_STRING=postgresql://user:pass@localhost:5432/pycharter
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
**Note**: If `PYCHARTER_DATABASE_URL` is set, it will be used for both the database connection and metadata store (for PostgreSQL).
|
|
124
|
+
|
|
125
|
+
## API Endpoints
|
|
126
|
+
|
|
127
|
+
### Contract Endpoints
|
|
128
|
+
|
|
129
|
+
#### `POST /api/v1/contracts/parse`
|
|
130
|
+
Parse a data contract dictionary into components.
|
|
131
|
+
|
|
132
|
+
**Request Body:**
|
|
133
|
+
```json
|
|
134
|
+
{
|
|
135
|
+
"contract": {
|
|
136
|
+
"schema": {...},
|
|
137
|
+
"metadata": {...},
|
|
138
|
+
"ownership": {...},
|
|
139
|
+
"governance_rules": {...}
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
**Response:**
|
|
145
|
+
```json
|
|
146
|
+
{
|
|
147
|
+
"schema": {...},
|
|
148
|
+
"metadata": {...},
|
|
149
|
+
"ownership": {...},
|
|
150
|
+
"governance_rules": {...},
|
|
151
|
+
"coercion_rules": {...},
|
|
152
|
+
"validation_rules": {...},
|
|
153
|
+
"versions": {...}
|
|
154
|
+
}
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
#### `POST /api/v1/contracts/build`
|
|
158
|
+
Build a complete contract from metadata store.
|
|
159
|
+
|
|
160
|
+
**Request Body:**
|
|
161
|
+
```json
|
|
162
|
+
{
|
|
163
|
+
"schema_id": "user_schema",
|
|
164
|
+
"version": "1.0.0",
|
|
165
|
+
"include_metadata": true,
|
|
166
|
+
"include_ownership": true,
|
|
167
|
+
"include_governance": true
|
|
168
|
+
}
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
#### `GET /api/v1/contracts`
|
|
172
|
+
List all data contracts stored in the database.
|
|
173
|
+
|
|
174
|
+
#### `GET /api/v1/contracts/{contract_id}`
|
|
175
|
+
Get a specific data contract by ID.
|
|
176
|
+
|
|
177
|
+
### Metadata Endpoints
|
|
178
|
+
|
|
179
|
+
#### `GET /api/v1/metadata/schemas`
|
|
180
|
+
List all schemas stored in the metadata store.
|
|
181
|
+
|
|
182
|
+
#### `GET /api/v1/metadata/schemas/{schema_id}`
|
|
183
|
+
Get a schema by ID (optional version parameter).
|
|
184
|
+
|
|
185
|
+
#### `GET /api/v1/metadata/schemas/{schema_id}/complete`
|
|
186
|
+
Get complete schema with coercion and validation rules merged.
|
|
187
|
+
|
|
188
|
+
#### `POST /api/v1/metadata/schemas`
|
|
189
|
+
Store a schema in the metadata store.
|
|
190
|
+
|
|
191
|
+
#### `GET /api/v1/metadata/metadata/{schema_id}`
|
|
192
|
+
Get metadata for a schema (optional version parameter).
|
|
193
|
+
|
|
194
|
+
#### `POST /api/v1/metadata/metadata`
|
|
195
|
+
Store metadata for a schema.
|
|
196
|
+
|
|
197
|
+
#### `GET /api/v1/metadata/coercion-rules/{schema_id}`
|
|
198
|
+
Get coercion rules for a schema (optional version parameter).
|
|
199
|
+
|
|
200
|
+
#### `POST /api/v1/metadata/coercion-rules`
|
|
201
|
+
Store coercion rules for a schema.
|
|
202
|
+
|
|
203
|
+
#### `GET /api/v1/metadata/validation-rules/{schema_id}`
|
|
204
|
+
Get validation rules for a schema (optional version parameter).
|
|
205
|
+
|
|
206
|
+
#### `POST /api/v1/metadata/validation-rules`
|
|
207
|
+
Store validation rules for a schema.
|
|
208
|
+
|
|
209
|
+
### Quality Assurance Endpoints
|
|
210
|
+
|
|
211
|
+
#### `GET /api/v1/quality/metrics`
|
|
212
|
+
List quality metrics (optional filtering by schema_id, pagination).
|
|
213
|
+
|
|
214
|
+
#### `GET /api/v1/quality/metrics/{metric_id}`
|
|
215
|
+
Get a specific quality metric by ID.
|
|
216
|
+
|
|
217
|
+
#### `GET /api/v1/quality/reports/{schema_id}`
|
|
218
|
+
Get quality reports for a schema/data feed (optional data_source filter).
|
|
219
|
+
|
|
220
|
+
#### `POST /api/v1/quality/check`
|
|
221
|
+
Run a quality check against a data contract.
|
|
222
|
+
|
|
223
|
+
#### `POST /api/v1/quality/violations`
|
|
224
|
+
Query data quality violations.
|
|
225
|
+
|
|
226
|
+
### Schema Endpoints
|
|
227
|
+
|
|
228
|
+
#### `POST /api/v1/schemas/generate`
|
|
229
|
+
Generate Pydantic model from JSON Schema.
|
|
230
|
+
|
|
231
|
+
#### `POST /api/v1/schemas/convert`
|
|
232
|
+
Convert Pydantic model to JSON Schema.
|
|
233
|
+
|
|
234
|
+
### Validation Endpoints
|
|
235
|
+
|
|
236
|
+
#### `POST /api/v1/validation/validate`
|
|
237
|
+
Validate a single record against a schema.
|
|
238
|
+
|
|
239
|
+
#### `POST /api/v1/validation/validate-batch`
|
|
240
|
+
Validate a batch of records against a schema.
|
|
241
|
+
|
|
242
|
+
## API Documentation
|
|
243
|
+
|
|
244
|
+
Once the API server is running, you can access:
|
|
245
|
+
|
|
246
|
+
- **Swagger UI**: http://localhost:8000/docs
|
|
247
|
+
- **ReDoc**: http://localhost:8000/redoc
|
|
248
|
+
- **OpenAPI JSON**: http://localhost:8000/openapi.json
|
|
249
|
+
|
|
250
|
+
## Example Usage
|
|
251
|
+
|
|
252
|
+
### Using curl:
|
|
253
|
+
|
|
254
|
+
```bash
|
|
255
|
+
# List all contracts
|
|
256
|
+
curl http://localhost:8000/api/v1/contracts
|
|
257
|
+
|
|
258
|
+
# Get a specific contract
|
|
259
|
+
curl http://localhost:8000/api/v1/contracts/{contract_id}
|
|
260
|
+
|
|
261
|
+
# List all schemas
|
|
262
|
+
curl http://localhost:8000/api/v1/metadata/schemas
|
|
263
|
+
|
|
264
|
+
# Get a schema
|
|
265
|
+
curl http://localhost:8000/api/v1/metadata/schemas/{schema_id}
|
|
266
|
+
|
|
267
|
+
# Get quality metrics
|
|
268
|
+
curl http://localhost:8000/api/v1/quality/metrics
|
|
269
|
+
|
|
270
|
+
# Get quality report for a schema
|
|
271
|
+
curl http://localhost:8000/api/v1/quality/reports/{schema_id}
|
|
272
|
+
```
|
|
273
|
+
|
|
274
|
+
### Using Python requests:
|
|
275
|
+
|
|
276
|
+
```python
|
|
277
|
+
import requests
|
|
278
|
+
|
|
279
|
+
# List contracts
|
|
280
|
+
response = requests.get("http://localhost:8000/api/v1/contracts")
|
|
281
|
+
contracts = response.json()
|
|
282
|
+
|
|
283
|
+
# Get quality metrics
|
|
284
|
+
response = requests.get("http://localhost:8000/api/v1/quality/metrics")
|
|
285
|
+
metrics = response.json()
|
|
286
|
+
```
|
|
287
|
+
|
|
288
|
+
## Troubleshooting
|
|
289
|
+
|
|
290
|
+
### Database Connection Issues
|
|
291
|
+
|
|
292
|
+
If you see errors about database URL not being configured:
|
|
293
|
+
|
|
294
|
+
1. **Check environment variable is set:**
|
|
295
|
+
```bash
|
|
296
|
+
echo $PYCHARTER_DATABASE_URL
|
|
297
|
+
```
|
|
298
|
+
|
|
299
|
+
2. **Verify database is accessible:**
|
|
300
|
+
```bash
|
|
301
|
+
psql $PYCHARTER_DATABASE_URL -c "SELECT 1;"
|
|
302
|
+
```
|
|
303
|
+
|
|
304
|
+
3. **Ensure database is initialized:**
|
|
305
|
+
```bash
|
|
306
|
+
pycharter db init $PYCHARTER_DATABASE_URL
|
|
307
|
+
```
|
|
308
|
+
|
|
309
|
+
### API Not Starting
|
|
310
|
+
|
|
311
|
+
If the API fails to start:
|
|
312
|
+
|
|
313
|
+
1. **Check if uvicorn is installed:**
|
|
314
|
+
```bash
|
|
315
|
+
pip install pycharter[api]
|
|
316
|
+
```
|
|
317
|
+
|
|
318
|
+
2. **Check for port conflicts:**
|
|
319
|
+
```bash
|
|
320
|
+
# Use a different port
|
|
321
|
+
pycharter api --port 8001
|
|
322
|
+
```
|
|
323
|
+
|
|
324
|
+
3. **Check logs for errors:**
|
|
325
|
+
The API will print error messages to stderr if there are configuration issues.
|
|
326
|
+
|
|
327
|
+
## Production Deployment
|
|
328
|
+
|
|
329
|
+
For production, consider:
|
|
330
|
+
|
|
331
|
+
1. **Use a process manager** (systemd, supervisor, etc.)
|
|
332
|
+
2. **Set environment variables** in your deployment configuration
|
|
333
|
+
3. **Use a reverse proxy** (nginx, traefik) in front of the API
|
|
334
|
+
4. **Enable HTTPS** for secure connections
|
|
335
|
+
5. **Configure CORS** appropriately in `api/main.py`
|
|
336
|
+
6. **Use a production ASGI server** like Gunicorn with Uvicorn workers:
|
|
337
|
+
|
|
338
|
+
```bash
|
|
339
|
+
gunicorn api.main:app -w 4 -k uvicorn.workers.UvicornWorker
|
|
340
|
+
```
|
|
@@ -17,7 +17,7 @@ __version__ = "0.0.3"
|
|
|
17
17
|
|
|
18
18
|
# Check if FastAPI is available
|
|
19
19
|
try:
|
|
20
|
-
from api.main import app, create_application
|
|
20
|
+
from pycharter.api.main import app, create_application
|
|
21
21
|
__all__ = ["app", "create_application"]
|
|
22
22
|
except (ImportError, ModuleNotFoundError):
|
|
23
23
|
# FastAPI not installed or api module not available
|
|
@@ -4,7 +4,7 @@ Dependencies for API routes.
|
|
|
4
4
|
This module provides FastAPI dependency injection for shared resources.
|
|
5
5
|
"""
|
|
6
6
|
|
|
7
|
-
from api.dependencies.database import get_db_session
|
|
8
|
-
from api.dependencies.store import get_metadata_store
|
|
7
|
+
from pycharter.api.dependencies.database import get_db_session
|
|
8
|
+
from pycharter.api.dependencies.store import get_metadata_store
|
|
9
9
|
|
|
10
10
|
__all__ = ["get_db_session", "get_metadata_store"]
|
|
@@ -16,7 +16,7 @@ from fastapi.routing import APIRoute
|
|
|
16
16
|
from pycharter import __version__ as pycharter_version
|
|
17
17
|
|
|
18
18
|
# Import routers from v1
|
|
19
|
-
from api.routes.v1 import (
|
|
19
|
+
from pycharter.api.routes.v1 import (
|
|
20
20
|
contracts,
|
|
21
21
|
metadata,
|
|
22
22
|
quality,
|
|
@@ -296,7 +296,7 @@ def main():
|
|
|
296
296
|
import uvicorn
|
|
297
297
|
|
|
298
298
|
uvicorn.run(
|
|
299
|
-
"api.main:app",
|
|
299
|
+
"pycharter.api.main:app",
|
|
300
300
|
host="0.0.0.0",
|
|
301
301
|
port=8000,
|
|
302
302
|
reload=True, # Set to False in production
|
|
@@ -4,13 +4,13 @@ API request and response models.
|
|
|
4
4
|
This module contains Pydantic models for API request/response validation.
|
|
5
5
|
"""
|
|
6
6
|
|
|
7
|
-
from api.models.contracts import (
|
|
7
|
+
from pycharter.api.models.contracts import (
|
|
8
8
|
ContractParseRequest,
|
|
9
9
|
ContractParseResponse,
|
|
10
10
|
ContractBuildRequest,
|
|
11
11
|
ContractBuildResponse,
|
|
12
12
|
)
|
|
13
|
-
from api.models.metadata import (
|
|
13
|
+
from pycharter.api.models.metadata import (
|
|
14
14
|
MetadataStoreRequest,
|
|
15
15
|
MetadataStoreResponse,
|
|
16
16
|
MetadataGetRequest,
|
|
@@ -20,13 +20,13 @@ from api.models.metadata import (
|
|
|
20
20
|
SchemaGetRequest,
|
|
21
21
|
SchemaGetResponse,
|
|
22
22
|
)
|
|
23
|
-
from api.models.schemas import (
|
|
23
|
+
from pycharter.api.models.schemas import (
|
|
24
24
|
SchemaGenerateRequest,
|
|
25
25
|
SchemaGenerateResponse,
|
|
26
26
|
SchemaConvertRequest,
|
|
27
27
|
SchemaConvertResponse,
|
|
28
28
|
)
|
|
29
|
-
from api.models.validation import (
|
|
29
|
+
from pycharter.api.models.validation import (
|
|
30
30
|
ValidationRequest,
|
|
31
31
|
ValidationResponse,
|
|
32
32
|
ValidationBatchRequest,
|
|
@@ -15,9 +15,9 @@ from pycharter.contract_builder.builder import ContractArtifacts
|
|
|
15
15
|
from pycharter.db.models import DataContractModel
|
|
16
16
|
from pycharter.metadata_store import MetadataStoreClient
|
|
17
17
|
|
|
18
|
-
from api.dependencies.database import get_db_session
|
|
19
|
-
from api.dependencies.store import get_metadata_store
|
|
20
|
-
from api.models.contracts import (
|
|
18
|
+
from pycharter.api.dependencies.database import get_db_session
|
|
19
|
+
from pycharter.api.dependencies.store import get_metadata_store
|
|
20
|
+
from pycharter.api.models.contracts import (
|
|
21
21
|
ContractBuildRequest,
|
|
22
22
|
ContractBuildResponse,
|
|
23
23
|
ContractCreateFromArtifactsRequest,
|
|
@@ -28,7 +28,7 @@ from api.models.contracts import (
|
|
|
28
28
|
ContractParseResponse,
|
|
29
29
|
ContractUpdateRequest,
|
|
30
30
|
)
|
|
31
|
-
from api.utils import ensure_uuid, get_by_id_or_404, safe_uuid_to_str
|
|
31
|
+
from pycharter.api.utils import ensure_uuid, get_by_id_or_404, safe_uuid_to_str
|
|
32
32
|
|
|
33
33
|
logger = logging.getLogger(__name__)
|
|
34
34
|
router = APIRouter()
|
|
@@ -9,8 +9,8 @@ from typing import Optional
|
|
|
9
9
|
|
|
10
10
|
from fastapi import APIRouter, Depends, HTTPException, Query
|
|
11
11
|
|
|
12
|
-
from api.dependencies.store import get_metadata_store
|
|
13
|
-
from api.models.docs import (
|
|
12
|
+
from pycharter.api.dependencies.store import get_metadata_store
|
|
13
|
+
from pycharter.api.models.docs import (
|
|
14
14
|
DocsFormat,
|
|
15
15
|
DocsRequest,
|
|
16
16
|
DocsResponse,
|
|
@@ -9,8 +9,8 @@ from typing import Optional
|
|
|
9
9
|
|
|
10
10
|
from fastapi import APIRouter, Depends, HTTPException, Query
|
|
11
11
|
|
|
12
|
-
from api.dependencies.store import get_metadata_store
|
|
13
|
-
from api.models.evolution import (
|
|
12
|
+
from pycharter.api.dependencies.store import get_metadata_store
|
|
13
|
+
from pycharter.api.models.evolution import (
|
|
14
14
|
ChangeTypeEnum,
|
|
15
15
|
CompatibilityCheckRequest,
|
|
16
16
|
CompatibilityCheckResponse,
|
|
@@ -7,10 +7,10 @@ from typing import Any, Dict, List
|
|
|
7
7
|
from fastapi import APIRouter, Depends, HTTPException, Query, status
|
|
8
8
|
from sqlalchemy.orm import Session
|
|
9
9
|
|
|
10
|
-
from api.dependencies.database import get_db_session
|
|
11
|
-
from api.dependencies.store import get_metadata_store
|
|
12
|
-
from api.utils import ensure_uuid, get_by_id_or_404, model_to_dict, safe_uuid_to_str
|
|
13
|
-
from api.models.metadata import (
|
|
10
|
+
from pycharter.api.dependencies.database import get_db_session
|
|
11
|
+
from pycharter.api.dependencies.store import get_metadata_store
|
|
12
|
+
from pycharter.api.utils import ensure_uuid, get_by_id_or_404, model_to_dict, safe_uuid_to_str
|
|
13
|
+
from pycharter.api.models.metadata import (
|
|
14
14
|
CoercionRulesStoreRequest,
|
|
15
15
|
MetadataGetRequest,
|
|
16
16
|
MetadataGetResponse,
|
|
@@ -26,7 +26,7 @@ from api.models.metadata import (
|
|
|
26
26
|
SchemaStoreResponse,
|
|
27
27
|
ValidationRulesStoreRequest,
|
|
28
28
|
)
|
|
29
|
-
from api.models.metadata_entities import (
|
|
29
|
+
from pycharter.api.models.metadata_entities import (
|
|
30
30
|
DomainCreateRequest,
|
|
31
31
|
DomainUpdateRequest,
|
|
32
32
|
EnvironmentCreateRequest,
|
|
@@ -18,9 +18,9 @@ from pycharter.quality import (
|
|
|
18
18
|
QualityReport,
|
|
19
19
|
QualityThresholds,
|
|
20
20
|
)
|
|
21
|
-
from api.dependencies.store import get_metadata_store
|
|
22
|
-
from api.dependencies.database import get_db_session
|
|
23
|
-
from api.models.quality import (
|
|
21
|
+
from pycharter.api.dependencies.store import get_metadata_store
|
|
22
|
+
from pycharter.api.dependencies.database import get_db_session
|
|
23
|
+
from pycharter.api.models.quality import (
|
|
24
24
|
FieldQualityMetricsResponse,
|
|
25
25
|
QualityCheckRequest,
|
|
26
26
|
QualityReportResponse,
|
|
@@ -5,7 +5,7 @@ Route handlers for schema generation and conversion.
|
|
|
5
5
|
from fastapi import APIRouter, HTTPException, status
|
|
6
6
|
|
|
7
7
|
from pycharter import from_dict, to_dict
|
|
8
|
-
from api.models.schemas import (
|
|
8
|
+
from pycharter.api.models.schemas import (
|
|
9
9
|
SchemaConvertRequest,
|
|
10
10
|
SchemaConvertResponse,
|
|
11
11
|
SchemaGenerateRequest,
|
|
@@ -13,7 +13,7 @@ from sqlalchemy.exc import SQLAlchemyError
|
|
|
13
13
|
from sqlalchemy.orm import Session
|
|
14
14
|
|
|
15
15
|
from pycharter.config import get_database_url
|
|
16
|
-
from api.dependencies.database import get_db_session
|
|
16
|
+
from pycharter.api.dependencies.database import get_db_session
|
|
17
17
|
|
|
18
18
|
router = APIRouter()
|
|
19
19
|
|
|
@@ -7,8 +7,8 @@ Supports the new ValidatorBuilder API with quality metrics.
|
|
|
7
7
|
from fastapi import APIRouter, Depends, HTTPException, status
|
|
8
8
|
|
|
9
9
|
from pycharter import Validator, ValidatorBuilder
|
|
10
|
-
from api.dependencies.store import get_metadata_store
|
|
11
|
-
from api.models.validation import (
|
|
10
|
+
from pycharter.api.dependencies.store import get_metadata_store
|
|
11
|
+
from pycharter.api.models.validation import (
|
|
12
12
|
ValidationBatchRequest,
|
|
13
13
|
ValidationBatchResponse,
|
|
14
14
|
ValidationErrorDetail,
|
|
@@ -12,14 +12,14 @@ from fastapi import APIRouter, Depends, HTTPException, status
|
|
|
12
12
|
from pydantic import BaseModel, Field
|
|
13
13
|
|
|
14
14
|
if TYPE_CHECKING:
|
|
15
|
-
from worker.queue.redis_queue import ValidationJobQueue
|
|
15
|
+
from pycharter.worker.queue.redis_queue import ValidationJobQueue
|
|
16
16
|
|
|
17
|
-
from api.dependencies.store import get_metadata_store
|
|
17
|
+
from pycharter.api.dependencies.store import get_metadata_store
|
|
18
18
|
from pycharter.metadata_store import MetadataStoreClient
|
|
19
19
|
|
|
20
20
|
# Try to import worker components
|
|
21
21
|
try:
|
|
22
|
-
from worker.queue.redis_queue import ValidationJobQueue
|
|
22
|
+
from pycharter.worker.queue.redis_queue import ValidationJobQueue
|
|
23
23
|
WORKER_AVAILABLE = True
|
|
24
24
|
except ImportError:
|
|
25
25
|
WORKER_AVAILABLE = False
|