recce-nightly 0.62.0.20250417__py3-none-any.whl → 1.30.0.20251221__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 (245) 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 +845 -461
  5. recce/adapter/dbt_adapter/dbt_version.py +3 -0
  6. recce/adapter/sqlmesh_adapter.py +24 -35
  7. recce/apis/check_api.py +59 -42
  8. recce/apis/check_events_api.py +353 -0
  9. recce/apis/check_func.py +41 -35
  10. recce/apis/run_api.py +25 -19
  11. recce/apis/run_func.py +64 -25
  12. recce/artifact.py +119 -51
  13. recce/cli.py +1301 -324
  14. recce/config.py +43 -34
  15. recce/connect_to_cloud.py +138 -0
  16. recce/core.py +55 -47
  17. recce/data/404/index.html +2 -0
  18. recce/data/404.html +2 -1
  19. recce/data/__next.@lineage.!KHNsb3Qp.__PAGE__.txt +7 -0
  20. recce/data/__next.@lineage.!KHNsb3Qp.txt +4 -0
  21. recce/data/__next.__PAGE__.txt +6 -0
  22. recce/data/__next._full.txt +32 -0
  23. recce/data/__next._head.txt +8 -0
  24. recce/data/__next._index.txt +14 -0
  25. recce/data/__next._tree.txt +8 -0
  26. recce/data/_next/static/chunks/025a7e3e3f9f40ae.js +1 -0
  27. recce/data/_next/static/chunks/0ce56d67ef5779ca.js +4 -0
  28. recce/data/_next/static/chunks/1a6a78780155dac7.js +48 -0
  29. recce/data/_next/static/chunks/1de8485918b9182a.css +2 -0
  30. recce/data/_next/static/chunks/1e4b1b50d1e34993.js +1 -0
  31. recce/data/_next/static/chunks/206d5d181e4c738e.js +1 -0
  32. recce/data/_next/static/chunks/2c357efc34c5b859.js +25 -0
  33. recce/data/_next/static/chunks/2e9d95d2d48c479c.js +1 -0
  34. recce/data/_next/static/chunks/2f016dc4a3edad2e.js +2 -0
  35. recce/data/_next/static/chunks/313251962d698f7c.js +1 -0
  36. recce/data/_next/static/chunks/3a9f021f38eb5574.css +1 -0
  37. recce/data/_next/static/chunks/40079da8d2b8f651.js +1 -0
  38. recce/data/_next/static/chunks/4599182bffb64661.js +38 -0
  39. recce/data/_next/static/chunks/4e62f6e184173580.js +1 -0
  40. recce/data/_next/static/chunks/5c4dfb0d09eaa401.js +1 -0
  41. recce/data/_next/static/chunks/69e4f06ccfdfc3ac.js +1 -0
  42. recce/data/_next/static/chunks/6b206cb4707d6bee.js +1 -0
  43. recce/data/_next/static/chunks/6d8557f062aa4386.css +1 -0
  44. recce/data/_next/static/chunks/7fbe3650bd83b6b5.js +1 -0
  45. recce/data/_next/static/chunks/83fa823a825674f6.js +1 -0
  46. recce/data/_next/static/chunks/848a6c9b5f55f7ed.js +1 -0
  47. recce/data/_next/static/chunks/859462b0858aef88.css +2 -0
  48. recce/data/_next/static/chunks/923964f18c87d0f1.css +1 -0
  49. recce/data/_next/static/chunks/939390f911895d7c.js +48 -0
  50. recce/data/_next/static/chunks/99a9817237a07f43.js +1 -0
  51. recce/data/_next/static/chunks/9fed8b4b2b924054.js +5 -0
  52. recce/data/_next/static/chunks/b6949f6c5892110c.js +1 -0
  53. recce/data/_next/static/chunks/b851a1d3f8149828.js +1 -0
  54. recce/data/_next/static/chunks/c734f9ad957de0b4.js +1 -0
  55. recce/data/_next/static/chunks/cdde321b0ec75717.js +2 -0
  56. recce/data/_next/static/chunks/d0f91117d77ff844.css +1 -0
  57. recce/data/_next/static/chunks/d6c8667911c2500f.js +1 -0
  58. recce/data/_next/static/chunks/da8dab68c02752cf.js +74 -0
  59. recce/data/_next/static/chunks/dc074049c9d12d97.js +109 -0
  60. recce/data/_next/static/chunks/ee7f1a8227342421.js +1 -0
  61. recce/data/_next/static/chunks/fa2f4e56c2fccc73.js +1 -0
  62. recce/data/_next/static/chunks/turbopack-1fad664f62979b93.js +3 -0
  63. recce/data/_next/static/media/favicon.a8d38d84.ico +0 -0
  64. recce/data/_next/static/media/montserrat-cyrillic-800-normal.d80d830d.woff2 +0 -0
  65. recce/data/_next/static/media/montserrat-cyrillic-800-normal.f9d58125.woff +0 -0
  66. recce/data/_next/static/media/montserrat-cyrillic-ext-800-normal.076c2a93.woff2 +0 -0
  67. recce/data/_next/static/media/montserrat-cyrillic-ext-800-normal.a4fa76b5.woff +0 -0
  68. recce/data/_next/static/media/montserrat-latin-800-normal.cde454cc.woff2 +0 -0
  69. recce/data/_next/static/media/montserrat-latin-800-normal.d5761935.woff +0 -0
  70. recce/data/_next/static/media/montserrat-latin-ext-800-normal.40ec0659.woff2 +0 -0
  71. recce/data/_next/static/media/montserrat-latin-ext-800-normal.b671449b.woff +0 -0
  72. recce/data/_next/static/media/montserrat-vietnamese-800-normal.9f7b8541.woff +0 -0
  73. recce/data/_next/static/media/montserrat-vietnamese-800-normal.f9eb854e.woff2 +0 -0
  74. recce/data/_next/static/nX-Uz0AH6Tc6hIQUFGqaB/_buildManifest.js +11 -0
  75. recce/data/_next/static/nX-Uz0AH6Tc6hIQUFGqaB/_clientMiddlewareManifest.json +1 -0
  76. recce/data/_not-found/__next._full.txt +24 -0
  77. recce/data/_not-found/__next._head.txt +8 -0
  78. recce/data/_not-found/__next._index.txt +13 -0
  79. recce/data/_not-found/__next._not-found.__PAGE__.txt +5 -0
  80. recce/data/_not-found/__next._not-found.txt +4 -0
  81. recce/data/_not-found/__next._tree.txt +6 -0
  82. recce/data/_not-found/index.html +2 -0
  83. recce/data/_not-found/index.txt +24 -0
  84. recce/data/auth_callback.html +68 -0
  85. recce/data/checks/__next.@lineage.__DEFAULT__.txt +7 -0
  86. recce/data/checks/__next._full.txt +39 -0
  87. recce/data/checks/__next._head.txt +8 -0
  88. recce/data/checks/__next._index.txt +14 -0
  89. recce/data/checks/__next._tree.txt +8 -0
  90. recce/data/checks/__next.checks.__PAGE__.txt +10 -0
  91. recce/data/checks/__next.checks.txt +4 -0
  92. recce/data/checks/index.html +2 -0
  93. recce/data/checks/index.txt +39 -0
  94. recce/data/imgs/reload-image.svg +4 -0
  95. recce/data/index.html +2 -27
  96. recce/data/index.txt +32 -7
  97. recce/data/lineage/__next.@lineage.__DEFAULT__.txt +7 -0
  98. recce/data/lineage/__next._full.txt +39 -0
  99. recce/data/lineage/__next._head.txt +8 -0
  100. recce/data/lineage/__next._index.txt +14 -0
  101. recce/data/lineage/__next._tree.txt +8 -0
  102. recce/data/lineage/__next.lineage.__PAGE__.txt +10 -0
  103. recce/data/lineage/__next.lineage.txt +4 -0
  104. recce/data/lineage/index.html +2 -0
  105. recce/data/lineage/index.txt +39 -0
  106. recce/data/query/__next.@lineage.__DEFAULT__.txt +7 -0
  107. recce/data/query/__next._full.txt +37 -0
  108. recce/data/query/__next._head.txt +8 -0
  109. recce/data/query/__next._index.txt +14 -0
  110. recce/data/query/__next._tree.txt +8 -0
  111. recce/data/query/__next.query.__PAGE__.txt +9 -0
  112. recce/data/query/__next.query.txt +4 -0
  113. recce/data/query/index.html +2 -0
  114. recce/data/query/index.txt +37 -0
  115. recce/diff.py +6 -12
  116. recce/event/CONFIG.bak +1 -0
  117. recce/event/__init__.py +86 -74
  118. recce/event/collector.py +33 -22
  119. recce/event/track.py +49 -27
  120. recce/exceptions.py +1 -1
  121. recce/git.py +7 -7
  122. recce/github.py +57 -53
  123. recce/mcp_server.py +725 -0
  124. recce/models/__init__.py +4 -1
  125. recce/models/check.py +438 -21
  126. recce/models/run.py +1 -0
  127. recce/models/types.py +134 -28
  128. recce/pull_request.py +27 -25
  129. recce/run.py +179 -122
  130. recce/server.py +394 -104
  131. recce/state/__init__.py +31 -0
  132. recce/state/cloud.py +644 -0
  133. recce/state/const.py +26 -0
  134. recce/state/local.py +56 -0
  135. recce/state/state.py +119 -0
  136. recce/state/state_loader.py +174 -0
  137. recce/summary.py +196 -149
  138. recce/tasks/__init__.py +19 -3
  139. recce/tasks/core.py +11 -13
  140. recce/tasks/dataframe.py +82 -18
  141. recce/tasks/histogram.py +69 -34
  142. recce/tasks/lineage.py +2 -2
  143. recce/tasks/profile.py +152 -86
  144. recce/tasks/query.py +180 -89
  145. recce/tasks/rowcount.py +37 -31
  146. recce/tasks/schema.py +18 -15
  147. recce/tasks/top_k.py +35 -35
  148. recce/tasks/utils.py +147 -0
  149. recce/tasks/valuediff.py +247 -155
  150. recce/util/__init__.py +3 -0
  151. recce/util/api_token.py +80 -0
  152. recce/util/breaking.py +105 -100
  153. recce/util/cll.py +274 -219
  154. recce/util/cloud/__init__.py +15 -0
  155. recce/util/cloud/base.py +115 -0
  156. recce/util/cloud/check_events.py +190 -0
  157. recce/util/cloud/checks.py +242 -0
  158. recce/util/io.py +22 -17
  159. recce/util/lineage.py +65 -16
  160. recce/util/logger.py +1 -1
  161. recce/util/onboarding_state.py +45 -0
  162. recce/util/perf_tracking.py +85 -0
  163. recce/util/recce_cloud.py +347 -72
  164. recce/util/singleton.py +4 -4
  165. recce/util/startup_perf.py +121 -0
  166. recce/yaml/__init__.py +7 -10
  167. recce_nightly-1.30.0.20251221.dist-info/METADATA +195 -0
  168. recce_nightly-1.30.0.20251221.dist-info/RECORD +183 -0
  169. {recce_nightly-0.62.0.20250417.dist-info → recce_nightly-1.30.0.20251221.dist-info}/WHEEL +1 -2
  170. recce/data/_next/static/chunks/1f229bf6-d9fe92e56db8d93b.js +0 -1
  171. recce/data/_next/static/chunks/29e3cc0d-8c150e37dff9631b.js +0 -1
  172. recce/data/_next/static/chunks/36e1c10d-bb0210cbd6573a8d.js +0 -1
  173. recce/data/_next/static/chunks/3998a672-eaad84bdd88cc73e.js +0 -1
  174. recce/data/_next/static/chunks/450c323b-1bb5db526e54435a.js +0 -1
  175. recce/data/_next/static/chunks/47d8844f-79a1b53c66a7d7ec.js +0 -1
  176. recce/data/_next/static/chunks/500-e51c92a025a51234.js +0 -65
  177. recce/data/_next/static/chunks/6dc81886-c94b9b91bc2c3caf.js +0 -1
  178. recce/data/_next/static/chunks/700-3b65fc3666820d00.js +0 -2
  179. recce/data/_next/static/chunks/7a8a3e83-d7fa409d97b38b2b.js +0 -1
  180. recce/data/_next/static/chunks/7f27ae6c-413f6b869a04183a.js +0 -1
  181. recce/data/_next/static/chunks/9746af58-d74bef4d03eea6ab.js +0 -1
  182. recce/data/_next/static/chunks/a30376cd-7d806e1602f2dc3a.js +0 -1
  183. recce/data/_next/static/chunks/app/_not-found/page-8a886fa0855c3105.js +0 -1
  184. recce/data/_next/static/chunks/app/layout-9102e22cb73f74d6.js +0 -1
  185. recce/data/_next/static/chunks/app/page-9adc25782272ed2e.js +0 -1
  186. recce/data/_next/static/chunks/b63b1b3f-7395c74e11a14e95.js +0 -1
  187. recce/data/_next/static/chunks/c132bf7d-8102037f9ccf372a.js +0 -1
  188. recce/data/_next/static/chunks/c1ceaa8b-a1e442154d23515e.js +0 -1
  189. recce/data/_next/static/chunks/cd9f8d63-cf0d5a7b0f7a92e8.js +0 -54
  190. recce/data/_next/static/chunks/ce84277d-f42c2c58049cea2d.js +0 -1
  191. recce/data/_next/static/chunks/e24bf851-0f8cbc99656833e7.js +0 -1
  192. recce/data/_next/static/chunks/fee69bc6-f17d36c080742e74.js +0 -1
  193. recce/data/_next/static/chunks/framework-ded83d71b51ce901.js +0 -1
  194. recce/data/_next/static/chunks/main-a0859f1f36d0aa6c.js +0 -1
  195. recce/data/_next/static/chunks/main-app-0225a2255968e566.js +0 -1
  196. recce/data/_next/static/chunks/pages/_app-d5672bf3d8b6371b.js +0 -1
  197. recce/data/_next/static/chunks/pages/_error-ed75be3f25588548.js +0 -1
  198. recce/data/_next/static/chunks/webpack-567d72f0bc0820d5.js +0 -1
  199. recce/data/_next/static/css/c9ecb46a4b21c126.css +0 -14
  200. recce/data/_next/static/media/montserrat-cyrillic-800-normal.22628180.woff2 +0 -0
  201. recce/data/_next/static/media/montserrat-cyrillic-800-normal.31d693bb.woff +0 -0
  202. recce/data/_next/static/media/montserrat-cyrillic-ext-800-normal.7e2c1e62.woff +0 -0
  203. recce/data/_next/static/media/montserrat-cyrillic-ext-800-normal.94a63aea.woff2 +0 -0
  204. recce/data/_next/static/media/montserrat-latin-800-normal.6f8fa298.woff2 +0 -0
  205. recce/data/_next/static/media/montserrat-latin-800-normal.97e20d5e.woff +0 -0
  206. recce/data/_next/static/media/montserrat-latin-ext-800-normal.013b84f9.woff2 +0 -0
  207. recce/data/_next/static/media/montserrat-latin-ext-800-normal.aff52ab0.woff +0 -0
  208. recce/data/_next/static/media/montserrat-vietnamese-800-normal.5f21869b.woff +0 -0
  209. recce/data/_next/static/media/montserrat-vietnamese-800-normal.c0035377.woff2 +0 -0
  210. recce/data/_next/static/qiyFlux77VkhxiceAJe_F/_buildManifest.js +0 -1
  211. recce/state.py +0 -753
  212. recce_nightly-0.62.0.20250417.dist-info/METADATA +0 -311
  213. recce_nightly-0.62.0.20250417.dist-info/RECORD +0 -139
  214. recce_nightly-0.62.0.20250417.dist-info/top_level.txt +0 -2
  215. tests/__init__.py +0 -0
  216. tests/adapter/__init__.py +0 -0
  217. tests/adapter/dbt_adapter/__init__.py +0 -0
  218. tests/adapter/dbt_adapter/conftest.py +0 -13
  219. tests/adapter/dbt_adapter/dbt_test_helper.py +0 -283
  220. tests/adapter/dbt_adapter/test_dbt_adapter.py +0 -40
  221. tests/adapter/dbt_adapter/test_dbt_cll.py +0 -102
  222. tests/adapter/dbt_adapter/test_selector.py +0 -177
  223. tests/tasks/__init__.py +0 -0
  224. tests/tasks/conftest.py +0 -4
  225. tests/tasks/test_histogram.py +0 -137
  226. tests/tasks/test_lineage.py +0 -42
  227. tests/tasks/test_preset_checks.py +0 -50
  228. tests/tasks/test_profile.py +0 -73
  229. tests/tasks/test_query.py +0 -151
  230. tests/tasks/test_row_count.py +0 -116
  231. tests/tasks/test_schema.py +0 -99
  232. tests/tasks/test_top_k.py +0 -73
  233. tests/tasks/test_valuediff.py +0 -74
  234. tests/test_cli.py +0 -122
  235. tests/test_config.py +0 -45
  236. tests/test_core.py +0 -27
  237. tests/test_dbt.py +0 -36
  238. tests/test_pull_request.py +0 -130
  239. tests/test_server.py +0 -98
  240. tests/test_state.py +0 -123
  241. tests/test_summary.py +0 -57
  242. /recce/data/_next/static/chunks/{polyfills-42372ed130431b0a.js → a6dad97d9634a72d.js} +0 -0
  243. /recce/data/_next/static/{qiyFlux77VkhxiceAJe_F → nX-Uz0AH6Tc6hIQUFGqaB}/_ssgManifest.js +0 -0
  244. {recce_nightly-0.62.0.20250417.dist-info → recce_nightly-1.30.0.20251221.dist-info}/entry_points.txt +0 -0
  245. {recce_nightly-0.62.0.20250417.dist-info → recce_nightly-1.30.0.20251221.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,121 @@
1
+ import functools
2
+ import os
3
+ import time
4
+ from dataclasses import dataclass, field
5
+ from typing import Dict, Optional
6
+
7
+
8
+ @dataclass
9
+ class StartupPerfTracker:
10
+ """
11
+ Tracks startup performance metrics for Recce server.
12
+ All timing values are in milliseconds.
13
+ """
14
+
15
+ # All timings in ms (populated by @track_timing decorator)
16
+ timings: Dict[str, float] = field(default_factory=dict)
17
+
18
+ # Artifact sizes in bytes
19
+ artifact_sizes: Dict[str, int] = field(default_factory=dict)
20
+
21
+ # Metadata
22
+ cloud_mode: bool = False
23
+ catalog_type: Optional[str] = None # github, preview, session
24
+ adapter_type: Optional[str] = None
25
+ node_count: Optional[int] = None
26
+ command: Optional[str] = None # server, read-only, preview
27
+
28
+ def record_timing(self, name: str, elapsed_ms: float):
29
+ """Record timing for a named phase or artifact"""
30
+ self.timings[name] = elapsed_ms
31
+
32
+ def set_cloud_mode(self, cloud_mode: bool):
33
+ self.cloud_mode = cloud_mode
34
+
35
+ def set_catalog_type(self, catalog_type: str):
36
+ self.catalog_type = catalog_type
37
+
38
+ def set_artifact_size(self, name: str, size_bytes: int):
39
+ """Set artifact size by name"""
40
+ self.artifact_sizes[name] = size_bytes
41
+
42
+ def to_dict(self) -> Dict:
43
+ return {
44
+ "timings": self.timings if self.timings else None,
45
+ "artifact_sizes": self.artifact_sizes if self.artifact_sizes else None,
46
+ "cloud_mode": self.cloud_mode,
47
+ "catalog_type": self.catalog_type,
48
+ "adapter_type": self.adapter_type,
49
+ "node_count": self.node_count,
50
+ "command": self.command,
51
+ }
52
+
53
+
54
+ # Module-level singleton for tracking startup across the call stack
55
+ _startup_tracker: Optional[StartupPerfTracker] = None
56
+
57
+
58
+ def get_startup_tracker() -> Optional[StartupPerfTracker]:
59
+ """Get the global startup tracker instance"""
60
+ return _startup_tracker
61
+
62
+
63
+ def set_startup_tracker(tracker: StartupPerfTracker):
64
+ """Set the global startup tracker instance"""
65
+ global _startup_tracker
66
+ _startup_tracker = tracker
67
+
68
+
69
+ def clear_startup_tracker():
70
+ """Clear the global startup tracker instance"""
71
+ global _startup_tracker
72
+ _startup_tracker = None
73
+
74
+
75
+ def track_timing(timing_name: str = None, *, record_size: bool = False):
76
+ """
77
+ Decorator factory to track timing for any operation.
78
+
79
+ Args:
80
+ timing_name: Name for the timing. If None, expects 'timing_name' kwarg at call time.
81
+ record_size: If True, record file size from 'path' kwarg.
82
+
83
+ Usage:
84
+ # Name at decoration time
85
+ @track_timing("state_loader_init")
86
+ def create_state_loader_by_args(...):
87
+ ...
88
+
89
+ # Name at call time (for reusable functions)
90
+ @track_timing(record_size=True)
91
+ def load_manifest(path=None, data=None):
92
+ ...
93
+
94
+ load_manifest(path=p, timing_name="curr_manifest")
95
+ """
96
+
97
+ def decorator(func):
98
+ @functools.wraps(func)
99
+ def wrapper(*args, **kwargs):
100
+ # Get timing name from decorator arg or from kwargs
101
+ name = timing_name
102
+ if name is None:
103
+ name = kwargs.pop("timing_name", None)
104
+
105
+ path = kwargs.get("path") or (args[0] if args else None)
106
+
107
+ start = time.perf_counter_ns()
108
+ result = func(*args, **kwargs)
109
+ elapsed_ms = (time.perf_counter_ns() - start) / 1_000_000
110
+
111
+ if tracker := get_startup_tracker():
112
+ if name:
113
+ tracker.record_timing(name, elapsed_ms)
114
+ if record_size and name and path and os.path.exists(path):
115
+ tracker.set_artifact_size(name, os.path.getsize(path))
116
+
117
+ return result
118
+
119
+ return wrapper
120
+
121
+ return decorator
recce/yaml/__init__.py CHANGED
@@ -1,10 +1,11 @@
1
1
  from typing import Any, Callable
2
2
 
3
3
  from ruamel import yaml
4
- from ruamel.yaml import CommentedMap as _cm, CommentedSeq as _cs
4
+ from ruamel.yaml import CommentedMap as _cm
5
+ from ruamel.yaml import CommentedSeq as _cs
5
6
 
6
7
  _yaml = yaml.YAML()
7
- _safe_yaml = yaml.YAML(typ='safe')
8
+ _safe_yaml = yaml.YAML(typ="safe")
8
9
 
9
10
  CommentedMap = _cm
10
11
  CommentedSeq = _cs
@@ -27,15 +28,13 @@ def safe_load(stream, version=None) -> Any:
27
28
  return _safe_yaml.load(stream)
28
29
 
29
30
 
30
- def dump(
31
- data, stream: Any = None, *, transform: Any = None
32
- ) -> Any:
31
+ def dump(data, stream: Any = None, *, transform: Any = None) -> Any:
33
32
  return _yaml.dump(data, stream, transform=transform)
34
33
 
35
34
 
36
35
  def safe_load_yaml(file_path):
37
36
  try:
38
- with open(file_path, 'r') as f:
37
+ with open(file_path, "r", encoding="utf-8") as f:
39
38
  payload = safe_load(f)
40
39
  except yaml.YAMLError as e:
41
40
  print(e)
@@ -46,7 +45,7 @@ def safe_load_yaml(file_path):
46
45
 
47
46
 
48
47
  def round_trip_load_yaml(file_path):
49
- with open(file_path, 'r') as f:
48
+ with open(file_path, "r", encoding="utf-8") as f:
50
49
  try:
51
50
  payload = load(f)
52
51
  except yaml.YAMLError as e:
@@ -55,7 +54,5 @@ def round_trip_load_yaml(file_path):
55
54
  return payload
56
55
 
57
56
 
58
- def round_trip_dump(
59
- data: Any,
60
- stream=None):
57
+ def round_trip_dump(data: Any, stream=None):
61
58
  return yaml.round_trip_dump(data, stream)
@@ -0,0 +1,195 @@
1
+ Metadata-Version: 2.4
2
+ Name: recce-nightly
3
+ Version: 1.30.0.20251221
4
+ Summary: Environment diff tool for dbt
5
+ Project-URL: Bug Tracker, https://github.com/InfuseAI/recce/issues
6
+ Project-URL: Homepage, https://github.com/InfuseAI/recce
7
+ Author-email: InfuseAI Dev Team <dev@infuseai.io>
8
+ License: Apache-2.0
9
+ License-File: LICENSE
10
+ Classifier: Development Status :: 4 - Beta
11
+ Classifier: License :: OSI Approved :: Apache Software License
12
+ Classifier: Operating System :: OS Independent
13
+ Classifier: Programming Language :: Python :: 3.9
14
+ Classifier: Programming Language :: Python :: 3.10
15
+ Classifier: Programming Language :: Python :: 3.11
16
+ Classifier: Programming Language :: Python :: 3.12
17
+ Classifier: Programming Language :: Python :: 3.13
18
+ Requires-Python: >=3.9
19
+ Requires-Dist: boto3
20
+ Requires-Dist: click>=7.1
21
+ Requires-Dist: deepdiff<9.0,>=7.0
22
+ Requires-Dist: fastapi
23
+ Requires-Dist: gitpython
24
+ Requires-Dist: itsdangerous
25
+ Requires-Dist: jinja2
26
+ Requires-Dist: packaging
27
+ Requires-Dist: portalocker
28
+ Requires-Dist: py-markdown-table
29
+ Requires-Dist: pydantic
30
+ Requires-Dist: pygithub
31
+ Requires-Dist: python-dateutil
32
+ Requires-Dist: python-multipart
33
+ Requires-Dist: pytz
34
+ Requires-Dist: requests>=2.28.1
35
+ Requires-Dist: rich>=12.0.0
36
+ Requires-Dist: ruamel-yaml>=0.18.6
37
+ Requires-Dist: sentry-sdk
38
+ Requires-Dist: sqlglot<28.0,>=27.29.0
39
+ Requires-Dist: uvicorn
40
+ Requires-Dist: watchdog
41
+ Requires-Dist: websockets
42
+ Provides-Extra: dev
43
+ Requires-Dist: black>=25.1.0; extra == 'dev'
44
+ Requires-Dist: dbt-duckdb; extra == 'dev'
45
+ Requires-Dist: flake8>=7.2.0; extra == 'dev'
46
+ Requires-Dist: httpx; extra == 'dev'
47
+ Requires-Dist: isort>=6.0.1; extra == 'dev'
48
+ Requires-Dist: pandas; extra == 'dev'
49
+ Requires-Dist: pre-commit>=4.2.0; extra == 'dev'
50
+ Requires-Dist: pytest-asyncio<1.0,>=0.23; extra == 'dev'
51
+ Requires-Dist: pytest-cov; extra == 'dev'
52
+ Requires-Dist: pytest-flake8; extra == 'dev'
53
+ Requires-Dist: pytest-mypy; extra == 'dev'
54
+ Requires-Dist: pytest>=4.6; extra == 'dev'
55
+ Requires-Dist: tox; extra == 'dev'
56
+ Requires-Dist: tox-uv; extra == 'dev'
57
+ Requires-Dist: twine; extra == 'dev'
58
+ Provides-Extra: mcp
59
+ Requires-Dist: mcp>=1.0.0; (python_version >= '3.10') and extra == 'mcp'
60
+ Description-Content-Type: text/markdown
61
+
62
+ <p align="center">
63
+ <a href="https://reccehq.com">
64
+ <picture>
65
+ <source media="(prefers-color-scheme: dark)" srcset="https://reccehq.com/assets/images/recce-logo-stacked.avif">
66
+ <source media="(prefers-color-scheme: light)" srcset="https://reccehq.com/assets/images/recce-logo-stacked.avif">
67
+ <img alt="Recce: DataRecce.io" src="https://reccehq.com/assets/images/recce-logo-stacked.avif" width="200" style="display: block; margin: 0 auto 20px;">
68
+ </picture>
69
+ </a>
70
+ </p>
71
+
72
+ <h3 align="center">Helping data teams preview, validate, and ship data changes with confidence.</h3>
73
+
74
+ <p align="center">
75
+ <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;
76
+ <a href="https://pypi.org/project/recce/"><img src="https://img.shields.io/pypi/v/recce?style=flat-square" alt="pipy"></a> &nbsp;
77
+ <a href="https://pypi.org/project/recce/"><img src="https://img.shields.io/pypi/pyversions/recce?style=flat-square" alt="Python"></a> &nbsp;
78
+ <a href="https://pypi.org/project/recce/#files"><img src="https://img.shields.io/pypi/dw/recce?style=flat-square" alt="downloads"></a> &nbsp;
79
+ <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;
80
+ <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;
81
+ <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;
82
+ </p>
83
+
84
+ <p align="center">
85
+ <a href="https://cal.com/team/recce/chat?utm_source=banner&utm_campaign=oss">
86
+ <img alt="Book us with Cal.com" src="https://cal.com/book-with-cal-light.svg" />
87
+ </a>
88
+ </p>
89
+
90
+ ## Trust, Verify, Ship
91
+
92
+ Cut dbt review time by 90% and ship accurate data fast
93
+
94
+ Recce gives data teams a faster, more reliable way to understand, review, and ship changes without all the guesswork or manual overhead.
95
+
96
+ ## Quick Start
97
+
98
+ ### Installation
99
+
100
+ Recce offers two packages to fit different use cases:
101
+
102
+ **For full local development and Recce Cloud features:**
103
+
104
+ ```bash
105
+ pip install -U recce
106
+ recce server
107
+ ```
108
+
109
+ **For CI/CD artifact uploads only (lightweight):**
110
+
111
+ ```bash
112
+ pip install -U recce-cloud
113
+ recce-cloud upload
114
+ ```
115
+
116
+ 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.
117
+
118
+ ### Getting Started
119
+
120
+ You can launch Recce in any dbt project in just two commands:
121
+
122
+ ```bash
123
+ # cd into your dbt project
124
+ pip install -U recce
125
+ recce server
126
+ ```
127
+
128
+ (Note: while recce is not version spsecific, `dbt-core` is currently [not compatible with Python 3.13](https://docs.getdbt.com/faqs/Core/install-python-compatibility). Please make sure to use Python 3.10 - 3.12.)
129
+
130
+ 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.
131
+
132
+ ## What You Get
133
+
134
+ 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.
135
+
136
+ <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>
137
+
138
+ <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>
139
+
140
+ <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>
141
+
142
+ ### Using Recce for Impact Assessment in dbt PR Review
143
+
144
+ - Select nodes in the lineage to perform Checks (diffs) as part of your impact assessment during development or PR
145
+ review.
146
+ - Add Checks to your Checklist to note observed impacts.
147
+ - Share your Checklist with the PR reviewer.
148
+ - (`Recce Cloud`) Automatically sync Check status between Recce Instances
149
+ - (`Recce Cloud`) Block PR merging until all Recce Checks have been approved
150
+
151
+ Read more about using Recce on our [blog](https://blog.reccehq.com).
152
+
153
+ ### What’s Included
154
+
155
+ - [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.
156
+ - 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.
157
+ - [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.
158
+ - [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.
159
+ - 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.
160
+
161
+ 👉 Want to dive deeper? Check out the [full documentation](https://docs.reccehq.com/).
162
+
163
+ ## Recce Cloud
164
+
165
+ Ready to collaborate and move faster as a team? Recce Cloud adds real-time collaboration, automatic checklist sync, and PR gating, so nothing gets merged without a full review.
166
+
167
+ - Share checklists across environments
168
+ - Invite stakeholders to review data changes
169
+ - Block merges until all Checks are approved
170
+ - Launch demo links from your CI with full context
171
+
172
+ 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.
173
+ 👉 [View Pricing and Plans](https://reccehq.com/pricing)
174
+
175
+ ## Community & Support
176
+
177
+ Here's where you can get in touch with the Recce team and find support, add a subscribe to our newsletter option as well:
178
+
179
+ - [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.
180
+ - [Our discord](https://discord.com/invite/VpwXRC34jz)
181
+ - [dbt Slack](https://www.getdbt.com/community/join-the-community) in the [#tools-recce](https://getdbt.slack.com/archives/C05C28V7CPP) channel
182
+ - Email us [help@reccehq.com](mailto:help@reccehq.com)
183
+
184
+ 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).
185
+
186
+ ## Recce on the web
187
+
188
+ You can follow along with news about Recce and blogs from our team in the following places:
189
+
190
+ - [RecceHQ.com](https://reccehq.com/)
191
+ - [LinkedIn](https://www.linkedin.com/company/datarecce)
192
+ - [Blog](https://blog.reccehq.com/)
193
+ - [@datarecce](https://x.com/DataRecce) on Twitter/X
194
+ - [@DataRecce@mastodon.social](https://mastodon.social/@DataRecce) on Mastodon
195
+ - [@datarecce.bsky.social](https://bsky.app/profile/datarecce.bsky.social) on BlueSky
@@ -0,0 +1,183 @@
1
+ recce/VERSION,sha256=9izsnSUBqid_33HZ0DBeqsxiw1PQui05hbqXaxu7Ucw,16
2
+ recce/__init__.py,sha256=gT5G7sJ78C1GHAWr4pna6UvVNxPKs29_EgFS_ia3DT4,2554
3
+ recce/artifact.py,sha256=zksgrKEONdMmBRgM59gzf6srsr0As_UADZTQrWfC2cE,9759
4
+ recce/cli.py,sha256=TY2l_BKVVe_bdr0t0J5xEfo-N3irbTHCuspVB0yTDs8,61119
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=0CRfMaPOgxV_Fji4EWy6vBgg0SpCV0o7xUnpGTnGaKQ,31560
13
+ recce/pull_request.py,sha256=dLHsdiMtL4NC6Vkwp8Mq4baJmnqbm19lfiDti9MREN0,3850
14
+ recce/run.py,sha256=_PQeeCQDWqAyTQdEoydzY5_hfEg7d6-WH5quCZzkGvo,14616
15
+ recce/server.py,sha256=x_6YK-8qb6aaGSmBMhq-CUxTcEDxnT04U2USrecHUNs,28605
16
+ recce/summary.py,sha256=JRQxHLdeCUomGXmeyt9oOydosaKtlR0jGywI5xlocno,20245
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=IsmxDxiammhZrwPB6M7mL56gRotr4UySbn3ZW8Vw9oE,68041
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=bNqzZmH1O9l3NFzmcKs9NEqM0O8wQHUd1xLI5gCOtew,6479
24
+ recce/apis/check_events_api.py,sha256=_NCL-JMHVtc7WnWi5TsGctitRQhw55x0C20shiixEbM,10561
25
+ recce/apis/check_func.py,sha256=inDJc1WL_HdDEKUWU3fjQ5YT7DI9o3oJBtifNhBF3Uo,4219
26
+ recce/apis/run_api.py,sha256=eOaxOxXDkH59uqGCd4blld7edavUx7JU_DCd2WAYrL8,3416
27
+ recce/apis/run_func.py,sha256=8twHQxbc75RTMcdSUEH4bLn1Lu6JGpdZ9Ap6BtqH_Sc,9015
28
+ recce/data/404.html,sha256=UVNZXi99MpSwgO_vtvgSvamUFMztzZOcsuHPzMDZR-k,26886
29
+ recce/data/__next.@lineage.!KHNsb3Qp.__PAGE__.txt,sha256=aBQtd8X9kTehIIGJranZKTIU4FmHdyllSmLZ3dDtdTo,1268
30
+ recce/data/__next.@lineage.!KHNsb3Qp.txt,sha256=-HntdvSmiL0r_eX1h1QXLmOcblb0eUVznxNWTL67Uw8,434
31
+ recce/data/__next.__PAGE__.txt,sha256=uIPnIZNdKBxZ7kM_lJeVQTQQAZGwUNplOu2n9eRr9tE,430
32
+ recce/data/__next._full.txt,sha256=2yv9-t12KqNsZ4VNce7Y4_cj0ndS-Ez6gWKXx3Q2ZWU,10155
33
+ recce/data/__next._head.txt,sha256=bwlMRNh8v9PVquYO1AJmVfA9liNOA0ORjXHmGBZMQLU,1088
34
+ recce/data/__next._index.txt,sha256=ckQvSQcHluZ3xmn6eqizq6g6Dn0KVUSs56xsO-6EHyQ,8070
35
+ recce/data/__next._tree.txt,sha256=214v8neRplMPJ9WCQmIS72_pqXEY92rJbkd_0Lfqmqo,900
36
+ recce/data/auth_callback.html,sha256=H-XfdlAFiw5VU2RpKBVQbwh1AIqJrPHrFA0S09nNJZA,94779
37
+ recce/data/favicon.ico,sha256=B2mBumUOnzvUrXrqNkrc5QfdDXjzEXRcWkWur0fJ6sM,2565
38
+ recce/data/index.html,sha256=BbCH-R30b2FPtUiz3HlfN9YAXF0Bh3xYoTRlWLE-5Rc,28941
39
+ recce/data/index.txt,sha256=2yv9-t12KqNsZ4VNce7Y4_cj0ndS-Ez6gWKXx3Q2ZWU,10155
40
+ recce/data/404/index.html,sha256=UVNZXi99MpSwgO_vtvgSvamUFMztzZOcsuHPzMDZR-k,26886
41
+ recce/data/_next/static/chunks/025a7e3e3f9f40ae.js,sha256=rOc8WokLfdpWrnNxuIq_fq4tfP0VP8DwzBMJZ43H-50,174692
42
+ recce/data/_next/static/chunks/0ce56d67ef5779ca.js,sha256=0aOpQ4EQOrCPh9lQAZiVJLE-Q7zVgU3kJuKhnUvt1y0,93091
43
+ recce/data/_next/static/chunks/1a6a78780155dac7.js,sha256=CdOegRmpUUNCCqhVrkNljexLd1jM8W6gPiUyN5OJ0PA,172887
44
+ recce/data/_next/static/chunks/1de8485918b9182a.css,sha256=rt7z52vPIrlyx9aKsNuh8bEjVTU-C7m7m3uztp0zD-I,15538
45
+ recce/data/_next/static/chunks/1e4b1b50d1e34993.js,sha256=Ars9KX22w8WR2FdA8jg9Es7en-aeCZozcep40cLj550,29737
46
+ recce/data/_next/static/chunks/206d5d181e4c738e.js,sha256=Rs3VpgT5XONFfJQ_Z-P6BbU2OgbTB9Yp7lcBcMjVF3I,20116
47
+ recce/data/_next/static/chunks/2c357efc34c5b859.js,sha256=_7ZIusm3-Klwk6lOmKPUlPdxraCNw1lUA-lUU7lH0Ps,405348
48
+ recce/data/_next/static/chunks/2e9d95d2d48c479c.js,sha256=FKL5fPCCvJ1bUnDx721jrS4VIgNQZXn0TQcgvR0biko,27948
49
+ recce/data/_next/static/chunks/2f016dc4a3edad2e.js,sha256=wuHBAbH8qRPC3bMZSco9NpI0FHtqxym6MWmHxy5Qu6k,84376
50
+ recce/data/_next/static/chunks/313251962d698f7c.js,sha256=yIGfATfAvt9D9pzZm6EB2woCKQbFSB4Px3qqXoHIU24,440
51
+ recce/data/_next/static/chunks/3a9f021f38eb5574.css,sha256=SXXGi5Mue-CmYS4h6GKVgCwCAwb1JP9YIH0KP5rOO3I,12396
52
+ recce/data/_next/static/chunks/40079da8d2b8f651.js,sha256=NQi4p_6u2WaQQUU_BYpaEboqhAK26_8uR_Ga71gEpaE,15512
53
+ recce/data/_next/static/chunks/4599182bffb64661.js,sha256=f_pkryuB1c4EkOzDjSrcvTAjzgA1qrc-zpV_j_CXy4I,80248
54
+ recce/data/_next/static/chunks/4e62f6e184173580.js,sha256=3zVhR6h7yw16S5Fku4Be8kBm8SbK5hTvqwBDt3WXHMY,29737
55
+ recce/data/_next/static/chunks/5c4dfb0d09eaa401.js,sha256=0bySikUAHpLgNOi_9c7Kp7mZi3xkGw2NwRoWZqXO-oY,7219
56
+ recce/data/_next/static/chunks/69e4f06ccfdfc3ac.js,sha256=bDd7rdLQ3l0ERP_R75iC6KJr9LOQBX-4Lh-QW0aVvmE,12881
57
+ recce/data/_next/static/chunks/6b206cb4707d6bee.js,sha256=B-Ep9aZyeBH1zA7l1yXk9gjdOsFgki_zqe3GUPgd-BM,440
58
+ recce/data/_next/static/chunks/6d8557f062aa4386.css,sha256=MlgjxPGfcm3dWpwn8RZQaP4YtoIUW6M62XKopFlYtis,2957
59
+ recce/data/_next/static/chunks/7fbe3650bd83b6b5.js,sha256=w7mKQG-6o4Pv504eL56DSdqlL0-tdpMcNpTZFwwTpmA,4951
60
+ recce/data/_next/static/chunks/83fa823a825674f6.js,sha256=ZB-GXtRvNiziwDOzRWAzeuNSXATAF4XF-LFdNJSQAJY,30746
61
+ recce/data/_next/static/chunks/848a6c9b5f55f7ed.js,sha256=R699K85Acm9as9890ypfbrU9NVCiShRlpjJ40Ra2VXY,1273
62
+ recce/data/_next/static/chunks/859462b0858aef88.css,sha256=uSRJVK5WQZu_EXy-BtMLYkQVU8ies8oeGYhRSe9SH-c,8572
63
+ recce/data/_next/static/chunks/923964f18c87d0f1.css,sha256=vB4QbU4MAeW0I6PF1Wm-yglXwXrX6xf-ru7hFk1EnuY,1799
64
+ recce/data/_next/static/chunks/939390f911895d7c.js,sha256=JEBd-3jSCEieJgBGrFV4inCMf9ZRYORqG5hirMPtZ9s,172887
65
+ recce/data/_next/static/chunks/99a9817237a07f43.js,sha256=RKul9jIW0h5M7cizGBxy6V0sHKUbEiyl4JgTiL0Zca8,29737
66
+ recce/data/_next/static/chunks/9fed8b4b2b924054.js,sha256=6T4ZIAjWJDZNU4e-TH8oppnTWAVkMTvVSYNYgaXYHbI,1785127
67
+ recce/data/_next/static/chunks/a6dad97d9634a72d.js,sha256=CXPB1kyIrcjjyVBBDLWLKI9yEY1ZZbeASUON648vloM,112594
68
+ recce/data/_next/static/chunks/b6949f6c5892110c.js,sha256=3JV0fQPqn7OL5eIqzH2pmsUybKesfC12yrmecIJGZPM,1468
69
+ recce/data/_next/static/chunks/b851a1d3f8149828.js,sha256=ac6TuzYwbEpdg_gWMXJWUWY4XPCstxworyodlyPV5pM,119839
70
+ recce/data/_next/static/chunks/c734f9ad957de0b4.js,sha256=fz3ogjk1Wan2duSu7T73mfR5qQZva8Z4MneBkWGNK4M,283
71
+ recce/data/_next/static/chunks/cdde321b0ec75717.js,sha256=Ckh6S8wwqwqbPDaNWd6ENOz9jLLncR7vqpTae3ifpuQ,10305
72
+ recce/data/_next/static/chunks/d0f91117d77ff844.css,sha256=JcMeYq6PYzPIXv6t2e8xoHD2JVVqN49CMDvI5LsmO1o,561
73
+ recce/data/_next/static/chunks/d6c8667911c2500f.js,sha256=sJIIcsWr5TtcfnPnHatN5D_xf0gQRjTAp0GAKoJ5VjU,213907
74
+ recce/data/_next/static/chunks/da8dab68c02752cf.js,sha256=W5O2UV7KaITUdjMHrsAi9xR598guQFHTFY6n26Fw1Is,922023
75
+ recce/data/_next/static/chunks/dc074049c9d12d97.js,sha256=p0gCbQdt2nkL7pxaqL-o6N7zewVGcRkZRBq20L6yVTI,114172
76
+ recce/data/_next/static/chunks/ee7f1a8227342421.js,sha256=buyZVNJX310ZivnAKsznX0rERLhPwvp7CtycV-HEoSU,1389
77
+ recce/data/_next/static/chunks/fa2f4e56c2fccc73.js,sha256=C4Z3H0SGkujIdNYOdeg6mldZ5j8lUb_8nwj0FYqSjJE,440
78
+ recce/data/_next/static/chunks/turbopack-1fad664f62979b93.js,sha256=H5AKpg3wN8ADKK07g97Kz5KBFZn55Yh-hpy9QgsYYRA,9910
79
+ recce/data/_next/static/media/favicon.a8d38d84.ico,sha256=B2mBumUOnzvUrXrqNkrc5QfdDXjzEXRcWkWur0fJ6sM,2565
80
+ recce/data/_next/static/media/montserrat-cyrillic-800-normal.d80d830d.woff2,sha256=6XlujeGVTucujV3iPSa7j1d9S5A6uuH-EduJBCeVFu8,11180
81
+ recce/data/_next/static/media/montserrat-cyrillic-800-normal.f9d58125.woff,sha256=XiXifLCW_CfSR4eNCIxDzi3Cg59f6L34ARTHrw-hoDA,10924
82
+ recce/data/_next/static/media/montserrat-cyrillic-ext-800-normal.076c2a93.woff2,sha256=9hQT0vu2HmOb21Pk5Ht7bydZU7QIsY7rCyAPtm1VxM8,12144
83
+ recce/data/_next/static/media/montserrat-cyrillic-ext-800-normal.a4fa76b5.woff,sha256=lpODDPTBtDBAla5_gN_MO8RAFRT1bUJQ1XsBGNN3LHA,12036
84
+ recce/data/_next/static/media/montserrat-latin-800-normal.cde454cc.woff2,sha256=uoJvuEwulhV4rfOgi1d4uHkF1EQ0RdHVbYT58VfV6ks,19012
85
+ recce/data/_next/static/media/montserrat-latin-800-normal.d5761935.woff,sha256=JvnmESYLcsQ0Z9Cgq09WxQaOxDHkHZ4wiPp0EXyghtg,20660
86
+ recce/data/_next/static/media/montserrat-latin-ext-800-normal.40ec0659.woff2,sha256=Wfbr63GhTGTtxTjrp4oBDBye9oCmalWew89LDRLbGos,33624
87
+ recce/data/_next/static/media/montserrat-latin-ext-800-normal.b671449b.woff,sha256=1UdAsVT5LZ__hVWZ8WuyQ16miAO5eVOIV0Qy1FCS17c,41688
88
+ recce/data/_next/static/media/montserrat-vietnamese-800-normal.9f7b8541.woff,sha256=IOzp6YFKpjBM18q3jyRJYrgPJpNGDnEehwa3vyleQ6s,7328
89
+ recce/data/_next/static/media/montserrat-vietnamese-800-normal.f9eb854e.woff2,sha256=JPFJw2_X2Eih976ylPgpqHZJJxgdMAL3sCAhKV51-P0,7900
90
+ recce/data/_next/static/nX-Uz0AH6Tc6hIQUFGqaB/_buildManifest.js,sha256=lHbgr9P52mimTm7FhjEZH9PqymLJ9aN351F_6aieWeo,219
91
+ recce/data/_next/static/nX-Uz0AH6Tc6hIQUFGqaB/_clientMiddlewareManifest.json,sha256=T1PNoYwrqgwDVLtfmj7L5e0Sq02OEbqHPC8RFhICuUU,2
92
+ recce/data/_next/static/nX-Uz0AH6Tc6hIQUFGqaB/_ssgManifest.js,sha256=Z49s4suAsf5y_GfnQSvm4qtq2ggxEbZPfEDTXjy6XgA,80
93
+ recce/data/_not-found/__next._full.txt,sha256=PhoZBUQXVR-EJoamdjd_VnOeZR3IHXCe-eX48FC7VxM,8614
94
+ recce/data/_not-found/__next._head.txt,sha256=L1xYhymj_nSVAZANl4F9LC0Qnzau5XvbqDbYgC6tqBk,1139
95
+ recce/data/_not-found/__next._index.txt,sha256=IoXf-ZyL5uMNoSWvPmj4UCyJVgG-AjtDcp51qqHFivA,4952
96
+ recce/data/_not-found/__next._not-found.__PAGE__.txt,sha256=HDQGlUGx1MSwbXXopa8tZ6iFfN5L3OrTHFrp0dYdbeE,1450
97
+ recce/data/_not-found/__next._not-found.txt,sha256=-HntdvSmiL0r_eX1h1QXLmOcblb0eUVznxNWTL67Uw8,434
98
+ recce/data/_not-found/__next._tree.txt,sha256=Py_I7xg2Os5-P_depVVbM4M4ExR2banEWCyc58RgREA,711
99
+ recce/data/_not-found/index.html,sha256=UVNZXi99MpSwgO_vtvgSvamUFMztzZOcsuHPzMDZR-k,26886
100
+ recce/data/_not-found/index.txt,sha256=PhoZBUQXVR-EJoamdjd_VnOeZR3IHXCe-eX48FC7VxM,8614
101
+ recce/data/checks/__next.@lineage.__DEFAULT__.txt,sha256=z2Tao33BxSgm0G4gLlXXb8IwjcOddo2lAygJDt3aims,1268
102
+ recce/data/checks/__next._full.txt,sha256=tyKoVY7ibQA_gEXyU72P4OJVVJiC-k1vPryZJKvsfw0,11516
103
+ recce/data/checks/__next._head.txt,sha256=bwlMRNh8v9PVquYO1AJmVfA9liNOA0ORjXHmGBZMQLU,1088
104
+ recce/data/checks/__next._index.txt,sha256=ckQvSQcHluZ3xmn6eqizq6g6Dn0KVUSs56xsO-6EHyQ,8070
105
+ recce/data/checks/__next._tree.txt,sha256=coPsVGETp_po-RBaDJFYXgY9bMmgisHXmCWjJAQCCCY,906
106
+ recce/data/checks/__next.checks.__PAGE__.txt,sha256=ojalvfcOvRniwMf0gfvG1upkS9UIKd830vbvGDDHMiw,1559
107
+ recce/data/checks/__next.checks.txt,sha256=-HntdvSmiL0r_eX1h1QXLmOcblb0eUVznxNWTL67Uw8,434
108
+ recce/data/checks/index.html,sha256=oDz2mkzPpC5VIXCDM9vuXhLMbo3CrutkVhrhpDnPURM,32214
109
+ recce/data/checks/index.txt,sha256=tyKoVY7ibQA_gEXyU72P4OJVVJiC-k1vPryZJKvsfw0,11516
110
+ recce/data/imgs/reload-image.svg,sha256=l-jdOsD0OBCpFrVYh1ubO8oajafPuPNs6MYnbanO7K0,840
111
+ recce/data/imgs/feedback/thumbs-down.png,sha256=q9KVIbaZku1TWkYHuleYlO-b6HsTApYh3St5xNHMGMg,10695
112
+ recce/data/imgs/feedback/thumbs-up.png,sha256=VF3BH8bmYEqcSsMDJO57xMqW4t6crCXUXaMlOPgI_OE,10556
113
+ recce/data/lineage/__next.@lineage.__DEFAULT__.txt,sha256=z2Tao33BxSgm0G4gLlXXb8IwjcOddo2lAygJDt3aims,1268
114
+ recce/data/lineage/__next._full.txt,sha256=Pwd-r45GCsScEKzLgpdzT7JoWWAqkKvJhrkiVFaeGaA,11518
115
+ recce/data/lineage/__next._head.txt,sha256=bwlMRNh8v9PVquYO1AJmVfA9liNOA0ORjXHmGBZMQLU,1088
116
+ recce/data/lineage/__next._index.txt,sha256=ckQvSQcHluZ3xmn6eqizq6g6Dn0KVUSs56xsO-6EHyQ,8070
117
+ recce/data/lineage/__next._tree.txt,sha256=7XFDaJbeDAMO8SIS_Fu9OE8CT2DHwCDt6Sw3NIaV5BE,908
118
+ recce/data/lineage/__next.lineage.__PAGE__.txt,sha256=PrqEITviikmQUs-1AYIdbs0ZnlsUeDWTI4Bn-nUam0I,1559
119
+ recce/data/lineage/__next.lineage.txt,sha256=-HntdvSmiL0r_eX1h1QXLmOcblb0eUVznxNWTL67Uw8,434
120
+ recce/data/lineage/index.html,sha256=IQHrmSA39ozDaUYY1h8wqkx7tf0spFuwPoDBpLlIleU,30935
121
+ recce/data/lineage/index.txt,sha256=Pwd-r45GCsScEKzLgpdzT7JoWWAqkKvJhrkiVFaeGaA,11518
122
+ recce/data/logo/recce-logo-white.png,sha256=y3re8iEucJnMUkAkRS2CjWHTlOydyvgWdWjuQKcXDbk,46923
123
+ recce/data/query/__next.@lineage.__DEFAULT__.txt,sha256=z2Tao33BxSgm0G4gLlXXb8IwjcOddo2lAygJDt3aims,1268
124
+ recce/data/query/__next._full.txt,sha256=2cJV-j3R92S-QrSKHRCWrnljVejmNeIXbJVF_nBXcTM,11183
125
+ recce/data/query/__next._head.txt,sha256=bwlMRNh8v9PVquYO1AJmVfA9liNOA0ORjXHmGBZMQLU,1088
126
+ recce/data/query/__next._index.txt,sha256=ckQvSQcHluZ3xmn6eqizq6g6Dn0KVUSs56xsO-6EHyQ,8070
127
+ recce/data/query/__next._tree.txt,sha256=_00IyHkY6CKCkdzvxDunD2RhbqWJKqGE9iZK4B5fMQU,904
128
+ recce/data/query/__next.query.__PAGE__.txt,sha256=SYFe-etxmHi7st8Ehx4jjxD9LSbFr1qA-1vHSZmpM-I,1260
129
+ recce/data/query/__next.query.txt,sha256=-HntdvSmiL0r_eX1h1QXLmOcblb0eUVznxNWTL67Uw8,434
130
+ recce/data/query/index.html,sha256=meq1LXgVUXae41qH6m6c7Q2227zepWwtYGmvjHcU-B0,69114
131
+ recce/data/query/index.txt,sha256=2cJV-j3R92S-QrSKHRCWrnljVejmNeIXbJVF_nBXcTM,11183
132
+ recce/event/CONFIG,sha256=w8_AVcNu_JF-t8lNmjOqtsXbeOawMzpEhkISaMlm-iU,48
133
+ recce/event/CONFIG.bak,sha256=bs3XW12lptHahbwPpu0ibjLsgqlFK0j9UtjbA0IoTec,25
134
+ recce/event/SENTRY_DNS,sha256=nWXZevLC4qDScvNtjs329X13oxqvtFI_Kiu6cfCDOBA,83
135
+ recce/event/__init__.py,sha256=UKo0U0OZTkWsr7QBnCwXOHu7XtY0dhYPRTXuCsX8uIw,8847
136
+ recce/event/collector.py,sha256=6Vvcz9zejNNMytZ_K0HFV_kN6-S5B-SUOglBrlSPBo8,5884
137
+ recce/event/track.py,sha256=3wBzpB8l2gtnDzjh-wJatmLeBbtnP0q-BLQZQVQ23sM,5310
138
+ recce/models/__init__.py,sha256=F7cgALtdWnwv37R0eEgKZ_yBsMwxWnUfo3jAZ3u6qyU,209
139
+ recce/models/check.py,sha256=dSXnPZIUD8z8xy8Z9csSLxVQSOcqjfftqJLxTDw7GoA,16515
140
+ recce/models/run.py,sha256=QK2gvOWvko9YYhd2NLs3BPt5l4MSCZGwpzTAiqx9zJw,1161
141
+ recce/models/types.py,sha256=K8oWuYueqY2C7pKu65wSCaKMglPvtBH5DUkGrSYfFPk,6700
142
+ recce/state/__init__.py,sha256=V1FRPTQJUz-uwI3Cn8wDa5Z9bueVs86MR_1Ti4RGfPc,650
143
+ recce/state/cloud.py,sha256=7a6g9FXPVfq-beHQ8I7STlRMR2Y_peMJnlqysmeM7OY,25987
144
+ recce/state/const.py,sha256=5XwGWEv4RhGucgl1RHWg_67gVY7fV0-jsbZPpfnOCTs,828
145
+ recce/state/local.py,sha256=bZIkl7cAfyYaGgYEr3uD_JLrtwlHBnu8_o1Qz2djQzw,1920
146
+ recce/state/state.py,sha256=EKx4h0unxjC-dt2EGYFUyjKijotKHbE_wdS5AWBEq1k,3645
147
+ recce/state/state_loader.py,sha256=i4mw0nQ75uwB-O42HZvbYSJFkfSW7ak5mIhfapX5vi4,5965
148
+ recce/tasks/__init__.py,sha256=b553AtDHjYROgmMePv_Hv_X3fjh4iEn11gzzpUJz6_o,610
149
+ recce/tasks/core.py,sha256=JFYa1CfgOiRPQ7KVTwMuxJjhMB-pvCwB-xezVt-h3RU,4080
150
+ recce/tasks/dataframe.py,sha256=F9tOIjdJA_mkgzGmqdzfSfmhpJhdDb9DYYpWXAuBOyE,5868
151
+ recce/tasks/histogram.py,sha256=SMdSznzrBdAFvAbhsoUGAK9o0QUMYy00IVbamUVTpBk,13601
152
+ recce/tasks/lineage.py,sha256=_PbY0ZkDr620U8V2olqoX_T9XA0-G8ILt_6m1Q5TfBs,541
153
+ recce/tasks/profile.py,sha256=gMgms9qvdDsihh2aSC6LvCm9ggah4Oq3xjvmCh_exrU,11352
154
+ recce/tasks/query.py,sha256=NBNYRVgrc84NC12bq_daCPQ5HwMknPI_BQzMVsdqH98,14782
155
+ recce/tasks/rowcount.py,sha256=WZ1vNI0YJ40G-DBgx2apjNAhoQg1bvzrtBpUZFou1Nc,9908
156
+ recce/tasks/schema.py,sha256=s7CsmUoKNDx-WM87X_cCOpKieKxqEZITFzQTEq3ZckU,2432
157
+ recce/tasks/top_k.py,sha256=vY3VCBmg61E8I4V-9-hJOv5RCYCmhxl6sHiKR9Zv7eE,5521
158
+ recce/tasks/utils.py,sha256=xuU_5ZfQEZdSnNgxBJPsd-1sZfrraeKSRco7hhy4RKU,4966
159
+ recce/tasks/valuediff.py,sha256=IV2SOBeGMGHMGatmJQe12-Rfjp9y9B9qXaOndCR_EfM,18837
160
+ recce/util/__init__.py,sha256=cDvL3WT32cJR9CUPIJmibwJoyYcB3ZaKBFbOZDyvqP8,95
161
+ recce/util/api_token.py,sha256=iLS3VzLlsTfbXBLDoPPelmVlj6UdcEtGmfxdFQxXXSg,3223
162
+ recce/util/breaking.py,sha256=QMVq2l2fR7gNT4-n4kdhFTPf2NFev-jzecBSw_AwqFg,13086
163
+ recce/util/cache.py,sha256=QB6wzxe0M3jNTwP0M27Ys8F2hF-oda4-LyXXG9THuZQ,646
164
+ recce/util/cll.py,sha256=p8BrsG_1Lm-jXO8n4ulUgFw13C4mN0WjCXZbihDxQrs,13253
165
+ recce/util/io.py,sha256=UTUDncG4habAZZSZ1Y7i7Zpzu6FBtsfWI3y96k-0zkc,3495
166
+ recce/util/lineage.py,sha256=0XXOO05eJ3GPUNX9V9GBQS2iRFXxWZJoJbV7w-jQ0t8,2470
167
+ recce/util/logger.py,sha256=6UgLFkRiur9jJfu2ZRdo4LUvMw4f75V-l-1HT1-sgKo,747
168
+ recce/util/onboarding_state.py,sha256=kwFirKlfXdl5WFkR_nmilqGKFyELNcSPMqYq-by35fk,1991
169
+ recce/util/perf_tracking.py,sha256=FjhrdbbXIgybxS_oPpFsJ9VUDR93d7bUs8VNNqpXNxw,2483
170
+ recce/util/pydantic_model.py,sha256=KumKuyCjbTzEMsKLE4-b-eZfp0gLhYDdmVtw1-hxiJw,587
171
+ recce/util/recce_cloud.py,sha256=fTYOX8_ihvjovlnfPIl2sS-H72JD7v75--OwxDhISK4,18598
172
+ recce/util/singleton.py,sha256=1cU99I0f9tjuMQLMJyLsK1oK3fZJMsO5-TbRHAMXqds,627
173
+ recce/util/startup_perf.py,sha256=SU5yGG6R-U6VYWcbFtzxzNpfzbBqEgwLoQlj5H0E3vU,3764
174
+ recce/util/cloud/__init__.py,sha256=RIaTM5FZSUj1U4pVTJqvzUQxIdPZK-Re1i_vOwi3ECE,335
175
+ recce/util/cloud/base.py,sha256=vGeQK8YZD-bPTwA9mYuaND5qUnd1HZpXeTaoJ0oixXU,3717
176
+ recce/util/cloud/check_events.py,sha256=o8TibA0XxaPUajJaeS5tSafnDn7NdFfmwWILGMW4I5I,6303
177
+ recce/util/cloud/checks.py,sha256=4hxJpPZHzv3w2fEGXXo3PYMhDFPOE77fhqalaHCnpFI,7289
178
+ recce/yaml/__init__.py,sha256=PAym5akbtL24Ag7VR7EW8SS2VINNaJU06esbfe-ek-U,1328
179
+ recce_nightly-1.30.0.20251221.dist-info/METADATA,sha256=1i7otiJHb8NYrmZzVr34Qigiqez-1giWo0Jq_SWS_Uw,10253
180
+ recce_nightly-1.30.0.20251221.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
181
+ recce_nightly-1.30.0.20251221.dist-info/entry_points.txt,sha256=oqoY_IiwIqXbgrIsPnlqUqao2eiIeP2dprowkOlmeyg,40
182
+ recce_nightly-1.30.0.20251221.dist-info/licenses/LICENSE,sha256=CQjjMy9aYPhfe8xG_bcpIfKtNkdxLZ5IOb8oPygtUhY,11343
183
+ recce_nightly-1.30.0.20251221.dist-info/RECORD,,
@@ -1,5 +1,4 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (78.1.0)
2
+ Generator: hatchling 1.28.0
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
-