dvt-pro 0.2.0__tar.gz

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 (261) hide show
  1. dvt_pro-0.2.0/MANIFEST.in +3 -0
  2. dvt_pro-0.2.0/PKG-INFO +407 -0
  3. dvt_pro-0.2.0/README.md +356 -0
  4. dvt_pro-0.2.0/dbt/__init__.py +7 -0
  5. dvt_pro-0.2.0/dbt/artifacts/__init__.py +0 -0
  6. dvt_pro-0.2.0/dbt/artifacts/exceptions/__init__.py +1 -0
  7. dvt_pro-0.2.0/dbt/artifacts/exceptions/schemas.py +31 -0
  8. dvt_pro-0.2.0/dbt/artifacts/resources/__init__.py +98 -0
  9. dvt_pro-0.2.0/dbt/artifacts/resources/base.py +67 -0
  10. dvt_pro-0.2.0/dbt/artifacts/resources/types.py +77 -0
  11. dvt_pro-0.2.0/dbt/artifacts/resources/v1/analysis.py +10 -0
  12. dvt_pro-0.2.0/dbt/artifacts/resources/v1/components.py +248 -0
  13. dvt_pro-0.2.0/dbt/artifacts/resources/v1/config.py +265 -0
  14. dvt_pro-0.2.0/dbt/artifacts/resources/v1/documentation.py +11 -0
  15. dvt_pro-0.2.0/dbt/artifacts/resources/v1/exposure.py +49 -0
  16. dvt_pro-0.2.0/dbt/artifacts/resources/v1/generic_test.py +31 -0
  17. dvt_pro-0.2.0/dbt/artifacts/resources/v1/group.py +13 -0
  18. dvt_pro-0.2.0/dbt/artifacts/resources/v1/hook.py +11 -0
  19. dvt_pro-0.2.0/dbt/artifacts/resources/v1/macro.py +29 -0
  20. dvt_pro-0.2.0/dbt/artifacts/resources/v1/metric.py +147 -0
  21. dvt_pro-0.2.0/dbt/artifacts/resources/v1/model.py +56 -0
  22. dvt_pro-0.2.0/dbt/artifacts/resources/v1/owner.py +10 -0
  23. dvt_pro-0.2.0/dbt/artifacts/resources/v1/saved_query.py +105 -0
  24. dvt_pro-0.2.0/dbt/artifacts/resources/v1/seed.py +43 -0
  25. dvt_pro-0.2.0/dbt/artifacts/resources/v1/semantic_layer_components.py +50 -0
  26. dvt_pro-0.2.0/dbt/artifacts/resources/v1/semantic_model.py +272 -0
  27. dvt_pro-0.2.0/dbt/artifacts/resources/v1/singular_test.py +14 -0
  28. dvt_pro-0.2.0/dbt/artifacts/resources/v1/snapshot.py +93 -0
  29. dvt_pro-0.2.0/dbt/artifacts/resources/v1/source_definition.py +82 -0
  30. dvt_pro-0.2.0/dbt/artifacts/resources/v1/sql_operation.py +10 -0
  31. dvt_pro-0.2.0/dbt/artifacts/resources/v1/unit_test_definition.py +77 -0
  32. dvt_pro-0.2.0/dbt/artifacts/schemas/__init__.py +0 -0
  33. dvt_pro-0.2.0/dbt/artifacts/schemas/base.py +178 -0
  34. dvt_pro-0.2.0/dbt/artifacts/schemas/batch_results.py +24 -0
  35. dvt_pro-0.2.0/dbt/artifacts/schemas/catalog/__init__.py +11 -0
  36. dvt_pro-0.2.0/dbt/artifacts/schemas/catalog/v1/__init__.py +0 -0
  37. dvt_pro-0.2.0/dbt/artifacts/schemas/catalog/v1/catalog.py +59 -0
  38. dvt_pro-0.2.0/dbt/artifacts/schemas/freshness/__init__.py +1 -0
  39. dvt_pro-0.2.0/dbt/artifacts/schemas/freshness/v3/__init__.py +0 -0
  40. dvt_pro-0.2.0/dbt/artifacts/schemas/freshness/v3/freshness.py +158 -0
  41. dvt_pro-0.2.0/dbt/artifacts/schemas/manifest/__init__.py +2 -0
  42. dvt_pro-0.2.0/dbt/artifacts/schemas/manifest/v12/__init__.py +0 -0
  43. dvt_pro-0.2.0/dbt/artifacts/schemas/manifest/v12/manifest.py +182 -0
  44. dvt_pro-0.2.0/dbt/artifacts/schemas/results.py +145 -0
  45. dvt_pro-0.2.0/dbt/artifacts/schemas/run/__init__.py +2 -0
  46. dvt_pro-0.2.0/dbt/artifacts/schemas/run/v5/__init__.py +0 -0
  47. dvt_pro-0.2.0/dbt/artifacts/schemas/run/v5/run.py +182 -0
  48. dvt_pro-0.2.0/dbt/artifacts/schemas/upgrades/__init__.py +1 -0
  49. dvt_pro-0.2.0/dbt/artifacts/schemas/upgrades/upgrade_manifest.py +174 -0
  50. dvt_pro-0.2.0/dbt/artifacts/utils/validation.py +153 -0
  51. dvt_pro-0.2.0/dbt/cli/__init__.py +1 -0
  52. dvt_pro-0.2.0/dbt/cli/context.py +17 -0
  53. dvt_pro-0.2.0/dbt/cli/exceptions.py +57 -0
  54. dvt_pro-0.2.0/dbt/cli/flags.py +541 -0
  55. dvt_pro-0.2.0/dbt/cli/main.py +835 -0
  56. dvt_pro-0.2.0/dbt/cli/option_types.py +90 -0
  57. dvt_pro-0.2.0/dbt/cli/options.py +80 -0
  58. dvt_pro-0.2.0/dbt/cli/params.py +759 -0
  59. dvt_pro-0.2.0/dbt/cli/requires.py +360 -0
  60. dvt_pro-0.2.0/dbt/cli/resolvers.py +32 -0
  61. dvt_pro-0.2.0/dbt/cli/types.py +40 -0
  62. dvt_pro-0.2.0/dbt/clients/__init__.py +0 -0
  63. dvt_pro-0.2.0/dbt/clients/git.py +164 -0
  64. dvt_pro-0.2.0/dbt/clients/jinja.py +206 -0
  65. dvt_pro-0.2.0/dbt/clients/jinja_static.py +245 -0
  66. dvt_pro-0.2.0/dbt/clients/registry.py +192 -0
  67. dvt_pro-0.2.0/dbt/clients/yaml_helper.py +68 -0
  68. dvt_pro-0.2.0/dbt/compilation.py +642 -0
  69. dvt_pro-0.2.0/dbt/config/__init__.py +4 -0
  70. dvt_pro-0.2.0/dbt/config/profile.py +408 -0
  71. dvt_pro-0.2.0/dbt/config/project.py +839 -0
  72. dvt_pro-0.2.0/dbt/config/renderer.py +231 -0
  73. dvt_pro-0.2.0/dbt/config/runtime.py +480 -0
  74. dvt_pro-0.2.0/dbt/config/selectors.py +206 -0
  75. dvt_pro-0.2.0/dbt/config/utils.py +66 -0
  76. dvt_pro-0.2.0/dbt/constants.py +24 -0
  77. dvt_pro-0.2.0/dbt/context/__init__.py +0 -0
  78. dvt_pro-0.2.0/dbt/context/base.py +737 -0
  79. dvt_pro-0.2.0/dbt/context/configured.py +135 -0
  80. dvt_pro-0.2.0/dbt/context/context_config.py +343 -0
  81. dvt_pro-0.2.0/dbt/context/docs.py +82 -0
  82. dvt_pro-0.2.0/dbt/context/exceptions_jinja.py +178 -0
  83. dvt_pro-0.2.0/dbt/context/macro_resolver.py +195 -0
  84. dvt_pro-0.2.0/dbt/context/macros.py +171 -0
  85. dvt_pro-0.2.0/dbt/context/manifest.py +72 -0
  86. dvt_pro-0.2.0/dbt/context/providers.py +1985 -0
  87. dvt_pro-0.2.0/dbt/context/query_header.py +13 -0
  88. dvt_pro-0.2.0/dbt/context/secret.py +58 -0
  89. dvt_pro-0.2.0/dbt/context/target.py +74 -0
  90. dvt_pro-0.2.0/dbt/contracts/__init__.py +0 -0
  91. dvt_pro-0.2.0/dbt/contracts/files.py +410 -0
  92. dvt_pro-0.2.0/dbt/contracts/graph/__init__.py +0 -0
  93. dvt_pro-0.2.0/dbt/contracts/graph/manifest.py +1813 -0
  94. dvt_pro-0.2.0/dbt/contracts/graph/metrics.py +97 -0
  95. dvt_pro-0.2.0/dbt/contracts/graph/model_config.py +66 -0
  96. dvt_pro-0.2.0/dbt/contracts/graph/node_args.py +40 -0
  97. dvt_pro-0.2.0/dbt/contracts/graph/nodes.py +1757 -0
  98. dvt_pro-0.2.0/dbt/contracts/graph/semantic_manifest.py +231 -0
  99. dvt_pro-0.2.0/dbt/contracts/graph/unparsed.py +802 -0
  100. dvt_pro-0.2.0/dbt/contracts/project.py +405 -0
  101. dvt_pro-0.2.0/dbt/contracts/results.py +53 -0
  102. dvt_pro-0.2.0/dbt/contracts/selection.py +23 -0
  103. dvt_pro-0.2.0/dbt/contracts/sql.py +79 -0
  104. dvt_pro-0.2.0/dbt/contracts/state.py +67 -0
  105. dvt_pro-0.2.0/dbt/contracts/util.py +46 -0
  106. dvt_pro-0.2.0/dbt/deprecations.py +200 -0
  107. dvt_pro-0.2.0/dbt/deps/__init__.py +0 -0
  108. dvt_pro-0.2.0/dbt/deps/base.py +152 -0
  109. dvt_pro-0.2.0/dbt/deps/git.py +195 -0
  110. dvt_pro-0.2.0/dbt/deps/local.py +79 -0
  111. dvt_pro-0.2.0/dbt/deps/registry.py +130 -0
  112. dvt_pro-0.2.0/dbt/deps/resolver.py +149 -0
  113. dvt_pro-0.2.0/dbt/deps/tarball.py +120 -0
  114. dvt_pro-0.2.0/dbt/docs/source/_ext/dbt_click.py +119 -0
  115. dvt_pro-0.2.0/dbt/docs/source/conf.py +32 -0
  116. dvt_pro-0.2.0/dbt/events/__init__.py +15 -0
  117. dvt_pro-0.2.0/dbt/events/base_types.py +37 -0
  118. dvt_pro-0.2.0/dbt/events/core_types_pb2.py +822 -0
  119. dvt_pro-0.2.0/dbt/events/logging.py +116 -0
  120. dvt_pro-0.2.0/dbt/events/types.py +2169 -0
  121. dvt_pro-0.2.0/dbt/exceptions.py +1486 -0
  122. dvt_pro-0.2.0/dbt/flags.py +89 -0
  123. dvt_pro-0.2.0/dbt/graph/__init__.py +11 -0
  124. dvt_pro-0.2.0/dbt/graph/cli.py +247 -0
  125. dvt_pro-0.2.0/dbt/graph/graph.py +160 -0
  126. dvt_pro-0.2.0/dbt/graph/queue.py +214 -0
  127. dvt_pro-0.2.0/dbt/graph/selector.py +367 -0
  128. dvt_pro-0.2.0/dbt/graph/selector_methods.py +961 -0
  129. dvt_pro-0.2.0/dbt/graph/selector_spec.py +222 -0
  130. dvt_pro-0.2.0/dbt/graph/thread_pool.py +18 -0
  131. dvt_pro-0.2.0/dbt/hooks.py +21 -0
  132. dvt_pro-0.2.0/dbt/include/README.md +63 -0
  133. dvt_pro-0.2.0/dbt/include/__init__.py +3 -0
  134. dvt_pro-0.2.0/dbt/include/starter_project/.gitignore +5 -0
  135. dvt_pro-0.2.0/dbt/include/starter_project/README.md +15 -0
  136. dvt_pro-0.2.0/dbt/include/starter_project/__init__.py +3 -0
  137. dvt_pro-0.2.0/dbt/include/starter_project/analyses/.gitkeep +0 -0
  138. dvt_pro-0.2.0/dbt/include/starter_project/dbt_project.yml +36 -0
  139. dvt_pro-0.2.0/dbt/include/starter_project/macros/.gitkeep +0 -0
  140. dvt_pro-0.2.0/dbt/include/starter_project/models/example/my_first_dbt_model.sql +27 -0
  141. dvt_pro-0.2.0/dbt/include/starter_project/models/example/my_second_dbt_model.sql +6 -0
  142. dvt_pro-0.2.0/dbt/include/starter_project/models/example/schema.yml +21 -0
  143. dvt_pro-0.2.0/dbt/include/starter_project/seeds/.gitkeep +0 -0
  144. dvt_pro-0.2.0/dbt/include/starter_project/snapshots/.gitkeep +0 -0
  145. dvt_pro-0.2.0/dbt/include/starter_project/tests/.gitkeep +0 -0
  146. dvt_pro-0.2.0/dbt/internal_deprecations.py +26 -0
  147. dvt_pro-0.2.0/dbt/links.py +4 -0
  148. dvt_pro-0.2.0/dbt/materializations/__init__.py +0 -0
  149. dvt_pro-0.2.0/dbt/materializations/incremental/__init__.py +0 -0
  150. dvt_pro-0.2.0/dbt/materializations/incremental/microbatch.py +236 -0
  151. dvt_pro-0.2.0/dbt/mp_context.py +8 -0
  152. dvt_pro-0.2.0/dbt/node_types.py +36 -0
  153. dvt_pro-0.2.0/dbt/parser/__init__.py +23 -0
  154. dvt_pro-0.2.0/dbt/parser/analysis.py +21 -0
  155. dvt_pro-0.2.0/dbt/parser/base.py +511 -0
  156. dvt_pro-0.2.0/dbt/parser/common.py +252 -0
  157. dvt_pro-0.2.0/dbt/parser/docs.py +51 -0
  158. dvt_pro-0.2.0/dbt/parser/fixtures.py +51 -0
  159. dvt_pro-0.2.0/dbt/parser/generic_test.py +100 -0
  160. dvt_pro-0.2.0/dbt/parser/generic_test_builders.py +389 -0
  161. dvt_pro-0.2.0/dbt/parser/hooks.py +118 -0
  162. dvt_pro-0.2.0/dbt/parser/macros.py +119 -0
  163. dvt_pro-0.2.0/dbt/parser/manifest.py +2086 -0
  164. dvt_pro-0.2.0/dbt/parser/models.py +569 -0
  165. dvt_pro-0.2.0/dbt/parser/partial.py +1129 -0
  166. dvt_pro-0.2.0/dbt/parser/read_files.py +440 -0
  167. dvt_pro-0.2.0/dbt/parser/schema_generic_tests.py +418 -0
  168. dvt_pro-0.2.0/dbt/parser/schema_renderer.py +100 -0
  169. dvt_pro-0.2.0/dbt/parser/schema_yaml_readers.py +871 -0
  170. dvt_pro-0.2.0/dbt/parser/schemas.py +1249 -0
  171. dvt_pro-0.2.0/dbt/parser/search.py +135 -0
  172. dvt_pro-0.2.0/dbt/parser/seeds.py +28 -0
  173. dvt_pro-0.2.0/dbt/parser/singular_test.py +20 -0
  174. dvt_pro-0.2.0/dbt/parser/snapshots.py +44 -0
  175. dvt_pro-0.2.0/dbt/parser/sources.py +468 -0
  176. dvt_pro-0.2.0/dbt/parser/sql.py +62 -0
  177. dvt_pro-0.2.0/dbt/parser/unit_tests.py +615 -0
  178. dvt_pro-0.2.0/dbt/plugins/__init__.py +20 -0
  179. dvt_pro-0.2.0/dbt/plugins/contracts.py +9 -0
  180. dvt_pro-0.2.0/dbt/plugins/exceptions.py +2 -0
  181. dvt_pro-0.2.0/dbt/plugins/manager.py +163 -0
  182. dvt_pro-0.2.0/dbt/plugins/manifest.py +21 -0
  183. dvt_pro-0.2.0/dbt/profiler.py +20 -0
  184. dvt_pro-0.2.0/dbt/py.typed +1 -0
  185. dvt_pro-0.2.0/dbt/selected_resources.py +8 -0
  186. dvt_pro-0.2.0/dbt/task/__init__.py +0 -0
  187. dvt_pro-0.2.0/dbt/task/base.py +497 -0
  188. dvt_pro-0.2.0/dbt/task/build.py +233 -0
  189. dvt_pro-0.2.0/dbt/task/clean.py +56 -0
  190. dvt_pro-0.2.0/dbt/task/clone.py +161 -0
  191. dvt_pro-0.2.0/dbt/task/compile.py +150 -0
  192. dvt_pro-0.2.0/dbt/task/debug.py +502 -0
  193. dvt_pro-0.2.0/dbt/task/deps.py +277 -0
  194. dvt_pro-0.2.0/dbt/task/docs/__init__.py +3 -0
  195. dvt_pro-0.2.0/dbt/task/docs/generate.py +406 -0
  196. dvt_pro-0.2.0/dbt/task/docs/index.html +250 -0
  197. dvt_pro-0.2.0/dbt/task/docs/serve.py +29 -0
  198. dvt_pro-0.2.0/dbt/task/freshness.py +301 -0
  199. dvt_pro-0.2.0/dbt/task/group_lookup.py +46 -0
  200. dvt_pro-0.2.0/dbt/task/init.py +346 -0
  201. dvt_pro-0.2.0/dbt/task/list.py +214 -0
  202. dvt_pro-0.2.0/dbt/task/printer.py +166 -0
  203. dvt_pro-0.2.0/dbt/task/retry.py +174 -0
  204. dvt_pro-0.2.0/dbt/task/run.py +1115 -0
  205. dvt_pro-0.2.0/dbt/task/run_operation.py +144 -0
  206. dvt_pro-0.2.0/dbt/task/runnable.py +743 -0
  207. dvt_pro-0.2.0/dbt/task/seed.py +101 -0
  208. dvt_pro-0.2.0/dbt/task/show.py +150 -0
  209. dvt_pro-0.2.0/dbt/task/snapshot.py +54 -0
  210. dvt_pro-0.2.0/dbt/task/sql.py +110 -0
  211. dvt_pro-0.2.0/dbt/task/test.py +463 -0
  212. dvt_pro-0.2.0/dbt/tests/fixtures/__init__.py +1 -0
  213. dvt_pro-0.2.0/dbt/tests/fixtures/project.py +609 -0
  214. dvt_pro-0.2.0/dbt/tests/util.py +651 -0
  215. dvt_pro-0.2.0/dbt/tracking.py +515 -0
  216. dvt_pro-0.2.0/dbt/utils.py +408 -0
  217. dvt_pro-0.2.0/dbt/version.py +232 -0
  218. dvt_pro-0.2.0/dvt/__init__.py +3 -0
  219. dvt_pro-0.2.0/dvt/cli/__init__.py +63 -0
  220. dvt_pro-0.2.0/dvt/cli/main.py +855 -0
  221. dvt_pro-0.2.0/dvt/config/__init__.py +0 -0
  222. dvt_pro-0.2.0/dvt/config/parse_state.py +156 -0
  223. dvt_pro-0.2.0/dvt/config/source_connections.py +195 -0
  224. dvt_pro-0.2.0/dvt/config/target_resolver.py +199 -0
  225. dvt_pro-0.2.0/dvt/exceptions.py +92 -0
  226. dvt_pro-0.2.0/dvt/extraction/__init__.py +0 -0
  227. dvt_pro-0.2.0/dvt/extraction/connection_mapper.py +269 -0
  228. dvt_pro-0.2.0/dvt/extraction/sling_client.py +400 -0
  229. dvt_pro-0.2.0/dvt/extraction/watermark_formatter.py +249 -0
  230. dvt_pro-0.2.0/dvt/federation/__init__.py +0 -0
  231. dvt_pro-0.2.0/dvt/federation/duckdb_compute.py +123 -0
  232. dvt_pro-0.2.0/dvt/federation/dvt_cache.py +223 -0
  233. dvt_pro-0.2.0/dvt/federation/optimizer.py +348 -0
  234. dvt_pro-0.2.0/dvt/loading/__init__.py +0 -0
  235. dvt_pro-0.2.0/dvt/runners/__init__.py +0 -0
  236. dvt_pro-0.2.0/dvt/runners/model_runner.py +599 -0
  237. dvt_pro-0.2.0/dvt/runners/seed_runner.py +159 -0
  238. dvt_pro-0.2.0/dvt/sync/__init__.py +0 -0
  239. dvt_pro-0.2.0/dvt/sync/adapter_installer.py +213 -0
  240. dvt_pro-0.2.0/dvt/sync/cloud_deps.py +48 -0
  241. dvt_pro-0.2.0/dvt/sync/duckdb_extensions.py +71 -0
  242. dvt_pro-0.2.0/dvt/sync/profiles_reader.py +90 -0
  243. dvt_pro-0.2.0/dvt/sync/sling_checker.py +124 -0
  244. dvt_pro-0.2.0/dvt/tasks/__init__.py +0 -0
  245. dvt_pro-0.2.0/dvt/tasks/build.py +23 -0
  246. dvt_pro-0.2.0/dvt/tasks/debug.py +290 -0
  247. dvt_pro-0.2.0/dvt/tasks/docs.py +390 -0
  248. dvt_pro-0.2.0/dvt/tasks/retract.py +278 -0
  249. dvt_pro-0.2.0/dvt/tasks/run.py +191 -0
  250. dvt_pro-0.2.0/dvt/tasks/seed.py +49 -0
  251. dvt_pro-0.2.0/dvt/tasks/show.py +308 -0
  252. dvt_pro-0.2.0/dvt/tasks/sync.py +250 -0
  253. dvt_pro-0.2.0/dvt_pro.egg-info/PKG-INFO +407 -0
  254. dvt_pro-0.2.0/dvt_pro.egg-info/SOURCES.txt +259 -0
  255. dvt_pro-0.2.0/dvt_pro.egg-info/dependency_links.txt +1 -0
  256. dvt_pro-0.2.0/dvt_pro.egg-info/entry_points.txt +3 -0
  257. dvt_pro-0.2.0/dvt_pro.egg-info/not-zip-safe +1 -0
  258. dvt_pro-0.2.0/dvt_pro.egg-info/requires.txt +23 -0
  259. dvt_pro-0.2.0/dvt_pro.egg-info/top_level.txt +2 -0
  260. dvt_pro-0.2.0/setup.cfg +4 -0
  261. dvt_pro-0.2.0/setup.py +109 -0
@@ -0,0 +1,3 @@
1
+ recursive-include dbt/include *.py *.sql *.yml *.html *.md .gitkeep .gitignore
2
+ include dbt/py.typed
3
+ recursive-include dbt/task/docs *.html
dvt_pro-0.2.0/PKG-INFO ADDED
@@ -0,0 +1,407 @@
1
+ Metadata-Version: 2.4
2
+ Name: dvt-pro
3
+ Version: 0.2.0
4
+ Summary: DVT Pro — cross-engine data transformation tool (premium edition).
5
+ Home-page: https://github.com/heshamh96/dvt-ce
6
+ Author: Hesham Badawi
7
+ Author-email: hesham.h.96@gmail.com
8
+ Classifier: Development Status :: 3 - Alpha
9
+ Classifier: License :: OSI Approved :: Apache Software License
10
+ Classifier: Operating System :: Microsoft :: Windows
11
+ Classifier: Operating System :: MacOS :: MacOS X
12
+ Classifier: Operating System :: POSIX :: Linux
13
+ Classifier: Programming Language :: Python :: 3.9
14
+ Classifier: Programming Language :: Python :: 3.10
15
+ Classifier: Programming Language :: Python :: 3.11
16
+ Classifier: Programming Language :: Python :: 3.12
17
+ Requires-Python: >=3.9
18
+ Description-Content-Type: text/markdown
19
+ Requires-Dist: agate<1.10,>=1.7.0
20
+ Requires-Dist: Jinja2<4,>=3.1.3
21
+ Requires-Dist: mashumaro[msgpack]<3.15,>=3.9
22
+ Requires-Dist: click<9.0,>=8.0.2
23
+ Requires-Dist: networkx<4.0,>=2.3
24
+ Requires-Dist: protobuf<7.0,>=6.0
25
+ Requires-Dist: requests<3.0.0
26
+ Requires-Dist: snowplow-tracker<2.0,>=1.0.2
27
+ Requires-Dist: pathspec<0.13,>=0.9
28
+ Requires-Dist: sqlparse<0.6.0,>=0.5.0
29
+ Requires-Dist: dbt-extractor<=0.6,>=0.5.0
30
+ Requires-Dist: dbt-semantic-interfaces<0.8,>=0.7.4
31
+ Requires-Dist: dbt-common<2.0,>=1.13.0
32
+ Requires-Dist: dvt-adapters>=0.2.1
33
+ Requires-Dist: packaging>20.9
34
+ Requires-Dist: pytz>=2015.7
35
+ Requires-Dist: pyyaml>=6.0
36
+ Requires-Dist: daff>=1.3.46
37
+ Requires-Dist: typing-extensions>=4.4
38
+ Requires-Dist: sling>=1.2.0
39
+ Requires-Dist: sqlglot>=20.0.0
40
+ Requires-Dist: duckdb>=0.9.0
41
+ Requires-Dist: pyarrow>=14.0.0
42
+ Dynamic: author
43
+ Dynamic: author-email
44
+ Dynamic: classifier
45
+ Dynamic: description
46
+ Dynamic: description-content-type
47
+ Dynamic: home-page
48
+ Dynamic: requires-dist
49
+ Dynamic: requires-python
50
+ Dynamic: summary
51
+
52
+ <p align="center">
53
+ <img src="docs/assets/dvt-logo-200.png" alt="DVT Logo" width="150"/>
54
+ </p>
55
+
56
+ <h1 align="center">DVT — Data Virtualization Tool</h1>
57
+
58
+ <p align="center">
59
+ <strong>Connect every database. Transform across engines. Materialize anywhere.</strong>
60
+ </p>
61
+
62
+ <p align="center">
63
+ <a href="https://pypi.org/project/dvt-ce/"><img src="https://img.shields.io/pypi/v/dvt-ce?color=blue&label=dvt-ce" alt="PyPI"/></a>
64
+ <a href="https://pypi.org/project/dvt-adapters/"><img src="https://img.shields.io/pypi/v/dvt-adapters?color=blue&label=dvt-adapters" alt="PyPI Adapters"/></a>
65
+ <a href="https://pypi.org/project/dvt-ce/"><img src="https://img.shields.io/pypi/pyversions/dvt-ce?label=Python" alt="Python"/></a>
66
+ <a href="https://discord.gg/UjQcxJXAQp"><img src="https://img.shields.io/badge/Discord-Join%20us-5865F2?logo=discord&logoColor=white" alt="Discord"/></a>
67
+ <a href="https://github.com/heshamh96/dvt-ce/blob/master/LICENSE"><img src="https://img.shields.io/badge/License-Apache%202.0-green.svg" alt="License"/></a>
68
+ </p>
69
+
70
+ ---
71
+
72
+ **DVT** is a cross-engine data transformation tool built on [dbt-core](https://github.com/dbt-labs/dbt-core). Write SQL models that reference sources on **any database**, and DVT automatically handles cross-engine data movement and materializes results to **any target**.
73
+
74
+ No custom connectors. No complex config. Just SQL.
75
+
76
+ ---
77
+
78
+ ## How It Works
79
+
80
+ DVT extends dbt with **federated query execution**. When your sources and target live on the same engine, DVT pushes SQL directly to the database (identical to dbt). When they're on different engines, DVT transparently extracts, joins, and loads across engines:
81
+
82
+ ```mermaid
83
+ flowchart LR
84
+ subgraph Sources
85
+ PG[(PostgreSQL)]
86
+ MY[(MySQL)]
87
+ SF[(Snowflake)]
88
+ OR[(Oracle)]
89
+ end
90
+
91
+ subgraph DVT["DVT Engine"]
92
+ direction TB
93
+ SLING1[/"Sling Extract"/]
94
+ DUCK[("DuckDB Cache<br/>.dvt/cache.duckdb")]
95
+ SQL["Model SQL<br/>(joins, transforms)"]
96
+ SLING2[/"Sling Load"/]
97
+ SLING1 --> DUCK --> SQL --> SLING2
98
+ end
99
+
100
+ subgraph Targets
101
+ TGT1[(Snowflake)]
102
+ TGT2[(Databricks)]
103
+ TGT3[(PostgreSQL)]
104
+ end
105
+
106
+ PG --> SLING1
107
+ MY --> SLING1
108
+ SF --> SLING1
109
+ OR --> SLING1
110
+
111
+ SLING2 --> TGT1
112
+ SLING2 --> TGT2
113
+ SLING2 --> TGT3
114
+
115
+ style DVT fill:#f0f4ff,stroke:#336791,stroke-width:2px
116
+ style DUCK fill:#FFF000,stroke:#333,color:#333
117
+ style SLING1 fill:#0094b3,stroke:#333,color:#fff
118
+ style SLING2 fill:#0094b3,stroke:#333,color:#fff
119
+ style SQL fill:#29B5E8,stroke:#333,color:#fff
120
+ ```
121
+
122
+ ### Two Execution Paths
123
+
124
+ | Path | When | How |
125
+ |------|------|-----|
126
+ | **Pushdown** | Source and target on same engine | SQL runs directly on the database via adapter — identical to dbt |
127
+ | **Extraction** | Sources on different engines | [Sling](https://slingdata.io) extracts → [DuckDB](https://duckdb.org) joins → Sling loads to target |
128
+
129
+ The user never thinks about this — DVT decides the path automatically.
130
+
131
+ ---
132
+
133
+ ## Supported Engines
134
+
135
+ **13 engines** in one package ([dvt-adapters](https://pypi.org/project/dvt-adapters/)):
136
+
137
+ | | Engine | Type | | Engine | Type |
138
+ |---|--------|------|-|--------|------|
139
+ | 🐘 | **PostgreSQL** | OLTP | ❄️ | **Snowflake** | Cloud DW |
140
+ | 🐬 | **MySQL** | OLTP | 🧱 | **Databricks** | Cloud DW |
141
+ | 🦭 | **MariaDB** | OLTP | 🔷 | **BigQuery** | Cloud DW |
142
+ | 🟥 | **SQL Server** | OLTP | 🟧 | **Redshift** | Cloud DW |
143
+ | 🔴 | **Oracle** | OLTP | 🦆 | **DuckDB** | Embedded |
144
+ | ⚡ | **Spark** | Distributed | 🔵 | **Fabric** | Cloud DW |
145
+ | | **MySQL 5** | Legacy | | | |
146
+
147
+ **Any source → Any target.** DVT handles the data movement.
148
+
149
+ ---
150
+
151
+ ## Installation
152
+
153
+ ```bash
154
+ pip install dvt-ce
155
+ ```
156
+
157
+ Or with [uv](https://docs.astral.sh/uv/) (recommended):
158
+
159
+ ```bash
160
+ uv add dvt-ce
161
+ ```
162
+
163
+ This installs everything — `dvt-ce` automatically pulls in `dvt-adapters` (all 13 engines), Sling, DuckDB, and all core dependencies.
164
+
165
+ Then bootstrap your environment:
166
+
167
+ ```bash
168
+ dvt sync # Installs database drivers, DuckDB extensions, Sling binary, cloud SDKs
169
+ ```
170
+
171
+ ---
172
+
173
+ ## Quick Start
174
+
175
+ ```bash
176
+ dvt init my_project && cd my_project # Scaffold project
177
+ dvt sync # Install everything
178
+ dvt debug # Test all connections
179
+ dvt seed # Load CSV seed data
180
+ dvt run # Run all models
181
+ dvt docs generate && dvt docs serve # Engine-colored lineage docs
182
+ ```
183
+
184
+ ---
185
+
186
+ ## Configuration
187
+
188
+ ### Connections (`~/.dvt/profiles.yml`)
189
+
190
+ ```yaml
191
+ my_project:
192
+ target: pg_dev
193
+ outputs:
194
+ pg_dev:
195
+ type: postgres
196
+ host: localhost
197
+ port: 5432
198
+ user: analyst
199
+ password: secret
200
+ dbname: warehouse
201
+ schema: public
202
+
203
+ sf_prod:
204
+ type: snowflake
205
+ account: my-account
206
+ user: loader
207
+ password: secret
208
+ database: ANALYTICS
209
+ schema: PUBLIC
210
+ warehouse: COMPUTE_WH
211
+
212
+ mysql_crm:
213
+ type: mysql
214
+ host: mysql.example.com
215
+ port: 3306
216
+ user: reader
217
+ password: secret
218
+ database: crm
219
+ ```
220
+
221
+ ### Sources (`models/sources.yml`)
222
+
223
+ The `connection:` field maps sources to their engine:
224
+
225
+ ```yaml
226
+ sources:
227
+ - name: app_db # On default target (no connection: needed)
228
+ schema: public
229
+ tables:
230
+ - name: users
231
+ - name: orders
232
+
233
+ - name: crm # On MySQL
234
+ connection: mysql_crm
235
+ schema: crm
236
+ tables:
237
+ - name: customers
238
+
239
+ - name: marketing # On Snowflake
240
+ connection: sf_prod
241
+ schema: PUBLIC
242
+ tables:
243
+ - name: campaigns
244
+ ```
245
+
246
+ ### Cross-Engine Model
247
+
248
+ ```sql
249
+ -- models/dim_customer_campaigns.sql
250
+ {{ config(materialized='table', target='sf_prod') }}
251
+
252
+ SELECT
253
+ u.user_id,
254
+ u.email,
255
+ c.customer_name,
256
+ m.campaign_name
257
+ FROM {{ source('app_db', 'users') }} u -- Postgres
258
+ LEFT JOIN {{ source('crm', 'customers') }} c -- MySQL
259
+ ON u.email = c.email
260
+ LEFT JOIN {{ source('marketing', 'campaigns') }} m -- Snowflake
261
+ ON u.user_id = m.user_id
262
+ ```
263
+
264
+ DVT detects the 3 engines, extracts to DuckDB, executes the join, loads to Snowflake. You see standard dbt output.
265
+
266
+ ### Incremental Models
267
+
268
+ ```sql
269
+ {{ config(materialized='incremental', incremental_strategy='append', target='sf_prod') }}
270
+
271
+ SELECT * FROM {{ source('app_db', 'orders') }}
272
+ {% if is_incremental() %}
273
+ WHERE order_date > (SELECT MAX(order_date) FROM {{ this }})
274
+ {% endif %}
275
+ ```
276
+
277
+ DVT reads the watermark from the target, extracts only new rows, appends them.
278
+
279
+ ---
280
+
281
+ ## Two Dialects, One Project
282
+
283
+ | Path | You Write | Runs On |
284
+ |------|-----------|---------|
285
+ | **Pushdown** | Target's native SQL (Snowflake SQL, T-SQL, etc.) | Target database |
286
+ | **Extraction** | DuckDB SQL (Postgres-like) | Local DuckDB cache |
287
+
288
+ Both coexist naturally. The dialect is determined by the execution path, not config.
289
+
290
+ ---
291
+
292
+ ## Commands
293
+
294
+ ### Core
295
+
296
+ | Command | Description |
297
+ |---------|-------------|
298
+ | `dvt run` | Execute models against targets |
299
+ | `dvt run --full-refresh` | Rebuild everything from scratch |
300
+ | `dvt run --select +model_name` | Run model and all ancestors |
301
+ | `dvt build` | Seeds + models + snapshots + tests in DAG order |
302
+ | `dvt seed` | Load CSVs via Sling (10-100x faster than dbt) |
303
+ | `dvt test` | Run data tests |
304
+ | `dvt compile` | Compile SQL without executing |
305
+
306
+ ### DVT-Specific
307
+
308
+ | Command | Description |
309
+ |---------|-------------|
310
+ | `dvt sync` | Self-healing env bootstrap (drivers, DuckDB, Sling, cloud SDKs) |
311
+ | `dvt debug` | Test all connections with clean status output |
312
+ | `dvt show --select model` | Query locally via DuckDB (no target needed) |
313
+ | `dvt retract` | Drop models from targets in reverse DAG order |
314
+ | `dvt retract --select +model` | Drop a model and its entire upstream chain |
315
+ | `dvt clean` | Remove build artifacts + DuckDB cache |
316
+
317
+ ### Documentation
318
+
319
+ | Command | Description |
320
+ |---------|-------------|
321
+ | `dvt docs generate` | Cross-engine catalog with engine-colored lineage |
322
+ | `dvt docs serve` | Serve documentation website |
323
+
324
+ The docs UI features:
325
+ - Engine-colored nodes (each database has its brand color)
326
+ - Connection badges on every source and model
327
+ - Native column types from each engine
328
+ - Target and engine info in detail panels
329
+
330
+ ---
331
+
332
+ ## DuckDB Cache
333
+
334
+ DVT maintains a persistent cache at `.dvt/cache.duckdb`:
335
+
336
+ - **Source tables**: `{source}__{table}` — shared across models, reused between runs
337
+ - **Model results**: `__model__{name}` — for incremental `{{ this }}` references
338
+ - `dvt run --full-refresh` rebuilds the cache
339
+ - `dvt clean` deletes `.dvt/` entirely
340
+
341
+ ---
342
+
343
+ ## `--target` Philosophy
344
+
345
+ `--target` switches **environments**, not engines:
346
+
347
+ ```bash
348
+ dvt run --target dev_snowflake # Dev Snowflake
349
+ dvt run --target prod_snowflake # Prod Snowflake ← Same engine, different env
350
+ ```
351
+
352
+ Pushdown models use the target's SQL dialect. Extraction models use DuckDB SQL and are unaffected by target changes.
353
+
354
+ ---
355
+
356
+ ## dbt Compatibility
357
+
358
+ All dbt projects are valid DVT projects. When using a single adapter with no cross-engine references, DVT behaves identically to dbt.
359
+
360
+ ---
361
+
362
+ ## Community
363
+
364
+ <p align="center">
365
+ <a href="https://discord.gg/UjQcxJXAQp">
366
+ <img src="https://img.shields.io/badge/Join%20us%20on-Discord-5865F2?style=for-the-badge&logo=discord&logoColor=white" alt="DVT Discord"/>
367
+ </a>
368
+ </p>
369
+
370
+ - **Discord**: [Join the DVT community](https://discord.gg/UjQcxJXAQp)
371
+ - **Issues**: [Report a bug](https://github.com/heshamh96/dvt-ce/issues)
372
+
373
+ ---
374
+
375
+ ## Links
376
+
377
+ | | |
378
+ |---|---|
379
+ | **PyPI** | [dvt-ce](https://pypi.org/project/dvt-ce/) · [dvt-adapters](https://pypi.org/project/dvt-adapters/) |
380
+ | **GitHub** | [dvt-ce](https://github.com/heshamh96/dvt-ce) · [dvt-adapters](https://github.com/heshamh96/dvt-adapters) |
381
+
382
+ ## Built On
383
+
384
+ DVT stands on the shoulders of three exceptional open-source projects:
385
+
386
+ | Project | Role in DVT | License |
387
+ |---------|-------------|---------|
388
+ | [**dbt-core**](https://github.com/dbt-labs/dbt-core) | DAG orchestration, SQL models, Jinja, testing, docs, adapters | Apache 2.0 |
389
+ | [**Sling**](https://github.com/slingdata-io/sling-cli) | High-performance data movement across 30+ connectors (free tier) | Apache 2.0 |
390
+ | [**DuckDB**](https://github.com/duckdb/duckdb) | Local analytics engine — extraction compute, caching, `dvt show` | MIT |
391
+
392
+ We are grateful to [dbt Labs](https://www.getdbt.com/), [Sling Data](https://slingdata.io/), and the [DuckDB Foundation](https://duckdb.org/) for building and open-sourcing these tools.
393
+
394
+ ## License
395
+
396
+ DVT is licensed under the [Apache License 2.0](LICENSE).
397
+
398
+ ```
399
+ Copyright 2025-2026 Hesham Badawi.
400
+ Licensed under the Apache License, Version 2.0.
401
+ ```
402
+
403
+ ---
404
+
405
+ <p align="center">
406
+ <sub>Built by <a href="https://www.linkedin.com/in/hesham-badawi-4022a8a3/">Hesham Badawi</a> — data engineer, for data engineers.</sub>
407
+ </p>