recce-nightly 1.3.0.20250507__py3-none-any.whl → 1.4.0.20250514__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.

Files changed (93) hide show
  1. recce/VERSION +1 -1
  2. recce/__init__.py +22 -22
  3. recce/adapter/base.py +11 -14
  4. recce/adapter/dbt_adapter/__init__.py +355 -316
  5. recce/adapter/dbt_adapter/dbt_version.py +3 -0
  6. recce/adapter/sqlmesh_adapter.py +24 -35
  7. recce/apis/check_api.py +39 -28
  8. recce/apis/check_func.py +33 -27
  9. recce/apis/run_api.py +25 -19
  10. recce/apis/run_func.py +29 -23
  11. recce/artifact.py +44 -49
  12. recce/cli.py +484 -285
  13. recce/config.py +42 -33
  14. recce/core.py +52 -44
  15. recce/data/404.html +1 -1
  16. recce/data/_next/static/chunks/{368-7587b306577df275.js → 778-aef312bffb4c0312.js} +15 -15
  17. recce/data/_next/static/chunks/8d700b6a.ed11a130057c7a47.js +1 -0
  18. recce/data/_next/static/chunks/app/layout-c713a2829d3279e4.js +1 -0
  19. recce/data/_next/static/chunks/app/page-7086764277331fcb.js +1 -0
  20. recce/data/_next/static/chunks/{cd9f8d63-cf0d5a7b0f7a92e8.js → cd9f8d63-e020f408095ed77c.js} +3 -3
  21. recce/data/_next/static/chunks/webpack-b787cb1a4f2293de.js +1 -0
  22. recce/data/_next/static/css/88b8abc134cfd59a.css +3 -0
  23. recce/data/index.html +2 -2
  24. recce/data/index.txt +2 -2
  25. recce/diff.py +6 -12
  26. recce/event/__init__.py +74 -72
  27. recce/event/collector.py +27 -20
  28. recce/event/track.py +39 -27
  29. recce/exceptions.py +1 -1
  30. recce/git.py +7 -7
  31. recce/github.py +57 -53
  32. recce/models/__init__.py +1 -1
  33. recce/models/check.py +6 -7
  34. recce/models/run.py +1 -0
  35. recce/models/types.py +27 -27
  36. recce/pull_request.py +26 -24
  37. recce/run.py +148 -111
  38. recce/server.py +103 -89
  39. recce/state.py +209 -177
  40. recce/summary.py +168 -143
  41. recce/tasks/__init__.py +3 -3
  42. recce/tasks/core.py +11 -13
  43. recce/tasks/dataframe.py +19 -17
  44. recce/tasks/histogram.py +69 -34
  45. recce/tasks/lineage.py +2 -2
  46. recce/tasks/profile.py +147 -86
  47. recce/tasks/query.py +139 -87
  48. recce/tasks/rowcount.py +33 -30
  49. recce/tasks/schema.py +14 -14
  50. recce/tasks/top_k.py +35 -35
  51. recce/tasks/valuediff.py +216 -152
  52. recce/util/breaking.py +77 -84
  53. recce/util/cll.py +55 -51
  54. recce/util/io.py +19 -17
  55. recce/util/logger.py +1 -1
  56. recce/util/recce_cloud.py +70 -72
  57. recce/util/singleton.py +4 -4
  58. recce/yaml/__init__.py +7 -10
  59. {recce_nightly-1.3.0.20250507.dist-info → recce_nightly-1.4.0.20250514.dist-info}/METADATA +5 -2
  60. recce_nightly-1.4.0.20250514.dist-info/RECORD +143 -0
  61. {recce_nightly-1.3.0.20250507.dist-info → recce_nightly-1.4.0.20250514.dist-info}/WHEEL +1 -1
  62. tests/adapter/dbt_adapter/conftest.py +1 -0
  63. tests/adapter/dbt_adapter/dbt_test_helper.py +28 -18
  64. tests/adapter/dbt_adapter/test_dbt_adapter.py +0 -15
  65. tests/adapter/dbt_adapter/test_dbt_cll.py +39 -32
  66. tests/adapter/dbt_adapter/test_selector.py +22 -21
  67. tests/tasks/test_histogram.py +58 -66
  68. tests/tasks/test_lineage.py +36 -23
  69. tests/tasks/test_preset_checks.py +45 -31
  70. tests/tasks/test_profile.py +340 -15
  71. tests/tasks/test_query.py +40 -40
  72. tests/tasks/test_row_count.py +65 -46
  73. tests/tasks/test_schema.py +65 -42
  74. tests/tasks/test_top_k.py +22 -18
  75. tests/tasks/test_valuediff.py +43 -32
  76. tests/test_cli.py +71 -58
  77. tests/test_config.py +7 -9
  78. tests/test_core.py +5 -3
  79. tests/test_dbt.py +7 -7
  80. tests/test_pull_request.py +1 -1
  81. tests/test_server.py +19 -13
  82. tests/test_state.py +40 -27
  83. tests/test_summary.py +18 -14
  84. recce/data/_next/static/chunks/8d700b6a-f0b1f6b9e0d97ce2.js +0 -1
  85. recce/data/_next/static/chunks/app/layout-9102e22cb73f74d6.js +0 -1
  86. recce/data/_next/static/chunks/app/page-92f13c8fad9fae3d.js +0 -1
  87. recce/data/_next/static/chunks/webpack-567d72f0bc0820d5.js +0 -1
  88. recce_nightly-1.3.0.20250507.dist-info/RECORD +0 -142
  89. /recce/data/_next/static/{K5iKlCYhdcpq8Ea6ck9J_ → E_HPXsXdrqHg2YEHmU3mK}/_buildManifest.js +0 -0
  90. /recce/data/_next/static/{K5iKlCYhdcpq8Ea6ck9J_ → E_HPXsXdrqHg2YEHmU3mK}/_ssgManifest.js +0 -0
  91. {recce_nightly-1.3.0.20250507.dist-info → recce_nightly-1.4.0.20250514.dist-info}/entry_points.txt +0 -0
  92. {recce_nightly-1.3.0.20250507.dist-info → recce_nightly-1.4.0.20250514.dist-info}/licenses/LICENSE +0 -0
  93. {recce_nightly-1.3.0.20250507.dist-info → recce_nightly-1.4.0.20250514.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 TaskResultDiffer, CheckValidator
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(sql_template, context=dict(
37
- base_relation=base_relation,
38
- curr_relation=curr_relation,
39
- column=column,
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(sql_template, context=dict(
81
- base_relation=base_relation,
82
- curr_relation=curr_relation,
83
- column=column,
84
- k=k,
85
- include_null=False,
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] != '__null__' else None)
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
- 'base': {
138
- 'values': categories,
139
- 'counts': base_counts,
140
- 'valids': base_valids,
141
- 'total': base_total,
137
+ "base": {
138
+ "values": categories,
139
+ "counts": base_counts,
140
+ "valids": base_valids,
141
+ "total": base_total,
142
142
  },
143
- 'current': {
144
- 'values': categories,
145
- 'counts': curr_counts,
146
- 'valids': curr_valids,
147
- 'total': curr_total,
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('base')
161
- current = result.get('current')
160
+ base = result.get("base")
161
+ current = result.get("current")
162
162
 
163
163
  return TaskResultDiffer.diff(base, current)
164
164