recce-nightly 1.10.0.20250626__tar.gz → 1.10.0.20250630__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.10.0.20250626/recce_nightly.egg-info → recce_nightly-1.10.0.20250630}/PKG-INFO +1 -1
- recce_nightly-1.10.0.20250630/recce/VERSION +1 -0
- {recce_nightly-1.10.0.20250626 → recce_nightly-1.10.0.20250630}/recce/adapter/dbt_adapter/__init__.py +231 -195
- {recce_nightly-1.10.0.20250626 → recce_nightly-1.10.0.20250630}/recce/data/404.html +2 -2
- recce_nightly-1.10.0.20250630/recce/data/_next/static/chunks/3998a672-d8f888988d01023f.js +1 -0
- recce_nightly-1.10.0.20250626/recce/data/_next/static/chunks/181-acc61ddada3bc0ca.js → recce_nightly-1.10.0.20250630/recce/data/_next/static/chunks/708-9ff66431dcebf1bd.js +2 -2
- recce_nightly-1.10.0.20250630/recce/data/_next/static/chunks/92-50d227cce7a25498.js +1 -0
- recce_nightly-1.10.0.20250630/recce/data/_next/static/chunks/app/page-3daeb9d2f9ffa0ef.js +1 -0
- {recce_nightly-1.10.0.20250626 → recce_nightly-1.10.0.20250630}/recce/data/index.html +2 -2
- {recce_nightly-1.10.0.20250626 → recce_nightly-1.10.0.20250630}/recce/data/index.txt +3 -3
- {recce_nightly-1.10.0.20250626 → recce_nightly-1.10.0.20250630}/recce/server.py +6 -5
- {recce_nightly-1.10.0.20250626 → recce_nightly-1.10.0.20250630}/recce/util/lineage.py +5 -0
- {recce_nightly-1.10.0.20250626 → recce_nightly-1.10.0.20250630/recce_nightly.egg-info}/PKG-INFO +1 -1
- {recce_nightly-1.10.0.20250626 → recce_nightly-1.10.0.20250630}/recce_nightly.egg-info/SOURCES.txt +6 -6
- recce_nightly-1.10.0.20250630/tests/adapter/dbt_adapter/test_dbt_cll.py +666 -0
- {recce_nightly-1.10.0.20250626 → recce_nightly-1.10.0.20250630}/tests/test_core.py +1 -3
- recce_nightly-1.10.0.20250626/recce/VERSION +0 -1
- recce_nightly-1.10.0.20250626/recce/data/_next/static/chunks/3998a672-03adacad07b346ac.js +0 -1
- recce_nightly-1.10.0.20250626/recce/data/_next/static/chunks/92-a7039e44bc8aeae4.js +0 -1
- recce_nightly-1.10.0.20250626/recce/data/_next/static/chunks/app/page-2b926bca5d62174f.js +0 -1
- recce_nightly-1.10.0.20250626/tests/adapter/dbt_adapter/test_dbt_cll.py +0 -384
- {recce_nightly-1.10.0.20250626 → recce_nightly-1.10.0.20250630}/LICENSE +0 -0
- {recce_nightly-1.10.0.20250626 → recce_nightly-1.10.0.20250630}/README.md +0 -0
- {recce_nightly-1.10.0.20250626 → recce_nightly-1.10.0.20250630}/pyproject.toml +0 -0
- {recce_nightly-1.10.0.20250626 → recce_nightly-1.10.0.20250630}/recce/__init__.py +0 -0
- {recce_nightly-1.10.0.20250626 → recce_nightly-1.10.0.20250630}/recce/adapter/__init__.py +0 -0
- {recce_nightly-1.10.0.20250626 → recce_nightly-1.10.0.20250630}/recce/adapter/base.py +0 -0
- {recce_nightly-1.10.0.20250626 → recce_nightly-1.10.0.20250630}/recce/adapter/dbt_adapter/dbt_version.py +0 -0
- {recce_nightly-1.10.0.20250626 → recce_nightly-1.10.0.20250630}/recce/adapter/sqlmesh_adapter.py +0 -0
- {recce_nightly-1.10.0.20250626 → recce_nightly-1.10.0.20250630}/recce/apis/__init__.py +0 -0
- {recce_nightly-1.10.0.20250626 → recce_nightly-1.10.0.20250630}/recce/apis/check_api.py +0 -0
- {recce_nightly-1.10.0.20250626 → recce_nightly-1.10.0.20250630}/recce/apis/check_func.py +0 -0
- {recce_nightly-1.10.0.20250626 → recce_nightly-1.10.0.20250630}/recce/apis/run_api.py +0 -0
- {recce_nightly-1.10.0.20250626 → recce_nightly-1.10.0.20250630}/recce/apis/run_func.py +0 -0
- {recce_nightly-1.10.0.20250626 → recce_nightly-1.10.0.20250630}/recce/artifact.py +0 -0
- {recce_nightly-1.10.0.20250626 → recce_nightly-1.10.0.20250630}/recce/cli.py +0 -0
- {recce_nightly-1.10.0.20250626 → recce_nightly-1.10.0.20250630}/recce/config.py +0 -0
- {recce_nightly-1.10.0.20250626 → recce_nightly-1.10.0.20250630}/recce/connect_to_cloud.py +0 -0
- {recce_nightly-1.10.0.20250626 → recce_nightly-1.10.0.20250630}/recce/core.py +0 -0
- {recce_nightly-1.10.0.20250626 → recce_nightly-1.10.0.20250630}/recce/data/_next/static/chunks/1bff33f1-1ef85cf5e658a751.js +0 -0
- {recce_nightly-1.10.0.20250626 → recce_nightly-1.10.0.20250630}/recce/data/_next/static/chunks/217-879a84d70f7a907c.js +0 -0
- {recce_nightly-1.10.0.20250626 → recce_nightly-1.10.0.20250630}/recce/data/_next/static/chunks/29e3cc0d-60045b2e47aa3916.js +0 -0
- {recce_nightly-1.10.0.20250626 → recce_nightly-1.10.0.20250630}/recce/data/_next/static/chunks/36e1c10d-8e7be4a6c1f6ab2d.js +0 -0
- {recce_nightly-1.10.0.20250626 → recce_nightly-1.10.0.20250630}/recce/data/_next/static/chunks/3a92ee20-1081c360214f9602.js +0 -0
- {recce_nightly-1.10.0.20250626 → recce_nightly-1.10.0.20250630}/recce/data/_next/static/chunks/41-f30276c289169376.js +0 -0
- {recce_nightly-1.10.0.20250626 → recce_nightly-1.10.0.20250630}/recce/data/_next/static/chunks/450c323b-fd94e7ffaa4a5efa.js +0 -0
- {recce_nightly-1.10.0.20250626 → recce_nightly-1.10.0.20250630}/recce/data/_next/static/chunks/47d8844f-929aed9b1c73a905.js +0 -0
- {recce_nightly-1.10.0.20250626 → recce_nightly-1.10.0.20250630}/recce/data/_next/static/chunks/608-3b079b544e5d5f5e.js +0 -0
- {recce_nightly-1.10.0.20250626 → recce_nightly-1.10.0.20250630}/recce/data/_next/static/chunks/6dc81886-adbfa45836061d79.js +0 -0
- {recce_nightly-1.10.0.20250626 → recce_nightly-1.10.0.20250630}/recce/data/_next/static/chunks/7a8a3e83-edf6dc64b5d5f0a5.js +0 -0
- {recce_nightly-1.10.0.20250626 → recce_nightly-1.10.0.20250630}/recce/data/_next/static/chunks/7f27ae6c-d5f0438edd5c2a5b.js +0 -0
- {recce_nightly-1.10.0.20250626 → recce_nightly-1.10.0.20250630}/recce/data/_next/static/chunks/86730205-cfb14e3f051bab35.js +0 -0
- {recce_nightly-1.10.0.20250626 → recce_nightly-1.10.0.20250630}/recce/data/_next/static/chunks/8d700b6a.8bb140898499c512.js +0 -0
- {recce_nightly-1.10.0.20250626 → recce_nightly-1.10.0.20250630}/recce/data/_next/static/chunks/9746af58-a42b7d169cacadf0.js +0 -0
- {recce_nightly-1.10.0.20250626 → recce_nightly-1.10.0.20250630}/recce/data/_next/static/chunks/a30376cd-de84559016d7e133.js +0 -0
- {recce_nightly-1.10.0.20250626 → recce_nightly-1.10.0.20250630}/recce/data/_next/static/chunks/app/_not-found/page-01ed58b7f971d311.js +0 -0
- {recce_nightly-1.10.0.20250626 → recce_nightly-1.10.0.20250630}/recce/data/_next/static/chunks/app/layout-292f035bb0d2a98e.js +0 -0
- {recce_nightly-1.10.0.20250626 → recce_nightly-1.10.0.20250630}/recce/data/_next/static/chunks/b63b1b3f-4282bdcf459e075c.js +0 -0
- {recce_nightly-1.10.0.20250626 → recce_nightly-1.10.0.20250630}/recce/data/_next/static/chunks/bbda5537-9ec25eb1dd62348a.js +0 -0
- {recce_nightly-1.10.0.20250626 → recce_nightly-1.10.0.20250630}/recce/data/_next/static/chunks/c132bf7d-08cb668a789d6afd.js +0 -0
- {recce_nightly-1.10.0.20250626 → recce_nightly-1.10.0.20250630}/recce/data/_next/static/chunks/ce84277d-2e5d1d46910cf052.js +0 -0
- {recce_nightly-1.10.0.20250626 → recce_nightly-1.10.0.20250630}/recce/data/_next/static/chunks/febdd86e-c6b525341634b860.js +0 -0
- {recce_nightly-1.10.0.20250626 → recce_nightly-1.10.0.20250630}/recce/data/_next/static/chunks/fee69bc6-2dbccaf9b90474e6.js +0 -0
- {recce_nightly-1.10.0.20250626 → recce_nightly-1.10.0.20250630}/recce/data/_next/static/chunks/framework-ded83d71b51ce901.js +0 -0
- {recce_nightly-1.10.0.20250626 → recce_nightly-1.10.0.20250630}/recce/data/_next/static/chunks/main-app-39061b0166c47f55.js +0 -0
- {recce_nightly-1.10.0.20250626 → recce_nightly-1.10.0.20250630}/recce/data/_next/static/chunks/main-b5b3ae20a1405261.js +0 -0
- {recce_nightly-1.10.0.20250626 → recce_nightly-1.10.0.20250630}/recce/data/_next/static/chunks/pages/_app-437c455677d62394.js +0 -0
- {recce_nightly-1.10.0.20250626 → recce_nightly-1.10.0.20250630}/recce/data/_next/static/chunks/pages/_error-e7650df18ca04bde.js +0 -0
- {recce_nightly-1.10.0.20250626 → recce_nightly-1.10.0.20250630}/recce/data/_next/static/chunks/polyfills-42372ed130431b0a.js +0 -0
- {recce_nightly-1.10.0.20250626 → recce_nightly-1.10.0.20250630}/recce/data/_next/static/chunks/webpack-7b49d5ba7e3a434d.js +0 -0
- {recce_nightly-1.10.0.20250626 → recce_nightly-1.10.0.20250630}/recce/data/_next/static/css/17a96168e3a9db13.css +0 -0
- {recce_nightly-1.10.0.20250626 → recce_nightly-1.10.0.20250630}/recce/data/_next/static/css/35c6679a098e1e34.css +0 -0
- {recce_nightly-1.10.0.20250626 → recce_nightly-1.10.0.20250630}/recce/data/_next/static/css/951e2e0eea2d4a5b.css +0 -0
- {recce_nightly-1.10.0.20250626 → recce_nightly-1.10.0.20250630}/recce/data/_next/static/css/a2b12b4ba4227f0a.css +0 -0
- {recce_nightly-1.10.0.20250626/recce/data/_next/static/GQi98nWlz4aR914nimi1i → recce_nightly-1.10.0.20250630/recce/data/_next/static/gjlMeLxcm3GSibv55ZUM_}/_buildManifest.js +0 -0
- {recce_nightly-1.10.0.20250626/recce/data/_next/static/GQi98nWlz4aR914nimi1i → recce_nightly-1.10.0.20250630/recce/data/_next/static/gjlMeLxcm3GSibv55ZUM_}/_ssgManifest.js +0 -0
- {recce_nightly-1.10.0.20250626 → recce_nightly-1.10.0.20250630}/recce/data/_next/static/media/montserrat-cyrillic-800-normal.22628180.woff2 +0 -0
- {recce_nightly-1.10.0.20250626 → recce_nightly-1.10.0.20250630}/recce/data/_next/static/media/montserrat-cyrillic-800-normal.bd5c9f50.woff +0 -0
- {recce_nightly-1.10.0.20250626 → recce_nightly-1.10.0.20250630}/recce/data/_next/static/media/montserrat-cyrillic-ext-800-normal.94a63aea.woff2 +0 -0
- {recce_nightly-1.10.0.20250626 → recce_nightly-1.10.0.20250630}/recce/data/_next/static/media/montserrat-cyrillic-ext-800-normal.e6e0d8d0.woff +0 -0
- {recce_nightly-1.10.0.20250626 → recce_nightly-1.10.0.20250630}/recce/data/_next/static/media/montserrat-latin-800-normal.6f8fa298.woff2 +0 -0
- {recce_nightly-1.10.0.20250626 → recce_nightly-1.10.0.20250630}/recce/data/_next/static/media/montserrat-latin-800-normal.fc315020.woff +0 -0
- {recce_nightly-1.10.0.20250626 → recce_nightly-1.10.0.20250630}/recce/data/_next/static/media/montserrat-latin-ext-800-normal.013b84f9.woff2 +0 -0
- {recce_nightly-1.10.0.20250626 → recce_nightly-1.10.0.20250630}/recce/data/_next/static/media/montserrat-latin-ext-800-normal.2e5381b2.woff +0 -0
- {recce_nightly-1.10.0.20250626 → recce_nightly-1.10.0.20250630}/recce/data/_next/static/media/montserrat-vietnamese-800-normal.20c545e6.woff +0 -0
- {recce_nightly-1.10.0.20250626 → recce_nightly-1.10.0.20250630}/recce/data/_next/static/media/montserrat-vietnamese-800-normal.c0035377.woff2 +0 -0
- {recce_nightly-1.10.0.20250626 → recce_nightly-1.10.0.20250630}/recce/data/_next/static/media/reload-image.79aabb7d.svg +0 -0
- {recce_nightly-1.10.0.20250626 → recce_nightly-1.10.0.20250630}/recce/data/auth_callback.html +0 -0
- {recce_nightly-1.10.0.20250626 → recce_nightly-1.10.0.20250630}/recce/data/favicon.ico +0 -0
- {recce_nightly-1.10.0.20250626 → recce_nightly-1.10.0.20250630}/recce/data/imgs/feedback/thumbs-down.png +0 -0
- {recce_nightly-1.10.0.20250626 → recce_nightly-1.10.0.20250630}/recce/data/imgs/feedback/thumbs-up.png +0 -0
- {recce_nightly-1.10.0.20250626 → recce_nightly-1.10.0.20250630}/recce/data/imgs/reload-image.svg +0 -0
- {recce_nightly-1.10.0.20250626 → recce_nightly-1.10.0.20250630}/recce/data/logo/recce-logo-white.png +0 -0
- {recce_nightly-1.10.0.20250626 → recce_nightly-1.10.0.20250630}/recce/diff.py +0 -0
- {recce_nightly-1.10.0.20250626 → recce_nightly-1.10.0.20250630}/recce/event/CONFIG +0 -0
- {recce_nightly-1.10.0.20250626 → recce_nightly-1.10.0.20250630}/recce/event/SENTRY_DNS +0 -0
- {recce_nightly-1.10.0.20250626 → recce_nightly-1.10.0.20250630}/recce/event/__init__.py +0 -0
- {recce_nightly-1.10.0.20250626 → recce_nightly-1.10.0.20250630}/recce/event/collector.py +0 -0
- {recce_nightly-1.10.0.20250626 → recce_nightly-1.10.0.20250630}/recce/event/track.py +0 -0
- {recce_nightly-1.10.0.20250626 → recce_nightly-1.10.0.20250630}/recce/exceptions.py +0 -0
- {recce_nightly-1.10.0.20250626 → recce_nightly-1.10.0.20250630}/recce/git.py +0 -0
- {recce_nightly-1.10.0.20250626 → recce_nightly-1.10.0.20250630}/recce/github.py +0 -0
- {recce_nightly-1.10.0.20250626 → recce_nightly-1.10.0.20250630}/recce/models/__init__.py +0 -0
- {recce_nightly-1.10.0.20250626 → recce_nightly-1.10.0.20250630}/recce/models/check.py +0 -0
- {recce_nightly-1.10.0.20250626 → recce_nightly-1.10.0.20250630}/recce/models/run.py +0 -0
- {recce_nightly-1.10.0.20250626 → recce_nightly-1.10.0.20250630}/recce/models/types.py +0 -0
- {recce_nightly-1.10.0.20250626 → recce_nightly-1.10.0.20250630}/recce/pull_request.py +0 -0
- {recce_nightly-1.10.0.20250626 → recce_nightly-1.10.0.20250630}/recce/run.py +0 -0
- {recce_nightly-1.10.0.20250626 → recce_nightly-1.10.0.20250630}/recce/state.py +0 -0
- {recce_nightly-1.10.0.20250626 → recce_nightly-1.10.0.20250630}/recce/summary.py +0 -0
- {recce_nightly-1.10.0.20250626 → recce_nightly-1.10.0.20250630}/recce/tasks/__init__.py +0 -0
- {recce_nightly-1.10.0.20250626 → recce_nightly-1.10.0.20250630}/recce/tasks/core.py +0 -0
- {recce_nightly-1.10.0.20250626 → recce_nightly-1.10.0.20250630}/recce/tasks/dataframe.py +0 -0
- {recce_nightly-1.10.0.20250626 → recce_nightly-1.10.0.20250630}/recce/tasks/histogram.py +0 -0
- {recce_nightly-1.10.0.20250626 → recce_nightly-1.10.0.20250630}/recce/tasks/lineage.py +0 -0
- {recce_nightly-1.10.0.20250626 → recce_nightly-1.10.0.20250630}/recce/tasks/profile.py +0 -0
- {recce_nightly-1.10.0.20250626 → recce_nightly-1.10.0.20250630}/recce/tasks/query.py +0 -0
- {recce_nightly-1.10.0.20250626 → recce_nightly-1.10.0.20250630}/recce/tasks/rowcount.py +0 -0
- {recce_nightly-1.10.0.20250626 → recce_nightly-1.10.0.20250630}/recce/tasks/schema.py +0 -0
- {recce_nightly-1.10.0.20250626 → recce_nightly-1.10.0.20250630}/recce/tasks/top_k.py +0 -0
- {recce_nightly-1.10.0.20250626 → recce_nightly-1.10.0.20250630}/recce/tasks/valuediff.py +0 -0
- {recce_nightly-1.10.0.20250626 → recce_nightly-1.10.0.20250630}/recce/util/__init__.py +0 -0
- {recce_nightly-1.10.0.20250626 → recce_nightly-1.10.0.20250630}/recce/util/api_token.py +0 -0
- {recce_nightly-1.10.0.20250626 → recce_nightly-1.10.0.20250630}/recce/util/breaking.py +0 -0
- {recce_nightly-1.10.0.20250626 → recce_nightly-1.10.0.20250630}/recce/util/cache.py +0 -0
- {recce_nightly-1.10.0.20250626 → recce_nightly-1.10.0.20250630}/recce/util/cll.py +0 -0
- {recce_nightly-1.10.0.20250626 → recce_nightly-1.10.0.20250630}/recce/util/io.py +0 -0
- {recce_nightly-1.10.0.20250626 → recce_nightly-1.10.0.20250630}/recce/util/logger.py +0 -0
- {recce_nightly-1.10.0.20250626 → recce_nightly-1.10.0.20250630}/recce/util/onboarding_state.py +0 -0
- {recce_nightly-1.10.0.20250626 → recce_nightly-1.10.0.20250630}/recce/util/pydantic_model.py +0 -0
- {recce_nightly-1.10.0.20250626 → recce_nightly-1.10.0.20250630}/recce/util/recce_cloud.py +0 -0
- {recce_nightly-1.10.0.20250626 → recce_nightly-1.10.0.20250630}/recce/util/singleton.py +0 -0
- {recce_nightly-1.10.0.20250626 → recce_nightly-1.10.0.20250630}/recce/yaml/__init__.py +0 -0
- {recce_nightly-1.10.0.20250626 → recce_nightly-1.10.0.20250630}/recce_nightly.egg-info/dependency_links.txt +0 -0
- {recce_nightly-1.10.0.20250626 → recce_nightly-1.10.0.20250630}/recce_nightly.egg-info/entry_points.txt +0 -0
- {recce_nightly-1.10.0.20250626 → recce_nightly-1.10.0.20250630}/recce_nightly.egg-info/requires.txt +0 -0
- {recce_nightly-1.10.0.20250626 → recce_nightly-1.10.0.20250630}/recce_nightly.egg-info/top_level.txt +0 -0
- {recce_nightly-1.10.0.20250626 → recce_nightly-1.10.0.20250630}/setup.cfg +0 -0
- {recce_nightly-1.10.0.20250626 → recce_nightly-1.10.0.20250630}/setup.py +0 -0
- {recce_nightly-1.10.0.20250626 → recce_nightly-1.10.0.20250630}/tests/__init__.py +0 -0
- {recce_nightly-1.10.0.20250626 → recce_nightly-1.10.0.20250630}/tests/adapter/__init__.py +0 -0
- {recce_nightly-1.10.0.20250626 → recce_nightly-1.10.0.20250630}/tests/adapter/dbt_adapter/__init__.py +0 -0
- {recce_nightly-1.10.0.20250626 → recce_nightly-1.10.0.20250630}/tests/adapter/dbt_adapter/conftest.py +0 -0
- {recce_nightly-1.10.0.20250626 → recce_nightly-1.10.0.20250630}/tests/adapter/dbt_adapter/dbt_test_helper.py +0 -0
- {recce_nightly-1.10.0.20250626 → recce_nightly-1.10.0.20250630}/tests/adapter/dbt_adapter/test_dbt_adapter.py +0 -0
- {recce_nightly-1.10.0.20250626 → recce_nightly-1.10.0.20250630}/tests/adapter/dbt_adapter/test_selector.py +0 -0
- {recce_nightly-1.10.0.20250626 → recce_nightly-1.10.0.20250630}/tests/tasks/__init__.py +0 -0
- {recce_nightly-1.10.0.20250626 → recce_nightly-1.10.0.20250630}/tests/tasks/conftest.py +0 -0
- {recce_nightly-1.10.0.20250626 → recce_nightly-1.10.0.20250630}/tests/tasks/test_histogram.py +0 -0
- {recce_nightly-1.10.0.20250626 → recce_nightly-1.10.0.20250630}/tests/tasks/test_lineage.py +0 -0
- {recce_nightly-1.10.0.20250626 → recce_nightly-1.10.0.20250630}/tests/tasks/test_preset_checks.py +0 -0
- {recce_nightly-1.10.0.20250626 → recce_nightly-1.10.0.20250630}/tests/tasks/test_profile.py +0 -0
- {recce_nightly-1.10.0.20250626 → recce_nightly-1.10.0.20250630}/tests/tasks/test_query.py +0 -0
- {recce_nightly-1.10.0.20250626 → recce_nightly-1.10.0.20250630}/tests/tasks/test_row_count.py +0 -0
- {recce_nightly-1.10.0.20250626 → recce_nightly-1.10.0.20250630}/tests/tasks/test_schema.py +0 -0
- {recce_nightly-1.10.0.20250626 → recce_nightly-1.10.0.20250630}/tests/tasks/test_top_k.py +0 -0
- {recce_nightly-1.10.0.20250626 → recce_nightly-1.10.0.20250630}/tests/tasks/test_valuediff.py +0 -0
- {recce_nightly-1.10.0.20250626 → recce_nightly-1.10.0.20250630}/tests/test_cli.py +0 -0
- {recce_nightly-1.10.0.20250626 → recce_nightly-1.10.0.20250630}/tests/test_config.py +0 -0
- {recce_nightly-1.10.0.20250626 → recce_nightly-1.10.0.20250630}/tests/test_connect_to_cloud.py +0 -0
- {recce_nightly-1.10.0.20250626 → recce_nightly-1.10.0.20250630}/tests/test_dbt.py +0 -0
- {recce_nightly-1.10.0.20250626 → recce_nightly-1.10.0.20250630}/tests/test_pull_request.py +0 -0
- {recce_nightly-1.10.0.20250626 → recce_nightly-1.10.0.20250630}/tests/test_server.py +0 -0
- {recce_nightly-1.10.0.20250626 → recce_nightly-1.10.0.20250630}/tests/test_state.py +0 -0
- {recce_nightly-1.10.0.20250626 → recce_nightly-1.10.0.20250630}/tests/test_summary.py +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
1.10.0.20250630
|
|
@@ -3,6 +3,7 @@ import logging
|
|
|
3
3
|
import os
|
|
4
4
|
import uuid
|
|
5
5
|
from contextlib import contextmanager
|
|
6
|
+
from copy import deepcopy
|
|
6
7
|
from dataclasses import dataclass, fields
|
|
7
8
|
from errno import ENOENT
|
|
8
9
|
from functools import lru_cache
|
|
@@ -25,15 +26,14 @@ from recce.event import log_performance
|
|
|
25
26
|
from recce.exceptions import RecceException
|
|
26
27
|
from recce.util.cll import CLLPerformanceTracking, cll
|
|
27
28
|
from recce.util.lineage import (
|
|
29
|
+
build_column_key,
|
|
28
30
|
filter_dependency_maps,
|
|
29
|
-
filter_lineage_vertices,
|
|
30
|
-
find_column_dependencies,
|
|
31
31
|
find_downstream,
|
|
32
32
|
find_upstream,
|
|
33
33
|
)
|
|
34
34
|
|
|
35
35
|
from ...tasks.profile import ProfileTask
|
|
36
|
-
from ...util.breaking import
|
|
36
|
+
from ...util.breaking import parse_change_category
|
|
37
37
|
|
|
38
38
|
try:
|
|
39
39
|
import agate
|
|
@@ -793,15 +793,38 @@ class DbtAdapter(BaseAdapter):
|
|
|
793
793
|
def _get_lineage_diff_cached(self, cache_key) -> LineageDiff:
|
|
794
794
|
base = self.get_lineage(base=True)
|
|
795
795
|
current = self.get_lineage(base=False)
|
|
796
|
-
keys = {*base.get("nodes", {}).keys(), *current.get("nodes", {}).keys()}
|
|
797
796
|
|
|
798
|
-
|
|
799
|
-
|
|
800
|
-
|
|
797
|
+
modified_nodes = self.select_nodes(select="state:modified")
|
|
798
|
+
diff = {}
|
|
799
|
+
for node_id in modified_nodes:
|
|
800
|
+
base_node = base.get("nodes", {}).get(node_id)
|
|
801
|
+
curr_node = current.get("nodes", {}).get(node_id)
|
|
802
|
+
if base_node and curr_node:
|
|
803
|
+
diff[node_id] = NodeDiff(change_status="modified")
|
|
804
|
+
elif base_node:
|
|
805
|
+
diff[node_id] = NodeDiff(change_status="removed")
|
|
806
|
+
elif curr_node:
|
|
807
|
+
diff[node_id] = NodeDiff(change_status="added")
|
|
808
|
+
|
|
809
|
+
return LineageDiff(
|
|
810
|
+
base=base,
|
|
811
|
+
current=current,
|
|
812
|
+
diff=diff,
|
|
813
|
+
)
|
|
814
|
+
|
|
815
|
+
@lru_cache(maxsize=128)
|
|
816
|
+
def get_change_analysis_cached(self, node_id: str):
|
|
817
|
+
lineage_diff = self.get_lineage_diff()
|
|
818
|
+
diff = lineage_diff.diff
|
|
819
|
+
|
|
820
|
+
if node_id not in diff or diff[node_id].change_status != "modified":
|
|
821
|
+
return diff.get(node_id)
|
|
822
|
+
|
|
823
|
+
base = lineage_diff.base
|
|
824
|
+
current = lineage_diff.current
|
|
801
825
|
|
|
802
826
|
base_manifest = as_manifest(self.get_manifest(True))
|
|
803
827
|
curr_manifest = as_manifest(self.get_manifest(False))
|
|
804
|
-
perf_tracking.record_checkpoint("manifest")
|
|
805
828
|
|
|
806
829
|
def ref_func(*args):
|
|
807
830
|
if len(args) == 1:
|
|
@@ -821,108 +844,91 @@ class DbtAdapter(BaseAdapter):
|
|
|
821
844
|
source=source_func,
|
|
822
845
|
)
|
|
823
846
|
|
|
824
|
-
|
|
825
|
-
|
|
826
|
-
|
|
827
|
-
|
|
828
|
-
curr_node
|
|
829
|
-
|
|
830
|
-
|
|
831
|
-
|
|
832
|
-
|
|
833
|
-
|
|
834
|
-
|
|
835
|
-
|
|
836
|
-
|
|
837
|
-
|
|
838
|
-
|
|
839
|
-
|
|
840
|
-
|
|
841
|
-
|
|
842
|
-
|
|
843
|
-
|
|
844
|
-
|
|
845
|
-
|
|
846
|
-
|
|
847
|
-
|
|
848
|
-
|
|
849
|
-
|
|
850
|
-
|
|
851
|
-
|
|
852
|
-
|
|
853
|
-
|
|
854
|
-
|
|
855
|
-
|
|
856
|
-
|
|
857
|
-
|
|
858
|
-
|
|
859
|
-
|
|
860
|
-
|
|
861
|
-
|
|
862
|
-
|
|
863
|
-
|
|
864
|
-
|
|
865
|
-
|
|
866
|
-
|
|
867
|
-
|
|
868
|
-
|
|
869
|
-
|
|
870
|
-
|
|
871
|
-
|
|
872
|
-
|
|
873
|
-
|
|
874
|
-
|
|
875
|
-
|
|
876
|
-
base_sql,
|
|
877
|
-
curr_sql,
|
|
878
|
-
old_schema=base_schema,
|
|
879
|
-
new_schema=curr_schema,
|
|
880
|
-
dialect=dialect,
|
|
881
|
-
perf_tracking=perf_tracking,
|
|
882
|
-
)
|
|
883
|
-
|
|
884
|
-
# Make sure that the case of the column names are the same
|
|
885
|
-
changed_columns = {
|
|
886
|
-
column.lower(): change_status for column, change_status in (change.columns or {}).items()
|
|
887
|
-
}
|
|
888
|
-
changed_columns_names = set(changed_columns)
|
|
889
|
-
changed_columns_final = {}
|
|
847
|
+
base_node = base.get("nodes", {}).get(node_id)
|
|
848
|
+
curr_node = current.get("nodes", {}).get(node_id)
|
|
849
|
+
change = NodeChange(category="unknown")
|
|
850
|
+
if (
|
|
851
|
+
curr_node.get("resource_type") in ["model", "snapshot"]
|
|
852
|
+
and curr_node.get("raw_code") is not None
|
|
853
|
+
and base_node.get("raw_code") is not None
|
|
854
|
+
):
|
|
855
|
+
try:
|
|
856
|
+
|
|
857
|
+
def _get_schema(lineage):
|
|
858
|
+
schema = {}
|
|
859
|
+
nodes = lineage["nodes"]
|
|
860
|
+
parent_list = lineage["parent_map"].get(node_id, [])
|
|
861
|
+
for parent_id in parent_list:
|
|
862
|
+
parent_node = nodes.get(parent_id)
|
|
863
|
+
if parent_node is None:
|
|
864
|
+
continue
|
|
865
|
+
columns = parent_node.get("columns") or {}
|
|
866
|
+
name = parent_node.get("name")
|
|
867
|
+
if parent_node.get("resource_type") == "source":
|
|
868
|
+
parts = parent_id.split(".")
|
|
869
|
+
source = parts[2]
|
|
870
|
+
table = parts[3]
|
|
871
|
+
source = source.replace("-", "_")
|
|
872
|
+
name = f"__{source}__{table}"
|
|
873
|
+
schema[name] = {name: column.get("type") for name, column in columns.items()}
|
|
874
|
+
return schema
|
|
875
|
+
|
|
876
|
+
base_sql = self.generate_sql(
|
|
877
|
+
base_node.get("raw_code"),
|
|
878
|
+
context=jinja_context,
|
|
879
|
+
provided_manifest=base_manifest,
|
|
880
|
+
)
|
|
881
|
+
curr_sql = self.generate_sql(
|
|
882
|
+
curr_node.get("raw_code"),
|
|
883
|
+
context=jinja_context,
|
|
884
|
+
provided_manifest=curr_manifest,
|
|
885
|
+
)
|
|
886
|
+
base_schema = _get_schema(base)
|
|
887
|
+
curr_schema = _get_schema(current)
|
|
888
|
+
dialect = self.adapter.connections.TYPE
|
|
889
|
+
if curr_manifest.metadata.adapter_type is not None:
|
|
890
|
+
dialect = curr_manifest.metadata.adapter_type
|
|
891
|
+
|
|
892
|
+
change = parse_change_category(
|
|
893
|
+
base_sql,
|
|
894
|
+
curr_sql,
|
|
895
|
+
old_schema=base_schema,
|
|
896
|
+
new_schema=curr_schema,
|
|
897
|
+
dialect=dialect,
|
|
898
|
+
)
|
|
890
899
|
|
|
891
|
-
|
|
892
|
-
|
|
893
|
-
|
|
900
|
+
# Make sure that the case of the column names are the same
|
|
901
|
+
changed_columns = {
|
|
902
|
+
column.lower(): change_status for column, change_status in (change.columns or {}).items()
|
|
903
|
+
}
|
|
904
|
+
changed_columns_names = set(changed_columns)
|
|
905
|
+
changed_columns_final = {}
|
|
894
906
|
|
|
895
|
-
|
|
896
|
-
|
|
897
|
-
|
|
907
|
+
base_columns = base_node.get("columns") or {}
|
|
908
|
+
curr_columns = curr_node.get("columns") or {}
|
|
909
|
+
columns_names = set(base_columns) | set(curr_columns)
|
|
898
910
|
|
|
899
|
-
|
|
900
|
-
|
|
901
|
-
|
|
911
|
+
for column_name in columns_names:
|
|
912
|
+
if column_name.lower() in changed_columns_names:
|
|
913
|
+
changed_columns_final[column_name] = changed_columns[column_name.lower()]
|
|
902
914
|
|
|
903
|
-
|
|
904
|
-
|
|
905
|
-
|
|
906
|
-
|
|
907
|
-
diff[key] = NodeDiff(change_status="added")
|
|
908
|
-
|
|
909
|
-
perf_tracking.end_lineage_diff()
|
|
910
|
-
log_performance("model lineage diff", perf_tracking.to_dict())
|
|
915
|
+
change.columns = changed_columns_final
|
|
916
|
+
except Exception:
|
|
917
|
+
# TODO: telemetry
|
|
918
|
+
pass
|
|
911
919
|
|
|
912
|
-
|
|
913
|
-
|
|
914
|
-
|
|
915
|
-
diff=diff,
|
|
916
|
-
)
|
|
920
|
+
node_diff = diff.get(node_id)
|
|
921
|
+
node_diff.change = change
|
|
922
|
+
return node_diff
|
|
917
923
|
|
|
918
924
|
def get_cll(
|
|
919
925
|
self,
|
|
920
926
|
node_id: Optional[str] = None,
|
|
921
927
|
column: Optional[str] = None,
|
|
922
928
|
change_analysis: Optional[bool] = False,
|
|
923
|
-
|
|
924
|
-
|
|
925
|
-
|
|
929
|
+
no_cll: Optional[bool] = False,
|
|
930
|
+
no_upstream: Optional[bool] = False,
|
|
931
|
+
no_downstream: Optional[bool] = False,
|
|
926
932
|
no_filter: Optional[bool] = False,
|
|
927
933
|
) -> CllData:
|
|
928
934
|
cll_tracker = CLLPerformanceTracking()
|
|
@@ -936,19 +942,19 @@ class DbtAdapter(BaseAdapter):
|
|
|
936
942
|
cll_node_ids = {node_id}
|
|
937
943
|
else:
|
|
938
944
|
lineage_diff = self.get_lineage_diff()
|
|
939
|
-
cll_node_ids = lineage_diff.diff.keys()
|
|
945
|
+
cll_node_ids = set(lineage_diff.diff.keys())
|
|
940
946
|
|
|
941
947
|
nodes = {}
|
|
942
948
|
columns = {}
|
|
943
949
|
parent_map = {}
|
|
944
950
|
child_map = {}
|
|
945
951
|
|
|
946
|
-
if
|
|
952
|
+
if not no_upstream:
|
|
947
953
|
cll_node_ids = cll_node_ids.union(find_upstream(cll_node_ids, manifest_dict.get("parent_map")))
|
|
948
|
-
if
|
|
954
|
+
if not no_downstream:
|
|
949
955
|
cll_node_ids = cll_node_ids.union(find_downstream(cll_node_ids, manifest_dict.get("child_map")))
|
|
950
956
|
|
|
951
|
-
if
|
|
957
|
+
if not no_cll:
|
|
952
958
|
for cll_node_id in cll_node_ids:
|
|
953
959
|
if (
|
|
954
960
|
cll_node_id not in manifest.sources
|
|
@@ -956,27 +962,93 @@ class DbtAdapter(BaseAdapter):
|
|
|
956
962
|
and cll_node_id not in manifest.exposures
|
|
957
963
|
):
|
|
958
964
|
continue
|
|
959
|
-
cll_data_one = self.get_cll_cached(cll_node_id, base=False)
|
|
965
|
+
cll_data_one = deepcopy(self.get_cll_cached(cll_node_id, base=False))
|
|
960
966
|
if cll_data_one is None:
|
|
961
967
|
continue
|
|
962
968
|
|
|
963
|
-
|
|
964
|
-
|
|
965
|
-
|
|
966
|
-
|
|
967
|
-
if node_diff is not None:
|
|
968
|
-
|
|
969
|
-
if node_diff.change is not None:
|
|
970
|
-
n.change_category = node_diff.change.category
|
|
969
|
+
nodes[cll_node_id] = cll_data_one.nodes.get(cll_node_id)
|
|
970
|
+
node_diff = self.get_change_analysis_cached(cll_node_id) if change_analysis else None
|
|
971
|
+
if node_diff is not None:
|
|
972
|
+
nodes[cll_node_id].change_status = node_diff.change_status
|
|
973
|
+
if node_diff.change is not None:
|
|
974
|
+
nodes[cll_node_id].change_category = node_diff.change.category
|
|
971
975
|
for c_id, c in cll_data_one.columns.items():
|
|
972
976
|
columns[c_id] = c
|
|
973
|
-
if node_diff is not None and node_diff.change is not None:
|
|
977
|
+
if node_diff is not None and node_diff.change is not None and node_diff.change.columns is not None:
|
|
974
978
|
column_diff = node_diff.change.columns.get(c.name)
|
|
975
979
|
if column_diff:
|
|
976
980
|
c.change_status = column_diff
|
|
977
981
|
|
|
978
982
|
for p_id, parents in cll_data_one.parent_map.items():
|
|
979
983
|
parent_map[p_id] = parents
|
|
984
|
+
else:
|
|
985
|
+
for cll_node_id in cll_node_ids:
|
|
986
|
+
cll_node = None
|
|
987
|
+
cll_node_columns: Dict[str, CllColumn] = {}
|
|
988
|
+
|
|
989
|
+
if cll_node_id in manifest.sources:
|
|
990
|
+
n = manifest.sources[cll_node_id]
|
|
991
|
+
cll_node = CllNode(
|
|
992
|
+
id=n.unique_id,
|
|
993
|
+
name=n.name,
|
|
994
|
+
source_name=n.source_name,
|
|
995
|
+
package_name=n.package_name,
|
|
996
|
+
)
|
|
997
|
+
if self.curr_catalog and cll_node_id in self.curr_catalog.sources:
|
|
998
|
+
cll_node_columns = {
|
|
999
|
+
column.name: CllColumn(
|
|
1000
|
+
id=f"{cll_node_id}_{column.name}",
|
|
1001
|
+
table_id=cll_node_id,
|
|
1002
|
+
name=column.name,
|
|
1003
|
+
type=column.type,
|
|
1004
|
+
)
|
|
1005
|
+
for column in self.curr_catalog.sources[cll_node_id].columns.values()
|
|
1006
|
+
}
|
|
1007
|
+
elif cll_node_id in manifest.nodes:
|
|
1008
|
+
n = manifest.nodes[cll_node_id]
|
|
1009
|
+
if n.resource_type not in ["model", "seed", "snapshot"]:
|
|
1010
|
+
continue
|
|
1011
|
+
cll_node = CllNode(
|
|
1012
|
+
id=n.unique_id,
|
|
1013
|
+
name=n.name,
|
|
1014
|
+
package_name=n.package_name,
|
|
1015
|
+
resource_type=n.resource_type,
|
|
1016
|
+
)
|
|
1017
|
+
if self.curr_catalog and cll_node_id in self.curr_catalog.nodes:
|
|
1018
|
+
cll_node_columns = {
|
|
1019
|
+
column.name: CllColumn(
|
|
1020
|
+
id=f"{cll_node_id}_{column.name}",
|
|
1021
|
+
table_id=cll_node_id,
|
|
1022
|
+
name=column.name,
|
|
1023
|
+
type=column.type,
|
|
1024
|
+
)
|
|
1025
|
+
for column in self.curr_catalog.nodes[cll_node_id].columns.values()
|
|
1026
|
+
}
|
|
1027
|
+
elif cll_node_id in manifest.exposures:
|
|
1028
|
+
n = manifest.exposures[cll_node_id]
|
|
1029
|
+
cll_node = CllNode(
|
|
1030
|
+
id=n.unique_id,
|
|
1031
|
+
name=n.name,
|
|
1032
|
+
package_name=n.package_name,
|
|
1033
|
+
resource_type=n.resource_type,
|
|
1034
|
+
)
|
|
1035
|
+
|
|
1036
|
+
if not cll_node:
|
|
1037
|
+
continue
|
|
1038
|
+
nodes[cll_node_id] = cll_node
|
|
1039
|
+
|
|
1040
|
+
node_diff = self.get_change_analysis_cached(cll_node_id) if change_analysis else None
|
|
1041
|
+
if node_diff is not None:
|
|
1042
|
+
cll_node.change_status = node_diff.change_status
|
|
1043
|
+
if node_diff.change is not None:
|
|
1044
|
+
cll_node.change_category = node_diff.change.category
|
|
1045
|
+
for c, cll_column in cll_node_columns.items():
|
|
1046
|
+
cll_node.columns[c] = cll_column
|
|
1047
|
+
columns[cll_column.id] = cll_column
|
|
1048
|
+
if node_diff.change.columns and c in node_diff.change.columns:
|
|
1049
|
+
cll_column.change_status = node_diff.change.columns[c]
|
|
1050
|
+
|
|
1051
|
+
parent_map[cll_node_id] = manifest.parent_map.get(cll_node_id, [])
|
|
980
1052
|
|
|
981
1053
|
# build the child map
|
|
982
1054
|
for parent_id, parents in parent_map.items():
|
|
@@ -987,43 +1059,69 @@ class DbtAdapter(BaseAdapter):
|
|
|
987
1059
|
|
|
988
1060
|
# Find the anchor nodes
|
|
989
1061
|
anchor_node_ids = set()
|
|
1062
|
+
extra_node_ids = set()
|
|
990
1063
|
if node_id is None and column is None:
|
|
991
1064
|
if change_analysis:
|
|
992
1065
|
# If change analysis is requested, we need to find the nodes that have changes
|
|
993
|
-
for
|
|
994
|
-
|
|
995
|
-
|
|
996
|
-
|
|
997
|
-
|
|
1066
|
+
for nid in self.get_lineage_diff().diff.keys():
|
|
1067
|
+
node_diff = self.get_change_analysis_cached(nid)
|
|
1068
|
+
if node_diff is not None and node_diff.change is not None:
|
|
1069
|
+
extra_node_ids.add(nid)
|
|
1070
|
+
if no_cll:
|
|
1071
|
+
if node_diff.change.category in ["breaking", "partial_breaking", "unknown"]:
|
|
1072
|
+
anchor_node_ids.add(nid)
|
|
1073
|
+
else:
|
|
1074
|
+
if node_diff.change.category in ["breaking", "unknown"]:
|
|
1075
|
+
anchor_node_ids.add(nid)
|
|
1076
|
+
if node_diff.change.columns is not None:
|
|
1077
|
+
for column_name in node_diff.change.columns:
|
|
1078
|
+
anchor_node_ids.add(f"{nid}_{column_name}")
|
|
998
1079
|
else:
|
|
999
1080
|
lineage_diff = self.get_lineage_diff()
|
|
1000
1081
|
anchor_node_ids = lineage_diff.diff.keys()
|
|
1001
1082
|
elif node_id is not None and column is None:
|
|
1002
1083
|
if change_analysis:
|
|
1003
1084
|
# If change analysis is requested, we need to find the nodes that have changes
|
|
1004
|
-
node_diff = self.
|
|
1005
|
-
if node_diff:
|
|
1006
|
-
|
|
1007
|
-
|
|
1008
|
-
|
|
1009
|
-
|
|
1085
|
+
node_diff = self.get_change_analysis_cached(node_id)
|
|
1086
|
+
if node_diff is not None and node_diff.change is not None:
|
|
1087
|
+
extra_node_ids.add(node_id)
|
|
1088
|
+
if no_cll:
|
|
1089
|
+
if node_diff.change.category in ["breaking", "partial_breaking", "unknown"]:
|
|
1090
|
+
anchor_node_ids.add(node_id)
|
|
1091
|
+
else:
|
|
1092
|
+
if node_diff.change.category in ["breaking", "unknown"]:
|
|
1093
|
+
anchor_node_ids.add(node_id)
|
|
1094
|
+
if node_diff.change.columns is not None:
|
|
1095
|
+
for column_name in node_diff.change.columns:
|
|
1096
|
+
anchor_node_ids.add(f"{node_id}_{column_name}")
|
|
1010
1097
|
else:
|
|
1011
1098
|
anchor_node_ids.add(node_id)
|
|
1012
1099
|
else:
|
|
1013
1100
|
anchor_node_ids.add(node_id)
|
|
1101
|
+
if not no_cll:
|
|
1102
|
+
node = nodes.get(node_id)
|
|
1103
|
+
if node:
|
|
1104
|
+
for column_name in node.columns:
|
|
1105
|
+
column_key = build_column_key(node_id, column_name)
|
|
1106
|
+
anchor_node_ids.add(column_key)
|
|
1014
1107
|
else:
|
|
1015
1108
|
anchor_node_ids.add(f"{node_id}_{column}")
|
|
1016
1109
|
|
|
1017
1110
|
result_node_ids = set(anchor_node_ids)
|
|
1018
|
-
if
|
|
1111
|
+
if not no_upstream:
|
|
1019
1112
|
result_node_ids = result_node_ids.union(find_upstream(anchor_node_ids, parent_map))
|
|
1020
|
-
if
|
|
1113
|
+
if not no_downstream:
|
|
1021
1114
|
result_node_ids = result_node_ids.union(find_downstream(anchor_node_ids, child_map))
|
|
1022
1115
|
|
|
1023
1116
|
# Filter the nodes and columns based on the anchor nodes
|
|
1024
1117
|
if not no_filter:
|
|
1025
|
-
nodes = {k: v for k, v in nodes.items() if k in result_node_ids}
|
|
1026
|
-
columns = {k: v for k, v in columns.items() if k in result_node_ids}
|
|
1118
|
+
nodes = {k: v for k, v in nodes.items() if k in result_node_ids or k in extra_node_ids}
|
|
1119
|
+
columns = {k: v for k, v in columns.items() if k in result_node_ids or k in extra_node_ids}
|
|
1120
|
+
|
|
1121
|
+
for node in nodes.values():
|
|
1122
|
+
node.columns = {
|
|
1123
|
+
k: v for k, v in node.columns.items() if v.id in result_node_ids or v.id in extra_node_ids
|
|
1124
|
+
}
|
|
1027
1125
|
parent_map, child_map = filter_dependency_maps(parent_map, child_map, result_node_ids)
|
|
1028
1126
|
|
|
1029
1127
|
cll_tracker.end_column_lineage()
|
|
@@ -1250,73 +1348,6 @@ class DbtAdapter(BaseAdapter):
|
|
|
1250
1348
|
}
|
|
1251
1349
|
return None
|
|
1252
1350
|
|
|
1253
|
-
def get_impact_radius(self, node_id: str) -> CllData:
|
|
1254
|
-
impacted_nodes = self.get_impacted_nodes(node_id)
|
|
1255
|
-
impacted_cll = self.get_impacted_cll(node_id)
|
|
1256
|
-
|
|
1257
|
-
# merge impact radius
|
|
1258
|
-
return self._merge_cll_data(impacted_nodes, impacted_cll)
|
|
1259
|
-
|
|
1260
|
-
def get_impacted_nodes(self, node_id: str) -> CllData:
|
|
1261
|
-
lineage_diff = self.get_lineage_diff()
|
|
1262
|
-
diff_info = lineage_diff.diff.get(node_id)
|
|
1263
|
-
if diff_info is None:
|
|
1264
|
-
return CllData()
|
|
1265
|
-
change_category = diff_info.change.category
|
|
1266
|
-
|
|
1267
|
-
if change_category == "breaking":
|
|
1268
|
-
cll = self.get_cll(node_id, no_filter=True)
|
|
1269
|
-
_, downstream = find_column_dependencies(node_id, cll.parent_map, cll.child_map)
|
|
1270
|
-
relevant_columns = {node_id}
|
|
1271
|
-
relevant_columns.update(downstream)
|
|
1272
|
-
nodes, columns = filter_lineage_vertices(cll.nodes, cll.columns, relevant_columns)
|
|
1273
|
-
p_map, c_map = filter_dependency_maps(cll.parent_map, cll.child_map, relevant_columns)
|
|
1274
|
-
|
|
1275
|
-
return CllData(nodes=nodes, columns=columns, parent_map=p_map, child_map=c_map)
|
|
1276
|
-
|
|
1277
|
-
return CllData()
|
|
1278
|
-
|
|
1279
|
-
def get_impacted_cll(self, node_id: str) -> CllData:
|
|
1280
|
-
lineage_diff = self.get_lineage_diff()
|
|
1281
|
-
diff_info = lineage_diff.diff.get(node_id)
|
|
1282
|
-
if diff_info is None:
|
|
1283
|
-
return CllData()
|
|
1284
|
-
change_columns = diff_info.change.columns
|
|
1285
|
-
|
|
1286
|
-
cll = self.get_cll(node_id, no_filter=True)
|
|
1287
|
-
relevant_columns = set()
|
|
1288
|
-
for col, change_status in change_columns.items():
|
|
1289
|
-
if change_status == "removed":
|
|
1290
|
-
continue
|
|
1291
|
-
target_column = f"{node_id}_{col}"
|
|
1292
|
-
_, downstream = find_column_dependencies(target_column, cll.parent_map, cll.child_map)
|
|
1293
|
-
relevant_columns.add(target_column)
|
|
1294
|
-
relevant_columns.update(downstream)
|
|
1295
|
-
|
|
1296
|
-
nodes, columns = filter_lineage_vertices(cll.nodes, cll.columns, relevant_columns)
|
|
1297
|
-
p_map, c_map = filter_dependency_maps(cll.parent_map, cll.child_map, relevant_columns)
|
|
1298
|
-
|
|
1299
|
-
return CllData(nodes=nodes, columns=columns, parent_map=p_map, child_map=c_map)
|
|
1300
|
-
|
|
1301
|
-
@staticmethod
|
|
1302
|
-
def _merge_cll_data(base: CllData, target: CllData) -> CllData:
|
|
1303
|
-
merged_nodes = {**base.nodes, **target.nodes}
|
|
1304
|
-
merged_columns = {**base.columns, **target.columns}
|
|
1305
|
-
|
|
1306
|
-
merged_parent_map = {}
|
|
1307
|
-
merged_keys = set(base.parent_map.keys()).union(set(target.parent_map.keys()))
|
|
1308
|
-
for key in merged_keys:
|
|
1309
|
-
merged_parent_map[key] = base.parent_map.get(key, set()).union(target.parent_map.get(key, set()))
|
|
1310
|
-
|
|
1311
|
-
merged_child_map = {}
|
|
1312
|
-
merged_keys = set(base.child_map.keys()).union(set(target.child_map.keys()))
|
|
1313
|
-
for key in merged_keys:
|
|
1314
|
-
merged_child_map[key] = base.child_map.get(key, set()).union(target.child_map.get(key, set()))
|
|
1315
|
-
|
|
1316
|
-
return CllData(
|
|
1317
|
-
nodes=merged_nodes, columns=merged_columns, parent_map=merged_parent_map, child_map=merged_child_map
|
|
1318
|
-
)
|
|
1319
|
-
|
|
1320
1351
|
def build_name_to_unique_id_index(self) -> Dict[str, str]:
|
|
1321
1352
|
name_to_unique_id = {}
|
|
1322
1353
|
curr_manifest = self.get_manifest(base=False)
|
|
@@ -1404,13 +1435,18 @@ class DbtAdapter(BaseAdapter):
|
|
|
1404
1435
|
self.curr_manifest = load_manifest(path=refresh_file_path)
|
|
1405
1436
|
self.manifest = as_manifest(self.curr_manifest)
|
|
1406
1437
|
self.get_cll_cached.cache_clear()
|
|
1438
|
+
self.get_change_analysis_cached.cache_clear()
|
|
1407
1439
|
elif refresh_file_path.endswith("catalog.json"):
|
|
1408
1440
|
self.curr_catalog = load_catalog(path=refresh_file_path)
|
|
1441
|
+
self.get_cll_cached.cache_clear()
|
|
1442
|
+
self.get_change_analysis_cached.cache_clear()
|
|
1409
1443
|
elif self.base_path and target_type == os.path.basename(self.base_path):
|
|
1410
1444
|
if refresh_file_path.endswith("manifest.json"):
|
|
1411
1445
|
self.base_manifest = load_manifest(path=refresh_file_path)
|
|
1446
|
+
self.get_change_analysis_cached.cache_clear()
|
|
1412
1447
|
elif refresh_file_path.endswith("catalog.json"):
|
|
1413
1448
|
self.base_catalog = load_catalog(path=refresh_file_path)
|
|
1449
|
+
self.get_change_analysis_cached.cache_clear()
|
|
1414
1450
|
|
|
1415
1451
|
def create_relation(self, model, base=False):
|
|
1416
1452
|
node = self.find_node_by_name(model, base)
|