recce-nightly 1.3.0.20250507__py3-none-any.whl → 1.4.0.20250515__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.
Potentially problematic release.
This version of recce-nightly might be problematic. Click here for more details.
- recce/VERSION +1 -1
- recce/__init__.py +22 -22
- recce/adapter/base.py +11 -14
- recce/adapter/dbt_adapter/__init__.py +355 -316
- recce/adapter/dbt_adapter/dbt_version.py +3 -0
- recce/adapter/sqlmesh_adapter.py +24 -35
- recce/apis/check_api.py +39 -28
- recce/apis/check_func.py +33 -27
- recce/apis/run_api.py +25 -19
- recce/apis/run_func.py +29 -23
- recce/artifact.py +44 -49
- recce/cli.py +484 -285
- recce/config.py +42 -33
- recce/core.py +52 -44
- recce/data/404.html +1 -1
- recce/data/_next/static/chunks/{368-7587b306577df275.js → 778-aef312bffb4c0312.js} +15 -15
- recce/data/_next/static/chunks/8d700b6a.ed11a130057c7a47.js +1 -0
- recce/data/_next/static/chunks/app/layout-c713a2829d3279e4.js +1 -0
- recce/data/_next/static/chunks/app/page-7086764277331fcb.js +1 -0
- recce/data/_next/static/chunks/{cd9f8d63-cf0d5a7b0f7a92e8.js → cd9f8d63-e020f408095ed77c.js} +3 -3
- recce/data/_next/static/chunks/webpack-b787cb1a4f2293de.js +1 -0
- recce/data/_next/static/css/88b8abc134cfd59a.css +3 -0
- recce/data/index.html +2 -2
- recce/data/index.txt +2 -2
- recce/diff.py +6 -12
- recce/event/__init__.py +74 -72
- recce/event/collector.py +27 -20
- recce/event/track.py +39 -27
- recce/exceptions.py +1 -1
- recce/git.py +7 -7
- recce/github.py +57 -53
- recce/models/__init__.py +1 -1
- recce/models/check.py +6 -7
- recce/models/run.py +1 -0
- recce/models/types.py +27 -27
- recce/pull_request.py +26 -24
- recce/run.py +148 -111
- recce/server.py +103 -89
- recce/state.py +209 -177
- recce/summary.py +168 -143
- recce/tasks/__init__.py +3 -3
- recce/tasks/core.py +11 -13
- recce/tasks/dataframe.py +19 -17
- recce/tasks/histogram.py +69 -34
- recce/tasks/lineage.py +2 -2
- recce/tasks/profile.py +147 -86
- recce/tasks/query.py +139 -87
- recce/tasks/rowcount.py +33 -30
- recce/tasks/schema.py +14 -14
- recce/tasks/top_k.py +35 -35
- recce/tasks/valuediff.py +216 -152
- recce/util/breaking.py +77 -84
- recce/util/cll.py +55 -51
- recce/util/io.py +19 -17
- recce/util/logger.py +1 -1
- recce/util/recce_cloud.py +70 -72
- recce/util/singleton.py +4 -4
- recce/yaml/__init__.py +7 -10
- {recce_nightly-1.3.0.20250507.dist-info → recce_nightly-1.4.0.20250515.dist-info}/METADATA +5 -2
- recce_nightly-1.4.0.20250515.dist-info/RECORD +143 -0
- {recce_nightly-1.3.0.20250507.dist-info → recce_nightly-1.4.0.20250515.dist-info}/WHEEL +1 -1
- tests/adapter/dbt_adapter/conftest.py +1 -0
- tests/adapter/dbt_adapter/dbt_test_helper.py +28 -18
- tests/adapter/dbt_adapter/test_dbt_adapter.py +0 -15
- tests/adapter/dbt_adapter/test_dbt_cll.py +39 -32
- tests/adapter/dbt_adapter/test_selector.py +22 -21
- tests/tasks/test_histogram.py +58 -66
- tests/tasks/test_lineage.py +36 -23
- tests/tasks/test_preset_checks.py +45 -31
- tests/tasks/test_profile.py +340 -15
- tests/tasks/test_query.py +40 -40
- tests/tasks/test_row_count.py +65 -46
- tests/tasks/test_schema.py +65 -42
- tests/tasks/test_top_k.py +22 -18
- tests/tasks/test_valuediff.py +43 -32
- tests/test_cli.py +71 -58
- tests/test_config.py +7 -9
- tests/test_core.py +5 -3
- tests/test_dbt.py +7 -7
- tests/test_pull_request.py +1 -1
- tests/test_server.py +19 -13
- tests/test_state.py +40 -27
- tests/test_summary.py +18 -14
- recce/data/_next/static/chunks/8d700b6a-f0b1f6b9e0d97ce2.js +0 -1
- recce/data/_next/static/chunks/app/layout-9102e22cb73f74d6.js +0 -1
- recce/data/_next/static/chunks/app/page-92f13c8fad9fae3d.js +0 -1
- recce/data/_next/static/chunks/webpack-567d72f0bc0820d5.js +0 -1
- recce_nightly-1.3.0.20250507.dist-info/RECORD +0 -142
- /recce/data/_next/static/{K5iKlCYhdcpq8Ea6ck9J_ → q0Xsc9Sd6PDuo1lshYpLu}/_buildManifest.js +0 -0
- /recce/data/_next/static/{K5iKlCYhdcpq8Ea6ck9J_ → q0Xsc9Sd6PDuo1lshYpLu}/_ssgManifest.js +0 -0
- {recce_nightly-1.3.0.20250507.dist-info → recce_nightly-1.4.0.20250515.dist-info}/entry_points.txt +0 -0
- {recce_nightly-1.3.0.20250507.dist-info → recce_nightly-1.4.0.20250515.dist-info}/licenses/LICENSE +0 -0
- {recce_nightly-1.3.0.20250507.dist-info → recce_nightly-1.4.0.20250515.dist-info}/top_level.txt +0 -0
recce/tasks/top_k.py
CHANGED
|
@@ -5,7 +5,7 @@ from pydantic import BaseModel
|
|
|
5
5
|
from recce.core import default_context
|
|
6
6
|
from recce.models import Check
|
|
7
7
|
from recce.tasks import Task
|
|
8
|
-
from recce.tasks.core import
|
|
8
|
+
from recce.tasks.core import CheckValidator, TaskResultDiffer
|
|
9
9
|
from recce.tasks.query import QueryMixin
|
|
10
10
|
|
|
11
11
|
|
|
@@ -33,11 +33,14 @@ class TopKDiffTask(Task, QueryMixin):
|
|
|
33
33
|
UNION ALL
|
|
34
34
|
select count(*), count({{column}}) from {{ curr_relation }}
|
|
35
35
|
"""
|
|
36
|
-
sql = dbt_adapter.generate_sql(
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
36
|
+
sql = dbt_adapter.generate_sql(
|
|
37
|
+
sql_template,
|
|
38
|
+
context=dict(
|
|
39
|
+
base_relation=base_relation,
|
|
40
|
+
curr_relation=curr_relation,
|
|
41
|
+
column=column,
|
|
42
|
+
),
|
|
43
|
+
)
|
|
41
44
|
_, table = dbt_adapter.execute(sql, fetch=True)
|
|
42
45
|
|
|
43
46
|
result = (table[0][0], table[0][1], table[1][0], table[1][1])
|
|
@@ -77,13 +80,16 @@ class TopKDiffTask(Task, QueryMixin):
|
|
|
77
80
|
order by curr_count desc, base_count desc
|
|
78
81
|
limit {{k}}
|
|
79
82
|
"""
|
|
80
|
-
sql = dbt_adapter.generate_sql(
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
83
|
+
sql = dbt_adapter.generate_sql(
|
|
84
|
+
sql_template,
|
|
85
|
+
context=dict(
|
|
86
|
+
base_relation=base_relation,
|
|
87
|
+
curr_relation=curr_relation,
|
|
88
|
+
column=column,
|
|
89
|
+
k=k,
|
|
90
|
+
include_null=False,
|
|
91
|
+
),
|
|
92
|
+
)
|
|
87
93
|
_, table = dbt_adapter.execute(sql, fetch=True)
|
|
88
94
|
|
|
89
95
|
categories = []
|
|
@@ -91,7 +97,7 @@ class TopKDiffTask(Task, QueryMixin):
|
|
|
91
97
|
curr_counts = []
|
|
92
98
|
|
|
93
99
|
for row in table:
|
|
94
|
-
categories.append(row[0] if row[0] !=
|
|
100
|
+
categories.append(row[0] if row[0] != "__null__" else None)
|
|
95
101
|
base_counts.append(int(row[1] if row[1] else 0))
|
|
96
102
|
curr_counts.append(int(row[2] if row[2] else 0))
|
|
97
103
|
|
|
@@ -100,6 +106,7 @@ class TopKDiffTask(Task, QueryMixin):
|
|
|
100
106
|
def execute(self):
|
|
101
107
|
|
|
102
108
|
from recce.adapter.dbt_adapter import DbtAdapter
|
|
109
|
+
|
|
103
110
|
dbt_adapter: DbtAdapter = default_context().adapter
|
|
104
111
|
|
|
105
112
|
with dbt_adapter.connection_named("query"):
|
|
@@ -118,33 +125,26 @@ class TopKDiffTask(Task, QueryMixin):
|
|
|
118
125
|
|
|
119
126
|
self.check_cancel()
|
|
120
127
|
categories, base_counts, curr_counts = self._query_top_k(
|
|
121
|
-
dbt_adapter,
|
|
122
|
-
base_relation,
|
|
123
|
-
curr_relation,
|
|
124
|
-
column,
|
|
125
|
-
k
|
|
128
|
+
dbt_adapter, base_relation, curr_relation, column, k
|
|
126
129
|
)
|
|
127
130
|
self.check_cancel()
|
|
128
131
|
|
|
129
132
|
base_total, base_valids, curr_total, curr_valids = self._query_row_count_diff(
|
|
130
|
-
dbt_adapter,
|
|
131
|
-
base_relation,
|
|
132
|
-
curr_relation,
|
|
133
|
-
column
|
|
133
|
+
dbt_adapter, base_relation, curr_relation, column
|
|
134
134
|
)
|
|
135
135
|
|
|
136
136
|
result = {
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
137
|
+
"base": {
|
|
138
|
+
"values": categories,
|
|
139
|
+
"counts": base_counts,
|
|
140
|
+
"valids": base_valids,
|
|
141
|
+
"total": base_total,
|
|
142
142
|
},
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
143
|
+
"current": {
|
|
144
|
+
"values": categories,
|
|
145
|
+
"counts": curr_counts,
|
|
146
|
+
"valids": curr_valids,
|
|
147
|
+
"total": curr_total,
|
|
148
148
|
},
|
|
149
149
|
}
|
|
150
150
|
return result
|
|
@@ -157,8 +157,8 @@ class TopKDiffTask(Task, QueryMixin):
|
|
|
157
157
|
|
|
158
158
|
class TopKDiffTaskResultDiffer(TaskResultDiffer):
|
|
159
159
|
def _check_result_changed_fn(self, result):
|
|
160
|
-
base = result.get(
|
|
161
|
-
current = result.get(
|
|
160
|
+
base = result.get("base")
|
|
161
|
+
current = result.get("current")
|
|
162
162
|
|
|
163
163
|
return TaskResultDiffer.diff(base, current)
|
|
164
164
|
|