recce-nightly 1.16.0.20250817__tar.gz → 1.16.0.20250819__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (168) hide show
  1. {recce_nightly-1.16.0.20250817/recce_nightly.egg-info → recce_nightly-1.16.0.20250819}/PKG-INFO +1 -1
  2. recce_nightly-1.16.0.20250819/recce/VERSION +1 -0
  3. {recce_nightly-1.16.0.20250817 → recce_nightly-1.16.0.20250819}/recce/artifact.py +58 -0
  4. {recce_nightly-1.16.0.20250817 → recce_nightly-1.16.0.20250819}/recce/cli.py +121 -81
  5. {recce_nightly-1.16.0.20250817 → recce_nightly-1.16.0.20250819}/recce/data/404.html +1 -1
  6. recce_nightly-1.16.0.20250817/recce/data/_next/static/chunks/490-ce854af0bc670d3e.js → recce_nightly-1.16.0.20250819/recce/data/_next/static/chunks/490-fdbe0c19eed355c6.js +1 -1
  7. recce_nightly-1.16.0.20250817/recce/data/_next/static/chunks/app/page-6e7f45c0d0eb69b3.js → recce_nightly-1.16.0.20250819/recce/data/_next/static/chunks/app/page-58963bcee0b7da7f.js +1 -1
  8. {recce_nightly-1.16.0.20250817 → recce_nightly-1.16.0.20250819}/recce/data/index.html +1 -1
  9. {recce_nightly-1.16.0.20250817 → recce_nightly-1.16.0.20250819}/recce/data/index.txt +4 -4
  10. {recce_nightly-1.16.0.20250817 → recce_nightly-1.16.0.20250819}/recce/server.py +4 -0
  11. recce_nightly-1.16.0.20250819/recce/state/cloud.py +621 -0
  12. {recce_nightly-1.16.0.20250817 → recce_nightly-1.16.0.20250819}/recce/state/state_loader.py +15 -18
  13. {recce_nightly-1.16.0.20250817 → recce_nightly-1.16.0.20250819}/recce/util/lineage.py +14 -18
  14. {recce_nightly-1.16.0.20250817 → recce_nightly-1.16.0.20250819}/recce/util/recce_cloud.py +119 -4
  15. {recce_nightly-1.16.0.20250817 → recce_nightly-1.16.0.20250819/recce_nightly.egg-info}/PKG-INFO +1 -1
  16. {recce_nightly-1.16.0.20250817 → recce_nightly-1.16.0.20250819}/recce_nightly.egg-info/SOURCES.txt +4 -4
  17. recce_nightly-1.16.0.20250817/recce/VERSION +0 -1
  18. recce_nightly-1.16.0.20250817/recce/state/cloud.py +0 -384
  19. {recce_nightly-1.16.0.20250817 → recce_nightly-1.16.0.20250819}/LICENSE +0 -0
  20. {recce_nightly-1.16.0.20250817 → recce_nightly-1.16.0.20250819}/README.md +0 -0
  21. {recce_nightly-1.16.0.20250817 → recce_nightly-1.16.0.20250819}/pyproject.toml +0 -0
  22. {recce_nightly-1.16.0.20250817 → recce_nightly-1.16.0.20250819}/recce/__init__.py +0 -0
  23. {recce_nightly-1.16.0.20250817 → recce_nightly-1.16.0.20250819}/recce/adapter/__init__.py +0 -0
  24. {recce_nightly-1.16.0.20250817 → recce_nightly-1.16.0.20250819}/recce/adapter/base.py +0 -0
  25. {recce_nightly-1.16.0.20250817 → recce_nightly-1.16.0.20250819}/recce/adapter/dbt_adapter/__init__.py +0 -0
  26. {recce_nightly-1.16.0.20250817 → recce_nightly-1.16.0.20250819}/recce/adapter/dbt_adapter/dbt_version.py +0 -0
  27. {recce_nightly-1.16.0.20250817 → recce_nightly-1.16.0.20250819}/recce/adapter/sqlmesh_adapter.py +0 -0
  28. {recce_nightly-1.16.0.20250817 → recce_nightly-1.16.0.20250819}/recce/apis/__init__.py +0 -0
  29. {recce_nightly-1.16.0.20250817 → recce_nightly-1.16.0.20250819}/recce/apis/check_api.py +0 -0
  30. {recce_nightly-1.16.0.20250817 → recce_nightly-1.16.0.20250819}/recce/apis/check_func.py +0 -0
  31. {recce_nightly-1.16.0.20250817 → recce_nightly-1.16.0.20250819}/recce/apis/run_api.py +0 -0
  32. {recce_nightly-1.16.0.20250817 → recce_nightly-1.16.0.20250819}/recce/apis/run_func.py +0 -0
  33. {recce_nightly-1.16.0.20250817 → recce_nightly-1.16.0.20250819}/recce/config.py +0 -0
  34. {recce_nightly-1.16.0.20250817 → recce_nightly-1.16.0.20250819}/recce/connect_to_cloud.py +0 -0
  35. {recce_nightly-1.16.0.20250817 → recce_nightly-1.16.0.20250819}/recce/core.py +0 -0
  36. {recce_nightly-1.16.0.20250817/recce/data/_next/static/-zBI1h60_HeMe-9ZrCw7s → recce_nightly-1.16.0.20250819/recce/data/_next/static/_Bc4HmoKZFGvGwXSt1HgV}/_buildManifest.js +0 -0
  37. {recce_nightly-1.16.0.20250817/recce/data/_next/static/-zBI1h60_HeMe-9ZrCw7s → recce_nightly-1.16.0.20250819/recce/data/_next/static/_Bc4HmoKZFGvGwXSt1HgV}/_ssgManifest.js +0 -0
  38. {recce_nightly-1.16.0.20250817 → recce_nightly-1.16.0.20250819}/recce/data/_next/static/chunks/068b80ea-7fab85837b21fed5.js +0 -0
  39. {recce_nightly-1.16.0.20250817 → recce_nightly-1.16.0.20250819}/recce/data/_next/static/chunks/0ddaf06c-05b8d2a8a3e5c6f3.js +0 -0
  40. {recce_nightly-1.16.0.20250817 → recce_nightly-1.16.0.20250819}/recce/data/_next/static/chunks/12f8fac4-170216f89d5576c6.js +0 -0
  41. {recce_nightly-1.16.0.20250817 → recce_nightly-1.16.0.20250819}/recce/data/_next/static/chunks/235b8375-c2d62e0b44e3ae74.js +0 -0
  42. {recce_nightly-1.16.0.20250817 → recce_nightly-1.16.0.20250819}/recce/data/_next/static/chunks/2541941f-d65696bd5d37dfa2.js +0 -0
  43. {recce_nightly-1.16.0.20250817 → recce_nightly-1.16.0.20250819}/recce/data/_next/static/chunks/25c097a4-51d7c9060de49a6c.js +0 -0
  44. {recce_nightly-1.16.0.20250817 → recce_nightly-1.16.0.20250819}/recce/data/_next/static/chunks/27e92eb0-4d8ec3c6cdf0d5f1.js +0 -0
  45. {recce_nightly-1.16.0.20250817 → recce_nightly-1.16.0.20250819}/recce/data/_next/static/chunks/2fc37c1e-fd3c94ef85344810.js +0 -0
  46. {recce_nightly-1.16.0.20250817 → recce_nightly-1.16.0.20250819}/recce/data/_next/static/chunks/370-bd3e0bf7237858bc.js +0 -0
  47. {recce_nightly-1.16.0.20250817 → recce_nightly-1.16.0.20250819}/recce/data/_next/static/chunks/3a92ee20-a33bb5964d0b2f37.js +0 -0
  48. {recce_nightly-1.16.0.20250817 → recce_nightly-1.16.0.20250819}/recce/data/_next/static/chunks/575-2443813ff441d02c.js +0 -0
  49. {recce_nightly-1.16.0.20250817 → recce_nightly-1.16.0.20250819}/recce/data/_next/static/chunks/62446465-5277e7ad93431c07.js +0 -0
  50. {recce_nightly-1.16.0.20250817 → recce_nightly-1.16.0.20250819}/recce/data/_next/static/chunks/6af7f9e9-1b5f068628caacd4.js +0 -0
  51. {recce_nightly-1.16.0.20250817 → recce_nightly-1.16.0.20250819}/recce/data/_next/static/chunks/6cf54382-9bc9b4c7b7e4b8d8.js +0 -0
  52. {recce_nightly-1.16.0.20250817 → recce_nightly-1.16.0.20250819}/recce/data/_next/static/chunks/6dc81886-2b329a8d619994c9.js +0 -0
  53. {recce_nightly-1.16.0.20250817 → recce_nightly-1.16.0.20250819}/recce/data/_next/static/chunks/715e4acc-be8c974e746c0e77.js +0 -0
  54. {recce_nightly-1.16.0.20250817 → recce_nightly-1.16.0.20250819}/recce/data/_next/static/chunks/76-54eeed3fa75d6146.js +0 -0
  55. {recce_nightly-1.16.0.20250817 → recce_nightly-1.16.0.20250819}/recce/data/_next/static/chunks/8d700b6a.6c883c62894c0d11.js +0 -0
  56. {recce_nightly-1.16.0.20250817 → recce_nightly-1.16.0.20250819}/recce/data/_next/static/chunks/975-341ea105d3d5e6ca.js +0 -0
  57. {recce_nightly-1.16.0.20250817 → recce_nightly-1.16.0.20250819}/recce/data/_next/static/chunks/ae307f12-0f5382a8bd52593f.js +0 -0
  58. {recce_nightly-1.16.0.20250817 → recce_nightly-1.16.0.20250819}/recce/data/_next/static/chunks/app/_not-found/page-f6afb3793e4b6ce1.js +0 -0
  59. {recce_nightly-1.16.0.20250817 → recce_nightly-1.16.0.20250819}/recce/data/_next/static/chunks/app/layout-6b127f6a9d30f81d.js +0 -0
  60. {recce_nightly-1.16.0.20250817 → recce_nightly-1.16.0.20250819}/recce/data/_next/static/chunks/c0015c5c-6adfd10682179dba.js +0 -0
  61. {recce_nightly-1.16.0.20250817 → recce_nightly-1.16.0.20250819}/recce/data/_next/static/chunks/c41d1589-27a36c0adae3f11b.js +0 -0
  62. {recce_nightly-1.16.0.20250817 → recce_nightly-1.16.0.20250819}/recce/data/_next/static/chunks/d90cfbaa-10a3b2cefa2eb9ba.js +0 -0
  63. {recce_nightly-1.16.0.20250817 → recce_nightly-1.16.0.20250819}/recce/data/_next/static/chunks/e07c302e-21163cafc81583fb.js +0 -0
  64. {recce_nightly-1.16.0.20250817 → recce_nightly-1.16.0.20250819}/recce/data/_next/static/chunks/fa5fb511-722a622636dc535b.js +0 -0
  65. {recce_nightly-1.16.0.20250817 → recce_nightly-1.16.0.20250819}/recce/data/_next/static/chunks/framework-d3cdc9ad10f589c3.js +0 -0
  66. {recce_nightly-1.16.0.20250817 → recce_nightly-1.16.0.20250819}/recce/data/_next/static/chunks/main-0aa311ca5eab4c3d.js +0 -0
  67. {recce_nightly-1.16.0.20250817 → recce_nightly-1.16.0.20250819}/recce/data/_next/static/chunks/main-app-a6bd599e25466331.js +0 -0
  68. {recce_nightly-1.16.0.20250817 → recce_nightly-1.16.0.20250819}/recce/data/_next/static/chunks/pages/_app-f73a7d040f1ea45c.js +0 -0
  69. {recce_nightly-1.16.0.20250817 → recce_nightly-1.16.0.20250819}/recce/data/_next/static/chunks/pages/_error-c550ce619d2ef6f8.js +0 -0
  70. {recce_nightly-1.16.0.20250817 → recce_nightly-1.16.0.20250819}/recce/data/_next/static/chunks/polyfills-42372ed130431b0a.js +0 -0
  71. {recce_nightly-1.16.0.20250817 → recce_nightly-1.16.0.20250819}/recce/data/_next/static/chunks/webpack-e707d93a7b1691e8.js +0 -0
  72. {recce_nightly-1.16.0.20250817 → recce_nightly-1.16.0.20250819}/recce/data/_next/static/css/8edca58d4abcf908.css +0 -0
  73. {recce_nightly-1.16.0.20250817 → recce_nightly-1.16.0.20250819}/recce/data/_next/static/css/9ba7df14573e8fe7.css +0 -0
  74. {recce_nightly-1.16.0.20250817 → recce_nightly-1.16.0.20250819}/recce/data/_next/static/css/abdb9814a3dd18bb.css +0 -0
  75. {recce_nightly-1.16.0.20250817 → recce_nightly-1.16.0.20250819}/recce/data/_next/static/css/c21263c1520b615b.css +0 -0
  76. {recce_nightly-1.16.0.20250817 → recce_nightly-1.16.0.20250819}/recce/data/_next/static/media/montserrat-cyrillic-800-normal.22628180.woff2 +0 -0
  77. {recce_nightly-1.16.0.20250817 → recce_nightly-1.16.0.20250819}/recce/data/_next/static/media/montserrat-cyrillic-800-normal.bd5c9f50.woff +0 -0
  78. {recce_nightly-1.16.0.20250817 → recce_nightly-1.16.0.20250819}/recce/data/_next/static/media/montserrat-cyrillic-ext-800-normal.94a63aea.woff2 +0 -0
  79. {recce_nightly-1.16.0.20250817 → recce_nightly-1.16.0.20250819}/recce/data/_next/static/media/montserrat-cyrillic-ext-800-normal.e6e0d8d0.woff +0 -0
  80. {recce_nightly-1.16.0.20250817 → recce_nightly-1.16.0.20250819}/recce/data/_next/static/media/montserrat-latin-800-normal.6f8fa298.woff2 +0 -0
  81. {recce_nightly-1.16.0.20250817 → recce_nightly-1.16.0.20250819}/recce/data/_next/static/media/montserrat-latin-800-normal.fc315020.woff +0 -0
  82. {recce_nightly-1.16.0.20250817 → recce_nightly-1.16.0.20250819}/recce/data/_next/static/media/montserrat-latin-ext-800-normal.013b84f9.woff2 +0 -0
  83. {recce_nightly-1.16.0.20250817 → recce_nightly-1.16.0.20250819}/recce/data/_next/static/media/montserrat-latin-ext-800-normal.2e5381b2.woff +0 -0
  84. {recce_nightly-1.16.0.20250817 → recce_nightly-1.16.0.20250819}/recce/data/_next/static/media/montserrat-vietnamese-800-normal.20c545e6.woff +0 -0
  85. {recce_nightly-1.16.0.20250817 → recce_nightly-1.16.0.20250819}/recce/data/_next/static/media/montserrat-vietnamese-800-normal.c0035377.woff2 +0 -0
  86. {recce_nightly-1.16.0.20250817 → recce_nightly-1.16.0.20250819}/recce/data/_next/static/media/reload-image.79aabb7d.svg +0 -0
  87. {recce_nightly-1.16.0.20250817 → recce_nightly-1.16.0.20250819}/recce/data/auth_callback.html +0 -0
  88. {recce_nightly-1.16.0.20250817 → recce_nightly-1.16.0.20250819}/recce/data/favicon.ico +0 -0
  89. {recce_nightly-1.16.0.20250817 → recce_nightly-1.16.0.20250819}/recce/data/imgs/feedback/thumbs-down.png +0 -0
  90. {recce_nightly-1.16.0.20250817 → recce_nightly-1.16.0.20250819}/recce/data/imgs/feedback/thumbs-up.png +0 -0
  91. {recce_nightly-1.16.0.20250817 → recce_nightly-1.16.0.20250819}/recce/data/imgs/reload-image.svg +0 -0
  92. {recce_nightly-1.16.0.20250817 → recce_nightly-1.16.0.20250819}/recce/data/logo/recce-logo-white.png +0 -0
  93. {recce_nightly-1.16.0.20250817 → recce_nightly-1.16.0.20250819}/recce/diff.py +0 -0
  94. {recce_nightly-1.16.0.20250817 → recce_nightly-1.16.0.20250819}/recce/event/CONFIG +0 -0
  95. {recce_nightly-1.16.0.20250817 → recce_nightly-1.16.0.20250819}/recce/event/SENTRY_DNS +0 -0
  96. {recce_nightly-1.16.0.20250817 → recce_nightly-1.16.0.20250819}/recce/event/__init__.py +0 -0
  97. {recce_nightly-1.16.0.20250817 → recce_nightly-1.16.0.20250819}/recce/event/collector.py +0 -0
  98. {recce_nightly-1.16.0.20250817 → recce_nightly-1.16.0.20250819}/recce/event/track.py +0 -0
  99. {recce_nightly-1.16.0.20250817 → recce_nightly-1.16.0.20250819}/recce/exceptions.py +0 -0
  100. {recce_nightly-1.16.0.20250817 → recce_nightly-1.16.0.20250819}/recce/git.py +0 -0
  101. {recce_nightly-1.16.0.20250817 → recce_nightly-1.16.0.20250819}/recce/github.py +0 -0
  102. {recce_nightly-1.16.0.20250817 → recce_nightly-1.16.0.20250819}/recce/models/__init__.py +0 -0
  103. {recce_nightly-1.16.0.20250817 → recce_nightly-1.16.0.20250819}/recce/models/check.py +0 -0
  104. {recce_nightly-1.16.0.20250817 → recce_nightly-1.16.0.20250819}/recce/models/run.py +0 -0
  105. {recce_nightly-1.16.0.20250817 → recce_nightly-1.16.0.20250819}/recce/models/types.py +0 -0
  106. {recce_nightly-1.16.0.20250817 → recce_nightly-1.16.0.20250819}/recce/pull_request.py +0 -0
  107. {recce_nightly-1.16.0.20250817 → recce_nightly-1.16.0.20250819}/recce/run.py +0 -0
  108. {recce_nightly-1.16.0.20250817 → recce_nightly-1.16.0.20250819}/recce/state/__init__.py +0 -0
  109. {recce_nightly-1.16.0.20250817 → recce_nightly-1.16.0.20250819}/recce/state/const.py +0 -0
  110. {recce_nightly-1.16.0.20250817 → recce_nightly-1.16.0.20250819}/recce/state/local.py +0 -0
  111. {recce_nightly-1.16.0.20250817 → recce_nightly-1.16.0.20250819}/recce/state/state.py +0 -0
  112. {recce_nightly-1.16.0.20250817 → recce_nightly-1.16.0.20250819}/recce/summary.py +0 -0
  113. {recce_nightly-1.16.0.20250817 → recce_nightly-1.16.0.20250819}/recce/tasks/__init__.py +0 -0
  114. {recce_nightly-1.16.0.20250817 → recce_nightly-1.16.0.20250819}/recce/tasks/core.py +0 -0
  115. {recce_nightly-1.16.0.20250817 → recce_nightly-1.16.0.20250819}/recce/tasks/dataframe.py +0 -0
  116. {recce_nightly-1.16.0.20250817 → recce_nightly-1.16.0.20250819}/recce/tasks/histogram.py +0 -0
  117. {recce_nightly-1.16.0.20250817 → recce_nightly-1.16.0.20250819}/recce/tasks/lineage.py +0 -0
  118. {recce_nightly-1.16.0.20250817 → recce_nightly-1.16.0.20250819}/recce/tasks/profile.py +0 -0
  119. {recce_nightly-1.16.0.20250817 → recce_nightly-1.16.0.20250819}/recce/tasks/query.py +0 -0
  120. {recce_nightly-1.16.0.20250817 → recce_nightly-1.16.0.20250819}/recce/tasks/rowcount.py +0 -0
  121. {recce_nightly-1.16.0.20250817 → recce_nightly-1.16.0.20250819}/recce/tasks/schema.py +0 -0
  122. {recce_nightly-1.16.0.20250817 → recce_nightly-1.16.0.20250819}/recce/tasks/top_k.py +0 -0
  123. {recce_nightly-1.16.0.20250817 → recce_nightly-1.16.0.20250819}/recce/tasks/valuediff.py +0 -0
  124. {recce_nightly-1.16.0.20250817 → recce_nightly-1.16.0.20250819}/recce/util/__init__.py +0 -0
  125. {recce_nightly-1.16.0.20250817 → recce_nightly-1.16.0.20250819}/recce/util/api_token.py +0 -0
  126. {recce_nightly-1.16.0.20250817 → recce_nightly-1.16.0.20250819}/recce/util/breaking.py +0 -0
  127. {recce_nightly-1.16.0.20250817 → recce_nightly-1.16.0.20250819}/recce/util/cache.py +0 -0
  128. {recce_nightly-1.16.0.20250817 → recce_nightly-1.16.0.20250819}/recce/util/cll.py +0 -0
  129. {recce_nightly-1.16.0.20250817 → recce_nightly-1.16.0.20250819}/recce/util/io.py +0 -0
  130. {recce_nightly-1.16.0.20250817 → recce_nightly-1.16.0.20250819}/recce/util/logger.py +0 -0
  131. {recce_nightly-1.16.0.20250817 → recce_nightly-1.16.0.20250819}/recce/util/onboarding_state.py +0 -0
  132. {recce_nightly-1.16.0.20250817 → recce_nightly-1.16.0.20250819}/recce/util/perf_tracking.py +0 -0
  133. {recce_nightly-1.16.0.20250817 → recce_nightly-1.16.0.20250819}/recce/util/pydantic_model.py +0 -0
  134. {recce_nightly-1.16.0.20250817 → recce_nightly-1.16.0.20250819}/recce/util/singleton.py +0 -0
  135. {recce_nightly-1.16.0.20250817 → recce_nightly-1.16.0.20250819}/recce/yaml/__init__.py +0 -0
  136. {recce_nightly-1.16.0.20250817 → recce_nightly-1.16.0.20250819}/recce_nightly.egg-info/dependency_links.txt +0 -0
  137. {recce_nightly-1.16.0.20250817 → recce_nightly-1.16.0.20250819}/recce_nightly.egg-info/entry_points.txt +0 -0
  138. {recce_nightly-1.16.0.20250817 → recce_nightly-1.16.0.20250819}/recce_nightly.egg-info/requires.txt +0 -0
  139. {recce_nightly-1.16.0.20250817 → recce_nightly-1.16.0.20250819}/recce_nightly.egg-info/top_level.txt +0 -0
  140. {recce_nightly-1.16.0.20250817 → recce_nightly-1.16.0.20250819}/setup.cfg +0 -0
  141. {recce_nightly-1.16.0.20250817 → recce_nightly-1.16.0.20250819}/setup.py +0 -0
  142. {recce_nightly-1.16.0.20250817 → recce_nightly-1.16.0.20250819}/tests/__init__.py +0 -0
  143. {recce_nightly-1.16.0.20250817 → recce_nightly-1.16.0.20250819}/tests/adapter/__init__.py +0 -0
  144. {recce_nightly-1.16.0.20250817 → recce_nightly-1.16.0.20250819}/tests/adapter/dbt_adapter/__init__.py +0 -0
  145. {recce_nightly-1.16.0.20250817 → recce_nightly-1.16.0.20250819}/tests/adapter/dbt_adapter/conftest.py +0 -0
  146. {recce_nightly-1.16.0.20250817 → recce_nightly-1.16.0.20250819}/tests/adapter/dbt_adapter/dbt_test_helper.py +0 -0
  147. {recce_nightly-1.16.0.20250817 → recce_nightly-1.16.0.20250819}/tests/adapter/dbt_adapter/test_dbt_adapter.py +0 -0
  148. {recce_nightly-1.16.0.20250817 → recce_nightly-1.16.0.20250819}/tests/adapter/dbt_adapter/test_dbt_cll.py +0 -0
  149. {recce_nightly-1.16.0.20250817 → recce_nightly-1.16.0.20250819}/tests/adapter/dbt_adapter/test_selector.py +0 -0
  150. {recce_nightly-1.16.0.20250817 → recce_nightly-1.16.0.20250819}/tests/tasks/__init__.py +0 -0
  151. {recce_nightly-1.16.0.20250817 → recce_nightly-1.16.0.20250819}/tests/tasks/conftest.py +0 -0
  152. {recce_nightly-1.16.0.20250817 → recce_nightly-1.16.0.20250819}/tests/tasks/test_histogram.py +0 -0
  153. {recce_nightly-1.16.0.20250817 → recce_nightly-1.16.0.20250819}/tests/tasks/test_lineage.py +0 -0
  154. {recce_nightly-1.16.0.20250817 → recce_nightly-1.16.0.20250819}/tests/tasks/test_preset_checks.py +0 -0
  155. {recce_nightly-1.16.0.20250817 → recce_nightly-1.16.0.20250819}/tests/tasks/test_profile.py +0 -0
  156. {recce_nightly-1.16.0.20250817 → recce_nightly-1.16.0.20250819}/tests/tasks/test_query.py +0 -0
  157. {recce_nightly-1.16.0.20250817 → recce_nightly-1.16.0.20250819}/tests/tasks/test_row_count.py +0 -0
  158. {recce_nightly-1.16.0.20250817 → recce_nightly-1.16.0.20250819}/tests/tasks/test_schema.py +0 -0
  159. {recce_nightly-1.16.0.20250817 → recce_nightly-1.16.0.20250819}/tests/tasks/test_top_k.py +0 -0
  160. {recce_nightly-1.16.0.20250817 → recce_nightly-1.16.0.20250819}/tests/tasks/test_valuediff.py +0 -0
  161. {recce_nightly-1.16.0.20250817 → recce_nightly-1.16.0.20250819}/tests/test_cli.py +0 -0
  162. {recce_nightly-1.16.0.20250817 → recce_nightly-1.16.0.20250819}/tests/test_config.py +0 -0
  163. {recce_nightly-1.16.0.20250817 → recce_nightly-1.16.0.20250819}/tests/test_connect_to_cloud.py +0 -0
  164. {recce_nightly-1.16.0.20250817 → recce_nightly-1.16.0.20250819}/tests/test_core.py +0 -0
  165. {recce_nightly-1.16.0.20250817 → recce_nightly-1.16.0.20250819}/tests/test_dbt.py +0 -0
  166. {recce_nightly-1.16.0.20250817 → recce_nightly-1.16.0.20250819}/tests/test_pull_request.py +0 -0
  167. {recce_nightly-1.16.0.20250817 → recce_nightly-1.16.0.20250819}/tests/test_server.py +0 -0
  168. {recce_nightly-1.16.0.20250817 → recce_nightly-1.16.0.20250819}/tests/test_summary.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: recce-nightly
3
- Version: 1.16.0.20250817
3
+ Version: 1.16.0.20250819
4
4
  Summary: Environment diff tool for dbt
5
5
  Home-page: https://github.com/InfuseAI/recce
6
6
  Author: InfuseAI Dev Team
@@ -0,0 +1 @@
1
+ 1.16.0.20250819
@@ -80,6 +80,64 @@ def archive_artifacts(target_path: str) -> (str, str):
80
80
  return artifacts_tar_gz_path, dbt_version
81
81
 
82
82
 
83
+ def upload_artifacts_to_snapshot(target_path: str, snapshot_id: str, token: str, debug: bool = False):
84
+ """Upload dbt artifacts to a specific snapshot ID in Recce Cloud."""
85
+ console = Console()
86
+ if verify_artifacts_path(target_path) is False:
87
+ console.print(f"[[red]Error[/red]] Invalid target path: {target_path}")
88
+ console.print("Please provide a valid target path containing manifest.json and catalog.json.")
89
+ return 1
90
+
91
+ manifest_path = os.path.join(target_path, "manifest.json")
92
+ catalog_path = os.path.join(target_path, "catalog.json")
93
+
94
+ # get the adapter type from the manifest file
95
+ with open(manifest_path, "r") as f:
96
+ manifest_data = json.load(f)
97
+ adapter_type = manifest_data.get("metadata", {}).get("adapter_type")
98
+ if adapter_type is None:
99
+ raise Exception("Failed to parse adapter type from manifest.json")
100
+
101
+ recce_cloud = RecceCloud(token)
102
+
103
+ snapshot = recce_cloud.get_snapshot(snapshot_id)
104
+
105
+ org_id = snapshot.get("org_id")
106
+ if org_id is None:
107
+ raise Exception(f"Snapshot ID {snapshot_id} does not belong to any organization.")
108
+
109
+ project_id = snapshot.get("project_id")
110
+ if project_id is None:
111
+ raise Exception(f"Snapshot ID {snapshot_id} does not belong to any project.")
112
+
113
+ # Get the presigned URL for uploading the artifacts using snapshot ID
114
+ console.print(f'Uploading artifacts for snapshot ID "{snapshot_id}"')
115
+ presigned_urls = recce_cloud.get_upload_urls_by_snapshot_id(org_id, project_id, snapshot_id)
116
+ if debug:
117
+ console.rule("Debug information", style="blue")
118
+ console.print(f"Org ID: {org_id}")
119
+ console.print(f"Project ID: {project_id}")
120
+ console.print(f"Snapshot ID: {snapshot_id}")
121
+ console.print(f"Manifest path: {presigned_urls['manifest_url']}")
122
+ console.print(f"Catalog path: {presigned_urls['catalog_url']}")
123
+ console.print(f"Adapter type: {adapter_type}")
124
+
125
+ # Upload the compressed artifacts (no password needed for snapshot uploads)
126
+ console.print(f'Uploading manifest from path "{manifest_path}"')
127
+ response = requests.put(presigned_urls["manifest_url"], data=open(manifest_path, "rb").read())
128
+ if response.status_code != 200 and response.status_code != 204:
129
+ raise Exception(response.text)
130
+ console.print(f'Uploading catalog from path "{catalog_path}"')
131
+ response = requests.put(presigned_urls["catalog_url"], data=open(catalog_path, "rb").read())
132
+ if response.status_code != 200 and response.status_code != 204:
133
+ raise Exception(response.text)
134
+
135
+ # Update the snapshot metadata
136
+ recce_cloud.update_snapshot(org_id, project_id, snapshot_id, adapter_type)
137
+
138
+ return 0
139
+
140
+
83
141
  def upload_dbt_artifacts(target_path: str, branch: str, token: str, password: str, debug: bool = False):
84
142
  console = Console()
85
143
  if verify_artifacts_path(target_path) is False:
@@ -8,7 +8,11 @@ import uvicorn
8
8
  from click import Abort
9
9
 
10
10
  from recce import event
11
- from recce.artifact import download_dbt_artifacts, upload_dbt_artifacts
11
+ from recce.artifact import (
12
+ download_dbt_artifacts,
13
+ upload_artifacts_to_snapshot,
14
+ upload_dbt_artifacts,
15
+ )
12
16
  from recce.config import RECCE_CONFIG_FILE, RECCE_ERROR_LOG_FILE, RecceConfig
13
17
  from recce.connect_to_cloud import (
14
18
  generate_key_pair,
@@ -168,6 +172,13 @@ recce_hidden_options = [
168
172
  envvar="RECCE_SHARE_URL",
169
173
  hidden=True,
170
174
  ),
175
+ click.option(
176
+ "--snapshot-id",
177
+ help="The snapshot ID triggers this instance.",
178
+ type=click.STRING,
179
+ envvar="RECCE_SNAPSHOT_ID",
180
+ hidden=True,
181
+ ),
171
182
  ]
172
183
 
173
184
 
@@ -417,11 +428,6 @@ def server(host, port, lifetime, state_file=None, **kwargs):
417
428
  recce server --cloud
418
429
  recce server --review --cloud
419
430
 
420
- \b
421
- # Launch the server using the state from a shared URL. (Requires Recce API token)
422
- export RECCE_API_TOKEN=<your-recce-api-token>
423
- recce server --cloud --share-url <share-url>
424
-
425
431
  """
426
432
 
427
433
  from rich.console import Console
@@ -435,7 +441,12 @@ def server(host, port, lifetime, state_file=None, **kwargs):
435
441
  server_mode = kwargs.get("mode") if kwargs.get("mode") else RecceServerMode.server
436
442
  is_review = kwargs.get("review", False)
437
443
  is_cloud = kwargs.get("cloud", False)
438
- flag = {}
444
+ flag = {
445
+ "single_env_onboarding": False,
446
+ "show_relaunch_hint": False,
447
+ "preview": False,
448
+ "read_only": False,
449
+ }
439
450
  console = Console()
440
451
  cloud_options = None
441
452
 
@@ -449,96 +460,56 @@ def server(host, port, lifetime, state_file=None, **kwargs):
449
460
  }
450
461
 
451
462
  share_url = kwargs.get("share_url")
463
+ snapshot_id = kwargs.get("snapshot_id")
452
464
  if share_url:
453
465
  share_id = share_url.split("/")[-1]
454
466
  if not share_id:
455
467
  console.print("[[red]Error[/red]] Invalid share URL format.")
456
468
  exit(1)
457
469
 
458
- if server_mode == RecceServerMode.server:
459
- flag = {"single_env_onboarding": False, "show_relaunch_hint": False}
460
- if is_cloud:
461
- if share_url:
462
- # recce server --cloud --share-url <share-url>
463
- # Use state file stored for the share url
464
- # Forces use of the review mode.
465
- is_review = kwargs["review"] = True
466
- cloud_options = {
467
- "host": kwargs.get("state_file_host"),
468
- "api_token": api_token,
469
- "share_id": share_id,
470
- }
471
- else:
472
- # recce server --cloud
473
- # recce server --cloud --review
474
- # Use state file stored for the PR of the current branch
475
- cloud_options = {
476
- "host": kwargs.get("state_file_host"),
477
- "github_token": kwargs.get("cloud_token"),
478
- "password": kwargs.get("password"),
479
- }
480
-
481
- # Check Single Environment Onboarding Mode if the review mode is False
482
- project_dir_path = Path(kwargs.get("project_dir") or "./")
483
- target_base_path = project_dir_path.joinpath(Path(kwargs.get("target_base_path", "target-base")))
484
- if not target_base_path.is_dir() and not is_review:
485
- # Mark as single env onboarding mode if user provides the target-path only
486
- flag["single_env_onboarding"] = True
487
- flag["show_relaunch_hint"] = True
488
- # Use the target path as the base path
489
- kwargs["target_base_path"] = kwargs.get("target_path")
490
- elif server_mode == RecceServerMode.preview:
491
- if is_cloud:
492
- # recce server --cloud --share-url <share-url> --mode preview
493
- # Use state file stored for the share url
494
- #
495
- # Preview mode disable these features
496
- # - run query
497
- #
498
- # Usage:
499
- # Used in cloud managed instance. For cloud onboarding to preview the uploaded artifacts.
470
+ if is_cloud:
471
+ # Cloud mode
472
+ if share_url:
473
+ is_review = kwargs["review"] = True
500
474
  cloud_options = {
501
475
  "host": kwargs.get("state_file_host"),
502
476
  "api_token": api_token,
503
477
  "share_id": share_id,
504
478
  }
505
- else:
506
- # recce server --mode preview recce_state.json
507
- if state_file is None:
508
- console.print("[[red]Error[/red]] The state_file is required in 'Preview' mode.")
509
- console.print("Please provide recce_state json file exported by Recce OSS.")
510
- exit(1)
511
- is_review = kwargs["review"] = True
512
- flag = {
513
- "preview": True,
514
- }
515
- elif server_mode == RecceServerMode.read_only:
516
- if is_cloud:
517
- # recce server --cloud --share-url <share-url> --mode read-only
518
- # Use state file stored for the share url
519
- #
520
- # Read-only mode disable these features
521
- # - run query
522
- # - use checklist
523
- # - share
524
- #
525
- # Usage:
526
- # Used in cloud managed instance. Launch when user click a share link.
479
+ elif snapshot_id:
480
+ is_review = kwargs["review"] = True
527
481
  cloud_options = {
528
482
  "host": kwargs.get("state_file_host"),
529
483
  "api_token": api_token,
530
- "share_id": share_id,
484
+ "snapshot_id": snapshot_id,
531
485
  }
532
486
  else:
533
- # recce server --mode read-only recce_state.json
534
- if state_file is None:
535
- console.print("[[red]Error[/red]] The state_file is required in 'Read-Only' mode.")
536
- console.print("Please provide recce_state json file exported by Recce OSS.")
537
- exit(1)
538
- is_review = kwargs["review"] = True
539
- flag = {
540
- "read_only": True,
541
- }
487
+ cloud_options = {
488
+ "host": kwargs.get("state_file_host"),
489
+ "github_token": kwargs.get("cloud_token"),
490
+ "password": kwargs.get("password"),
491
+ }
492
+ else:
493
+ # Check Single Environment Onboarding Mode if the review mode is False
494
+ project_dir_path = Path(kwargs.get("project_dir") or "./")
495
+ target_base_path = project_dir_path.joinpath(Path(kwargs.get("target_base_path", "target-base")))
496
+ if not target_base_path.is_dir() and not is_review:
497
+ # Mark as single env onboarding mode if user provides the target-path only
498
+ flag["single_env_onboarding"] = True
499
+ flag["show_relaunch_hint"] = True
500
+ # Use the target path as the base path
501
+ kwargs["target_base_path"] = kwargs.get("target_path")
502
+
503
+ # Server mode:
504
+ #
505
+ # It's used to determine the features disabled in the Web UI. Only used in the cloud-managed recce instances.
506
+ #
507
+ # Read-Only: No run query, no checklist
508
+ # Preview (Metadata-Only): No run query
509
+ if server_mode == RecceServerMode.preview:
510
+ flag["preview"] = True
511
+ elif server_mode == RecceServerMode.read_only:
512
+ flag["read_only"] = True
542
513
 
543
514
  # Onboarding State logic update here
544
515
  update_onboarding_state(api_token, flag.get("single_env_onboarding"))
@@ -1293,6 +1264,75 @@ def share(state_file, **kwargs):
1293
1264
  exit(1)
1294
1265
 
1295
1266
 
1267
+ @cli.command(cls=TrackCommand, hidden=True)
1268
+ @click.option(
1269
+ "--snapshot-id",
1270
+ help="The snapshot ID to upload artifacts to cloud.",
1271
+ type=click.STRING,
1272
+ envvar="RECCE_SNAPSHOT_ID",
1273
+ required=True,
1274
+ )
1275
+ @click.option(
1276
+ "--target-path",
1277
+ help="dbt artifacts directory for your artifacts.",
1278
+ type=click.STRING,
1279
+ default="target",
1280
+ show_default=True,
1281
+ )
1282
+ @click.option(
1283
+ "--api-token", help="The personal token generated by Recce Cloud.", type=click.STRING, envvar="RECCE_API_TOKEN"
1284
+ )
1285
+ @add_options(recce_options)
1286
+ def snapshot(**kwargs):
1287
+ """
1288
+ Upload target/manifest.json and target/catalog.json to the specific snapshot ID
1289
+
1290
+ Upload the dbt artifacts (manifest.json, catalog.json) to Recce Cloud for the given snapshot ID.
1291
+ This allows you to associate artifacts with a specific snapshot for later use.
1292
+
1293
+ Examples:\n
1294
+
1295
+ \b
1296
+ # Upload artifacts to a snapshot ID
1297
+ recce snapshot --snapshot-id <snapshot-id>
1298
+
1299
+ \b
1300
+ # Upload artifacts from custom target path to a snapshot ID
1301
+ recce snapshot --snapshot-id <snapshot-id> --target-path my-target
1302
+ """
1303
+ from rich.console import Console
1304
+
1305
+ console = Console()
1306
+ handle_debug_flag(**kwargs)
1307
+
1308
+ # Initialize Recce Config
1309
+ RecceConfig(config_file=kwargs.get("config"))
1310
+
1311
+ try:
1312
+ api_token = prepare_api_token(**kwargs)
1313
+ except RecceConfigException:
1314
+ show_invalid_api_token_message()
1315
+ exit(1)
1316
+
1317
+ snapshot_id = kwargs.get("snapshot_id")
1318
+ target_path = kwargs.get("target_path")
1319
+
1320
+ try:
1321
+ rc = upload_artifacts_to_snapshot(
1322
+ target_path, snapshot_id=snapshot_id, token=api_token, debug=kwargs.get("debug", False)
1323
+ )
1324
+ console.rule("Uploaded Successfully")
1325
+ console.print(
1326
+ f'Uploaded dbt artifacts to Recce Cloud for snapshot ID "{snapshot_id}" from "{os.path.abspath(target_path)}"'
1327
+ )
1328
+ except Exception as e:
1329
+ console.rule("Failed to Snapshot", style="red")
1330
+ console.print(f"[[red]Error[/red]] Failed to upload the dbt artifacts to the snapshot {snapshot_id}.")
1331
+ console.print(f"Reason: {e}")
1332
+ rc = 1
1333
+ return rc
1334
+
1335
+
1296
1336
  @cli.command(hidden=True, cls=TrackCommand)
1297
1337
  @click.argument("state_file", required=True)
1298
1338
  @click.option("--host", default="localhost", show_default=True, help="The host to bind to.")