dvt-core 0.58.6__cp311-cp311-macosx_10_9_x86_64.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 (324) hide show
  1. dbt/__init__.py +7 -0
  2. dbt/_pydantic_shim.py +26 -0
  3. dbt/artifacts/__init__.py +0 -0
  4. dbt/artifacts/exceptions/__init__.py +1 -0
  5. dbt/artifacts/exceptions/schemas.py +31 -0
  6. dbt/artifacts/resources/__init__.py +116 -0
  7. dbt/artifacts/resources/base.py +67 -0
  8. dbt/artifacts/resources/types.py +93 -0
  9. dbt/artifacts/resources/v1/analysis.py +10 -0
  10. dbt/artifacts/resources/v1/catalog.py +23 -0
  11. dbt/artifacts/resources/v1/components.py +274 -0
  12. dbt/artifacts/resources/v1/config.py +277 -0
  13. dbt/artifacts/resources/v1/documentation.py +11 -0
  14. dbt/artifacts/resources/v1/exposure.py +51 -0
  15. dbt/artifacts/resources/v1/function.py +52 -0
  16. dbt/artifacts/resources/v1/generic_test.py +31 -0
  17. dbt/artifacts/resources/v1/group.py +21 -0
  18. dbt/artifacts/resources/v1/hook.py +11 -0
  19. dbt/artifacts/resources/v1/macro.py +29 -0
  20. dbt/artifacts/resources/v1/metric.py +172 -0
  21. dbt/artifacts/resources/v1/model.py +145 -0
  22. dbt/artifacts/resources/v1/owner.py +10 -0
  23. dbt/artifacts/resources/v1/saved_query.py +111 -0
  24. dbt/artifacts/resources/v1/seed.py +41 -0
  25. dbt/artifacts/resources/v1/semantic_layer_components.py +72 -0
  26. dbt/artifacts/resources/v1/semantic_model.py +314 -0
  27. dbt/artifacts/resources/v1/singular_test.py +14 -0
  28. dbt/artifacts/resources/v1/snapshot.py +91 -0
  29. dbt/artifacts/resources/v1/source_definition.py +84 -0
  30. dbt/artifacts/resources/v1/sql_operation.py +10 -0
  31. dbt/artifacts/resources/v1/unit_test_definition.py +77 -0
  32. dbt/artifacts/schemas/__init__.py +0 -0
  33. dbt/artifacts/schemas/base.py +191 -0
  34. dbt/artifacts/schemas/batch_results.py +24 -0
  35. dbt/artifacts/schemas/catalog/__init__.py +11 -0
  36. dbt/artifacts/schemas/catalog/v1/__init__.py +0 -0
  37. dbt/artifacts/schemas/catalog/v1/catalog.py +59 -0
  38. dbt/artifacts/schemas/freshness/__init__.py +1 -0
  39. dbt/artifacts/schemas/freshness/v3/__init__.py +0 -0
  40. dbt/artifacts/schemas/freshness/v3/freshness.py +158 -0
  41. dbt/artifacts/schemas/manifest/__init__.py +2 -0
  42. dbt/artifacts/schemas/manifest/v12/__init__.py +0 -0
  43. dbt/artifacts/schemas/manifest/v12/manifest.py +211 -0
  44. dbt/artifacts/schemas/results.py +147 -0
  45. dbt/artifacts/schemas/run/__init__.py +2 -0
  46. dbt/artifacts/schemas/run/v5/__init__.py +0 -0
  47. dbt/artifacts/schemas/run/v5/run.py +184 -0
  48. dbt/artifacts/schemas/upgrades/__init__.py +4 -0
  49. dbt/artifacts/schemas/upgrades/upgrade_manifest.py +174 -0
  50. dbt/artifacts/schemas/upgrades/upgrade_manifest_dbt_version.py +2 -0
  51. dbt/artifacts/utils/validation.py +153 -0
  52. dbt/cli/__init__.py +1 -0
  53. dbt/cli/context.py +17 -0
  54. dbt/cli/exceptions.py +57 -0
  55. dbt/cli/flags.py +560 -0
  56. dbt/cli/main.py +2403 -0
  57. dbt/cli/option_types.py +121 -0
  58. dbt/cli/options.py +80 -0
  59. dbt/cli/params.py +844 -0
  60. dbt/cli/requires.py +490 -0
  61. dbt/cli/resolvers.py +50 -0
  62. dbt/cli/types.py +40 -0
  63. dbt/clients/__init__.py +0 -0
  64. dbt/clients/checked_load.py +83 -0
  65. dbt/clients/git.py +164 -0
  66. dbt/clients/jinja.py +206 -0
  67. dbt/clients/jinja_static.py +245 -0
  68. dbt/clients/registry.py +192 -0
  69. dbt/clients/yaml_helper.py +68 -0
  70. dbt/compilation.py +876 -0
  71. dbt/compute/__init__.py +14 -0
  72. dbt/compute/engines/__init__.py +12 -0
  73. dbt/compute/engines/spark_engine.cpython-311-darwin.so +0 -0
  74. dbt/compute/engines/spark_engine.py +642 -0
  75. dbt/compute/federated_executor.cpython-311-darwin.so +0 -0
  76. dbt/compute/federated_executor.py +1080 -0
  77. dbt/compute/filter_pushdown.cpython-311-darwin.so +0 -0
  78. dbt/compute/filter_pushdown.py +273 -0
  79. dbt/compute/jar_provisioning.cpython-311-darwin.so +0 -0
  80. dbt/compute/jar_provisioning.py +255 -0
  81. dbt/compute/java_compat.cpython-311-darwin.so +0 -0
  82. dbt/compute/java_compat.py +689 -0
  83. dbt/compute/jdbc_utils.cpython-311-darwin.so +0 -0
  84. dbt/compute/jdbc_utils.py +678 -0
  85. dbt/compute/metadata/__init__.py +40 -0
  86. dbt/compute/metadata/adapters_registry.cpython-311-darwin.so +0 -0
  87. dbt/compute/metadata/adapters_registry.py +370 -0
  88. dbt/compute/metadata/registry.cpython-311-darwin.so +0 -0
  89. dbt/compute/metadata/registry.py +674 -0
  90. dbt/compute/metadata/store.cpython-311-darwin.so +0 -0
  91. dbt/compute/metadata/store.py +1499 -0
  92. dbt/compute/smart_selector.cpython-311-darwin.so +0 -0
  93. dbt/compute/smart_selector.py +377 -0
  94. dbt/compute/strategies/__init__.py +55 -0
  95. dbt/compute/strategies/base.cpython-311-darwin.so +0 -0
  96. dbt/compute/strategies/base.py +165 -0
  97. dbt/compute/strategies/dataproc.cpython-311-darwin.so +0 -0
  98. dbt/compute/strategies/dataproc.py +207 -0
  99. dbt/compute/strategies/emr.cpython-311-darwin.so +0 -0
  100. dbt/compute/strategies/emr.py +203 -0
  101. dbt/compute/strategies/local.cpython-311-darwin.so +0 -0
  102. dbt/compute/strategies/local.py +443 -0
  103. dbt/compute/strategies/standalone.cpython-311-darwin.so +0 -0
  104. dbt/compute/strategies/standalone.py +262 -0
  105. dbt/config/__init__.py +4 -0
  106. dbt/config/catalogs.py +94 -0
  107. dbt/config/compute.cpython-311-darwin.so +0 -0
  108. dbt/config/compute.py +513 -0
  109. dbt/config/dvt_profile.cpython-311-darwin.so +0 -0
  110. dbt/config/dvt_profile.py +342 -0
  111. dbt/config/profile.py +422 -0
  112. dbt/config/project.py +873 -0
  113. dbt/config/project_utils.py +28 -0
  114. dbt/config/renderer.py +231 -0
  115. dbt/config/runtime.py +553 -0
  116. dbt/config/selectors.py +208 -0
  117. dbt/config/utils.py +77 -0
  118. dbt/constants.py +28 -0
  119. dbt/context/__init__.py +0 -0
  120. dbt/context/base.py +745 -0
  121. dbt/context/configured.py +135 -0
  122. dbt/context/context_config.py +382 -0
  123. dbt/context/docs.py +82 -0
  124. dbt/context/exceptions_jinja.py +178 -0
  125. dbt/context/macro_resolver.py +195 -0
  126. dbt/context/macros.py +171 -0
  127. dbt/context/manifest.py +72 -0
  128. dbt/context/providers.py +2249 -0
  129. dbt/context/query_header.py +13 -0
  130. dbt/context/secret.py +58 -0
  131. dbt/context/target.py +74 -0
  132. dbt/contracts/__init__.py +0 -0
  133. dbt/contracts/files.py +413 -0
  134. dbt/contracts/graph/__init__.py +0 -0
  135. dbt/contracts/graph/manifest.py +1904 -0
  136. dbt/contracts/graph/metrics.py +97 -0
  137. dbt/contracts/graph/model_config.py +70 -0
  138. dbt/contracts/graph/node_args.py +42 -0
  139. dbt/contracts/graph/nodes.py +1806 -0
  140. dbt/contracts/graph/semantic_manifest.py +232 -0
  141. dbt/contracts/graph/unparsed.py +811 -0
  142. dbt/contracts/project.py +417 -0
  143. dbt/contracts/results.py +53 -0
  144. dbt/contracts/selection.py +23 -0
  145. dbt/contracts/sql.py +85 -0
  146. dbt/contracts/state.py +68 -0
  147. dbt/contracts/util.py +46 -0
  148. dbt/deprecations.py +348 -0
  149. dbt/deps/__init__.py +0 -0
  150. dbt/deps/base.py +152 -0
  151. dbt/deps/git.py +195 -0
  152. dbt/deps/local.py +79 -0
  153. dbt/deps/registry.py +130 -0
  154. dbt/deps/resolver.py +149 -0
  155. dbt/deps/tarball.py +120 -0
  156. dbt/docs/source/_ext/dbt_click.py +119 -0
  157. dbt/docs/source/conf.py +32 -0
  158. dbt/env_vars.py +64 -0
  159. dbt/event_time/event_time.py +40 -0
  160. dbt/event_time/sample_window.py +60 -0
  161. dbt/events/__init__.py +15 -0
  162. dbt/events/base_types.py +36 -0
  163. dbt/events/core_types_pb2.py +2 -0
  164. dbt/events/logging.py +108 -0
  165. dbt/events/types.py +2516 -0
  166. dbt/exceptions.py +1486 -0
  167. dbt/flags.py +89 -0
  168. dbt/graph/__init__.py +11 -0
  169. dbt/graph/cli.py +249 -0
  170. dbt/graph/graph.py +172 -0
  171. dbt/graph/queue.py +214 -0
  172. dbt/graph/selector.py +374 -0
  173. dbt/graph/selector_methods.py +975 -0
  174. dbt/graph/selector_spec.py +222 -0
  175. dbt/graph/thread_pool.py +18 -0
  176. dbt/hooks.py +21 -0
  177. dbt/include/README.md +49 -0
  178. dbt/include/__init__.py +3 -0
  179. dbt/include/data/adapters_registry.duckdb +0 -0
  180. dbt/include/data/build_registry.py +242 -0
  181. dbt/include/data/csv/adapter_queries.csv +33 -0
  182. dbt/include/data/csv/syntax_rules.csv +9 -0
  183. dbt/include/data/csv/type_mappings_bigquery.csv +28 -0
  184. dbt/include/data/csv/type_mappings_databricks.csv +30 -0
  185. dbt/include/data/csv/type_mappings_mysql.csv +40 -0
  186. dbt/include/data/csv/type_mappings_oracle.csv +30 -0
  187. dbt/include/data/csv/type_mappings_postgres.csv +56 -0
  188. dbt/include/data/csv/type_mappings_redshift.csv +33 -0
  189. dbt/include/data/csv/type_mappings_snowflake.csv +38 -0
  190. dbt/include/data/csv/type_mappings_sqlserver.csv +35 -0
  191. dbt/include/starter_project/.gitignore +4 -0
  192. dbt/include/starter_project/README.md +15 -0
  193. dbt/include/starter_project/__init__.py +3 -0
  194. dbt/include/starter_project/analyses/.gitkeep +0 -0
  195. dbt/include/starter_project/dbt_project.yml +36 -0
  196. dbt/include/starter_project/macros/.gitkeep +0 -0
  197. dbt/include/starter_project/models/example/my_first_dbt_model.sql +27 -0
  198. dbt/include/starter_project/models/example/my_second_dbt_model.sql +6 -0
  199. dbt/include/starter_project/models/example/schema.yml +21 -0
  200. dbt/include/starter_project/seeds/.gitkeep +0 -0
  201. dbt/include/starter_project/snapshots/.gitkeep +0 -0
  202. dbt/include/starter_project/tests/.gitkeep +0 -0
  203. dbt/internal_deprecations.py +26 -0
  204. dbt/jsonschemas/__init__.py +3 -0
  205. dbt/jsonschemas/jsonschemas.py +309 -0
  206. dbt/jsonschemas/project/0.0.110.json +4717 -0
  207. dbt/jsonschemas/project/0.0.85.json +2015 -0
  208. dbt/jsonschemas/resources/0.0.110.json +2636 -0
  209. dbt/jsonschemas/resources/0.0.85.json +2536 -0
  210. dbt/jsonschemas/resources/latest.json +6773 -0
  211. dbt/links.py +4 -0
  212. dbt/materializations/__init__.py +0 -0
  213. dbt/materializations/incremental/__init__.py +0 -0
  214. dbt/materializations/incremental/microbatch.py +236 -0
  215. dbt/mp_context.py +8 -0
  216. dbt/node_types.py +37 -0
  217. dbt/parser/__init__.py +23 -0
  218. dbt/parser/analysis.py +21 -0
  219. dbt/parser/base.py +548 -0
  220. dbt/parser/common.py +266 -0
  221. dbt/parser/docs.py +52 -0
  222. dbt/parser/fixtures.py +51 -0
  223. dbt/parser/functions.py +30 -0
  224. dbt/parser/generic_test.py +100 -0
  225. dbt/parser/generic_test_builders.py +333 -0
  226. dbt/parser/hooks.py +118 -0
  227. dbt/parser/macros.py +137 -0
  228. dbt/parser/manifest.py +2204 -0
  229. dbt/parser/models.py +573 -0
  230. dbt/parser/partial.py +1178 -0
  231. dbt/parser/read_files.py +445 -0
  232. dbt/parser/schema_generic_tests.py +422 -0
  233. dbt/parser/schema_renderer.py +111 -0
  234. dbt/parser/schema_yaml_readers.py +935 -0
  235. dbt/parser/schemas.py +1466 -0
  236. dbt/parser/search.py +149 -0
  237. dbt/parser/seeds.py +28 -0
  238. dbt/parser/singular_test.py +20 -0
  239. dbt/parser/snapshots.py +44 -0
  240. dbt/parser/sources.py +558 -0
  241. dbt/parser/sql.py +62 -0
  242. dbt/parser/unit_tests.py +621 -0
  243. dbt/plugins/__init__.py +20 -0
  244. dbt/plugins/contracts.py +9 -0
  245. dbt/plugins/exceptions.py +2 -0
  246. dbt/plugins/manager.py +163 -0
  247. dbt/plugins/manifest.py +21 -0
  248. dbt/profiler.py +20 -0
  249. dbt/py.typed +1 -0
  250. dbt/query_analyzer.cpython-311-darwin.so +0 -0
  251. dbt/query_analyzer.py +410 -0
  252. dbt/runners/__init__.py +2 -0
  253. dbt/runners/exposure_runner.py +7 -0
  254. dbt/runners/no_op_runner.py +45 -0
  255. dbt/runners/saved_query_runner.py +7 -0
  256. dbt/selected_resources.py +8 -0
  257. dbt/task/__init__.py +0 -0
  258. dbt/task/base.py +503 -0
  259. dbt/task/build.py +197 -0
  260. dbt/task/clean.py +56 -0
  261. dbt/task/clone.py +161 -0
  262. dbt/task/compile.py +150 -0
  263. dbt/task/compute.cpython-311-darwin.so +0 -0
  264. dbt/task/compute.py +458 -0
  265. dbt/task/debug.py +505 -0
  266. dbt/task/deps.py +280 -0
  267. dbt/task/docs/__init__.py +3 -0
  268. dbt/task/docs/api/__init__.py +23 -0
  269. dbt/task/docs/api/catalog.cpython-311-darwin.so +0 -0
  270. dbt/task/docs/api/catalog.py +204 -0
  271. dbt/task/docs/api/lineage.cpython-311-darwin.so +0 -0
  272. dbt/task/docs/api/lineage.py +234 -0
  273. dbt/task/docs/api/profile.cpython-311-darwin.so +0 -0
  274. dbt/task/docs/api/profile.py +204 -0
  275. dbt/task/docs/api/spark.cpython-311-darwin.so +0 -0
  276. dbt/task/docs/api/spark.py +186 -0
  277. dbt/task/docs/generate.py +947 -0
  278. dbt/task/docs/index.html +250 -0
  279. dbt/task/docs/serve.cpython-311-darwin.so +0 -0
  280. dbt/task/docs/serve.py +174 -0
  281. dbt/task/dvt_output.py +362 -0
  282. dbt/task/dvt_run.py +204 -0
  283. dbt/task/freshness.py +322 -0
  284. dbt/task/function.py +121 -0
  285. dbt/task/group_lookup.py +46 -0
  286. dbt/task/init.cpython-311-darwin.so +0 -0
  287. dbt/task/init.py +604 -0
  288. dbt/task/java.cpython-311-darwin.so +0 -0
  289. dbt/task/java.py +316 -0
  290. dbt/task/list.py +236 -0
  291. dbt/task/metadata.cpython-311-darwin.so +0 -0
  292. dbt/task/metadata.py +804 -0
  293. dbt/task/printer.py +175 -0
  294. dbt/task/profile.cpython-311-darwin.so +0 -0
  295. dbt/task/profile.py +1307 -0
  296. dbt/task/profile_serve.py +615 -0
  297. dbt/task/retract.py +438 -0
  298. dbt/task/retry.py +175 -0
  299. dbt/task/run.py +1387 -0
  300. dbt/task/run_operation.py +141 -0
  301. dbt/task/runnable.py +758 -0
  302. dbt/task/seed.py +103 -0
  303. dbt/task/show.py +149 -0
  304. dbt/task/snapshot.py +56 -0
  305. dbt/task/spark.cpython-311-darwin.so +0 -0
  306. dbt/task/spark.py +414 -0
  307. dbt/task/sql.py +110 -0
  308. dbt/task/target_sync.cpython-311-darwin.so +0 -0
  309. dbt/task/target_sync.py +766 -0
  310. dbt/task/test.py +464 -0
  311. dbt/tests/fixtures/__init__.py +1 -0
  312. dbt/tests/fixtures/project.py +620 -0
  313. dbt/tests/util.py +651 -0
  314. dbt/tracking.py +529 -0
  315. dbt/utils/__init__.py +3 -0
  316. dbt/utils/artifact_upload.py +151 -0
  317. dbt/utils/utils.py +408 -0
  318. dbt/version.py +270 -0
  319. dvt_cli/__init__.py +72 -0
  320. dvt_core-0.58.6.dist-info/METADATA +288 -0
  321. dvt_core-0.58.6.dist-info/RECORD +324 -0
  322. dvt_core-0.58.6.dist-info/WHEEL +5 -0
  323. dvt_core-0.58.6.dist-info/entry_points.txt +2 -0
  324. dvt_core-0.58.6.dist-info/top_level.txt +2 -0
dbt/task/java.py ADDED
@@ -0,0 +1,316 @@
1
+ """
2
+ Java Task Module
3
+
4
+ Handles DVT java management commands:
5
+ - check: Check Java and show compatibility with installed PySpark
6
+ - search: Find ALL Java installations on the system
7
+ - set: Interactive selection to set JAVA_HOME
8
+ - install: Guide for installing compatible Java
9
+
10
+ v0.51.3: New module for comprehensive Java management.
11
+ """
12
+
13
+ import os
14
+ import platform
15
+ from typing import List, Optional
16
+
17
+ import click
18
+
19
+ from dbt.compute.java_compat import (
20
+ JavaInstallation,
21
+ find_all_java_installations,
22
+ get_current_java,
23
+ get_pyspark_info,
24
+ get_pyspark_versions_for_java,
25
+ check_java_pyspark_compatibility,
26
+ set_java_home_persistent,
27
+ PYSPARK_JAVA_COMPATIBILITY,
28
+ )
29
+
30
+
31
+ class JavaTask:
32
+ """Task for managing Java installations."""
33
+
34
+ def check(self) -> bool:
35
+ """
36
+ Check current Java installation and PySpark compatibility.
37
+
38
+ Returns:
39
+ bool: True if Java is compatible with installed PySpark
40
+ """
41
+ click.echo()
42
+ click.echo(click.style("Java Status", fg="cyan", bold=True))
43
+ click.echo("-" * 40)
44
+
45
+ # Get current Java
46
+ java = get_current_java()
47
+ if java:
48
+ click.echo(f" JAVA_HOME: {java.path}")
49
+ click.echo(f" Version: Java {java.version}")
50
+ click.echo(f" Vendor: {java.vendor}")
51
+ click.echo(f" Details: {java.version_string}")
52
+ else:
53
+ click.echo(click.style(" ✗ Java not found!", fg="red"))
54
+ click.echo()
55
+ click.echo(" Run 'dvt java search' to find Java installations")
56
+ click.echo(" Run 'dvt java install' for installation guide")
57
+ click.echo()
58
+ return False
59
+
60
+ click.echo()
61
+ click.echo(click.style("PySpark Status", fg="cyan", bold=True))
62
+ click.echo("-" * 40)
63
+
64
+ # Get PySpark info
65
+ pyspark = get_pyspark_info()
66
+ if pyspark:
67
+ click.echo(f" Version: {pyspark.version}")
68
+ click.echo(f" Required Java: {', '.join(str(v) for v in pyspark.java_supported)}")
69
+ click.echo(f" Recommended: Java {pyspark.java_recommended}")
70
+ else:
71
+ click.echo(click.style(" ✗ PySpark not installed!", fg="red"))
72
+ click.echo()
73
+ click.echo(" Install with: pip install pyspark")
74
+ click.echo()
75
+ return False
76
+
77
+ click.echo()
78
+ click.echo(click.style("Compatibility", fg="cyan", bold=True))
79
+ click.echo("-" * 40)
80
+
81
+ # Check compatibility
82
+ is_compat, msg = check_java_pyspark_compatibility(java.version, pyspark.major_minor)
83
+ if is_compat:
84
+ click.echo(click.style(f" ✓ {msg}", fg="green"))
85
+ else:
86
+ click.echo(click.style(f" ✗ {msg}", fg="red"))
87
+ click.echo()
88
+ click.echo(" Run 'dvt java set' to select a compatible Java version")
89
+
90
+ click.echo()
91
+ return is_compat
92
+
93
+ def search(self) -> List[JavaInstallation]:
94
+ """
95
+ Find all Java installations on the system.
96
+
97
+ Returns:
98
+ List of JavaInstallation objects
99
+ """
100
+ click.echo()
101
+ click.echo(click.style("Searching for Java installations...", fg="cyan"))
102
+ click.echo()
103
+
104
+ installations = find_all_java_installations()
105
+
106
+ if not installations:
107
+ click.echo(click.style("No Java installations found.", fg="yellow"))
108
+ click.echo()
109
+ click.echo("Run 'dvt java install' for installation guide")
110
+ click.echo()
111
+ return []
112
+
113
+ click.echo(f"Found {len(installations)} Java installation(s):")
114
+ click.echo()
115
+
116
+ # Get PySpark info for compatibility display
117
+ pyspark = get_pyspark_info()
118
+
119
+ for i, inst in enumerate(installations, 1):
120
+ # Mark current
121
+ current_marker = click.style(" * CURRENT", fg="green") if inst.is_current else ""
122
+
123
+ # Check compatibility with installed PySpark
124
+ if pyspark:
125
+ is_compat, _ = check_java_pyspark_compatibility(inst.version, pyspark.major_minor)
126
+ compat_marker = click.style(" ✓", fg="green") if is_compat else click.style(" ✗", fg="red")
127
+ else:
128
+ compat_marker = ""
129
+
130
+ click.echo(f" [{i}] Java {inst.version} ({inst.vendor}){current_marker}{compat_marker}")
131
+ click.echo(f" {inst.path}")
132
+
133
+ # Show which PySpark versions this Java supports
134
+ compatible_pyspark = get_pyspark_versions_for_java(inst.version)
135
+ if compatible_pyspark:
136
+ click.echo(f" Compatible with: PySpark {', '.join(compatible_pyspark)}")
137
+ click.echo()
138
+
139
+ return installations
140
+
141
+ def set_java_home(self, installation: Optional[JavaInstallation] = None) -> bool:
142
+ """
143
+ Interactively select and set JAVA_HOME.
144
+
145
+ If no installation provided, presents interactive menu.
146
+
147
+ Args:
148
+ installation: Pre-selected JavaInstallation (optional)
149
+
150
+ Returns:
151
+ bool: True if successful
152
+ """
153
+ if installation:
154
+ # Direct set
155
+ success, msg = set_java_home_persistent(installation.path)
156
+ if success:
157
+ click.echo(click.style(f"✓ JAVA_HOME set to: {installation.path}", fg="green"))
158
+ click.echo(f" {msg}")
159
+ else:
160
+ click.echo(click.style(f"✗ {msg}", fg="red"))
161
+ return success
162
+
163
+ # Interactive selection
164
+ installations = find_all_java_installations()
165
+ if not installations:
166
+ click.echo(click.style("No Java installations found.", fg="yellow"))
167
+ click.echo("Run 'dvt java install' for installation guide")
168
+ return False
169
+
170
+ # Get PySpark info for compatibility display
171
+ pyspark = get_pyspark_info()
172
+
173
+ click.echo()
174
+ click.echo(click.style("Select Java installation:", fg="cyan", bold=True))
175
+ click.echo()
176
+
177
+ for i, inst in enumerate(installations, 1):
178
+ # Mark current
179
+ current_marker = click.style(" (current)", fg="blue") if inst.is_current else ""
180
+
181
+ # Check compatibility with installed PySpark
182
+ if pyspark:
183
+ is_compat, _ = check_java_pyspark_compatibility(inst.version, pyspark.major_minor)
184
+ if is_compat:
185
+ compat_marker = click.style(" ✓ compatible", fg="green")
186
+ else:
187
+ compat_marker = click.style(" ✗ incompatible", fg="red")
188
+ else:
189
+ compat_marker = ""
190
+
191
+ click.echo(f" [{i}] Java {inst.version} ({inst.vendor}){current_marker}{compat_marker}")
192
+ click.echo(f" {inst.path}")
193
+ click.echo()
194
+
195
+ # Get user choice
196
+ while True:
197
+ try:
198
+ choice = click.prompt("Your choice", type=int)
199
+ if 1 <= choice <= len(installations):
200
+ break
201
+ click.echo(click.style(f"Please enter a number between 1 and {len(installations)}", fg="yellow"))
202
+ except click.Abort:
203
+ click.echo("\nAborted.")
204
+ return False
205
+
206
+ selected = installations[choice - 1]
207
+
208
+ # Warn if incompatible with PySpark
209
+ if pyspark:
210
+ is_compat, msg = check_java_pyspark_compatibility(selected.version, pyspark.major_minor)
211
+ if not is_compat:
212
+ click.echo()
213
+ click.echo(click.style(f"⚠️ Warning: {msg}", fg="yellow"))
214
+ if not click.confirm("Continue anyway?"):
215
+ return False
216
+
217
+ # Set JAVA_HOME
218
+ success, msg = set_java_home_persistent(selected.path)
219
+ click.echo()
220
+ if success:
221
+ click.echo(click.style(f"✓ JAVA_HOME set to: {selected.path}", fg="green"))
222
+ click.echo(f" {msg}")
223
+ else:
224
+ click.echo(click.style(f"✗ {msg}", fg="red"))
225
+
226
+ return success
227
+
228
+ def install_guide(self) -> None:
229
+ """
230
+ Show installation guide for compatible Java version.
231
+
232
+ Displays platform-specific installation instructions based on
233
+ the installed PySpark version.
234
+ """
235
+ click.echo()
236
+
237
+ # Get PySpark info
238
+ pyspark = get_pyspark_info()
239
+ if pyspark:
240
+ click.echo(click.style(f"Java Installation Guide for PySpark {pyspark.version}", fg="cyan", bold=True))
241
+ click.echo("=" * 60)
242
+ click.echo()
243
+ click.echo(f"PySpark {pyspark.major_minor} requires Java: {', '.join(str(v) for v in pyspark.java_supported)}")
244
+ click.echo(f"Recommended: Java {pyspark.java_recommended}")
245
+ recommended = pyspark.java_recommended
246
+ else:
247
+ click.echo(click.style("Java Installation Guide", fg="cyan", bold=True))
248
+ click.echo("=" * 60)
249
+ click.echo()
250
+ click.echo("PySpark is not installed. Assuming Java 17+ for latest PySpark.")
251
+ recommended = 17
252
+
253
+ click.echo()
254
+ os_type = platform.system()
255
+
256
+ if os_type == "Darwin": # macOS
257
+ click.echo(click.style("📦 macOS Installation Options:", fg="yellow", bold=True))
258
+ click.echo()
259
+ click.echo(" Option 1: Homebrew (recommended)")
260
+ click.echo(click.style(f" brew install openjdk@{recommended}", fg="green"))
261
+ click.echo()
262
+ click.echo(" Option 2: SDKMAN (multiple versions)")
263
+ click.echo(click.style(" curl -s \"https://get.sdkman.io\" | bash", fg="green"))
264
+ click.echo(click.style(f" sdk install java {recommended}.0.2-tem", fg="green"))
265
+ click.echo()
266
+ click.echo(" Option 3: Download manually")
267
+ click.echo(click.style(" https://adoptium.net/", fg="blue"))
268
+ click.echo()
269
+ click.echo(" After installation:")
270
+ click.echo(f" export JAVA_HOME=$(/usr/libexec/java_home -v {recommended})")
271
+
272
+ elif os_type == "Linux":
273
+ click.echo(click.style("📦 Linux Installation Options:", fg="yellow", bold=True))
274
+ click.echo()
275
+ click.echo(" Ubuntu/Debian:")
276
+ click.echo(click.style(" sudo apt-get update", fg="green"))
277
+ click.echo(click.style(f" sudo apt-get install openjdk-{recommended}-jdk", fg="green"))
278
+ click.echo()
279
+ click.echo(" RHEL/CentOS/Fedora:")
280
+ click.echo(click.style(f" sudo dnf install java-{recommended}-openjdk-devel", fg="green"))
281
+ click.echo()
282
+ click.echo(" Arch Linux:")
283
+ click.echo(click.style(f" sudo pacman -S jdk{recommended}-openjdk", fg="green"))
284
+ click.echo()
285
+ click.echo(" SDKMAN (any distro):")
286
+ click.echo(click.style(" curl -s \"https://get.sdkman.io\" | bash", fg="green"))
287
+ click.echo(click.style(f" sdk install java {recommended}.0.2-tem", fg="green"))
288
+ click.echo()
289
+ click.echo(" After installation:")
290
+ click.echo(f" export JAVA_HOME=/usr/lib/jvm/java-{recommended}-openjdk")
291
+
292
+ elif os_type == "Windows":
293
+ click.echo(click.style("📦 Windows Installation Options:", fg="yellow", bold=True))
294
+ click.echo()
295
+ click.echo(" Option 1: Winget (Windows 11/10)")
296
+ click.echo(click.style(f" winget install EclipseAdoptium.Temurin.{recommended}.JDK", fg="green"))
297
+ click.echo()
298
+ click.echo(" Option 2: Chocolatey")
299
+ click.echo(click.style(f" choco install temurin{recommended}", fg="green"))
300
+ click.echo()
301
+ click.echo(" Option 3: Scoop")
302
+ click.echo(click.style(" scoop bucket add java", fg="green"))
303
+ click.echo(click.style(f" scoop install temurin{recommended}-jdk", fg="green"))
304
+ click.echo()
305
+ click.echo(" Option 4: Download manually")
306
+ click.echo(click.style(" https://adoptium.net/", fg="blue"))
307
+ click.echo()
308
+ click.echo(" After installation:")
309
+ click.echo(" Set JAVA_HOME in System Environment Variables")
310
+
311
+ click.echo()
312
+ click.echo(click.style("After installing Java:", fg="cyan"))
313
+ click.echo(" 1. Restart your terminal")
314
+ click.echo(" 2. Run 'dvt java search' to verify")
315
+ click.echo(" 3. Run 'dvt java set' to select the installation")
316
+ click.echo()
dbt/task/list.py ADDED
@@ -0,0 +1,236 @@
1
+ import json
2
+ from typing import Iterator, List
3
+
4
+ from dbt.cli.flags import Flags
5
+ from dbt.config.runtime import RuntimeConfig
6
+ from dbt.contracts.graph.manifest import Manifest
7
+ from dbt.contracts.graph.nodes import (
8
+ Exposure,
9
+ Metric,
10
+ SavedQuery,
11
+ SemanticModel,
12
+ SourceDefinition,
13
+ UnitTestDefinition,
14
+ )
15
+ from dbt.events.types import NoNodesSelected
16
+ from dbt.graph import ResourceTypeSelector
17
+ from dbt.node_types import NodeType
18
+ from dbt.task.base import resource_types_from_args
19
+ from dbt.task.runnable import GraphRunnableTask
20
+ from dbt.utils import JSONEncoder
21
+ from dbt_common.events.contextvars import task_contextvars
22
+ from dbt_common.events.functions import fire_event, warn_or_error
23
+ from dbt_common.events.types import PrintEvent
24
+ from dbt_common.exceptions import DbtInternalError, DbtRuntimeError
25
+
26
+
27
+ class ListTask(GraphRunnableTask):
28
+ DEFAULT_RESOURCE_VALUES = frozenset(
29
+ (
30
+ NodeType.Model,
31
+ NodeType.Snapshot,
32
+ NodeType.Seed,
33
+ NodeType.Test,
34
+ NodeType.Source,
35
+ NodeType.Exposure,
36
+ NodeType.Metric,
37
+ NodeType.SavedQuery,
38
+ NodeType.SemanticModel,
39
+ NodeType.Unit,
40
+ NodeType.Function,
41
+ )
42
+ )
43
+ ALL_RESOURCE_VALUES = DEFAULT_RESOURCE_VALUES | frozenset((NodeType.Analysis,))
44
+ ALLOWED_KEYS = frozenset(
45
+ (
46
+ "alias",
47
+ "name",
48
+ "package_name",
49
+ "depends_on",
50
+ "tags",
51
+ "config",
52
+ "resource_type",
53
+ "source_name",
54
+ "original_file_path",
55
+ "unique_id",
56
+ )
57
+ )
58
+
59
+ def __init__(self, args: Flags, config: RuntimeConfig, manifest: Manifest) -> None:
60
+ super().__init__(args, config, manifest)
61
+ if self.args.models:
62
+ if self.args.select:
63
+ raise DbtRuntimeError('"models" and "select" are mutually exclusive arguments')
64
+ if self.args.resource_types:
65
+ raise DbtRuntimeError(
66
+ '"models" and "resource_type" are mutually exclusive ' "arguments"
67
+ )
68
+
69
+ def _iterate_selected_nodes(self):
70
+ selector = self.get_node_selector()
71
+ spec = self.get_selection_spec()
72
+ unique_ids = sorted(selector.get_selected(spec))
73
+ if not unique_ids:
74
+ warn_or_error(NoNodesSelected())
75
+ return
76
+ if self.manifest is None:
77
+ raise DbtInternalError("manifest is None in _iterate_selected_nodes")
78
+ for unique_id in unique_ids:
79
+ if unique_id in self.manifest.nodes:
80
+ yield self.manifest.nodes[unique_id]
81
+ elif unique_id in self.manifest.sources:
82
+ yield self.manifest.sources[unique_id]
83
+ elif unique_id in self.manifest.exposures:
84
+ yield self.manifest.exposures[unique_id]
85
+ elif unique_id in self.manifest.metrics:
86
+ yield self.manifest.metrics[unique_id]
87
+ elif unique_id in self.manifest.semantic_models:
88
+ yield self.manifest.semantic_models[unique_id]
89
+ elif unique_id in self.manifest.unit_tests:
90
+ yield self.manifest.unit_tests[unique_id]
91
+ elif unique_id in self.manifest.saved_queries:
92
+ yield self.manifest.saved_queries[unique_id]
93
+ elif unique_id in self.manifest.functions:
94
+ yield self.manifest.functions[unique_id]
95
+ else:
96
+ raise DbtRuntimeError(
97
+ f'Got an unexpected result from node selection: "{unique_id}"'
98
+ f"Listing this node type is not yet supported!"
99
+ )
100
+
101
+ def generate_selectors(self):
102
+ for node in self._iterate_selected_nodes():
103
+ if node.resource_type == NodeType.Source:
104
+ assert isinstance(node, SourceDefinition)
105
+ # sources are searched for by pkg.source_name.table_name
106
+ source_selector = ".".join([node.package_name, node.source_name, node.name])
107
+ yield f"source:{source_selector}"
108
+ elif node.resource_type == NodeType.Exposure:
109
+ assert isinstance(node, Exposure)
110
+ # exposures are searched for by pkg.exposure_name
111
+ exposure_selector = ".".join([node.package_name, node.name])
112
+ yield f"exposure:{exposure_selector}"
113
+ elif node.resource_type == NodeType.Metric:
114
+ assert isinstance(node, Metric)
115
+ # metrics are searched for by pkg.metric_name
116
+ metric_selector = ".".join([node.package_name, node.name])
117
+ yield f"metric:{metric_selector}"
118
+ elif node.resource_type == NodeType.SavedQuery:
119
+ assert isinstance(node, SavedQuery)
120
+ saved_query_selector = ".".join([node.package_name, node.name])
121
+ yield f"saved_query:{saved_query_selector}"
122
+ elif node.resource_type == NodeType.SemanticModel:
123
+ assert isinstance(node, SemanticModel)
124
+ semantic_model_selector = ".".join([node.package_name, node.name])
125
+ yield f"semantic_model:{semantic_model_selector}"
126
+ elif node.resource_type == NodeType.Unit:
127
+ assert isinstance(node, UnitTestDefinition)
128
+ unit_test_selector = ".".join([node.package_name, node.versioned_name])
129
+ yield f"unit_test:{unit_test_selector}"
130
+ else:
131
+ # everything else is from `fqn`
132
+ yield ".".join(node.fqn)
133
+
134
+ def generate_names(self):
135
+ for node in self._iterate_selected_nodes():
136
+ yield node.search_name
137
+
138
+ def _get_nested_value(self, data, key_path):
139
+ """Get nested value using dot notation (e.g., 'config.materialized')"""
140
+ keys = key_path.split(".")
141
+ current = data
142
+ for key in keys:
143
+ if isinstance(current, dict) and key in current:
144
+ current = current[key]
145
+ else:
146
+ return None
147
+ return current
148
+
149
+ def generate_json(self):
150
+ for node in self._iterate_selected_nodes():
151
+ node_dict = node.to_dict(omit_none=False)
152
+
153
+ if self.args.output_keys:
154
+ # Handle both nested and regular keys
155
+ result = {}
156
+ for key in self.args.output_keys:
157
+ if "." in key:
158
+ # Handle nested key (e.g., 'config.materialized')
159
+ value = self._get_nested_value(node_dict, key)
160
+ if value is not None:
161
+ result[key] = value
162
+ else:
163
+ # Handle regular key
164
+ if key in node_dict:
165
+ result[key] = node_dict[key]
166
+ else:
167
+ # Use default allowed keys
168
+ result = {k: v for k, v in node_dict.items() if k in self.ALLOWED_KEYS}
169
+
170
+ yield json.dumps(result, cls=JSONEncoder)
171
+
172
+ def generate_paths(self) -> Iterator[str]:
173
+ for node in self._iterate_selected_nodes():
174
+ yield node.original_file_path
175
+
176
+ def run(self):
177
+ # We set up a context manager here with "task_contextvars" because we
178
+ # we need the project_root in compile_manifest.
179
+ with task_contextvars(project_root=self.config.project_root):
180
+ self.compile_manifest()
181
+ output = self.args.output
182
+ if output == "selector":
183
+ generator = self.generate_selectors
184
+ elif output == "name":
185
+ generator = self.generate_names
186
+ elif output == "json":
187
+ generator = self.generate_json
188
+ elif output == "path":
189
+ generator = self.generate_paths
190
+ else:
191
+ raise DbtInternalError("Invalid output {}".format(output))
192
+
193
+ return self.output_results(generator())
194
+
195
+ def output_results(self, results):
196
+ """Log, or output a plain, newline-delimited, and ready-to-pipe list of nodes found."""
197
+ for result in results:
198
+ self.node_results.append(result)
199
+ # No formatting, still get to stdout when --quiet is used
200
+ fire_event(PrintEvent(msg=result))
201
+ return self.node_results
202
+
203
+ @property
204
+ def resource_types(self) -> List[NodeType]:
205
+ if self.args.models:
206
+ return [NodeType.Model]
207
+
208
+ resource_types = resource_types_from_args(
209
+ self.args, set(self.ALL_RESOURCE_VALUES), set(self.DEFAULT_RESOURCE_VALUES)
210
+ )
211
+
212
+ return list(resource_types)
213
+
214
+ @property
215
+ def selection_arg(self):
216
+ # for backwards compatibility, list accepts both --models and --select,
217
+ # with slightly different behavior: --models implies --resource-type model
218
+ if self.args.models:
219
+ return self.args.models
220
+ else:
221
+ return self.args.select
222
+
223
+ def get_node_selector(self) -> ResourceTypeSelector:
224
+ if self.manifest is None or self.graph is None:
225
+ raise DbtInternalError("manifest and graph must be set to get perform node selection")
226
+ return ResourceTypeSelector(
227
+ graph=self.graph,
228
+ manifest=self.manifest,
229
+ previous_state=self.previous_state,
230
+ resource_types=self.resource_types,
231
+ include_empty_nodes=True,
232
+ )
233
+
234
+ def interpret_results(self, results):
235
+ # list command should always return 0 as exit code
236
+ return True
Binary file