recce-nightly 1.16.0.20250818__tar.gz → 1.16.0.20250819.post1__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.
Potentially problematic release.
This version of recce-nightly might be problematic. Click here for more details.
- {recce_nightly-1.16.0.20250818/recce_nightly.egg-info → recce_nightly-1.16.0.20250819.post1}/PKG-INFO +1 -1
- recce_nightly-1.16.0.20250819.post1/recce/VERSION +1 -0
- {recce_nightly-1.16.0.20250818 → recce_nightly-1.16.0.20250819.post1}/recce/artifact.py +58 -0
- {recce_nightly-1.16.0.20250818 → recce_nightly-1.16.0.20250819.post1}/recce/cli.py +121 -81
- {recce_nightly-1.16.0.20250818 → recce_nightly-1.16.0.20250819.post1}/recce/data/404.html +1 -1
- recce_nightly-1.16.0.20250818/recce/data/_next/static/chunks/490-ce854af0bc670d3e.js → recce_nightly-1.16.0.20250819.post1/recce/data/_next/static/chunks/490-fdbe0c19eed355c6.js +1 -1
- recce_nightly-1.16.0.20250818/recce/data/_next/static/chunks/app/page-6e7f45c0d0eb69b3.js → recce_nightly-1.16.0.20250819.post1/recce/data/_next/static/chunks/app/page-58963bcee0b7da7f.js +1 -1
- {recce_nightly-1.16.0.20250818 → recce_nightly-1.16.0.20250819.post1}/recce/data/index.html +1 -1
- {recce_nightly-1.16.0.20250818 → recce_nightly-1.16.0.20250819.post1}/recce/data/index.txt +4 -4
- {recce_nightly-1.16.0.20250818 → recce_nightly-1.16.0.20250819.post1}/recce/server.py +4 -0
- recce_nightly-1.16.0.20250819.post1/recce/state/cloud.py +621 -0
- {recce_nightly-1.16.0.20250818 → recce_nightly-1.16.0.20250819.post1}/recce/state/state_loader.py +15 -18
- {recce_nightly-1.16.0.20250818 → recce_nightly-1.16.0.20250819.post1}/recce/util/lineage.py +14 -18
- {recce_nightly-1.16.0.20250818 → recce_nightly-1.16.0.20250819.post1}/recce/util/recce_cloud.py +119 -4
- {recce_nightly-1.16.0.20250818 → recce_nightly-1.16.0.20250819.post1/recce_nightly.egg-info}/PKG-INFO +1 -1
- {recce_nightly-1.16.0.20250818 → recce_nightly-1.16.0.20250819.post1}/recce_nightly.egg-info/SOURCES.txt +4 -4
- recce_nightly-1.16.0.20250818/recce/VERSION +0 -1
- recce_nightly-1.16.0.20250818/recce/state/cloud.py +0 -384
- {recce_nightly-1.16.0.20250818 → recce_nightly-1.16.0.20250819.post1}/LICENSE +0 -0
- {recce_nightly-1.16.0.20250818 → recce_nightly-1.16.0.20250819.post1}/README.md +0 -0
- {recce_nightly-1.16.0.20250818 → recce_nightly-1.16.0.20250819.post1}/pyproject.toml +0 -0
- {recce_nightly-1.16.0.20250818 → recce_nightly-1.16.0.20250819.post1}/recce/__init__.py +0 -0
- {recce_nightly-1.16.0.20250818 → recce_nightly-1.16.0.20250819.post1}/recce/adapter/__init__.py +0 -0
- {recce_nightly-1.16.0.20250818 → recce_nightly-1.16.0.20250819.post1}/recce/adapter/base.py +0 -0
- {recce_nightly-1.16.0.20250818 → recce_nightly-1.16.0.20250819.post1}/recce/adapter/dbt_adapter/__init__.py +0 -0
- {recce_nightly-1.16.0.20250818 → recce_nightly-1.16.0.20250819.post1}/recce/adapter/dbt_adapter/dbt_version.py +0 -0
- {recce_nightly-1.16.0.20250818 → recce_nightly-1.16.0.20250819.post1}/recce/adapter/sqlmesh_adapter.py +0 -0
- {recce_nightly-1.16.0.20250818 → recce_nightly-1.16.0.20250819.post1}/recce/apis/__init__.py +0 -0
- {recce_nightly-1.16.0.20250818 → recce_nightly-1.16.0.20250819.post1}/recce/apis/check_api.py +0 -0
- {recce_nightly-1.16.0.20250818 → recce_nightly-1.16.0.20250819.post1}/recce/apis/check_func.py +0 -0
- {recce_nightly-1.16.0.20250818 → recce_nightly-1.16.0.20250819.post1}/recce/apis/run_api.py +0 -0
- {recce_nightly-1.16.0.20250818 → recce_nightly-1.16.0.20250819.post1}/recce/apis/run_func.py +0 -0
- {recce_nightly-1.16.0.20250818 → recce_nightly-1.16.0.20250819.post1}/recce/config.py +0 -0
- {recce_nightly-1.16.0.20250818 → recce_nightly-1.16.0.20250819.post1}/recce/connect_to_cloud.py +0 -0
- {recce_nightly-1.16.0.20250818 → recce_nightly-1.16.0.20250819.post1}/recce/core.py +0 -0
- {recce_nightly-1.16.0.20250818/recce/data/_next/static/d0qQncgA8AYvUNmN0xWu9 → recce_nightly-1.16.0.20250819.post1/recce/data/_next/static/bHJE3DJUFXWTWw7acBP02}/_buildManifest.js +0 -0
- {recce_nightly-1.16.0.20250818/recce/data/_next/static/d0qQncgA8AYvUNmN0xWu9 → recce_nightly-1.16.0.20250819.post1/recce/data/_next/static/bHJE3DJUFXWTWw7acBP02}/_ssgManifest.js +0 -0
- {recce_nightly-1.16.0.20250818 → recce_nightly-1.16.0.20250819.post1}/recce/data/_next/static/chunks/068b80ea-7fab85837b21fed5.js +0 -0
- {recce_nightly-1.16.0.20250818 → recce_nightly-1.16.0.20250819.post1}/recce/data/_next/static/chunks/0ddaf06c-05b8d2a8a3e5c6f3.js +0 -0
- {recce_nightly-1.16.0.20250818 → recce_nightly-1.16.0.20250819.post1}/recce/data/_next/static/chunks/12f8fac4-170216f89d5576c6.js +0 -0
- {recce_nightly-1.16.0.20250818 → recce_nightly-1.16.0.20250819.post1}/recce/data/_next/static/chunks/235b8375-c2d62e0b44e3ae74.js +0 -0
- {recce_nightly-1.16.0.20250818 → recce_nightly-1.16.0.20250819.post1}/recce/data/_next/static/chunks/2541941f-d65696bd5d37dfa2.js +0 -0
- {recce_nightly-1.16.0.20250818 → recce_nightly-1.16.0.20250819.post1}/recce/data/_next/static/chunks/25c097a4-51d7c9060de49a6c.js +0 -0
- {recce_nightly-1.16.0.20250818 → recce_nightly-1.16.0.20250819.post1}/recce/data/_next/static/chunks/27e92eb0-4d8ec3c6cdf0d5f1.js +0 -0
- {recce_nightly-1.16.0.20250818 → recce_nightly-1.16.0.20250819.post1}/recce/data/_next/static/chunks/2fc37c1e-fd3c94ef85344810.js +0 -0
- {recce_nightly-1.16.0.20250818 → recce_nightly-1.16.0.20250819.post1}/recce/data/_next/static/chunks/370-bd3e0bf7237858bc.js +0 -0
- {recce_nightly-1.16.0.20250818 → recce_nightly-1.16.0.20250819.post1}/recce/data/_next/static/chunks/3a92ee20-a33bb5964d0b2f37.js +0 -0
- {recce_nightly-1.16.0.20250818 → recce_nightly-1.16.0.20250819.post1}/recce/data/_next/static/chunks/575-2443813ff441d02c.js +0 -0
- {recce_nightly-1.16.0.20250818 → recce_nightly-1.16.0.20250819.post1}/recce/data/_next/static/chunks/62446465-5277e7ad93431c07.js +0 -0
- {recce_nightly-1.16.0.20250818 → recce_nightly-1.16.0.20250819.post1}/recce/data/_next/static/chunks/6af7f9e9-1b5f068628caacd4.js +0 -0
- {recce_nightly-1.16.0.20250818 → recce_nightly-1.16.0.20250819.post1}/recce/data/_next/static/chunks/6cf54382-9bc9b4c7b7e4b8d8.js +0 -0
- {recce_nightly-1.16.0.20250818 → recce_nightly-1.16.0.20250819.post1}/recce/data/_next/static/chunks/6dc81886-2b329a8d619994c9.js +0 -0
- {recce_nightly-1.16.0.20250818 → recce_nightly-1.16.0.20250819.post1}/recce/data/_next/static/chunks/715e4acc-be8c974e746c0e77.js +0 -0
- {recce_nightly-1.16.0.20250818 → recce_nightly-1.16.0.20250819.post1}/recce/data/_next/static/chunks/76-54eeed3fa75d6146.js +0 -0
- {recce_nightly-1.16.0.20250818 → recce_nightly-1.16.0.20250819.post1}/recce/data/_next/static/chunks/8d700b6a.6c883c62894c0d11.js +0 -0
- {recce_nightly-1.16.0.20250818 → recce_nightly-1.16.0.20250819.post1}/recce/data/_next/static/chunks/975-341ea105d3d5e6ca.js +0 -0
- {recce_nightly-1.16.0.20250818 → recce_nightly-1.16.0.20250819.post1}/recce/data/_next/static/chunks/ae307f12-0f5382a8bd52593f.js +0 -0
- {recce_nightly-1.16.0.20250818 → recce_nightly-1.16.0.20250819.post1}/recce/data/_next/static/chunks/app/_not-found/page-f6afb3793e4b6ce1.js +0 -0
- {recce_nightly-1.16.0.20250818 → recce_nightly-1.16.0.20250819.post1}/recce/data/_next/static/chunks/app/layout-6b127f6a9d30f81d.js +0 -0
- {recce_nightly-1.16.0.20250818 → recce_nightly-1.16.0.20250819.post1}/recce/data/_next/static/chunks/c0015c5c-6adfd10682179dba.js +0 -0
- {recce_nightly-1.16.0.20250818 → recce_nightly-1.16.0.20250819.post1}/recce/data/_next/static/chunks/c41d1589-27a36c0adae3f11b.js +0 -0
- {recce_nightly-1.16.0.20250818 → recce_nightly-1.16.0.20250819.post1}/recce/data/_next/static/chunks/d90cfbaa-10a3b2cefa2eb9ba.js +0 -0
- {recce_nightly-1.16.0.20250818 → recce_nightly-1.16.0.20250819.post1}/recce/data/_next/static/chunks/e07c302e-21163cafc81583fb.js +0 -0
- {recce_nightly-1.16.0.20250818 → recce_nightly-1.16.0.20250819.post1}/recce/data/_next/static/chunks/fa5fb511-722a622636dc535b.js +0 -0
- {recce_nightly-1.16.0.20250818 → recce_nightly-1.16.0.20250819.post1}/recce/data/_next/static/chunks/framework-d3cdc9ad10f589c3.js +0 -0
- {recce_nightly-1.16.0.20250818 → recce_nightly-1.16.0.20250819.post1}/recce/data/_next/static/chunks/main-0aa311ca5eab4c3d.js +0 -0
- {recce_nightly-1.16.0.20250818 → recce_nightly-1.16.0.20250819.post1}/recce/data/_next/static/chunks/main-app-a6bd599e25466331.js +0 -0
- {recce_nightly-1.16.0.20250818 → recce_nightly-1.16.0.20250819.post1}/recce/data/_next/static/chunks/pages/_app-f73a7d040f1ea45c.js +0 -0
- {recce_nightly-1.16.0.20250818 → recce_nightly-1.16.0.20250819.post1}/recce/data/_next/static/chunks/pages/_error-c550ce619d2ef6f8.js +0 -0
- {recce_nightly-1.16.0.20250818 → recce_nightly-1.16.0.20250819.post1}/recce/data/_next/static/chunks/polyfills-42372ed130431b0a.js +0 -0
- {recce_nightly-1.16.0.20250818 → recce_nightly-1.16.0.20250819.post1}/recce/data/_next/static/chunks/webpack-e707d93a7b1691e8.js +0 -0
- {recce_nightly-1.16.0.20250818 → recce_nightly-1.16.0.20250819.post1}/recce/data/_next/static/css/8edca58d4abcf908.css +0 -0
- {recce_nightly-1.16.0.20250818 → recce_nightly-1.16.0.20250819.post1}/recce/data/_next/static/css/9ba7df14573e8fe7.css +0 -0
- {recce_nightly-1.16.0.20250818 → recce_nightly-1.16.0.20250819.post1}/recce/data/_next/static/css/abdb9814a3dd18bb.css +0 -0
- {recce_nightly-1.16.0.20250818 → recce_nightly-1.16.0.20250819.post1}/recce/data/_next/static/css/c21263c1520b615b.css +0 -0
- {recce_nightly-1.16.0.20250818 → recce_nightly-1.16.0.20250819.post1}/recce/data/_next/static/media/montserrat-cyrillic-800-normal.22628180.woff2 +0 -0
- {recce_nightly-1.16.0.20250818 → recce_nightly-1.16.0.20250819.post1}/recce/data/_next/static/media/montserrat-cyrillic-800-normal.bd5c9f50.woff +0 -0
- {recce_nightly-1.16.0.20250818 → recce_nightly-1.16.0.20250819.post1}/recce/data/_next/static/media/montserrat-cyrillic-ext-800-normal.94a63aea.woff2 +0 -0
- {recce_nightly-1.16.0.20250818 → recce_nightly-1.16.0.20250819.post1}/recce/data/_next/static/media/montserrat-cyrillic-ext-800-normal.e6e0d8d0.woff +0 -0
- {recce_nightly-1.16.0.20250818 → recce_nightly-1.16.0.20250819.post1}/recce/data/_next/static/media/montserrat-latin-800-normal.6f8fa298.woff2 +0 -0
- {recce_nightly-1.16.0.20250818 → recce_nightly-1.16.0.20250819.post1}/recce/data/_next/static/media/montserrat-latin-800-normal.fc315020.woff +0 -0
- {recce_nightly-1.16.0.20250818 → recce_nightly-1.16.0.20250819.post1}/recce/data/_next/static/media/montserrat-latin-ext-800-normal.013b84f9.woff2 +0 -0
- {recce_nightly-1.16.0.20250818 → recce_nightly-1.16.0.20250819.post1}/recce/data/_next/static/media/montserrat-latin-ext-800-normal.2e5381b2.woff +0 -0
- {recce_nightly-1.16.0.20250818 → recce_nightly-1.16.0.20250819.post1}/recce/data/_next/static/media/montserrat-vietnamese-800-normal.20c545e6.woff +0 -0
- {recce_nightly-1.16.0.20250818 → recce_nightly-1.16.0.20250819.post1}/recce/data/_next/static/media/montserrat-vietnamese-800-normal.c0035377.woff2 +0 -0
- {recce_nightly-1.16.0.20250818 → recce_nightly-1.16.0.20250819.post1}/recce/data/_next/static/media/reload-image.79aabb7d.svg +0 -0
- {recce_nightly-1.16.0.20250818 → recce_nightly-1.16.0.20250819.post1}/recce/data/auth_callback.html +0 -0
- {recce_nightly-1.16.0.20250818 → recce_nightly-1.16.0.20250819.post1}/recce/data/favicon.ico +0 -0
- {recce_nightly-1.16.0.20250818 → recce_nightly-1.16.0.20250819.post1}/recce/data/imgs/feedback/thumbs-down.png +0 -0
- {recce_nightly-1.16.0.20250818 → recce_nightly-1.16.0.20250819.post1}/recce/data/imgs/feedback/thumbs-up.png +0 -0
- {recce_nightly-1.16.0.20250818 → recce_nightly-1.16.0.20250819.post1}/recce/data/imgs/reload-image.svg +0 -0
- {recce_nightly-1.16.0.20250818 → recce_nightly-1.16.0.20250819.post1}/recce/data/logo/recce-logo-white.png +0 -0
- {recce_nightly-1.16.0.20250818 → recce_nightly-1.16.0.20250819.post1}/recce/diff.py +0 -0
- {recce_nightly-1.16.0.20250818 → recce_nightly-1.16.0.20250819.post1}/recce/event/CONFIG +0 -0
- {recce_nightly-1.16.0.20250818 → recce_nightly-1.16.0.20250819.post1}/recce/event/SENTRY_DNS +0 -0
- {recce_nightly-1.16.0.20250818 → recce_nightly-1.16.0.20250819.post1}/recce/event/__init__.py +0 -0
- {recce_nightly-1.16.0.20250818 → recce_nightly-1.16.0.20250819.post1}/recce/event/collector.py +0 -0
- {recce_nightly-1.16.0.20250818 → recce_nightly-1.16.0.20250819.post1}/recce/event/track.py +0 -0
- {recce_nightly-1.16.0.20250818 → recce_nightly-1.16.0.20250819.post1}/recce/exceptions.py +0 -0
- {recce_nightly-1.16.0.20250818 → recce_nightly-1.16.0.20250819.post1}/recce/git.py +0 -0
- {recce_nightly-1.16.0.20250818 → recce_nightly-1.16.0.20250819.post1}/recce/github.py +0 -0
- {recce_nightly-1.16.0.20250818 → recce_nightly-1.16.0.20250819.post1}/recce/models/__init__.py +0 -0
- {recce_nightly-1.16.0.20250818 → recce_nightly-1.16.0.20250819.post1}/recce/models/check.py +0 -0
- {recce_nightly-1.16.0.20250818 → recce_nightly-1.16.0.20250819.post1}/recce/models/run.py +0 -0
- {recce_nightly-1.16.0.20250818 → recce_nightly-1.16.0.20250819.post1}/recce/models/types.py +0 -0
- {recce_nightly-1.16.0.20250818 → recce_nightly-1.16.0.20250819.post1}/recce/pull_request.py +0 -0
- {recce_nightly-1.16.0.20250818 → recce_nightly-1.16.0.20250819.post1}/recce/run.py +0 -0
- {recce_nightly-1.16.0.20250818 → recce_nightly-1.16.0.20250819.post1}/recce/state/__init__.py +0 -0
- {recce_nightly-1.16.0.20250818 → recce_nightly-1.16.0.20250819.post1}/recce/state/const.py +0 -0
- {recce_nightly-1.16.0.20250818 → recce_nightly-1.16.0.20250819.post1}/recce/state/local.py +0 -0
- {recce_nightly-1.16.0.20250818 → recce_nightly-1.16.0.20250819.post1}/recce/state/state.py +0 -0
- {recce_nightly-1.16.0.20250818 → recce_nightly-1.16.0.20250819.post1}/recce/summary.py +0 -0
- {recce_nightly-1.16.0.20250818 → recce_nightly-1.16.0.20250819.post1}/recce/tasks/__init__.py +0 -0
- {recce_nightly-1.16.0.20250818 → recce_nightly-1.16.0.20250819.post1}/recce/tasks/core.py +0 -0
- {recce_nightly-1.16.0.20250818 → recce_nightly-1.16.0.20250819.post1}/recce/tasks/dataframe.py +0 -0
- {recce_nightly-1.16.0.20250818 → recce_nightly-1.16.0.20250819.post1}/recce/tasks/histogram.py +0 -0
- {recce_nightly-1.16.0.20250818 → recce_nightly-1.16.0.20250819.post1}/recce/tasks/lineage.py +0 -0
- {recce_nightly-1.16.0.20250818 → recce_nightly-1.16.0.20250819.post1}/recce/tasks/profile.py +0 -0
- {recce_nightly-1.16.0.20250818 → recce_nightly-1.16.0.20250819.post1}/recce/tasks/query.py +0 -0
- {recce_nightly-1.16.0.20250818 → recce_nightly-1.16.0.20250819.post1}/recce/tasks/rowcount.py +0 -0
- {recce_nightly-1.16.0.20250818 → recce_nightly-1.16.0.20250819.post1}/recce/tasks/schema.py +0 -0
- {recce_nightly-1.16.0.20250818 → recce_nightly-1.16.0.20250819.post1}/recce/tasks/top_k.py +0 -0
- {recce_nightly-1.16.0.20250818 → recce_nightly-1.16.0.20250819.post1}/recce/tasks/valuediff.py +0 -0
- {recce_nightly-1.16.0.20250818 → recce_nightly-1.16.0.20250819.post1}/recce/util/__init__.py +0 -0
- {recce_nightly-1.16.0.20250818 → recce_nightly-1.16.0.20250819.post1}/recce/util/api_token.py +0 -0
- {recce_nightly-1.16.0.20250818 → recce_nightly-1.16.0.20250819.post1}/recce/util/breaking.py +0 -0
- {recce_nightly-1.16.0.20250818 → recce_nightly-1.16.0.20250819.post1}/recce/util/cache.py +0 -0
- {recce_nightly-1.16.0.20250818 → recce_nightly-1.16.0.20250819.post1}/recce/util/cll.py +0 -0
- {recce_nightly-1.16.0.20250818 → recce_nightly-1.16.0.20250819.post1}/recce/util/io.py +0 -0
- {recce_nightly-1.16.0.20250818 → recce_nightly-1.16.0.20250819.post1}/recce/util/logger.py +0 -0
- {recce_nightly-1.16.0.20250818 → recce_nightly-1.16.0.20250819.post1}/recce/util/onboarding_state.py +0 -0
- {recce_nightly-1.16.0.20250818 → recce_nightly-1.16.0.20250819.post1}/recce/util/perf_tracking.py +0 -0
- {recce_nightly-1.16.0.20250818 → recce_nightly-1.16.0.20250819.post1}/recce/util/pydantic_model.py +0 -0
- {recce_nightly-1.16.0.20250818 → recce_nightly-1.16.0.20250819.post1}/recce/util/singleton.py +0 -0
- {recce_nightly-1.16.0.20250818 → recce_nightly-1.16.0.20250819.post1}/recce/yaml/__init__.py +0 -0
- {recce_nightly-1.16.0.20250818 → recce_nightly-1.16.0.20250819.post1}/recce_nightly.egg-info/dependency_links.txt +0 -0
- {recce_nightly-1.16.0.20250818 → recce_nightly-1.16.0.20250819.post1}/recce_nightly.egg-info/entry_points.txt +0 -0
- {recce_nightly-1.16.0.20250818 → recce_nightly-1.16.0.20250819.post1}/recce_nightly.egg-info/requires.txt +0 -0
- {recce_nightly-1.16.0.20250818 → recce_nightly-1.16.0.20250819.post1}/recce_nightly.egg-info/top_level.txt +0 -0
- {recce_nightly-1.16.0.20250818 → recce_nightly-1.16.0.20250819.post1}/setup.cfg +0 -0
- {recce_nightly-1.16.0.20250818 → recce_nightly-1.16.0.20250819.post1}/setup.py +0 -0
- {recce_nightly-1.16.0.20250818 → recce_nightly-1.16.0.20250819.post1}/tests/__init__.py +0 -0
- {recce_nightly-1.16.0.20250818 → recce_nightly-1.16.0.20250819.post1}/tests/adapter/__init__.py +0 -0
- {recce_nightly-1.16.0.20250818 → recce_nightly-1.16.0.20250819.post1}/tests/adapter/dbt_adapter/__init__.py +0 -0
- {recce_nightly-1.16.0.20250818 → recce_nightly-1.16.0.20250819.post1}/tests/adapter/dbt_adapter/conftest.py +0 -0
- {recce_nightly-1.16.0.20250818 → recce_nightly-1.16.0.20250819.post1}/tests/adapter/dbt_adapter/dbt_test_helper.py +0 -0
- {recce_nightly-1.16.0.20250818 → recce_nightly-1.16.0.20250819.post1}/tests/adapter/dbt_adapter/test_dbt_adapter.py +0 -0
- {recce_nightly-1.16.0.20250818 → recce_nightly-1.16.0.20250819.post1}/tests/adapter/dbt_adapter/test_dbt_cll.py +0 -0
- {recce_nightly-1.16.0.20250818 → recce_nightly-1.16.0.20250819.post1}/tests/adapter/dbt_adapter/test_selector.py +0 -0
- {recce_nightly-1.16.0.20250818 → recce_nightly-1.16.0.20250819.post1}/tests/tasks/__init__.py +0 -0
- {recce_nightly-1.16.0.20250818 → recce_nightly-1.16.0.20250819.post1}/tests/tasks/conftest.py +0 -0
- {recce_nightly-1.16.0.20250818 → recce_nightly-1.16.0.20250819.post1}/tests/tasks/test_histogram.py +0 -0
- {recce_nightly-1.16.0.20250818 → recce_nightly-1.16.0.20250819.post1}/tests/tasks/test_lineage.py +0 -0
- {recce_nightly-1.16.0.20250818 → recce_nightly-1.16.0.20250819.post1}/tests/tasks/test_preset_checks.py +0 -0
- {recce_nightly-1.16.0.20250818 → recce_nightly-1.16.0.20250819.post1}/tests/tasks/test_profile.py +0 -0
- {recce_nightly-1.16.0.20250818 → recce_nightly-1.16.0.20250819.post1}/tests/tasks/test_query.py +0 -0
- {recce_nightly-1.16.0.20250818 → recce_nightly-1.16.0.20250819.post1}/tests/tasks/test_row_count.py +0 -0
- {recce_nightly-1.16.0.20250818 → recce_nightly-1.16.0.20250819.post1}/tests/tasks/test_schema.py +0 -0
- {recce_nightly-1.16.0.20250818 → recce_nightly-1.16.0.20250819.post1}/tests/tasks/test_top_k.py +0 -0
- {recce_nightly-1.16.0.20250818 → recce_nightly-1.16.0.20250819.post1}/tests/tasks/test_valuediff.py +0 -0
- {recce_nightly-1.16.0.20250818 → recce_nightly-1.16.0.20250819.post1}/tests/test_cli.py +0 -0
- {recce_nightly-1.16.0.20250818 → recce_nightly-1.16.0.20250819.post1}/tests/test_config.py +0 -0
- {recce_nightly-1.16.0.20250818 → recce_nightly-1.16.0.20250819.post1}/tests/test_connect_to_cloud.py +0 -0
- {recce_nightly-1.16.0.20250818 → recce_nightly-1.16.0.20250819.post1}/tests/test_core.py +0 -0
- {recce_nightly-1.16.0.20250818 → recce_nightly-1.16.0.20250819.post1}/tests/test_dbt.py +0 -0
- {recce_nightly-1.16.0.20250818 → recce_nightly-1.16.0.20250819.post1}/tests/test_pull_request.py +0 -0
- {recce_nightly-1.16.0.20250818 → recce_nightly-1.16.0.20250819.post1}/tests/test_server.py +0 -0
- {recce_nightly-1.16.0.20250818 → recce_nightly-1.16.0.20250819.post1}/tests/test_summary.py +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
1.16.0.20250819-post1
|
|
@@ -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
|
|
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
|
|
459
|
-
|
|
460
|
-
if
|
|
461
|
-
|
|
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
|
-
|
|
506
|
-
|
|
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
|
-
"
|
|
484
|
+
"snapshot_id": snapshot_id,
|
|
531
485
|
}
|
|
532
486
|
else:
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
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.")
|