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.
Files changed (401) hide show
  1. pycharter/api/README.md +340 -0
  2. {api → pycharter/api}/__init__.py +1 -1
  3. {api → pycharter/api}/dependencies/__init__.py +2 -2
  4. {api → pycharter/api}/main.py +2 -2
  5. {api → pycharter/api}/models/__init__.py +4 -4
  6. {api → pycharter/api}/routes/v1/__init__.py +1 -1
  7. {api → pycharter/api}/routes/v1/contracts.py +4 -4
  8. {api → pycharter/api}/routes/v1/docs.py +2 -2
  9. {api → pycharter/api}/routes/v1/evolution.py +2 -2
  10. {api → pycharter/api}/routes/v1/metadata.py +5 -5
  11. {api → pycharter/api}/routes/v1/quality.py +3 -3
  12. {api → pycharter/api}/routes/v1/schemas.py +1 -1
  13. {api → pycharter/api}/routes/v1/settings.py +1 -1
  14. {api → pycharter/api}/routes/v1/tracking.py +1 -1
  15. {api → pycharter/api}/routes/v1/validation.py +2 -2
  16. {api → pycharter/api}/routes/v1/validation_jobs.py +3 -3
  17. pycharter/cli.py +8 -10
  18. pycharter/data/templates/contract/README.md +144 -0
  19. pycharter/db/README.md +179 -0
  20. pycharter/db/schemas/README.md +96 -0
  21. pycharter/etl_generator/ASYNC_AND_EXECUTION.md +91 -0
  22. pycharter/etl_generator/INTERFACES.md +143 -0
  23. pycharter/etl_generator/README.md +271 -0
  24. pycharter/etl_generator/TRANSFORMATION_GUIDE.md +452 -0
  25. pycharter/etl_generator/schemas/extract.json +234 -0
  26. pycharter/etl_generator/schemas/load.json +202 -0
  27. pycharter/etl_generator/schemas/pipeline.json +94 -0
  28. pycharter/etl_generator/schemas/transform.json +171 -0
  29. pycharter/metadata_store/README.md +229 -0
  30. pycharter/quality/README.md +235 -0
  31. pycharter/ui/.eslintrc.json +4 -0
  32. pycharter/ui/README.md +186 -0
  33. {ui → pycharter/ui}/__init__.py +3 -3
  34. pycharter/ui/components.json +17 -0
  35. pycharter/ui/package-lock.json +6608 -0
  36. pycharter/ui/package.json +36 -0
  37. {ui → pycharter/ui}/server.py +7 -8
  38. pycharter/ui/static/_next/static/2gKjNv6YvE6BcIdFthBLs/_clientMiddlewareManifest.json +1 -0
  39. pycharter/ui/static/static/_next/static/0rYA78L88aUyD2Uh38hhX/_clientMiddlewareManifest.json +1 -0
  40. pycharter/ui/static/static/static/_next/static/tNTkVW6puVXC4bAm4WrHl/_clientMiddlewareManifest.json +1 -0
  41. pycharter/ui/tsconfig.json +42 -0
  42. pycharter/worker/README.md +187 -0
  43. pycharter/worker/backends/__init__.py +8 -0
  44. pycharter/worker/backends/base.py +46 -0
  45. pycharter/worker/backends/spark.py +233 -0
  46. {worker → pycharter/worker}/cli.py +1 -1
  47. {worker → pycharter/worker}/processor.py +2 -2
  48. pycharter/worker/queue/__init__.py +8 -0
  49. pycharter/worker/queue/redis_queue.py +147 -0
  50. {pycharter-0.0.24.dist-info → pycharter-0.0.25.dist-info}/METADATA +1 -1
  51. pycharter-0.0.25.dist-info/RECORD +572 -0
  52. pycharter-0.0.25.dist-info/top_level.txt +1 -0
  53. pycharter-0.0.24.dist-info/RECORD +0 -543
  54. pycharter-0.0.24.dist-info/top_level.txt +0 -4
  55. {api → pycharter/api}/dependencies/database.py +0 -0
  56. {api → pycharter/api}/dependencies/store.py +0 -0
  57. {api → pycharter/api}/models/contracts.py +0 -0
  58. {api → pycharter/api}/models/docs.py +0 -0
  59. {api → pycharter/api}/models/evolution.py +0 -0
  60. {api → pycharter/api}/models/metadata.py +0 -0
  61. {api → pycharter/api}/models/metadata_entities.py +0 -0
  62. {api → pycharter/api}/models/quality.py +0 -0
  63. {api → pycharter/api}/models/schemas.py +0 -0
  64. {api → pycharter/api}/models/tracking.py +0 -0
  65. {api → pycharter/api}/models/validation.py +0 -0
  66. {api → pycharter/api}/routes/__init__.py +0 -0
  67. {api → pycharter/api}/routes/v1/templates.py +0 -0
  68. {api → pycharter/api}/utils.py +0 -0
  69. {ui → pycharter/ui}/build.py +0 -0
  70. {ui → pycharter/ui}/dev.py +0 -0
  71. {ui → pycharter/ui}/static/.gitkeep +0 -0
  72. {ui → pycharter/ui}/static/404/index.html +0 -0
  73. {ui → pycharter/ui}/static/404.html +0 -0
  74. {ui → pycharter/ui}/static/__next.__PAGE__.txt +0 -0
  75. {ui → pycharter/ui}/static/__next._full.txt +0 -0
  76. {ui → pycharter/ui}/static/__next._head.txt +0 -0
  77. {ui → pycharter/ui}/static/__next._index.txt +0 -0
  78. {ui → pycharter/ui}/static/__next._tree.txt +0 -0
  79. {ui → pycharter/ui}/static/_next/static/2gKjNv6YvE6BcIdFthBLs/_buildManifest.js +0 -0
  80. {ui → pycharter/ui}/static/_next/static/2gKjNv6YvE6BcIdFthBLs/_ssgManifest.js +0 -0
  81. {ui → pycharter/ui}/static/_next/static/chunks/13d4a0fbd74c1ee4.js +0 -0
  82. {ui → pycharter/ui}/static/_next/static/chunks/222442f6da32302a.js +0 -0
  83. {ui → pycharter/ui}/static/_next/static/chunks/247eb132b7f7b574.js +0 -0
  84. {ui → pycharter/ui}/static/_next/static/chunks/26dfc590f7714c03.js +0 -0
  85. {ui → pycharter/ui}/static/_next/static/chunks/297d55555b71baba.js +0 -0
  86. {ui → pycharter/ui}/static/_next/static/chunks/2ab439ce003cd691.js +0 -0
  87. {ui → pycharter/ui}/static/_next/static/chunks/2edb43b48432ac04.js +0 -0
  88. {ui → pycharter/ui}/static/_next/static/chunks/34d289e6db2ef551.js +0 -0
  89. {ui → pycharter/ui}/static/_next/static/chunks/414e77373f8ff61c.js +0 -0
  90. {ui → pycharter/ui}/static/_next/static/chunks/49ca65abd26ae49e.js +0 -0
  91. {ui → pycharter/ui}/static/_next/static/chunks/652ad0aa26265c47.js +0 -0
  92. {ui → pycharter/ui}/static/_next/static/chunks/9667e7a3d359eb39.js +0 -0
  93. {ui → pycharter/ui}/static/_next/static/chunks/99508d9d5869cc27.js +0 -0
  94. {ui → pycharter/ui}/static/_next/static/chunks/9c23f44fff36548a.js +0 -0
  95. {ui → pycharter/ui}/static/_next/static/chunks/a6dad97d9634a72d.js +0 -0
  96. {ui → pycharter/ui}/static/_next/static/chunks/b313c35a6ba76574.js +0 -0
  97. {ui → pycharter/ui}/static/_next/static/chunks/b32a0963684b9933.js +0 -0
  98. {ui → pycharter/ui}/static/_next/static/chunks/c69f6cba366bd988.js +0 -0
  99. {ui → pycharter/ui}/static/_next/static/chunks/d2363397e1b2bcab.css +0 -0
  100. {ui → pycharter/ui}/static/_next/static/chunks/db913959c675cea6.js +0 -0
  101. {ui → pycharter/ui}/static/_next/static/chunks/f061a4be97bfc3b3.js +0 -0
  102. {ui → pycharter/ui}/static/_next/static/chunks/f2e7afeab1178138.js +0 -0
  103. {ui → pycharter/ui}/static/_next/static/chunks/f7d1a90dd75d2572.js +0 -0
  104. {ui → pycharter/ui}/static/_next/static/chunks/ff1a16fafef87110.js +0 -0
  105. {ui → pycharter/ui}/static/_next/static/chunks/turbopack-ffcb7ab6794027ef.js +0 -0
  106. {ui → pycharter/ui}/static/_not-found/__next._full.txt +0 -0
  107. {ui → pycharter/ui}/static/_not-found/__next._head.txt +0 -0
  108. {ui → pycharter/ui}/static/_not-found/__next._index.txt +0 -0
  109. {ui → pycharter/ui}/static/_not-found/__next._not-found.__PAGE__.txt +0 -0
  110. {ui → pycharter/ui}/static/_not-found/__next._not-found.txt +0 -0
  111. {ui → pycharter/ui}/static/_not-found/__next._tree.txt +0 -0
  112. {ui → pycharter/ui}/static/_not-found/index.html +0 -0
  113. {ui → pycharter/ui}/static/_not-found/index.txt +0 -0
  114. {ui → pycharter/ui}/static/contracts/__next._full.txt +0 -0
  115. {ui → pycharter/ui}/static/contracts/__next._head.txt +0 -0
  116. {ui → pycharter/ui}/static/contracts/__next._index.txt +0 -0
  117. {ui → pycharter/ui}/static/contracts/__next._tree.txt +0 -0
  118. {ui → pycharter/ui}/static/contracts/__next.contracts.__PAGE__.txt +0 -0
  119. {ui → pycharter/ui}/static/contracts/__next.contracts.txt +0 -0
  120. {ui → pycharter/ui}/static/contracts/index.html +0 -0
  121. {ui → pycharter/ui}/static/contracts/index.txt +0 -0
  122. {ui → pycharter/ui}/static/documentation/__next._full.txt +0 -0
  123. {ui → pycharter/ui}/static/documentation/__next._head.txt +0 -0
  124. {ui → pycharter/ui}/static/documentation/__next._index.txt +0 -0
  125. {ui → pycharter/ui}/static/documentation/__next._tree.txt +0 -0
  126. {ui → pycharter/ui}/static/documentation/__next.documentation.__PAGE__.txt +0 -0
  127. {ui → pycharter/ui}/static/documentation/__next.documentation.txt +0 -0
  128. {ui → pycharter/ui}/static/documentation/index.html +0 -0
  129. {ui → pycharter/ui}/static/documentation/index.txt +0 -0
  130. {ui → pycharter/ui}/static/index.html +0 -0
  131. {ui → pycharter/ui}/static/index.txt +0 -0
  132. {ui → pycharter/ui}/static/metadata/__next._full.txt +0 -0
  133. {ui → pycharter/ui}/static/metadata/__next._head.txt +0 -0
  134. {ui → pycharter/ui}/static/metadata/__next._index.txt +0 -0
  135. {ui → pycharter/ui}/static/metadata/__next._tree.txt +0 -0
  136. {ui → pycharter/ui}/static/metadata/__next.metadata.__PAGE__.txt +0 -0
  137. {ui → pycharter/ui}/static/metadata/__next.metadata.txt +0 -0
  138. {ui → pycharter/ui}/static/metadata/index.html +0 -0
  139. {ui → pycharter/ui}/static/metadata/index.txt +0 -0
  140. {ui → pycharter/ui}/static/quality/__next._full.txt +0 -0
  141. {ui → pycharter/ui}/static/quality/__next._head.txt +0 -0
  142. {ui → pycharter/ui}/static/quality/__next._index.txt +0 -0
  143. {ui → pycharter/ui}/static/quality/__next._tree.txt +0 -0
  144. {ui → pycharter/ui}/static/quality/__next.quality.__PAGE__.txt +0 -0
  145. {ui → pycharter/ui}/static/quality/__next.quality.txt +0 -0
  146. {ui → pycharter/ui}/static/quality/index.html +0 -0
  147. {ui → pycharter/ui}/static/quality/index.txt +0 -0
  148. {ui → pycharter/ui}/static/rules/__next._full.txt +0 -0
  149. {ui → pycharter/ui}/static/rules/__next._head.txt +0 -0
  150. {ui → pycharter/ui}/static/rules/__next._index.txt +0 -0
  151. {ui → pycharter/ui}/static/rules/__next._tree.txt +0 -0
  152. {ui → pycharter/ui}/static/rules/__next.rules.__PAGE__.txt +0 -0
  153. {ui → pycharter/ui}/static/rules/__next.rules.txt +0 -0
  154. {ui → pycharter/ui}/static/rules/index.html +0 -0
  155. {ui → pycharter/ui}/static/rules/index.txt +0 -0
  156. {ui → pycharter/ui}/static/schemas/__next._full.txt +0 -0
  157. {ui → pycharter/ui}/static/schemas/__next._head.txt +0 -0
  158. {ui → pycharter/ui}/static/schemas/__next._index.txt +0 -0
  159. {ui → pycharter/ui}/static/schemas/__next._tree.txt +0 -0
  160. {ui → pycharter/ui}/static/schemas/__next.schemas.__PAGE__.txt +0 -0
  161. {ui → pycharter/ui}/static/schemas/__next.schemas.txt +0 -0
  162. {ui → pycharter/ui}/static/schemas/index.html +0 -0
  163. {ui → pycharter/ui}/static/schemas/index.txt +0 -0
  164. {ui → pycharter/ui}/static/settings/__next._full.txt +0 -0
  165. {ui → pycharter/ui}/static/settings/__next._head.txt +0 -0
  166. {ui → pycharter/ui}/static/settings/__next._index.txt +0 -0
  167. {ui → pycharter/ui}/static/settings/__next._tree.txt +0 -0
  168. {ui → pycharter/ui}/static/settings/__next.settings.__PAGE__.txt +0 -0
  169. {ui → pycharter/ui}/static/settings/__next.settings.txt +0 -0
  170. {ui → pycharter/ui}/static/settings/index.html +0 -0
  171. {ui → pycharter/ui}/static/settings/index.txt +0 -0
  172. {ui → pycharter/ui}/static/static/.gitkeep +0 -0
  173. {ui → pycharter/ui}/static/static/404/index.html +0 -0
  174. {ui → pycharter/ui}/static/static/404.html +0 -0
  175. {ui → pycharter/ui}/static/static/__next.__PAGE__.txt +0 -0
  176. {ui → pycharter/ui}/static/static/__next._full.txt +0 -0
  177. {ui → pycharter/ui}/static/static/__next._head.txt +0 -0
  178. {ui → pycharter/ui}/static/static/__next._index.txt +0 -0
  179. {ui → pycharter/ui}/static/static/__next._tree.txt +0 -0
  180. {ui → pycharter/ui}/static/static/_next/static/0rYA78L88aUyD2Uh38hhX/_buildManifest.js +0 -0
  181. {ui → pycharter/ui}/static/static/_next/static/0rYA78L88aUyD2Uh38hhX/_ssgManifest.js +0 -0
  182. {ui → pycharter/ui}/static/static/_next/static/chunks/13d4a0fbd74c1ee4.js +0 -0
  183. {ui → pycharter/ui}/static/static/_next/static/chunks/222442f6da32302a.js +0 -0
  184. {ui → pycharter/ui}/static/static/_next/static/chunks/247eb132b7f7b574.js +0 -0
  185. {ui → pycharter/ui}/static/static/_next/static/chunks/297d55555b71baba.js +0 -0
  186. {ui → pycharter/ui}/static/static/_next/static/chunks/2ab439ce003cd691.js +0 -0
  187. {ui → pycharter/ui}/static/static/_next/static/chunks/2edb43b48432ac04.js +0 -0
  188. {ui → pycharter/ui}/static/static/_next/static/chunks/414e77373f8ff61c.js +0 -0
  189. {ui → pycharter/ui}/static/static/_next/static/chunks/49ca65abd26ae49e.js +0 -0
  190. {ui → pycharter/ui}/static/static/_next/static/chunks/5e04d10c4a7b58a3.js +0 -0
  191. {ui → pycharter/ui}/static/static/_next/static/chunks/652ad0aa26265c47.js +0 -0
  192. {ui → pycharter/ui}/static/static/_next/static/chunks/75d88a058d8ffaa6.js +0 -0
  193. {ui → pycharter/ui}/static/static/_next/static/chunks/8c89634cf6bad76f.js +0 -0
  194. {ui → pycharter/ui}/static/static/_next/static/chunks/9667e7a3d359eb39.js +0 -0
  195. {ui → pycharter/ui}/static/static/_next/static/chunks/9c23f44fff36548a.js +0 -0
  196. {ui → pycharter/ui}/static/static/_next/static/chunks/a6dad97d9634a72d.js +0 -0
  197. {ui → pycharter/ui}/static/static/_next/static/chunks/b32a0963684b9933.js +0 -0
  198. {ui → pycharter/ui}/static/static/_next/static/chunks/c4fa4f4114b7c352.js +0 -0
  199. {ui → pycharter/ui}/static/static/_next/static/chunks/c69f6cba366bd988.js +0 -0
  200. {ui → pycharter/ui}/static/static/_next/static/chunks/d2363397e1b2bcab.css +0 -0
  201. {ui → pycharter/ui}/static/static/_next/static/chunks/db913959c675cea6.js +0 -0
  202. {ui → pycharter/ui}/static/static/_next/static/chunks/f061a4be97bfc3b3.js +0 -0
  203. {ui → pycharter/ui}/static/static/_next/static/chunks/f2e7afeab1178138.js +0 -0
  204. {ui → pycharter/ui}/static/static/_next/static/chunks/f7d1a90dd75d2572.js +0 -0
  205. {ui → pycharter/ui}/static/static/_next/static/chunks/ff1a16fafef87110.js +0 -0
  206. {ui → pycharter/ui}/static/static/_next/static/chunks/turbopack-ffcb7ab6794027ef.js +0 -0
  207. {ui → pycharter/ui}/static/static/_not-found/__next._full.txt +0 -0
  208. {ui → pycharter/ui}/static/static/_not-found/__next._head.txt +0 -0
  209. {ui → pycharter/ui}/static/static/_not-found/__next._index.txt +0 -0
  210. {ui → pycharter/ui}/static/static/_not-found/__next._not-found.__PAGE__.txt +0 -0
  211. {ui → pycharter/ui}/static/static/_not-found/__next._not-found.txt +0 -0
  212. {ui → pycharter/ui}/static/static/_not-found/__next._tree.txt +0 -0
  213. {ui → pycharter/ui}/static/static/_not-found/index.html +0 -0
  214. {ui → pycharter/ui}/static/static/_not-found/index.txt +0 -0
  215. {ui → pycharter/ui}/static/static/contracts/__next._full.txt +0 -0
  216. {ui → pycharter/ui}/static/static/contracts/__next._head.txt +0 -0
  217. {ui → pycharter/ui}/static/static/contracts/__next._index.txt +0 -0
  218. {ui → pycharter/ui}/static/static/contracts/__next._tree.txt +0 -0
  219. {ui → pycharter/ui}/static/static/contracts/__next.contracts.__PAGE__.txt +0 -0
  220. {ui → pycharter/ui}/static/static/contracts/__next.contracts.txt +0 -0
  221. {ui → pycharter/ui}/static/static/contracts/index.html +0 -0
  222. {ui → pycharter/ui}/static/static/contracts/index.txt +0 -0
  223. {ui → pycharter/ui}/static/static/documentation/__next._full.txt +0 -0
  224. {ui → pycharter/ui}/static/static/documentation/__next._head.txt +0 -0
  225. {ui → pycharter/ui}/static/static/documentation/__next._index.txt +0 -0
  226. {ui → pycharter/ui}/static/static/documentation/__next._tree.txt +0 -0
  227. {ui → pycharter/ui}/static/static/documentation/__next.documentation.__PAGE__.txt +0 -0
  228. {ui → pycharter/ui}/static/static/documentation/__next.documentation.txt +0 -0
  229. {ui → pycharter/ui}/static/static/documentation/index.html +0 -0
  230. {ui → pycharter/ui}/static/static/documentation/index.txt +0 -0
  231. {ui → pycharter/ui}/static/static/index.html +0 -0
  232. {ui → pycharter/ui}/static/static/index.txt +0 -0
  233. {ui → pycharter/ui}/static/static/metadata/__next._full.txt +0 -0
  234. {ui → pycharter/ui}/static/static/metadata/__next._head.txt +0 -0
  235. {ui → pycharter/ui}/static/static/metadata/__next._index.txt +0 -0
  236. {ui → pycharter/ui}/static/static/metadata/__next._tree.txt +0 -0
  237. {ui → pycharter/ui}/static/static/metadata/__next.metadata.__PAGE__.txt +0 -0
  238. {ui → pycharter/ui}/static/static/metadata/__next.metadata.txt +0 -0
  239. {ui → pycharter/ui}/static/static/metadata/index.html +0 -0
  240. {ui → pycharter/ui}/static/static/metadata/index.txt +0 -0
  241. {ui → pycharter/ui}/static/static/quality/__next._full.txt +0 -0
  242. {ui → pycharter/ui}/static/static/quality/__next._head.txt +0 -0
  243. {ui → pycharter/ui}/static/static/quality/__next._index.txt +0 -0
  244. {ui → pycharter/ui}/static/static/quality/__next._tree.txt +0 -0
  245. {ui → pycharter/ui}/static/static/quality/__next.quality.__PAGE__.txt +0 -0
  246. {ui → pycharter/ui}/static/static/quality/__next.quality.txt +0 -0
  247. {ui → pycharter/ui}/static/static/quality/index.html +0 -0
  248. {ui → pycharter/ui}/static/static/quality/index.txt +0 -0
  249. {ui → pycharter/ui}/static/static/rules/__next._full.txt +0 -0
  250. {ui → pycharter/ui}/static/static/rules/__next._head.txt +0 -0
  251. {ui → pycharter/ui}/static/static/rules/__next._index.txt +0 -0
  252. {ui → pycharter/ui}/static/static/rules/__next._tree.txt +0 -0
  253. {ui → pycharter/ui}/static/static/rules/__next.rules.__PAGE__.txt +0 -0
  254. {ui → pycharter/ui}/static/static/rules/__next.rules.txt +0 -0
  255. {ui → pycharter/ui}/static/static/rules/index.html +0 -0
  256. {ui → pycharter/ui}/static/static/rules/index.txt +0 -0
  257. {ui → pycharter/ui}/static/static/schemas/__next._full.txt +0 -0
  258. {ui → pycharter/ui}/static/static/schemas/__next._head.txt +0 -0
  259. {ui → pycharter/ui}/static/static/schemas/__next._index.txt +0 -0
  260. {ui → pycharter/ui}/static/static/schemas/__next._tree.txt +0 -0
  261. {ui → pycharter/ui}/static/static/schemas/__next.schemas.__PAGE__.txt +0 -0
  262. {ui → pycharter/ui}/static/static/schemas/__next.schemas.txt +0 -0
  263. {ui → pycharter/ui}/static/static/schemas/index.html +0 -0
  264. {ui → pycharter/ui}/static/static/schemas/index.txt +0 -0
  265. {ui → pycharter/ui}/static/static/settings/__next._full.txt +0 -0
  266. {ui → pycharter/ui}/static/static/settings/__next._head.txt +0 -0
  267. {ui → pycharter/ui}/static/static/settings/__next._index.txt +0 -0
  268. {ui → pycharter/ui}/static/static/settings/__next._tree.txt +0 -0
  269. {ui → pycharter/ui}/static/static/settings/__next.settings.__PAGE__.txt +0 -0
  270. {ui → pycharter/ui}/static/static/settings/__next.settings.txt +0 -0
  271. {ui → pycharter/ui}/static/static/settings/index.html +0 -0
  272. {ui → pycharter/ui}/static/static/settings/index.txt +0 -0
  273. {ui → pycharter/ui}/static/static/static/.gitkeep +0 -0
  274. {ui → pycharter/ui}/static/static/static/404/index.html +0 -0
  275. {ui → pycharter/ui}/static/static/static/404.html +0 -0
  276. {ui → pycharter/ui}/static/static/static/__next.__PAGE__.txt +0 -0
  277. {ui → pycharter/ui}/static/static/static/__next._full.txt +0 -0
  278. {ui → pycharter/ui}/static/static/static/__next._head.txt +0 -0
  279. {ui → pycharter/ui}/static/static/static/__next._index.txt +0 -0
  280. {ui → pycharter/ui}/static/static/static/__next._tree.txt +0 -0
  281. {ui → pycharter/ui}/static/static/static/_next/static/chunks/222442f6da32302a.js +0 -0
  282. {ui → pycharter/ui}/static/static/static/_next/static/chunks/247eb132b7f7b574.js +0 -0
  283. {ui → pycharter/ui}/static/static/static/_next/static/chunks/297d55555b71baba.js +0 -0
  284. {ui → pycharter/ui}/static/static/static/_next/static/chunks/2ab439ce003cd691.js +0 -0
  285. {ui → pycharter/ui}/static/static/static/_next/static/chunks/414e77373f8ff61c.js +0 -0
  286. {ui → pycharter/ui}/static/static/static/_next/static/chunks/49ca65abd26ae49e.js +0 -0
  287. {ui → pycharter/ui}/static/static/static/_next/static/chunks/4e310fe5005770a3.css +0 -0
  288. {ui → pycharter/ui}/static/static/static/_next/static/chunks/5e04d10c4a7b58a3.js +0 -0
  289. {ui → pycharter/ui}/static/static/static/_next/static/chunks/5fc14c00a2779dc5.js +0 -0
  290. {ui → pycharter/ui}/static/static/static/_next/static/chunks/652ad0aa26265c47.js +0 -0
  291. {ui → pycharter/ui}/static/static/static/_next/static/chunks/75d88a058d8ffaa6.js +0 -0
  292. {ui → pycharter/ui}/static/static/static/_next/static/chunks/8c89634cf6bad76f.js +0 -0
  293. {ui → pycharter/ui}/static/static/static/_next/static/chunks/9667e7a3d359eb39.js +0 -0
  294. {ui → pycharter/ui}/static/static/static/_next/static/chunks/9c23f44fff36548a.js +0 -0
  295. {ui → pycharter/ui}/static/static/static/_next/static/chunks/a6dad97d9634a72d.js +0 -0
  296. {ui → pycharter/ui}/static/static/static/_next/static/chunks/b32a0963684b9933.js +0 -0
  297. {ui → pycharter/ui}/static/static/static/_next/static/chunks/b584574fdc8ab13e.js +0 -0
  298. {ui → pycharter/ui}/static/static/static/_next/static/chunks/c69f6cba366bd988.js +0 -0
  299. {ui → pycharter/ui}/static/static/static/_next/static/chunks/d5989c94d3614b3a.js +0 -0
  300. {ui → pycharter/ui}/static/static/static/_next/static/chunks/db913959c675cea6.js +0 -0
  301. {ui → pycharter/ui}/static/static/static/_next/static/chunks/f061a4be97bfc3b3.js +0 -0
  302. {ui → pycharter/ui}/static/static/static/_next/static/chunks/f2e7afeab1178138.js +0 -0
  303. {ui → pycharter/ui}/static/static/static/_next/static/chunks/ff1a16fafef87110.js +0 -0
  304. {ui → pycharter/ui}/static/static/static/_next/static/chunks/turbopack-ffcb7ab6794027ef.js +0 -0
  305. {ui → pycharter/ui}/static/static/static/_next/static/tNTkVW6puVXC4bAm4WrHl/_buildManifest.js +0 -0
  306. {ui → pycharter/ui}/static/static/static/_next/static/tNTkVW6puVXC4bAm4WrHl/_ssgManifest.js +0 -0
  307. {ui → pycharter/ui}/static/static/static/_not-found/__next._full.txt +0 -0
  308. {ui → pycharter/ui}/static/static/static/_not-found/__next._head.txt +0 -0
  309. {ui → pycharter/ui}/static/static/static/_not-found/__next._index.txt +0 -0
  310. {ui → pycharter/ui}/static/static/static/_not-found/__next._not-found.__PAGE__.txt +0 -0
  311. {ui → pycharter/ui}/static/static/static/_not-found/__next._not-found.txt +0 -0
  312. {ui → pycharter/ui}/static/static/static/_not-found/__next._tree.txt +0 -0
  313. {ui → pycharter/ui}/static/static/static/_not-found/index.html +0 -0
  314. {ui → pycharter/ui}/static/static/static/_not-found/index.txt +0 -0
  315. {ui → pycharter/ui}/static/static/static/contracts/__next._full.txt +0 -0
  316. {ui → pycharter/ui}/static/static/static/contracts/__next._head.txt +0 -0
  317. {ui → pycharter/ui}/static/static/static/contracts/__next._index.txt +0 -0
  318. {ui → pycharter/ui}/static/static/static/contracts/__next._tree.txt +0 -0
  319. {ui → pycharter/ui}/static/static/static/contracts/__next.contracts.__PAGE__.txt +0 -0
  320. {ui → pycharter/ui}/static/static/static/contracts/__next.contracts.txt +0 -0
  321. {ui → pycharter/ui}/static/static/static/contracts/index.html +0 -0
  322. {ui → pycharter/ui}/static/static/static/contracts/index.txt +0 -0
  323. {ui → pycharter/ui}/static/static/static/documentation/__next._full.txt +0 -0
  324. {ui → pycharter/ui}/static/static/static/documentation/__next._head.txt +0 -0
  325. {ui → pycharter/ui}/static/static/static/documentation/__next._index.txt +0 -0
  326. {ui → pycharter/ui}/static/static/static/documentation/__next._tree.txt +0 -0
  327. {ui → pycharter/ui}/static/static/static/documentation/__next.documentation.__PAGE__.txt +0 -0
  328. {ui → pycharter/ui}/static/static/static/documentation/__next.documentation.txt +0 -0
  329. {ui → pycharter/ui}/static/static/static/documentation/index.html +0 -0
  330. {ui → pycharter/ui}/static/static/static/documentation/index.txt +0 -0
  331. {ui → pycharter/ui}/static/static/static/index.html +0 -0
  332. {ui → pycharter/ui}/static/static/static/index.txt +0 -0
  333. {ui → pycharter/ui}/static/static/static/metadata/__next._full.txt +0 -0
  334. {ui → pycharter/ui}/static/static/static/metadata/__next._head.txt +0 -0
  335. {ui → pycharter/ui}/static/static/static/metadata/__next._index.txt +0 -0
  336. {ui → pycharter/ui}/static/static/static/metadata/__next._tree.txt +0 -0
  337. {ui → pycharter/ui}/static/static/static/metadata/__next.metadata.__PAGE__.txt +0 -0
  338. {ui → pycharter/ui}/static/static/static/metadata/__next.metadata.txt +0 -0
  339. {ui → pycharter/ui}/static/static/static/metadata/index.html +0 -0
  340. {ui → pycharter/ui}/static/static/static/metadata/index.txt +0 -0
  341. {ui → pycharter/ui}/static/static/static/quality/__next._full.txt +0 -0
  342. {ui → pycharter/ui}/static/static/static/quality/__next._head.txt +0 -0
  343. {ui → pycharter/ui}/static/static/static/quality/__next._index.txt +0 -0
  344. {ui → pycharter/ui}/static/static/static/quality/__next._tree.txt +0 -0
  345. {ui → pycharter/ui}/static/static/static/quality/__next.quality.__PAGE__.txt +0 -0
  346. {ui → pycharter/ui}/static/static/static/quality/__next.quality.txt +0 -0
  347. {ui → pycharter/ui}/static/static/static/quality/index.html +0 -0
  348. {ui → pycharter/ui}/static/static/static/quality/index.txt +0 -0
  349. {ui → pycharter/ui}/static/static/static/rules/__next._full.txt +0 -0
  350. {ui → pycharter/ui}/static/static/static/rules/__next._head.txt +0 -0
  351. {ui → pycharter/ui}/static/static/static/rules/__next._index.txt +0 -0
  352. {ui → pycharter/ui}/static/static/static/rules/__next._tree.txt +0 -0
  353. {ui → pycharter/ui}/static/static/static/rules/__next.rules.__PAGE__.txt +0 -0
  354. {ui → pycharter/ui}/static/static/static/rules/__next.rules.txt +0 -0
  355. {ui → pycharter/ui}/static/static/static/rules/index.html +0 -0
  356. {ui → pycharter/ui}/static/static/static/rules/index.txt +0 -0
  357. {ui → pycharter/ui}/static/static/static/schemas/__next._full.txt +0 -0
  358. {ui → pycharter/ui}/static/static/static/schemas/__next._head.txt +0 -0
  359. {ui → pycharter/ui}/static/static/static/schemas/__next._index.txt +0 -0
  360. {ui → pycharter/ui}/static/static/static/schemas/__next._tree.txt +0 -0
  361. {ui → pycharter/ui}/static/static/static/schemas/__next.schemas.__PAGE__.txt +0 -0
  362. {ui → pycharter/ui}/static/static/static/schemas/__next.schemas.txt +0 -0
  363. {ui → pycharter/ui}/static/static/static/schemas/index.html +0 -0
  364. {ui → pycharter/ui}/static/static/static/schemas/index.txt +0 -0
  365. {ui → pycharter/ui}/static/static/static/settings/__next._full.txt +0 -0
  366. {ui → pycharter/ui}/static/static/static/settings/__next._head.txt +0 -0
  367. {ui → pycharter/ui}/static/static/static/settings/__next._index.txt +0 -0
  368. {ui → pycharter/ui}/static/static/static/settings/__next._tree.txt +0 -0
  369. {ui → pycharter/ui}/static/static/static/settings/__next.settings.__PAGE__.txt +0 -0
  370. {ui → pycharter/ui}/static/static/static/settings/__next.settings.txt +0 -0
  371. {ui → pycharter/ui}/static/static/static/settings/index.html +0 -0
  372. {ui → pycharter/ui}/static/static/static/settings/index.txt +0 -0
  373. {ui → pycharter/ui}/static/static/static/validation/__next._full.txt +0 -0
  374. {ui → pycharter/ui}/static/static/static/validation/__next._head.txt +0 -0
  375. {ui → pycharter/ui}/static/static/static/validation/__next._index.txt +0 -0
  376. {ui → pycharter/ui}/static/static/static/validation/__next._tree.txt +0 -0
  377. {ui → pycharter/ui}/static/static/static/validation/__next.validation.__PAGE__.txt +0 -0
  378. {ui → pycharter/ui}/static/static/static/validation/__next.validation.txt +0 -0
  379. {ui → pycharter/ui}/static/static/static/validation/index.html +0 -0
  380. {ui → pycharter/ui}/static/static/static/validation/index.txt +0 -0
  381. {ui → pycharter/ui}/static/static/validation/__next._full.txt +0 -0
  382. {ui → pycharter/ui}/static/static/validation/__next._head.txt +0 -0
  383. {ui → pycharter/ui}/static/static/validation/__next._index.txt +0 -0
  384. {ui → pycharter/ui}/static/static/validation/__next._tree.txt +0 -0
  385. {ui → pycharter/ui}/static/static/validation/__next.validation.__PAGE__.txt +0 -0
  386. {ui → pycharter/ui}/static/static/validation/__next.validation.txt +0 -0
  387. {ui → pycharter/ui}/static/static/validation/index.html +0 -0
  388. {ui → pycharter/ui}/static/static/validation/index.txt +0 -0
  389. {ui → pycharter/ui}/static/validation/__next._full.txt +0 -0
  390. {ui → pycharter/ui}/static/validation/__next._head.txt +0 -0
  391. {ui → pycharter/ui}/static/validation/__next._index.txt +0 -0
  392. {ui → pycharter/ui}/static/validation/__next._tree.txt +0 -0
  393. {ui → pycharter/ui}/static/validation/__next.validation.__PAGE__.txt +0 -0
  394. {ui → pycharter/ui}/static/validation/__next.validation.txt +0 -0
  395. {ui → pycharter/ui}/static/validation/index.html +0 -0
  396. {ui → pycharter/ui}/static/validation/index.txt +0 -0
  397. {worker → pycharter/worker}/__init__.py +0 -0
  398. {worker → pycharter/worker}/models.py +0 -0
  399. {pycharter-0.0.24.dist-info → pycharter-0.0.25.dist-info}/WHEEL +0 -0
  400. {pycharter-0.0.24.dist-info → pycharter-0.0.25.dist-info}/entry_points.txt +0 -0
  401. {pycharter-0.0.24.dist-info → pycharter-0.0.25.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,340 @@
1
+ # PyCharter API
2
+
3
+ REST API wrapper for PyCharter services using FastAPI.
4
+
5
+ ## Overview
6
+
7
+ The PyCharter API is located at the root level of the repository (`api/`) and provides HTTP endpoints for all core PyCharter services:
8
+ - **Contract Parsing**: Parse data contract files into components
9
+ - **Contract Building**: Reconstruct contracts from metadata store
10
+ - **Metadata Storage**: Store and retrieve schemas, metadata, and rules
11
+ - **Schema Generation**: Generate Pydantic models from JSON Schemas
12
+ - **Schema Conversion**: Convert Pydantic models to JSON Schemas
13
+ - **Runtime Validation**: Validate data against schemas
14
+ - **Quality Assurance**: Run quality checks, query metrics and violations
15
+
16
+ ## Installation
17
+
18
+ Install PyCharter with API dependencies:
19
+
20
+ ```bash
21
+ pip install pycharter[api]
22
+ ```
23
+
24
+ ## Running the API Server
25
+
26
+ ### Using the CLI command:
27
+
28
+ ```bash
29
+ pycharter api
30
+ ```
31
+
32
+ ### Using uvicorn directly:
33
+
34
+ ```bash
35
+ uvicorn api.main:app --reload
36
+ ```
37
+
38
+ ### Using Python:
39
+
40
+ ```python
41
+ from api.main import main
42
+ main()
43
+ ```
44
+
45
+ ## Configuration
46
+
47
+ The API requires a database connection for most endpoints. Configure it using environment variables:
48
+
49
+ ### Database URL Configuration
50
+
51
+ The API uses `PYCHARTER_DATABASE_URL` environment variable to connect to the database. You can set it in several ways:
52
+
53
+ #### Method 1: Export in Shell (Recommended)
54
+
55
+ ```bash
56
+ # Set the environment variable
57
+ export PYCHARTER_DATABASE_URL="postgresql://user:password@localhost:5432/pycharter"
58
+
59
+ # Then run the API
60
+ pycharter api
61
+ ```
62
+
63
+ #### Method 2: Inline with Command
64
+
65
+ ```bash
66
+ # Set and run in one line
67
+ PYCHARTER_DATABASE_URL="postgresql://user:password@localhost:5432/pycharter" pycharter api
68
+ ```
69
+
70
+ #### Method 3: Add to Shell Profile (Persistent)
71
+
72
+ Add to your `~/.bashrc`, `~/.zshrc`, or `~/.profile`:
73
+
74
+ ```bash
75
+ export PYCHARTER_DATABASE_URL="postgresql://user:password@localhost:5432/pycharter"
76
+ ```
77
+
78
+ Then reload your shell:
79
+ ```bash
80
+ source ~/.bashrc # or source ~/.zshrc
81
+ ```
82
+
83
+ #### Method 4: Using a .env File
84
+
85
+ Create a `.env` file in your project root:
86
+
87
+ ```bash
88
+ PYCHARTER_DATABASE_URL=postgresql://user:password@localhost:5432/pycharter
89
+ ```
90
+
91
+ Then load it before running (requires `python-dotenv`):
92
+ ```bash
93
+ export $(cat .env | xargs)
94
+ pycharter api
95
+ ```
96
+
97
+ Or use `dotenv-cli`:
98
+ ```bash
99
+ pip install dotenv-cli
100
+ dotenv run pycharter api
101
+ ```
102
+
103
+ ### Alternative Environment Variable
104
+
105
+ PyCharter also supports Airflow-style configuration:
106
+
107
+ ```bash
108
+ export PYCHARTER__DATABASE__SQL_ALCHEMY_CONN="postgresql://user:password@localhost:5432/pycharter"
109
+ ```
110
+
111
+ ### Metadata Store Configuration
112
+
113
+ The API can be configured to use different metadata store backends:
114
+
115
+ ```bash
116
+ # Metadata store type (in_memory, postgres, mongodb, redis)
117
+ export PYCHARTER_API_STORE_TYPE=postgres
118
+
119
+ # Connection string for database-backed stores
120
+ export PYCHARTER_API_CONNECTION_STRING=postgresql://user:pass@localhost:5432/pycharter
121
+ ```
122
+
123
+ **Note**: If `PYCHARTER_DATABASE_URL` is set, it will be used for both the database connection and metadata store (for PostgreSQL).
124
+
125
+ ## API Endpoints
126
+
127
+ ### Contract Endpoints
128
+
129
+ #### `POST /api/v1/contracts/parse`
130
+ Parse a data contract dictionary into components.
131
+
132
+ **Request Body:**
133
+ ```json
134
+ {
135
+ "contract": {
136
+ "schema": {...},
137
+ "metadata": {...},
138
+ "ownership": {...},
139
+ "governance_rules": {...}
140
+ }
141
+ }
142
+ ```
143
+
144
+ **Response:**
145
+ ```json
146
+ {
147
+ "schema": {...},
148
+ "metadata": {...},
149
+ "ownership": {...},
150
+ "governance_rules": {...},
151
+ "coercion_rules": {...},
152
+ "validation_rules": {...},
153
+ "versions": {...}
154
+ }
155
+ ```
156
+
157
+ #### `POST /api/v1/contracts/build`
158
+ Build a complete contract from metadata store.
159
+
160
+ **Request Body:**
161
+ ```json
162
+ {
163
+ "schema_id": "user_schema",
164
+ "version": "1.0.0",
165
+ "include_metadata": true,
166
+ "include_ownership": true,
167
+ "include_governance": true
168
+ }
169
+ ```
170
+
171
+ #### `GET /api/v1/contracts`
172
+ List all data contracts stored in the database.
173
+
174
+ #### `GET /api/v1/contracts/{contract_id}`
175
+ Get a specific data contract by ID.
176
+
177
+ ### Metadata Endpoints
178
+
179
+ #### `GET /api/v1/metadata/schemas`
180
+ List all schemas stored in the metadata store.
181
+
182
+ #### `GET /api/v1/metadata/schemas/{schema_id}`
183
+ Get a schema by ID (optional version parameter).
184
+
185
+ #### `GET /api/v1/metadata/schemas/{schema_id}/complete`
186
+ Get complete schema with coercion and validation rules merged.
187
+
188
+ #### `POST /api/v1/metadata/schemas`
189
+ Store a schema in the metadata store.
190
+
191
+ #### `GET /api/v1/metadata/metadata/{schema_id}`
192
+ Get metadata for a schema (optional version parameter).
193
+
194
+ #### `POST /api/v1/metadata/metadata`
195
+ Store metadata for a schema.
196
+
197
+ #### `GET /api/v1/metadata/coercion-rules/{schema_id}`
198
+ Get coercion rules for a schema (optional version parameter).
199
+
200
+ #### `POST /api/v1/metadata/coercion-rules`
201
+ Store coercion rules for a schema.
202
+
203
+ #### `GET /api/v1/metadata/validation-rules/{schema_id}`
204
+ Get validation rules for a schema (optional version parameter).
205
+
206
+ #### `POST /api/v1/metadata/validation-rules`
207
+ Store validation rules for a schema.
208
+
209
+ ### Quality Assurance Endpoints
210
+
211
+ #### `GET /api/v1/quality/metrics`
212
+ List quality metrics (optional filtering by schema_id, pagination).
213
+
214
+ #### `GET /api/v1/quality/metrics/{metric_id}`
215
+ Get a specific quality metric by ID.
216
+
217
+ #### `GET /api/v1/quality/reports/{schema_id}`
218
+ Get quality reports for a schema/data feed (optional data_source filter).
219
+
220
+ #### `POST /api/v1/quality/check`
221
+ Run a quality check against a data contract.
222
+
223
+ #### `POST /api/v1/quality/violations`
224
+ Query data quality violations.
225
+
226
+ ### Schema Endpoints
227
+
228
+ #### `POST /api/v1/schemas/generate`
229
+ Generate Pydantic model from JSON Schema.
230
+
231
+ #### `POST /api/v1/schemas/convert`
232
+ Convert Pydantic model to JSON Schema.
233
+
234
+ ### Validation Endpoints
235
+
236
+ #### `POST /api/v1/validation/validate`
237
+ Validate a single record against a schema.
238
+
239
+ #### `POST /api/v1/validation/validate-batch`
240
+ Validate a batch of records against a schema.
241
+
242
+ ## API Documentation
243
+
244
+ Once the API server is running, you can access:
245
+
246
+ - **Swagger UI**: http://localhost:8000/docs
247
+ - **ReDoc**: http://localhost:8000/redoc
248
+ - **OpenAPI JSON**: http://localhost:8000/openapi.json
249
+
250
+ ## Example Usage
251
+
252
+ ### Using curl:
253
+
254
+ ```bash
255
+ # List all contracts
256
+ curl http://localhost:8000/api/v1/contracts
257
+
258
+ # Get a specific contract
259
+ curl http://localhost:8000/api/v1/contracts/{contract_id}
260
+
261
+ # List all schemas
262
+ curl http://localhost:8000/api/v1/metadata/schemas
263
+
264
+ # Get a schema
265
+ curl http://localhost:8000/api/v1/metadata/schemas/{schema_id}
266
+
267
+ # Get quality metrics
268
+ curl http://localhost:8000/api/v1/quality/metrics
269
+
270
+ # Get quality report for a schema
271
+ curl http://localhost:8000/api/v1/quality/reports/{schema_id}
272
+ ```
273
+
274
+ ### Using Python requests:
275
+
276
+ ```python
277
+ import requests
278
+
279
+ # List contracts
280
+ response = requests.get("http://localhost:8000/api/v1/contracts")
281
+ contracts = response.json()
282
+
283
+ # Get quality metrics
284
+ response = requests.get("http://localhost:8000/api/v1/quality/metrics")
285
+ metrics = response.json()
286
+ ```
287
+
288
+ ## Troubleshooting
289
+
290
+ ### Database Connection Issues
291
+
292
+ If you see errors about database URL not being configured:
293
+
294
+ 1. **Check environment variable is set:**
295
+ ```bash
296
+ echo $PYCHARTER_DATABASE_URL
297
+ ```
298
+
299
+ 2. **Verify database is accessible:**
300
+ ```bash
301
+ psql $PYCHARTER_DATABASE_URL -c "SELECT 1;"
302
+ ```
303
+
304
+ 3. **Ensure database is initialized:**
305
+ ```bash
306
+ pycharter db init $PYCHARTER_DATABASE_URL
307
+ ```
308
+
309
+ ### API Not Starting
310
+
311
+ If the API fails to start:
312
+
313
+ 1. **Check if uvicorn is installed:**
314
+ ```bash
315
+ pip install pycharter[api]
316
+ ```
317
+
318
+ 2. **Check for port conflicts:**
319
+ ```bash
320
+ # Use a different port
321
+ pycharter api --port 8001
322
+ ```
323
+
324
+ 3. **Check logs for errors:**
325
+ The API will print error messages to stderr if there are configuration issues.
326
+
327
+ ## Production Deployment
328
+
329
+ For production, consider:
330
+
331
+ 1. **Use a process manager** (systemd, supervisor, etc.)
332
+ 2. **Set environment variables** in your deployment configuration
333
+ 3. **Use a reverse proxy** (nginx, traefik) in front of the API
334
+ 4. **Enable HTTPS** for secure connections
335
+ 5. **Configure CORS** appropriately in `api/main.py`
336
+ 6. **Use a production ASGI server** like Gunicorn with Uvicorn workers:
337
+
338
+ ```bash
339
+ gunicorn api.main:app -w 4 -k uvicorn.workers.UvicornWorker
340
+ ```
@@ -17,7 +17,7 @@ __version__ = "0.0.3"
17
17
 
18
18
  # Check if FastAPI is available
19
19
  try:
20
- from api.main import app, create_application
20
+ from pycharter.api.main import app, create_application
21
21
  __all__ = ["app", "create_application"]
22
22
  except (ImportError, ModuleNotFoundError):
23
23
  # FastAPI not installed or api module not available
@@ -4,7 +4,7 @@ Dependencies for API routes.
4
4
  This module provides FastAPI dependency injection for shared resources.
5
5
  """
6
6
 
7
- from api.dependencies.database import get_db_session
8
- from api.dependencies.store import get_metadata_store
7
+ from pycharter.api.dependencies.database import get_db_session
8
+ from pycharter.api.dependencies.store import get_metadata_store
9
9
 
10
10
  __all__ = ["get_db_session", "get_metadata_store"]
@@ -16,7 +16,7 @@ from fastapi.routing import APIRoute
16
16
  from pycharter import __version__ as pycharter_version
17
17
 
18
18
  # Import routers from v1
19
- from api.routes.v1 import (
19
+ from pycharter.api.routes.v1 import (
20
20
  contracts,
21
21
  metadata,
22
22
  quality,
@@ -296,7 +296,7 @@ def main():
296
296
  import uvicorn
297
297
 
298
298
  uvicorn.run(
299
- "api.main:app",
299
+ "pycharter.api.main:app",
300
300
  host="0.0.0.0",
301
301
  port=8000,
302
302
  reload=True, # Set to False in production
@@ -4,13 +4,13 @@ API request and response models.
4
4
  This module contains Pydantic models for API request/response validation.
5
5
  """
6
6
 
7
- from api.models.contracts import (
7
+ from pycharter.api.models.contracts import (
8
8
  ContractParseRequest,
9
9
  ContractParseResponse,
10
10
  ContractBuildRequest,
11
11
  ContractBuildResponse,
12
12
  )
13
- from api.models.metadata import (
13
+ from pycharter.api.models.metadata import (
14
14
  MetadataStoreRequest,
15
15
  MetadataStoreResponse,
16
16
  MetadataGetRequest,
@@ -20,13 +20,13 @@ from api.models.metadata import (
20
20
  SchemaGetRequest,
21
21
  SchemaGetResponse,
22
22
  )
23
- from api.models.schemas import (
23
+ from pycharter.api.models.schemas import (
24
24
  SchemaGenerateRequest,
25
25
  SchemaGenerateResponse,
26
26
  SchemaConvertRequest,
27
27
  SchemaConvertResponse,
28
28
  )
29
- from api.models.validation import (
29
+ from pycharter.api.models.validation import (
30
30
  ValidationRequest,
31
31
  ValidationResponse,
32
32
  ValidationBatchRequest,
@@ -6,7 +6,7 @@ All routers defined here are automatically included in the main application
6
6
  with the `/api/v1` prefix.
7
7
  """
8
8
 
9
- from api.routes.v1 import (
9
+ from pycharter.api.routes.v1 import (
10
10
  contracts,
11
11
  metadata,
12
12
  quality,
@@ -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
 
@@ -10,7 +10,7 @@ from typing import Optional
10
10
 
11
11
  from fastapi import APIRouter, HTTPException, Query
12
12
 
13
- from api.models.tracking import (
13
+ from pycharter.api.models.tracking import (
14
14
  ExportFormat,
15
15
  ExportResponse,
16
16
  MetricsQueryResponse,
@@ -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 (for pip installs)
411
+ # Check installed package location first (src layout: __file__ parent is package dir)
412
412
  try:
413
413
  import pycharter
414
- pycharter_path = Path(pycharter.__file__).parent.parent
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.parent.parent
423
- / "ui", # From pycharter/cli.py -> pycharter -> project root -> ui
424
- Path.cwd() / "ui", # Current working directory
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.",