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
tests/test_state.py DELETED
@@ -1,123 +0,0 @@
1
- # add the RecceState test case
2
- import os
3
- import unittest
4
- from datetime import datetime
5
-
6
- from recce.core import RecceContext
7
- from recce.models import Check, Run
8
- from recce.state import RecceState, ArtifactsRoot, RecceStateLoader
9
-
10
- current_dir = os.path.dirname(os.path.abspath(__file__))
11
-
12
-
13
- class TestRecceState(unittest.TestCase):
14
- def test_merge_checks(self):
15
- check1 = Check(name='test1', description='', type='query')
16
- check2 = Check(name='test2', description='', type='query',
17
- updated_at=datetime(2000, 1, 1))
18
- check2_2 = Check(name='test2_2', description='', type='query',
19
- updated_at=datetime(2020, 1, 1),
20
- check_id=check2.check_id)
21
- check3 = Check(name='test3', description='', type='query')
22
-
23
- context = RecceContext()
24
- state = RecceState(checks=[check1], runs=[])
25
- context.import_state(state)
26
- self.assertEqual(1, len(context.checks))
27
- self.assertEqual(check1.name, context.checks[0].name)
28
-
29
- context = RecceContext(checks=[check1, check2])
30
- state = RecceState(checks=[check1, check2_2, check3], runs=[])
31
- context.import_state(state)
32
- self.assertEqual(3, len(context.checks))
33
- self.assertEqual(check2_2.name, context.checks[1].name)
34
-
35
- def test_merge_preset_checks(self):
36
- check1 = Check(name='test1', description='test1', type='query', params=dict(foo='bar'),
37
- updated_at=datetime(2000, 1, 1), is_preset=True)
38
- check2 = Check(name='test2', description='test2', type='query', params=dict(foo='bar'),
39
- updated_at=datetime(2001, 1, 1), is_preset=True)
40
-
41
- context = RecceContext(checks=[check1])
42
- state = RecceState(checks=[check2], runs=[])
43
- context.import_state(state)
44
- self.assertEqual(1, len(context.checks))
45
- self.assertEqual(check2.name, context.checks[0].name)
46
-
47
- context = RecceContext(checks=[check2])
48
- state = RecceState(checks=[check1], runs=[])
49
- context.import_state(state)
50
- self.assertEqual(1, len(context.checks))
51
- self.assertEqual(check2.name, context.checks[0].name)
52
-
53
- def test_revert_checks(self):
54
- check1 = Check(name='test1', description='', type='query')
55
- check2 = Check(name='test2', description='', type='query')
56
- check2_2 = Check(name='test2_2', description='', type='query', check_id=check2.check_id)
57
- check3 = Check(name='test3', description='', type='query')
58
-
59
- context = RecceContext(checks=[check1, check2])
60
- state = RecceState(checks=[check2_2, check3], runs=[])
61
- context.import_state(state, merge=False)
62
- self.assertEqual(2, len(context.checks))
63
- self.assertEqual(check2_2.name, context.checks[0].name)
64
-
65
- def test_merge_runs(self):
66
- run1 = Run(type='query')
67
- run2 = Run(type='query')
68
- run3 = Run(type='query')
69
-
70
- context = RecceContext(runs=[])
71
- state = RecceState(runs=[run1])
72
- context.import_state(state)
73
- self.assertEqual(1, len(context.runs))
74
-
75
- context = RecceContext(runs=[run1, run2])
76
- state = RecceState(runs=[run2, run3])
77
- context.import_state(state)
78
- self.assertEqual(3, len(context.runs))
79
-
80
- def test_merge_dbt_artifacts(self):
81
- import json
82
- import os
83
- with open(os.path.join(current_dir, 'manifest.json'), 'r') as f:
84
- manifest = json.load(f)
85
- manifest['metadata']['generated_at'] = '2000-01-01T00:00:00Z'
86
- artifacts = ArtifactsRoot(
87
- base=dict(
88
- manifest=manifest,
89
- ),
90
- current=dict(
91
- manifest=manifest,
92
- ),
93
- )
94
-
95
- from tests.adapter.dbt_adapter.dbt_test_helper import DbtTestHelper
96
- adapter = DbtTestHelper().adapter
97
- adapter.import_artifacts(artifacts)
98
- self.assertNotEqual(adapter.base_manifest.metadata.invocation_id, manifest.get('metadata').get('invocation_id'))
99
-
100
- manifest['metadata']['generated_at'] = '2099-01-01T00:00:00Z'
101
- adapter.import_artifacts(artifacts)
102
- self.assertEqual(adapter.base_manifest.metadata.invocation_id, manifest.get('metadata').get('invocation_id'))
103
-
104
- def test_state_loader(self):
105
- context = RecceContext()
106
-
107
- # copy ./recce_state.json to temp and open
108
-
109
- # use library to create a temp file in the context
110
- import tempfile
111
- import shutil
112
- import os
113
-
114
- with tempfile.NamedTemporaryFile() as f:
115
- # copy ./recce_state.json to temp file
116
- current_dir = os.path.dirname(os.path.abspath(__file__))
117
- state_file = os.path.join(current_dir, 'recce_state.json')
118
- shutil.copy(state_file, f.name)
119
-
120
- # load the state file
121
- state_loader = RecceStateLoader(state_file=f.name)
122
- state = state_loader.load()
123
- assert len(state.runs) == 17
tests/test_summary.py DELETED
@@ -1,57 +0,0 @@
1
- import os
2
- import unittest
3
-
4
- from recce.adapter.dbt_adapter import load_manifest, DbtAdapter, DbtVersion
5
- from recce.core import RecceContext, set_default_context
6
- from recce.summary import generate_summary_metadata, _build_lineage_graph, generate_mermaid_lineage_graph
7
-
8
- current_dir = os.path.dirname(os.path.abspath(__file__))
9
- base_manifest_dir = os.path.join(current_dir, 'data', 'manifest', 'base')
10
- pr2_manifest_dir = os.path.join(current_dir, 'data', 'manifest', 'pr2') # Pull Request 2l
11
-
12
- dbt_version = DbtVersion()
13
-
14
-
15
- @unittest.skipIf(dbt_version < '1.8.1', "Dbt version is less than 1.8.1")
16
- def test_generate_summary_metadata():
17
- manifest = load_manifest(path=os.path.join(current_dir, 'manifest.json'))
18
- assert manifest is not None
19
- dbt_adapter = DbtAdapter(curr_manifest=manifest)
20
- curr_lineage = dbt_adapter.get_lineage()
21
- base_lineage = dbt_adapter.get_lineage()
22
-
23
- # Summary with no changes
24
- generate_summary_metadata(curr_lineage, base_lineage)
25
-
26
- base_manifest = load_manifest(path=os.path.join(base_manifest_dir, 'manifest.json'))
27
- curr_manifest = load_manifest(path=os.path.join(pr2_manifest_dir, 'manifest.json'))
28
- dbt_adapter = DbtAdapter(curr_manifest=curr_manifest, base_manifest=base_manifest)
29
- curr_lineage = dbt_adapter.get_lineage()
30
- base_lineage = dbt_adapter.get_lineage(base=True)
31
- generate_summary_metadata(curr_lineage, base_lineage)
32
-
33
-
34
- @unittest.skipIf(dbt_version < 'v1.8.1', "Dbt version is less than 1.8.1")
35
- def test_build_lineage_graph():
36
- base_manifest = load_manifest(path=os.path.join(base_manifest_dir, 'manifest.json'))
37
- curr_manifest = load_manifest(path=os.path.join(pr2_manifest_dir, 'manifest.json'))
38
- dbt_adapter = DbtAdapter(curr_manifest=curr_manifest, base_manifest=base_manifest)
39
- curr_lineage = dbt_adapter.get_lineage()
40
- base_lineage = dbt_adapter.get_lineage(base=True)
41
-
42
- lineage_graph = _build_lineage_graph(curr_lineage, base_lineage)
43
- assert len(lineage_graph.modified_set) == 1
44
-
45
-
46
- @unittest.skipIf(dbt_version < 'v1.8.1', "Dbt version is less than 1.8.1")
47
- def test_generate_mermaid_lineage_graph():
48
- set_default_context(RecceContext())
49
- base_manifest = load_manifest(path=os.path.join(base_manifest_dir, 'manifest.json'))
50
- curr_manifest = load_manifest(path=os.path.join(pr2_manifest_dir, 'manifest.json'))
51
- dbt_adapter = DbtAdapter(curr_manifest=curr_manifest, base_manifest=base_manifest)
52
- curr_lineage = dbt_adapter.get_lineage()
53
- base_lineage = dbt_adapter.get_lineage(base=True)
54
- graph = _build_lineage_graph(curr_lineage, base_lineage)
55
- mermaid_content, is_empty_graph, is_partial_graph = generate_mermaid_lineage_graph(graph)
56
- assert is_empty_graph is False
57
- assert is_partial_graph is False