recce-nightly 1.8.0.20250615__tar.gz → 1.8.0.20250617__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.8.0.20250615/recce_nightly.egg-info → recce_nightly-1.8.0.20250617}/PKG-INFO +1 -1
- recce_nightly-1.8.0.20250617/recce/VERSION +1 -0
- {recce_nightly-1.8.0.20250615 → recce_nightly-1.8.0.20250617}/recce/adapter/dbt_adapter/__init__.py +213 -102
- {recce_nightly-1.8.0.20250615 → recce_nightly-1.8.0.20250617}/recce/cli.py +4 -4
- {recce_nightly-1.8.0.20250615 → recce_nightly-1.8.0.20250617}/recce/data/404.html +2 -2
- recce_nightly-1.8.0.20250617/recce/data/_next/static/6pJWLeTWseySFL3ozLQBi/_buildManifest.js +1 -0
- recce_nightly-1.8.0.20250615/recce/data/_next/static/chunks/1bff33f1-39d26ad38ba4fe06.js → recce_nightly-1.8.0.20250617/recce/data/_next/static/chunks/1bff33f1-1ef85cf5e658a751.js +1 -1
- recce_nightly-1.8.0.20250617/recce/data/_next/static/chunks/217-879a84d70f7a907c.js +2 -0
- recce_nightly-1.8.0.20250617/recce/data/_next/static/chunks/29e3cc0d-60045b2e47aa3916.js +1 -0
- recce_nightly-1.8.0.20250617/recce/data/_next/static/chunks/36e1c10d-35e36448f4f83961.js +1 -0
- recce_nightly-1.8.0.20250615/recce/data/_next/static/chunks/3998a672-0426e04aa28a4198.js → recce_nightly-1.8.0.20250617/recce/data/_next/static/chunks/3998a672-03adacad07b346ac.js +1 -1
- recce_nightly-1.8.0.20250615/recce/data/_next/static/chunks/3a92ee20-146003bc9f4294f5.js → recce_nightly-1.8.0.20250617/recce/data/_next/static/chunks/3a92ee20-1081c360214f9602.js +1 -1
- recce_nightly-1.8.0.20250617/recce/data/_next/static/chunks/450c323b-fd94e7ffaa4a5efa.js +1 -0
- recce_nightly-1.8.0.20250617/recce/data/_next/static/chunks/47d8844f-929aed9b1c73a905.js +1 -0
- recce_nightly-1.8.0.20250617/recce/data/_next/static/chunks/608-3b079b544e5d5f5e.js +15 -0
- recce_nightly-1.8.0.20250615/recce/data/_next/static/chunks/6dc81886-e6963cc22929fc61.js → recce_nightly-1.8.0.20250617/recce/data/_next/static/chunks/6dc81886-adbfa45836061d79.js +1 -1
- recce_nightly-1.8.0.20250617/recce/data/_next/static/chunks/7a8a3e83-edf6dc64b5d5f0a5.js +1 -0
- recce_nightly-1.8.0.20250617/recce/data/_next/static/chunks/7f27ae6c-d5f0438edd5c2a5b.js +1 -0
- recce_nightly-1.8.0.20250617/recce/data/_next/static/chunks/826-1fdc111c49b34b0f.js +43 -0
- recce_nightly-1.8.0.20250615/recce/data/_next/static/chunks/0d0b8943-1c8ef4728d0e645b.js → recce_nightly-1.8.0.20250617/recce/data/_next/static/chunks/86730205-cfb14e3f051bab35.js +1 -1
- recce_nightly-1.8.0.20250615/recce/data/_next/static/chunks/8d700b6a.ebb3dd15a8cd3f2b.js → recce_nightly-1.8.0.20250617/recce/data/_next/static/chunks/8d700b6a.8bb140898499c512.js +1 -1
- recce_nightly-1.8.0.20250617/recce/data/_next/static/chunks/92-bd5f33f1c3cb9d93.js +1 -0
- recce_nightly-1.8.0.20250617/recce/data/_next/static/chunks/960-49d66f0cbac6af8a.js +9 -0
- recce_nightly-1.8.0.20250617/recce/data/_next/static/chunks/9746af58-a42b7d169cacadf0.js +1 -0
- recce_nightly-1.8.0.20250617/recce/data/_next/static/chunks/a30376cd-de84559016d7e133.js +1 -0
- recce_nightly-1.8.0.20250615/recce/data/_next/static/chunks/app/_not-found/page-2ab757d7e27193ec.js → recce_nightly-1.8.0.20250617/recce/data/_next/static/chunks/app/_not-found/page-01ed58b7f971d311.js +1 -1
- recce_nightly-1.8.0.20250617/recce/data/_next/static/chunks/app/layout-af033601bf81ed53.js +1 -0
- recce_nightly-1.8.0.20250617/recce/data/_next/static/chunks/app/page-f1048e1fe24111f8.js +1 -0
- recce_nightly-1.8.0.20250617/recce/data/_next/static/chunks/b63b1b3f-4282bdcf459e075c.js +1 -0
- recce_nightly-1.8.0.20250617/recce/data/_next/static/chunks/bbda5537-9ec25eb1dd62348a.js +1 -0
- recce_nightly-1.8.0.20250617/recce/data/_next/static/chunks/c132bf7d-08cb668a789d6afd.js +1 -0
- recce_nightly-1.8.0.20250617/recce/data/_next/static/chunks/ce84277d-2e5d1d46910cf052.js +1 -0
- recce_nightly-1.8.0.20250615/recce/data/_next/static/chunks/febdd86e-d96ff090bf0a928d.js → recce_nightly-1.8.0.20250617/recce/data/_next/static/chunks/febdd86e-c6b525341634b860.js +3 -3
- recce_nightly-1.8.0.20250617/recce/data/_next/static/chunks/fee69bc6-2dbccaf9b90474e6.js +1 -0
- recce_nightly-1.8.0.20250617/recce/data/_next/static/chunks/main-app-39061b0166c47f55.js +1 -0
- recce_nightly-1.8.0.20250617/recce/data/_next/static/chunks/main-b5b3ae20a1405261.js +1 -0
- recce_nightly-1.8.0.20250617/recce/data/_next/static/chunks/pages/_app-437c455677d62394.js +1 -0
- recce_nightly-1.8.0.20250617/recce/data/_next/static/chunks/pages/_error-e7650df18ca04bde.js +1 -0
- recce_nightly-1.8.0.20250615/recce/data/_next/static/chunks/webpack-c84693803e08b48b.js → recce_nightly-1.8.0.20250617/recce/data/_next/static/chunks/webpack-7b49d5ba7e3a434d.js +1 -1
- recce_nightly-1.8.0.20250617/recce/data/index.html +27 -0
- {recce_nightly-1.8.0.20250615 → recce_nightly-1.8.0.20250617}/recce/data/index.txt +6 -6
- {recce_nightly-1.8.0.20250615 → recce_nightly-1.8.0.20250617}/recce/models/types.py +7 -13
- {recce_nightly-1.8.0.20250615 → recce_nightly-1.8.0.20250617}/recce/server.py +17 -0
- recce_nightly-1.8.0.20250617/recce/util/lineage.py +78 -0
- {recce_nightly-1.8.0.20250615 → recce_nightly-1.8.0.20250617/recce_nightly.egg-info}/PKG-INFO +1 -1
- {recce_nightly-1.8.0.20250615 → recce_nightly-1.8.0.20250617}/recce_nightly.egg-info/SOURCES.txt +35 -35
- {recce_nightly-1.8.0.20250615 → recce_nightly-1.8.0.20250617}/tests/adapter/dbt_adapter/test_dbt_cll.py +180 -35
- recce_nightly-1.8.0.20250615/recce/VERSION +0 -1
- recce_nightly-1.8.0.20250615/recce/data/_next/static/chunks/184-dc0879f75e9506c3.js +0 -15
- recce_nightly-1.8.0.20250615/recce/data/_next/static/chunks/249-aeaf2fd44b7d8946.js +0 -1
- recce_nightly-1.8.0.20250615/recce/data/_next/static/chunks/29e3cc0d-e95ebef603672925.js +0 -1
- recce_nightly-1.8.0.20250615/recce/data/_next/static/chunks/33-27f5a26fea26baf4.js +0 -43
- recce_nightly-1.8.0.20250615/recce/data/_next/static/chunks/36e1c10d-6d59e8aae9eec8b4.js +0 -1
- recce_nightly-1.8.0.20250615/recce/data/_next/static/chunks/42-3dc869b8f2a75e9c.js +0 -2
- recce_nightly-1.8.0.20250615/recce/data/_next/static/chunks/450c323b-3dd665b028d8e184.js +0 -1
- recce_nightly-1.8.0.20250615/recce/data/_next/static/chunks/47d8844f-57ea99282765dce5.js +0 -1
- recce_nightly-1.8.0.20250615/recce/data/_next/static/chunks/627-1b5619ef0c492f2b.js +0 -9
- recce_nightly-1.8.0.20250615/recce/data/_next/static/chunks/7a8a3e83-933490bb996ac49b.js +0 -1
- recce_nightly-1.8.0.20250615/recce/data/_next/static/chunks/7f27ae6c-f6aa983aa05b83cd.js +0 -1
- recce_nightly-1.8.0.20250615/recce/data/_next/static/chunks/9746af58-ac9a4d1b8160c197.js +0 -1
- recce_nightly-1.8.0.20250615/recce/data/_next/static/chunks/a30376cd-2d324b6b8687d57b.js +0 -1
- recce_nightly-1.8.0.20250615/recce/data/_next/static/chunks/app/layout-83da1e1a59dea607.js +0 -1
- recce_nightly-1.8.0.20250615/recce/data/_next/static/chunks/app/page-3404ed4ba8cffb0b.js +0 -1
- recce_nightly-1.8.0.20250615/recce/data/_next/static/chunks/b63b1b3f-a380b9fe5be938d3.js +0 -1
- recce_nightly-1.8.0.20250615/recce/data/_next/static/chunks/bbda5537-10da060bd56d475e.js +0 -1
- recce_nightly-1.8.0.20250615/recce/data/_next/static/chunks/c132bf7d-d6e713672e7030a1.js +0 -1
- recce_nightly-1.8.0.20250615/recce/data/_next/static/chunks/ce84277d-7f0a33888bf731d9.js +0 -1
- recce_nightly-1.8.0.20250615/recce/data/_next/static/chunks/fee69bc6-288939bd73e3e49c.js +0 -1
- recce_nightly-1.8.0.20250615/recce/data/_next/static/chunks/main-0276cd0c41be4ef4.js +0 -1
- recce_nightly-1.8.0.20250615/recce/data/_next/static/chunks/main-app-2e08b38d48f6a731.js +0 -1
- recce_nightly-1.8.0.20250615/recce/data/_next/static/chunks/pages/_app-ddb94f741a61a490.js +0 -1
- recce_nightly-1.8.0.20250615/recce/data/_next/static/chunks/pages/_error-9e738ac1fd923095.js +0 -1
- recce_nightly-1.8.0.20250615/recce/data/_next/static/clUnQD2xUsy2WK43RKblq/_buildManifest.js +0 -1
- recce_nightly-1.8.0.20250615/recce/data/index.html +0 -27
- recce_nightly-1.8.0.20250615/recce/util/lineage.py +0 -99
- {recce_nightly-1.8.0.20250615 → recce_nightly-1.8.0.20250617}/LICENSE +0 -0
- {recce_nightly-1.8.0.20250615 → recce_nightly-1.8.0.20250617}/README.md +0 -0
- {recce_nightly-1.8.0.20250615 → recce_nightly-1.8.0.20250617}/pyproject.toml +0 -0
- {recce_nightly-1.8.0.20250615 → recce_nightly-1.8.0.20250617}/recce/__init__.py +0 -0
- {recce_nightly-1.8.0.20250615 → recce_nightly-1.8.0.20250617}/recce/adapter/__init__.py +0 -0
- {recce_nightly-1.8.0.20250615 → recce_nightly-1.8.0.20250617}/recce/adapter/base.py +0 -0
- {recce_nightly-1.8.0.20250615 → recce_nightly-1.8.0.20250617}/recce/adapter/dbt_adapter/dbt_version.py +0 -0
- {recce_nightly-1.8.0.20250615 → recce_nightly-1.8.0.20250617}/recce/adapter/sqlmesh_adapter.py +0 -0
- {recce_nightly-1.8.0.20250615 → recce_nightly-1.8.0.20250617}/recce/apis/__init__.py +0 -0
- {recce_nightly-1.8.0.20250615 → recce_nightly-1.8.0.20250617}/recce/apis/check_api.py +0 -0
- {recce_nightly-1.8.0.20250615 → recce_nightly-1.8.0.20250617}/recce/apis/check_func.py +0 -0
- {recce_nightly-1.8.0.20250615 → recce_nightly-1.8.0.20250617}/recce/apis/run_api.py +0 -0
- {recce_nightly-1.8.0.20250615 → recce_nightly-1.8.0.20250617}/recce/apis/run_func.py +0 -0
- {recce_nightly-1.8.0.20250615 → recce_nightly-1.8.0.20250617}/recce/artifact.py +0 -0
- {recce_nightly-1.8.0.20250615 → recce_nightly-1.8.0.20250617}/recce/config.py +0 -0
- {recce_nightly-1.8.0.20250615 → recce_nightly-1.8.0.20250617}/recce/core.py +0 -0
- {recce_nightly-1.8.0.20250615/recce/data/_next/static/clUnQD2xUsy2WK43RKblq → recce_nightly-1.8.0.20250617/recce/data/_next/static/6pJWLeTWseySFL3ozLQBi}/_ssgManifest.js +0 -0
- {recce_nightly-1.8.0.20250615 → recce_nightly-1.8.0.20250617}/recce/data/_next/static/chunks/framework-ded83d71b51ce901.js +0 -0
- {recce_nightly-1.8.0.20250615 → recce_nightly-1.8.0.20250617}/recce/data/_next/static/chunks/polyfills-42372ed130431b0a.js +0 -0
- {recce_nightly-1.8.0.20250615 → recce_nightly-1.8.0.20250617}/recce/data/_next/static/css/17a96168e3a9db13.css +0 -0
- {recce_nightly-1.8.0.20250615 → recce_nightly-1.8.0.20250617}/recce/data/_next/static/css/1b121dc4d36aeb4d.css +0 -0
- {recce_nightly-1.8.0.20250615 → recce_nightly-1.8.0.20250617}/recce/data/_next/static/css/35c6679a098e1e34.css +0 -0
- {recce_nightly-1.8.0.20250615 → recce_nightly-1.8.0.20250617}/recce/data/_next/static/css/951e2e0eea2d4a5b.css +0 -0
- {recce_nightly-1.8.0.20250615 → recce_nightly-1.8.0.20250617}/recce/data/_next/static/media/montserrat-cyrillic-800-normal.22628180.woff2 +0 -0
- {recce_nightly-1.8.0.20250615 → recce_nightly-1.8.0.20250617}/recce/data/_next/static/media/montserrat-cyrillic-800-normal.bd5c9f50.woff +0 -0
- {recce_nightly-1.8.0.20250615 → recce_nightly-1.8.0.20250617}/recce/data/_next/static/media/montserrat-cyrillic-ext-800-normal.94a63aea.woff2 +0 -0
- {recce_nightly-1.8.0.20250615 → recce_nightly-1.8.0.20250617}/recce/data/_next/static/media/montserrat-cyrillic-ext-800-normal.e6e0d8d0.woff +0 -0
- {recce_nightly-1.8.0.20250615 → recce_nightly-1.8.0.20250617}/recce/data/_next/static/media/montserrat-latin-800-normal.6f8fa298.woff2 +0 -0
- {recce_nightly-1.8.0.20250615 → recce_nightly-1.8.0.20250617}/recce/data/_next/static/media/montserrat-latin-800-normal.fc315020.woff +0 -0
- {recce_nightly-1.8.0.20250615 → recce_nightly-1.8.0.20250617}/recce/data/_next/static/media/montserrat-latin-ext-800-normal.013b84f9.woff2 +0 -0
- {recce_nightly-1.8.0.20250615 → recce_nightly-1.8.0.20250617}/recce/data/_next/static/media/montserrat-latin-ext-800-normal.2e5381b2.woff +0 -0
- {recce_nightly-1.8.0.20250615 → recce_nightly-1.8.0.20250617}/recce/data/_next/static/media/montserrat-vietnamese-800-normal.20c545e6.woff +0 -0
- {recce_nightly-1.8.0.20250615 → recce_nightly-1.8.0.20250617}/recce/data/_next/static/media/montserrat-vietnamese-800-normal.c0035377.woff2 +0 -0
- {recce_nightly-1.8.0.20250615 → recce_nightly-1.8.0.20250617}/recce/data/_next/static/media/reload-image.79aabb7d.svg +0 -0
- {recce_nightly-1.8.0.20250615 → recce_nightly-1.8.0.20250617}/recce/data/favicon.ico +0 -0
- {recce_nightly-1.8.0.20250615 → recce_nightly-1.8.0.20250617}/recce/data/imgs/feedback/thumbs-down.png +0 -0
- {recce_nightly-1.8.0.20250615 → recce_nightly-1.8.0.20250617}/recce/data/imgs/feedback/thumbs-up.png +0 -0
- {recce_nightly-1.8.0.20250615 → recce_nightly-1.8.0.20250617}/recce/data/imgs/reload-image.svg +0 -0
- {recce_nightly-1.8.0.20250615 → recce_nightly-1.8.0.20250617}/recce/data/logo/recce-logo-white.png +0 -0
- {recce_nightly-1.8.0.20250615 → recce_nightly-1.8.0.20250617}/recce/diff.py +0 -0
- {recce_nightly-1.8.0.20250615 → recce_nightly-1.8.0.20250617}/recce/event/CONFIG +0 -0
- {recce_nightly-1.8.0.20250615 → recce_nightly-1.8.0.20250617}/recce/event/SENTRY_DNS +0 -0
- {recce_nightly-1.8.0.20250615 → recce_nightly-1.8.0.20250617}/recce/event/__init__.py +0 -0
- {recce_nightly-1.8.0.20250615 → recce_nightly-1.8.0.20250617}/recce/event/collector.py +0 -0
- {recce_nightly-1.8.0.20250615 → recce_nightly-1.8.0.20250617}/recce/event/track.py +0 -0
- {recce_nightly-1.8.0.20250615 → recce_nightly-1.8.0.20250617}/recce/exceptions.py +0 -0
- {recce_nightly-1.8.0.20250615 → recce_nightly-1.8.0.20250617}/recce/git.py +0 -0
- {recce_nightly-1.8.0.20250615 → recce_nightly-1.8.0.20250617}/recce/github.py +0 -0
- {recce_nightly-1.8.0.20250615 → recce_nightly-1.8.0.20250617}/recce/models/__init__.py +0 -0
- {recce_nightly-1.8.0.20250615 → recce_nightly-1.8.0.20250617}/recce/models/check.py +0 -0
- {recce_nightly-1.8.0.20250615 → recce_nightly-1.8.0.20250617}/recce/models/run.py +0 -0
- {recce_nightly-1.8.0.20250615 → recce_nightly-1.8.0.20250617}/recce/pull_request.py +0 -0
- {recce_nightly-1.8.0.20250615 → recce_nightly-1.8.0.20250617}/recce/run.py +0 -0
- {recce_nightly-1.8.0.20250615 → recce_nightly-1.8.0.20250617}/recce/state.py +0 -0
- {recce_nightly-1.8.0.20250615 → recce_nightly-1.8.0.20250617}/recce/summary.py +0 -0
- {recce_nightly-1.8.0.20250615 → recce_nightly-1.8.0.20250617}/recce/tasks/__init__.py +0 -0
- {recce_nightly-1.8.0.20250615 → recce_nightly-1.8.0.20250617}/recce/tasks/core.py +0 -0
- {recce_nightly-1.8.0.20250615 → recce_nightly-1.8.0.20250617}/recce/tasks/dataframe.py +0 -0
- {recce_nightly-1.8.0.20250615 → recce_nightly-1.8.0.20250617}/recce/tasks/histogram.py +0 -0
- {recce_nightly-1.8.0.20250615 → recce_nightly-1.8.0.20250617}/recce/tasks/lineage.py +0 -0
- {recce_nightly-1.8.0.20250615 → recce_nightly-1.8.0.20250617}/recce/tasks/profile.py +0 -0
- {recce_nightly-1.8.0.20250615 → recce_nightly-1.8.0.20250617}/recce/tasks/query.py +0 -0
- {recce_nightly-1.8.0.20250615 → recce_nightly-1.8.0.20250617}/recce/tasks/rowcount.py +0 -0
- {recce_nightly-1.8.0.20250615 → recce_nightly-1.8.0.20250617}/recce/tasks/schema.py +0 -0
- {recce_nightly-1.8.0.20250615 → recce_nightly-1.8.0.20250617}/recce/tasks/top_k.py +0 -0
- {recce_nightly-1.8.0.20250615 → recce_nightly-1.8.0.20250617}/recce/tasks/valuediff.py +0 -0
- {recce_nightly-1.8.0.20250615 → recce_nightly-1.8.0.20250617}/recce/util/__init__.py +0 -0
- {recce_nightly-1.8.0.20250615 → recce_nightly-1.8.0.20250617}/recce/util/api_token.py +0 -0
- {recce_nightly-1.8.0.20250615 → recce_nightly-1.8.0.20250617}/recce/util/breaking.py +0 -0
- {recce_nightly-1.8.0.20250615 → recce_nightly-1.8.0.20250617}/recce/util/cache.py +0 -0
- {recce_nightly-1.8.0.20250615 → recce_nightly-1.8.0.20250617}/recce/util/cll.py +0 -0
- {recce_nightly-1.8.0.20250615 → recce_nightly-1.8.0.20250617}/recce/util/io.py +0 -0
- {recce_nightly-1.8.0.20250615 → recce_nightly-1.8.0.20250617}/recce/util/logger.py +0 -0
- {recce_nightly-1.8.0.20250615 → recce_nightly-1.8.0.20250617}/recce/util/pydantic_model.py +0 -0
- {recce_nightly-1.8.0.20250615 → recce_nightly-1.8.0.20250617}/recce/util/recce_cloud.py +0 -0
- {recce_nightly-1.8.0.20250615 → recce_nightly-1.8.0.20250617}/recce/util/singleton.py +0 -0
- {recce_nightly-1.8.0.20250615 → recce_nightly-1.8.0.20250617}/recce/yaml/__init__.py +0 -0
- {recce_nightly-1.8.0.20250615 → recce_nightly-1.8.0.20250617}/recce_nightly.egg-info/dependency_links.txt +0 -0
- {recce_nightly-1.8.0.20250615 → recce_nightly-1.8.0.20250617}/recce_nightly.egg-info/entry_points.txt +0 -0
- {recce_nightly-1.8.0.20250615 → recce_nightly-1.8.0.20250617}/recce_nightly.egg-info/requires.txt +0 -0
- {recce_nightly-1.8.0.20250615 → recce_nightly-1.8.0.20250617}/recce_nightly.egg-info/top_level.txt +0 -0
- {recce_nightly-1.8.0.20250615 → recce_nightly-1.8.0.20250617}/setup.cfg +0 -0
- {recce_nightly-1.8.0.20250615 → recce_nightly-1.8.0.20250617}/setup.py +0 -0
- {recce_nightly-1.8.0.20250615 → recce_nightly-1.8.0.20250617}/tests/__init__.py +0 -0
- {recce_nightly-1.8.0.20250615 → recce_nightly-1.8.0.20250617}/tests/adapter/__init__.py +0 -0
- {recce_nightly-1.8.0.20250615 → recce_nightly-1.8.0.20250617}/tests/adapter/dbt_adapter/__init__.py +0 -0
- {recce_nightly-1.8.0.20250615 → recce_nightly-1.8.0.20250617}/tests/adapter/dbt_adapter/conftest.py +0 -0
- {recce_nightly-1.8.0.20250615 → recce_nightly-1.8.0.20250617}/tests/adapter/dbt_adapter/dbt_test_helper.py +0 -0
- {recce_nightly-1.8.0.20250615 → recce_nightly-1.8.0.20250617}/tests/adapter/dbt_adapter/test_dbt_adapter.py +0 -0
- {recce_nightly-1.8.0.20250615 → recce_nightly-1.8.0.20250617}/tests/adapter/dbt_adapter/test_selector.py +0 -0
- {recce_nightly-1.8.0.20250615 → recce_nightly-1.8.0.20250617}/tests/tasks/__init__.py +0 -0
- {recce_nightly-1.8.0.20250615 → recce_nightly-1.8.0.20250617}/tests/tasks/conftest.py +0 -0
- {recce_nightly-1.8.0.20250615 → recce_nightly-1.8.0.20250617}/tests/tasks/test_histogram.py +0 -0
- {recce_nightly-1.8.0.20250615 → recce_nightly-1.8.0.20250617}/tests/tasks/test_lineage.py +0 -0
- {recce_nightly-1.8.0.20250615 → recce_nightly-1.8.0.20250617}/tests/tasks/test_preset_checks.py +0 -0
- {recce_nightly-1.8.0.20250615 → recce_nightly-1.8.0.20250617}/tests/tasks/test_profile.py +0 -0
- {recce_nightly-1.8.0.20250615 → recce_nightly-1.8.0.20250617}/tests/tasks/test_query.py +0 -0
- {recce_nightly-1.8.0.20250615 → recce_nightly-1.8.0.20250617}/tests/tasks/test_row_count.py +0 -0
- {recce_nightly-1.8.0.20250615 → recce_nightly-1.8.0.20250617}/tests/tasks/test_schema.py +0 -0
- {recce_nightly-1.8.0.20250615 → recce_nightly-1.8.0.20250617}/tests/tasks/test_top_k.py +0 -0
- {recce_nightly-1.8.0.20250615 → recce_nightly-1.8.0.20250617}/tests/tasks/test_valuediff.py +0 -0
- {recce_nightly-1.8.0.20250615 → recce_nightly-1.8.0.20250617}/tests/test_cli.py +0 -0
- {recce_nightly-1.8.0.20250615 → recce_nightly-1.8.0.20250617}/tests/test_config.py +0 -0
- {recce_nightly-1.8.0.20250615 → recce_nightly-1.8.0.20250617}/tests/test_core.py +0 -0
- {recce_nightly-1.8.0.20250615 → recce_nightly-1.8.0.20250617}/tests/test_dbt.py +0 -0
- {recce_nightly-1.8.0.20250615 → recce_nightly-1.8.0.20250617}/tests/test_pull_request.py +0 -0
- {recce_nightly-1.8.0.20250615 → recce_nightly-1.8.0.20250617}/tests/test_server.py +0 -0
- {recce_nightly-1.8.0.20250615 → recce_nightly-1.8.0.20250617}/tests/test_state.py +0 -0
- {recce_nightly-1.8.0.20250615 → recce_nightly-1.8.0.20250617}/tests/test_summary.py +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
1.8.0.20250617
|
{recce_nightly-1.8.0.20250615 → recce_nightly-1.8.0.20250617}/recce/adapter/dbt_adapter/__init__.py
RENAMED
|
@@ -23,10 +23,10 @@ from typing import (
|
|
|
23
23
|
|
|
24
24
|
from recce.event import log_performance
|
|
25
25
|
from recce.exceptions import RecceException
|
|
26
|
-
from recce.util.cll import
|
|
26
|
+
from recce.util.cll import CLLPerformanceTracking, cll
|
|
27
27
|
from recce.util.lineage import (
|
|
28
|
-
|
|
29
|
-
|
|
28
|
+
filter_dependency_maps,
|
|
29
|
+
filter_lineage_vertices,
|
|
30
30
|
find_column_dependencies,
|
|
31
31
|
find_downstream,
|
|
32
32
|
find_upstream,
|
|
@@ -54,7 +54,6 @@ from ...models.types import (
|
|
|
54
54
|
CllColumn,
|
|
55
55
|
CllData,
|
|
56
56
|
CllNode,
|
|
57
|
-
CllNodeDependsOn,
|
|
58
57
|
LineageDiff,
|
|
59
58
|
NodeChange,
|
|
60
59
|
NodeDiff,
|
|
@@ -143,6 +142,7 @@ def silence_no_nodes_warning():
|
|
|
143
142
|
|
|
144
143
|
|
|
145
144
|
logger = logging.getLogger("uvicorn")
|
|
145
|
+
MIN_DBT_NODE_COMPOSITION = 3
|
|
146
146
|
|
|
147
147
|
|
|
148
148
|
class ArtifactsEventHandler(FileSystemEventHandler):
|
|
@@ -700,7 +700,7 @@ class DbtAdapter(BaseAdapter):
|
|
|
700
700
|
for child in child_map:
|
|
701
701
|
node_name = node["name"]
|
|
702
702
|
comps = child.split(".")
|
|
703
|
-
if len(comps) <
|
|
703
|
+
if len(comps) < MIN_DBT_NODE_COMPOSITION:
|
|
704
704
|
# only happens in unittest
|
|
705
705
|
continue
|
|
706
706
|
|
|
@@ -917,14 +917,21 @@ class DbtAdapter(BaseAdapter):
|
|
|
917
917
|
|
|
918
918
|
def get_cll(self, node_id: str, column: Optional[str]) -> CllData:
|
|
919
919
|
cll = self.get_cll_by_node_id(node_id)
|
|
920
|
-
if column:
|
|
921
|
-
|
|
922
|
-
|
|
923
|
-
|
|
924
|
-
|
|
925
|
-
|
|
926
|
-
|
|
927
|
-
|
|
920
|
+
if not column:
|
|
921
|
+
return cll
|
|
922
|
+
|
|
923
|
+
target_column = f"{node_id}_{column}"
|
|
924
|
+
upstream, downstream = find_column_dependencies(target_column, cll.parent_map, cll.child_map)
|
|
925
|
+
relevant_columns = {target_column}
|
|
926
|
+
relevant_columns.update(upstream, downstream)
|
|
927
|
+
nodes, columns = filter_lineage_vertices(cll.nodes, cll.columns, relevant_columns)
|
|
928
|
+
p_map, c_map = filter_dependency_maps(cll.parent_map, cll.child_map, relevant_columns)
|
|
929
|
+
return CllData(
|
|
930
|
+
nodes=nodes,
|
|
931
|
+
columns=columns,
|
|
932
|
+
parent_map=p_map,
|
|
933
|
+
child_map=c_map,
|
|
934
|
+
)
|
|
928
935
|
|
|
929
936
|
def get_cll_by_node_id(self, node_id: str, base: Optional[bool] = False) -> CllData:
|
|
930
937
|
cll_tracker = CLLPerformanceTracking()
|
|
@@ -938,60 +945,72 @@ class DbtAdapter(BaseAdapter):
|
|
|
938
945
|
cll_node_ids = parent_ids.union(child_ids)
|
|
939
946
|
cll_node_ids.add(node_id)
|
|
940
947
|
|
|
941
|
-
node_manifest = self.get_cll_nodes_from_metadata(base=base)
|
|
942
948
|
nodes = {}
|
|
949
|
+
cll_data = CllData()
|
|
943
950
|
for node_id in cll_node_ids:
|
|
944
|
-
if node_id not in
|
|
951
|
+
if node_id not in manifest.sources and node_id not in manifest.nodes and node_id not in manifest.exposures:
|
|
945
952
|
continue
|
|
946
|
-
|
|
953
|
+
cll_data_one = self.get_cll_cached(node_id, base=base)
|
|
954
|
+
if cll_data_one is None:
|
|
955
|
+
continue
|
|
956
|
+
for n_id, n in cll_data_one.nodes.items():
|
|
957
|
+
cll_data.nodes[n_id] = n
|
|
958
|
+
for c_id, c in cll_data_one.columns.items():
|
|
959
|
+
cll_data.columns[c_id] = c
|
|
960
|
+
for p_id, parents in cll_data_one.parent_map.items():
|
|
961
|
+
cll_data.parent_map[p_id] = parents
|
|
962
|
+
|
|
963
|
+
# build the child map
|
|
964
|
+
cll_data.child_map = {}
|
|
965
|
+
for node_id, parents in cll_data.parent_map.items():
|
|
966
|
+
for parent in parents:
|
|
967
|
+
if parent not in cll_data.child_map:
|
|
968
|
+
cll_data.child_map[parent] = set()
|
|
969
|
+
cll_data.child_map[parent].add(node_id)
|
|
947
970
|
|
|
948
971
|
cll_tracker.end_column_lineage()
|
|
949
972
|
cll_tracker.set_total_nodes(len(nodes))
|
|
950
973
|
log_performance("column level lineage", cll_tracker.to_dict())
|
|
951
974
|
cll_tracker.reset()
|
|
952
975
|
|
|
953
|
-
return
|
|
976
|
+
return cll_data
|
|
954
977
|
|
|
955
978
|
@lru_cache(maxsize=128)
|
|
956
|
-
def get_cll_cached(self, node_id: str, base: Optional[bool] = False) ->
|
|
957
|
-
|
|
958
|
-
|
|
959
|
-
manifest = self.curr_manifest if base is False else self.base_manifest
|
|
960
|
-
manifest_dict = manifest.to_dict()
|
|
961
|
-
parent_list = []
|
|
962
|
-
if node_id in manifest_dict["parent_map"]:
|
|
963
|
-
parent_list = manifest_dict["parent_map"][node_id]
|
|
979
|
+
def get_cll_cached(self, node_id: str, base: Optional[bool] = False) -> Optional[CllData]:
|
|
980
|
+
cll_tracker = CLLPerformanceTracking()
|
|
964
981
|
|
|
965
|
-
node =
|
|
966
|
-
|
|
967
|
-
|
|
982
|
+
node, parent_list = self.get_cll_node(node_id, base=base)
|
|
983
|
+
if node is None:
|
|
984
|
+
return None
|
|
968
985
|
|
|
969
|
-
def append_column_lineage(self, node: CllNode, parent_list: List, base: Optional[bool] = False):
|
|
970
986
|
def _apply_all_columns(node: CllNode, transformation_type):
|
|
987
|
+
cll_data = CllData()
|
|
988
|
+
cll_data.nodes[node.id] = node
|
|
989
|
+
cll_data.parent_map[node.id] = set(parent_list)
|
|
971
990
|
for col in node.columns.values():
|
|
991
|
+
column_id = f"{node.id}_{col.name}"
|
|
972
992
|
col.transformation_type = transformation_type
|
|
993
|
+
cll_data.columns[column_id] = col
|
|
994
|
+
cll_data.parent_map[column_id] = set()
|
|
995
|
+
return cll_data
|
|
973
996
|
|
|
974
|
-
cll_tracker = CLLPerformanceTracking()
|
|
975
|
-
nodes = self.get_cll_nodes_from_metadata(base=base)
|
|
976
997
|
manifest = as_manifest(self.get_manifest(base))
|
|
998
|
+
catalog = self.curr_catalog if base is False else self.base_catalog
|
|
977
999
|
resource_type = node.resource_type
|
|
978
1000
|
if resource_type not in {"model", "seed", "source", "snapshot"}:
|
|
979
|
-
return
|
|
1001
|
+
return _apply_all_columns(node, "unknown")
|
|
980
1002
|
|
|
981
1003
|
if resource_type == "source" or resource_type == "seed":
|
|
982
|
-
_apply_all_columns(node, "source")
|
|
983
|
-
return
|
|
1004
|
+
return _apply_all_columns(node, "source")
|
|
984
1005
|
|
|
985
1006
|
if node.raw_code is None or self.is_python_model(node.id, base=base):
|
|
986
|
-
_apply_all_columns(node, "unknown")
|
|
987
|
-
return
|
|
1007
|
+
return _apply_all_columns(node, "unknown")
|
|
988
1008
|
|
|
989
1009
|
if node.name == "metricflow_time_spine":
|
|
990
|
-
_apply_all_columns(node, "source")
|
|
991
|
-
return
|
|
1010
|
+
return _apply_all_columns(node, "source")
|
|
992
1011
|
|
|
993
1012
|
if not node.columns:
|
|
994
|
-
return
|
|
1013
|
+
return _apply_all_columns(node, "unknown")
|
|
995
1014
|
|
|
996
1015
|
table_id_map = {}
|
|
997
1016
|
|
|
@@ -1005,17 +1024,14 @@ class DbtAdapter(BaseAdapter):
|
|
|
1005
1024
|
project_or_package = args[0]
|
|
1006
1025
|
node_name = args[1]
|
|
1007
1026
|
|
|
1008
|
-
for key, n in nodes.items():
|
|
1009
|
-
if n.resource_type == "source":
|
|
1010
|
-
# For resource_type==source, you should use "source(...)"
|
|
1011
|
-
continue
|
|
1027
|
+
for key, n in manifest.nodes.items():
|
|
1012
1028
|
if n.name != node_name:
|
|
1013
1029
|
continue
|
|
1014
1030
|
if project_or_package is not None and n.package_name != project_or_package:
|
|
1015
1031
|
continue
|
|
1016
1032
|
|
|
1017
1033
|
# replace id "." to "_"
|
|
1018
|
-
unique_id = n.
|
|
1034
|
+
unique_id = n.unique_id
|
|
1019
1035
|
table_name = unique_id.replace(".", "_")
|
|
1020
1036
|
table_id_map[table_name.lower()] = unique_id
|
|
1021
1037
|
return table_name
|
|
@@ -1023,16 +1039,14 @@ class DbtAdapter(BaseAdapter):
|
|
|
1023
1039
|
raise ValueError(f"Cannot find node {node_name} in the manifest")
|
|
1024
1040
|
|
|
1025
1041
|
def source_func(source_name, name):
|
|
1026
|
-
for key, n in
|
|
1027
|
-
if n.resource_type != "source":
|
|
1028
|
-
continue
|
|
1042
|
+
for key, n in manifest.sources.items():
|
|
1029
1043
|
if n.source_name != source_name:
|
|
1030
1044
|
continue
|
|
1031
1045
|
if n.name != name:
|
|
1032
1046
|
continue
|
|
1033
1047
|
|
|
1034
1048
|
# replace id "." to "_"
|
|
1035
|
-
unique_id = n.
|
|
1049
|
+
unique_id = n.unique_id
|
|
1036
1050
|
table_name = unique_id.replace(".", "_")
|
|
1037
1051
|
table_id_map[table_name.lower()] = unique_id
|
|
1038
1052
|
return table_name
|
|
@@ -1046,13 +1060,17 @@ class DbtAdapter(BaseAdapter):
|
|
|
1046
1060
|
)
|
|
1047
1061
|
|
|
1048
1062
|
schema = {}
|
|
1049
|
-
|
|
1050
|
-
|
|
1051
|
-
|
|
1052
|
-
|
|
1053
|
-
|
|
1054
|
-
|
|
1055
|
-
|
|
1063
|
+
if catalog is not None:
|
|
1064
|
+
for parent_id in parent_list:
|
|
1065
|
+
table_name = parent_id.replace(".", "_")
|
|
1066
|
+
columns = {}
|
|
1067
|
+
if parent_id in catalog.nodes:
|
|
1068
|
+
for col_name, col_metadata in catalog.nodes[parent_id].columns.items():
|
|
1069
|
+
columns[col_name] = col_metadata.type
|
|
1070
|
+
if parent_id in catalog.sources:
|
|
1071
|
+
for col_name, col_metadata in catalog.sources[parent_id].columns.items():
|
|
1072
|
+
columns[col_name] = col_metadata.type
|
|
1073
|
+
schema[table_name] = columns
|
|
1056
1074
|
|
|
1057
1075
|
try:
|
|
1058
1076
|
compiled_sql = self.generate_sql(raw_code, base=base, context=jinja_context, provided_manifest=manifest)
|
|
@@ -1061,75 +1079,103 @@ class DbtAdapter(BaseAdapter):
|
|
|
1061
1079
|
dialect = self.get_manifest(base).metadata.adapter_type
|
|
1062
1080
|
m2c, c2c_map = cll(compiled_sql, schema=schema, dialect=dialect)
|
|
1063
1081
|
except RecceException:
|
|
1064
|
-
_apply_all_columns(node, "unknown")
|
|
1065
1082
|
cll_tracker.increment_sqlglot_error_nodes()
|
|
1066
|
-
return
|
|
1083
|
+
return _apply_all_columns(node, "unknown")
|
|
1067
1084
|
except Exception:
|
|
1068
|
-
_apply_all_columns(node, "unknown")
|
|
1069
1085
|
cll_tracker.increment_other_error_nodes()
|
|
1070
|
-
return
|
|
1086
|
+
return _apply_all_columns(node, "unknown")
|
|
1071
1087
|
|
|
1072
1088
|
# Add cll dependency to the node.
|
|
1073
|
-
|
|
1074
|
-
node.
|
|
1089
|
+
cll_data = CllData()
|
|
1090
|
+
cll_data.nodes[node.id] = node
|
|
1091
|
+
cll_data.columns = {f"{node.id}_{col.name}": col for col in node.columns.values()}
|
|
1092
|
+
|
|
1093
|
+
# parent map for node
|
|
1094
|
+
depends_on = set(parent_list)
|
|
1095
|
+
for d in m2c:
|
|
1096
|
+
parent_key = f"{table_id_map[d.node.lower()]}_{d.column}"
|
|
1097
|
+
depends_on.add(parent_key)
|
|
1098
|
+
cll_data.parent_map[node_id] = depends_on
|
|
1099
|
+
|
|
1100
|
+
# parent map for columns
|
|
1075
1101
|
for name, column in node.columns.items():
|
|
1102
|
+
depends_on = set()
|
|
1103
|
+
column_id = f"{node.id}_{name}"
|
|
1076
1104
|
if name in c2c_map:
|
|
1077
|
-
|
|
1078
|
-
|
|
1079
|
-
|
|
1105
|
+
for d in c2c_map[name].depends_on:
|
|
1106
|
+
parent_key = f"{table_id_map[d.node.lower()]}_{d.column}"
|
|
1107
|
+
depends_on.add(parent_key)
|
|
1080
1108
|
column.transformation_type = c2c_map[name].transformation_type
|
|
1109
|
+
cll_data.parent_map[column_id] = set(depends_on)
|
|
1110
|
+
return cll_data
|
|
1081
1111
|
|
|
1082
|
-
|
|
1083
|
-
def get_cll_nodes_from_metadata(self, base: Optional[bool] = False) -> Dict[str, CllNode]:
|
|
1112
|
+
def get_cll_node(self, node_id: str, base: Optional[bool] = False) -> Tuple[Optional[CllNode], list[str]]:
|
|
1084
1113
|
manifest = self.curr_manifest if base is False else self.base_manifest
|
|
1085
1114
|
catalog = self.curr_catalog if base is False else self.base_catalog
|
|
1086
|
-
|
|
1087
|
-
|
|
1088
|
-
|
|
1089
|
-
|
|
1090
|
-
|
|
1091
|
-
|
|
1092
|
-
|
|
1093
|
-
|
|
1094
|
-
|
|
1095
|
-
|
|
1096
|
-
|
|
1097
|
-
id=
|
|
1098
|
-
name=
|
|
1099
|
-
package_name=
|
|
1100
|
-
resource_type=
|
|
1101
|
-
raw_code=
|
|
1102
|
-
depends_on=CllNodeDependsOn(
|
|
1103
|
-
nodes=node.get("depends_on").get("nodes", []),
|
|
1104
|
-
),
|
|
1115
|
+
parent_list = []
|
|
1116
|
+
node = None
|
|
1117
|
+
|
|
1118
|
+
# model, seed, snapshot
|
|
1119
|
+
if node_id in manifest.nodes:
|
|
1120
|
+
found = manifest.nodes[node_id]
|
|
1121
|
+
if found.resource_type not in ["model", "seed", "snapshot"]:
|
|
1122
|
+
return None, []
|
|
1123
|
+
|
|
1124
|
+
unique_id = found.unique_id
|
|
1125
|
+
node = CllNode(
|
|
1126
|
+
id=found.unique_id,
|
|
1127
|
+
name=found.name,
|
|
1128
|
+
package_name=found.package_name,
|
|
1129
|
+
resource_type=found.resource_type,
|
|
1130
|
+
raw_code=found.raw_code,
|
|
1105
1131
|
)
|
|
1132
|
+
if hasattr(found.depends_on, "nodes"):
|
|
1133
|
+
parent_list = found.depends_on.nodes
|
|
1106
1134
|
|
|
1107
1135
|
if catalog is not None and unique_id in catalog.nodes:
|
|
1108
1136
|
columns = {}
|
|
1109
1137
|
for col_name, col_metadata in catalog.nodes[unique_id].columns.items():
|
|
1110
|
-
|
|
1138
|
+
column_id = f"{unique_id}_{col_name}"
|
|
1139
|
+
col = CllColumn(id=column_id, name=col_name, table_id=unique_id, type=col_metadata.type)
|
|
1111
1140
|
columns[col_name] = col
|
|
1112
|
-
|
|
1113
|
-
|
|
1114
|
-
|
|
1115
|
-
|
|
1116
|
-
|
|
1117
|
-
|
|
1118
|
-
|
|
1119
|
-
|
|
1120
|
-
|
|
1121
|
-
|
|
1122
|
-
|
|
1141
|
+
node.columns = columns
|
|
1142
|
+
|
|
1143
|
+
# source
|
|
1144
|
+
if node_id in manifest.sources:
|
|
1145
|
+
found = manifest.sources[node_id]
|
|
1146
|
+
unique_id = found.unique_id
|
|
1147
|
+
|
|
1148
|
+
node = CllNode(
|
|
1149
|
+
id=found.unique_id,
|
|
1150
|
+
name=found.name,
|
|
1151
|
+
package_name=found.package_name,
|
|
1152
|
+
resource_type=found.resource_type,
|
|
1153
|
+
source_name=found.source_name,
|
|
1123
1154
|
)
|
|
1155
|
+
parent_list = []
|
|
1124
1156
|
|
|
1125
1157
|
if catalog is not None and unique_id in catalog.sources:
|
|
1126
1158
|
columns = {}
|
|
1127
1159
|
for col_name, col_metadata in catalog.sources[unique_id].columns.items():
|
|
1128
|
-
|
|
1160
|
+
column_id = f"{unique_id}_{col_name}"
|
|
1161
|
+
col = CllColumn(id=column_id, name=col_name, table_id=unique_id, type=col_metadata.type)
|
|
1129
1162
|
columns[col_name] = col
|
|
1130
|
-
|
|
1163
|
+
node.columns = columns
|
|
1131
1164
|
|
|
1132
|
-
|
|
1165
|
+
# exposure
|
|
1166
|
+
if node_id in manifest.exposures:
|
|
1167
|
+
found = manifest.exposures[node_id]
|
|
1168
|
+
|
|
1169
|
+
node = CllNode(
|
|
1170
|
+
id=found.unique_id,
|
|
1171
|
+
name=found.name,
|
|
1172
|
+
package_name=found.package_name,
|
|
1173
|
+
resource_type=found.resource_type,
|
|
1174
|
+
)
|
|
1175
|
+
if hasattr(found.depends_on, "nodes"):
|
|
1176
|
+
parent_list = found.depends_on.nodes
|
|
1177
|
+
|
|
1178
|
+
return node, parent_list
|
|
1133
1179
|
|
|
1134
1180
|
def get_manifests_by_id(self, unique_id: str):
|
|
1135
1181
|
curr_manifest = self.get_manifest(base=False)
|
|
@@ -1141,6 +1187,73 @@ class DbtAdapter(BaseAdapter):
|
|
|
1141
1187
|
}
|
|
1142
1188
|
return None
|
|
1143
1189
|
|
|
1190
|
+
def get_impact_radius(self, node_id: str) -> CllData:
|
|
1191
|
+
impacted_nodes = self.get_impacted_nodes(node_id)
|
|
1192
|
+
impacted_cll = self.get_impacted_cll(node_id)
|
|
1193
|
+
|
|
1194
|
+
# merge impact radius
|
|
1195
|
+
return self._merge_cll_data(impacted_nodes, impacted_cll)
|
|
1196
|
+
|
|
1197
|
+
def get_impacted_nodes(self, node_id: str) -> CllData:
|
|
1198
|
+
lineage_diff = self.get_lineage_diff()
|
|
1199
|
+
diff_info = lineage_diff.diff.get(node_id)
|
|
1200
|
+
if diff_info is None:
|
|
1201
|
+
return CllData()
|
|
1202
|
+
change_category = diff_info.change.category
|
|
1203
|
+
|
|
1204
|
+
if change_category == "breaking":
|
|
1205
|
+
cll = self.get_cll_by_node_id(node_id)
|
|
1206
|
+
_, downstream = find_column_dependencies(node_id, cll.parent_map, cll.child_map)
|
|
1207
|
+
relevant_columns = {node_id}
|
|
1208
|
+
relevant_columns.update(downstream)
|
|
1209
|
+
nodes, columns = filter_lineage_vertices(cll.nodes, cll.columns, relevant_columns)
|
|
1210
|
+
p_map, c_map = filter_dependency_maps(cll.parent_map, cll.child_map, relevant_columns)
|
|
1211
|
+
|
|
1212
|
+
return CllData(nodes=nodes, columns=columns, parent_map=p_map, child_map=c_map)
|
|
1213
|
+
|
|
1214
|
+
return CllData()
|
|
1215
|
+
|
|
1216
|
+
def get_impacted_cll(self, node_id: str) -> CllData:
|
|
1217
|
+
lineage_diff = self.get_lineage_diff()
|
|
1218
|
+
diff_info = lineage_diff.diff.get(node_id)
|
|
1219
|
+
if diff_info is None:
|
|
1220
|
+
return CllData()
|
|
1221
|
+
change_columns = diff_info.change.columns
|
|
1222
|
+
|
|
1223
|
+
cll = self.get_cll_by_node_id(node_id)
|
|
1224
|
+
relevant_columns = set()
|
|
1225
|
+
for col, change_status in change_columns.items():
|
|
1226
|
+
if change_status == "removed":
|
|
1227
|
+
continue
|
|
1228
|
+
target_column = f"{node_id}_{col}"
|
|
1229
|
+
_, downstream = find_column_dependencies(target_column, cll.parent_map, cll.child_map)
|
|
1230
|
+
relevant_columns.add(target_column)
|
|
1231
|
+
relevant_columns.update(downstream)
|
|
1232
|
+
|
|
1233
|
+
nodes, columns = filter_lineage_vertices(cll.nodes, cll.columns, relevant_columns)
|
|
1234
|
+
p_map, c_map = filter_dependency_maps(cll.parent_map, cll.child_map, relevant_columns)
|
|
1235
|
+
|
|
1236
|
+
return CllData(nodes=nodes, columns=columns, parent_map=p_map, child_map=c_map)
|
|
1237
|
+
|
|
1238
|
+
@staticmethod
|
|
1239
|
+
def _merge_cll_data(base: CllData, target: CllData) -> CllData:
|
|
1240
|
+
merged_nodes = {**base.nodes, **target.nodes}
|
|
1241
|
+
merged_columns = {**base.columns, **target.columns}
|
|
1242
|
+
|
|
1243
|
+
merged_parent_map = {}
|
|
1244
|
+
merged_keys = set(base.parent_map.keys()).union(set(target.parent_map.keys()))
|
|
1245
|
+
for key in merged_keys:
|
|
1246
|
+
merged_parent_map[key] = base.parent_map.get(key, set()).union(target.parent_map.get(key, set()))
|
|
1247
|
+
|
|
1248
|
+
merged_child_map = {}
|
|
1249
|
+
merged_keys = set(base.child_map.keys()).union(set(target.child_map.keys()))
|
|
1250
|
+
for key in merged_keys:
|
|
1251
|
+
merged_child_map[key] = base.child_map.get(key, set()).union(target.child_map.get(key, set()))
|
|
1252
|
+
|
|
1253
|
+
return CllData(
|
|
1254
|
+
nodes=merged_nodes, columns=merged_columns, parent_map=merged_parent_map, child_map=merged_child_map
|
|
1255
|
+
)
|
|
1256
|
+
|
|
1144
1257
|
def build_name_to_unique_id_index(self) -> Dict[str, str]:
|
|
1145
1258
|
name_to_unique_id = {}
|
|
1146
1259
|
curr_manifest = self.get_manifest(base=False)
|
|
@@ -1228,10 +1341,8 @@ class DbtAdapter(BaseAdapter):
|
|
|
1228
1341
|
self.curr_manifest = load_manifest(path=refresh_file_path)
|
|
1229
1342
|
self.manifest = as_manifest(self.curr_manifest)
|
|
1230
1343
|
self.get_cll_cached.cache_clear()
|
|
1231
|
-
self.get_cll_nodes_from_metadata.cache_clear()
|
|
1232
1344
|
elif refresh_file_path.endswith("catalog.json"):
|
|
1233
1345
|
self.curr_catalog = load_catalog(path=refresh_file_path)
|
|
1234
|
-
self.get_cll_nodes_from_metadata.cache_clear()
|
|
1235
1346
|
elif self.base_path and target_type == os.path.basename(self.base_path):
|
|
1236
1347
|
if refresh_file_path.endswith("manifest.json"):
|
|
1237
1348
|
self.base_manifest = load_manifest(path=refresh_file_path)
|
|
@@ -202,7 +202,7 @@ def debug(**kwargs):
|
|
|
202
202
|
def check_artifacts(env_name, target_path):
|
|
203
203
|
console.rule(f"{env_name} Environment", style="orange3")
|
|
204
204
|
if not target_path.is_dir():
|
|
205
|
-
console.print(f"[[red]MISS[/red]] Directory
|
|
205
|
+
console.print(f"[[red]MISS[/red]] Directory not found: {target_path}")
|
|
206
206
|
return [False, False, False]
|
|
207
207
|
|
|
208
208
|
console.print(f"[[green]OK[/green]] Directory exists: {target_path}")
|
|
@@ -212,21 +212,21 @@ def debug(**kwargs):
|
|
|
212
212
|
if manifest_is_ready:
|
|
213
213
|
console.print(f"[[green]OK[/green]] Manifest JSON file exists : {manifest_path}")
|
|
214
214
|
else:
|
|
215
|
-
console.print(f"[[red]MISS[/red]] Manifest JSON file
|
|
215
|
+
console.print(f"[[red]MISS[/red]] Manifest JSON file not found: {manifest_path}")
|
|
216
216
|
|
|
217
217
|
catalog_path = target_path / "catalog.json"
|
|
218
218
|
catalog_is_ready = catalog_path.is_file()
|
|
219
219
|
if catalog_is_ready:
|
|
220
220
|
console.print(f"[[green]OK[/green]] Catalog JSON file exists: {catalog_path}")
|
|
221
221
|
else:
|
|
222
|
-
console.print(f"[[red]MISS[/red]] Catalog JSON file
|
|
222
|
+
console.print(f"[[red]MISS[/red]] Catalog JSON file not found: {catalog_path}")
|
|
223
223
|
|
|
224
224
|
return [True, manifest_is_ready, catalog_is_ready]
|
|
225
225
|
|
|
226
226
|
target_path = Path(kwargs.get("target_path", "target"))
|
|
227
227
|
target_base_path = Path(kwargs.get("target_base_path", "target-base"))
|
|
228
228
|
|
|
229
|
-
curr_is_ready = check_artifacts("
|
|
229
|
+
curr_is_ready = check_artifacts("Development", target_path)
|
|
230
230
|
base_is_ready = check_artifacts("Base", target_base_path)
|
|
231
231
|
|
|
232
232
|
console.rule("Warehouse Connection", style="orange3")
|