pycharter 0.0.24__py3-none-any.whl → 0.0.26__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.
Files changed (567) hide show
  1. pycharter/__init__.py +6 -0
  2. pycharter/api/README.md +340 -0
  3. {api → pycharter/api}/__init__.py +1 -1
  4. {api → pycharter/api}/dependencies/__init__.py +2 -2
  5. pycharter/api/dependencies/auth.py +158 -0
  6. {api → pycharter/api}/main.py +32 -4
  7. {api → pycharter/api}/models/__init__.py +4 -4
  8. pycharter/api/models/etl.py +66 -0
  9. {api → pycharter/api}/routes/v1/__init__.py +5 -1
  10. pycharter/api/routes/v1/auth.py +97 -0
  11. {api → pycharter/api}/routes/v1/contracts.py +14 -12
  12. {api → pycharter/api}/routes/v1/docs.py +2 -2
  13. pycharter/api/routes/v1/etl.py +131 -0
  14. {api → pycharter/api}/routes/v1/evolution.py +2 -2
  15. {api → pycharter/api}/routes/v1/metadata.py +5 -5
  16. {api → pycharter/api}/routes/v1/quality.py +3 -3
  17. {api → pycharter/api}/routes/v1/schemas.py +1 -1
  18. {api → pycharter/api}/routes/v1/settings.py +1 -1
  19. {api → pycharter/api}/routes/v1/tracking.py +1 -1
  20. {api → pycharter/api}/routes/v1/validation.py +2 -2
  21. {api → pycharter/api}/routes/v1/validation_jobs.py +3 -3
  22. pycharter/cli.py +9 -11
  23. pycharter/config.py +69 -0
  24. pycharter/contract_builder/builder.py +32 -37
  25. pycharter/data/seed/compliance_frameworks.yaml +22 -0
  26. pycharter/data/seed/contracts.yaml +130 -0
  27. pycharter/data/seed/data_feeds.yaml +22 -0
  28. pycharter/data/seed/domains.yaml +13 -0
  29. pycharter/data/seed/environments.yaml +19 -0
  30. pycharter/data/seed/owners.yaml +21 -0
  31. pycharter/data/seed/systems.yaml +13 -0
  32. pycharter/data/seed/tags.yaml +25 -0
  33. pycharter/data/templates/contract/README.md +161 -0
  34. pycharter/data/templates/contract/template_contract.yaml +37 -0
  35. pycharter/data/templates/etl/README.md +1 -1
  36. pycharter/data/templates/etl/extract_with_validation.yaml +86 -0
  37. pycharter/data/templates/etl/load_with_validation.yaml +111 -0
  38. pycharter/data/templates/etl/settings.yaml +55 -0
  39. pycharter/db/README.md +179 -0
  40. pycharter/db/cli.py +126 -4
  41. pycharter/db/migrations/versions/20260122000000_change_artifact_unique_constraints_to_title_version.py +2 -2
  42. pycharter/db/schemas/README.md +96 -0
  43. pycharter/etl_generator/ASYNC_AND_EXECUTION.md +91 -0
  44. pycharter/etl_generator/INTERFACES.md +142 -0
  45. pycharter/etl_generator/README.md +271 -0
  46. pycharter/etl_generator/TRANSFORMATION_GUIDE.md +452 -0
  47. pycharter/etl_generator/__init__.py +47 -11
  48. pycharter/etl_generator/config_models.py +673 -0
  49. pycharter/etl_generator/config_validator.py +133 -157
  50. pycharter/etl_generator/context.py +3 -0
  51. pycharter/etl_generator/database.py +5 -1
  52. pycharter/etl_generator/extractors/__init__.py +4 -2
  53. pycharter/etl_generator/extractors/cloud_storage.py +9 -9
  54. pycharter/etl_generator/extractors/database.py +2 -2
  55. pycharter/etl_generator/extractors/factory.py +15 -33
  56. pycharter/etl_generator/extractors/file.py +2 -2
  57. pycharter/etl_generator/extractors/http.py +2 -2
  58. pycharter/etl_generator/extractors/mongodb.py +393 -0
  59. pycharter/etl_generator/extractors/streaming.py +2 -2
  60. pycharter/etl_generator/loaders/__init__.py +15 -9
  61. pycharter/etl_generator/loaders/{cloud_storage_loader.py → cloud_storage.py} +95 -2
  62. pycharter/etl_generator/loaders/factory.py +16 -29
  63. pycharter/etl_generator/loaders/file.py +135 -1
  64. pycharter/etl_generator/loaders/mongodb.py +416 -0
  65. pycharter/etl_generator/pipeline.py +283 -164
  66. pycharter/etl_generator/result.py +16 -0
  67. pycharter/etl_generator/schemas/__init__.py +71 -42
  68. pycharter/etl_generator/transformers/config.py +3 -2
  69. pycharter/etl_generator/transformers/simple_operations.py +57 -4
  70. pycharter/etl_generator/validation.py +551 -0
  71. pycharter/metadata_store/README.md +229 -0
  72. pycharter/quality/README.md +235 -0
  73. pycharter/runtime_validator/__init__.py +7 -0
  74. pycharter/runtime_validator/utils.py +33 -0
  75. pycharter/runtime_validator/validator.py +13 -10
  76. pycharter/ui/.eslintrc.json +4 -0
  77. pycharter/ui/README.md +186 -0
  78. {ui → pycharter/ui}/__init__.py +3 -3
  79. pycharter/ui/components.json +17 -0
  80. pycharter/ui/package-lock.json +6617 -0
  81. pycharter/ui/package.json +37 -0
  82. {ui → pycharter/ui}/server.py +7 -8
  83. pycharter/ui/static/404/index.html +1 -0
  84. pycharter/ui/static/404.html +1 -0
  85. pycharter/ui/static/__next.__PAGE__.txt +10 -0
  86. pycharter/ui/static/__next._full.txt +30 -0
  87. pycharter/ui/static/__next._head.txt +7 -0
  88. pycharter/ui/static/__next._index.txt +9 -0
  89. pycharter/ui/static/__next._tree.txt +2 -0
  90. pycharter/ui/static/_next/static/YCnlK66gA7FV5vvcixspB/_clientMiddlewareManifest.json +1 -0
  91. pycharter/ui/static/_next/static/chunks/0fc1f70b787b8845.js +1 -0
  92. pycharter/ui/static/_next/static/chunks/17bb8075d7b75663.css +1 -0
  93. pycharter/ui/static/_next/static/chunks/381932864dcbfdb8.js +1 -0
  94. pycharter/ui/static/_next/static/chunks/4c951b8e4507e2b3.js +1 -0
  95. pycharter/ui/static/_next/static/chunks/68b87a6f65abd3ed.js +1 -0
  96. pycharter/ui/static/_next/static/chunks/78572617b8fae189.js +1 -0
  97. pycharter/ui/static/_next/static/chunks/8b7be2803e3fe184.js +1 -0
  98. pycharter/ui/static/_next/static/chunks/a8e529fd1e67f121.js +1 -0
  99. pycharter/ui/static/_next/static/chunks/c35d998f80be3ff5.js +1 -0
  100. pycharter/ui/static/_next/static/chunks/e453aa5d01c32c17.js +1 -0
  101. pycharter/ui/static/_next/static/chunks/f2d240eb057f898a.js +970 -0
  102. pycharter/ui/static/_next/static/chunks/f7722448f6040846.js +1 -0
  103. pycharter/ui/static/_not-found/__next._full.txt +17 -0
  104. pycharter/ui/static/_not-found/__next._head.txt +7 -0
  105. pycharter/ui/static/_not-found/__next._index.txt +9 -0
  106. pycharter/ui/static/_not-found/__next._not-found.__PAGE__.txt +5 -0
  107. pycharter/ui/static/_not-found/__next._not-found.txt +4 -0
  108. pycharter/ui/static/_not-found/__next._tree.txt +2 -0
  109. pycharter/ui/static/_not-found/index.html +1 -0
  110. pycharter/ui/static/_not-found/index.txt +17 -0
  111. pycharter/ui/static/contracts/__next._full.txt +21 -0
  112. pycharter/ui/static/contracts/__next._head.txt +7 -0
  113. pycharter/ui/static/contracts/__next._index.txt +9 -0
  114. pycharter/ui/static/contracts/__next._tree.txt +2 -0
  115. pycharter/ui/static/contracts/__next.contracts.__PAGE__.txt +9 -0
  116. pycharter/ui/static/contracts/__next.contracts.txt +4 -0
  117. pycharter/ui/static/contracts/index.html +1 -0
  118. pycharter/ui/static/contracts/index.txt +21 -0
  119. pycharter/ui/static/documentation/__next._full.txt +21 -0
  120. pycharter/ui/static/documentation/__next._head.txt +7 -0
  121. pycharter/ui/static/documentation/__next._index.txt +9 -0
  122. pycharter/ui/static/documentation/__next._tree.txt +2 -0
  123. pycharter/ui/static/documentation/__next.documentation.__PAGE__.txt +9 -0
  124. pycharter/ui/static/documentation/__next.documentation.txt +4 -0
  125. pycharter/ui/static/documentation/index.html +93 -0
  126. pycharter/ui/static/documentation/index.txt +21 -0
  127. pycharter/ui/static/etl/__next._full.txt +21 -0
  128. pycharter/ui/static/etl/__next._head.txt +7 -0
  129. pycharter/ui/static/etl/__next._index.txt +9 -0
  130. pycharter/ui/static/etl/__next._tree.txt +2 -0
  131. pycharter/ui/static/etl/__next.etl.__PAGE__.txt +9 -0
  132. pycharter/ui/static/etl/__next.etl.txt +4 -0
  133. pycharter/ui/static/etl/index.html +2 -0
  134. pycharter/ui/static/etl/index.txt +21 -0
  135. pycharter/ui/static/index.html +1 -0
  136. pycharter/ui/static/index.txt +30 -0
  137. pycharter/ui/static/metadata/__next._full.txt +21 -0
  138. pycharter/ui/static/metadata/__next._head.txt +7 -0
  139. pycharter/ui/static/metadata/__next._index.txt +9 -0
  140. pycharter/ui/static/metadata/__next._tree.txt +2 -0
  141. pycharter/ui/static/metadata/__next.metadata.__PAGE__.txt +9 -0
  142. pycharter/ui/static/metadata/__next.metadata.txt +4 -0
  143. pycharter/ui/static/metadata/index.html +1 -0
  144. pycharter/ui/static/metadata/index.txt +21 -0
  145. pycharter/ui/static/quality/__next._full.txt +21 -0
  146. pycharter/ui/static/quality/__next._head.txt +7 -0
  147. pycharter/ui/static/quality/__next._index.txt +9 -0
  148. pycharter/ui/static/quality/__next._tree.txt +2 -0
  149. pycharter/ui/static/quality/__next.quality.__PAGE__.txt +9 -0
  150. pycharter/ui/static/quality/__next.quality.txt +4 -0
  151. pycharter/ui/static/quality/index.html +2 -0
  152. pycharter/ui/static/quality/index.txt +21 -0
  153. pycharter/ui/static/rules/__next._full.txt +21 -0
  154. pycharter/ui/static/rules/__next._head.txt +7 -0
  155. pycharter/ui/static/rules/__next._index.txt +9 -0
  156. pycharter/ui/static/rules/__next._tree.txt +2 -0
  157. pycharter/ui/static/rules/__next.rules.__PAGE__.txt +9 -0
  158. pycharter/ui/static/rules/__next.rules.txt +4 -0
  159. pycharter/ui/static/rules/index.html +1 -0
  160. pycharter/ui/static/rules/index.txt +21 -0
  161. pycharter/ui/static/schemas/__next._full.txt +21 -0
  162. pycharter/ui/static/schemas/__next._head.txt +7 -0
  163. pycharter/ui/static/schemas/__next._index.txt +9 -0
  164. pycharter/ui/static/schemas/__next._tree.txt +2 -0
  165. pycharter/ui/static/schemas/__next.schemas.__PAGE__.txt +9 -0
  166. pycharter/ui/static/schemas/__next.schemas.txt +4 -0
  167. pycharter/ui/static/schemas/index.html +1 -0
  168. pycharter/ui/static/schemas/index.txt +21 -0
  169. pycharter/ui/static/settings/__next._full.txt +21 -0
  170. pycharter/ui/static/settings/__next._head.txt +7 -0
  171. pycharter/ui/static/settings/__next._index.txt +9 -0
  172. pycharter/ui/static/settings/__next._tree.txt +2 -0
  173. pycharter/ui/static/settings/__next.settings.__PAGE__.txt +9 -0
  174. pycharter/ui/static/settings/__next.settings.txt +4 -0
  175. pycharter/ui/static/settings/index.html +1 -0
  176. pycharter/ui/static/settings/index.txt +21 -0
  177. pycharter/ui/static/static/_next/static/2gKjNv6YvE6BcIdFthBLs/_clientMiddlewareManifest.json +1 -0
  178. pycharter/ui/static/static/static/_next/static/0rYA78L88aUyD2Uh38hhX/_clientMiddlewareManifest.json +1 -0
  179. pycharter/ui/static/static/static/_next/static/chunks/f7d1a90dd75d2572.js +1 -0
  180. pycharter/ui/static/static/static/static/.gitkeep +0 -0
  181. pycharter/ui/static/static/static/static/_next/static/chunks/222442f6da32302a.js +1 -0
  182. pycharter/ui/static/static/static/static/_next/static/chunks/247eb132b7f7b574.js +1 -0
  183. pycharter/ui/static/static/static/static/_next/static/chunks/297d55555b71baba.js +1 -0
  184. pycharter/ui/static/static/static/static/_next/static/chunks/414e77373f8ff61c.js +1 -0
  185. pycharter/ui/static/static/static/static/_next/static/chunks/652ad0aa26265c47.js +2 -0
  186. pycharter/ui/static/static/static/static/_next/static/chunks/9c23f44fff36548a.js +1 -0
  187. pycharter/ui/static/static/static/static/_next/static/chunks/a6dad97d9634a72d.js +1 -0
  188. pycharter/ui/static/static/static/static/_next/static/chunks/b32a0963684b9933.js +4 -0
  189. pycharter/ui/static/static/static/static/_next/static/chunks/db913959c675cea6.js +1 -0
  190. pycharter/ui/static/static/static/static/_next/static/chunks/f2e7afeab1178138.js +1 -0
  191. pycharter/ui/static/static/static/static/_next/static/chunks/ff1a16fafef87110.js +1 -0
  192. pycharter/ui/static/static/static/static/_next/static/chunks/turbopack-ffcb7ab6794027ef.js +3 -0
  193. pycharter/ui/static/static/static/static/_next/static/tNTkVW6puVXC4bAm4WrHl/_buildManifest.js +11 -0
  194. pycharter/ui/static/static/static/static/_next/static/tNTkVW6puVXC4bAm4WrHl/_clientMiddlewareManifest.json +1 -0
  195. pycharter/ui/static/static/static/static/_next/static/tNTkVW6puVXC4bAm4WrHl/_ssgManifest.js +1 -0
  196. pycharter/ui/static/validation/__next._full.txt +21 -0
  197. pycharter/ui/static/validation/__next._head.txt +7 -0
  198. pycharter/ui/static/validation/__next._index.txt +9 -0
  199. pycharter/ui/static/validation/__next._tree.txt +2 -0
  200. pycharter/ui/static/validation/__next.validation.__PAGE__.txt +9 -0
  201. pycharter/ui/static/validation/__next.validation.txt +4 -0
  202. pycharter/ui/static/validation/index.html +1 -0
  203. pycharter/ui/static/validation/index.txt +21 -0
  204. pycharter/ui/tsconfig.json +42 -0
  205. pycharter/worker/README.md +187 -0
  206. pycharter/worker/backends/__init__.py +8 -0
  207. pycharter/worker/backends/base.py +46 -0
  208. pycharter/worker/backends/spark.py +233 -0
  209. {worker → pycharter/worker}/cli.py +1 -1
  210. {worker → pycharter/worker}/processor.py +2 -2
  211. pycharter/worker/queue/__init__.py +8 -0
  212. pycharter/worker/queue/redis_queue.py +147 -0
  213. {pycharter-0.0.24.dist-info → pycharter-0.0.26.dist-info}/METADATA +57 -26
  214. pycharter-0.0.26.dist-info/RECORD +702 -0
  215. pycharter-0.0.26.dist-info/top_level.txt +1 -0
  216. pycharter/etl_generator/config_loader.py +0 -394
  217. pycharter/etl_generator/loaders/cloud.py +0 -87
  218. pycharter/etl_generator/loaders/file_loader.py +0 -130
  219. pycharter-0.0.24.dist-info/RECORD +0 -543
  220. pycharter-0.0.24.dist-info/top_level.txt +0 -4
  221. {api → pycharter/api}/dependencies/database.py +0 -0
  222. {api → pycharter/api}/dependencies/store.py +0 -0
  223. {api → pycharter/api}/models/contracts.py +0 -0
  224. {api → pycharter/api}/models/docs.py +0 -0
  225. {api → pycharter/api}/models/evolution.py +0 -0
  226. {api → pycharter/api}/models/metadata.py +0 -0
  227. {api → pycharter/api}/models/metadata_entities.py +0 -0
  228. {api → pycharter/api}/models/quality.py +0 -0
  229. {api → pycharter/api}/models/schemas.py +0 -0
  230. {api → pycharter/api}/models/tracking.py +0 -0
  231. {api → pycharter/api}/models/validation.py +0 -0
  232. {api → pycharter/api}/routes/__init__.py +0 -0
  233. {api → pycharter/api}/routes/v1/templates.py +0 -0
  234. {api → pycharter/api}/utils.py +0 -0
  235. {ui → pycharter/ui}/build.py +0 -0
  236. {ui → pycharter/ui}/dev.py +0 -0
  237. {ui → pycharter/ui}/static/.gitkeep +0 -0
  238. {ui/static/_next/static/2gKjNv6YvE6BcIdFthBLs → pycharter/ui/static/_next/static/YCnlK66gA7FV5vvcixspB}/_buildManifest.js +0 -0
  239. {ui/static/_next/static/2gKjNv6YvE6BcIdFthBLs → pycharter/ui/static/_next/static/YCnlK66gA7FV5vvcixspB}/_ssgManifest.js +0 -0
  240. {ui → pycharter/ui}/static/_next/static/chunks/222442f6da32302a.js +0 -0
  241. {ui → pycharter/ui}/static/_next/static/chunks/247eb132b7f7b574.js +0 -0
  242. {ui → pycharter/ui}/static/_next/static/chunks/297d55555b71baba.js +0 -0
  243. {ui → pycharter/ui}/static/_next/static/chunks/414e77373f8ff61c.js +0 -0
  244. {ui → pycharter/ui}/static/_next/static/chunks/652ad0aa26265c47.js +0 -0
  245. {ui → pycharter/ui}/static/_next/static/chunks/9c23f44fff36548a.js +0 -0
  246. {ui → pycharter/ui}/static/_next/static/chunks/a6dad97d9634a72d.js +0 -0
  247. {ui → pycharter/ui}/static/_next/static/chunks/b32a0963684b9933.js +0 -0
  248. {ui → pycharter/ui}/static/_next/static/chunks/db913959c675cea6.js +0 -0
  249. {ui → pycharter/ui}/static/_next/static/chunks/f2e7afeab1178138.js +0 -0
  250. {ui → pycharter/ui}/static/_next/static/chunks/f7d1a90dd75d2572.js +0 -0
  251. {ui → pycharter/ui}/static/_next/static/chunks/ff1a16fafef87110.js +0 -0
  252. {ui → pycharter/ui}/static/_next/static/chunks/turbopack-ffcb7ab6794027ef.js +0 -0
  253. {ui → pycharter/ui}/static/static/.gitkeep +0 -0
  254. {ui → pycharter/ui/static}/static/404/index.html +0 -0
  255. {ui → pycharter/ui/static}/static/404.html +0 -0
  256. {ui → pycharter/ui/static}/static/__next.__PAGE__.txt +0 -0
  257. {ui → pycharter/ui/static}/static/__next._full.txt +0 -0
  258. {ui → pycharter/ui/static}/static/__next._head.txt +0 -0
  259. {ui → pycharter/ui/static}/static/__next._index.txt +0 -0
  260. {ui → pycharter/ui/static}/static/__next._tree.txt +0 -0
  261. {ui/static/static/_next/static/0rYA78L88aUyD2Uh38hhX → pycharter/ui/static/static/_next/static/2gKjNv6YvE6BcIdFthBLs}/_buildManifest.js +0 -0
  262. {ui/static/static/_next/static/0rYA78L88aUyD2Uh38hhX → pycharter/ui/static/static/_next/static/2gKjNv6YvE6BcIdFthBLs}/_ssgManifest.js +0 -0
  263. {ui → pycharter/ui/static}/static/_next/static/chunks/13d4a0fbd74c1ee4.js +0 -0
  264. {ui → pycharter/ui}/static/static/_next/static/chunks/222442f6da32302a.js +0 -0
  265. {ui → pycharter/ui}/static/static/_next/static/chunks/247eb132b7f7b574.js +0 -0
  266. {ui → pycharter/ui/static}/static/_next/static/chunks/26dfc590f7714c03.js +0 -0
  267. {ui → pycharter/ui}/static/static/_next/static/chunks/297d55555b71baba.js +0 -0
  268. {ui → pycharter/ui/static}/static/_next/static/chunks/2ab439ce003cd691.js +0 -0
  269. {ui → pycharter/ui/static}/static/_next/static/chunks/2edb43b48432ac04.js +0 -0
  270. {ui → pycharter/ui/static}/static/_next/static/chunks/34d289e6db2ef551.js +0 -0
  271. {ui → pycharter/ui}/static/static/_next/static/chunks/414e77373f8ff61c.js +0 -0
  272. {ui → pycharter/ui/static}/static/_next/static/chunks/49ca65abd26ae49e.js +0 -0
  273. {ui → pycharter/ui}/static/static/_next/static/chunks/652ad0aa26265c47.js +0 -0
  274. {ui → pycharter/ui/static}/static/_next/static/chunks/9667e7a3d359eb39.js +0 -0
  275. {ui → pycharter/ui/static}/static/_next/static/chunks/99508d9d5869cc27.js +0 -0
  276. {ui → pycharter/ui}/static/static/_next/static/chunks/9c23f44fff36548a.js +0 -0
  277. {ui → pycharter/ui}/static/static/_next/static/chunks/a6dad97d9634a72d.js +0 -0
  278. {ui → pycharter/ui/static}/static/_next/static/chunks/b313c35a6ba76574.js +0 -0
  279. {ui → pycharter/ui}/static/static/_next/static/chunks/b32a0963684b9933.js +0 -0
  280. {ui → pycharter/ui/static}/static/_next/static/chunks/c69f6cba366bd988.js +0 -0
  281. {ui → pycharter/ui/static}/static/_next/static/chunks/d2363397e1b2bcab.css +0 -0
  282. {ui → pycharter/ui}/static/static/_next/static/chunks/db913959c675cea6.js +0 -0
  283. {ui → pycharter/ui/static}/static/_next/static/chunks/f061a4be97bfc3b3.js +0 -0
  284. {ui → pycharter/ui}/static/static/_next/static/chunks/f2e7afeab1178138.js +0 -0
  285. {ui → pycharter/ui}/static/static/_next/static/chunks/f7d1a90dd75d2572.js +0 -0
  286. {ui → pycharter/ui}/static/static/_next/static/chunks/ff1a16fafef87110.js +0 -0
  287. {ui → pycharter/ui}/static/static/_next/static/chunks/turbopack-ffcb7ab6794027ef.js +0 -0
  288. {ui → pycharter/ui/static}/static/_not-found/__next._full.txt +0 -0
  289. {ui → pycharter/ui/static}/static/_not-found/__next._head.txt +0 -0
  290. {ui → pycharter/ui/static}/static/_not-found/__next._index.txt +0 -0
  291. {ui → pycharter/ui/static}/static/_not-found/__next._not-found.__PAGE__.txt +0 -0
  292. {ui → pycharter/ui/static}/static/_not-found/__next._not-found.txt +0 -0
  293. {ui → pycharter/ui/static}/static/_not-found/__next._tree.txt +0 -0
  294. {ui → pycharter/ui/static}/static/_not-found/index.html +0 -0
  295. {ui → pycharter/ui/static}/static/_not-found/index.txt +0 -0
  296. {ui → pycharter/ui/static}/static/contracts/__next._full.txt +0 -0
  297. {ui → pycharter/ui/static}/static/contracts/__next._head.txt +0 -0
  298. {ui → pycharter/ui/static}/static/contracts/__next._index.txt +0 -0
  299. {ui → pycharter/ui/static}/static/contracts/__next._tree.txt +0 -0
  300. {ui → pycharter/ui/static}/static/contracts/__next.contracts.__PAGE__.txt +0 -0
  301. {ui → pycharter/ui/static}/static/contracts/__next.contracts.txt +0 -0
  302. {ui → pycharter/ui/static}/static/contracts/index.html +0 -0
  303. {ui → pycharter/ui/static}/static/contracts/index.txt +0 -0
  304. {ui → pycharter/ui/static}/static/documentation/__next._full.txt +0 -0
  305. {ui → pycharter/ui/static}/static/documentation/__next._head.txt +0 -0
  306. {ui → pycharter/ui/static}/static/documentation/__next._index.txt +0 -0
  307. {ui → pycharter/ui/static}/static/documentation/__next._tree.txt +0 -0
  308. {ui → pycharter/ui/static}/static/documentation/__next.documentation.__PAGE__.txt +0 -0
  309. {ui → pycharter/ui/static}/static/documentation/__next.documentation.txt +0 -0
  310. {ui → pycharter/ui/static}/static/documentation/index.html +0 -0
  311. {ui → pycharter/ui/static}/static/documentation/index.txt +0 -0
  312. {ui → pycharter/ui/static}/static/index.html +0 -0
  313. {ui → pycharter/ui/static}/static/index.txt +0 -0
  314. {ui → pycharter/ui/static}/static/metadata/__next._full.txt +0 -0
  315. {ui → pycharter/ui/static}/static/metadata/__next._head.txt +0 -0
  316. {ui → pycharter/ui/static}/static/metadata/__next._index.txt +0 -0
  317. {ui → pycharter/ui/static}/static/metadata/__next._tree.txt +0 -0
  318. {ui → pycharter/ui/static}/static/metadata/__next.metadata.__PAGE__.txt +0 -0
  319. {ui → pycharter/ui/static}/static/metadata/__next.metadata.txt +0 -0
  320. {ui → pycharter/ui/static}/static/metadata/index.html +0 -0
  321. {ui → pycharter/ui/static}/static/metadata/index.txt +0 -0
  322. {ui → pycharter/ui/static}/static/quality/__next._full.txt +0 -0
  323. {ui → pycharter/ui/static}/static/quality/__next._head.txt +0 -0
  324. {ui → pycharter/ui/static}/static/quality/__next._index.txt +0 -0
  325. {ui → pycharter/ui/static}/static/quality/__next._tree.txt +0 -0
  326. {ui → pycharter/ui/static}/static/quality/__next.quality.__PAGE__.txt +0 -0
  327. {ui → pycharter/ui/static}/static/quality/__next.quality.txt +0 -0
  328. {ui → pycharter/ui/static}/static/quality/index.html +0 -0
  329. {ui → pycharter/ui/static}/static/quality/index.txt +0 -0
  330. {ui → pycharter/ui/static}/static/rules/__next._full.txt +0 -0
  331. {ui → pycharter/ui/static}/static/rules/__next._head.txt +0 -0
  332. {ui → pycharter/ui/static}/static/rules/__next._index.txt +0 -0
  333. {ui → pycharter/ui/static}/static/rules/__next._tree.txt +0 -0
  334. {ui → pycharter/ui/static}/static/rules/__next.rules.__PAGE__.txt +0 -0
  335. {ui → pycharter/ui/static}/static/rules/__next.rules.txt +0 -0
  336. {ui → pycharter/ui/static}/static/rules/index.html +0 -0
  337. {ui → pycharter/ui/static}/static/rules/index.txt +0 -0
  338. {ui → pycharter/ui/static}/static/schemas/__next._full.txt +0 -0
  339. {ui → pycharter/ui/static}/static/schemas/__next._head.txt +0 -0
  340. {ui → pycharter/ui/static}/static/schemas/__next._index.txt +0 -0
  341. {ui → pycharter/ui/static}/static/schemas/__next._tree.txt +0 -0
  342. {ui → pycharter/ui/static}/static/schemas/__next.schemas.__PAGE__.txt +0 -0
  343. {ui → pycharter/ui/static}/static/schemas/__next.schemas.txt +0 -0
  344. {ui → pycharter/ui/static}/static/schemas/index.html +0 -0
  345. {ui → pycharter/ui/static}/static/schemas/index.txt +0 -0
  346. {ui → pycharter/ui/static}/static/settings/__next._full.txt +0 -0
  347. {ui → pycharter/ui/static}/static/settings/__next._head.txt +0 -0
  348. {ui → pycharter/ui/static}/static/settings/__next._index.txt +0 -0
  349. {ui → pycharter/ui/static}/static/settings/__next._tree.txt +0 -0
  350. {ui → pycharter/ui/static}/static/settings/__next.settings.__PAGE__.txt +0 -0
  351. {ui → pycharter/ui/static}/static/settings/__next.settings.txt +0 -0
  352. {ui → pycharter/ui/static}/static/settings/index.html +0 -0
  353. {ui → pycharter/ui/static}/static/settings/index.txt +0 -0
  354. {ui → pycharter/ui}/static/static/static/.gitkeep +0 -0
  355. {ui → pycharter/ui/static}/static/static/404/index.html +0 -0
  356. {ui → pycharter/ui/static}/static/static/404.html +0 -0
  357. {ui → pycharter/ui/static}/static/static/__next.__PAGE__.txt +0 -0
  358. {ui → pycharter/ui/static}/static/static/__next._full.txt +0 -0
  359. {ui → pycharter/ui/static}/static/static/__next._head.txt +0 -0
  360. {ui → pycharter/ui/static}/static/static/__next._index.txt +0 -0
  361. {ui → pycharter/ui/static}/static/static/__next._tree.txt +0 -0
  362. {ui/static/static/static/_next/static/tNTkVW6puVXC4bAm4WrHl → pycharter/ui/static/static/static/_next/static/0rYA78L88aUyD2Uh38hhX}/_buildManifest.js +0 -0
  363. {ui/static/static/static/_next/static/tNTkVW6puVXC4bAm4WrHl → pycharter/ui/static/static/static/_next/static/0rYA78L88aUyD2Uh38hhX}/_ssgManifest.js +0 -0
  364. {ui → pycharter/ui/static}/static/static/_next/static/chunks/13d4a0fbd74c1ee4.js +0 -0
  365. {ui → pycharter/ui}/static/static/static/_next/static/chunks/222442f6da32302a.js +0 -0
  366. {ui → pycharter/ui}/static/static/static/_next/static/chunks/247eb132b7f7b574.js +0 -0
  367. {ui → pycharter/ui}/static/static/static/_next/static/chunks/297d55555b71baba.js +0 -0
  368. {ui → pycharter/ui/static}/static/static/_next/static/chunks/2ab439ce003cd691.js +0 -0
  369. {ui → pycharter/ui/static}/static/static/_next/static/chunks/2edb43b48432ac04.js +0 -0
  370. {ui → pycharter/ui}/static/static/static/_next/static/chunks/414e77373f8ff61c.js +0 -0
  371. {ui → pycharter/ui/static}/static/static/_next/static/chunks/49ca65abd26ae49e.js +0 -0
  372. {ui → pycharter/ui/static}/static/static/_next/static/chunks/5e04d10c4a7b58a3.js +0 -0
  373. {ui → pycharter/ui}/static/static/static/_next/static/chunks/652ad0aa26265c47.js +0 -0
  374. {ui → pycharter/ui/static}/static/static/_next/static/chunks/75d88a058d8ffaa6.js +0 -0
  375. {ui → pycharter/ui/static}/static/static/_next/static/chunks/8c89634cf6bad76f.js +0 -0
  376. {ui → pycharter/ui/static}/static/static/_next/static/chunks/9667e7a3d359eb39.js +0 -0
  377. {ui → pycharter/ui}/static/static/static/_next/static/chunks/9c23f44fff36548a.js +0 -0
  378. {ui → pycharter/ui}/static/static/static/_next/static/chunks/a6dad97d9634a72d.js +0 -0
  379. {ui → pycharter/ui}/static/static/static/_next/static/chunks/b32a0963684b9933.js +0 -0
  380. {ui → pycharter/ui/static}/static/static/_next/static/chunks/c4fa4f4114b7c352.js +0 -0
  381. {ui → pycharter/ui/static}/static/static/_next/static/chunks/c69f6cba366bd988.js +0 -0
  382. {ui → pycharter/ui/static}/static/static/_next/static/chunks/d2363397e1b2bcab.css +0 -0
  383. {ui → pycharter/ui}/static/static/static/_next/static/chunks/db913959c675cea6.js +0 -0
  384. {ui → pycharter/ui/static}/static/static/_next/static/chunks/f061a4be97bfc3b3.js +0 -0
  385. {ui → pycharter/ui}/static/static/static/_next/static/chunks/f2e7afeab1178138.js +0 -0
  386. {ui → pycharter/ui}/static/static/static/_next/static/chunks/ff1a16fafef87110.js +0 -0
  387. {ui → pycharter/ui}/static/static/static/_next/static/chunks/turbopack-ffcb7ab6794027ef.js +0 -0
  388. {ui → pycharter/ui/static}/static/static/_not-found/__next._full.txt +0 -0
  389. {ui → pycharter/ui/static}/static/static/_not-found/__next._head.txt +0 -0
  390. {ui → pycharter/ui/static}/static/static/_not-found/__next._index.txt +0 -0
  391. {ui → pycharter/ui/static}/static/static/_not-found/__next._not-found.__PAGE__.txt +0 -0
  392. {ui → pycharter/ui/static}/static/static/_not-found/__next._not-found.txt +0 -0
  393. {ui → pycharter/ui/static}/static/static/_not-found/__next._tree.txt +0 -0
  394. {ui → pycharter/ui/static}/static/static/_not-found/index.html +0 -0
  395. {ui → pycharter/ui/static}/static/static/_not-found/index.txt +0 -0
  396. {ui → pycharter/ui/static}/static/static/contracts/__next._full.txt +0 -0
  397. {ui → pycharter/ui/static}/static/static/contracts/__next._head.txt +0 -0
  398. {ui → pycharter/ui/static}/static/static/contracts/__next._index.txt +0 -0
  399. {ui → pycharter/ui/static}/static/static/contracts/__next._tree.txt +0 -0
  400. {ui → pycharter/ui/static}/static/static/contracts/__next.contracts.__PAGE__.txt +0 -0
  401. {ui → pycharter/ui/static}/static/static/contracts/__next.contracts.txt +0 -0
  402. {ui → pycharter/ui/static}/static/static/contracts/index.html +0 -0
  403. {ui → pycharter/ui/static}/static/static/contracts/index.txt +0 -0
  404. {ui → pycharter/ui/static}/static/static/documentation/__next._full.txt +0 -0
  405. {ui → pycharter/ui/static}/static/static/documentation/__next._head.txt +0 -0
  406. {ui → pycharter/ui/static}/static/static/documentation/__next._index.txt +0 -0
  407. {ui → pycharter/ui/static}/static/static/documentation/__next._tree.txt +0 -0
  408. {ui → pycharter/ui/static}/static/static/documentation/__next.documentation.__PAGE__.txt +0 -0
  409. {ui → pycharter/ui/static}/static/static/documentation/__next.documentation.txt +0 -0
  410. {ui → pycharter/ui/static}/static/static/documentation/index.html +0 -0
  411. {ui → pycharter/ui/static}/static/static/documentation/index.txt +0 -0
  412. {ui → pycharter/ui/static}/static/static/index.html +0 -0
  413. {ui → pycharter/ui/static}/static/static/index.txt +0 -0
  414. {ui → pycharter/ui/static}/static/static/metadata/__next._full.txt +0 -0
  415. {ui → pycharter/ui/static}/static/static/metadata/__next._head.txt +0 -0
  416. {ui → pycharter/ui/static}/static/static/metadata/__next._index.txt +0 -0
  417. {ui → pycharter/ui/static}/static/static/metadata/__next._tree.txt +0 -0
  418. {ui → pycharter/ui/static}/static/static/metadata/__next.metadata.__PAGE__.txt +0 -0
  419. {ui → pycharter/ui/static}/static/static/metadata/__next.metadata.txt +0 -0
  420. {ui → pycharter/ui/static}/static/static/metadata/index.html +0 -0
  421. {ui → pycharter/ui/static}/static/static/metadata/index.txt +0 -0
  422. {ui → pycharter/ui/static}/static/static/quality/__next._full.txt +0 -0
  423. {ui → pycharter/ui/static}/static/static/quality/__next._head.txt +0 -0
  424. {ui → pycharter/ui/static}/static/static/quality/__next._index.txt +0 -0
  425. {ui → pycharter/ui/static}/static/static/quality/__next._tree.txt +0 -0
  426. {ui → pycharter/ui/static}/static/static/quality/__next.quality.__PAGE__.txt +0 -0
  427. {ui → pycharter/ui/static}/static/static/quality/__next.quality.txt +0 -0
  428. {ui → pycharter/ui/static}/static/static/quality/index.html +0 -0
  429. {ui → pycharter/ui/static}/static/static/quality/index.txt +0 -0
  430. {ui → pycharter/ui/static}/static/static/rules/__next._full.txt +0 -0
  431. {ui → pycharter/ui/static}/static/static/rules/__next._head.txt +0 -0
  432. {ui → pycharter/ui/static}/static/static/rules/__next._index.txt +0 -0
  433. {ui → pycharter/ui/static}/static/static/rules/__next._tree.txt +0 -0
  434. {ui → pycharter/ui/static}/static/static/rules/__next.rules.__PAGE__.txt +0 -0
  435. {ui → pycharter/ui/static}/static/static/rules/__next.rules.txt +0 -0
  436. {ui → pycharter/ui/static}/static/static/rules/index.html +0 -0
  437. {ui → pycharter/ui/static}/static/static/rules/index.txt +0 -0
  438. {ui → pycharter/ui/static}/static/static/schemas/__next._full.txt +0 -0
  439. {ui → pycharter/ui/static}/static/static/schemas/__next._head.txt +0 -0
  440. {ui → pycharter/ui/static}/static/static/schemas/__next._index.txt +0 -0
  441. {ui → pycharter/ui/static}/static/static/schemas/__next._tree.txt +0 -0
  442. {ui → pycharter/ui/static}/static/static/schemas/__next.schemas.__PAGE__.txt +0 -0
  443. {ui → pycharter/ui/static}/static/static/schemas/__next.schemas.txt +0 -0
  444. {ui → pycharter/ui/static}/static/static/schemas/index.html +0 -0
  445. {ui → pycharter/ui/static}/static/static/schemas/index.txt +0 -0
  446. {ui → pycharter/ui/static}/static/static/settings/__next._full.txt +0 -0
  447. {ui → pycharter/ui/static}/static/static/settings/__next._head.txt +0 -0
  448. {ui → pycharter/ui/static}/static/static/settings/__next._index.txt +0 -0
  449. {ui → pycharter/ui/static}/static/static/settings/__next._tree.txt +0 -0
  450. {ui → pycharter/ui/static}/static/static/settings/__next.settings.__PAGE__.txt +0 -0
  451. {ui → pycharter/ui/static}/static/static/settings/__next.settings.txt +0 -0
  452. {ui → pycharter/ui/static}/static/static/settings/index.html +0 -0
  453. {ui → pycharter/ui/static}/static/static/settings/index.txt +0 -0
  454. {ui → pycharter/ui/static}/static/static/static/404/index.html +0 -0
  455. {ui → pycharter/ui/static}/static/static/static/404.html +0 -0
  456. {ui → pycharter/ui/static}/static/static/static/__next.__PAGE__.txt +0 -0
  457. {ui → pycharter/ui/static}/static/static/static/__next._full.txt +0 -0
  458. {ui → pycharter/ui/static}/static/static/static/__next._head.txt +0 -0
  459. {ui → pycharter/ui/static}/static/static/static/__next._index.txt +0 -0
  460. {ui → pycharter/ui/static}/static/static/static/__next._tree.txt +0 -0
  461. {ui → pycharter/ui/static}/static/static/static/_next/static/chunks/2ab439ce003cd691.js +0 -0
  462. {ui → pycharter/ui/static}/static/static/static/_next/static/chunks/49ca65abd26ae49e.js +0 -0
  463. {ui → pycharter/ui/static}/static/static/static/_next/static/chunks/4e310fe5005770a3.css +0 -0
  464. {ui → pycharter/ui/static}/static/static/static/_next/static/chunks/5e04d10c4a7b58a3.js +0 -0
  465. {ui → pycharter/ui/static}/static/static/static/_next/static/chunks/5fc14c00a2779dc5.js +0 -0
  466. {ui → pycharter/ui/static}/static/static/static/_next/static/chunks/75d88a058d8ffaa6.js +0 -0
  467. {ui → pycharter/ui/static}/static/static/static/_next/static/chunks/8c89634cf6bad76f.js +0 -0
  468. {ui → pycharter/ui/static}/static/static/static/_next/static/chunks/9667e7a3d359eb39.js +0 -0
  469. {ui → pycharter/ui/static}/static/static/static/_next/static/chunks/b584574fdc8ab13e.js +0 -0
  470. {ui → pycharter/ui/static}/static/static/static/_next/static/chunks/c69f6cba366bd988.js +0 -0
  471. {ui → pycharter/ui/static}/static/static/static/_next/static/chunks/d5989c94d3614b3a.js +0 -0
  472. {ui → pycharter/ui/static}/static/static/static/_next/static/chunks/f061a4be97bfc3b3.js +0 -0
  473. {ui → pycharter/ui/static}/static/static/static/_not-found/__next._full.txt +0 -0
  474. {ui → pycharter/ui/static}/static/static/static/_not-found/__next._head.txt +0 -0
  475. {ui → pycharter/ui/static}/static/static/static/_not-found/__next._index.txt +0 -0
  476. {ui → pycharter/ui/static}/static/static/static/_not-found/__next._not-found.__PAGE__.txt +0 -0
  477. {ui → pycharter/ui/static}/static/static/static/_not-found/__next._not-found.txt +0 -0
  478. {ui → pycharter/ui/static}/static/static/static/_not-found/__next._tree.txt +0 -0
  479. {ui → pycharter/ui/static}/static/static/static/_not-found/index.html +0 -0
  480. {ui → pycharter/ui/static}/static/static/static/_not-found/index.txt +0 -0
  481. {ui → pycharter/ui/static}/static/static/static/contracts/__next._full.txt +0 -0
  482. {ui → pycharter/ui/static}/static/static/static/contracts/__next._head.txt +0 -0
  483. {ui → pycharter/ui/static}/static/static/static/contracts/__next._index.txt +0 -0
  484. {ui → pycharter/ui/static}/static/static/static/contracts/__next._tree.txt +0 -0
  485. {ui → pycharter/ui/static}/static/static/static/contracts/__next.contracts.__PAGE__.txt +0 -0
  486. {ui → pycharter/ui/static}/static/static/static/contracts/__next.contracts.txt +0 -0
  487. {ui → pycharter/ui/static}/static/static/static/contracts/index.html +0 -0
  488. {ui → pycharter/ui/static}/static/static/static/contracts/index.txt +0 -0
  489. {ui → pycharter/ui/static}/static/static/static/documentation/__next._full.txt +0 -0
  490. {ui → pycharter/ui/static}/static/static/static/documentation/__next._head.txt +0 -0
  491. {ui → pycharter/ui/static}/static/static/static/documentation/__next._index.txt +0 -0
  492. {ui → pycharter/ui/static}/static/static/static/documentation/__next._tree.txt +0 -0
  493. {ui → pycharter/ui/static}/static/static/static/documentation/__next.documentation.__PAGE__.txt +0 -0
  494. {ui → pycharter/ui/static}/static/static/static/documentation/__next.documentation.txt +0 -0
  495. {ui → pycharter/ui/static}/static/static/static/documentation/index.html +0 -0
  496. {ui → pycharter/ui/static}/static/static/static/documentation/index.txt +0 -0
  497. {ui → pycharter/ui/static}/static/static/static/index.html +0 -0
  498. {ui → pycharter/ui/static}/static/static/static/index.txt +0 -0
  499. {ui → pycharter/ui/static}/static/static/static/metadata/__next._full.txt +0 -0
  500. {ui → pycharter/ui/static}/static/static/static/metadata/__next._head.txt +0 -0
  501. {ui → pycharter/ui/static}/static/static/static/metadata/__next._index.txt +0 -0
  502. {ui → pycharter/ui/static}/static/static/static/metadata/__next._tree.txt +0 -0
  503. {ui → pycharter/ui/static}/static/static/static/metadata/__next.metadata.__PAGE__.txt +0 -0
  504. {ui → pycharter/ui/static}/static/static/static/metadata/__next.metadata.txt +0 -0
  505. {ui → pycharter/ui/static}/static/static/static/metadata/index.html +0 -0
  506. {ui → pycharter/ui/static}/static/static/static/metadata/index.txt +0 -0
  507. {ui → pycharter/ui/static}/static/static/static/quality/__next._full.txt +0 -0
  508. {ui → pycharter/ui/static}/static/static/static/quality/__next._head.txt +0 -0
  509. {ui → pycharter/ui/static}/static/static/static/quality/__next._index.txt +0 -0
  510. {ui → pycharter/ui/static}/static/static/static/quality/__next._tree.txt +0 -0
  511. {ui → pycharter/ui/static}/static/static/static/quality/__next.quality.__PAGE__.txt +0 -0
  512. {ui → pycharter/ui/static}/static/static/static/quality/__next.quality.txt +0 -0
  513. {ui → pycharter/ui/static}/static/static/static/quality/index.html +0 -0
  514. {ui → pycharter/ui/static}/static/static/static/quality/index.txt +0 -0
  515. {ui → pycharter/ui/static}/static/static/static/rules/__next._full.txt +0 -0
  516. {ui → pycharter/ui/static}/static/static/static/rules/__next._head.txt +0 -0
  517. {ui → pycharter/ui/static}/static/static/static/rules/__next._index.txt +0 -0
  518. {ui → pycharter/ui/static}/static/static/static/rules/__next._tree.txt +0 -0
  519. {ui → pycharter/ui/static}/static/static/static/rules/__next.rules.__PAGE__.txt +0 -0
  520. {ui → pycharter/ui/static}/static/static/static/rules/__next.rules.txt +0 -0
  521. {ui → pycharter/ui/static}/static/static/static/rules/index.html +0 -0
  522. {ui → pycharter/ui/static}/static/static/static/rules/index.txt +0 -0
  523. {ui → pycharter/ui/static}/static/static/static/schemas/__next._full.txt +0 -0
  524. {ui → pycharter/ui/static}/static/static/static/schemas/__next._head.txt +0 -0
  525. {ui → pycharter/ui/static}/static/static/static/schemas/__next._index.txt +0 -0
  526. {ui → pycharter/ui/static}/static/static/static/schemas/__next._tree.txt +0 -0
  527. {ui → pycharter/ui/static}/static/static/static/schemas/__next.schemas.__PAGE__.txt +0 -0
  528. {ui → pycharter/ui/static}/static/static/static/schemas/__next.schemas.txt +0 -0
  529. {ui → pycharter/ui/static}/static/static/static/schemas/index.html +0 -0
  530. {ui → pycharter/ui/static}/static/static/static/schemas/index.txt +0 -0
  531. {ui → pycharter/ui/static}/static/static/static/settings/__next._full.txt +0 -0
  532. {ui → pycharter/ui/static}/static/static/static/settings/__next._head.txt +0 -0
  533. {ui → pycharter/ui/static}/static/static/static/settings/__next._index.txt +0 -0
  534. {ui → pycharter/ui/static}/static/static/static/settings/__next._tree.txt +0 -0
  535. {ui → pycharter/ui/static}/static/static/static/settings/__next.settings.__PAGE__.txt +0 -0
  536. {ui → pycharter/ui/static}/static/static/static/settings/__next.settings.txt +0 -0
  537. {ui → pycharter/ui/static}/static/static/static/settings/index.html +0 -0
  538. {ui → pycharter/ui/static}/static/static/static/settings/index.txt +0 -0
  539. {ui → pycharter/ui/static}/static/static/static/validation/__next._full.txt +0 -0
  540. {ui → pycharter/ui/static}/static/static/static/validation/__next._head.txt +0 -0
  541. {ui → pycharter/ui/static}/static/static/static/validation/__next._index.txt +0 -0
  542. {ui → pycharter/ui/static}/static/static/static/validation/__next._tree.txt +0 -0
  543. {ui → pycharter/ui/static}/static/static/static/validation/__next.validation.__PAGE__.txt +0 -0
  544. {ui → pycharter/ui/static}/static/static/static/validation/__next.validation.txt +0 -0
  545. {ui → pycharter/ui/static}/static/static/static/validation/index.html +0 -0
  546. {ui → pycharter/ui/static}/static/static/static/validation/index.txt +0 -0
  547. {ui → pycharter/ui/static}/static/static/validation/__next._full.txt +0 -0
  548. {ui → pycharter/ui/static}/static/static/validation/__next._head.txt +0 -0
  549. {ui → pycharter/ui/static}/static/static/validation/__next._index.txt +0 -0
  550. {ui → pycharter/ui/static}/static/static/validation/__next._tree.txt +0 -0
  551. {ui → pycharter/ui/static}/static/static/validation/__next.validation.__PAGE__.txt +0 -0
  552. {ui → pycharter/ui/static}/static/static/validation/__next.validation.txt +0 -0
  553. {ui → pycharter/ui/static}/static/static/validation/index.html +0 -0
  554. {ui → pycharter/ui/static}/static/static/validation/index.txt +0 -0
  555. {ui → pycharter/ui/static}/static/validation/__next._full.txt +0 -0
  556. {ui → pycharter/ui/static}/static/validation/__next._head.txt +0 -0
  557. {ui → pycharter/ui/static}/static/validation/__next._index.txt +0 -0
  558. {ui → pycharter/ui/static}/static/validation/__next._tree.txt +0 -0
  559. {ui → pycharter/ui/static}/static/validation/__next.validation.__PAGE__.txt +0 -0
  560. {ui → pycharter/ui/static}/static/validation/__next.validation.txt +0 -0
  561. {ui → pycharter/ui/static}/static/validation/index.html +0 -0
  562. {ui → pycharter/ui/static}/static/validation/index.txt +0 -0
  563. {worker → pycharter/worker}/__init__.py +0 -0
  564. {worker → pycharter/worker}/models.py +0 -0
  565. {pycharter-0.0.24.dist-info → pycharter-0.0.26.dist-info}/WHEEL +0 -0
  566. {pycharter-0.0.24.dist-info → pycharter-0.0.26.dist-info}/entry_points.txt +0 -0
  567. {pycharter-0.0.24.dist-info → pycharter-0.0.26.dist-info}/licenses/LICENSE +0 -0
pycharter/__init__.py CHANGED
@@ -166,6 +166,9 @@ from pycharter.runtime_validator import (
166
166
  validate_input,
167
167
  validate_output,
168
168
  validate_with_contract_decorator,
169
+ # Schema utilities
170
+ merge_rules_into_schema,
171
+ get_merged_schema_from_contract,
169
172
  )
170
173
 
171
174
  # ============================================================================
@@ -345,6 +348,9 @@ __all__ = [
345
348
  "validate_input",
346
349
  "validate_output",
347
350
  "validate_with_contract_decorator",
351
+ # Schema utilities
352
+ "merge_rules_into_schema",
353
+ "get_merged_schema_from_contract",
348
354
  # Quality
349
355
  "QualityCheck",
350
356
  "QualityCheckOptions",
@@ -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 (for display/docs). For validation, use the Validator class, which merges rules internally.
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"]
@@ -0,0 +1,158 @@
1
+ """
2
+ Authentication dependency for API routes.
3
+
4
+ Supports:
5
+ - Local/dev: initial credentials from env or pycharter.cfg; JWT issued and verified in-process.
6
+ - Optional auth service: token introspect via HTTP (when auth_service_url + introspect_path set).
7
+ """
8
+
9
+ import hmac
10
+ import time
11
+ from typing import Any, Optional
12
+
13
+ import jwt
14
+ from fastapi import Depends, HTTPException, status
15
+ from fastapi.security import HTTPAuthorizationCredentials, HTTPBearer
16
+
17
+ from pycharter.config import (
18
+ get_auth_initial_credentials,
19
+ get_auth_jwt_secret,
20
+ get_auth_service_introspect_path,
21
+ get_auth_service_url,
22
+ is_auth_disabled,
23
+ )
24
+
25
+ # HTTPBearer returns the token from Authorization: Bearer <token>
26
+ security = HTTPBearer(auto_error=False)
27
+
28
+ # Default JWT expiry (seconds)
29
+ ACCESS_TOKEN_EXPIRE_SECONDS = 3600 # 1 hour
30
+
31
+
32
+ def _constant_time_compare(a: str, b: str) -> bool:
33
+ """Constant-time string comparison to avoid timing attacks."""
34
+ return hmac.compare_digest(a.encode("utf-8"), b.encode("utf-8"))
35
+
36
+
37
+ def verify_initial_credentials(username: str, password: str) -> bool:
38
+ """Verify username/password against initial credentials (env or cfg). Returns True if valid."""
39
+ creds = get_auth_initial_credentials()
40
+ if not creds:
41
+ return False
42
+ u, p = creds
43
+ return _constant_time_compare(username, u) and _constant_time_compare(password, p)
44
+
45
+
46
+ def create_access_token(username: str, expires_delta_seconds: int = ACCESS_TOKEN_EXPIRE_SECONDS) -> str:
47
+ """Create a JWT access token for the given username."""
48
+ secret = get_auth_jwt_secret()
49
+ if not secret:
50
+ raise ValueError("JWT secret not configured (set PYCHARTER_AUTH_JWT_SECRET or auth.jwt_secret)")
51
+ payload = {
52
+ "sub": username,
53
+ "exp": int(time.time()) + expires_delta_seconds,
54
+ "iat": int(time.time()),
55
+ }
56
+ return jwt.encode(payload, secret, algorithm="HS256")
57
+
58
+
59
+ def verify_jwt(token: str) -> Optional[dict[str, Any]]:
60
+ """Verify JWT and return payload (with 'sub' = username) or None if invalid."""
61
+ secret = get_auth_jwt_secret()
62
+ if not secret:
63
+ return None
64
+ try:
65
+ payload = jwt.decode(token, secret, algorithms=["HS256"])
66
+ return payload
67
+ except jwt.PyJWTError:
68
+ return None
69
+
70
+
71
+ async def introspect_token(token: str) -> Optional[dict[str, Any]]:
72
+ """Call auth service introspect endpoint. Return payload if active, else None."""
73
+ base = get_auth_service_url()
74
+ path = get_auth_service_introspect_path()
75
+ if not base or not path:
76
+ return None
77
+ url = f"{base.rstrip('/')}{path}"
78
+ try:
79
+ import httpx
80
+ async with httpx.AsyncClient() as client:
81
+ # Common pattern: POST with token in body or header
82
+ r = await client.post(
83
+ url,
84
+ data={"token": token},
85
+ headers={"Content-Type": "application/x-www-form-urlencoded"},
86
+ timeout=5.0,
87
+ )
88
+ if r.status_code != 200:
89
+ return None
90
+ data = r.json()
91
+ # Typical introspect: {"active": true, "sub": "username", ...}
92
+ if not data.get("active", False):
93
+ return None
94
+ return data
95
+ except Exception:
96
+ return None
97
+
98
+
99
+ async def get_current_user(
100
+ credentials: Optional[HTTPAuthorizationCredentials] = Depends(security),
101
+ ) -> dict[str, Any]:
102
+ """
103
+ Resolve current user from Bearer token. Uses JWT verify or auth service introspect.
104
+ When auth is disabled, returns a dummy user so routes do not need to branch.
105
+ """
106
+ if is_auth_disabled():
107
+ return {"username": "anonymous", "auth_disabled": True}
108
+
109
+ token = None
110
+ if credentials and credentials.credentials:
111
+ token = credentials.credentials
112
+
113
+ if not token:
114
+ raise HTTPException(
115
+ status_code=status.HTTP_401_UNAUTHORIZED,
116
+ detail="Not authenticated",
117
+ headers={"WWW-Authenticate": "Bearer"},
118
+ )
119
+
120
+ # Prefer JWT verify (no HTTP); fall back to introspect if configured
121
+ payload = verify_jwt(token)
122
+ if payload is None and (get_auth_service_url() and get_auth_service_introspect_path()):
123
+ payload = await introspect_token(token)
124
+
125
+ if payload is None:
126
+ raise HTTPException(
127
+ status_code=status.HTTP_401_UNAUTHORIZED,
128
+ detail="Invalid or expired token",
129
+ headers={"WWW-Authenticate": "Bearer"},
130
+ )
131
+
132
+ username = payload.get("sub") or payload.get("username")
133
+ if not username:
134
+ raise HTTPException(
135
+ status_code=status.HTTP_401_UNAUTHORIZED,
136
+ detail="Invalid token payload",
137
+ headers={"WWW-Authenticate": "Bearer"},
138
+ )
139
+
140
+ return {"username": username}
141
+
142
+
143
+ async def get_optional_user(
144
+ credentials: Optional[HTTPAuthorizationCredentials] = Depends(security),
145
+ ) -> Optional[dict[str, Any]]:
146
+ """Like get_current_user but returns None instead of 401 when no/invalid token. Useful for public endpoints."""
147
+ if is_auth_disabled():
148
+ return {"username": "anonymous", "auth_disabled": True}
149
+ token = credentials.credentials if credentials and credentials.credentials else None
150
+ if not token:
151
+ return None
152
+ payload = verify_jwt(token)
153
+ if payload is None and (get_auth_service_url() and get_auth_service_introspect_path()):
154
+ payload = await introspect_token(token)
155
+ if payload is None:
156
+ return None
157
+ username = payload.get("sub") or payload.get("username")
158
+ return {"username": username} if username else None
@@ -16,7 +16,8 @@ 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
+ auth,
20
21
  contracts,
21
22
  metadata,
22
23
  quality,
@@ -27,7 +28,10 @@ from api.routes.v1 import (
27
28
  docs,
28
29
  tracking,
29
30
  evolution,
31
+ etl,
30
32
  )
33
+ from pycharter.api.dependencies.auth import get_current_user
34
+ from fastapi import Depends
31
35
 
32
36
  # Try to import validation_jobs router (requires worker component)
33
37
  try:
@@ -102,57 +106,80 @@ def create_application() -> FastAPI:
102
106
  allow_headers=["*"],
103
107
  )
104
108
 
105
- # Include routers from v1 with automatic /api/v1 prefix
106
- # All routers in routes/v1/ are automatically included with the /api/v1 prefix
109
+ # Auth router: no global auth dependency (login/logout public; /auth/me uses Depends in route)
110
+ app.include_router(
111
+ auth.router,
112
+ prefix=f"/api/{API_VERSION}",
113
+ tags=["Auth"],
114
+ )
115
+
116
+ # Protected routers: require valid Bearer token (when auth enabled; when disabled, get_current_user returns dummy user)
117
+ _auth_dep = [Depends(get_current_user)]
107
118
  app.include_router(
108
119
  contracts.router,
109
120
  prefix=f"/api/{API_VERSION}",
110
121
  tags=["Contracts"],
122
+ dependencies=_auth_dep,
111
123
  )
112
124
  app.include_router(
113
125
  metadata.router,
114
126
  prefix=f"/api/{API_VERSION}",
115
127
  tags=["Metadata"],
128
+ dependencies=_auth_dep,
116
129
  )
117
130
  app.include_router(
118
131
  schemas.router,
119
132
  prefix=f"/api/{API_VERSION}",
120
133
  tags=["Schemas"],
134
+ dependencies=_auth_dep,
121
135
  )
122
136
  app.include_router(
123
137
  validation.router,
124
138
  prefix=f"/api/{API_VERSION}",
125
139
  tags=["Validation"],
140
+ dependencies=_auth_dep,
126
141
  )
127
142
  app.include_router(
128
143
  quality.router,
129
144
  prefix=f"/api/{API_VERSION}",
130
145
  tags=["Quality"],
146
+ dependencies=_auth_dep,
131
147
  )
132
148
  app.include_router(
133
149
  templates.router,
134
150
  prefix=f"/api/{API_VERSION}",
135
151
  tags=["Templates"],
152
+ dependencies=_auth_dep,
153
+ )
154
+ app.include_router(
155
+ etl.router,
156
+ prefix=f"/api/{API_VERSION}",
157
+ tags=["ETL"],
158
+ dependencies=_auth_dep,
136
159
  )
137
160
  app.include_router(
138
161
  settings.router,
139
162
  prefix=f"/api/{API_VERSION}",
140
163
  tags=["Settings"],
164
+ dependencies=_auth_dep,
141
165
  )
142
166
  app.include_router(
143
167
  docs.router,
144
168
  prefix=f"/api/{API_VERSION}",
145
169
  tags=["Documentation"],
170
+ dependencies=_auth_dep,
146
171
  )
147
172
  app.include_router(
148
173
  tracking.router,
149
174
  prefix=f"/api/{API_VERSION}",
150
175
  tags=["Quality Tracking"],
176
+ dependencies=_auth_dep,
151
177
  )
152
178
  app.include_router(
153
179
  evolution.router,
154
180
  prefix=f"/api/{API_VERSION}",
155
181
  tags=["Schema Evolution"],
182
+ dependencies=_auth_dep,
156
183
  )
157
184
 
158
185
  # Include validation_jobs router if worker component is available
@@ -161,6 +188,7 @@ def create_application() -> FastAPI:
161
188
  validation_jobs.router,
162
189
  prefix=f"/api/{API_VERSION}",
163
190
  tags=["Validation Jobs"],
191
+ dependencies=_auth_dep,
164
192
  )
165
193
 
166
194
  # Root endpoint
@@ -296,7 +324,7 @@ def main():
296
324
  import uvicorn
297
325
 
298
326
  uvicorn.run(
299
- "api.main:app",
327
+ "pycharter.api.main:app",
300
328
  host="0.0.0.0",
301
329
  port=8000,
302
330
  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,