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.
- recce/VERSION +1 -1
- recce/__init__.py +27 -22
- recce/adapter/base.py +11 -14
- recce/adapter/dbt_adapter/__init__.py +810 -480
- 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 +119 -51
- recce/cli.py +1299 -323
- recce/config.py +42 -33
- recce/connect_to_cloud.py +138 -0
- recce/core.py +55 -47
- recce/data/404.html +1 -1
- recce/data/__next.__PAGE__.txt +10 -0
- recce/data/__next._full.txt +23 -0
- recce/data/__next._head.txt +8 -0
- recce/data/__next._index.txt +8 -0
- recce/data/__next._tree.txt +5 -0
- recce/data/_next/static/52aV_JrNUZU6dMFgvTQEO/_buildManifest.js +11 -0
- recce/data/_next/static/52aV_JrNUZU6dMFgvTQEO/_clientMiddlewareManifest.json +1 -0
- recce/data/_next/static/chunks/02b996c7f6a29a06.js +4 -0
- recce/data/_next/static/chunks/19c10d219a6a21ff.js +1 -0
- recce/data/_next/static/chunks/2df9ec28a061971d.js +11 -0
- recce/data/_next/static/chunks/3098c987393bda15.js +1 -0
- recce/data/_next/static/chunks/393dc43e483f717a.css +2 -0
- recce/data/_next/static/chunks/399e8d91a7e45073.js +2 -0
- recce/data/_next/static/chunks/4d0186f631230245.js +1 -0
- recce/data/_next/static/chunks/5794ba9e10a9c060.js +11 -0
- recce/data/_next/static/chunks/715761c929a3f28b.js +110 -0
- recce/data/_next/static/chunks/71f88fcc615bf282.js +1 -0
- recce/data/_next/static/chunks/80d2a95eaf1201ea.js +1 -0
- recce/data/_next/static/chunks/9979c6109bbbee35.js +1 -0
- recce/data/_next/static/chunks/99d638224186c118.js +1 -0
- recce/data/_next/static/chunks/d003eb36240e92f3.js +1 -0
- recce/data/_next/static/chunks/d3167cdfec4fc351.js +1 -0
- recce/data/_next/static/chunks/e124bccf574a3361.css +1 -0
- recce/data/_next/static/chunks/f40141db1bdb46f0.css +6 -0
- recce/data/_next/static/chunks/fcc53a88741a52f9.js +1 -0
- recce/data/_next/static/chunks/turbopack-b1920d28cfb1f28d.js +3 -0
- recce/data/_next/static/media/favicon.a8d38d84.ico +0 -0
- recce/data/_next/static/media/montserrat-cyrillic-800-normal.d80d830d.woff2 +0 -0
- recce/data/_next/static/media/montserrat-cyrillic-800-normal.f9d58125.woff +0 -0
- recce/data/_next/static/media/montserrat-cyrillic-ext-800-normal.076c2a93.woff2 +0 -0
- recce/data/_next/static/media/montserrat-cyrillic-ext-800-normal.a4fa76b5.woff +0 -0
- recce/data/_next/static/media/montserrat-latin-800-normal.cde454cc.woff2 +0 -0
- recce/data/_next/static/media/montserrat-latin-800-normal.d5761935.woff +0 -0
- recce/data/_next/static/media/montserrat-latin-ext-800-normal.40ec0659.woff2 +0 -0
- recce/data/_next/static/media/montserrat-latin-ext-800-normal.b671449b.woff +0 -0
- recce/data/_next/static/media/montserrat-vietnamese-800-normal.9f7b8541.woff +0 -0
- recce/data/_next/static/media/montserrat-vietnamese-800-normal.f9eb854e.woff2 +0 -0
- recce/data/_next/static/media/reload-image.7aa931c7.svg +4 -0
- recce/data/_not-found/__next._full.txt +17 -0
- recce/data/_not-found/__next._head.txt +8 -0
- recce/data/_not-found/__next._index.txt +8 -0
- recce/data/_not-found/__next._not-found.__PAGE__.txt +5 -0
- recce/data/_not-found/__next._not-found.txt +4 -0
- recce/data/_not-found/__next._tree.txt +3 -0
- recce/data/_not-found.html +1 -0
- recce/data/_not-found.txt +17 -0
- recce/data/auth_callback.html +68 -0
- recce/data/imgs/reload-image.svg +4 -0
- recce/data/index.html +1 -27
- recce/data/index.txt +23 -7
- recce/diff.py +6 -12
- recce/event/__init__.py +86 -74
- recce/event/collector.py +33 -22
- recce/event/track.py +49 -27
- recce/exceptions.py +1 -1
- recce/git.py +7 -7
- recce/github.py +57 -53
- recce/mcp_server.py +716 -0
- recce/models/__init__.py +4 -1
- recce/models/check.py +6 -7
- recce/models/run.py +1 -0
- recce/models/types.py +131 -28
- recce/pull_request.py +27 -25
- recce/run.py +165 -121
- recce/server.py +303 -111
- recce/state/__init__.py +31 -0
- recce/state/cloud.py +632 -0
- recce/state/const.py +26 -0
- recce/state/local.py +56 -0
- recce/state/state.py +119 -0
- recce/state/state_loader.py +174 -0
- recce/summary.py +188 -143
- recce/tasks/__init__.py +19 -3
- recce/tasks/core.py +11 -13
- recce/tasks/dataframe.py +82 -18
- recce/tasks/histogram.py +69 -34
- recce/tasks/lineage.py +2 -2
- recce/tasks/profile.py +152 -86
- recce/tasks/query.py +139 -87
- recce/tasks/rowcount.py +37 -31
- recce/tasks/schema.py +18 -15
- recce/tasks/top_k.py +35 -35
- recce/tasks/valuediff.py +216 -152
- recce/util/__init__.py +3 -0
- recce/util/api_token.py +80 -0
- recce/util/breaking.py +87 -85
- recce/util/cll.py +274 -219
- recce/util/io.py +22 -17
- recce/util/lineage.py +65 -16
- recce/util/logger.py +1 -1
- recce/util/onboarding_state.py +45 -0
- recce/util/perf_tracking.py +85 -0
- recce/util/recce_cloud.py +322 -72
- recce/util/singleton.py +4 -4
- recce/yaml/__init__.py +7 -10
- recce_cloud/__init__.py +24 -0
- recce_cloud/api/__init__.py +17 -0
- recce_cloud/api/base.py +111 -0
- recce_cloud/api/client.py +150 -0
- recce_cloud/api/exceptions.py +26 -0
- recce_cloud/api/factory.py +63 -0
- recce_cloud/api/github.py +76 -0
- recce_cloud/api/gitlab.py +82 -0
- recce_cloud/artifact.py +57 -0
- recce_cloud/ci_providers/__init__.py +9 -0
- recce_cloud/ci_providers/base.py +82 -0
- recce_cloud/ci_providers/detector.py +147 -0
- recce_cloud/ci_providers/github_actions.py +136 -0
- recce_cloud/ci_providers/gitlab_ci.py +130 -0
- recce_cloud/cli.py +245 -0
- recce_cloud/upload.py +214 -0
- {recce_nightly-1.2.0.20250506.dist-info → recce_nightly-1.26.0.20251124.dist-info}/METADATA +68 -37
- recce_nightly-1.26.0.20251124.dist-info/RECORD +180 -0
- {recce_nightly-1.2.0.20250506.dist-info → recce_nightly-1.26.0.20251124.dist-info}/WHEEL +1 -1
- {recce_nightly-1.2.0.20250506.dist-info → recce_nightly-1.26.0.20251124.dist-info}/top_level.txt +1 -0
- tests/adapter/dbt_adapter/conftest.py +9 -5
- tests/adapter/dbt_adapter/dbt_test_helper.py +37 -22
- tests/adapter/dbt_adapter/test_dbt_adapter.py +0 -15
- tests/adapter/dbt_adapter/test_dbt_cll.py +656 -41
- tests/adapter/dbt_adapter/test_selector.py +22 -21
- tests/recce_cloud/__init__.py +0 -0
- tests/recce_cloud/test_ci_providers.py +351 -0
- tests/recce_cloud/test_cli.py +372 -0
- tests/recce_cloud/test_client.py +273 -0
- tests/recce_cloud/test_platform_clients.py +333 -0
- tests/tasks/conftest.py +1 -1
- 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 +339 -15
- tests/tasks/test_query.py +46 -46
- 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 +174 -60
- tests/test_cli_mcp_optional.py +45 -0
- tests/test_cloud_listing_cli.py +324 -0
- tests/test_config.py +7 -9
- tests/test_connect_to_cloud.py +82 -0
- tests/test_core.py +151 -4
- tests/test_dbt.py +7 -7
- tests/test_mcp_server.py +332 -0
- tests/test_pull_request.py +1 -1
- tests/test_server.py +25 -19
- tests/test_summary.py +29 -17
- recce/data/_next/static/Kcbs3GEIyH2LxgLYat0es/_buildManifest.js +0 -1
- recce/data/_next/static/chunks/1f229bf6-d9fe92e56db8d93b.js +0 -1
- recce/data/_next/static/chunks/29e3cc0d-8c150e37dff9631b.js +0 -1
- recce/data/_next/static/chunks/368-7587b306577df275.js +0 -65
- recce/data/_next/static/chunks/36e1c10d-bb0210cbd6573a8d.js +0 -1
- recce/data/_next/static/chunks/3998a672-eaad84bdd88cc73e.js +0 -1
- recce/data/_next/static/chunks/3a92ee20-3b5d922d4157af5e.js +0 -1
- recce/data/_next/static/chunks/450c323b-1bb5db526e54435a.js +0 -1
- recce/data/_next/static/chunks/47d8844f-79a1b53c66a7d7ec.js +0 -1
- recce/data/_next/static/chunks/6dc81886-c94b9b91bc2c3caf.js +0 -1
- recce/data/_next/static/chunks/6ef81909-694dc38134099299.js +0 -1
- recce/data/_next/static/chunks/700-3b65fc3666820d00.js +0 -2
- recce/data/_next/static/chunks/7a8a3e83-d7fa409d97b38b2b.js +0 -1
- recce/data/_next/static/chunks/7f27ae6c-413f6b869a04183a.js +0 -1
- recce/data/_next/static/chunks/8d700b6a-f0b1f6b9e0d97ce2.js +0 -1
- recce/data/_next/static/chunks/9746af58-d74bef4d03eea6ab.js +0 -1
- recce/data/_next/static/chunks/a30376cd-7d806e1602f2dc3a.js +0 -1
- recce/data/_next/static/chunks/app/_not-found/page-8a886fa0855c3105.js +0 -1
- recce/data/_next/static/chunks/app/layout-9102e22cb73f74d6.js +0 -1
- recce/data/_next/static/chunks/app/page-cee661090afbd6aa.js +0 -1
- recce/data/_next/static/chunks/b63b1b3f-7395c74e11a14e95.js +0 -1
- recce/data/_next/static/chunks/c132bf7d-8102037f9ccf372a.js +0 -1
- recce/data/_next/static/chunks/c1ceaa8b-a1e442154d23515e.js +0 -1
- recce/data/_next/static/chunks/cd9f8d63-cf0d5a7b0f7a92e8.js +0 -54
- recce/data/_next/static/chunks/ce84277d-f42c2c58049cea2d.js +0 -1
- recce/data/_next/static/chunks/e24bf851-0f8cbc99656833e7.js +0 -1
- recce/data/_next/static/chunks/fee69bc6-f17d36c080742e74.js +0 -1
- recce/data/_next/static/chunks/framework-ded83d71b51ce901.js +0 -1
- recce/data/_next/static/chunks/main-a0859f1f36d0aa6c.js +0 -1
- recce/data/_next/static/chunks/main-app-0225a2255968e566.js +0 -1
- recce/data/_next/static/chunks/pages/_app-d5672bf3d8b6371b.js +0 -1
- recce/data/_next/static/chunks/pages/_error-ed75be3f25588548.js +0 -1
- recce/data/_next/static/chunks/webpack-567d72f0bc0820d5.js +0 -1
- recce/data/_next/static/css/c9ecb46a4b21c126.css +0 -14
- recce/data/_next/static/media/montserrat-cyrillic-800-normal.22628180.woff2 +0 -0
- recce/data/_next/static/media/montserrat-cyrillic-800-normal.31d693bb.woff +0 -0
- recce/data/_next/static/media/montserrat-cyrillic-ext-800-normal.7e2c1e62.woff +0 -0
- recce/data/_next/static/media/montserrat-cyrillic-ext-800-normal.94a63aea.woff2 +0 -0
- recce/data/_next/static/media/montserrat-latin-800-normal.6f8fa298.woff2 +0 -0
- recce/data/_next/static/media/montserrat-latin-800-normal.97e20d5e.woff +0 -0
- recce/data/_next/static/media/montserrat-latin-ext-800-normal.013b84f9.woff2 +0 -0
- recce/data/_next/static/media/montserrat-latin-ext-800-normal.aff52ab0.woff +0 -0
- recce/data/_next/static/media/montserrat-vietnamese-800-normal.5f21869b.woff +0 -0
- recce/data/_next/static/media/montserrat-vietnamese-800-normal.c0035377.woff2 +0 -0
- recce/state.py +0 -753
- recce_nightly-1.2.0.20250506.dist-info/RECORD +0 -142
- tests/test_state.py +0 -123
- /recce/data/_next/static/{Kcbs3GEIyH2LxgLYat0es → 52aV_JrNUZU6dMFgvTQEO}/_ssgManifest.js +0 -0
- /recce/data/_next/static/chunks/{polyfills-42372ed130431b0a.js → a6dad97d9634a72d.js} +0 -0
- {recce_nightly-1.2.0.20250506.dist-info → recce_nightly-1.26.0.20251124.dist-info}/entry_points.txt +0 -0
- {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.
|
|
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<
|
|
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:
|
|
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://
|
|
74
|
+
<a href="https://reccehq.com">
|
|
65
75
|
<picture>
|
|
66
|
-
<source media="(prefers-color-scheme: dark)" srcset="https://
|
|
67
|
-
<source media="(prefers-color-scheme: light)" srcset="https://
|
|
68
|
-
<img alt="Recce: DataRecce.io" src="https://
|
|
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>
|
|
77
|
-
<a href="https://pypi.org/project/recce/"><img src="https://img.shields.io/pypi/v/recce?style=flat-square" alt="pipy"></a>
|
|
78
|
-
<a href="https://pypi.org/project/recce/"><img src="https://img.shields.io/pypi/pyversions/recce?style=flat-square" alt="Python"></a>
|
|
79
|
-
<a href="https://pypi.org/project/recce/#files"><img src="https://img.shields.io/pypi/dw/recce?style=flat-square" alt="downloads"></a>
|
|
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>
|
|
81
|
-
<a href="https://getdbt.slack.com/archives/C05C28V7CPP"><img src="https://img.shields.io/badge/Slack-4A154B?style=flat-square&logo=slack&logoColor=white" alt="Slack"></a>
|
|
82
|
-
<a href="https://discord.com/invite/5zb2aK9KBV"><img src="https://img.shields.io/discord/664381609771925514?color=%237289DA&label=chat&logo=discord&logoColor=white&style=flat-square" alt="InfuseAI Discord Invite"></a>
|
|
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>
|
|
87
|
+
<a href="https://pypi.org/project/recce/"><img src="https://img.shields.io/pypi/v/recce?style=flat-square" alt="pipy"></a>
|
|
88
|
+
<a href="https://pypi.org/project/recce/"><img src="https://img.shields.io/pypi/pyversions/recce?style=flat-square" alt="Python"></a>
|
|
89
|
+
<a href="https://pypi.org/project/recce/#files"><img src="https://img.shields.io/pypi/dw/recce?style=flat-square" alt="downloads"></a>
|
|
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>
|
|
91
|
+
<a href="https://getdbt.slack.com/archives/C05C28V7CPP"><img src="https://img.shields.io/badge/Slack-4A154B?style=flat-square&logo=slack&logoColor=white" alt="Slack"></a>
|
|
92
|
+
<a href="https://discord.com/invite/5zb2aK9KBV"><img src="https://img.shields.io/discord/664381609771925514?color=%237289DA&label=chat&logo=discord&logoColor=white&style=flat-square" alt="InfuseAI Discord Invite"></a>
|
|
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
|
-
```
|
|
130
|
+
```bash
|
|
100
131
|
# cd into your dbt project
|
|
101
132
|
pip install -U recce
|
|
102
133
|
recce server
|
|
103
134
|
```
|
|
104
|
-
|
|
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.
|
|
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://
|
|
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://
|
|
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
|
|
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.
|
|
131
|
-
- Metric and data comparisons: Use [Profile, Value, Top-K, and Histogram Diffs](https://docs.
|
|
132
|
-
- [Query diff](https://docs.
|
|
133
|
-
- [Checklist for reviews and approvals](https://docs.
|
|
134
|
-
- Secure by design: Recce is [SOC 2 compliant](https://trust.
|
|
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.
|
|
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://
|
|
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
|
-
- [
|
|
155
|
-
|
|
156
|
-
-
|
|
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
|
-
- [
|
|
196
|
+
- [RecceHQ.com](https://reccehq.com/)
|
|
166
197
|
- [LinkedIn](https://www.linkedin.com/company/datarecce)
|
|
167
|
-
- [
|
|
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,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
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
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()
|