recce-nightly 1.10.0.20250629__py3-none-any.whl → 1.25.0.20251112a2066__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.
Files changed (168) hide show
  1. recce/VERSION +1 -1
  2. recce/__init__.py +5 -0
  3. recce/adapter/dbt_adapter/__init__.py +116 -74
  4. recce/artifact.py +76 -3
  5. recce/cli.py +665 -69
  6. recce/config.py +2 -2
  7. recce/connect_to_cloud.py +1 -1
  8. recce/core.py +3 -3
  9. recce/data/404.html +1 -22
  10. recce/data/__next.__PAGE__.txt +10 -0
  11. recce/data/__next._full.txt +23 -0
  12. recce/data/__next._index.txt +8 -0
  13. recce/data/__next._tree.txt +12 -0
  14. recce/data/_next/static/6LypcDXgyuSaiSCrsmUub/_buildManifest.js +11 -0
  15. recce/data/_next/static/6LypcDXgyuSaiSCrsmUub/_clientMiddlewareManifest.json +1 -0
  16. recce/data/_next/static/chunks/0a2b2dd4b57049c2.js +1 -0
  17. recce/data/_next/static/chunks/19c10d219a6a21ff.js +1 -0
  18. recce/data/_next/static/chunks/24fd885c7180a612.js +1 -0
  19. recce/data/_next/static/chunks/27e66b2eab4adc32.js +19 -0
  20. recce/data/_next/static/chunks/71f88fcc615bf282.js +1 -0
  21. recce/data/_next/static/chunks/917619ab62a32388.js +1 -0
  22. recce/data/_next/static/chunks/93ba5a62932b704f.js +4 -0
  23. recce/data/_next/static/chunks/a43a2a5e06d5a92b.js +1 -0
  24. recce/data/_next/static/chunks/a6c78b24bd8b84fc.js +1 -0
  25. recce/data/_next/static/chunks/b2610ba997ff8c4f.js +110 -0
  26. recce/data/_next/static/chunks/ba2d87265a68599d.css +2 -0
  27. recce/data/_next/static/chunks/c117fd1c1382dd83.js +11 -0
  28. recce/data/_next/static/chunks/c9425ca46eebdde9.js +1 -0
  29. recce/data/_next/static/chunks/cc8a9eadba012be0.css +6 -0
  30. recce/data/_next/static/chunks/e124bccf574a3361.css +1 -0
  31. recce/data/_next/static/chunks/e392ad92847c3e17.js +1 -0
  32. recce/data/_next/static/chunks/e4ce95efe88dae79.js +11 -0
  33. recce/data/_next/static/chunks/e69c777814fea6ed.js +2 -0
  34. recce/data/_next/static/chunks/turbopack-21cfd73037ff57ab.js +3 -0
  35. recce/data/_next/static/media/favicon.a8d38d84.ico +0 -0
  36. recce/data/_next/static/media/montserrat-cyrillic-800-normal.d80d830d.woff2 +0 -0
  37. recce/data/_next/static/media/{montserrat-cyrillic-800-normal.bd5c9f50.woff → montserrat-cyrillic-800-normal.f9d58125.woff} +0 -0
  38. recce/data/_next/static/media/montserrat-cyrillic-ext-800-normal.076c2a93.woff2 +0 -0
  39. recce/data/_next/static/media/montserrat-latin-800-normal.cde454cc.woff2 +0 -0
  40. recce/data/_next/static/media/{montserrat-latin-800-normal.fc315020.woff → montserrat-latin-800-normal.d5761935.woff} +0 -0
  41. recce/data/_next/static/media/montserrat-latin-ext-800-normal.40ec0659.woff2 +0 -0
  42. recce/data/_next/static/media/{montserrat-latin-ext-800-normal.2e5381b2.woff → montserrat-latin-ext-800-normal.b671449b.woff} +0 -0
  43. recce/data/_next/static/media/{montserrat-vietnamese-800-normal.20c545e6.woff → montserrat-vietnamese-800-normal.9f7b8541.woff} +0 -0
  44. recce/data/_next/static/media/montserrat-vietnamese-800-normal.f9eb854e.woff2 +0 -0
  45. recce/data/_not-found/__next._full.txt +17 -0
  46. recce/data/_not-found/__next._index.txt +8 -0
  47. recce/data/_not-found/__next._not-found.__PAGE__.txt +5 -0
  48. recce/data/_not-found/__next._not-found.txt +4 -0
  49. recce/data/_not-found/__next._tree.txt +10 -0
  50. recce/data/_not-found.html +1 -0
  51. recce/data/_not-found.txt +17 -0
  52. recce/data/auth_callback.html +1 -1
  53. recce/data/index.html +1 -27
  54. recce/data/index.txt +23 -8
  55. recce/event/__init__.py +9 -8
  56. recce/event/collector.py +6 -2
  57. recce/event/track.py +10 -0
  58. recce/github.py +1 -1
  59. recce/mcp_server.py +632 -0
  60. recce/models/types.py +23 -2
  61. recce/pull_request.py +1 -1
  62. recce/run.py +23 -16
  63. recce/server.py +165 -11
  64. recce/state/__init__.py +31 -0
  65. recce/state/cloud.py +632 -0
  66. recce/state/const.py +26 -0
  67. recce/state/local.py +56 -0
  68. recce/state/state.py +119 -0
  69. recce/state/state_loader.py +174 -0
  70. recce/summary.py +2 -1
  71. recce/tasks/dataframe.py +59 -2
  72. recce/tasks/rowcount.py +4 -1
  73. recce/tasks/schema.py +4 -1
  74. recce/tasks/valuediff.py +1 -1
  75. recce/util/api_token.py +11 -2
  76. recce/util/breaking.py +9 -0
  77. recce/util/cll.py +1 -2
  78. recce/util/io.py +2 -2
  79. recce/util/lineage.py +14 -18
  80. recce/util/perf_tracking.py +85 -0
  81. recce/util/recce_cloud.py +229 -5
  82. recce/yaml/__init__.py +2 -2
  83. recce_cloud/__init__.py +15 -0
  84. recce_cloud/api/__init__.py +17 -0
  85. recce_cloud/api/base.py +104 -0
  86. recce_cloud/api/client.py +150 -0
  87. recce_cloud/api/exceptions.py +26 -0
  88. recce_cloud/api/factory.py +63 -0
  89. recce_cloud/api/github.py +72 -0
  90. recce_cloud/api/gitlab.py +78 -0
  91. recce_cloud/artifact.py +57 -0
  92. recce_cloud/ci_providers/__init__.py +9 -0
  93. recce_cloud/ci_providers/base.py +82 -0
  94. recce_cloud/ci_providers/detector.py +147 -0
  95. recce_cloud/ci_providers/github_actions.py +136 -0
  96. recce_cloud/ci_providers/gitlab_ci.py +130 -0
  97. recce_cloud/cli.py +303 -0
  98. recce_cloud/upload.py +213 -0
  99. {recce_nightly-1.10.0.20250629.dist-info → recce_nightly-1.25.0.20251112a2066.dist-info}/METADATA +31 -27
  100. recce_nightly-1.25.0.20251112a2066.dist-info/RECORD +178 -0
  101. {recce_nightly-1.10.0.20250629.dist-info → recce_nightly-1.25.0.20251112a2066.dist-info}/top_level.txt +1 -0
  102. tests/adapter/dbt_adapter/test_dbt_cll.py +68 -17
  103. tests/recce_cloud/__init__.py +0 -0
  104. tests/recce_cloud/test_ci_providers.py +351 -0
  105. tests/recce_cloud/test_cli.py +372 -0
  106. tests/recce_cloud/test_client.py +273 -0
  107. tests/recce_cloud/test_platform_clients.py +279 -0
  108. tests/test_cli.py +106 -3
  109. tests/test_cli_mcp_optional.py +45 -0
  110. tests/test_cloud_listing_cli.py +324 -0
  111. tests/test_core.py +147 -0
  112. tests/test_mcp_server.py +332 -0
  113. tests/test_server.py +6 -6
  114. tests/test_summary.py +14 -6
  115. recce/data/_next/static/Mrb9CZ3toH6Q8xrzNzCrg/_buildManifest.js +0 -1
  116. recce/data/_next/static/chunks/181-acc61ddada3bc0ca.js +0 -43
  117. recce/data/_next/static/chunks/1bff33f1-1ef85cf5e658a751.js +0 -1
  118. recce/data/_next/static/chunks/217-879a84d70f7a907c.js +0 -2
  119. recce/data/_next/static/chunks/29e3cc0d-60045b2e47aa3916.js +0 -1
  120. recce/data/_next/static/chunks/36e1c10d-8e7be4a6c1f6ab2d.js +0 -1
  121. recce/data/_next/static/chunks/3998a672-03adacad07b346ac.js +0 -1
  122. recce/data/_next/static/chunks/3a92ee20-1081c360214f9602.js +0 -1
  123. recce/data/_next/static/chunks/41-f30276c289169376.js +0 -9
  124. recce/data/_next/static/chunks/450c323b-fd94e7ffaa4a5efa.js +0 -1
  125. recce/data/_next/static/chunks/47d8844f-929aed9b1c73a905.js +0 -1
  126. recce/data/_next/static/chunks/608-3b079b544e5d5f5e.js +0 -15
  127. recce/data/_next/static/chunks/6dc81886-adbfa45836061d79.js +0 -1
  128. recce/data/_next/static/chunks/7a8a3e83-edf6dc64b5d5f0a5.js +0 -1
  129. recce/data/_next/static/chunks/7f27ae6c-d5f0438edd5c2a5b.js +0 -1
  130. recce/data/_next/static/chunks/86730205-cfb14e3f051bab35.js +0 -1
  131. recce/data/_next/static/chunks/8d700b6a.8bb140898499c512.js +0 -1
  132. recce/data/_next/static/chunks/92-68460b15fe448f33.js +0 -1
  133. recce/data/_next/static/chunks/9746af58-a42b7d169cacadf0.js +0 -1
  134. recce/data/_next/static/chunks/a30376cd-de84559016d7e133.js +0 -1
  135. recce/data/_next/static/chunks/app/_not-found/page-01ed58b7f971d311.js +0 -1
  136. recce/data/_next/static/chunks/app/layout-292f035bb0d2a98e.js +0 -1
  137. recce/data/_next/static/chunks/app/page-598f8acc82179d01.js +0 -1
  138. recce/data/_next/static/chunks/b63b1b3f-4282bdcf459e075c.js +0 -1
  139. recce/data/_next/static/chunks/bbda5537-9ec25eb1dd62348a.js +0 -1
  140. recce/data/_next/static/chunks/c132bf7d-08cb668a789d6afd.js +0 -1
  141. recce/data/_next/static/chunks/ce84277d-2e5d1d46910cf052.js +0 -1
  142. recce/data/_next/static/chunks/febdd86e-c6b525341634b860.js +0 -54
  143. recce/data/_next/static/chunks/fee69bc6-2dbccaf9b90474e6.js +0 -1
  144. recce/data/_next/static/chunks/framework-ded83d71b51ce901.js +0 -1
  145. recce/data/_next/static/chunks/main-app-39061b0166c47f55.js +0 -1
  146. recce/data/_next/static/chunks/main-b5b3ae20a1405261.js +0 -1
  147. recce/data/_next/static/chunks/pages/_app-437c455677d62394.js +0 -1
  148. recce/data/_next/static/chunks/pages/_error-e7650df18ca04bde.js +0 -1
  149. recce/data/_next/static/chunks/webpack-7b49d5ba7e3a434d.js +0 -1
  150. recce/data/_next/static/css/17a96168e3a9db13.css +0 -1
  151. recce/data/_next/static/css/35c6679a098e1e34.css +0 -1
  152. recce/data/_next/static/css/951e2e0eea2d4a5b.css +0 -14
  153. recce/data/_next/static/css/a2b12b4ba4227f0a.css +0 -3
  154. recce/data/_next/static/media/montserrat-cyrillic-800-normal.22628180.woff2 +0 -0
  155. recce/data/_next/static/media/montserrat-cyrillic-ext-800-normal.94a63aea.woff2 +0 -0
  156. recce/data/_next/static/media/montserrat-latin-800-normal.6f8fa298.woff2 +0 -0
  157. recce/data/_next/static/media/montserrat-latin-ext-800-normal.013b84f9.woff2 +0 -0
  158. recce/data/_next/static/media/montserrat-vietnamese-800-normal.c0035377.woff2 +0 -0
  159. recce/state.py +0 -786
  160. recce_nightly-1.10.0.20250629.dist-info/RECORD +0 -154
  161. tests/test_state.py +0 -134
  162. /recce/data/_next/static/{Mrb9CZ3toH6Q8xrzNzCrg → 6LypcDXgyuSaiSCrsmUub}/_ssgManifest.js +0 -0
  163. /recce/data/_next/static/chunks/{polyfills-42372ed130431b0a.js → a6dad97d9634a72d.js} +0 -0
  164. /recce/data/_next/static/media/{montserrat-cyrillic-ext-800-normal.e6e0d8d0.woff → montserrat-cyrillic-ext-800-normal.a4fa76b5.woff} +0 -0
  165. /recce/data/_next/static/media/{reload-image.79aabb7d.svg → reload-image.7aa931c7.svg} +0 -0
  166. {recce_nightly-1.10.0.20250629.dist-info → recce_nightly-1.25.0.20251112a2066.dist-info}/WHEEL +0 -0
  167. {recce_nightly-1.10.0.20250629.dist-info → recce_nightly-1.25.0.20251112a2066.dist-info}/entry_points.txt +0 -0
  168. {recce_nightly-1.10.0.20250629.dist-info → recce_nightly-1.25.0.20251112a2066.dist-info}/licenses/LICENSE +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: recce-nightly
3
- Version: 1.10.0.20250629
3
+ Version: 1.25.0.20251112a2066
4
4
  Summary: Environment diff tool for dbt
5
5
  Home-page: https://github.com/InfuseAI/recce
6
6
  Author: InfuseAI Dev Team
@@ -21,7 +21,7 @@ Requires-Dist: boto3
21
21
  Requires-Dist: requests>=2.28.1
22
22
  Requires-Dist: ruamel.yaml>=0.18.6
23
23
  Requires-Dist: click>=7.1
24
- Requires-Dist: deepdiff<8.0,>=7.0
24
+ Requires-Dist: deepdiff<9.0,>=7.0
25
25
  Requires-Dist: portalocker
26
26
  Requires-Dist: fastapi
27
27
  Requires-Dist: itsdangerous
@@ -39,8 +39,13 @@ Requires-Dist: python-multipart
39
39
  Requires-Dist: GitPython
40
40
  Requires-Dist: PyGithub
41
41
  Requires-Dist: sqlglot
42
+ Requires-Dist: pytz
43
+ Requires-Dist: packaging
44
+ Provides-Extra: mcp
45
+ Requires-Dist: mcp>=1.0.0; extra == "mcp"
42
46
  Provides-Extra: dev
43
47
  Requires-Dist: pytest>=4.6; extra == "dev"
48
+ Requires-Dist: pytest-asyncio; extra == "dev"
44
49
  Requires-Dist: pytest-flake8; extra == "dev"
45
50
  Requires-Dist: black>=25.1.0; extra == "dev"
46
51
  Requires-Dist: isort>=6.0.1; extra == "dev"
@@ -66,11 +71,11 @@ Dynamic: requires-python
66
71
  Dynamic: summary
67
72
 
68
73
  <p align="center">
69
- <a href="https://datarecce.io">
74
+ <a href="https://reccehq.com">
70
75
  <picture>
71
- <source media="(prefers-color-scheme: dark)" srcset="https://datarecce.io/assets/images/recce-logo-stacked.avif">
72
- <source media="(prefers-color-scheme: light)" srcset="https://datarecce.io/assets/images/recce-logo-stacked.avif">
73
- <img alt="Recce: DataRecce.io" src="https://datarecce.io/assets/images/recce-logo-stacked.avif" width="200" style="display: block; margin: 0 auto 20px;">
76
+ <source media="(prefers-color-scheme: dark)" srcset="https://reccehq.com/assets/images/recce-logo-stacked.avif">
77
+ <source media="(prefers-color-scheme: light)" srcset="https://reccehq.com/assets/images/recce-logo-stacked.avif">
78
+ <img alt="Recce: DataRecce.io" src="https://reccehq.com/assets/images/recce-logo-stacked.avif" width="200" style="display: block; margin: 0 auto 20px;">
74
79
  </picture>
75
80
  </a>
76
81
  </p>
@@ -106,17 +111,17 @@ You can launch Recce in any dbt project in just two commands:
106
111
  pip install -U recce
107
112
  recce server
108
113
  ```
109
- This starts Recce locally, where you can explore lineage and run queries. To unlock the full set of diffing tools, such as data comparisons and impact checks, you’ll need to prepare two environments to compare against. You can follow our [Getting Started](https://docs.datarecce.io/get-started/) and [5-minute Jaffle Shop tutorial](https://docs.datarecce.io/get-started-jaffle-shop/) to try it out step-by-step.
114
+ 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.
110
115
 
111
116
  ## What You Get
112
117
 
113
118
  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.
114
119
 
115
- <a href="https://pr46.demo.datarecce.io/"><img width="1347" alt="readme" src="https://github.com/user-attachments/assets/773e4c3a-0a15-49e0-8d1b-38a55af17cb0" /></a>
120
+ <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>
116
121
 
117
- <a href="https://datarecce.io"><img src="https://docs.datarecce.io/assets/images/home/diff-readme2.png" style="width: 100%; max-width: 600px; display: block; margin: 0 auto 20px;" alt="Model and column level diff"/></a>
122
+ <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>
118
123
 
119
- <a href="https://datarecce.io"><img src="https://docs.datarecce.io/assets/images/home/checklist-readme3.png" style="width: 100%; max-width: 600px; display: block; margin: 0 auto 20px;" alt="Checklist for collaboration"/></a>
124
+ <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>
120
125
 
121
126
  ### Using Recce for Impact Assessment in dbt PR Review
122
127
 
@@ -127,18 +132,17 @@ Recce gives you a clear, fast way to understand what your data changes are doing
127
132
  - (`Recce Cloud`) Automatically sync Check status between Recce Instances
128
133
  - (`Recce Cloud`) Block PR merging until all Recce Checks have been approved
129
134
 
130
- Read more about using [Recce for Impact Assessment](https://datarecce.io/blog/hands-on-data-impact-analysis-recce/) on
131
- the Recce blog.
135
+ Read more about using Recce on our [blog](https://blog.reccehq.com).
132
136
 
133
137
  ### What’s Included
134
138
 
135
- - [Lineage and impact mapping](https://docs.datarecce.io/features/lineage/): Quickly see which models and columns are affected by a change. Navigate lineage down to the column level, and spot breaking changes with clear visual cues.
136
- - Metric and data comparisons: Use [Profile, Value, Top-K, and Histogram Diffs](https://docs.datarecce.io/features/lineage/#node-details) to compare results before and after changes. Validate things like row counts, category distributions, and numeric ranges without writing extra SQL.
137
- - [Query diff](https://docs.datarecce.io/features/query/): Write and compare any two queries side by side. This is helpful when validating fixes or reviewing changes with teammates.
138
- - [Checklist for reviews and approvals](https://docs.datarecce.io/features/checklist/): Turn your validation steps into a checklist. Add notes, rerun checks, and share the results with reviewers or stakeholders. In Recce Cloud, checklists can sync automatically and even block PRs until checks are approved.
139
- - Secure by design: Recce is [SOC 2 compliant](https://trust.cloud.datarecce.io/) to meet enterprise security standards. It runs locally or in your private environment, and your data stays in your warehouse.
139
+ - [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.
140
+ - 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.
141
+ - [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.
142
+ - [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.
143
+ - 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.
140
144
 
141
- 👉 Want to dive deeper? Check out the [full documentation](https://docs.datarecce.io/) like [running Recce in CI/CD](https://docs.datarecce.io/guides/scenario-ci/)
145
+ 👉 Want to dive deeper? Check out the [full documentation](https://docs.reccehq.com/).
142
146
 
143
147
  ## Recce Cloud
144
148
 
@@ -150,26 +154,26 @@ Ready to collaborate and move faster as a team? Recce Cloud adds real-time colla
150
154
  - Launch demo links from your CI with full context
151
155
 
152
156
  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.
153
- 👉 [View Pricing and Plans](https://datarecce.io/pricing)
157
+ 👉 [View Pricing and Plans](https://reccehq.com/pricing)
154
158
 
155
159
  ## Community & Support
156
160
 
157
- Here's where you can get in touch with the Recce team and find support:
161
+ Here's where you can get in touch with the Recce team and find support, add a subscribe to our newsletter option as well:
158
162
 
159
- - [dbt Slack](https://www.getdbt.com/community/join-the-community) in
160
- the [#tools-recce](https://getdbt.slack.com/archives/C05C28V7CPP) channel
161
- - Email us [product@datarecce.io](mailto:product@datarecce.io)
163
+ - [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.
164
+ - [Our discord](https://discord.com/invite/VpwXRC34jz)
165
+ - [dbt Slack](https://www.getdbt.com/community/join-the-community) in the [#tools-recce](https://getdbt.slack.com/archives/C05C28V7CPP) channel
166
+ - Email us [help@reccehq.com](mailto:help@reccehq.com)
162
167
 
163
- If you believe you have found a bug, or there is some missing functionality in Recce, please open
164
- a [GitHub Issue](https://github.com/DataRecce/recce/issues).
168
+ 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).
165
169
 
166
170
  ## Recce on the web
167
171
 
168
172
  You can follow along with news about Recce and blogs from our team in the following places:
169
173
 
170
- - [DataRecce.io](https://DataRecce.io)
174
+ - [RecceHQ.com](https://reccehq.com/)
171
175
  - [LinkedIn](https://www.linkedin.com/company/datarecce)
172
- - [Medium blog](https://medium.com/inthepipeline)
176
+ - [Blog](https://blog.reccehq.com/)
173
177
  - [@datarecce](https://x.com/DataRecce) on Twitter/X
174
178
  - [@DataRecce@mastodon.social](https://mastodon.social/@DataRecce) on Mastodon
175
179
  - [@datarecce.bsky.social](https://bsky.app/profile/datarecce.bsky.social) on BlueSky
@@ -0,0 +1,178 @@
1
+ recce/VERSION,sha256=yOEdv-w_6Drd_fli9SfUZI7yDVeGwPfUNEjkDCpyc0E,21
2
+ recce/__init__.py,sha256=gT5G7sJ78C1GHAWr4pna6UvVNxPKs29_EgFS_ia3DT4,2554
3
+ recce/artifact.py,sha256=zksgrKEONdMmBRgM59gzf6srsr0As_UADZTQrWfC2cE,9759
4
+ recce/cli.py,sha256=s1KXgjXzwaKh5YDHYOWcabObTSMQ_yf0d6wDe4bxNK4,59860
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=cs1wXtGjTyZsy7xyiRvMlkY78HmbQ2N8JzYfOvkREZ0,27236
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=OZ0YY68ErlCown0XGxFhuFBetQB-kQOZcjxogBGQUyQ,19218
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=2x6RXC1tACA9nsD2WzokGkgW3BeM2Ox8y5RTmOGHduU,59361
28
+ recce/data/__next.__PAGE__.txt,sha256=gVFBfABVE0N9lVs2LIxUnDPY7mSpq5rWBOMxR2Rd3FU,1208
29
+ recce/data/__next._full.txt,sha256=ANjvvTdO8ur2zKIaqCnB-l74LwSZTPtQj16DVtq4TYA,5168
30
+ recce/data/__next._index.txt,sha256=7BRJpJA6MnaNBb7IeZadSCv0p-1y-ckFtyToFPzxj_M,2441
31
+ recce/data/__next._tree.txt,sha256=ggWFSsabE_mb02kDd3tLFe89WTR5A6aqMZdTWvEu-F8,1512
32
+ recce/data/_not-found.html,sha256=2x6RXC1tACA9nsD2WzokGkgW3BeM2Ox8y5RTmOGHduU,59361
33
+ recce/data/_not-found.txt,sha256=XFDqPcWGpyWEcYSCSCM0gkkQ7LRqCToStuXEA_smBRM,5897
34
+ recce/data/auth_callback.html,sha256=H-XfdlAFiw5VU2RpKBVQbwh1AIqJrPHrFA0S09nNJZA,94779
35
+ recce/data/favicon.ico,sha256=B2mBumUOnzvUrXrqNkrc5QfdDXjzEXRcWkWur0fJ6sM,2565
36
+ recce/data/index.html,sha256=2Y51sCnTpGvhwBZP376wGzyDKQne73-5cCuu5rieS-Y,74305
37
+ recce/data/index.txt,sha256=ANjvvTdO8ur2zKIaqCnB-l74LwSZTPtQj16DVtq4TYA,5168
38
+ recce/data/_next/static/6LypcDXgyuSaiSCrsmUub/_buildManifest.js,sha256=lHbgr9P52mimTm7FhjEZH9PqymLJ9aN351F_6aieWeo,219
39
+ recce/data/_next/static/6LypcDXgyuSaiSCrsmUub/_clientMiddlewareManifest.json,sha256=T1PNoYwrqgwDVLtfmj7L5e0Sq02OEbqHPC8RFhICuUU,2
40
+ recce/data/_next/static/6LypcDXgyuSaiSCrsmUub/_ssgManifest.js,sha256=Z49s4suAsf5y_GfnQSvm4qtq2ggxEbZPfEDTXjy6XgA,80
41
+ recce/data/_next/static/chunks/0a2b2dd4b57049c2.js,sha256=Pu0sHoaerWbXCnbkMeTmbb9X11IWpAsEwN9ezpPzmSA,20110
42
+ recce/data/_next/static/chunks/19c10d219a6a21ff.js,sha256=ohhihO1BmJTnfQWLePPxbEs5Cr8sR3rCWAljeiy2mCc,178
43
+ recce/data/_next/static/chunks/24fd885c7180a612.js,sha256=wohv9qtxXaJBvMOiWy0ZbuckzgQBNpSGZXBlw2KLMWQ,174689
44
+ recce/data/_next/static/chunks/27e66b2eab4adc32.js,sha256=ZwKFx70eyCz1awk6oUOi2WZ60OWMBvjENkWh1XcCO2k,220769
45
+ recce/data/_next/static/chunks/71f88fcc615bf282.js,sha256=55RlXxwna_yDR1-s8uK-GZv1IUOVhCGB8rULcz75S3U,7218
46
+ recce/data/_next/static/chunks/917619ab62a32388.js,sha256=SOayxnQL-lT_gvqrVxm9gVrR_pf6JxTBS4ZtB3REsFw,1386
47
+ recce/data/_next/static/chunks/93ba5a62932b704f.js,sha256=0peG3GPnXAEPxPodRfpgXOKrsu9LSWKJdgRrvf60J_o,98320
48
+ recce/data/_next/static/chunks/a43a2a5e06d5a92b.js,sha256=SkmXZLNalUBIlElfXqH57-41l7emgRUEv--uPDlk5J4,119836
49
+ recce/data/_next/static/chunks/a6c78b24bd8b84fc.js,sha256=-9ubpiN6c-jyAcbuuuOhYhh1IABdrwRoPW357JNN7_E,27852
50
+ recce/data/_next/static/chunks/a6dad97d9634a72d.js,sha256=CXPB1kyIrcjjyVBBDLWLKI9yEY1ZZbeASUON648vloM,112594
51
+ recce/data/_next/static/chunks/b2610ba997ff8c4f.js,sha256=C6LeK2FJj3aJ6E5UsIlbji1UgW2U-kujGkCOSQkqidg,802630
52
+ recce/data/_next/static/chunks/ba2d87265a68599d.css,sha256=7UwDTAlsoGfU5Pvt0Kr5NGwBXYoJwU3Pr81bIigwWLU,8282
53
+ recce/data/_next/static/chunks/c117fd1c1382dd83.js,sha256=ox8yTTv83DmzIgpdVIp0LL67SkeoTbYUZvUoDRzlxqM,1752021
54
+ recce/data/_next/static/chunks/c9425ca46eebdde9.js,sha256=nMJ5VTPD-Lo7gZHfampwKuILJiEXowBUYX3r9mvNUvs,282
55
+ recce/data/_next/static/chunks/cc8a9eadba012be0.css,sha256=qo4Yw3yDmvf5-j262j6M8AUrnNu2qMWVmpTyv6LEMfY,22061
56
+ recce/data/_next/static/chunks/e124bccf574a3361.css,sha256=6gXTy63dQt22HjYeSokfddLsIhwm0GU_JymzPrdHRm4,12679
57
+ recce/data/_next/static/chunks/e392ad92847c3e17.js,sha256=4VtLJijiJT-zA2pB0uKc5OwsH-v9HAepAcuwb-lsGkY,6860
58
+ recce/data/_next/static/chunks/e4ce95efe88dae79.js,sha256=TzFubDmu3diz6WlYwkEjjhK0iKny6d3zYvqdRy72UCM,43339
59
+ recce/data/_next/static/chunks/e69c777814fea6ed.js,sha256=IL52o9Dqzl6hjiae-uTQnubhF_y2lgjd7a0DffoPXWI,82578
60
+ recce/data/_next/static/chunks/turbopack-21cfd73037ff57ab.js,sha256=Td9iSmAtBm1NNWH72MP_3BTPtT23V3DC5wN-Dx3Rx_s,9909
61
+ recce/data/_next/static/media/favicon.a8d38d84.ico,sha256=B2mBumUOnzvUrXrqNkrc5QfdDXjzEXRcWkWur0fJ6sM,2565
62
+ recce/data/_next/static/media/montserrat-cyrillic-800-normal.d80d830d.woff2,sha256=6XlujeGVTucujV3iPSa7j1d9S5A6uuH-EduJBCeVFu8,11180
63
+ recce/data/_next/static/media/montserrat-cyrillic-800-normal.f9d58125.woff,sha256=XiXifLCW_CfSR4eNCIxDzi3Cg59f6L34ARTHrw-hoDA,10924
64
+ recce/data/_next/static/media/montserrat-cyrillic-ext-800-normal.076c2a93.woff2,sha256=9hQT0vu2HmOb21Pk5Ht7bydZU7QIsY7rCyAPtm1VxM8,12144
65
+ recce/data/_next/static/media/montserrat-cyrillic-ext-800-normal.a4fa76b5.woff,sha256=lpODDPTBtDBAla5_gN_MO8RAFRT1bUJQ1XsBGNN3LHA,12036
66
+ recce/data/_next/static/media/montserrat-latin-800-normal.cde454cc.woff2,sha256=uoJvuEwulhV4rfOgi1d4uHkF1EQ0RdHVbYT58VfV6ks,19012
67
+ recce/data/_next/static/media/montserrat-latin-800-normal.d5761935.woff,sha256=JvnmESYLcsQ0Z9Cgq09WxQaOxDHkHZ4wiPp0EXyghtg,20660
68
+ recce/data/_next/static/media/montserrat-latin-ext-800-normal.40ec0659.woff2,sha256=Wfbr63GhTGTtxTjrp4oBDBye9oCmalWew89LDRLbGos,33624
69
+ recce/data/_next/static/media/montserrat-latin-ext-800-normal.b671449b.woff,sha256=1UdAsVT5LZ__hVWZ8WuyQ16miAO5eVOIV0Qy1FCS17c,41688
70
+ recce/data/_next/static/media/montserrat-vietnamese-800-normal.9f7b8541.woff,sha256=IOzp6YFKpjBM18q3jyRJYrgPJpNGDnEehwa3vyleQ6s,7328
71
+ recce/data/_next/static/media/montserrat-vietnamese-800-normal.f9eb854e.woff2,sha256=JPFJw2_X2Eih976ylPgpqHZJJxgdMAL3sCAhKV51-P0,7900
72
+ recce/data/_next/static/media/reload-image.7aa931c7.svg,sha256=l-jdOsD0OBCpFrVYh1ubO8oajafPuPNs6MYnbanO7K0,840
73
+ recce/data/_not-found/__next._full.txt,sha256=XFDqPcWGpyWEcYSCSCM0gkkQ7LRqCToStuXEA_smBRM,5897
74
+ recce/data/_not-found/__next._index.txt,sha256=7BRJpJA6MnaNBb7IeZadSCv0p-1y-ckFtyToFPzxj_M,2441
75
+ recce/data/_not-found/__next._not-found.__PAGE__.txt,sha256=5tNQEkf-XkCrUbytkYqiuC9LGgZAJto4BFmw0poXVmM,1449
76
+ recce/data/_not-found/__next._not-found.txt,sha256=a9_cLB8pHuQZ5Si0ZKMlii1lnsMd4Khm-9-ke_zLQ2Q,431
77
+ recce/data/_not-found/__next._tree.txt,sha256=9w7mbg_jS1OvpHKZeVYd_I0ppZNlF9QYo3WFsv2k0aI,1628
78
+ recce/data/imgs/reload-image.svg,sha256=l-jdOsD0OBCpFrVYh1ubO8oajafPuPNs6MYnbanO7K0,840
79
+ recce/data/imgs/feedback/thumbs-down.png,sha256=q9KVIbaZku1TWkYHuleYlO-b6HsTApYh3St5xNHMGMg,10695
80
+ recce/data/imgs/feedback/thumbs-up.png,sha256=VF3BH8bmYEqcSsMDJO57xMqW4t6crCXUXaMlOPgI_OE,10556
81
+ recce/data/logo/recce-logo-white.png,sha256=y3re8iEucJnMUkAkRS2CjWHTlOydyvgWdWjuQKcXDbk,46923
82
+ recce/event/CONFIG,sha256=w8_AVcNu_JF-t8lNmjOqtsXbeOawMzpEhkISaMlm-iU,48
83
+ recce/event/SENTRY_DNS,sha256=nWXZevLC4qDScvNtjs329X13oxqvtFI_Kiu6cfCDOBA,83
84
+ recce/event/__init__.py,sha256=UKo0U0OZTkWsr7QBnCwXOHu7XtY0dhYPRTXuCsX8uIw,8847
85
+ recce/event/collector.py,sha256=6Vvcz9zejNNMytZ_K0HFV_kN6-S5B-SUOglBrlSPBo8,5884
86
+ recce/event/track.py,sha256=3wBzpB8l2gtnDzjh-wJatmLeBbtnP0q-BLQZQVQ23sM,5310
87
+ recce/models/__init__.py,sha256=F7cgALtdWnwv37R0eEgKZ_yBsMwxWnUfo3jAZ3u6qyU,209
88
+ recce/models/check.py,sha256=jjR1SGyczjrqyK-0Zas6ikLIGSgVp54lvfcQA19AniI,1588
89
+ recce/models/run.py,sha256=QK2gvOWvko9YYhd2NLs3BPt5l4MSCZGwpzTAiqx9zJw,1161
90
+ recce/models/types.py,sha256=L38laNWn0r7XxYOaJ05P4cWzZcwU20wf0QKo4MtmFx8,5105
91
+ recce/state/__init__.py,sha256=V1FRPTQJUz-uwI3Cn8wDa5Z9bueVs86MR_1Ti4RGfPc,650
92
+ recce/state/cloud.py,sha256=yWS9dhG7gFVhNDrdaFzDSVHMiC74UYeYQm19XkRNcVk,25523
93
+ recce/state/const.py,sha256=5XwGWEv4RhGucgl1RHWg_67gVY7fV0-jsbZPpfnOCTs,828
94
+ recce/state/local.py,sha256=bZIkl7cAfyYaGgYEr3uD_JLrtwlHBnu8_o1Qz2djQzw,1920
95
+ recce/state/state.py,sha256=EKx4h0unxjC-dt2EGYFUyjKijotKHbE_wdS5AWBEq1k,3645
96
+ recce/state/state_loader.py,sha256=IiGaFDm2y_0NMsv_YUZhSuDTsvWmdMrf9SXIv9w5sKE,5966
97
+ recce/tasks/__init__.py,sha256=b553AtDHjYROgmMePv_Hv_X3fjh4iEn11gzzpUJz6_o,610
98
+ recce/tasks/core.py,sha256=JFYa1CfgOiRPQ7KVTwMuxJjhMB-pvCwB-xezVt-h3RU,4080
99
+ recce/tasks/dataframe.py,sha256=_UZPmKDlZ_ei1crkM1obvaXvdjuwGIem98Hh0H70GPI,5638
100
+ recce/tasks/histogram.py,sha256=SMdSznzrBdAFvAbhsoUGAK9o0QUMYy00IVbamUVTpBk,13601
101
+ recce/tasks/lineage.py,sha256=_PbY0ZkDr620U8V2olqoX_T9XA0-G8ILt_6m1Q5TfBs,541
102
+ recce/tasks/profile.py,sha256=gMgms9qvdDsihh2aSC6LvCm9ggah4Oq3xjvmCh_exrU,11352
103
+ recce/tasks/query.py,sha256=k3y_IK1_3D2j4Scw-70ccDjVMa-Oe9jqxlDyLHfjagw,12790
104
+ recce/tasks/rowcount.py,sha256=WZ1vNI0YJ40G-DBgx2apjNAhoQg1bvzrtBpUZFou1Nc,9908
105
+ recce/tasks/schema.py,sha256=s7CsmUoKNDx-WM87X_cCOpKieKxqEZITFzQTEq3ZckU,2432
106
+ recce/tasks/top_k.py,sha256=vY3VCBmg61E8I4V-9-hJOv5RCYCmhxl6sHiKR9Zv7eE,5521
107
+ recce/tasks/valuediff.py,sha256=QLv0zgM9pWibvjyfZHjkpGopY9qqlpU0-WdFB109MUQ,16418
108
+ recce/util/__init__.py,sha256=cDvL3WT32cJR9CUPIJmibwJoyYcB3ZaKBFbOZDyvqP8,95
109
+ recce/util/api_token.py,sha256=iLS3VzLlsTfbXBLDoPPelmVlj6UdcEtGmfxdFQxXXSg,3223
110
+ recce/util/breaking.py,sha256=ajCOWMR8Qw492wCiuz5_DKqpI3uoj_qHuJjvelEoSkw,13068
111
+ recce/util/cache.py,sha256=QB6wzxe0M3jNTwP0M27Ys8F2hF-oda4-LyXXG9THuZQ,646
112
+ recce/util/cll.py,sha256=p8BrsG_1Lm-jXO8n4ulUgFw13C4mN0WjCXZbihDxQrs,13253
113
+ recce/util/io.py,sha256=UTUDncG4habAZZSZ1Y7i7Zpzu6FBtsfWI3y96k-0zkc,3495
114
+ recce/util/lineage.py,sha256=0XXOO05eJ3GPUNX9V9GBQS2iRFXxWZJoJbV7w-jQ0t8,2470
115
+ recce/util/logger.py,sha256=6UgLFkRiur9jJfu2ZRdo4LUvMw4f75V-l-1HT1-sgKo,747
116
+ recce/util/onboarding_state.py,sha256=kwFirKlfXdl5WFkR_nmilqGKFyELNcSPMqYq-by35fk,1991
117
+ recce/util/perf_tracking.py,sha256=FjhrdbbXIgybxS_oPpFsJ9VUDR93d7bUs8VNNqpXNxw,2483
118
+ recce/util/pydantic_model.py,sha256=KumKuyCjbTzEMsKLE4-b-eZfp0gLhYDdmVtw1-hxiJw,587
119
+ recce/util/recce_cloud.py,sha256=8gv0NQENekHEOrzGB4S3D2Gv8RkaT9CQFNF0_oa9nno,17905
120
+ recce/util/singleton.py,sha256=1cU99I0f9tjuMQLMJyLsK1oK3fZJMsO5-TbRHAMXqds,627
121
+ recce/yaml/__init__.py,sha256=PAym5akbtL24Ag7VR7EW8SS2VINNaJU06esbfe-ek-U,1328
122
+ recce_cloud/__init__.py,sha256=e_B01o0WY1giaa2CxvkpvxT-naRhM2dDXOH7eB5pHoE,432
123
+ recce_cloud/artifact.py,sha256=C6q1i8d0JdTIVLcJY1ZEmJJ0uBz-0g3zVZD8ss0K1iI,1458
124
+ recce_cloud/cli.py,sha256=qKpDlzrBiWYxDI8ue2k9LVKiXLWfsgN-7aPVA--FeJk,11547
125
+ recce_cloud/upload.py,sha256=wtg9m3483LNWgQOgRcLahqoWYkbD4NBu9PWrDJZlbOg,8300
126
+ recce_cloud/api/__init__.py,sha256=HrGOh7wp_U3G3gOXyGjJo1WoDXrMvhwjw8VGO2aKNTw,562
127
+ recce_cloud/api/base.py,sha256=Qkc8xpfT0j5LNt97aRvRMlQi6PlfwwgdS6MwYXWxhhQ,3383
128
+ recce_cloud/api/client.py,sha256=LByXcj2yr9jqpYQIt3zXM6So1dq46j_0FitssBSelHA,5422
129
+ recce_cloud/api/exceptions.py,sha256=BSfuh7dGZsx1qDkr2ZhRIAoPo_eXkAIhyho5PrUX2yo,634
130
+ recce_cloud/api/factory.py,sha256=0hdo2jTdTlvd8cU7YTZFJJ2q3ybSssA2JKLr0bO1QmQ,2081
131
+ recce_cloud/api/github.py,sha256=GXUIlTXGeURI0qJnf1RmMuUdb6mdFn7VzUFme6QcGhA,2175
132
+ recce_cloud/api/gitlab.py,sha256=Z1zn9JFNsMl3rL3v4vJfaVP4Xrz1-pUcBJRcds5YP7Y,2469
133
+ recce_cloud/ci_providers/__init__.py,sha256=cB2bydn4QOMurJVfWhIN9uTD9gIyiBcYOloN-0TvMW4,328
134
+ recce_cloud/ci_providers/base.py,sha256=v8P_eZdMwkgo3vCIHoyu1vBfetJICUNKz3z8ezOgwl0,2577
135
+ recce_cloud/ci_providers/detector.py,sha256=GvZuPo7Gq8eKCxsgYiYjQ3CYu3icPbi0moAYflnLDOk,5056
136
+ recce_cloud/ci_providers/github_actions.py,sha256=Vs4_YuqBsccjUeiT1a-wQBz-7sq5TnoGFwPJXniua_w,4311
137
+ recce_cloud/ci_providers/gitlab_ci.py,sha256=nQa2gZClXzLQ2soSqIhY5vul8RNQF-j_P-0bheD5U4s,4175
138
+ recce_nightly-1.25.0.20251112a2066.dist-info/licenses/LICENSE,sha256=CQjjMy9aYPhfe8xG_bcpIfKtNkdxLZ5IOb8oPygtUhY,11343
139
+ tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
140
+ tests/test_cli.py,sha256=hT-KxF5PcVtNZ05HGsTrjec6WTDaD6vInCijJcCYiU8,9923
141
+ tests/test_cli_mcp_optional.py,sha256=w6Iwr22fheaOxw6vGXVZyvi0pw5uh8jDJKcdnd64-_o,1629
142
+ tests/test_cloud_listing_cli.py,sha256=77As9n0Sngdh53dfHkShmqDETMTOohlqw1xXO9cIago,14208
143
+ tests/test_config.py,sha256=ODDFe_XF6gphmSmmc422dGLBaCCmG-IjDzTkD5SJsJE,1557
144
+ tests/test_connect_to_cloud.py,sha256=b2fgV8L1iQBdEwh6RumMsIIyYg7GtMOMRz1dvE3WRPg,3059
145
+ tests/test_core.py,sha256=WgCFm8Au3YQI-V5UbZ6LA8irMNHRc7NWutIq2Mny0LE,6242
146
+ tests/test_dbt.py,sha256=VzXvdoJNwwEmKNhJJDNB1N_qZYwp1aoJQ1sLcoyRBmk,1316
147
+ tests/test_mcp_server.py,sha256=pXs2-ndezanGdDKj1fGp0lUFTmWipndBxKtsfbDRuDc,12365
148
+ tests/test_pull_request.py,sha256=HmZo5MoDaoKSgPwbLxJ3Ur3ajZ7IxhkzJxaOmhg6bwE,3562
149
+ tests/test_server.py,sha256=sq03awzG-kvLNJwHaZGDvVjd2uAs502XUKZ2nLNwvRQ,3391
150
+ tests/test_summary.py,sha256=oYhBbk2MJUERXXoWEQqn2AEQcteZk8_H9IrPexMAJsY,2971
151
+ tests/adapter/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
152
+ tests/adapter/dbt_adapter/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
153
+ tests/adapter/dbt_adapter/conftest.py,sha256=WlMVytJcyfLJlMBeYhpk8Q-nyCDR9x_7qgsy6Uh9ECw,386
154
+ tests/adapter/dbt_adapter/dbt_test_helper.py,sha256=o_7m0cnVeGwPwEFXBCx3Me5QqLzQMOBR3dXD-MS2eaM,10406
155
+ tests/adapter/dbt_adapter/test_dbt_adapter.py,sha256=Y5TSlqkXGjJC6hC7YYs45bnRht5aou_KLjPMjpAGxNM,830
156
+ tests/adapter/dbt_adapter/test_dbt_cll.py,sha256=BHVyqpm-0YaajblcJHzMyjrkK1b9oEv0PwtDEv3EwuI,28656
157
+ tests/adapter/dbt_adapter/test_selector.py,sha256=uKFm0QxrxG-xyUEXGobCMueCRUssgnZMyo-S1Nlk3_s,6856
158
+ tests/recce_cloud/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
159
+ tests/recce_cloud/test_ci_providers.py,sha256=dYjRJIE-YQtYH2W4sDoLkTGG_PY5dqEjDtPPp3KVGKs,14692
160
+ tests/recce_cloud/test_cli.py,sha256=JUT_aEA4bRoD0LIMlgs_sITY9i1uea5roQ_X_4QLrYk,13991
161
+ tests/recce_cloud/test_client.py,sha256=qYsmUZrvwfuVLVcTx6NoGiUlBEzFi89yHrl1E6q4yws,11231
162
+ tests/recce_cloud/test_platform_clients.py,sha256=32vnFNr6x8rqU-c6fJkQ554YnOXorlP4f_Nbb8VTiB4,11526
163
+ tests/tasks/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
164
+ tests/tasks/conftest.py,sha256=lyZFx4jEY3To3xVhfMQ-G45egYOCttKN2lxeyExACkY,157
165
+ tests/tasks/test_histogram.py,sha256=g69R2Ljvcd8RQTnq7EMZEa93_1vVWNe4ZLg990rWuyA,4088
166
+ tests/tasks/test_lineage.py,sha256=HODSP2_uSu98e4jV-t9TIOSrln_5mXd-6baKv9aEmws,1095
167
+ tests/tasks/test_preset_checks.py,sha256=fAro5kAv67YiXgRFj7hDAgZEd8fVSHW_VTapVDq4G04,1457
168
+ tests/tasks/test_profile.py,sha256=yDavc2-8AneOtkkPGCHJM0QUEYq6S8lJpQbQsJVfa_k,10233
169
+ tests/tasks/test_query.py,sha256=EkldbvckZkTOlm9b3y9zLzGIhlo1RShSsv-ycCjDHrg,4218
170
+ tests/tasks/test_row_count.py,sha256=21PaP2aq-x8-pqwzWHRT1sixhQ8g3CQNRWOZTTmbK0s,3151
171
+ tests/tasks/test_schema.py,sha256=7ds4Vx8ixaiIWDR49Lvjem4xlPkRP1cXazDRY3roUak,3121
172
+ tests/tasks/test_top_k.py,sha256=YR_GS__DJsbDlQVaEEdJvNQ3fh1VmV5Nb3G7lb0r6YM,1779
173
+ tests/tasks/test_valuediff.py,sha256=_xQJGgxsXoy2NYk_Z6Hsw2FlVh6zk2nN_iUueyRN1e8,2046
174
+ recce_nightly-1.25.0.20251112a2066.dist-info/METADATA,sha256=FtiL_-_AascbnENZIILZYWnJD_wnGjS5J-kmiFyKsSM,9629
175
+ recce_nightly-1.25.0.20251112a2066.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
176
+ recce_nightly-1.25.0.20251112a2066.dist-info/entry_points.txt,sha256=oqoY_IiwIqXbgrIsPnlqUqao2eiIeP2dprowkOlmeyg,40
177
+ recce_nightly-1.25.0.20251112a2066.dist-info/top_level.txt,sha256=93B6jXmAPRijPPNsN8mzzVPP9M_lFQynyEuh8HDoFXg,24
178
+ recce_nightly-1.25.0.20251112a2066.dist-info/RECORD,,
@@ -46,6 +46,7 @@ def assert_model(
46
46
  result: CllData,
47
47
  node_id,
48
48
  change_category=None,
49
+ impacted=None,
49
50
  parents=None,
50
51
  ):
51
52
  entry = result.nodes.get(node_id)
@@ -56,6 +57,10 @@ def assert_model(
56
57
  entry.change_category == change_category
57
58
  ), f"Node {node_id} change category mismatch: expected {change_category}, got {entry.change_category}"
58
59
 
60
+ assert (
61
+ entry.impacted == impacted
62
+ ), f"Node {node_id} impacted status mismatch: expected {impacted}, got {entry.impacted}"
63
+
59
64
 
60
65
  def assert_cll_contain_nodes(cll_data: CllData, nodes):
61
66
  assert len(nodes) == len(cll_data.nodes), "Model count mismatch"
@@ -391,13 +396,14 @@ def test_impact_radius_with_change_analysis_no_cll(dbt_test_helper):
391
396
  # breaking
392
397
  result = adapter.get_cll(change_analysis=True, no_cll=True, no_upstream=True)
393
398
  assert_cll_contain_nodes(result, ["model.model1", "model.model2", "model.model3", "model.model4"])
394
- assert_model(result, "model.model1", parents=[], change_category="non_breaking")
395
- assert_model(result, "model.model2", parents=[], change_category="breaking")
396
- assert_model(result, "model.model3", parents=["model.model2"], change_category=None)
397
- assert_model(result, "model.model4", parents=["model.model2"], change_category="partial_breaking")
399
+ assert_model(result, "model.model1", parents=[], change_category="non_breaking", impacted=False)
400
+ assert_model(result, "model.model2", parents=[], change_category="breaking", impacted=True)
401
+ assert_model(result, "model.model3", parents=["model.model2"], change_category=None, impacted=True)
402
+ assert_model(result, "model.model4", parents=["model.model2"], change_category="partial_breaking", impacted=True)
398
403
 
399
404
 
400
405
  def test_impact_radius_with_change_analysis_no_cll_2(dbt_test_helper):
406
+ # partial breaking
401
407
  dbt_test_helper.create_model(
402
408
  "model1",
403
409
  unique_id="model.model1",
@@ -406,6 +412,7 @@ def test_impact_radius_with_change_analysis_no_cll_2(dbt_test_helper):
406
412
  curr_columns={"c": "int"},
407
413
  base_columns={"c": "int"},
408
414
  )
415
+ # breaking
409
416
  dbt_test_helper.create_model(
410
417
  "model2",
411
418
  unique_id="model.model2",
@@ -415,6 +422,7 @@ def test_impact_radius_with_change_analysis_no_cll_2(dbt_test_helper):
415
422
  base_columns={"c": "int", "y": "int"},
416
423
  depends_on=["model.model1"],
417
424
  )
425
+ # no change
418
426
  dbt_test_helper.create_model(
419
427
  "model3",
420
428
  unique_id="model.model3",
@@ -424,6 +432,7 @@ def test_impact_radius_with_change_analysis_no_cll_2(dbt_test_helper):
424
432
  base_columns={"c": "int"},
425
433
  depends_on=["model.model2"],
426
434
  )
435
+ # partial breaking
427
436
  dbt_test_helper.create_model(
428
437
  "model4",
429
438
  unique_id="model.model4",
@@ -433,6 +442,7 @@ def test_impact_radius_with_change_analysis_no_cll_2(dbt_test_helper):
433
442
  base_columns={"year": "int"},
434
443
  depends_on=["model.model2"],
435
444
  )
445
+ # no change
436
446
  dbt_test_helper.create_model(
437
447
  "model5",
438
448
  unique_id="model.model5",
@@ -448,11 +458,11 @@ def test_impact_radius_with_change_analysis_no_cll_2(dbt_test_helper):
448
458
  # breaking
449
459
  result = adapter.get_cll(change_analysis=True, no_cll=True, no_upstream=True)
450
460
  assert_cll_contain_nodes(result, ["model.model1", "model.model2", "model.model3", "model.model4", "model.model5"])
451
- assert_model(result, "model.model1", parents=[], change_category="partial_breaking")
452
- assert_model(result, "model.model2", parents=["model.model1"], change_category="breaking")
453
- assert_model(result, "model.model3", parents=["model.model2"], change_category=None)
454
- assert_model(result, "model.model4", parents=["model.model2"], change_category="partial_breaking")
455
- assert_model(result, "model.model5", parents=["model.model1"])
461
+ assert_model(result, "model.model1", parents=[], change_category="partial_breaking", impacted=True)
462
+ assert_model(result, "model.model2", parents=["model.model1"], change_category="breaking", impacted=True)
463
+ assert_model(result, "model.model3", parents=["model.model2"], change_category=None, impacted=True)
464
+ assert_model(result, "model.model4", parents=["model.model2"], change_category="partial_breaking", impacted=True)
465
+ assert_model(result, "model.model5", parents=["model.model1"], impacted=True)
456
466
 
457
467
 
458
468
  def test_impact_radius_with_change_analysis_with_cll(dbt_test_helper):
@@ -506,10 +516,49 @@ def test_impact_radius_with_change_analysis_with_cll(dbt_test_helper):
506
516
  result = adapter.get_cll(change_analysis=True, no_upstream=True)
507
517
  assert_cll_contain_nodes(result, ["model.model1", "model.model2", "model.model3", "model.model4"])
508
518
  assert_cll_contain_columns(result, [("model.model4", "year")])
509
- assert_model(result, "model.model1", parents=[], change_category="non_breaking")
510
- assert_model(result, "model.model2", parents=[], change_category="breaking")
511
- assert_model(result, "model.model3", parents=["model.model2"], change_category=None)
512
- assert_model(result, "model.model4", parents=["model.model2"], change_category="partial_breaking")
519
+ assert_model(result, "model.model1", parents=[], change_category="non_breaking", impacted=False)
520
+ assert_model(result, "model.model2", parents=[], change_category="breaking", impacted=True)
521
+ assert_model(result, "model.model3", parents=["model.model2"], change_category=None, impacted=True)
522
+ assert_model(result, "model.model4", parents=["model.model2"], change_category="partial_breaking", impacted=True)
523
+
524
+
525
+ def test_impact_radius_with_change_analysis_with_cll_added_removed(dbt_test_helper):
526
+ # rename model
527
+ dbt_test_helper.create_model(
528
+ "model1",
529
+ unique_id="model.model1",
530
+ base_sql="select 1 as c",
531
+ base_columns={"c": "int"},
532
+ )
533
+ dbt_test_helper.create_model(
534
+ "model1_v2",
535
+ unique_id="model.model1_v2",
536
+ curr_sql="select 1 as c",
537
+ curr_columns={"c": "int"},
538
+ )
539
+ # change upstream
540
+ dbt_test_helper.create_model(
541
+ "model2",
542
+ unique_id="model.model2",
543
+ base_sql='select c from {{ ref("model1") }}',
544
+ base_columns={"c": "int"},
545
+ depends_on=["model.model1"],
546
+ )
547
+ dbt_test_helper.create_model(
548
+ "model2",
549
+ unique_id="model.model2",
550
+ curr_sql='select c from {{ ref("model1_v2") }}',
551
+ curr_columns={"c": "int"},
552
+ depends_on=["model.model1_v2"],
553
+ )
554
+
555
+ adapter: DbtAdapter = dbt_test_helper.context.adapter
556
+ result = adapter.get_cll(change_analysis=True, no_upstream=True)
557
+ assert_model(result, "model.model1_v2", parents=[], impacted=True)
558
+ assert_column(result, "model.model1_v2", "c", transformation_type="source", change_status="added", parents=[])
559
+ assert_model(result, "model.model2", parents=["model.model1_v2"], change_category="breaking", impacted=True)
560
+ assert_cll_contain_nodes(result, ["model.model1_v2", "model.model2"])
561
+ assert_cll_contain_columns(result, [("model.model1_v2", "c"), ("model.model2", "c")])
513
562
 
514
563
 
515
564
  def test_impact_radius_by_node_no_cll(dbt_test_helper):
@@ -604,7 +653,8 @@ def test_impact_radius_by_node_with_cll(dbt_test_helper):
604
653
  adapter: DbtAdapter = dbt_test_helper.context.adapter
605
654
 
606
655
  result = adapter.get_cll(node_id="model.model2", change_analysis=True, no_upstream=True)
607
- assert_model(result, "model.model2", parents=[], change_category="partial_breaking")
656
+ assert_model(result, "model.model2", parents=[], change_category="partial_breaking", impacted=False)
657
+ assert_model(result, "model.model3", parents=[("model.model2", "y")], impacted=True)
608
658
  assert_column(result, "model.model2", "y", transformation_type="source", parents=[], change_status="modified")
609
659
  assert_cll_contain_nodes(result, ["model.model2", "model.model3"])
610
660
  assert_cll_contain_columns(result, [("model.model2", "y"), ("model.model4", "y")])
@@ -612,7 +662,7 @@ def test_impact_radius_by_node_with_cll(dbt_test_helper):
612
662
  result = adapter.get_cll(node_id="model.model1", change_analysis=True, no_upstream=True)
613
663
  assert_cll_contain_nodes(result, ["model.model1"])
614
664
  assert_cll_contain_columns(result, [("model.model1", "d")])
615
- assert_model(result, "model.model1", parents=[], change_category="non_breaking")
665
+ assert_model(result, "model.model1", parents=[], change_category="non_breaking", impacted=False)
616
666
  assert_column(result, "model.model1", "d", transformation_type="source", parents=[], change_status="added")
617
667
 
618
668
 
@@ -658,9 +708,10 @@ def test_impact_radius_by_node_with_cll_2(dbt_test_helper):
658
708
  adapter: DbtAdapter = dbt_test_helper.context.adapter
659
709
 
660
710
  result = adapter.get_cll(node_id="model.model2", change_analysis=True, no_upstream=True)
661
- assert_model(result, "model.model2", parents=[], change_category="breaking")
711
+ assert_model(result, "model.model2", parents=[], change_category="breaking", impacted=True)
662
712
  assert_column(result, "model.model2", "y", transformation_type="source", parents=[], change_status="modified")
663
- assert_model(result, "model.model3", parents=["model.model2", ("model.model2", "y")])
713
+ assert_model(result, "model.model3", parents=["model.model2", ("model.model2", "y")], impacted=True)
714
+ assert_model(result, "model.model4", parents=["model.model2"], impacted=True)
664
715
  assert_column(result, "model.model4", "y", transformation_type="passthrough", parents=[("model.model2", "y")])
665
716
  assert_cll_contain_nodes(result, ["model.model2", "model.model3", "model.model4"])
666
717
  assert_cll_contain_columns(result, [("model.model2", "d"), ("model.model2", "y"), ("model.model4", "y")])
File without changes