recce-nightly 1.2.0.20250506__py3-none-any.whl → 1.26.0.20251124__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 (213) hide show
  1. recce/VERSION +1 -1
  2. recce/__init__.py +27 -22
  3. recce/adapter/base.py +11 -14
  4. recce/adapter/dbt_adapter/__init__.py +810 -480
  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 +119 -51
  12. recce/cli.py +1299 -323
  13. recce/config.py +42 -33
  14. recce/connect_to_cloud.py +138 -0
  15. recce/core.py +55 -47
  16. recce/data/404.html +1 -1
  17. recce/data/__next.__PAGE__.txt +10 -0
  18. recce/data/__next._full.txt +23 -0
  19. recce/data/__next._head.txt +8 -0
  20. recce/data/__next._index.txt +8 -0
  21. recce/data/__next._tree.txt +5 -0
  22. recce/data/_next/static/52aV_JrNUZU6dMFgvTQEO/_buildManifest.js +11 -0
  23. recce/data/_next/static/52aV_JrNUZU6dMFgvTQEO/_clientMiddlewareManifest.json +1 -0
  24. recce/data/_next/static/chunks/02b996c7f6a29a06.js +4 -0
  25. recce/data/_next/static/chunks/19c10d219a6a21ff.js +1 -0
  26. recce/data/_next/static/chunks/2df9ec28a061971d.js +11 -0
  27. recce/data/_next/static/chunks/3098c987393bda15.js +1 -0
  28. recce/data/_next/static/chunks/393dc43e483f717a.css +2 -0
  29. recce/data/_next/static/chunks/399e8d91a7e45073.js +2 -0
  30. recce/data/_next/static/chunks/4d0186f631230245.js +1 -0
  31. recce/data/_next/static/chunks/5794ba9e10a9c060.js +11 -0
  32. recce/data/_next/static/chunks/715761c929a3f28b.js +110 -0
  33. recce/data/_next/static/chunks/71f88fcc615bf282.js +1 -0
  34. recce/data/_next/static/chunks/80d2a95eaf1201ea.js +1 -0
  35. recce/data/_next/static/chunks/9979c6109bbbee35.js +1 -0
  36. recce/data/_next/static/chunks/99d638224186c118.js +1 -0
  37. recce/data/_next/static/chunks/d003eb36240e92f3.js +1 -0
  38. recce/data/_next/static/chunks/d3167cdfec4fc351.js +1 -0
  39. recce/data/_next/static/chunks/e124bccf574a3361.css +1 -0
  40. recce/data/_next/static/chunks/f40141db1bdb46f0.css +6 -0
  41. recce/data/_next/static/chunks/fcc53a88741a52f9.js +1 -0
  42. recce/data/_next/static/chunks/turbopack-b1920d28cfb1f28d.js +3 -0
  43. recce/data/_next/static/media/favicon.a8d38d84.ico +0 -0
  44. recce/data/_next/static/media/montserrat-cyrillic-800-normal.d80d830d.woff2 +0 -0
  45. recce/data/_next/static/media/montserrat-cyrillic-800-normal.f9d58125.woff +0 -0
  46. recce/data/_next/static/media/montserrat-cyrillic-ext-800-normal.076c2a93.woff2 +0 -0
  47. recce/data/_next/static/media/montserrat-cyrillic-ext-800-normal.a4fa76b5.woff +0 -0
  48. recce/data/_next/static/media/montserrat-latin-800-normal.cde454cc.woff2 +0 -0
  49. recce/data/_next/static/media/montserrat-latin-800-normal.d5761935.woff +0 -0
  50. recce/data/_next/static/media/montserrat-latin-ext-800-normal.40ec0659.woff2 +0 -0
  51. recce/data/_next/static/media/montserrat-latin-ext-800-normal.b671449b.woff +0 -0
  52. recce/data/_next/static/media/montserrat-vietnamese-800-normal.9f7b8541.woff +0 -0
  53. recce/data/_next/static/media/montserrat-vietnamese-800-normal.f9eb854e.woff2 +0 -0
  54. recce/data/_next/static/media/reload-image.7aa931c7.svg +4 -0
  55. recce/data/_not-found/__next._full.txt +17 -0
  56. recce/data/_not-found/__next._head.txt +8 -0
  57. recce/data/_not-found/__next._index.txt +8 -0
  58. recce/data/_not-found/__next._not-found.__PAGE__.txt +5 -0
  59. recce/data/_not-found/__next._not-found.txt +4 -0
  60. recce/data/_not-found/__next._tree.txt +3 -0
  61. recce/data/_not-found.html +1 -0
  62. recce/data/_not-found.txt +17 -0
  63. recce/data/auth_callback.html +68 -0
  64. recce/data/imgs/reload-image.svg +4 -0
  65. recce/data/index.html +1 -27
  66. recce/data/index.txt +23 -7
  67. recce/diff.py +6 -12
  68. recce/event/__init__.py +86 -74
  69. recce/event/collector.py +33 -22
  70. recce/event/track.py +49 -27
  71. recce/exceptions.py +1 -1
  72. recce/git.py +7 -7
  73. recce/github.py +57 -53
  74. recce/mcp_server.py +716 -0
  75. recce/models/__init__.py +4 -1
  76. recce/models/check.py +6 -7
  77. recce/models/run.py +1 -0
  78. recce/models/types.py +131 -28
  79. recce/pull_request.py +27 -25
  80. recce/run.py +165 -121
  81. recce/server.py +303 -111
  82. recce/state/__init__.py +31 -0
  83. recce/state/cloud.py +632 -0
  84. recce/state/const.py +26 -0
  85. recce/state/local.py +56 -0
  86. recce/state/state.py +119 -0
  87. recce/state/state_loader.py +174 -0
  88. recce/summary.py +188 -143
  89. recce/tasks/__init__.py +19 -3
  90. recce/tasks/core.py +11 -13
  91. recce/tasks/dataframe.py +82 -18
  92. recce/tasks/histogram.py +69 -34
  93. recce/tasks/lineage.py +2 -2
  94. recce/tasks/profile.py +152 -86
  95. recce/tasks/query.py +139 -87
  96. recce/tasks/rowcount.py +37 -31
  97. recce/tasks/schema.py +18 -15
  98. recce/tasks/top_k.py +35 -35
  99. recce/tasks/valuediff.py +216 -152
  100. recce/util/__init__.py +3 -0
  101. recce/util/api_token.py +80 -0
  102. recce/util/breaking.py +87 -85
  103. recce/util/cll.py +274 -219
  104. recce/util/io.py +22 -17
  105. recce/util/lineage.py +65 -16
  106. recce/util/logger.py +1 -1
  107. recce/util/onboarding_state.py +45 -0
  108. recce/util/perf_tracking.py +85 -0
  109. recce/util/recce_cloud.py +322 -72
  110. recce/util/singleton.py +4 -4
  111. recce/yaml/__init__.py +7 -10
  112. recce_cloud/__init__.py +24 -0
  113. recce_cloud/api/__init__.py +17 -0
  114. recce_cloud/api/base.py +111 -0
  115. recce_cloud/api/client.py +150 -0
  116. recce_cloud/api/exceptions.py +26 -0
  117. recce_cloud/api/factory.py +63 -0
  118. recce_cloud/api/github.py +76 -0
  119. recce_cloud/api/gitlab.py +82 -0
  120. recce_cloud/artifact.py +57 -0
  121. recce_cloud/ci_providers/__init__.py +9 -0
  122. recce_cloud/ci_providers/base.py +82 -0
  123. recce_cloud/ci_providers/detector.py +147 -0
  124. recce_cloud/ci_providers/github_actions.py +136 -0
  125. recce_cloud/ci_providers/gitlab_ci.py +130 -0
  126. recce_cloud/cli.py +245 -0
  127. recce_cloud/upload.py +214 -0
  128. {recce_nightly-1.2.0.20250506.dist-info → recce_nightly-1.26.0.20251124.dist-info}/METADATA +68 -37
  129. recce_nightly-1.26.0.20251124.dist-info/RECORD +180 -0
  130. {recce_nightly-1.2.0.20250506.dist-info → recce_nightly-1.26.0.20251124.dist-info}/WHEEL +1 -1
  131. {recce_nightly-1.2.0.20250506.dist-info → recce_nightly-1.26.0.20251124.dist-info}/top_level.txt +1 -0
  132. tests/adapter/dbt_adapter/conftest.py +9 -5
  133. tests/adapter/dbt_adapter/dbt_test_helper.py +37 -22
  134. tests/adapter/dbt_adapter/test_dbt_adapter.py +0 -15
  135. tests/adapter/dbt_adapter/test_dbt_cll.py +656 -41
  136. tests/adapter/dbt_adapter/test_selector.py +22 -21
  137. tests/recce_cloud/__init__.py +0 -0
  138. tests/recce_cloud/test_ci_providers.py +351 -0
  139. tests/recce_cloud/test_cli.py +372 -0
  140. tests/recce_cloud/test_client.py +273 -0
  141. tests/recce_cloud/test_platform_clients.py +333 -0
  142. tests/tasks/conftest.py +1 -1
  143. tests/tasks/test_histogram.py +58 -66
  144. tests/tasks/test_lineage.py +36 -23
  145. tests/tasks/test_preset_checks.py +45 -31
  146. tests/tasks/test_profile.py +339 -15
  147. tests/tasks/test_query.py +46 -46
  148. tests/tasks/test_row_count.py +65 -46
  149. tests/tasks/test_schema.py +65 -42
  150. tests/tasks/test_top_k.py +22 -18
  151. tests/tasks/test_valuediff.py +43 -32
  152. tests/test_cli.py +174 -60
  153. tests/test_cli_mcp_optional.py +45 -0
  154. tests/test_cloud_listing_cli.py +324 -0
  155. tests/test_config.py +7 -9
  156. tests/test_connect_to_cloud.py +82 -0
  157. tests/test_core.py +151 -4
  158. tests/test_dbt.py +7 -7
  159. tests/test_mcp_server.py +332 -0
  160. tests/test_pull_request.py +1 -1
  161. tests/test_server.py +25 -19
  162. tests/test_summary.py +29 -17
  163. recce/data/_next/static/Kcbs3GEIyH2LxgLYat0es/_buildManifest.js +0 -1
  164. recce/data/_next/static/chunks/1f229bf6-d9fe92e56db8d93b.js +0 -1
  165. recce/data/_next/static/chunks/29e3cc0d-8c150e37dff9631b.js +0 -1
  166. recce/data/_next/static/chunks/368-7587b306577df275.js +0 -65
  167. recce/data/_next/static/chunks/36e1c10d-bb0210cbd6573a8d.js +0 -1
  168. recce/data/_next/static/chunks/3998a672-eaad84bdd88cc73e.js +0 -1
  169. recce/data/_next/static/chunks/3a92ee20-3b5d922d4157af5e.js +0 -1
  170. recce/data/_next/static/chunks/450c323b-1bb5db526e54435a.js +0 -1
  171. recce/data/_next/static/chunks/47d8844f-79a1b53c66a7d7ec.js +0 -1
  172. recce/data/_next/static/chunks/6dc81886-c94b9b91bc2c3caf.js +0 -1
  173. recce/data/_next/static/chunks/6ef81909-694dc38134099299.js +0 -1
  174. recce/data/_next/static/chunks/700-3b65fc3666820d00.js +0 -2
  175. recce/data/_next/static/chunks/7a8a3e83-d7fa409d97b38b2b.js +0 -1
  176. recce/data/_next/static/chunks/7f27ae6c-413f6b869a04183a.js +0 -1
  177. recce/data/_next/static/chunks/8d700b6a-f0b1f6b9e0d97ce2.js +0 -1
  178. recce/data/_next/static/chunks/9746af58-d74bef4d03eea6ab.js +0 -1
  179. recce/data/_next/static/chunks/a30376cd-7d806e1602f2dc3a.js +0 -1
  180. recce/data/_next/static/chunks/app/_not-found/page-8a886fa0855c3105.js +0 -1
  181. recce/data/_next/static/chunks/app/layout-9102e22cb73f74d6.js +0 -1
  182. recce/data/_next/static/chunks/app/page-cee661090afbd6aa.js +0 -1
  183. recce/data/_next/static/chunks/b63b1b3f-7395c74e11a14e95.js +0 -1
  184. recce/data/_next/static/chunks/c132bf7d-8102037f9ccf372a.js +0 -1
  185. recce/data/_next/static/chunks/c1ceaa8b-a1e442154d23515e.js +0 -1
  186. recce/data/_next/static/chunks/cd9f8d63-cf0d5a7b0f7a92e8.js +0 -54
  187. recce/data/_next/static/chunks/ce84277d-f42c2c58049cea2d.js +0 -1
  188. recce/data/_next/static/chunks/e24bf851-0f8cbc99656833e7.js +0 -1
  189. recce/data/_next/static/chunks/fee69bc6-f17d36c080742e74.js +0 -1
  190. recce/data/_next/static/chunks/framework-ded83d71b51ce901.js +0 -1
  191. recce/data/_next/static/chunks/main-a0859f1f36d0aa6c.js +0 -1
  192. recce/data/_next/static/chunks/main-app-0225a2255968e566.js +0 -1
  193. recce/data/_next/static/chunks/pages/_app-d5672bf3d8b6371b.js +0 -1
  194. recce/data/_next/static/chunks/pages/_error-ed75be3f25588548.js +0 -1
  195. recce/data/_next/static/chunks/webpack-567d72f0bc0820d5.js +0 -1
  196. recce/data/_next/static/css/c9ecb46a4b21c126.css +0 -14
  197. recce/data/_next/static/media/montserrat-cyrillic-800-normal.22628180.woff2 +0 -0
  198. recce/data/_next/static/media/montserrat-cyrillic-800-normal.31d693bb.woff +0 -0
  199. recce/data/_next/static/media/montserrat-cyrillic-ext-800-normal.7e2c1e62.woff +0 -0
  200. recce/data/_next/static/media/montserrat-cyrillic-ext-800-normal.94a63aea.woff2 +0 -0
  201. recce/data/_next/static/media/montserrat-latin-800-normal.6f8fa298.woff2 +0 -0
  202. recce/data/_next/static/media/montserrat-latin-800-normal.97e20d5e.woff +0 -0
  203. recce/data/_next/static/media/montserrat-latin-ext-800-normal.013b84f9.woff2 +0 -0
  204. recce/data/_next/static/media/montserrat-latin-ext-800-normal.aff52ab0.woff +0 -0
  205. recce/data/_next/static/media/montserrat-vietnamese-800-normal.5f21869b.woff +0 -0
  206. recce/data/_next/static/media/montserrat-vietnamese-800-normal.c0035377.woff2 +0 -0
  207. recce/state.py +0 -753
  208. recce_nightly-1.2.0.20250506.dist-info/RECORD +0 -142
  209. tests/test_state.py +0 -123
  210. /recce/data/_next/static/{Kcbs3GEIyH2LxgLYat0es → 52aV_JrNUZU6dMFgvTQEO}/_ssgManifest.js +0 -0
  211. /recce/data/_next/static/chunks/{polyfills-42372ed130431b0a.js → a6dad97d9634a72d.js} +0 -0
  212. {recce_nightly-1.2.0.20250506.dist-info → recce_nightly-1.26.0.20251124.dist-info}/entry_points.txt +0 -0
  213. {recce_nightly-1.2.0.20250506.dist-info → recce_nightly-1.26.0.20251124.dist-info}/licenses/LICENSE +0 -0
recce_cloud/upload.py ADDED
@@ -0,0 +1,214 @@
1
+ """
2
+ Upload helper functions for recce-cloud CLI.
3
+ """
4
+
5
+ import os
6
+ import sys
7
+
8
+ import requests
9
+
10
+ from recce_cloud.api.client import RecceCloudClient
11
+ from recce_cloud.api.exceptions import RecceCloudException
12
+ from recce_cloud.api.factory import create_platform_client
13
+
14
+
15
+ def upload_to_existing_session(
16
+ console, token: str, session_id: str, manifest_path: str, catalog_path: str, adapter_type: str, target_path: str
17
+ ):
18
+ """
19
+ Upload artifacts to an existing Recce Cloud session using session ID.
20
+
21
+ This is the generic workflow that requires a pre-existing session ID.
22
+ """
23
+ try:
24
+ client = RecceCloudClient(token)
25
+ except Exception as e:
26
+ console.print("[red]Error:[/red] Failed to initialize API client")
27
+ console.print(f"Reason: {e}")
28
+ sys.exit(2)
29
+
30
+ # Get session info (org_id, project_id)
31
+ console.print(f'Uploading artifacts for session ID "{session_id}"')
32
+ try:
33
+ session = client.get_session(session_id)
34
+ if session.get("status") == "error":
35
+ console.print(f"[red]Error:[/red] {session.get('message')}")
36
+ sys.exit(2)
37
+
38
+ org_id = session.get("org_id")
39
+ if org_id is None:
40
+ console.print(f"[red]Error:[/red] Session ID {session_id} does not belong to any organization.")
41
+ sys.exit(2)
42
+
43
+ project_id = session.get("project_id")
44
+ if project_id is None:
45
+ console.print(f"[red]Error:[/red] Session ID {session_id} does not belong to any project.")
46
+ sys.exit(2)
47
+
48
+ except RecceCloudException as e:
49
+ console.print("[red]Error:[/red] Failed to get session info")
50
+ console.print(f"Reason: {e.reason}")
51
+ sys.exit(2)
52
+ except Exception as e:
53
+ console.print("[red]Error:[/red] Failed to get session info")
54
+ console.print(f"Reason: {e}")
55
+ sys.exit(2)
56
+
57
+ # Get presigned URLs
58
+ try:
59
+ presigned_urls = client.get_upload_urls_by_session_id(org_id, project_id, session_id)
60
+ except RecceCloudException as e:
61
+ console.print("[red]Error:[/red] Failed to get upload URLs")
62
+ console.print(f"Reason: {e.reason}")
63
+ sys.exit(4)
64
+ except Exception as e:
65
+ console.print("[red]Error:[/red] Failed to get upload URLs")
66
+ console.print(f"Reason: {e}")
67
+ sys.exit(4)
68
+
69
+ # Upload manifest.json
70
+ console.print(f'Uploading manifest from path "{manifest_path}"')
71
+ try:
72
+ with open(manifest_path, "rb") as f:
73
+ response = requests.put(presigned_urls["manifest_url"], data=f.read())
74
+ if response.status_code not in [200, 204]:
75
+ raise Exception(f"Upload failed with status {response.status_code}: {response.text}")
76
+ except Exception as e:
77
+ console.print("[red]Error:[/red] Failed to upload manifest.json")
78
+ console.print(f"Reason: {e}")
79
+ sys.exit(4)
80
+
81
+ # Upload catalog.json
82
+ console.print(f'Uploading catalog from path "{catalog_path}"')
83
+ try:
84
+ with open(catalog_path, "rb") as f:
85
+ response = requests.put(presigned_urls["catalog_url"], data=f.read())
86
+ if response.status_code not in [200, 204]:
87
+ raise Exception(f"Upload failed with status {response.status_code}: {response.text}")
88
+ except Exception as e:
89
+ console.print("[red]Error:[/red] Failed to upload catalog.json")
90
+ console.print(f"Reason: {e}")
91
+ sys.exit(4)
92
+
93
+ # Update session metadata
94
+ try:
95
+ client.update_session(org_id, project_id, session_id, adapter_type)
96
+ except RecceCloudException as e:
97
+ console.print("[red]Error:[/red] Failed to update session metadata")
98
+ console.print(f"Reason: {e.reason}")
99
+ sys.exit(4)
100
+ except Exception as e:
101
+ console.print("[red]Error:[/red] Failed to update session metadata")
102
+ console.print(f"Reason: {e}")
103
+ sys.exit(4)
104
+
105
+ # Success!
106
+ console.rule("Uploaded Successfully", style="green")
107
+ console.print(
108
+ f'Uploaded dbt artifacts to Recce Cloud for session ID "{session_id}" from "{os.path.abspath(target_path)}"'
109
+ )
110
+ sys.exit(0)
111
+
112
+
113
+ def upload_with_platform_apis(
114
+ console, token: str, ci_info, manifest_path: str, catalog_path: str, adapter_type: str, target_path: str
115
+ ):
116
+ """
117
+ Upload artifacts using platform-specific APIs (GitHub Actions or GitLab CI).
118
+
119
+ This workflow uses touch-recce-session to create a session automatically.
120
+ """
121
+ # Validate platform support
122
+ if ci_info.platform not in ["github-actions", "gitlab-ci"]:
123
+ console.print("[red]Error:[/red] Platform-specific upload requires GitHub Actions or GitLab CI environment")
124
+ console.print(f"Detected platform: {ci_info.platform or 'unknown'}")
125
+ console.print(
126
+ "Either run this command in a supported CI environment or provide --session-id for generic upload"
127
+ )
128
+ sys.exit(1)
129
+
130
+ # Create platform-specific client
131
+ try:
132
+ client = create_platform_client(token, ci_info)
133
+ except ValueError as e:
134
+ console.print("[red]Error:[/red] Failed to create platform client")
135
+ console.print(f"Reason: {e}")
136
+ sys.exit(2)
137
+
138
+ # Touch session to create or get session ID
139
+ console.rule("Creating/touching session", style="blue")
140
+ try:
141
+ session_response = client.touch_recce_session(
142
+ branch=ci_info.source_branch or ci_info.base_branch or "main",
143
+ adapter_type=adapter_type,
144
+ cr_number=ci_info.cr_number,
145
+ commit_sha=ci_info.commit_sha,
146
+ session_type=ci_info.session_type,
147
+ )
148
+
149
+ session_id = session_response.get("session_id")
150
+ manifest_upload_url = session_response.get("manifest_upload_url")
151
+ catalog_upload_url = session_response.get("catalog_upload_url")
152
+
153
+ if not session_id or not manifest_upload_url or not catalog_upload_url:
154
+ console.print("[red]Error:[/red] Incomplete response from touch-recce-session API")
155
+ console.print(f"Response: {session_response}")
156
+ sys.exit(4)
157
+
158
+ console.print(f"[green]Session ID:[/green] {session_id}")
159
+
160
+ except RecceCloudException as e:
161
+ console.print("[red]Error:[/red] Failed to create/touch session")
162
+ console.print(f"Reason: {e.reason}")
163
+ sys.exit(4)
164
+ except Exception as e:
165
+ console.print("[red]Error:[/red] Failed to create/touch session")
166
+ console.print(f"Reason: {e}")
167
+ sys.exit(4)
168
+
169
+ # Upload manifest.json
170
+ console.print(f'Uploading manifest from path "{manifest_path}"')
171
+ try:
172
+ with open(manifest_path, "rb") as f:
173
+ response = requests.put(manifest_upload_url, data=f.read())
174
+ if response.status_code not in [200, 204]:
175
+ raise Exception(f"Upload failed with status {response.status_code}: {response.text}")
176
+ except Exception as e:
177
+ console.print("[red]Error:[/red] Failed to upload manifest.json")
178
+ console.print(f"Reason: {e}")
179
+ sys.exit(4)
180
+
181
+ # Upload catalog.json
182
+ console.print(f'Uploading catalog from path "{catalog_path}"')
183
+ try:
184
+ with open(catalog_path, "rb") as f:
185
+ response = requests.put(catalog_upload_url, data=f.read())
186
+ if response.status_code not in [200, 204]:
187
+ raise Exception(f"Upload failed with status {response.status_code}: {response.text}")
188
+ except Exception as e:
189
+ console.print("[red]Error:[/red] Failed to upload catalog.json")
190
+ console.print(f"Reason: {e}")
191
+ sys.exit(4)
192
+
193
+ # Notify upload completion
194
+ console.print("Notifying upload completion...")
195
+ try:
196
+ client.upload_completed(session_id=session_id, commit_sha=ci_info.commit_sha)
197
+ except RecceCloudException as e:
198
+ console.print("[yellow]Warning:[/yellow] Failed to notify upload completion")
199
+ console.print(f"Reason: {e.reason}")
200
+ # Non-fatal, continue
201
+ except Exception as e:
202
+ console.print("[yellow]Warning:[/yellow] Failed to notify upload completion")
203
+ console.print(f"Reason: {e}")
204
+ # Non-fatal, continue
205
+
206
+ # Success!
207
+ console.rule("Uploaded Successfully", style="green")
208
+ console.print(f'Uploaded dbt artifacts to Recce Cloud for session ID "{session_id}"')
209
+ console.print(f'Artifacts from: "{os.path.abspath(target_path)}"')
210
+
211
+ if ci_info.cr_url:
212
+ console.print(f"Change request: {ci_info.cr_url}")
213
+
214
+ sys.exit(0)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: recce-nightly
3
- Version: 1.2.0.20250506
3
+ Version: 1.26.0.20251124
4
4
  Summary: Environment diff tool for dbt
5
5
  Home-page: https://github.com/InfuseAI/recce
6
6
  Author: InfuseAI Dev Team
@@ -9,6 +9,8 @@ Project-URL: Bug Tracker, https://github.com/InfuseAI/recce/issues
9
9
  Classifier: Programming Language :: Python :: 3.9
10
10
  Classifier: Programming Language :: Python :: 3.10
11
11
  Classifier: Programming Language :: Python :: 3.11
12
+ Classifier: Programming Language :: Python :: 3.12
13
+ Classifier: Programming Language :: Python :: 3.13
12
14
  Classifier: License :: OSI Approved :: Apache Software License
13
15
  Classifier: Operating System :: OS Independent
14
16
  Classifier: Development Status :: 4 - Beta
@@ -19,7 +21,7 @@ Requires-Dist: boto3
19
21
  Requires-Dist: requests>=2.28.1
20
22
  Requires-Dist: ruamel.yaml>=0.18.6
21
23
  Requires-Dist: click>=7.1
22
- Requires-Dist: deepdiff<8.0,>=7.0
24
+ Requires-Dist: deepdiff<9.0,>=7.0
23
25
  Requires-Dist: portalocker
24
26
  Requires-Dist: fastapi
25
27
  Requires-Dist: itsdangerous
@@ -36,11 +38,19 @@ Requires-Dist: python-dateutil
36
38
  Requires-Dist: python-multipart
37
39
  Requires-Dist: GitPython
38
40
  Requires-Dist: PyGithub
39
- Requires-Dist: sqlglot
41
+ Requires-Dist: sqlglot<29
42
+ Requires-Dist: pytz
43
+ Requires-Dist: packaging
44
+ Provides-Extra: mcp
45
+ Requires-Dist: mcp>=1.0.0; extra == "mcp"
40
46
  Provides-Extra: dev
41
47
  Requires-Dist: pytest>=4.6; extra == "dev"
48
+ Requires-Dist: pytest-asyncio; extra == "dev"
42
49
  Requires-Dist: pytest-flake8; extra == "dev"
43
- Requires-Dist: flake8==3.9.2; extra == "dev"
50
+ Requires-Dist: black>=25.1.0; extra == "dev"
51
+ Requires-Dist: isort>=6.0.1; extra == "dev"
52
+ Requires-Dist: flake8>=7.2.0; extra == "dev"
53
+ Requires-Dist: pre-commit>=4.2.0; extra == "dev"
44
54
  Requires-Dist: pytest-mypy; extra == "dev"
45
55
  Requires-Dist: pytest-cov; extra == "dev"
46
56
  Requires-Dist: twine; extra == "dev"
@@ -61,11 +71,11 @@ Dynamic: requires-python
61
71
  Dynamic: summary
62
72
 
63
73
  <p align="center">
64
- <a href="https://datarecce.io">
74
+ <a href="https://reccehq.com">
65
75
  <picture>
66
- <source media="(prefers-color-scheme: dark)" srcset="https://datarecce.io/assets/images/recce-logo-stacked.png">
67
- <source media="(prefers-color-scheme: light)" srcset="https://datarecce.io/assets/images/recce-logo-stacked.png">
68
- <img alt="Recce: DataRecce.io" src="https://datarecce.io/assets/images/recce-logo-stacked.png" width="200" style="width: 100%; max-width: 200px; display: block; margin: 0 auto 20px;">
76
+ <source media="(prefers-color-scheme: dark)" srcset="https://reccehq.com/assets/images/recce-logo-stacked.avif">
77
+ <source media="(prefers-color-scheme: light)" srcset="https://reccehq.com/assets/images/recce-logo-stacked.avif">
78
+ <img alt="Recce: DataRecce.io" src="https://reccehq.com/assets/images/recce-logo-stacked.avif" width="200" style="display: block; margin: 0 auto 20px;">
69
79
  </picture>
70
80
  </a>
71
81
  </p>
@@ -73,13 +83,13 @@ Dynamic: summary
73
83
  <h3 align="center">Helping data teams preview, validate, and ship data changes with confidence.</h3>
74
84
 
75
85
  <p align="center">
76
- <a href="https://pypi.org/project/recce/"><img src="https://img.shields.io/badge/pip_install-recce-006DAD?style=flat-square" alt="install"></a> &nbsp;
77
- <a href="https://pypi.org/project/recce/"><img src="https://img.shields.io/pypi/v/recce?style=flat-square" alt="pipy"></a> &nbsp;
78
- <a href="https://pypi.org/project/recce/"><img src="https://img.shields.io/pypi/pyversions/recce?style=flat-square" alt="Python"></a> &nbsp;
79
- <a href="https://pypi.org/project/recce/#files"><img src="https://img.shields.io/pypi/dw/recce?style=flat-square" alt="downloads"></a> &nbsp;
80
- <a href="https://github.com/DataRecce/recce/blob/main/LICENSE"><img src="https://img.shields.io/github/license/DataRecce/recce?style=flat-square" alt="license"></a> &nbsp;
81
- <a href="https://getdbt.slack.com/archives/C05C28V7CPP"><img src="https://img.shields.io/badge/Slack-4A154B?style=flat-square&amp;logo=slack&amp;logoColor=white" alt="Slack"></a> &nbsp;
82
- <a href="https://discord.com/invite/5zb2aK9KBV"><img src="https://img.shields.io/discord/664381609771925514?color=%237289DA&amp;label=chat&amp;logo=discord&amp;logoColor=white&amp;style=flat-square" alt="InfuseAI Discord Invite"></a> &nbsp;
86
+ <a href="https://pypi.org/project/recce/"><img src="https://img.shields.io/badge/pip_install-recce-006DAD?style=flat-square" alt="install"></a> &nbsp;
87
+ <a href="https://pypi.org/project/recce/"><img src="https://img.shields.io/pypi/v/recce?style=flat-square" alt="pipy"></a> &nbsp;
88
+ <a href="https://pypi.org/project/recce/"><img src="https://img.shields.io/pypi/pyversions/recce?style=flat-square" alt="Python"></a> &nbsp;
89
+ <a href="https://pypi.org/project/recce/#files"><img src="https://img.shields.io/pypi/dw/recce?style=flat-square" alt="downloads"></a> &nbsp;
90
+ <a href="https://github.com/DataRecce/recce/blob/main/LICENSE"><img src="https://img.shields.io/github/license/DataRecce/recce?style=flat-square" alt="license"></a> &nbsp;
91
+ <a href="https://getdbt.slack.com/archives/C05C28V7CPP"><img src="https://img.shields.io/badge/Slack-4A154B?style=flat-square&amp;logo=slack&amp;logoColor=white" alt="Slack"></a> &nbsp;
92
+ <a href="https://discord.com/invite/5zb2aK9KBV"><img src="https://img.shields.io/discord/664381609771925514?color=%237289DA&amp;label=chat&amp;logo=discord&amp;logoColor=white&amp;style=flat-square" alt="InfuseAI Discord Invite"></a> &nbsp;
83
93
  </p>
84
94
 
85
95
  <p align="center">
@@ -94,24 +104,46 @@ Cut dbt review time by 90% and ship accurate data fast
94
104
  Recce gives data teams a faster, more reliable way to understand, review, and ship changes without all the guesswork or manual overhead.
95
105
 
96
106
  ## Quick Start
107
+
108
+ ### Installation
109
+
110
+ Recce offers two packages to fit different use cases:
111
+
112
+ **For full local development and Recce Cloud features:**
113
+ ```bash
114
+ pip install -U recce
115
+ recce server
116
+ ```
117
+
118
+ **For CI/CD artifact uploads only (lightweight):**
119
+ ```bash
120
+ pip install -U recce-cloud
121
+ recce-cloud upload
122
+ ```
123
+
124
+ The `recce-cloud` package is a lightweight CLI tool designed specifically for CI/CD environments where you only need to upload dbt artifacts to Recce Cloud. It has minimal dependencies and installs faster than the full `recce` package.
125
+
126
+ ### Getting Started
127
+
97
128
  You can launch Recce in any dbt project in just two commands:
98
129
 
99
- ```Bash
130
+ ```bash
100
131
  # cd into your dbt project
101
132
  pip install -U recce
102
133
  recce server
103
134
  ```
104
- This starts Recce locally, where you can explore lineage and run queries. To unlock the full set of diffing tools, such as data comparisons and impact checks, you’ll need to prepare two environments to compare against. You can follow our [Getting Started](https://docs.datarecce.io/get-started/) and [5-minute Jaffle Shop tutorial](https://docs.datarecce.io/get-started-jaffle-shop/) to try it out step-by-step.
135
+
136
+ This starts Recce locally, where you can explore lineage and run queries. To unlock the full set of diffing tools, such as data comparisons and impact checks, you'll need to prepare two environments to compare against. You can follow our [Getting Started](https://docs.reccehq.com/get-started/) and [5-minute Jaffle Shop tutorial](https://docs.reccehq.com/get-started-jaffle-shop/) to try it out step-by-step.
105
137
 
106
138
  ## What You Get
107
139
 
108
140
  Recce gives you a clear, fast way to understand what your data changes are doing and why they matter. It helps you catch problems early, verify metrics, and share your findings with others, all as part of your normal workflow.
109
141
 
110
- <a href="https://pr46.demo.datarecce.io/"><img width="1347" alt="readme" src="https://github.com/user-attachments/assets/773e4c3a-0a15-49e0-8d1b-38a55af17cb0" /></a>
142
+ <a href="https://pr46.demo.reccehq.com/"><img width="1347" alt="readme" src="https://github.com/user-attachments/assets/773e4c3a-0a15-49e0-8d1b-38a55af17cb0" /></a>
111
143
 
112
- <a href="https://datarecce.io"><img src="https://docs.datarecce.io/assets/images/home/diff-readme2.png" style="width: 100%; max-width: 600px; display: block; margin: 0 auto 20px;" alt="Model and column level diff"/></a>
144
+ <a href="https://reccehq.com"><img src="https://docs.reccehq.com/assets/images/1-whats-recce/diff-readme2.png" style="width: 100%; max-width: 600px; display: block; margin: 0 auto 20px;" alt="Model and column level diff"/></a>
113
145
 
114
- <a href="https://datarecce.io"><img src="https://docs.datarecce.io/assets/images/home/checklist-readme3.png" style="width: 100%; max-width: 600px; display: block; margin: 0 auto 20px;" alt="Checklist for collaboration"/></a>
146
+ <a href="https://reccehq.com"><img src="https://docs.reccehq.com/assets/images/1-whats-recce/checklist-readme3.png" style="width: 100%; max-width: 600px; display: block; margin: 0 auto 20px;" alt="Checklist for collaboration"/></a>
115
147
 
116
148
  ### Using Recce for Impact Assessment in dbt PR Review
117
149
 
@@ -122,18 +154,17 @@ Recce gives you a clear, fast way to understand what your data changes are doing
122
154
  - (`Recce Cloud`) Automatically sync Check status between Recce Instances
123
155
  - (`Recce Cloud`) Block PR merging until all Recce Checks have been approved
124
156
 
125
- Read more about using [Recce for Impact Assessment](https://datarecce.io/blog/hands-on-data-impact-analysis-recce/) on
126
- the Recce blog.
157
+ Read more about using Recce on our [blog](https://blog.reccehq.com).
127
158
 
128
159
  ### What’s Included
129
160
 
130
- - [Lineage and impact mapping](https://docs.datarecce.io/features/lineage/): Quickly see which models and columns are affected by a change. Navigate lineage down to the column level, and spot breaking changes with clear visual cues.
131
- - Metric and data comparisons: Use [Profile, Value, Top-K, and Histogram Diffs](https://docs.datarecce.io/features/lineage/#node-details) to compare results before and after changes. Validate things like row counts, category distributions, and numeric ranges without writing extra SQL.
132
- - [Query diff](https://docs.datarecce.io/features/query/): Write and compare any two queries side by side. This is helpful when validating fixes or reviewing changes with teammates.
133
- - [Checklist for reviews and approvals](https://docs.datarecce.io/features/checklist/): Turn your validation steps into a checklist. Add notes, rerun checks, and share the results with reviewers or stakeholders. In Recce Cloud, checklists can sync automatically and even block PRs until checks are approved.
134
- - Secure by design: Recce is [SOC 2 compliant](https://trust.cloud.datarecce.io/) to meet enterprise security standards. It runs locally or in your private environment, and your data stays in your warehouse.
161
+ - [Lineage and impact mapping](https://docs.reccehq.com/features/lineage/): Quickly see which models and columns are affected by a change. Navigate lineage down to the column level, and spot breaking changes with clear visual cues.
162
+ - Metric and data comparisons: Use [Profile, Value, Top-K, and Histogram Diffs](https://docs.reccehq.com/features/lineage/#node-details) to compare results before and after changes. Validate things like row counts, category distributions, and numeric ranges without writing extra SQL.
163
+ - [Query diff](https://docs.reccehq.com/features/query/): Write and compare any two queries side by side. This is helpful when validating fixes or reviewing changes with teammates.
164
+ - [Checklist for reviews and approvals](https://docs.reccehq.com/features/checklist/): Turn your validation steps into a checklist. Add notes, rerun checks, and share the results with reviewers or stakeholders. In Recce Cloud, checklists can sync automatically and even block PRs until checks are approved.
165
+ - Secure by design: Recce is [SOC 2 compliant](https://trust.reccehq.com/) to meet enterprise security standards. It runs locally or in your private environment, and your data stays in your warehouse.
135
166
 
136
- 👉 Want to dive deeper? Check out the [full documentation](https://docs.datarecce.io/) like [running Recce in CI/CD](https://docs.datarecce.io/guides/scenario-ci/)
167
+ 👉 Want to dive deeper? Check out the [full documentation](https://docs.reccehq.com/).
137
168
 
138
169
  ## Recce Cloud
139
170
 
@@ -145,26 +176,26 @@ Ready to collaborate and move faster as a team? Recce Cloud adds real-time colla
145
176
  - Launch demo links from your CI with full context
146
177
 
147
178
  Recce Cloud is a hosted version of Recce that standardizes your workflow, keeps teams aligned, and reduces errors—so you can ship data changes with confidence.
148
- 👉 [View Pricing and Plans](https://datarecce.io/pricing)
179
+ 👉 [View Pricing and Plans](https://reccehq.com/pricing)
149
180
 
150
181
  ## Community & Support
151
182
 
152
- Here's where you can get in touch with the Recce team and find support:
183
+ Here's where you can get in touch with the Recce team and find support, add a subscribe to our newsletter option as well:
153
184
 
154
- - [dbt Slack](https://www.getdbt.com/community/join-the-community) in
155
- the [#tools-recce](https://getdbt.slack.com/archives/C05C28V7CPP) channel
156
- - Email us [product@datarecce.io](mailto:product@datarecce.io)
185
+ - [chat on our website](https://reccehq.com/). We welcome you to start a chat or drop us a note. Our team monitors the chat box and will follow up soon.
186
+ - [Our discord](https://discord.com/invite/VpwXRC34jz)
187
+ - [dbt Slack](https://www.getdbt.com/community/join-the-community) in the [#tools-recce](https://getdbt.slack.com/archives/C05C28V7CPP) channel
188
+ - Email us [help@reccehq.com](mailto:help@reccehq.com)
157
189
 
158
- If you believe you have found a bug, or there is some missing functionality in Recce, please open
159
- a [GitHub Issue](https://github.com/DataRecce/recce/issues).
190
+ If you believe you have found a bug on our open source, or there is some missing functionality in Recce, please open a [GitHub Issue](https://github.com/DataRecce/recce/issues).
160
191
 
161
192
  ## Recce on the web
162
193
 
163
194
  You can follow along with news about Recce and blogs from our team in the following places:
164
195
 
165
- - [DataRecce.io](https://DataRecce.io)
196
+ - [RecceHQ.com](https://reccehq.com/)
166
197
  - [LinkedIn](https://www.linkedin.com/company/datarecce)
167
- - [Medium blog](https://medium.com/inthepipeline)
198
+ - [Blog](https://blog.reccehq.com/)
168
199
  - [@datarecce](https://x.com/DataRecce) on Twitter/X
169
200
  - [@DataRecce@mastodon.social](https://mastodon.social/@DataRecce) on Mastodon
170
201
  - [@datarecce.bsky.social](https://bsky.app/profile/datarecce.bsky.social) on BlueSky
@@ -0,0 +1,180 @@
1
+ recce/VERSION,sha256=F79_ODt3HAHKiBuT99xGBY1RsjjCU9o8J9lknb7iJZI,16
2
+ recce/__init__.py,sha256=gT5G7sJ78C1GHAWr4pna6UvVNxPKs29_EgFS_ia3DT4,2554
3
+ recce/artifact.py,sha256=zksgrKEONdMmBRgM59gzf6srsr0As_UADZTQrWfC2cE,9759
4
+ recce/cli.py,sha256=8WE4tKGIslNJhjVQtKjRS2bOHJcxMjvs4fL5DnQY9a8,61141
5
+ recce/config.py,sha256=noWimlOdGHAtBhNoApK5gRTQMwNPmUGAmZu39MV7szo,4697
6
+ recce/connect_to_cloud.py,sha256=CT7ELcVCTNa9ukSp_gMrJ0Av2UCUpF9H03tIk9y7U-4,4768
7
+ recce/core.py,sha256=Fph2kodFqzXy3cob80M9-nPVcv-Xxzme-E-bKFJ4cBQ,10754
8
+ recce/diff.py,sha256=L2_bzQ3__PO-0aeir8PHF8FvSOUmQ8WcDXgML1-mHdY,748
9
+ recce/exceptions.py,sha256=SclQ678GrHGjw7p_ZFJ3vZaL_yMU5xABeIAm2u_W2bk,592
10
+ recce/git.py,sha256=8Eg-6NzL-KjA3rT-ibbAyaCwGlzV0JqH3yGikrJNMDA,2344
11
+ recce/github.py,sha256=vIwHTpB8YWEUcHQlW0nToUUKmGGO0NcmB_Q5RvxQLLE,7438
12
+ recce/mcp_server.py,sha256=q2HumZP4ndkUIGwxBmqOdGjpEUhww0x_pcX7bSGFTGA,31371
13
+ recce/pull_request.py,sha256=dLHsdiMtL4NC6Vkwp8Mq4baJmnqbm19lfiDti9MREN0,3850
14
+ recce/run.py,sha256=ctp-K2FmrsGrS4xEZKDMbMtitNw2QKJ6Tq_0OvCWaaM,14080
15
+ recce/server.py,sha256=xQZzSzwFrZE4C8s441MeRW_mnHNkeM_lqesMpjaXDQk,27093
16
+ recce/summary.py,sha256=cGSnKTZsav_UFDpRnQHbKjDHPihN-eShjc6-1sli0y4,20084
17
+ recce/adapter/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
18
+ recce/adapter/base.py,sha256=T_JNeLHgiHSaegw-DbrvHOaYjMyZcjj2Qtg5cWh_fco,3548
19
+ recce/adapter/sqlmesh_adapter.py,sha256=IU3N-F6ToDoO7_bV5vsG8pmTuDcbFtewTIuCxedTaRM,5046
20
+ recce/adapter/dbt_adapter/__init__.py,sha256=DdsxMKC-2OTttgx4dRK8u4_oW4ijxA_geJQAWB39Z4w,67239
21
+ recce/adapter/dbt_adapter/dbt_version.py,sha256=M7aedZIWslXnJsryK8Ki4OL_t2oAKxy4uE2pRwfWIkk,1228
22
+ recce/apis/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
23
+ recce/apis/check_api.py,sha256=KMCXSMl1qqzx2jQgRqCrD4j_cY3EHBbM3H2-t-6saAU,6227
24
+ recce/apis/check_func.py,sha256=gktbCcyk3WGvWRJJ-wDnwv7NrIny2nTHWLl1-kdiVRo,4183
25
+ recce/apis/run_api.py,sha256=eOaxOxXDkH59uqGCd4blld7edavUx7JU_DCd2WAYrL8,3416
26
+ recce/apis/run_func.py,sha256=6wC8TDU-h7TLr2VZH7HNsWaUVlQ9HBN5N_dwqfi4lMY,7440
27
+ recce/data/404.html,sha256=4oQ7hZ53AUwP-HkQTk25ZYUHoadQCohu9TfDmwYttEc,59467
28
+ recce/data/__next.__PAGE__.txt,sha256=HoCpVLDUi5fUfRUFVGH7wq854cxPGWZztOQCLeD-o-w,1208
29
+ recce/data/__next._full.txt,sha256=NGotKLI5_JGNMxTLGIeMEwyD6-TTNmDcdOvjFKaFf48,5158
30
+ recce/data/__next._head.txt,sha256=Yhx7tiTPs9FavWA-c1yqDOn8Xuaq61bjaRg7SFviGxw,1085
31
+ recce/data/__next._index.txt,sha256=6_ChdpGvplJtJI7EiIQTjWmAeB5Jds35gQE25pKDAGY,2442
32
+ recce/data/__next._tree.txt,sha256=BR-XE42XsD3YQvI7-uDec0-6fujs6d69g_dXg-XQrjM,475
33
+ recce/data/_not-found.html,sha256=4oQ7hZ53AUwP-HkQTk25ZYUHoadQCohu9TfDmwYttEc,59467
34
+ recce/data/_not-found.txt,sha256=Pd0MX6FFat_lI1RwK6cPfrpQ3eeZXksKM8HVetv5pQk,5887
35
+ recce/data/auth_callback.html,sha256=H-XfdlAFiw5VU2RpKBVQbwh1AIqJrPHrFA0S09nNJZA,94779
36
+ recce/data/favicon.ico,sha256=B2mBumUOnzvUrXrqNkrc5QfdDXjzEXRcWkWur0fJ6sM,2565
37
+ recce/data/index.html,sha256=iQ5WIml9knuuInLJisWcov8X4e_h0E32tBLKMi7V9gk,74411
38
+ recce/data/index.txt,sha256=NGotKLI5_JGNMxTLGIeMEwyD6-TTNmDcdOvjFKaFf48,5158
39
+ recce/data/_next/static/52aV_JrNUZU6dMFgvTQEO/_buildManifest.js,sha256=lHbgr9P52mimTm7FhjEZH9PqymLJ9aN351F_6aieWeo,219
40
+ recce/data/_next/static/52aV_JrNUZU6dMFgvTQEO/_clientMiddlewareManifest.json,sha256=T1PNoYwrqgwDVLtfmj7L5e0Sq02OEbqHPC8RFhICuUU,2
41
+ recce/data/_next/static/52aV_JrNUZU6dMFgvTQEO/_ssgManifest.js,sha256=Z49s4suAsf5y_GfnQSvm4qtq2ggxEbZPfEDTXjy6XgA,80
42
+ recce/data/_next/static/chunks/02b996c7f6a29a06.js,sha256=M8DNJ5Pq59GKeNhmwMqDLHjqbYH5Sw7agBqo7Cjllvg,98587
43
+ recce/data/_next/static/chunks/19c10d219a6a21ff.js,sha256=ohhihO1BmJTnfQWLePPxbEs5Cr8sR3rCWAljeiy2mCc,178
44
+ recce/data/_next/static/chunks/2df9ec28a061971d.js,sha256=SCoimC96s9Uro3Y5JaPvn1R6A1y0Xij8aEQsg1p-ACc,43423
45
+ recce/data/_next/static/chunks/3098c987393bda15.js,sha256=qNhClDGhgsMmWSLkLJWLhwo5suMjdPcJ8mTE4Alocx0,174689
46
+ recce/data/_next/static/chunks/393dc43e483f717a.css,sha256=R9tO9_8TWzuPgpEaIKnvGqsWiA5x0PTf7sFJbAXwcJQ,8339
47
+ recce/data/_next/static/chunks/399e8d91a7e45073.js,sha256=Vq4vdWMQ85-XiEAtR6p_LTNrZJNNP0VpB91OJEo8v50,84062
48
+ recce/data/_next/static/chunks/4d0186f631230245.js,sha256=wNAFh8tqOVdbkzkRhdt3D-FxU6lxyoh6Q1sReFMkgMs,6857
49
+ recce/data/_next/static/chunks/5794ba9e10a9c060.js,sha256=yWLyYaVxazJrRRhLRmKtZKl52RT7P1iThuADlvA1XgU,1786121
50
+ recce/data/_next/static/chunks/715761c929a3f28b.js,sha256=ovn4Je_DoVU-7nD_s94EwtywIKQf8D1rpI8iVnakOow,803159
51
+ recce/data/_next/static/chunks/71f88fcc615bf282.js,sha256=55RlXxwna_yDR1-s8uK-GZv1IUOVhCGB8rULcz75S3U,7218
52
+ recce/data/_next/static/chunks/80d2a95eaf1201ea.js,sha256=4fdJkr4Ak7pHysFhr1EQnKA5lPKxgKAIXdUUe3we9Ok,213851
53
+ recce/data/_next/static/chunks/9979c6109bbbee35.js,sha256=s0paJmRBP8v2NEdF41EGZ9WdBNmhKIki5FTJck64afI,20110
54
+ recce/data/_next/static/chunks/99d638224186c118.js,sha256=O1q3BJYdnMjYlRRJbikKdZrP605m45GYIu8CWN3brIA,281
55
+ recce/data/_next/static/chunks/a6dad97d9634a72d.js,sha256=CXPB1kyIrcjjyVBBDLWLKI9yEY1ZZbeASUON648vloM,112594
56
+ recce/data/_next/static/chunks/d003eb36240e92f3.js,sha256=8E7XHFXSJL35O5jTkOuCIadex8gVP_lNVv3Cwb4CRTs,27850
57
+ recce/data/_next/static/chunks/d3167cdfec4fc351.js,sha256=QrH6SZTjf_NWZ0-vDDt8FnBw5kh6CLXL4b3Z3Wu1cBs,119836
58
+ recce/data/_next/static/chunks/e124bccf574a3361.css,sha256=6gXTy63dQt22HjYeSokfddLsIhwm0GU_JymzPrdHRm4,12679
59
+ recce/data/_next/static/chunks/f40141db1bdb46f0.css,sha256=ZAZTTQ25NoZLtYdiB8J_I6WZOY3bto0MUEgTzf2cV5Q,22061
60
+ recce/data/_next/static/chunks/fcc53a88741a52f9.js,sha256=kpd-7jmfcnnyxNJ67pWO_04nVnw3_PUI9RkiZQmM-2w,1386
61
+ recce/data/_next/static/chunks/turbopack-b1920d28cfb1f28d.js,sha256=1b2dw4uD8GkmqphVyH9IzPJLkVQH7hOOuJcpA4y98no,9909
62
+ recce/data/_next/static/media/favicon.a8d38d84.ico,sha256=B2mBumUOnzvUrXrqNkrc5QfdDXjzEXRcWkWur0fJ6sM,2565
63
+ recce/data/_next/static/media/montserrat-cyrillic-800-normal.d80d830d.woff2,sha256=6XlujeGVTucujV3iPSa7j1d9S5A6uuH-EduJBCeVFu8,11180
64
+ recce/data/_next/static/media/montserrat-cyrillic-800-normal.f9d58125.woff,sha256=XiXifLCW_CfSR4eNCIxDzi3Cg59f6L34ARTHrw-hoDA,10924
65
+ recce/data/_next/static/media/montserrat-cyrillic-ext-800-normal.076c2a93.woff2,sha256=9hQT0vu2HmOb21Pk5Ht7bydZU7QIsY7rCyAPtm1VxM8,12144
66
+ recce/data/_next/static/media/montserrat-cyrillic-ext-800-normal.a4fa76b5.woff,sha256=lpODDPTBtDBAla5_gN_MO8RAFRT1bUJQ1XsBGNN3LHA,12036
67
+ recce/data/_next/static/media/montserrat-latin-800-normal.cde454cc.woff2,sha256=uoJvuEwulhV4rfOgi1d4uHkF1EQ0RdHVbYT58VfV6ks,19012
68
+ recce/data/_next/static/media/montserrat-latin-800-normal.d5761935.woff,sha256=JvnmESYLcsQ0Z9Cgq09WxQaOxDHkHZ4wiPp0EXyghtg,20660
69
+ recce/data/_next/static/media/montserrat-latin-ext-800-normal.40ec0659.woff2,sha256=Wfbr63GhTGTtxTjrp4oBDBye9oCmalWew89LDRLbGos,33624
70
+ recce/data/_next/static/media/montserrat-latin-ext-800-normal.b671449b.woff,sha256=1UdAsVT5LZ__hVWZ8WuyQ16miAO5eVOIV0Qy1FCS17c,41688
71
+ recce/data/_next/static/media/montserrat-vietnamese-800-normal.9f7b8541.woff,sha256=IOzp6YFKpjBM18q3jyRJYrgPJpNGDnEehwa3vyleQ6s,7328
72
+ recce/data/_next/static/media/montserrat-vietnamese-800-normal.f9eb854e.woff2,sha256=JPFJw2_X2Eih976ylPgpqHZJJxgdMAL3sCAhKV51-P0,7900
73
+ recce/data/_next/static/media/reload-image.7aa931c7.svg,sha256=l-jdOsD0OBCpFrVYh1ubO8oajafPuPNs6MYnbanO7K0,840
74
+ recce/data/_not-found/__next._full.txt,sha256=Pd0MX6FFat_lI1RwK6cPfrpQ3eeZXksKM8HVetv5pQk,5887
75
+ recce/data/_not-found/__next._head.txt,sha256=CGMN86GBFG8cbGkDES38WpiXhqLpOu3L2PaHZBFyrfA,1136
76
+ recce/data/_not-found/__next._index.txt,sha256=6_ChdpGvplJtJI7EiIQTjWmAeB5Jds35gQE25pKDAGY,2442
77
+ recce/data/_not-found/__next._not-found.__PAGE__.txt,sha256=wXxpP13I6012w0LfLx48IXcPFWbYiUrfnj5Lha-qoCw,1449
78
+ recce/data/_not-found/__next._not-found.txt,sha256=3YdpC-HGCzjaLZggpRyGiwBg7i1V3GQW2LDCoQHwmfE,432
79
+ recce/data/_not-found/__next._tree.txt,sha256=DHpFRaC1yx4xNsO2drR3F5OA3Uaau16MejIPU8sYdJM,540
80
+ recce/data/imgs/reload-image.svg,sha256=l-jdOsD0OBCpFrVYh1ubO8oajafPuPNs6MYnbanO7K0,840
81
+ recce/data/imgs/feedback/thumbs-down.png,sha256=q9KVIbaZku1TWkYHuleYlO-b6HsTApYh3St5xNHMGMg,10695
82
+ recce/data/imgs/feedback/thumbs-up.png,sha256=VF3BH8bmYEqcSsMDJO57xMqW4t6crCXUXaMlOPgI_OE,10556
83
+ recce/data/logo/recce-logo-white.png,sha256=y3re8iEucJnMUkAkRS2CjWHTlOydyvgWdWjuQKcXDbk,46923
84
+ recce/event/CONFIG,sha256=w8_AVcNu_JF-t8lNmjOqtsXbeOawMzpEhkISaMlm-iU,48
85
+ recce/event/SENTRY_DNS,sha256=nWXZevLC4qDScvNtjs329X13oxqvtFI_Kiu6cfCDOBA,83
86
+ recce/event/__init__.py,sha256=UKo0U0OZTkWsr7QBnCwXOHu7XtY0dhYPRTXuCsX8uIw,8847
87
+ recce/event/collector.py,sha256=6Vvcz9zejNNMytZ_K0HFV_kN6-S5B-SUOglBrlSPBo8,5884
88
+ recce/event/track.py,sha256=3wBzpB8l2gtnDzjh-wJatmLeBbtnP0q-BLQZQVQ23sM,5310
89
+ recce/models/__init__.py,sha256=F7cgALtdWnwv37R0eEgKZ_yBsMwxWnUfo3jAZ3u6qyU,209
90
+ recce/models/check.py,sha256=jjR1SGyczjrqyK-0Zas6ikLIGSgVp54lvfcQA19AniI,1588
91
+ recce/models/run.py,sha256=QK2gvOWvko9YYhd2NLs3BPt5l4MSCZGwpzTAiqx9zJw,1161
92
+ recce/models/types.py,sha256=OAVuEXs1GfpmlshWzirpm3VaLtZToKGCm5DSDVikC5E,6572
93
+ recce/state/__init__.py,sha256=V1FRPTQJUz-uwI3Cn8wDa5Z9bueVs86MR_1Ti4RGfPc,650
94
+ recce/state/cloud.py,sha256=yWS9dhG7gFVhNDrdaFzDSVHMiC74UYeYQm19XkRNcVk,25523
95
+ recce/state/const.py,sha256=5XwGWEv4RhGucgl1RHWg_67gVY7fV0-jsbZPpfnOCTs,828
96
+ recce/state/local.py,sha256=bZIkl7cAfyYaGgYEr3uD_JLrtwlHBnu8_o1Qz2djQzw,1920
97
+ recce/state/state.py,sha256=EKx4h0unxjC-dt2EGYFUyjKijotKHbE_wdS5AWBEq1k,3645
98
+ recce/state/state_loader.py,sha256=IiGaFDm2y_0NMsv_YUZhSuDTsvWmdMrf9SXIv9w5sKE,5966
99
+ recce/tasks/__init__.py,sha256=b553AtDHjYROgmMePv_Hv_X3fjh4iEn11gzzpUJz6_o,610
100
+ recce/tasks/core.py,sha256=JFYa1CfgOiRPQ7KVTwMuxJjhMB-pvCwB-xezVt-h3RU,4080
101
+ recce/tasks/dataframe.py,sha256=F9tOIjdJA_mkgzGmqdzfSfmhpJhdDb9DYYpWXAuBOyE,5868
102
+ recce/tasks/histogram.py,sha256=SMdSznzrBdAFvAbhsoUGAK9o0QUMYy00IVbamUVTpBk,13601
103
+ recce/tasks/lineage.py,sha256=_PbY0ZkDr620U8V2olqoX_T9XA0-G8ILt_6m1Q5TfBs,541
104
+ recce/tasks/profile.py,sha256=gMgms9qvdDsihh2aSC6LvCm9ggah4Oq3xjvmCh_exrU,11352
105
+ recce/tasks/query.py,sha256=k3y_IK1_3D2j4Scw-70ccDjVMa-Oe9jqxlDyLHfjagw,12790
106
+ recce/tasks/rowcount.py,sha256=WZ1vNI0YJ40G-DBgx2apjNAhoQg1bvzrtBpUZFou1Nc,9908
107
+ recce/tasks/schema.py,sha256=s7CsmUoKNDx-WM87X_cCOpKieKxqEZITFzQTEq3ZckU,2432
108
+ recce/tasks/top_k.py,sha256=vY3VCBmg61E8I4V-9-hJOv5RCYCmhxl6sHiKR9Zv7eE,5521
109
+ recce/tasks/valuediff.py,sha256=QLv0zgM9pWibvjyfZHjkpGopY9qqlpU0-WdFB109MUQ,16418
110
+ recce/util/__init__.py,sha256=cDvL3WT32cJR9CUPIJmibwJoyYcB3ZaKBFbOZDyvqP8,95
111
+ recce/util/api_token.py,sha256=iLS3VzLlsTfbXBLDoPPelmVlj6UdcEtGmfxdFQxXXSg,3223
112
+ recce/util/breaking.py,sha256=QMVq2l2fR7gNT4-n4kdhFTPf2NFev-jzecBSw_AwqFg,13086
113
+ recce/util/cache.py,sha256=QB6wzxe0M3jNTwP0M27Ys8F2hF-oda4-LyXXG9THuZQ,646
114
+ recce/util/cll.py,sha256=p8BrsG_1Lm-jXO8n4ulUgFw13C4mN0WjCXZbihDxQrs,13253
115
+ recce/util/io.py,sha256=UTUDncG4habAZZSZ1Y7i7Zpzu6FBtsfWI3y96k-0zkc,3495
116
+ recce/util/lineage.py,sha256=0XXOO05eJ3GPUNX9V9GBQS2iRFXxWZJoJbV7w-jQ0t8,2470
117
+ recce/util/logger.py,sha256=6UgLFkRiur9jJfu2ZRdo4LUvMw4f75V-l-1HT1-sgKo,747
118
+ recce/util/onboarding_state.py,sha256=kwFirKlfXdl5WFkR_nmilqGKFyELNcSPMqYq-by35fk,1991
119
+ recce/util/perf_tracking.py,sha256=FjhrdbbXIgybxS_oPpFsJ9VUDR93d7bUs8VNNqpXNxw,2483
120
+ recce/util/pydantic_model.py,sha256=KumKuyCjbTzEMsKLE4-b-eZfp0gLhYDdmVtw1-hxiJw,587
121
+ recce/util/recce_cloud.py,sha256=8gv0NQENekHEOrzGB4S3D2Gv8RkaT9CQFNF0_oa9nno,17905
122
+ recce/util/singleton.py,sha256=1cU99I0f9tjuMQLMJyLsK1oK3fZJMsO5-TbRHAMXqds,627
123
+ recce/yaml/__init__.py,sha256=PAym5akbtL24Ag7VR7EW8SS2VINNaJU06esbfe-ek-U,1328
124
+ recce_cloud/__init__.py,sha256=SYFgYA-KJmqVzZRLq65rtvt9JZfTDFJTf9qye7q_SJE,721
125
+ recce_cloud/artifact.py,sha256=C6q1i8d0JdTIVLcJY1ZEmJJ0uBz-0g3zVZD8ss0K1iI,1458
126
+ recce_cloud/cli.py,sha256=7vpRbH2FusbFBxferRJAonQROMmekv5Wf48CxfOF3_w,9617
127
+ recce_cloud/upload.py,sha256=GLFG3q9KIcYedPcLZM5x1dWSEF9OdZsX1z-SUET1M0E,8347
128
+ recce_cloud/api/__init__.py,sha256=HrGOh7wp_U3G3gOXyGjJo1WoDXrMvhwjw8VGO2aKNTw,562
129
+ recce_cloud/api/base.py,sha256=ceD9cTgqctEu8aPqSCX9NNlC10-w4ocwgIcqjLnOpUM,3678
130
+ recce_cloud/api/client.py,sha256=LByXcj2yr9jqpYQIt3zXM6So1dq46j_0FitssBSelHA,5422
131
+ recce_cloud/api/exceptions.py,sha256=BSfuh7dGZsx1qDkr2ZhRIAoPo_eXkAIhyho5PrUX2yo,634
132
+ recce_cloud/api/factory.py,sha256=0hdo2jTdTlvd8cU7YTZFJJ2q3ybSssA2JKLr0bO1QmQ,2081
133
+ recce_cloud/api/github.py,sha256=y4Og6uAN_sBEi7UJqnKXe3maf8KpupOisdr-eGBtf6g,2494
134
+ recce_cloud/api/gitlab.py,sha256=DHBhnx9ICo1iP17jvKGVN8flKPhfzVMjUAiJLyxtjHE,2779
135
+ recce_cloud/ci_providers/__init__.py,sha256=cB2bydn4QOMurJVfWhIN9uTD9gIyiBcYOloN-0TvMW4,328
136
+ recce_cloud/ci_providers/base.py,sha256=v8P_eZdMwkgo3vCIHoyu1vBfetJICUNKz3z8ezOgwl0,2577
137
+ recce_cloud/ci_providers/detector.py,sha256=GvZuPo7Gq8eKCxsgYiYjQ3CYu3icPbi0moAYflnLDOk,5056
138
+ recce_cloud/ci_providers/github_actions.py,sha256=Vs4_YuqBsccjUeiT1a-wQBz-7sq5TnoGFwPJXniua_w,4311
139
+ recce_cloud/ci_providers/gitlab_ci.py,sha256=nQa2gZClXzLQ2soSqIhY5vul8RNQF-j_P-0bheD5U4s,4175
140
+ recce_nightly-1.26.0.20251124.dist-info/licenses/LICENSE,sha256=CQjjMy9aYPhfe8xG_bcpIfKtNkdxLZ5IOb8oPygtUhY,11343
141
+ tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
142
+ tests/test_cli.py,sha256=hT-KxF5PcVtNZ05HGsTrjec6WTDaD6vInCijJcCYiU8,9923
143
+ tests/test_cli_mcp_optional.py,sha256=w6Iwr22fheaOxw6vGXVZyvi0pw5uh8jDJKcdnd64-_o,1629
144
+ tests/test_cloud_listing_cli.py,sha256=77As9n0Sngdh53dfHkShmqDETMTOohlqw1xXO9cIago,14208
145
+ tests/test_config.py,sha256=ODDFe_XF6gphmSmmc422dGLBaCCmG-IjDzTkD5SJsJE,1557
146
+ tests/test_connect_to_cloud.py,sha256=b2fgV8L1iQBdEwh6RumMsIIyYg7GtMOMRz1dvE3WRPg,3059
147
+ tests/test_core.py,sha256=WgCFm8Au3YQI-V5UbZ6LA8irMNHRc7NWutIq2Mny0LE,6242
148
+ tests/test_dbt.py,sha256=VzXvdoJNwwEmKNhJJDNB1N_qZYwp1aoJQ1sLcoyRBmk,1316
149
+ tests/test_mcp_server.py,sha256=pXs2-ndezanGdDKj1fGp0lUFTmWipndBxKtsfbDRuDc,12365
150
+ tests/test_pull_request.py,sha256=HmZo5MoDaoKSgPwbLxJ3Ur3ajZ7IxhkzJxaOmhg6bwE,3562
151
+ tests/test_server.py,sha256=sq03awzG-kvLNJwHaZGDvVjd2uAs502XUKZ2nLNwvRQ,3391
152
+ tests/test_summary.py,sha256=oYhBbk2MJUERXXoWEQqn2AEQcteZk8_H9IrPexMAJsY,2971
153
+ tests/adapter/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
154
+ tests/adapter/dbt_adapter/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
155
+ tests/adapter/dbt_adapter/conftest.py,sha256=WlMVytJcyfLJlMBeYhpk8Q-nyCDR9x_7qgsy6Uh9ECw,386
156
+ tests/adapter/dbt_adapter/dbt_test_helper.py,sha256=o_7m0cnVeGwPwEFXBCx3Me5QqLzQMOBR3dXD-MS2eaM,10406
157
+ tests/adapter/dbt_adapter/test_dbt_adapter.py,sha256=Y5TSlqkXGjJC6hC7YYs45bnRht5aou_KLjPMjpAGxNM,830
158
+ tests/adapter/dbt_adapter/test_dbt_cll.py,sha256=BHVyqpm-0YaajblcJHzMyjrkK1b9oEv0PwtDEv3EwuI,28656
159
+ tests/adapter/dbt_adapter/test_selector.py,sha256=uKFm0QxrxG-xyUEXGobCMueCRUssgnZMyo-S1Nlk3_s,6856
160
+ tests/recce_cloud/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
161
+ tests/recce_cloud/test_ci_providers.py,sha256=dYjRJIE-YQtYH2W4sDoLkTGG_PY5dqEjDtPPp3KVGKs,14692
162
+ tests/recce_cloud/test_cli.py,sha256=JUT_aEA4bRoD0LIMlgs_sITY9i1uea5roQ_X_4QLrYk,13991
163
+ tests/recce_cloud/test_client.py,sha256=qYsmUZrvwfuVLVcTx6NoGiUlBEzFi89yHrl1E6q4yws,11231
164
+ tests/recce_cloud/test_platform_clients.py,sha256=Bl7ZZUwyObuPOUEHrY8cRn21BxaXKVh0Q7tbsttzgwI,14007
165
+ tests/tasks/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
166
+ tests/tasks/conftest.py,sha256=lyZFx4jEY3To3xVhfMQ-G45egYOCttKN2lxeyExACkY,157
167
+ tests/tasks/test_histogram.py,sha256=g69R2Ljvcd8RQTnq7EMZEa93_1vVWNe4ZLg990rWuyA,4088
168
+ tests/tasks/test_lineage.py,sha256=HODSP2_uSu98e4jV-t9TIOSrln_5mXd-6baKv9aEmws,1095
169
+ tests/tasks/test_preset_checks.py,sha256=fAro5kAv67YiXgRFj7hDAgZEd8fVSHW_VTapVDq4G04,1457
170
+ tests/tasks/test_profile.py,sha256=yDavc2-8AneOtkkPGCHJM0QUEYq6S8lJpQbQsJVfa_k,10233
171
+ tests/tasks/test_query.py,sha256=EkldbvckZkTOlm9b3y9zLzGIhlo1RShSsv-ycCjDHrg,4218
172
+ tests/tasks/test_row_count.py,sha256=21PaP2aq-x8-pqwzWHRT1sixhQ8g3CQNRWOZTTmbK0s,3151
173
+ tests/tasks/test_schema.py,sha256=7ds4Vx8ixaiIWDR49Lvjem4xlPkRP1cXazDRY3roUak,3121
174
+ tests/tasks/test_top_k.py,sha256=YR_GS__DJsbDlQVaEEdJvNQ3fh1VmV5Nb3G7lb0r6YM,1779
175
+ tests/tasks/test_valuediff.py,sha256=_xQJGgxsXoy2NYk_Z6Hsw2FlVh6zk2nN_iUueyRN1e8,2046
176
+ recce_nightly-1.26.0.20251124.dist-info/METADATA,sha256=nxGcWPoQm3t8qV5TORE69XrNDjCZLtuXUJ7nputYq_8,10172
177
+ recce_nightly-1.26.0.20251124.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
178
+ recce_nightly-1.26.0.20251124.dist-info/entry_points.txt,sha256=oqoY_IiwIqXbgrIsPnlqUqao2eiIeP2dprowkOlmeyg,40
179
+ recce_nightly-1.26.0.20251124.dist-info/top_level.txt,sha256=93B6jXmAPRijPPNsN8mzzVPP9M_lFQynyEuh8HDoFXg,24
180
+ recce_nightly-1.26.0.20251124.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (80.3.1)
2
+ Generator: setuptools (80.9.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
@@ -1,13 +1,17 @@
1
+ from unittest.mock import patch
2
+
1
3
  import pytest
2
4
 
3
5
  from recce.core import set_default_context
6
+
4
7
  from .dbt_test_helper import DbtTestHelper
5
8
 
6
9
 
7
10
  @pytest.fixture
8
11
  def dbt_test_helper():
9
- helper = DbtTestHelper()
10
- context = helper.context
11
- set_default_context(context)
12
- yield helper
13
- helper.cleanup()
12
+ with patch("recce.adapter.dbt_adapter.log_performance"):
13
+ helper = DbtTestHelper()
14
+ context = helper.context
15
+ set_default_context(context)
16
+ yield helper
17
+ helper.cleanup()