recce-nightly 0.56.0.20250302__py3-none-any.whl → 0.56.0.20250304__py3-none-any.whl
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.
- recce/VERSION +1 -1
- recce/adapter/dbt_adapter/__init__.py +25 -3
- recce/cli.py +12 -0
- recce/data/404.html +1 -1
- recce/data/_next/static/chunks/app/page-5b86937f2974d587.js +1 -0
- recce/data/index.html +2 -2
- recce/data/index.txt +2 -2
- recce/event/__init__.py +7 -0
- recce/state.py +46 -8
- recce/util/cll.py +67 -1
- {recce_nightly-0.56.0.20250302.dist-info → recce_nightly-0.56.0.20250304.dist-info}/METADATA +1 -1
- {recce_nightly-0.56.0.20250302.dist-info → recce_nightly-0.56.0.20250304.dist-info}/RECORD +18 -18
- recce/data/_next/static/chunks/app/page-edc85fe647299e04.js +0 -1
- /recce/data/_next/static/{yhRltmKeCHagogYcUQFyx → PdAZtrSpaIDsiEHk9Nkxs}/_buildManifest.js +0 -0
- /recce/data/_next/static/{yhRltmKeCHagogYcUQFyx → PdAZtrSpaIDsiEHk9Nkxs}/_ssgManifest.js +0 -0
- {recce_nightly-0.56.0.20250302.dist-info → recce_nightly-0.56.0.20250304.dist-info}/LICENSE +0 -0
- {recce_nightly-0.56.0.20250302.dist-info → recce_nightly-0.56.0.20250304.dist-info}/WHEEL +0 -0
- {recce_nightly-0.56.0.20250302.dist-info → recce_nightly-0.56.0.20250304.dist-info}/entry_points.txt +0 -0
- {recce_nightly-0.56.0.20250302.dist-info → recce_nightly-0.56.0.20250304.dist-info}/top_level.txt +0 -0
recce/VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
0.56.0.
|
|
1
|
+
0.56.0.20250304
|
|
@@ -9,8 +9,9 @@ from functools import lru_cache
|
|
|
9
9
|
from pathlib import Path
|
|
10
10
|
from typing import Callable, Dict, List, Optional, Tuple, Iterator, Any, Set, Union, Literal, Type
|
|
11
11
|
|
|
12
|
-
from recce.util.cll import cll
|
|
12
|
+
from recce.util.cll import cll, CLLPerformanceTracking
|
|
13
13
|
from recce.exceptions import RecceException
|
|
14
|
+
from recce.event import log_performance
|
|
14
15
|
|
|
15
16
|
try:
|
|
16
17
|
import agate
|
|
@@ -601,6 +602,10 @@ class DbtAdapter(BaseAdapter):
|
|
|
601
602
|
|
|
602
603
|
@lru_cache(maxsize=2)
|
|
603
604
|
def get_lineage_cached(self, base: Optional[bool] = False, cache_key=0):
|
|
605
|
+
if base is False:
|
|
606
|
+
cll_tracker = CLLPerformanceTracking()
|
|
607
|
+
cll_tracker.start_lineage()
|
|
608
|
+
|
|
604
609
|
manifest = self.curr_manifest if base is False else self.base_manifest
|
|
605
610
|
catalog = self.curr_catalog if base is False else self.base_catalog
|
|
606
611
|
|
|
@@ -724,7 +729,14 @@ class DbtAdapter(BaseAdapter):
|
|
|
724
729
|
if os.getenv('RECCE_CLL_ENABLED') != 'false':
|
|
725
730
|
if base is False:
|
|
726
731
|
table_map = self.build_table_map(base)
|
|
732
|
+
cll_tracker.start_column_lineage()
|
|
727
733
|
self.append_column_lineage(nodes, parent_map, base)
|
|
734
|
+
cll_tracker.end_column_lineage()
|
|
735
|
+
|
|
736
|
+
if base is False:
|
|
737
|
+
cll_tracker.end_lineage()
|
|
738
|
+
log_performance("column level lineage", cll_tracker.to_dict())
|
|
739
|
+
cll_tracker.reset()
|
|
728
740
|
|
|
729
741
|
return dict(
|
|
730
742
|
parent_map=parent_map,
|
|
@@ -740,6 +752,8 @@ class DbtAdapter(BaseAdapter):
|
|
|
740
752
|
col['transformation_type'] = trans_type
|
|
741
753
|
col['depends_on'] = depends_on
|
|
742
754
|
|
|
755
|
+
cll_tracker = CLLPerformanceTracking()
|
|
756
|
+
cll_tracker.set_total_nodes(len(nodes))
|
|
743
757
|
for node in nodes.values():
|
|
744
758
|
resource_type = node.get('resource_type')
|
|
745
759
|
if resource_type not in {'model', 'seed', 'source', 'snapshot'}:
|
|
@@ -772,13 +786,21 @@ class DbtAdapter(BaseAdapter):
|
|
|
772
786
|
try:
|
|
773
787
|
dialect = self.adapter.type()
|
|
774
788
|
column_lineage = cll(compiled_sql, schema=schema, dialect=dialect)
|
|
775
|
-
except RecceException
|
|
776
|
-
|
|
789
|
+
except RecceException:
|
|
790
|
+
# TODO: provide parsing error message if needed
|
|
791
|
+
_apply_all_columns(node, 'unknown', [])
|
|
792
|
+
cll_tracker.increment_sqlglot_error_nodes()
|
|
793
|
+
continue
|
|
794
|
+
except Exception:
|
|
777
795
|
_apply_all_columns(node, 'unknown', [])
|
|
796
|
+
cll_tracker.increment_other_error_nodes()
|
|
778
797
|
continue
|
|
779
798
|
|
|
780
799
|
for name, column in node.get('columns', {}).items():
|
|
781
800
|
if name in column_lineage:
|
|
801
|
+
for cld in column_lineage[name].depends_on:
|
|
802
|
+
# manifest node name is case-insensitive
|
|
803
|
+
cld.node = cld.node.lower()
|
|
782
804
|
column['depends_on'] = column_lineage[name].depends_on
|
|
783
805
|
column['transformation_type'] = column_lineage[name].type
|
|
784
806
|
|
recce/cli.py
CHANGED
|
@@ -541,6 +541,12 @@ def upload(state_file, **kwargs):
|
|
|
541
541
|
|
|
542
542
|
# check if state exists in cloud
|
|
543
543
|
state_manager = RecceCloudStateManager(cloud_options)
|
|
544
|
+
if not state_manager.verify():
|
|
545
|
+
error, hint = state_manager.error_and_hint
|
|
546
|
+
console.print(f"[[red]Error[/red]] {error}")
|
|
547
|
+
console.print(f"{hint}")
|
|
548
|
+
exit(1)
|
|
549
|
+
|
|
544
550
|
cloud_state_file_exists = state_manager.check_cloud_state_exists()
|
|
545
551
|
|
|
546
552
|
if cloud_state_file_exists and not click.confirm('\nDo you want to overwrite the existing state file?'):
|
|
@@ -577,6 +583,12 @@ def download(**kwargs):
|
|
|
577
583
|
|
|
578
584
|
# check if state exists in cloud
|
|
579
585
|
state_manager = RecceCloudStateManager(cloud_options)
|
|
586
|
+
if not state_manager.verify():
|
|
587
|
+
error, hint = state_manager.error_and_hint
|
|
588
|
+
console.print(f"[[red]Error[/red]] {error}")
|
|
589
|
+
console.print(f"{hint}")
|
|
590
|
+
exit(1)
|
|
591
|
+
|
|
580
592
|
cloud_state_file_exists = state_manager.check_cloud_state_exists()
|
|
581
593
|
|
|
582
594
|
if not cloud_state_file_exists:
|
recce/data/404.html
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/webpack-300961f547f48fe7.js"/><script src="/_next/static/chunks/157e448a-49151cad1ec51175.js" async=""></script><script src="/_next/static/chunks/312-3e9b49b718b98737.js" async=""></script><script src="/_next/static/chunks/main-app-19c0918a6bb54549.js" async=""></script><meta name="robots" content="noindex"/><title>404: This page could not be found.</title><title>recce</title><meta name="description" content="Recce: Data validation toolkit for comprehensive PR review"/><script src="/_next/static/chunks/polyfills-42372ed130431b0a.js" noModule=""></script></head><body><div style="font-family:system-ui,"Segoe UI",Roboto,Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding:0 23px 0 0;font-size:24px;font-weight:500;vertical-align:top;line-height:49px">404</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:49px;margin:0">This page could not be found.</h2></div></div></div><script src="/_next/static/chunks/webpack-300961f547f48fe7.js" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0]);self.__next_f.push([2,null])</script><script>self.__next_f.push([1,"1:I[16892,[],\"\"]\n3:I[60299,[],\"\"]\n4:I[43276,[],\"\"]\na:I[28103,[],\"\"]\n5:{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"}\n6:{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"}\n7:{\"display\":\"inline-block\"}\n8:{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0}\nb:[]\n"])</script><script>self.__next_f.push([1,"0:[\"$\",\"$L1\",null,{\"buildId\":\"
|
|
1
|
+
<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/webpack-300961f547f48fe7.js"/><script src="/_next/static/chunks/157e448a-49151cad1ec51175.js" async=""></script><script src="/_next/static/chunks/312-3e9b49b718b98737.js" async=""></script><script src="/_next/static/chunks/main-app-19c0918a6bb54549.js" async=""></script><meta name="robots" content="noindex"/><title>404: This page could not be found.</title><title>recce</title><meta name="description" content="Recce: Data validation toolkit for comprehensive PR review"/><script src="/_next/static/chunks/polyfills-42372ed130431b0a.js" noModule=""></script></head><body><div style="font-family:system-ui,"Segoe UI",Roboto,Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding:0 23px 0 0;font-size:24px;font-weight:500;vertical-align:top;line-height:49px">404</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:49px;margin:0">This page could not be found.</h2></div></div></div><script src="/_next/static/chunks/webpack-300961f547f48fe7.js" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0]);self.__next_f.push([2,null])</script><script>self.__next_f.push([1,"1:I[16892,[],\"\"]\n3:I[60299,[],\"\"]\n4:I[43276,[],\"\"]\na:I[28103,[],\"\"]\n5:{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"}\n6:{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"}\n7:{\"display\":\"inline-block\"}\n8:{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0}\nb:[]\n"])</script><script>self.__next_f.push([1,"0:[\"$\",\"$L1\",null,{\"buildId\":\"PdAZtrSpaIDsiEHk9Nkxs\",\"assetPrefix\":\"\",\"urlParts\":[\"\",\"_not-found\"],\"initialTree\":[\"\",{\"children\":[\"/_not-found\",{\"children\":[\"__PAGE__\",{}]}]},\"$undefined\",\"$undefined\",true],\"initialSeedData\":[\"\",{\"children\":[\"/_not-found\",{\"children\":[\"__PAGE__\",{},[[\"$L2\",[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":\"404\"}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],null],null],null]},[null,[\"$\",\"$L3\",null,{\"parallelRouterKey\":\"children\",\"segmentPath\":[\"children\",\"/_not-found\",\"children\"],\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L4\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"notFoundStyles\":\"$undefined\"}]],null]},[[null,[\"$\",\"html\",null,{\"lang\":\"en\",\"children\":[\"$\",\"body\",null,{\"suppressHydrationWarning\":true,\"children\":[\"$\",\"$L3\",null,{\"parallelRouterKey\":\"children\",\"segmentPath\":[\"children\"],\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L4\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":\"$5\",\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":\"$6\",\"children\":\"404\"}],[\"$\",\"div\",null,{\"style\":\"$7\",\"children\":[\"$\",\"h2\",null,{\"style\":\"$8\",\"children\":\"This page could not be found.\"}]}]]}]}]],\"notFoundStyles\":[]}]}]}]],null],null],\"couldBeIntercepted\":false,\"initialHead\":[[\"$\",\"meta\",null,{\"name\":\"robots\",\"content\":\"noindex\"}],\"$L9\"],\"globalErrorComponent\":\"$a\",\"missingSlots\":\"$Wb\"}]\n"])</script><script>self.__next_f.push([1,"9:[[\"$\",\"meta\",\"0\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}],[\"$\",\"meta\",\"1\",{\"charSet\":\"utf-8\"}],[\"$\",\"title\",\"2\",{\"children\":\"recce\"}],[\"$\",\"meta\",\"3\",{\"name\":\"description\",\"content\":\"Recce: Data validation toolkit for comprehensive PR review\"}]]\n2:null\n"])</script></body></html>
|