@datarecce/ui 0.1.30 → 0.1.31

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 (549) hide show
  1. package/dist/api.d.mts +1 -1
  2. package/dist/api.d.ts +1 -1
  3. package/dist/components.d.mts +1 -1
  4. package/dist/components.d.ts +1 -1
  5. package/dist/hooks.d.mts +1 -1
  6. package/dist/hooks.d.ts +1 -1
  7. package/dist/{index-BNUP2V_N.d.ts → index-B9lSPJTi.d.ts} +184 -2
  8. package/dist/index-B9lSPJTi.d.ts.map +1 -0
  9. package/dist/{index-DOPZuhD8.d.mts → index-IIXVIoOL.d.mts} +253 -71
  10. package/dist/index-IIXVIoOL.d.mts.map +1 -0
  11. package/dist/index.d.mts +2 -2
  12. package/dist/index.d.ts +2 -2
  13. package/dist/index.js +8 -1
  14. package/dist/index.js.map +1 -1
  15. package/dist/index.mjs +3 -2
  16. package/dist/index.mjs.map +1 -1
  17. package/dist/styles.css +4 -0
  18. package/dist/theme.d.mts +2 -185
  19. package/dist/theme.d.ts +2 -185
  20. package/dist/types.d.mts +1 -1
  21. package/dist/types.d.ts +1 -1
  22. package/package.json +4 -2
  23. package/recce-source/.editorconfig +26 -0
  24. package/recce-source/.flake8 +37 -0
  25. package/recce-source/.github/ISSUE_TEMPLATE/bug_report.yml +67 -0
  26. package/recce-source/.github/ISSUE_TEMPLATE/custom.md +10 -0
  27. package/recce-source/.github/ISSUE_TEMPLATE/feature_request.yml +42 -0
  28. package/recce-source/.github/PULL_REQUEST_TEMPLATE.md +21 -0
  29. package/recce-source/.github/copilot-instructions.md +331 -0
  30. package/recce-source/.github/instructions/backend-instructions.md +541 -0
  31. package/recce-source/.github/instructions/frontend-instructions.md +317 -0
  32. package/recce-source/.github/workflows/build-statics.yaml +72 -0
  33. package/recce-source/.github/workflows/bump.yaml +48 -0
  34. package/recce-source/.github/workflows/integration-tests-cloud.yaml +92 -0
  35. package/recce-source/.github/workflows/integration-tests-sqlmesh.yaml +33 -0
  36. package/recce-source/.github/workflows/integration-tests.yaml +52 -0
  37. package/recce-source/.github/workflows/nightly.yaml +246 -0
  38. package/recce-source/.github/workflows/release.yaml +196 -0
  39. package/recce-source/.github/workflows/tests-js.yaml +58 -0
  40. package/recce-source/.github/workflows/tests-python.yaml +128 -0
  41. package/recce-source/.pre-commit-config.yaml +26 -0
  42. package/recce-source/CLAUDE.md +483 -0
  43. package/recce-source/CODE_OF_CONDUCT.md +128 -0
  44. package/recce-source/CONTRIBUTING.md +107 -0
  45. package/recce-source/LICENSE +201 -0
  46. package/recce-source/Makefile +126 -0
  47. package/recce-source/README.md +182 -0
  48. package/recce-source/RECCE_CLOUD.md +81 -0
  49. package/recce-source/SECURITY.md +25 -0
  50. package/recce-source/docs/PACKAGING.md +340 -0
  51. package/recce-source/docs/README.md +1 -0
  52. package/recce-source/integration_tests/dbt/dbt_project.yml +26 -0
  53. package/recce-source/integration_tests/dbt/models/customers.sql +69 -0
  54. package/recce-source/integration_tests/dbt/models/docs.md +14 -0
  55. package/recce-source/integration_tests/dbt/models/orders.sql +56 -0
  56. package/recce-source/integration_tests/dbt/models/schema.yml +82 -0
  57. package/recce-source/integration_tests/dbt/models/staging/schema.yml +31 -0
  58. package/recce-source/integration_tests/dbt/models/staging/stg_customers.sql +22 -0
  59. package/recce-source/integration_tests/dbt/models/staging/stg_orders.sql +23 -0
  60. package/recce-source/integration_tests/dbt/models/staging/stg_payments.sql +25 -0
  61. package/recce-source/integration_tests/dbt/packages.yml +7 -0
  62. package/recce-source/integration_tests/dbt/profiles.yml +8 -0
  63. package/recce-source/integration_tests/dbt/seeds/raw_customers.csv +101 -0
  64. package/recce-source/integration_tests/dbt/seeds/raw_orders.csv +100 -0
  65. package/recce-source/integration_tests/dbt/seeds/raw_payments.csv +114 -0
  66. package/recce-source/integration_tests/dbt/seeds/raw_statuses.csv +5 -0
  67. package/recce-source/integration_tests/dbt/smoke_test.sh +72 -0
  68. package/recce-source/integration_tests/dbt/smoke_test_cloud.sh +71 -0
  69. package/recce-source/integration_tests/sqlmesh/__init__.py +0 -0
  70. package/recce-source/integration_tests/sqlmesh/audits/assert_item_price_above_zero.sql +9 -0
  71. package/recce-source/integration_tests/sqlmesh/audits/items.sql +7 -0
  72. package/recce-source/integration_tests/sqlmesh/audits/order_items.sql +7 -0
  73. package/recce-source/integration_tests/sqlmesh/config.py +171 -0
  74. package/recce-source/integration_tests/sqlmesh/helper.py +20 -0
  75. package/recce-source/integration_tests/sqlmesh/hooks/__init__.py +0 -0
  76. package/recce-source/integration_tests/sqlmesh/macros/__init__.py +0 -0
  77. package/recce-source/integration_tests/sqlmesh/macros/macros.py +8 -0
  78. package/recce-source/integration_tests/sqlmesh/macros/macros.sql +8 -0
  79. package/recce-source/integration_tests/sqlmesh/macros/utils.py +11 -0
  80. package/recce-source/integration_tests/sqlmesh/metrics/metrics.sql +25 -0
  81. package/recce-source/integration_tests/sqlmesh/models/customer_revenue_by_day.sql +41 -0
  82. package/recce-source/integration_tests/sqlmesh/models/customer_revenue_lifetime.sql +60 -0
  83. package/recce-source/integration_tests/sqlmesh/models/customers.sql +32 -0
  84. package/recce-source/integration_tests/sqlmesh/models/items.py +95 -0
  85. package/recce-source/integration_tests/sqlmesh/models/marketing.sql +15 -0
  86. package/recce-source/integration_tests/sqlmesh/models/order_items.py +95 -0
  87. package/recce-source/integration_tests/sqlmesh/models/orders.py +70 -0
  88. package/recce-source/integration_tests/sqlmesh/models/raw_marketing.py +62 -0
  89. package/recce-source/integration_tests/sqlmesh/models/top_waiters.sql +23 -0
  90. package/recce-source/integration_tests/sqlmesh/models/waiter_as_customer_by_day.sql +29 -0
  91. package/recce-source/integration_tests/sqlmesh/models/waiter_names.sql +10 -0
  92. package/recce-source/integration_tests/sqlmesh/models/waiter_revenue_by_day.sql +29 -0
  93. package/recce-source/integration_tests/sqlmesh/models/waiters.py +62 -0
  94. package/recce-source/integration_tests/sqlmesh/prep_env.sh +16 -0
  95. package/recce-source/integration_tests/sqlmesh/schema.yaml +5 -0
  96. package/recce-source/integration_tests/sqlmesh/seeds/waiter_names.csv +11 -0
  97. package/recce-source/integration_tests/sqlmesh/test_server.sh +29 -0
  98. package/recce-source/integration_tests/sqlmesh/tests/test_customer_revenue_by_day.yaml +63 -0
  99. package/recce-source/integration_tests/sqlmesh/tests/test_order_items.yaml +72 -0
  100. package/recce-source/js/.editorconfig +27 -0
  101. package/recce-source/js/.env.development +5 -0
  102. package/recce-source/js/.husky/pre-commit +29 -0
  103. package/recce-source/js/.nvmrc +1 -0
  104. package/recce-source/js/README.md +39 -0
  105. package/recce-source/js/app/(mainComponents)/DisplayModeToggle.tsx +65 -0
  106. package/recce-source/js/app/(mainComponents)/NavBar.tsx +228 -0
  107. package/recce-source/js/app/(mainComponents)/RecceVersionBadge.tsx +107 -0
  108. package/recce-source/js/app/(mainComponents)/TopBar.tsx +252 -0
  109. package/recce-source/js/app/@lineage/default.tsx +20 -0
  110. package/recce-source/js/app/@lineage/page.tsx +14 -0
  111. package/recce-source/js/app/MainLayout.tsx +170 -0
  112. package/recce-source/js/app/Providers.tsx +49 -0
  113. package/recce-source/js/app/checks/page.tsx +296 -0
  114. package/recce-source/js/app/error.tsx +93 -0
  115. package/recce-source/js/app/favicon.ico +0 -0
  116. package/recce-source/js/app/global-error.tsx +115 -0
  117. package/recce-source/js/app/global.css +82 -0
  118. package/recce-source/js/app/layout.tsx +48 -0
  119. package/recce-source/js/app/lineage/page.tsx +15 -0
  120. package/recce-source/js/app/page.tsx +12 -0
  121. package/recce-source/js/app/query/page.tsx +8 -0
  122. package/recce-source/js/biome.json +313 -0
  123. package/recce-source/js/jest.config.js +34 -0
  124. package/recce-source/js/jest.globals.d.ts +32 -0
  125. package/recce-source/js/jest.setup.js +91 -0
  126. package/recce-source/js/next.config.js +16 -0
  127. package/recce-source/js/package-lock.json +13843 -0
  128. package/recce-source/js/package.json +123 -0
  129. package/recce-source/js/pnpm-lock.yaml +9235 -0
  130. package/recce-source/js/pnpm-workspace.yaml +6 -0
  131. package/recce-source/js/postcss.config.js +5 -0
  132. package/recce-source/js/public/auth_callback.html +68 -0
  133. package/recce-source/js/public/imgs/feedback/thumbs-down.png +0 -0
  134. package/recce-source/js/public/imgs/feedback/thumbs-up.png +0 -0
  135. package/recce-source/js/public/imgs/reload-image.svg +4 -0
  136. package/recce-source/js/public/logo/recce-logo-white.png +0 -0
  137. package/recce-source/js/src/components/AuthModal/AuthModal.tsx +202 -0
  138. package/recce-source/js/src/components/app/AvatarDropdown.tsx +159 -0
  139. package/recce-source/js/src/components/app/EnvInfo.tsx +357 -0
  140. package/recce-source/js/src/components/app/Filename.tsx +388 -0
  141. package/recce-source/js/src/components/app/SetupConnectionPopover.tsx +91 -0
  142. package/recce-source/js/src/components/app/StateExporter.tsx +57 -0
  143. package/recce-source/js/src/components/app/StateImporter.tsx +198 -0
  144. package/recce-source/js/src/components/app/StateSharing.tsx +145 -0
  145. package/recce-source/js/src/components/app/StateSynchronizer.tsx +205 -0
  146. package/recce-source/js/src/components/charts/HistogramChart.tsx +291 -0
  147. package/recce-source/js/src/components/charts/SquareIcon.tsx +51 -0
  148. package/recce-source/js/src/components/charts/TopKSummaryList.tsx +457 -0
  149. package/recce-source/js/src/components/charts/chartTheme.ts +74 -0
  150. package/recce-source/js/src/components/check/CheckBreadcrumb.tsx +97 -0
  151. package/recce-source/js/src/components/check/CheckDescription.tsx +134 -0
  152. package/recce-source/js/src/components/check/CheckDetail.tsx +797 -0
  153. package/recce-source/js/src/components/check/CheckEmptyState.tsx +84 -0
  154. package/recce-source/js/src/components/check/CheckList.tsx +320 -0
  155. package/recce-source/js/src/components/check/LineageDiffView.tsx +32 -0
  156. package/recce-source/js/src/components/check/PresetCheckTemplateView.tsx +48 -0
  157. package/recce-source/js/src/components/check/SchemaDiffView.tsx +290 -0
  158. package/recce-source/js/src/components/check/check.ts +25 -0
  159. package/recce-source/js/src/components/check/timeline/CheckTimeline.tsx +163 -0
  160. package/recce-source/js/src/components/check/timeline/CommentInput.tsx +84 -0
  161. package/recce-source/js/src/components/check/timeline/TimelineEvent.tsx +468 -0
  162. package/recce-source/js/src/components/check/timeline/index.ts +12 -0
  163. package/recce-source/js/src/components/check/utils.ts +12 -0
  164. package/recce-source/js/src/components/data-grid/ScreenshotDataGrid.tsx +333 -0
  165. package/recce-source/js/src/components/data-grid/agGridStyles.css +55 -0
  166. package/recce-source/js/src/components/data-grid/agGridTheme.ts +43 -0
  167. package/recce-source/js/src/components/editor/CodeEditor.tsx +107 -0
  168. package/recce-source/js/src/components/editor/DiffEditor.tsx +162 -0
  169. package/recce-source/js/src/components/editor/index.ts +12 -0
  170. package/recce-source/js/src/components/errorboundary/ErrorBoundary.tsx +87 -0
  171. package/recce-source/js/src/components/histogram/HistogramDiffForm.tsx +147 -0
  172. package/recce-source/js/src/components/histogram/HistogramDiffResultView.tsx +63 -0
  173. package/recce-source/js/src/components/icons/index.tsx +142 -0
  174. package/recce-source/js/src/components/lineage/ActionControl.tsx +63 -0
  175. package/recce-source/js/src/components/lineage/ActionTag.tsx +141 -0
  176. package/recce-source/js/src/components/lineage/ChangeStatusLegend.tsx +46 -0
  177. package/recce-source/js/src/components/lineage/ColumnLevelLineageControl.tsx +327 -0
  178. package/recce-source/js/src/components/lineage/ColumnLevelLineageLegend.tsx +57 -0
  179. package/recce-source/js/src/components/lineage/GraphColumnNode.tsx +199 -0
  180. package/recce-source/js/src/components/lineage/GraphEdge.tsx +59 -0
  181. package/recce-source/js/src/components/lineage/GraphNode.tsx +555 -0
  182. package/recce-source/js/src/components/lineage/LineagePage.tsx +10 -0
  183. package/recce-source/js/src/components/lineage/LineageView.tsx +1384 -0
  184. package/recce-source/js/src/components/lineage/LineageViewContext.tsx +86 -0
  185. package/recce-source/js/src/components/lineage/LineageViewContextMenu.tsx +637 -0
  186. package/recce-source/js/src/components/lineage/LineageViewNotification.tsx +64 -0
  187. package/recce-source/js/src/components/lineage/LineageViewTopBar.tsx +596 -0
  188. package/recce-source/js/src/components/lineage/NodeSqlView.tsx +136 -0
  189. package/recce-source/js/src/components/lineage/NodeTag.tsx +278 -0
  190. package/recce-source/js/src/components/lineage/NodeView.tsx +642 -0
  191. package/recce-source/js/src/components/lineage/SandboxView.tsx +436 -0
  192. package/recce-source/js/src/components/lineage/ServerDisconnectedModalContent.tsx +105 -0
  193. package/recce-source/js/src/components/lineage/SetupConnectionBanner.tsx +52 -0
  194. package/recce-source/js/src/components/lineage/SingleEnvironmentQueryView.tsx +152 -0
  195. package/recce-source/js/src/components/lineage/graph.test.ts +31 -0
  196. package/recce-source/js/src/components/lineage/graph.ts +58 -0
  197. package/recce-source/js/src/components/lineage/lineage.test.ts +169 -0
  198. package/recce-source/js/src/components/lineage/lineage.ts +521 -0
  199. package/recce-source/js/src/components/lineage/styles.css +42 -0
  200. package/recce-source/js/src/components/lineage/styles.tsx +165 -0
  201. package/recce-source/js/src/components/lineage/useMultiNodesAction.ts +352 -0
  202. package/recce-source/js/src/components/lineage/useValueDiffAlertDialog.tsx +108 -0
  203. package/recce-source/js/src/components/onboarding-guide/Notification.tsx +62 -0
  204. package/recce-source/js/src/components/profile/ProfileDiffForm.tsx +134 -0
  205. package/recce-source/js/src/components/profile/ProfileDiffResultView.tsx +245 -0
  206. package/recce-source/js/src/components/query/ChangedOnlyCheckbox.tsx +29 -0
  207. package/recce-source/js/src/components/query/DiffText.tsx +120 -0
  208. package/recce-source/js/src/components/query/QueryDiffResultView.tsx +470 -0
  209. package/recce-source/js/src/components/query/QueryForm.tsx +80 -0
  210. package/recce-source/js/src/components/query/QueryPage.tsx +282 -0
  211. package/recce-source/js/src/components/query/QueryResultView.tsx +180 -0
  212. package/recce-source/js/src/components/query/SetupConnectionGuide.tsx +57 -0
  213. package/recce-source/js/src/components/query/SqlEditor.tsx +245 -0
  214. package/recce-source/js/src/components/query/ToggleSwitch.tsx +84 -0
  215. package/recce-source/js/src/components/query/styles.css +21 -0
  216. package/recce-source/js/src/components/routing/DirectUrlAccess.test.tsx +428 -0
  217. package/recce-source/js/src/components/routing/LineageStatePreservation.test.tsx +311 -0
  218. package/recce-source/js/src/components/routing/Navigation.test.tsx +256 -0
  219. package/recce-source/js/src/components/rowcount/RowCountDiffResultView.tsx +109 -0
  220. package/recce-source/js/src/components/rowcount/delta.ts +11 -0
  221. package/recce-source/js/src/components/run/RunList.tsx +303 -0
  222. package/recce-source/js/src/components/run/RunModal.tsx +191 -0
  223. package/recce-source/js/src/components/run/RunPage.tsx +26 -0
  224. package/recce-source/js/src/components/run/RunResultPane.tsx +454 -0
  225. package/recce-source/js/src/components/run/RunStatusAndDate.tsx +106 -0
  226. package/recce-source/js/src/components/run/RunToolbar.tsx +70 -0
  227. package/recce-source/js/src/components/run/RunView.tsx +196 -0
  228. package/recce-source/js/src/components/run/registry.ts +214 -0
  229. package/recce-source/js/src/components/run/types.ts +14 -0
  230. package/recce-source/js/src/components/schema/ColumnNameCell.test.tsx +169 -0
  231. package/recce-source/js/src/components/schema/ColumnNameCell.tsx +198 -0
  232. package/recce-source/js/src/components/schema/SchemaView.tsx +337 -0
  233. package/recce-source/js/src/components/schema/schemaDiff.ts +32 -0
  234. package/recce-source/js/src/components/schema/style.css +134 -0
  235. package/recce-source/js/src/components/screenshot/ScreenshotBox.tsx +39 -0
  236. package/recce-source/js/src/components/shared/HistoryToggle.tsx +35 -0
  237. package/recce-source/js/src/components/split/Split.tsx +40 -0
  238. package/recce-source/js/src/components/split/styles.css +24 -0
  239. package/recce-source/js/src/components/summary/ChangeSummary.tsx +264 -0
  240. package/recce-source/js/src/components/summary/SchemaSummary.tsx +123 -0
  241. package/recce-source/js/src/components/summary/SummaryView.tsx +29 -0
  242. package/recce-source/js/src/components/timeout/IdleTimeoutBadge.tsx +48 -0
  243. package/recce-source/js/src/components/top-k/TopKDiffForm.tsx +58 -0
  244. package/recce-source/js/src/components/top-k/TopKDiffResultView.tsx +73 -0
  245. package/recce-source/js/src/components/ui/dataGrid/DataFrameColumnGroupHeader.tsx +228 -0
  246. package/recce-source/js/src/components/ui/dataGrid/DataFrameColumnHeader.tsx +113 -0
  247. package/recce-source/js/src/components/ui/dataGrid/defaultRenderCell.tsx +72 -0
  248. package/recce-source/js/src/components/ui/dataGrid/index.ts +23 -0
  249. package/recce-source/js/src/components/ui/dataGrid/inlineRenderCell.test.tsx +607 -0
  250. package/recce-source/js/src/components/ui/dataGrid/inlineRenderCell.tsx +211 -0
  251. package/recce-source/js/src/components/ui/dataGrid/schemaCells.test.tsx +452 -0
  252. package/recce-source/js/src/components/ui/dataGrid/schemaCells.tsx +142 -0
  253. package/recce-source/js/src/components/ui/dataGrid/valueDiffCells.test.tsx +178 -0
  254. package/recce-source/js/src/components/ui/dataGrid/valueDiffCells.tsx +275 -0
  255. package/recce-source/js/src/components/ui/markdown/ExternalLinkConfirmDialog.tsx +134 -0
  256. package/recce-source/js/src/components/ui/markdown/MarkdownContent.tsx +364 -0
  257. package/recce-source/js/src/components/ui/mui/index.ts +13 -0
  258. package/recce-source/js/src/components/ui/mui-provider.tsx +67 -0
  259. package/recce-source/js/src/components/ui/mui-theme.ts +1039 -0
  260. package/recce-source/js/src/components/ui/mui-utils.ts +113 -0
  261. package/recce-source/js/src/components/ui/toaster.tsx +288 -0
  262. package/recce-source/js/src/components/valuediff/ValueDiffDetailResultView.tsx +217 -0
  263. package/recce-source/js/src/components/valuediff/ValueDiffForm.tsx +246 -0
  264. package/recce-source/js/src/components/valuediff/ValueDiffResultView.tsx +82 -0
  265. package/recce-source/js/src/components/valuediff/shared.ts +33 -0
  266. package/recce-source/js/src/constants/tooltipMessage.ts +3 -0
  267. package/recce-source/js/src/constants/urls.ts +1 -0
  268. package/recce-source/js/src/lib/UrlHash.ts +12 -0
  269. package/recce-source/js/src/lib/api/adhocQuery.ts +70 -0
  270. package/recce-source/js/src/lib/api/axiosClient.ts +9 -0
  271. package/recce-source/js/src/lib/api/cacheKeys.ts +13 -0
  272. package/recce-source/js/src/lib/api/checkEvents.ts +252 -0
  273. package/recce-source/js/src/lib/api/checks.ts +129 -0
  274. package/recce-source/js/src/lib/api/cll.ts +53 -0
  275. package/recce-source/js/src/lib/api/connectToCloud.ts +13 -0
  276. package/recce-source/js/src/lib/api/flag.ts +37 -0
  277. package/recce-source/js/src/lib/api/info.ts +198 -0
  278. package/recce-source/js/src/lib/api/instanceInfo.ts +25 -0
  279. package/recce-source/js/src/lib/api/keepAlive.ts +108 -0
  280. package/recce-source/js/src/lib/api/lineagecheck.ts +35 -0
  281. package/recce-source/js/src/lib/api/localStorageKeys.ts +7 -0
  282. package/recce-source/js/src/lib/api/models.ts +59 -0
  283. package/recce-source/js/src/lib/api/profile.ts +65 -0
  284. package/recce-source/js/src/lib/api/rowcount.ts +19 -0
  285. package/recce-source/js/src/lib/api/runs.ts +174 -0
  286. package/recce-source/js/src/lib/api/schemacheck.ts +31 -0
  287. package/recce-source/js/src/lib/api/select.ts +25 -0
  288. package/recce-source/js/src/lib/api/sessionStorageKeys.ts +8 -0
  289. package/recce-source/js/src/lib/api/state.ts +117 -0
  290. package/recce-source/js/src/lib/api/track.ts +281 -0
  291. package/recce-source/js/src/lib/api/types.ts +284 -0
  292. package/recce-source/js/src/lib/api/user.ts +42 -0
  293. package/recce-source/js/src/lib/api/valuediff.ts +46 -0
  294. package/recce-source/js/src/lib/api/version.ts +40 -0
  295. package/recce-source/js/src/lib/const.ts +9 -0
  296. package/recce-source/js/src/lib/dataGrid/crossFunctionConsistency.test.ts +626 -0
  297. package/recce-source/js/src/lib/dataGrid/dataGridFactory.test.ts +2140 -0
  298. package/recce-source/js/src/lib/dataGrid/dataGridFactory.ts +397 -0
  299. package/recce-source/js/src/lib/dataGrid/generators/rowCountUtils.test.ts +132 -0
  300. package/recce-source/js/src/lib/dataGrid/generators/rowCountUtils.ts +126 -0
  301. package/recce-source/js/src/lib/dataGrid/generators/toDataDiffGrid.test.ts +1627 -0
  302. package/recce-source/js/src/lib/dataGrid/generators/toDataDiffGrid.ts +140 -0
  303. package/recce-source/js/src/lib/dataGrid/generators/toDataGrid.ts +67 -0
  304. package/recce-source/js/src/lib/dataGrid/generators/toRowCountDataGrid.test.ts +142 -0
  305. package/recce-source/js/src/lib/dataGrid/generators/toRowCountDataGrid.ts +71 -0
  306. package/recce-source/js/src/lib/dataGrid/generators/toRowCountDiffDataGrid.test.ts +258 -0
  307. package/recce-source/js/src/lib/dataGrid/generators/toRowCountDiffDataGrid.ts +153 -0
  308. package/recce-source/js/src/lib/dataGrid/generators/toSchemaDataGrid.test.ts +951 -0
  309. package/recce-source/js/src/lib/dataGrid/generators/toSchemaDataGrid.ts +221 -0
  310. package/recce-source/js/src/lib/dataGrid/generators/toValueDataGrid.test.ts +395 -0
  311. package/recce-source/js/src/lib/dataGrid/generators/toValueDataGrid.ts +184 -0
  312. package/recce-source/js/src/lib/dataGrid/generators/toValueDiffGrid.test.ts +884 -0
  313. package/recce-source/js/src/lib/dataGrid/generators/toValueDiffGrid.ts +113 -0
  314. package/recce-source/js/src/lib/dataGrid/index.ts +51 -0
  315. package/recce-source/js/src/lib/dataGrid/propertyBased.test.ts +858 -0
  316. package/recce-source/js/src/lib/dataGrid/shared/columnBuilders.test.ts +482 -0
  317. package/recce-source/js/src/lib/dataGrid/shared/columnBuilders.ts +345 -0
  318. package/recce-source/js/src/lib/dataGrid/shared/dataTypeEdgeCases.test.ts +698 -0
  319. package/recce-source/js/src/lib/dataGrid/shared/diffColumnBuilder.test.tsx +820 -0
  320. package/recce-source/js/src/lib/dataGrid/shared/diffColumnBuilder.tsx +277 -0
  321. package/recce-source/js/src/lib/dataGrid/shared/gridUtils.test.ts +785 -0
  322. package/recce-source/js/src/lib/dataGrid/shared/gridUtils.ts +370 -0
  323. package/recce-source/js/src/lib/dataGrid/shared/index.ts +81 -0
  324. package/recce-source/js/src/lib/dataGrid/shared/rowBuilders.test.ts +909 -0
  325. package/recce-source/js/src/lib/dataGrid/shared/rowBuilders.ts +325 -0
  326. package/recce-source/js/src/lib/dataGrid/shared/simpleColumnBuilder.tsx +240 -0
  327. package/recce-source/js/src/lib/dataGrid/shared/toDiffColumn.test.tsx +719 -0
  328. package/recce-source/js/src/lib/dataGrid/shared/toDiffColumn.tsx +231 -0
  329. package/recce-source/js/src/lib/dataGrid/shared/validation.test.ts +559 -0
  330. package/recce-source/js/src/lib/dataGrid/shared/validation.ts +367 -0
  331. package/recce-source/js/src/lib/dataGrid/warehouseNamingConventions.test.ts +1117 -0
  332. package/recce-source/js/src/lib/formatSelect.ts +50 -0
  333. package/recce-source/js/src/lib/hooks/ApiConfigContext.tsx +181 -0
  334. package/recce-source/js/src/lib/hooks/IdleTimeoutContext.tsx +177 -0
  335. package/recce-source/js/src/lib/hooks/LineageGraphContext.tsx +512 -0
  336. package/recce-source/js/src/lib/hooks/RecceActionContext.tsx +269 -0
  337. package/recce-source/js/src/lib/hooks/RecceCheckContext.tsx +33 -0
  338. package/recce-source/js/src/lib/hooks/RecceContextProvider.tsx +54 -0
  339. package/recce-source/js/src/lib/hooks/RecceInstanceContext.tsx +129 -0
  340. package/recce-source/js/src/lib/hooks/RecceQueryContext.tsx +98 -0
  341. package/recce-source/js/src/lib/hooks/RecceShareStateContext.tsx +59 -0
  342. package/recce-source/js/src/lib/hooks/ScreenShot.tsx +399 -0
  343. package/recce-source/js/src/lib/hooks/useAppRouter.test.ts +211 -0
  344. package/recce-source/js/src/lib/hooks/useAppRouter.ts +200 -0
  345. package/recce-source/js/src/lib/hooks/useCheckEvents.ts +99 -0
  346. package/recce-source/js/src/lib/hooks/useCheckToast.tsx +14 -0
  347. package/recce-source/js/src/lib/hooks/useClipBoardToast.tsx +27 -0
  348. package/recce-source/js/src/lib/hooks/useCountdownToast.tsx +102 -0
  349. package/recce-source/js/src/lib/hooks/useFeedbackCollectionToast.tsx +130 -0
  350. package/recce-source/js/src/lib/hooks/useGuideToast.tsx +45 -0
  351. package/recce-source/js/src/lib/hooks/useIdleDetection.tsx +185 -0
  352. package/recce-source/js/src/lib/hooks/useModelColumns.tsx +113 -0
  353. package/recce-source/js/src/lib/hooks/useRecceInstanceInfo.tsx +13 -0
  354. package/recce-source/js/src/lib/hooks/useRecceServerFlag.tsx +13 -0
  355. package/recce-source/js/src/lib/hooks/useRun.tsx +89 -0
  356. package/recce-source/js/src/lib/hooks/useThemeColors.ts +115 -0
  357. package/recce-source/js/src/lib/mergeKeys.test.ts +89 -0
  358. package/recce-source/js/src/lib/mergeKeys.ts +86 -0
  359. package/recce-source/js/src/lib/result/ResultErrorFallback.tsx +9 -0
  360. package/recce-source/js/src/lib/utils/formatTime.ts +84 -0
  361. package/recce-source/js/src/lib/utils/urls.ts +16 -0
  362. package/recce-source/js/src/utils/DropdownValuesInput.tsx +297 -0
  363. package/recce-source/js/src/utils/formatters.tsx +237 -0
  364. package/recce-source/js/src/utils/transforms.ts +81 -0
  365. package/recce-source/js/tsconfig.json +47 -0
  366. package/recce-source/macros/README.md +8 -0
  367. package/recce-source/macros/recce_athena.sql +73 -0
  368. package/recce-source/pyproject.toml +109 -0
  369. package/recce-source/recce/VERSION +1 -0
  370. package/recce-source/recce/__init__.py +84 -0
  371. package/recce-source/recce/adapter/__init__.py +0 -0
  372. package/recce-source/recce/adapter/base.py +109 -0
  373. package/recce-source/recce/adapter/dbt_adapter/__init__.py +1699 -0
  374. package/recce-source/recce/adapter/dbt_adapter/dbt_version.py +42 -0
  375. package/recce-source/recce/adapter/sqlmesh_adapter.py +141 -0
  376. package/recce-source/recce/apis/__init__.py +0 -0
  377. package/recce-source/recce/apis/check_api.py +203 -0
  378. package/recce-source/recce/apis/check_events_api.py +353 -0
  379. package/recce-source/recce/apis/check_func.py +130 -0
  380. package/recce-source/recce/apis/run_api.py +130 -0
  381. package/recce-source/recce/apis/run_func.py +258 -0
  382. package/recce-source/recce/artifact.py +266 -0
  383. package/recce-source/recce/cli.py +1846 -0
  384. package/recce-source/recce/config.py +127 -0
  385. package/recce-source/recce/connect_to_cloud.py +138 -0
  386. package/recce-source/recce/core.py +334 -0
  387. package/recce-source/recce/diff.py +26 -0
  388. package/recce-source/recce/event/CONFIG +1 -0
  389. package/recce-source/recce/event/SENTRY_DNS +1 -0
  390. package/recce-source/recce/event/__init__.py +304 -0
  391. package/recce-source/recce/event/collector.py +184 -0
  392. package/recce-source/recce/event/track.py +158 -0
  393. package/recce-source/recce/exceptions.py +21 -0
  394. package/recce-source/recce/git.py +77 -0
  395. package/recce-source/recce/github.py +222 -0
  396. package/recce-source/recce/mcp_server.py +861 -0
  397. package/recce-source/recce/models/__init__.py +6 -0
  398. package/recce-source/recce/models/check.py +473 -0
  399. package/recce-source/recce/models/run.py +46 -0
  400. package/recce-source/recce/models/types.py +218 -0
  401. package/recce-source/recce/pull_request.py +124 -0
  402. package/recce-source/recce/run.py +390 -0
  403. package/recce-source/recce/server.py +877 -0
  404. package/recce-source/recce/state/__init__.py +31 -0
  405. package/recce-source/recce/state/cloud.py +644 -0
  406. package/recce-source/recce/state/const.py +26 -0
  407. package/recce-source/recce/state/local.py +56 -0
  408. package/recce-source/recce/state/state.py +119 -0
  409. package/recce-source/recce/state/state_loader.py +174 -0
  410. package/recce-source/recce/summary.py +575 -0
  411. package/recce-source/recce/tasks/__init__.py +23 -0
  412. package/recce-source/recce/tasks/core.py +134 -0
  413. package/recce-source/recce/tasks/dataframe.py +170 -0
  414. package/recce-source/recce/tasks/histogram.py +433 -0
  415. package/recce-source/recce/tasks/lineage.py +19 -0
  416. package/recce-source/recce/tasks/profile.py +298 -0
  417. package/recce-source/recce/tasks/query.py +450 -0
  418. package/recce-source/recce/tasks/rowcount.py +277 -0
  419. package/recce-source/recce/tasks/schema.py +65 -0
  420. package/recce-source/recce/tasks/top_k.py +172 -0
  421. package/recce-source/recce/tasks/utils.py +147 -0
  422. package/recce-source/recce/tasks/valuediff.py +497 -0
  423. package/recce-source/recce/util/__init__.py +4 -0
  424. package/recce-source/recce/util/api_token.py +80 -0
  425. package/recce-source/recce/util/breaking.py +330 -0
  426. package/recce-source/recce/util/cache.py +25 -0
  427. package/recce-source/recce/util/cll.py +355 -0
  428. package/recce-source/recce/util/cloud/__init__.py +15 -0
  429. package/recce-source/recce/util/cloud/base.py +115 -0
  430. package/recce-source/recce/util/cloud/check_events.py +190 -0
  431. package/recce-source/recce/util/cloud/checks.py +242 -0
  432. package/recce-source/recce/util/io.py +120 -0
  433. package/recce-source/recce/util/lineage.py +83 -0
  434. package/recce-source/recce/util/logger.py +25 -0
  435. package/recce-source/recce/util/onboarding_state.py +45 -0
  436. package/recce-source/recce/util/perf_tracking.py +85 -0
  437. package/recce-source/recce/util/pydantic_model.py +22 -0
  438. package/recce-source/recce/util/recce_cloud.py +454 -0
  439. package/recce-source/recce/util/singleton.py +18 -0
  440. package/recce-source/recce/util/startup_perf.py +121 -0
  441. package/recce-source/recce/yaml/__init__.py +58 -0
  442. package/recce-source/recce_cloud/README.md +780 -0
  443. package/recce-source/recce_cloud/VERSION +1 -0
  444. package/recce-source/recce_cloud/__init__.py +24 -0
  445. package/recce-source/recce_cloud/api/__init__.py +17 -0
  446. package/recce-source/recce_cloud/api/base.py +132 -0
  447. package/recce-source/recce_cloud/api/client.py +186 -0
  448. package/recce-source/recce_cloud/api/exceptions.py +26 -0
  449. package/recce-source/recce_cloud/api/factory.py +63 -0
  450. package/recce-source/recce_cloud/api/github.py +106 -0
  451. package/recce-source/recce_cloud/api/gitlab.py +111 -0
  452. package/recce-source/recce_cloud/artifact.py +57 -0
  453. package/recce-source/recce_cloud/ci_providers/__init__.py +9 -0
  454. package/recce-source/recce_cloud/ci_providers/base.py +82 -0
  455. package/recce-source/recce_cloud/ci_providers/detector.py +147 -0
  456. package/recce-source/recce_cloud/ci_providers/github_actions.py +136 -0
  457. package/recce-source/recce_cloud/ci_providers/gitlab_ci.py +130 -0
  458. package/recce-source/recce_cloud/cli.py +434 -0
  459. package/recce-source/recce_cloud/download.py +230 -0
  460. package/recce-source/recce_cloud/hatch_build.py +20 -0
  461. package/recce-source/recce_cloud/pyproject.toml +49 -0
  462. package/recce-source/recce_cloud/upload.py +214 -0
  463. package/recce-source/test.py +0 -0
  464. package/recce-source/tests/__init__.py +0 -0
  465. package/recce-source/tests/adapter/__init__.py +0 -0
  466. package/recce-source/tests/adapter/dbt_adapter/__init__.py +0 -0
  467. package/recce-source/tests/adapter/dbt_adapter/conftest.py +17 -0
  468. package/recce-source/tests/adapter/dbt_adapter/dbt_test_helper.py +298 -0
  469. package/recce-source/tests/adapter/dbt_adapter/test_dbt_adapter.py +25 -0
  470. package/recce-source/tests/adapter/dbt_adapter/test_dbt_cll.py +717 -0
  471. package/recce-source/tests/adapter/dbt_adapter/test_proj/dbt_project.yml +4 -0
  472. package/recce-source/tests/adapter/dbt_adapter/test_proj/manifest.json +1 -0
  473. package/recce-source/tests/adapter/dbt_adapter/test_proj/package-lock.yml +8 -0
  474. package/recce-source/tests/adapter/dbt_adapter/test_proj/packages.yml +7 -0
  475. package/recce-source/tests/adapter/dbt_adapter/test_proj/profiles.yml +6 -0
  476. package/recce-source/tests/adapter/dbt_adapter/test_selector.py +205 -0
  477. package/recce-source/tests/apis/__init__.py +0 -0
  478. package/recce-source/tests/apis/row_count_diff.json +59 -0
  479. package/recce-source/tests/apis/test_check_events_api.py +615 -0
  480. package/recce-source/tests/apis/test_run_func.py +433 -0
  481. package/recce-source/tests/catalog.json +527 -0
  482. package/recce-source/tests/data/manifest/base/catalog.json +1 -0
  483. package/recce-source/tests/data/manifest/base/manifest.json +1 -0
  484. package/recce-source/tests/data/manifest/pr2/catalog.json +1 -0
  485. package/recce-source/tests/data/manifest/pr2/manifest.json +1 -0
  486. package/recce-source/tests/manifest.json +10655 -0
  487. package/recce-source/tests/models/__init__.py +0 -0
  488. package/recce-source/tests/models/test_check.py +731 -0
  489. package/recce-source/tests/models/test_run_models.py +295 -0
  490. package/recce-source/tests/recce_cloud/__init__.py +0 -0
  491. package/recce-source/tests/recce_cloud/test_ci_providers.py +351 -0
  492. package/recce-source/tests/recce_cloud/test_cli.py +735 -0
  493. package/recce-source/tests/recce_cloud/test_client.py +379 -0
  494. package/recce-source/tests/recce_cloud/test_platform_clients.py +483 -0
  495. package/recce-source/tests/recce_state.json +1 -0
  496. package/recce-source/tests/state/test_cloud.py +719 -0
  497. package/recce-source/tests/state/test_local.py +164 -0
  498. package/recce-source/tests/state/test_state_loader.py +211 -0
  499. package/recce-source/tests/tasks/__init__.py +0 -0
  500. package/recce-source/tests/tasks/conftest.py +4 -0
  501. package/recce-source/tests/tasks/test_histogram.py +129 -0
  502. package/recce-source/tests/tasks/test_lineage.py +55 -0
  503. package/recce-source/tests/tasks/test_preset_checks.py +64 -0
  504. package/recce-source/tests/tasks/test_profile.py +397 -0
  505. package/recce-source/tests/tasks/test_query.py +528 -0
  506. package/recce-source/tests/tasks/test_row_count.py +133 -0
  507. package/recce-source/tests/tasks/test_schema.py +122 -0
  508. package/recce-source/tests/tasks/test_top_k.py +77 -0
  509. package/recce-source/tests/tasks/test_utils.py +439 -0
  510. package/recce-source/tests/tasks/test_valuediff.py +361 -0
  511. package/recce-source/tests/test_cli.py +236 -0
  512. package/recce-source/tests/test_cli_mcp_optional.py +45 -0
  513. package/recce-source/tests/test_cloud_listing_cli.py +324 -0
  514. package/recce-source/tests/test_config.py +43 -0
  515. package/recce-source/tests/test_connect_to_cloud.py +82 -0
  516. package/recce-source/tests/test_core.py +174 -0
  517. package/recce-source/tests/test_dbt.py +36 -0
  518. package/recce-source/tests/test_mcp_server.py +505 -0
  519. package/recce-source/tests/test_pull_request.py +130 -0
  520. package/recce-source/tests/test_server.py +202 -0
  521. package/recce-source/tests/test_server_lifespan.py +138 -0
  522. package/recce-source/tests/test_summary.py +73 -0
  523. package/recce-source/tests/util/__init__.py +0 -0
  524. package/recce-source/tests/util/cloud/__init__.py +0 -0
  525. package/recce-source/tests/util/cloud/test_check_events.py +255 -0
  526. package/recce-source/tests/util/cloud/test_checks.py +204 -0
  527. package/recce-source/tests/util/test_api_token.py +119 -0
  528. package/recce-source/tests/util/test_breaking.py +1427 -0
  529. package/recce-source/tests/util/test_cll.py +706 -0
  530. package/recce-source/tests/util/test_lineage.py +122 -0
  531. package/recce-source/tests/util/test_onboarding_state.py +84 -0
  532. package/recce-source/tests/util/test_recce_cloud.py +231 -0
  533. package/recce-source/tox.ini +40 -0
  534. package/recce-source/uv.lock +3928 -0
  535. package/src/api/index.ts +32 -0
  536. package/src/components/index.ts +154 -0
  537. package/src/global.d.ts +14 -0
  538. package/src/hooks/index.ts +56 -0
  539. package/src/index.ts +17 -0
  540. package/src/lib/hooks/RouteConfigContext.ts +139 -0
  541. package/src/lib/hooks/useAppRouter.ts +240 -0
  542. package/src/mui-augmentation.d.ts +139 -0
  543. package/src/theme/index.ts +13 -0
  544. package/src/theme.ts +23 -0
  545. package/src/types/index.ts +23 -0
  546. package/dist/index-BNUP2V_N.d.ts.map +0 -1
  547. package/dist/index-DOPZuhD8.d.mts.map +0 -1
  548. package/dist/theme.d.mts.map +0 -1
  549. package/dist/theme.d.ts.map +0 -1
@@ -0,0 +1,242 @@
1
+ """
2
+ Recce Cloud API client for check operations.
3
+
4
+ This module provides methods for managing checks (validation operations) in Recce Cloud,
5
+ including CRUD operations for checks within sessions.
6
+ """
7
+
8
+ from typing import Dict, List
9
+
10
+ from recce.util.cloud.base import CloudBase
11
+
12
+
13
+ class ChecksCloud(CloudBase):
14
+ """
15
+ Client for Recce Cloud check operations.
16
+
17
+ Provides methods to list, create, retrieve, update, and delete checks
18
+ within Recce Cloud sessions.
19
+
20
+ Examples:
21
+ >>> client = ChecksCloud(token="your-api-token")
22
+ >>> checks = client.list_checks(org_id="org123", project_id="proj456", session_id="sess789")
23
+ >>> check = client.get_check(org_id="org123", project_id="proj456",
24
+ ... session_id="sess789", check_id="check001")
25
+ """
26
+
27
+ def list_checks(self, org_id: str, project_id: str, session_id: str) -> List[Dict]:
28
+ """
29
+ List all checks in a session.
30
+
31
+ Args:
32
+ org_id: Organization ID
33
+ project_id: Project ID
34
+ session_id: Session ID
35
+
36
+ Returns:
37
+ List of check dictionaries
38
+
39
+ Raises:
40
+ RecceCloudException: If the request fails
41
+
42
+ Example:
43
+ >>> checks = client.list_checks("org123", "proj456", "sess789")
44
+ >>> print(f"Found {len(checks)} checks")
45
+ """
46
+ api_url = f"{self.base_url_v2}/organizations/{org_id}/projects/{project_id}/sessions/{session_id}/checks"
47
+ response = self._request("GET", api_url)
48
+
49
+ self._raise_for_status(
50
+ response,
51
+ "Failed to list checks from Recce Cloud.",
52
+ )
53
+
54
+ data = response.json()
55
+ return data.get("checks", [])
56
+
57
+ def create_check(
58
+ self,
59
+ org_id: str,
60
+ project_id: str,
61
+ session_id: str,
62
+ check_data: Dict,
63
+ ) -> Dict:
64
+ """
65
+ Create a new check in a session.
66
+
67
+ Args:
68
+ org_id: Organization ID
69
+ project_id: Project ID
70
+ session_id: Session ID
71
+ check_data: Check data to create (should include check type, params, etc.)
72
+
73
+ Returns:
74
+ Created check dictionary
75
+
76
+ Raises:
77
+ RecceCloudException: If the request fails
78
+
79
+ Example:
80
+ >>> check_data = {
81
+ ... "name": "Schema Check",
82
+ ... "type": "schema_diff",
83
+ ... "params": {"model": "customers"}
84
+ ... }
85
+ >>> check = client.create_check("org123", "proj456", "sess789", check_data)
86
+ >>> print(f"Created check with ID: {check['id']}")
87
+ """
88
+ api_url = f"{self.base_url_v2}/organizations/{org_id}/projects/{project_id}/sessions/{session_id}/checks"
89
+ response = self._request("POST", api_url, json=check_data)
90
+
91
+ self._raise_for_status(
92
+ response,
93
+ "Failed to create check in Recce Cloud.",
94
+ )
95
+ data = response.json()
96
+ return data.get("check")
97
+
98
+ def get_check(
99
+ self,
100
+ org_id: str,
101
+ project_id: str,
102
+ session_id: str,
103
+ check_id: str,
104
+ ) -> Dict:
105
+ """
106
+ Get a specific check by ID.
107
+
108
+ Args:
109
+ org_id: Organization ID
110
+ project_id: Project ID
111
+ session_id: Session ID
112
+ check_id: Check ID
113
+
114
+ Returns:
115
+ Check dictionary
116
+
117
+ Raises:
118
+ RecceCloudException: If the request fails or check not found
119
+
120
+ Example:
121
+ >>> check = client.get_check("org123", "proj456", "sess789", "check001")
122
+ >>> print(f"Check name: {check['name']}")
123
+ >>> print(f"Check status: {check['status']}")
124
+ """
125
+ api_url = (
126
+ f"{self.base_url_v2}/organizations/{org_id}/projects/{project_id}/sessions/{session_id}/checks/{check_id}"
127
+ )
128
+ response = self._request("GET", api_url)
129
+
130
+ self._raise_for_status(
131
+ response,
132
+ f"Failed to get check {check_id} from Recce Cloud.",
133
+ )
134
+
135
+ data = response.json()
136
+ return data.get("check", {})
137
+
138
+ def update_check(
139
+ self,
140
+ org_id: str,
141
+ project_id: str,
142
+ session_id: str,
143
+ check_id: str,
144
+ check_data: Dict,
145
+ ) -> Dict:
146
+ """
147
+ Update an existing check.
148
+
149
+ Args:
150
+ org_id: Organization ID
151
+ project_id: Project ID
152
+ session_id: Session ID
153
+ check_id: Check ID
154
+ check_data: Updated check data (partial updates supported)
155
+
156
+ Returns:
157
+ Updated check dictionary
158
+
159
+ Raises:
160
+ RecceCloudException: If the request fails
161
+
162
+ Example:
163
+ >>> update_data = {
164
+ ... "status": "approved",
165
+ ... "notes": "Validated successfully"
166
+ ... }
167
+ >>> check = client.update_check("org123", "proj456", "sess789", "check001", update_data)
168
+ >>> print(f"Updated check status: {check['status']}")
169
+ """
170
+ api_url = (
171
+ f"{self.base_url_v2}/organizations/{org_id}/projects/{project_id}/sessions/{session_id}/checks/{check_id}"
172
+ )
173
+ response = self._request("PATCH", api_url, json=check_data)
174
+
175
+ self._raise_for_status(
176
+ response,
177
+ f"Failed to update check {check_id} in Recce Cloud.",
178
+ )
179
+
180
+ data = response.json()
181
+ return data.get("check", {})
182
+
183
+ def delete_check(
184
+ self,
185
+ org_id: str,
186
+ project_id: str,
187
+ session_id: str,
188
+ check_id: str,
189
+ ) -> None:
190
+ """
191
+ Delete a check.
192
+
193
+ Args:
194
+ org_id: Organization ID
195
+ project_id: Project ID
196
+ session_id: Session ID
197
+ check_id: Check ID
198
+
199
+ Raises:
200
+ RecceCloudException: If the request fails
201
+
202
+ Example:
203
+ >>> client.delete_check("org123", "proj456", "sess789", "check001")
204
+ >>> print("Check deleted successfully")
205
+ """
206
+ api_url = (
207
+ f"{self.base_url_v2}/organizations/{org_id}/projects/{project_id}/sessions/{session_id}/checks/{check_id}"
208
+ )
209
+ response = self._request("DELETE", api_url)
210
+
211
+ # DELETE typically returns 204 No Content on success
212
+ if response.status_code not in (200, 204):
213
+ self._raise_for_status(
214
+ response,
215
+ f"Failed to delete check {check_id} from Recce Cloud.",
216
+ )
217
+
218
+ def create_preset_check(self, org_id: str, project_id: str, check_data: Dict):
219
+ """
220
+ Create a preset check from an existing check.
221
+
222
+ Args:
223
+ org_id: Organization ID
224
+ project_id: Project ID
225
+ check_data: Check data including name, description, type, params, view_options, and order_index
226
+
227
+ Returns:
228
+ Created preset check dictionary
229
+
230
+ Raises:
231
+ RecceCloudException: If the request fails
232
+ """
233
+ api_url = f"{self.base_url_v2}/organizations/{org_id}/projects/{project_id}/preset-checks"
234
+ response = self._request("POST", api_url, json=check_data)
235
+
236
+ self._raise_for_status(
237
+ response,
238
+ "Failed to create preset check in Recce Cloud.",
239
+ )
240
+
241
+ data = response.json()
242
+ return data.get("presetCheck", {})
@@ -0,0 +1,120 @@
1
+ import gzip
2
+ import os
3
+ import tempfile
4
+ from abc import ABC, ABCMeta, abstractmethod
5
+ from enum import Enum
6
+
7
+
8
+ class SupportedFileTypes(Enum):
9
+ FILE = "file"
10
+ GZIP = "gzip"
11
+ ZIP = "zip"
12
+
13
+
14
+ def file_io_factory(file_type: SupportedFileTypes):
15
+ if file_type == SupportedFileTypes.FILE:
16
+ return FileIO
17
+ elif file_type == SupportedFileTypes.GZIP:
18
+ return GzipFileIO
19
+ elif file_type == SupportedFileTypes.ZIP:
20
+ return ZipFileIO
21
+ else:
22
+ raise ValueError(f"Unsupported file type: {file_type}")
23
+
24
+
25
+ class AbstractFileIO(metaclass=ABCMeta):
26
+ @staticmethod
27
+ @abstractmethod
28
+ def write(path: str, data: str, **kwargs):
29
+ raise NotImplementedError
30
+
31
+ @staticmethod
32
+ @abstractmethod
33
+ def read(path: str, **kwargs) -> str:
34
+ raise NotImplementedError
35
+
36
+
37
+ class FileIO(AbstractFileIO, ABC):
38
+ @staticmethod
39
+ def write(path: str, data: str, **kwargs):
40
+ with open(path, "w", encoding="utf-8") as f:
41
+ f.write(data)
42
+
43
+ @staticmethod
44
+ def read(path: str, **kwargs) -> str:
45
+ with open(path, "r", encoding="utf-8") as f:
46
+ return f.read()
47
+
48
+
49
+ class GzipFileIO(AbstractFileIO, ABC):
50
+ @staticmethod
51
+ def write(path: str, data: str, **kwargs):
52
+ with gzip.open(path, "wt") as f:
53
+ f.write(data)
54
+
55
+ @staticmethod
56
+ def read(path: str, **kwargs) -> str:
57
+ with gzip.open(path, "rt") as f:
58
+ return f.read()
59
+
60
+ @staticmethod
61
+ def read_fileobj(fileobj) -> bytes:
62
+ with gzip.GzipFile(fileobj=fileobj) as f:
63
+ return f.read()
64
+
65
+
66
+ class ZipFileIO(AbstractFileIO, ABC):
67
+ @staticmethod
68
+ def _is_pyminizip_installed():
69
+ try:
70
+ import pyminizip
71
+
72
+ # Use the module to avoid F401
73
+ return pyminizip is not None
74
+ except ImportError:
75
+ raise ImportError("pyminizip is not installed. Please install it using `pip install pyminizip`")
76
+
77
+ @staticmethod
78
+ def read(path: str, **kwargs) -> str:
79
+ ZipFileIO._is_pyminizip_installed()
80
+ import pyminizip
81
+
82
+ cwd = os.getcwd()
83
+ password = kwargs.get("password")
84
+ zip_dir_name = kwargs.get("zip_dir_name")
85
+ if zip_dir_name is None:
86
+ raise ValueError("zip_dir_name is required for zipping")
87
+
88
+ try:
89
+ with tempfile.TemporaryDirectory() as tmp_dir:
90
+ tmp_file = os.path.join(tmp_dir, zip_dir_name)
91
+ pyminizip.uncompress(path, password, tmp_dir, 0)
92
+ content = FileIO.read(tmp_file)
93
+ except Exception as e:
94
+ error_msg = str(e)
95
+ if "-3" in error_msg:
96
+ raise Exception("Invalid password to uncompress state file.")
97
+ raise Exception(f"Failed to uncompress state file: {error_msg}")
98
+ finally:
99
+ os.chdir(cwd)
100
+
101
+ return content
102
+
103
+ @staticmethod
104
+ def write(path: str, data: str, **kwargs):
105
+ ZipFileIO._is_pyminizip_installed()
106
+ import pyminizip
107
+
108
+ cwd = os.getcwd()
109
+ password = kwargs.get("password")
110
+ zip_dir_name = kwargs.get("zip_dir_name")
111
+ if zip_dir_name is None:
112
+ raise ValueError("zip_dir_name is required for zipping")
113
+
114
+ try:
115
+ with tempfile.TemporaryDirectory() as tmp_dir:
116
+ tmp_file = os.path.join(tmp_dir, zip_dir_name)
117
+ FileIO.write(tmp_file, data)
118
+ pyminizip.compress(tmp_file, None, path, password, 9)
119
+ finally:
120
+ os.chdir(cwd)
@@ -0,0 +1,83 @@
1
+ from typing import Dict, Iterable, Set, Tuple
2
+
3
+ from recce.models.types import CllColumn, CllNode
4
+
5
+
6
+ def find_upstream(node_ids: Iterable, parent_map):
7
+ visited = set()
8
+ upstream = set()
9
+
10
+ stack = list(node_ids)
11
+ while stack:
12
+ current = stack.pop()
13
+ if current in visited:
14
+ continue
15
+ visited.add(current)
16
+ parents = parent_map.get(current, [])
17
+ for parent in parents:
18
+ if parent not in upstream:
19
+ upstream.add(parent)
20
+ stack.append(parent)
21
+ return upstream
22
+
23
+
24
+ def find_downstream(node_ids: Iterable, child_map):
25
+ visited = set()
26
+ downstream = set()
27
+
28
+ stack = list(node_ids)
29
+ while stack:
30
+ current = stack.pop()
31
+ if current in visited:
32
+ continue
33
+ visited.add(current)
34
+ children = child_map.get(current, [])
35
+ for child in children:
36
+ if child not in downstream:
37
+ downstream.add(child)
38
+ stack.append(child)
39
+ return downstream
40
+
41
+
42
+ def find_column_dependencies(node_column_id: str, parent_map: Dict, child_map: Dict) -> Tuple[Set, Set]:
43
+ upstream_cols = find_upstream([node_column_id], parent_map)
44
+ downstream_cols = find_downstream([node_column_id], child_map)
45
+ return upstream_cols, downstream_cols
46
+
47
+
48
+ def filter_lineage_vertices(
49
+ lineage_nodes: Dict[str, CllNode], lineage_columns: Dict[str, CllColumn], relevant_columns: Set[str]
50
+ ) -> Tuple[Dict[str, CllNode], Dict[str, CllColumn]]:
51
+ nodes = {}
52
+ columns = {}
53
+
54
+ for node_id, node in lineage_nodes.items():
55
+ if node_id in relevant_columns:
56
+ nodes[node_id] = node
57
+
58
+ for col_id, column in lineage_columns.items():
59
+ if col_id in relevant_columns:
60
+ columns[col_id] = column
61
+
62
+ return nodes, columns
63
+
64
+
65
+ def filter_dependency_maps(
66
+ parent_map: Dict, child_map: Dict, relevant_ids: Set
67
+ ) -> Tuple[Dict[str, Set], Dict[str, Set]]:
68
+ p_map = {}
69
+ c_map = {}
70
+ for node_id, parents in parent_map.items():
71
+ if node_id in relevant_ids:
72
+ p_map[node_id] = {p for p in parents if p in relevant_ids}
73
+
74
+ for node_id, children in child_map.items():
75
+ if node_id in relevant_ids:
76
+ c_map[node_id] = {c for c in children if c in relevant_ids}
77
+
78
+ return p_map, c_map
79
+
80
+
81
+ def build_column_key(node_id: str, column_name: str) -> str:
82
+ """Build a unique column key from node name and column name."""
83
+ return f"{node_id}_{column_name}"
@@ -0,0 +1,25 @@
1
+ import logging
2
+
3
+
4
+ class CustomFormatter(logging.Formatter):
5
+ grey = "\x1b[38;20m"
6
+ blue = "\x1b[34;20m"
7
+ green = "\x1b[32;20m"
8
+ yellow = "\x1b[33;20m"
9
+ red = "\x1b[31;20m"
10
+ bold_red = "\x1b[31;1m"
11
+ reset = "\x1b[0m"
12
+ format = "[%(levelname)s] %(name)s: %(message)s (%(filename)s:%(lineno)d)"
13
+
14
+ FORMATS = {
15
+ logging.DEBUG: blue + format + reset,
16
+ logging.INFO: green + format + reset,
17
+ logging.WARNING: yellow + format + reset,
18
+ logging.ERROR: red + format + reset,
19
+ logging.CRITICAL: bold_red + format + reset,
20
+ }
21
+
22
+ def format(self, record):
23
+ log_fmt = self.FORMATS.get(record.levelno)
24
+ formatter = logging.Formatter(log_fmt)
25
+ return formatter.format(record)
@@ -0,0 +1,45 @@
1
+ from enum import Enum
2
+ from typing import Union
3
+
4
+ from recce.util.recce_cloud import (
5
+ get_recce_cloud_onboarding_state,
6
+ set_recce_cloud_onboarding_state,
7
+ )
8
+
9
+
10
+ class OnboardingState(Enum):
11
+ SIGNUP_SUCCESSFUL = "signup_successful"
12
+ LAUNCHED_WITH_TOKEN = "launched_with_token"
13
+ CONFIGURE_TWO_ENV = "configure_two_env"
14
+
15
+
16
+ def update_onboarding_state(api_token: Union[str, bool, None], is_single_env: bool) -> OnboardingState:
17
+ if api_token:
18
+ # existing onboarding_state values -> new, launched, launched_with_two_envs
19
+ # new -> launched
20
+ # new -> launched_with_two_envs
21
+ # launched -> launched_with_two_envs
22
+ cloud_onboarding_state = get_recce_cloud_onboarding_state(api_token)
23
+
24
+ if cloud_onboarding_state == OnboardingState.SIGNUP_SUCCESSFUL.value:
25
+ # User has an API Token and is a "new" user
26
+ if is_single_env:
27
+ # Mark the onboarding state as "launched" if the user is new
28
+ set_recce_cloud_onboarding_state(api_token, OnboardingState.LAUNCHED_WITH_TOKEN.value)
29
+ return OnboardingState.LAUNCHED_WITH_TOKEN
30
+ else:
31
+ set_recce_cloud_onboarding_state(api_token, OnboardingState.CONFIGURE_TWO_ENV.value)
32
+ return OnboardingState.CONFIGURE_TWO_ENV
33
+ elif cloud_onboarding_state == OnboardingState.LAUNCHED_WITH_TOKEN.value:
34
+ # User has an API Token and has Two Environments
35
+ if is_single_env:
36
+ # Just return the current state
37
+ return OnboardingState.LAUNCHED_WITH_TOKEN
38
+ else:
39
+ set_recce_cloud_onboarding_state(api_token, OnboardingState.CONFIGURE_TWO_ENV.value)
40
+ return OnboardingState.CONFIGURE_TWO_ENV
41
+ elif cloud_onboarding_state == OnboardingState.CONFIGURE_TWO_ENV.value:
42
+ # Just return the current state
43
+ return OnboardingState.CONFIGURE_TWO_ENV
44
+
45
+ return OnboardingState.SIGNUP_SUCCESSFUL
@@ -0,0 +1,85 @@
1
+ import time
2
+ from dataclasses import dataclass
3
+
4
+
5
+ @dataclass
6
+ class LineagePerfTracker:
7
+ lineage_start = None
8
+ lineage_elapsed = None
9
+ column_lineage_start = None
10
+ column_lineage_elapsed = None
11
+
12
+ total_nodes = None
13
+ init_nodes = None
14
+ cll_nodes = 0
15
+ change_analysis_nodes = 0
16
+ anchor_nodes = None
17
+
18
+ params = None
19
+
20
+ def start_lineage(self):
21
+ self.lineage_start = time.perf_counter_ns()
22
+
23
+ def end_lineage(self):
24
+ if self.lineage_start is None:
25
+ return
26
+ self.lineage_elapsed = (time.perf_counter_ns() - self.lineage_start) / 1000000
27
+
28
+ def start_column_lineage(self):
29
+ self.column_lineage_start = time.perf_counter_ns()
30
+
31
+ def end_column_lineage(self):
32
+ if self.column_lineage_start is None:
33
+ return
34
+ self.column_lineage_elapsed = (time.perf_counter_ns() - self.column_lineage_start) / 1000000
35
+
36
+ def set_total_nodes(self, total_nodes):
37
+ self.total_nodes = total_nodes
38
+
39
+ def set_init_nodes(self, init_nodes):
40
+ self.init_nodes = init_nodes
41
+
42
+ def set_anchor_nodes(self, anchor_nodes):
43
+ self.anchor_nodes = anchor_nodes
44
+
45
+ def increment_cll_nodes(self):
46
+ self.cll_nodes += 1
47
+
48
+ def increment_change_analysis_nodes(self):
49
+ self.change_analysis_nodes += 1
50
+
51
+ def set_params(self, has_node, has_column, change_analysis, no_cll, no_upstream, no_downstream):
52
+ self.params = {
53
+ "has_node": has_node,
54
+ "has_column": has_column,
55
+ "change_analysis": change_analysis,
56
+ "no_cll": no_cll,
57
+ "no_upstream": no_upstream,
58
+ "no_downstream": no_downstream,
59
+ }
60
+
61
+ def to_dict(self):
62
+ return {
63
+ "lineage_elapsed_ms": self.lineage_elapsed,
64
+ "column_lineage_elapsed_ms": self.column_lineage_elapsed,
65
+ "total_nodes": self.total_nodes,
66
+ "init_nodes": self.init_nodes,
67
+ "cll_nodes": self.cll_nodes,
68
+ "change_analysis_nodes": self.change_analysis_nodes,
69
+ "anchor_nodes": self.anchor_nodes,
70
+ "params": self.params,
71
+ }
72
+
73
+ def reset(self):
74
+ self.lineage_start = None
75
+ self.lineage_elapsed = None
76
+ self.column_lineage_start = None
77
+ self.column_lineage_elapsed = None
78
+
79
+ self.total_nodes = None
80
+ self.init_nodes = None
81
+ self.change_analysis_nodes = 0
82
+ self.cll_nodes = 0
83
+ self.anchor_nodes = 0
84
+
85
+ self.params = None
@@ -0,0 +1,22 @@
1
+ import pydantic
2
+ from pydantic import BaseModel
3
+
4
+
5
+ def pydantic_model_json_dump(model: BaseModel):
6
+ pydantic_version = pydantic.version.VERSION
7
+ pydantic_major = pydantic_version.split(".")[0]
8
+
9
+ if pydantic_major == "1":
10
+ return model.json(exclude_none=True)
11
+ else:
12
+ return model.model_dump_json(exclude_none=True)
13
+
14
+
15
+ def pydantic_model_dump(model: BaseModel):
16
+ pydantic_version = pydantic.version.VERSION
17
+ pydantic_major = pydantic_version.split(".")[0]
18
+
19
+ if pydantic_major == "1":
20
+ return model.dict()
21
+ else:
22
+ return model.model_dump()