pycharter 0.0.24__py3-none-any.whl → 0.0.25__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.
- pycharter/api/README.md +340 -0
- {api → pycharter/api}/__init__.py +1 -1
- {api → pycharter/api}/dependencies/__init__.py +2 -2
- {api → pycharter/api}/main.py +2 -2
- {api → pycharter/api}/models/__init__.py +4 -4
- {api → pycharter/api}/routes/v1/__init__.py +1 -1
- {api → pycharter/api}/routes/v1/contracts.py +4 -4
- {api → pycharter/api}/routes/v1/docs.py +2 -2
- {api → pycharter/api}/routes/v1/evolution.py +2 -2
- {api → pycharter/api}/routes/v1/metadata.py +5 -5
- {api → pycharter/api}/routes/v1/quality.py +3 -3
- {api → pycharter/api}/routes/v1/schemas.py +1 -1
- {api → pycharter/api}/routes/v1/settings.py +1 -1
- {api → pycharter/api}/routes/v1/tracking.py +1 -1
- {api → pycharter/api}/routes/v1/validation.py +2 -2
- {api → pycharter/api}/routes/v1/validation_jobs.py +3 -3
- pycharter/cli.py +8 -10
- pycharter/data/templates/contract/README.md +144 -0
- pycharter/db/README.md +179 -0
- pycharter/db/schemas/README.md +96 -0
- pycharter/etl_generator/ASYNC_AND_EXECUTION.md +91 -0
- pycharter/etl_generator/INTERFACES.md +143 -0
- pycharter/etl_generator/README.md +271 -0
- pycharter/etl_generator/TRANSFORMATION_GUIDE.md +452 -0
- pycharter/etl_generator/schemas/extract.json +234 -0
- pycharter/etl_generator/schemas/load.json +202 -0
- pycharter/etl_generator/schemas/pipeline.json +94 -0
- pycharter/etl_generator/schemas/transform.json +171 -0
- pycharter/metadata_store/README.md +229 -0
- pycharter/quality/README.md +235 -0
- pycharter/ui/.eslintrc.json +4 -0
- pycharter/ui/README.md +186 -0
- {ui → pycharter/ui}/__init__.py +3 -3
- pycharter/ui/components.json +17 -0
- pycharter/ui/package-lock.json +6608 -0
- pycharter/ui/package.json +36 -0
- {ui → pycharter/ui}/server.py +7 -8
- pycharter/ui/static/_next/static/2gKjNv6YvE6BcIdFthBLs/_clientMiddlewareManifest.json +1 -0
- pycharter/ui/static/static/_next/static/0rYA78L88aUyD2Uh38hhX/_clientMiddlewareManifest.json +1 -0
- pycharter/ui/static/static/static/_next/static/tNTkVW6puVXC4bAm4WrHl/_clientMiddlewareManifest.json +1 -0
- pycharter/ui/tsconfig.json +42 -0
- pycharter/worker/README.md +187 -0
- pycharter/worker/backends/__init__.py +8 -0
- pycharter/worker/backends/base.py +46 -0
- pycharter/worker/backends/spark.py +233 -0
- {worker → pycharter/worker}/cli.py +1 -1
- {worker → pycharter/worker}/processor.py +2 -2
- pycharter/worker/queue/__init__.py +8 -0
- pycharter/worker/queue/redis_queue.py +147 -0
- {pycharter-0.0.24.dist-info → pycharter-0.0.25.dist-info}/METADATA +1 -1
- pycharter-0.0.25.dist-info/RECORD +572 -0
- pycharter-0.0.25.dist-info/top_level.txt +1 -0
- pycharter-0.0.24.dist-info/RECORD +0 -543
- pycharter-0.0.24.dist-info/top_level.txt +0 -4
- {api → pycharter/api}/dependencies/database.py +0 -0
- {api → pycharter/api}/dependencies/store.py +0 -0
- {api → pycharter/api}/models/contracts.py +0 -0
- {api → pycharter/api}/models/docs.py +0 -0
- {api → pycharter/api}/models/evolution.py +0 -0
- {api → pycharter/api}/models/metadata.py +0 -0
- {api → pycharter/api}/models/metadata_entities.py +0 -0
- {api → pycharter/api}/models/quality.py +0 -0
- {api → pycharter/api}/models/schemas.py +0 -0
- {api → pycharter/api}/models/tracking.py +0 -0
- {api → pycharter/api}/models/validation.py +0 -0
- {api → pycharter/api}/routes/__init__.py +0 -0
- {api → pycharter/api}/routes/v1/templates.py +0 -0
- {api → pycharter/api}/utils.py +0 -0
- {ui → pycharter/ui}/build.py +0 -0
- {ui → pycharter/ui}/dev.py +0 -0
- {ui → pycharter/ui}/static/.gitkeep +0 -0
- {ui → pycharter/ui}/static/404/index.html +0 -0
- {ui → pycharter/ui}/static/404.html +0 -0
- {ui → pycharter/ui}/static/__next.__PAGE__.txt +0 -0
- {ui → pycharter/ui}/static/__next._full.txt +0 -0
- {ui → pycharter/ui}/static/__next._head.txt +0 -0
- {ui → pycharter/ui}/static/__next._index.txt +0 -0
- {ui → pycharter/ui}/static/__next._tree.txt +0 -0
- {ui → pycharter/ui}/static/_next/static/2gKjNv6YvE6BcIdFthBLs/_buildManifest.js +0 -0
- {ui → pycharter/ui}/static/_next/static/2gKjNv6YvE6BcIdFthBLs/_ssgManifest.js +0 -0
- {ui → pycharter/ui}/static/_next/static/chunks/13d4a0fbd74c1ee4.js +0 -0
- {ui → pycharter/ui}/static/_next/static/chunks/222442f6da32302a.js +0 -0
- {ui → pycharter/ui}/static/_next/static/chunks/247eb132b7f7b574.js +0 -0
- {ui → pycharter/ui}/static/_next/static/chunks/26dfc590f7714c03.js +0 -0
- {ui → pycharter/ui}/static/_next/static/chunks/297d55555b71baba.js +0 -0
- {ui → pycharter/ui}/static/_next/static/chunks/2ab439ce003cd691.js +0 -0
- {ui → pycharter/ui}/static/_next/static/chunks/2edb43b48432ac04.js +0 -0
- {ui → pycharter/ui}/static/_next/static/chunks/34d289e6db2ef551.js +0 -0
- {ui → pycharter/ui}/static/_next/static/chunks/414e77373f8ff61c.js +0 -0
- {ui → pycharter/ui}/static/_next/static/chunks/49ca65abd26ae49e.js +0 -0
- {ui → pycharter/ui}/static/_next/static/chunks/652ad0aa26265c47.js +0 -0
- {ui → pycharter/ui}/static/_next/static/chunks/9667e7a3d359eb39.js +0 -0
- {ui → pycharter/ui}/static/_next/static/chunks/99508d9d5869cc27.js +0 -0
- {ui → pycharter/ui}/static/_next/static/chunks/9c23f44fff36548a.js +0 -0
- {ui → pycharter/ui}/static/_next/static/chunks/a6dad97d9634a72d.js +0 -0
- {ui → pycharter/ui}/static/_next/static/chunks/b313c35a6ba76574.js +0 -0
- {ui → pycharter/ui}/static/_next/static/chunks/b32a0963684b9933.js +0 -0
- {ui → pycharter/ui}/static/_next/static/chunks/c69f6cba366bd988.js +0 -0
- {ui → pycharter/ui}/static/_next/static/chunks/d2363397e1b2bcab.css +0 -0
- {ui → pycharter/ui}/static/_next/static/chunks/db913959c675cea6.js +0 -0
- {ui → pycharter/ui}/static/_next/static/chunks/f061a4be97bfc3b3.js +0 -0
- {ui → pycharter/ui}/static/_next/static/chunks/f2e7afeab1178138.js +0 -0
- {ui → pycharter/ui}/static/_next/static/chunks/f7d1a90dd75d2572.js +0 -0
- {ui → pycharter/ui}/static/_next/static/chunks/ff1a16fafef87110.js +0 -0
- {ui → pycharter/ui}/static/_next/static/chunks/turbopack-ffcb7ab6794027ef.js +0 -0
- {ui → pycharter/ui}/static/_not-found/__next._full.txt +0 -0
- {ui → pycharter/ui}/static/_not-found/__next._head.txt +0 -0
- {ui → pycharter/ui}/static/_not-found/__next._index.txt +0 -0
- {ui → pycharter/ui}/static/_not-found/__next._not-found.__PAGE__.txt +0 -0
- {ui → pycharter/ui}/static/_not-found/__next._not-found.txt +0 -0
- {ui → pycharter/ui}/static/_not-found/__next._tree.txt +0 -0
- {ui → pycharter/ui}/static/_not-found/index.html +0 -0
- {ui → pycharter/ui}/static/_not-found/index.txt +0 -0
- {ui → pycharter/ui}/static/contracts/__next._full.txt +0 -0
- {ui → pycharter/ui}/static/contracts/__next._head.txt +0 -0
- {ui → pycharter/ui}/static/contracts/__next._index.txt +0 -0
- {ui → pycharter/ui}/static/contracts/__next._tree.txt +0 -0
- {ui → pycharter/ui}/static/contracts/__next.contracts.__PAGE__.txt +0 -0
- {ui → pycharter/ui}/static/contracts/__next.contracts.txt +0 -0
- {ui → pycharter/ui}/static/contracts/index.html +0 -0
- {ui → pycharter/ui}/static/contracts/index.txt +0 -0
- {ui → pycharter/ui}/static/documentation/__next._full.txt +0 -0
- {ui → pycharter/ui}/static/documentation/__next._head.txt +0 -0
- {ui → pycharter/ui}/static/documentation/__next._index.txt +0 -0
- {ui → pycharter/ui}/static/documentation/__next._tree.txt +0 -0
- {ui → pycharter/ui}/static/documentation/__next.documentation.__PAGE__.txt +0 -0
- {ui → pycharter/ui}/static/documentation/__next.documentation.txt +0 -0
- {ui → pycharter/ui}/static/documentation/index.html +0 -0
- {ui → pycharter/ui}/static/documentation/index.txt +0 -0
- {ui → pycharter/ui}/static/index.html +0 -0
- {ui → pycharter/ui}/static/index.txt +0 -0
- {ui → pycharter/ui}/static/metadata/__next._full.txt +0 -0
- {ui → pycharter/ui}/static/metadata/__next._head.txt +0 -0
- {ui → pycharter/ui}/static/metadata/__next._index.txt +0 -0
- {ui → pycharter/ui}/static/metadata/__next._tree.txt +0 -0
- {ui → pycharter/ui}/static/metadata/__next.metadata.__PAGE__.txt +0 -0
- {ui → pycharter/ui}/static/metadata/__next.metadata.txt +0 -0
- {ui → pycharter/ui}/static/metadata/index.html +0 -0
- {ui → pycharter/ui}/static/metadata/index.txt +0 -0
- {ui → pycharter/ui}/static/quality/__next._full.txt +0 -0
- {ui → pycharter/ui}/static/quality/__next._head.txt +0 -0
- {ui → pycharter/ui}/static/quality/__next._index.txt +0 -0
- {ui → pycharter/ui}/static/quality/__next._tree.txt +0 -0
- {ui → pycharter/ui}/static/quality/__next.quality.__PAGE__.txt +0 -0
- {ui → pycharter/ui}/static/quality/__next.quality.txt +0 -0
- {ui → pycharter/ui}/static/quality/index.html +0 -0
- {ui → pycharter/ui}/static/quality/index.txt +0 -0
- {ui → pycharter/ui}/static/rules/__next._full.txt +0 -0
- {ui → pycharter/ui}/static/rules/__next._head.txt +0 -0
- {ui → pycharter/ui}/static/rules/__next._index.txt +0 -0
- {ui → pycharter/ui}/static/rules/__next._tree.txt +0 -0
- {ui → pycharter/ui}/static/rules/__next.rules.__PAGE__.txt +0 -0
- {ui → pycharter/ui}/static/rules/__next.rules.txt +0 -0
- {ui → pycharter/ui}/static/rules/index.html +0 -0
- {ui → pycharter/ui}/static/rules/index.txt +0 -0
- {ui → pycharter/ui}/static/schemas/__next._full.txt +0 -0
- {ui → pycharter/ui}/static/schemas/__next._head.txt +0 -0
- {ui → pycharter/ui}/static/schemas/__next._index.txt +0 -0
- {ui → pycharter/ui}/static/schemas/__next._tree.txt +0 -0
- {ui → pycharter/ui}/static/schemas/__next.schemas.__PAGE__.txt +0 -0
- {ui → pycharter/ui}/static/schemas/__next.schemas.txt +0 -0
- {ui → pycharter/ui}/static/schemas/index.html +0 -0
- {ui → pycharter/ui}/static/schemas/index.txt +0 -0
- {ui → pycharter/ui}/static/settings/__next._full.txt +0 -0
- {ui → pycharter/ui}/static/settings/__next._head.txt +0 -0
- {ui → pycharter/ui}/static/settings/__next._index.txt +0 -0
- {ui → pycharter/ui}/static/settings/__next._tree.txt +0 -0
- {ui → pycharter/ui}/static/settings/__next.settings.__PAGE__.txt +0 -0
- {ui → pycharter/ui}/static/settings/__next.settings.txt +0 -0
- {ui → pycharter/ui}/static/settings/index.html +0 -0
- {ui → pycharter/ui}/static/settings/index.txt +0 -0
- {ui → pycharter/ui}/static/static/.gitkeep +0 -0
- {ui → pycharter/ui}/static/static/404/index.html +0 -0
- {ui → pycharter/ui}/static/static/404.html +0 -0
- {ui → pycharter/ui}/static/static/__next.__PAGE__.txt +0 -0
- {ui → pycharter/ui}/static/static/__next._full.txt +0 -0
- {ui → pycharter/ui}/static/static/__next._head.txt +0 -0
- {ui → pycharter/ui}/static/static/__next._index.txt +0 -0
- {ui → pycharter/ui}/static/static/__next._tree.txt +0 -0
- {ui → pycharter/ui}/static/static/_next/static/0rYA78L88aUyD2Uh38hhX/_buildManifest.js +0 -0
- {ui → pycharter/ui}/static/static/_next/static/0rYA78L88aUyD2Uh38hhX/_ssgManifest.js +0 -0
- {ui → pycharter/ui}/static/static/_next/static/chunks/13d4a0fbd74c1ee4.js +0 -0
- {ui → pycharter/ui}/static/static/_next/static/chunks/222442f6da32302a.js +0 -0
- {ui → pycharter/ui}/static/static/_next/static/chunks/247eb132b7f7b574.js +0 -0
- {ui → pycharter/ui}/static/static/_next/static/chunks/297d55555b71baba.js +0 -0
- {ui → pycharter/ui}/static/static/_next/static/chunks/2ab439ce003cd691.js +0 -0
- {ui → pycharter/ui}/static/static/_next/static/chunks/2edb43b48432ac04.js +0 -0
- {ui → pycharter/ui}/static/static/_next/static/chunks/414e77373f8ff61c.js +0 -0
- {ui → pycharter/ui}/static/static/_next/static/chunks/49ca65abd26ae49e.js +0 -0
- {ui → pycharter/ui}/static/static/_next/static/chunks/5e04d10c4a7b58a3.js +0 -0
- {ui → pycharter/ui}/static/static/_next/static/chunks/652ad0aa26265c47.js +0 -0
- {ui → pycharter/ui}/static/static/_next/static/chunks/75d88a058d8ffaa6.js +0 -0
- {ui → pycharter/ui}/static/static/_next/static/chunks/8c89634cf6bad76f.js +0 -0
- {ui → pycharter/ui}/static/static/_next/static/chunks/9667e7a3d359eb39.js +0 -0
- {ui → pycharter/ui}/static/static/_next/static/chunks/9c23f44fff36548a.js +0 -0
- {ui → pycharter/ui}/static/static/_next/static/chunks/a6dad97d9634a72d.js +0 -0
- {ui → pycharter/ui}/static/static/_next/static/chunks/b32a0963684b9933.js +0 -0
- {ui → pycharter/ui}/static/static/_next/static/chunks/c4fa4f4114b7c352.js +0 -0
- {ui → pycharter/ui}/static/static/_next/static/chunks/c69f6cba366bd988.js +0 -0
- {ui → pycharter/ui}/static/static/_next/static/chunks/d2363397e1b2bcab.css +0 -0
- {ui → pycharter/ui}/static/static/_next/static/chunks/db913959c675cea6.js +0 -0
- {ui → pycharter/ui}/static/static/_next/static/chunks/f061a4be97bfc3b3.js +0 -0
- {ui → pycharter/ui}/static/static/_next/static/chunks/f2e7afeab1178138.js +0 -0
- {ui → pycharter/ui}/static/static/_next/static/chunks/f7d1a90dd75d2572.js +0 -0
- {ui → pycharter/ui}/static/static/_next/static/chunks/ff1a16fafef87110.js +0 -0
- {ui → pycharter/ui}/static/static/_next/static/chunks/turbopack-ffcb7ab6794027ef.js +0 -0
- {ui → pycharter/ui}/static/static/_not-found/__next._full.txt +0 -0
- {ui → pycharter/ui}/static/static/_not-found/__next._head.txt +0 -0
- {ui → pycharter/ui}/static/static/_not-found/__next._index.txt +0 -0
- {ui → pycharter/ui}/static/static/_not-found/__next._not-found.__PAGE__.txt +0 -0
- {ui → pycharter/ui}/static/static/_not-found/__next._not-found.txt +0 -0
- {ui → pycharter/ui}/static/static/_not-found/__next._tree.txt +0 -0
- {ui → pycharter/ui}/static/static/_not-found/index.html +0 -0
- {ui → pycharter/ui}/static/static/_not-found/index.txt +0 -0
- {ui → pycharter/ui}/static/static/contracts/__next._full.txt +0 -0
- {ui → pycharter/ui}/static/static/contracts/__next._head.txt +0 -0
- {ui → pycharter/ui}/static/static/contracts/__next._index.txt +0 -0
- {ui → pycharter/ui}/static/static/contracts/__next._tree.txt +0 -0
- {ui → pycharter/ui}/static/static/contracts/__next.contracts.__PAGE__.txt +0 -0
- {ui → pycharter/ui}/static/static/contracts/__next.contracts.txt +0 -0
- {ui → pycharter/ui}/static/static/contracts/index.html +0 -0
- {ui → pycharter/ui}/static/static/contracts/index.txt +0 -0
- {ui → pycharter/ui}/static/static/documentation/__next._full.txt +0 -0
- {ui → pycharter/ui}/static/static/documentation/__next._head.txt +0 -0
- {ui → pycharter/ui}/static/static/documentation/__next._index.txt +0 -0
- {ui → pycharter/ui}/static/static/documentation/__next._tree.txt +0 -0
- {ui → pycharter/ui}/static/static/documentation/__next.documentation.__PAGE__.txt +0 -0
- {ui → pycharter/ui}/static/static/documentation/__next.documentation.txt +0 -0
- {ui → pycharter/ui}/static/static/documentation/index.html +0 -0
- {ui → pycharter/ui}/static/static/documentation/index.txt +0 -0
- {ui → pycharter/ui}/static/static/index.html +0 -0
- {ui → pycharter/ui}/static/static/index.txt +0 -0
- {ui → pycharter/ui}/static/static/metadata/__next._full.txt +0 -0
- {ui → pycharter/ui}/static/static/metadata/__next._head.txt +0 -0
- {ui → pycharter/ui}/static/static/metadata/__next._index.txt +0 -0
- {ui → pycharter/ui}/static/static/metadata/__next._tree.txt +0 -0
- {ui → pycharter/ui}/static/static/metadata/__next.metadata.__PAGE__.txt +0 -0
- {ui → pycharter/ui}/static/static/metadata/__next.metadata.txt +0 -0
- {ui → pycharter/ui}/static/static/metadata/index.html +0 -0
- {ui → pycharter/ui}/static/static/metadata/index.txt +0 -0
- {ui → pycharter/ui}/static/static/quality/__next._full.txt +0 -0
- {ui → pycharter/ui}/static/static/quality/__next._head.txt +0 -0
- {ui → pycharter/ui}/static/static/quality/__next._index.txt +0 -0
- {ui → pycharter/ui}/static/static/quality/__next._tree.txt +0 -0
- {ui → pycharter/ui}/static/static/quality/__next.quality.__PAGE__.txt +0 -0
- {ui → pycharter/ui}/static/static/quality/__next.quality.txt +0 -0
- {ui → pycharter/ui}/static/static/quality/index.html +0 -0
- {ui → pycharter/ui}/static/static/quality/index.txt +0 -0
- {ui → pycharter/ui}/static/static/rules/__next._full.txt +0 -0
- {ui → pycharter/ui}/static/static/rules/__next._head.txt +0 -0
- {ui → pycharter/ui}/static/static/rules/__next._index.txt +0 -0
- {ui → pycharter/ui}/static/static/rules/__next._tree.txt +0 -0
- {ui → pycharter/ui}/static/static/rules/__next.rules.__PAGE__.txt +0 -0
- {ui → pycharter/ui}/static/static/rules/__next.rules.txt +0 -0
- {ui → pycharter/ui}/static/static/rules/index.html +0 -0
- {ui → pycharter/ui}/static/static/rules/index.txt +0 -0
- {ui → pycharter/ui}/static/static/schemas/__next._full.txt +0 -0
- {ui → pycharter/ui}/static/static/schemas/__next._head.txt +0 -0
- {ui → pycharter/ui}/static/static/schemas/__next._index.txt +0 -0
- {ui → pycharter/ui}/static/static/schemas/__next._tree.txt +0 -0
- {ui → pycharter/ui}/static/static/schemas/__next.schemas.__PAGE__.txt +0 -0
- {ui → pycharter/ui}/static/static/schemas/__next.schemas.txt +0 -0
- {ui → pycharter/ui}/static/static/schemas/index.html +0 -0
- {ui → pycharter/ui}/static/static/schemas/index.txt +0 -0
- {ui → pycharter/ui}/static/static/settings/__next._full.txt +0 -0
- {ui → pycharter/ui}/static/static/settings/__next._head.txt +0 -0
- {ui → pycharter/ui}/static/static/settings/__next._index.txt +0 -0
- {ui → pycharter/ui}/static/static/settings/__next._tree.txt +0 -0
- {ui → pycharter/ui}/static/static/settings/__next.settings.__PAGE__.txt +0 -0
- {ui → pycharter/ui}/static/static/settings/__next.settings.txt +0 -0
- {ui → pycharter/ui}/static/static/settings/index.html +0 -0
- {ui → pycharter/ui}/static/static/settings/index.txt +0 -0
- {ui → pycharter/ui}/static/static/static/.gitkeep +0 -0
- {ui → pycharter/ui}/static/static/static/404/index.html +0 -0
- {ui → pycharter/ui}/static/static/static/404.html +0 -0
- {ui → pycharter/ui}/static/static/static/__next.__PAGE__.txt +0 -0
- {ui → pycharter/ui}/static/static/static/__next._full.txt +0 -0
- {ui → pycharter/ui}/static/static/static/__next._head.txt +0 -0
- {ui → pycharter/ui}/static/static/static/__next._index.txt +0 -0
- {ui → pycharter/ui}/static/static/static/__next._tree.txt +0 -0
- {ui → pycharter/ui}/static/static/static/_next/static/chunks/222442f6da32302a.js +0 -0
- {ui → pycharter/ui}/static/static/static/_next/static/chunks/247eb132b7f7b574.js +0 -0
- {ui → pycharter/ui}/static/static/static/_next/static/chunks/297d55555b71baba.js +0 -0
- {ui → pycharter/ui}/static/static/static/_next/static/chunks/2ab439ce003cd691.js +0 -0
- {ui → pycharter/ui}/static/static/static/_next/static/chunks/414e77373f8ff61c.js +0 -0
- {ui → pycharter/ui}/static/static/static/_next/static/chunks/49ca65abd26ae49e.js +0 -0
- {ui → pycharter/ui}/static/static/static/_next/static/chunks/4e310fe5005770a3.css +0 -0
- {ui → pycharter/ui}/static/static/static/_next/static/chunks/5e04d10c4a7b58a3.js +0 -0
- {ui → pycharter/ui}/static/static/static/_next/static/chunks/5fc14c00a2779dc5.js +0 -0
- {ui → pycharter/ui}/static/static/static/_next/static/chunks/652ad0aa26265c47.js +0 -0
- {ui → pycharter/ui}/static/static/static/_next/static/chunks/75d88a058d8ffaa6.js +0 -0
- {ui → pycharter/ui}/static/static/static/_next/static/chunks/8c89634cf6bad76f.js +0 -0
- {ui → pycharter/ui}/static/static/static/_next/static/chunks/9667e7a3d359eb39.js +0 -0
- {ui → pycharter/ui}/static/static/static/_next/static/chunks/9c23f44fff36548a.js +0 -0
- {ui → pycharter/ui}/static/static/static/_next/static/chunks/a6dad97d9634a72d.js +0 -0
- {ui → pycharter/ui}/static/static/static/_next/static/chunks/b32a0963684b9933.js +0 -0
- {ui → pycharter/ui}/static/static/static/_next/static/chunks/b584574fdc8ab13e.js +0 -0
- {ui → pycharter/ui}/static/static/static/_next/static/chunks/c69f6cba366bd988.js +0 -0
- {ui → pycharter/ui}/static/static/static/_next/static/chunks/d5989c94d3614b3a.js +0 -0
- {ui → pycharter/ui}/static/static/static/_next/static/chunks/db913959c675cea6.js +0 -0
- {ui → pycharter/ui}/static/static/static/_next/static/chunks/f061a4be97bfc3b3.js +0 -0
- {ui → pycharter/ui}/static/static/static/_next/static/chunks/f2e7afeab1178138.js +0 -0
- {ui → pycharter/ui}/static/static/static/_next/static/chunks/ff1a16fafef87110.js +0 -0
- {ui → pycharter/ui}/static/static/static/_next/static/chunks/turbopack-ffcb7ab6794027ef.js +0 -0
- {ui → pycharter/ui}/static/static/static/_next/static/tNTkVW6puVXC4bAm4WrHl/_buildManifest.js +0 -0
- {ui → pycharter/ui}/static/static/static/_next/static/tNTkVW6puVXC4bAm4WrHl/_ssgManifest.js +0 -0
- {ui → pycharter/ui}/static/static/static/_not-found/__next._full.txt +0 -0
- {ui → pycharter/ui}/static/static/static/_not-found/__next._head.txt +0 -0
- {ui → pycharter/ui}/static/static/static/_not-found/__next._index.txt +0 -0
- {ui → pycharter/ui}/static/static/static/_not-found/__next._not-found.__PAGE__.txt +0 -0
- {ui → pycharter/ui}/static/static/static/_not-found/__next._not-found.txt +0 -0
- {ui → pycharter/ui}/static/static/static/_not-found/__next._tree.txt +0 -0
- {ui → pycharter/ui}/static/static/static/_not-found/index.html +0 -0
- {ui → pycharter/ui}/static/static/static/_not-found/index.txt +0 -0
- {ui → pycharter/ui}/static/static/static/contracts/__next._full.txt +0 -0
- {ui → pycharter/ui}/static/static/static/contracts/__next._head.txt +0 -0
- {ui → pycharter/ui}/static/static/static/contracts/__next._index.txt +0 -0
- {ui → pycharter/ui}/static/static/static/contracts/__next._tree.txt +0 -0
- {ui → pycharter/ui}/static/static/static/contracts/__next.contracts.__PAGE__.txt +0 -0
- {ui → pycharter/ui}/static/static/static/contracts/__next.contracts.txt +0 -0
- {ui → pycharter/ui}/static/static/static/contracts/index.html +0 -0
- {ui → pycharter/ui}/static/static/static/contracts/index.txt +0 -0
- {ui → pycharter/ui}/static/static/static/documentation/__next._full.txt +0 -0
- {ui → pycharter/ui}/static/static/static/documentation/__next._head.txt +0 -0
- {ui → pycharter/ui}/static/static/static/documentation/__next._index.txt +0 -0
- {ui → pycharter/ui}/static/static/static/documentation/__next._tree.txt +0 -0
- {ui → pycharter/ui}/static/static/static/documentation/__next.documentation.__PAGE__.txt +0 -0
- {ui → pycharter/ui}/static/static/static/documentation/__next.documentation.txt +0 -0
- {ui → pycharter/ui}/static/static/static/documentation/index.html +0 -0
- {ui → pycharter/ui}/static/static/static/documentation/index.txt +0 -0
- {ui → pycharter/ui}/static/static/static/index.html +0 -0
- {ui → pycharter/ui}/static/static/static/index.txt +0 -0
- {ui → pycharter/ui}/static/static/static/metadata/__next._full.txt +0 -0
- {ui → pycharter/ui}/static/static/static/metadata/__next._head.txt +0 -0
- {ui → pycharter/ui}/static/static/static/metadata/__next._index.txt +0 -0
- {ui → pycharter/ui}/static/static/static/metadata/__next._tree.txt +0 -0
- {ui → pycharter/ui}/static/static/static/metadata/__next.metadata.__PAGE__.txt +0 -0
- {ui → pycharter/ui}/static/static/static/metadata/__next.metadata.txt +0 -0
- {ui → pycharter/ui}/static/static/static/metadata/index.html +0 -0
- {ui → pycharter/ui}/static/static/static/metadata/index.txt +0 -0
- {ui → pycharter/ui}/static/static/static/quality/__next._full.txt +0 -0
- {ui → pycharter/ui}/static/static/static/quality/__next._head.txt +0 -0
- {ui → pycharter/ui}/static/static/static/quality/__next._index.txt +0 -0
- {ui → pycharter/ui}/static/static/static/quality/__next._tree.txt +0 -0
- {ui → pycharter/ui}/static/static/static/quality/__next.quality.__PAGE__.txt +0 -0
- {ui → pycharter/ui}/static/static/static/quality/__next.quality.txt +0 -0
- {ui → pycharter/ui}/static/static/static/quality/index.html +0 -0
- {ui → pycharter/ui}/static/static/static/quality/index.txt +0 -0
- {ui → pycharter/ui}/static/static/static/rules/__next._full.txt +0 -0
- {ui → pycharter/ui}/static/static/static/rules/__next._head.txt +0 -0
- {ui → pycharter/ui}/static/static/static/rules/__next._index.txt +0 -0
- {ui → pycharter/ui}/static/static/static/rules/__next._tree.txt +0 -0
- {ui → pycharter/ui}/static/static/static/rules/__next.rules.__PAGE__.txt +0 -0
- {ui → pycharter/ui}/static/static/static/rules/__next.rules.txt +0 -0
- {ui → pycharter/ui}/static/static/static/rules/index.html +0 -0
- {ui → pycharter/ui}/static/static/static/rules/index.txt +0 -0
- {ui → pycharter/ui}/static/static/static/schemas/__next._full.txt +0 -0
- {ui → pycharter/ui}/static/static/static/schemas/__next._head.txt +0 -0
- {ui → pycharter/ui}/static/static/static/schemas/__next._index.txt +0 -0
- {ui → pycharter/ui}/static/static/static/schemas/__next._tree.txt +0 -0
- {ui → pycharter/ui}/static/static/static/schemas/__next.schemas.__PAGE__.txt +0 -0
- {ui → pycharter/ui}/static/static/static/schemas/__next.schemas.txt +0 -0
- {ui → pycharter/ui}/static/static/static/schemas/index.html +0 -0
- {ui → pycharter/ui}/static/static/static/schemas/index.txt +0 -0
- {ui → pycharter/ui}/static/static/static/settings/__next._full.txt +0 -0
- {ui → pycharter/ui}/static/static/static/settings/__next._head.txt +0 -0
- {ui → pycharter/ui}/static/static/static/settings/__next._index.txt +0 -0
- {ui → pycharter/ui}/static/static/static/settings/__next._tree.txt +0 -0
- {ui → pycharter/ui}/static/static/static/settings/__next.settings.__PAGE__.txt +0 -0
- {ui → pycharter/ui}/static/static/static/settings/__next.settings.txt +0 -0
- {ui → pycharter/ui}/static/static/static/settings/index.html +0 -0
- {ui → pycharter/ui}/static/static/static/settings/index.txt +0 -0
- {ui → pycharter/ui}/static/static/static/validation/__next._full.txt +0 -0
- {ui → pycharter/ui}/static/static/static/validation/__next._head.txt +0 -0
- {ui → pycharter/ui}/static/static/static/validation/__next._index.txt +0 -0
- {ui → pycharter/ui}/static/static/static/validation/__next._tree.txt +0 -0
- {ui → pycharter/ui}/static/static/static/validation/__next.validation.__PAGE__.txt +0 -0
- {ui → pycharter/ui}/static/static/static/validation/__next.validation.txt +0 -0
- {ui → pycharter/ui}/static/static/static/validation/index.html +0 -0
- {ui → pycharter/ui}/static/static/static/validation/index.txt +0 -0
- {ui → pycharter/ui}/static/static/validation/__next._full.txt +0 -0
- {ui → pycharter/ui}/static/static/validation/__next._head.txt +0 -0
- {ui → pycharter/ui}/static/static/validation/__next._index.txt +0 -0
- {ui → pycharter/ui}/static/static/validation/__next._tree.txt +0 -0
- {ui → pycharter/ui}/static/static/validation/__next.validation.__PAGE__.txt +0 -0
- {ui → pycharter/ui}/static/static/validation/__next.validation.txt +0 -0
- {ui → pycharter/ui}/static/static/validation/index.html +0 -0
- {ui → pycharter/ui}/static/static/validation/index.txt +0 -0
- {ui → pycharter/ui}/static/validation/__next._full.txt +0 -0
- {ui → pycharter/ui}/static/validation/__next._head.txt +0 -0
- {ui → pycharter/ui}/static/validation/__next._index.txt +0 -0
- {ui → pycharter/ui}/static/validation/__next._tree.txt +0 -0
- {ui → pycharter/ui}/static/validation/__next.validation.__PAGE__.txt +0 -0
- {ui → pycharter/ui}/static/validation/__next.validation.txt +0 -0
- {ui → pycharter/ui}/static/validation/index.html +0 -0
- {ui → pycharter/ui}/static/validation/index.txt +0 -0
- {worker → pycharter/worker}/__init__.py +0 -0
- {worker → pycharter/worker}/models.py +0 -0
- {pycharter-0.0.24.dist-info → pycharter-0.0.25.dist-info}/WHEEL +0 -0
- {pycharter-0.0.24.dist-info → pycharter-0.0.25.dist-info}/entry_points.txt +0 -0
- {pycharter-0.0.24.dist-info → pycharter-0.0.25.dist-info}/licenses/LICENSE +0 -0
pycharter/api/README.md
ADDED
|
@@ -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"]
|
{api → pycharter/api}/main.py
RENAMED
|
@@ -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
|
pycharter/cli.py
CHANGED
|
@@ -390,7 +390,7 @@ def main():
|
|
|
390
390
|
os.environ["PYTHONPATH"] = pythonpath
|
|
391
391
|
|
|
392
392
|
uvicorn.run(
|
|
393
|
-
"api.main:app",
|
|
393
|
+
"pycharter.api.main:app",
|
|
394
394
|
host=args.host,
|
|
395
395
|
port=args.port,
|
|
396
396
|
reload=args.reload,
|
|
@@ -408,21 +408,19 @@ def main():
|
|
|
408
408
|
ui_path = None
|
|
409
409
|
possible_paths = []
|
|
410
410
|
|
|
411
|
-
# Check installed package location first (
|
|
411
|
+
# Check installed package location first (src layout: __file__ parent is package dir)
|
|
412
412
|
try:
|
|
413
413
|
import pycharter
|
|
414
|
-
|
|
415
|
-
package_ui = pycharter_path / "ui"
|
|
414
|
+
package_ui = Path(pycharter.__file__).parent / "ui"
|
|
416
415
|
possible_paths.append(package_ui)
|
|
417
416
|
except (ImportError, AttributeError):
|
|
418
417
|
pass
|
|
419
418
|
|
|
420
|
-
# Check development locations
|
|
419
|
+
# Check development locations (__file__ is src/pycharter/cli.py)
|
|
421
420
|
possible_paths.extend([
|
|
422
|
-
Path(__file__).parent
|
|
423
|
-
/ "
|
|
424
|
-
Path.cwd() / "ui",
|
|
425
|
-
Path(__file__).parent.parent / "ui", # Alternative path
|
|
421
|
+
Path(__file__).parent / "ui", # src/pycharter/ui
|
|
422
|
+
Path.cwd() / "src" / "pycharter" / "ui",
|
|
423
|
+
Path.cwd() / "ui",
|
|
426
424
|
])
|
|
427
425
|
|
|
428
426
|
for path in possible_paths:
|
|
@@ -492,7 +490,7 @@ def main():
|
|
|
492
490
|
|
|
493
491
|
if args.worker_command == "start":
|
|
494
492
|
try:
|
|
495
|
-
from worker.cli import cmd_worker_start
|
|
493
|
+
from pycharter.worker.cli import cmd_worker_start
|
|
496
494
|
except ImportError:
|
|
497
495
|
print(
|
|
498
496
|
"❌ Error: worker component not found.",
|