dvt-pro 0.1.23__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.
- dvt_pro-0.1.23/MANIFEST.in +3 -0
- dvt_pro-0.1.23/PKG-INFO +407 -0
- dvt_pro-0.1.23/README.md +356 -0
- dvt_pro-0.1.23/dbt/__init__.py +7 -0
- dvt_pro-0.1.23/dbt/artifacts/__init__.py +0 -0
- dvt_pro-0.1.23/dbt/artifacts/exceptions/__init__.py +1 -0
- dvt_pro-0.1.23/dbt/artifacts/exceptions/schemas.py +31 -0
- dvt_pro-0.1.23/dbt/artifacts/resources/__init__.py +98 -0
- dvt_pro-0.1.23/dbt/artifacts/resources/base.py +67 -0
- dvt_pro-0.1.23/dbt/artifacts/resources/types.py +77 -0
- dvt_pro-0.1.23/dbt/artifacts/resources/v1/analysis.py +10 -0
- dvt_pro-0.1.23/dbt/artifacts/resources/v1/components.py +248 -0
- dvt_pro-0.1.23/dbt/artifacts/resources/v1/config.py +265 -0
- dvt_pro-0.1.23/dbt/artifacts/resources/v1/documentation.py +11 -0
- dvt_pro-0.1.23/dbt/artifacts/resources/v1/exposure.py +49 -0
- dvt_pro-0.1.23/dbt/artifacts/resources/v1/generic_test.py +31 -0
- dvt_pro-0.1.23/dbt/artifacts/resources/v1/group.py +13 -0
- dvt_pro-0.1.23/dbt/artifacts/resources/v1/hook.py +11 -0
- dvt_pro-0.1.23/dbt/artifacts/resources/v1/macro.py +29 -0
- dvt_pro-0.1.23/dbt/artifacts/resources/v1/metric.py +147 -0
- dvt_pro-0.1.23/dbt/artifacts/resources/v1/model.py +56 -0
- dvt_pro-0.1.23/dbt/artifacts/resources/v1/owner.py +10 -0
- dvt_pro-0.1.23/dbt/artifacts/resources/v1/saved_query.py +105 -0
- dvt_pro-0.1.23/dbt/artifacts/resources/v1/seed.py +43 -0
- dvt_pro-0.1.23/dbt/artifacts/resources/v1/semantic_layer_components.py +50 -0
- dvt_pro-0.1.23/dbt/artifacts/resources/v1/semantic_model.py +272 -0
- dvt_pro-0.1.23/dbt/artifacts/resources/v1/singular_test.py +14 -0
- dvt_pro-0.1.23/dbt/artifacts/resources/v1/snapshot.py +93 -0
- dvt_pro-0.1.23/dbt/artifacts/resources/v1/source_definition.py +82 -0
- dvt_pro-0.1.23/dbt/artifacts/resources/v1/sql_operation.py +10 -0
- dvt_pro-0.1.23/dbt/artifacts/resources/v1/unit_test_definition.py +77 -0
- dvt_pro-0.1.23/dbt/artifacts/schemas/__init__.py +0 -0
- dvt_pro-0.1.23/dbt/artifacts/schemas/base.py +178 -0
- dvt_pro-0.1.23/dbt/artifacts/schemas/batch_results.py +24 -0
- dvt_pro-0.1.23/dbt/artifacts/schemas/catalog/__init__.py +11 -0
- dvt_pro-0.1.23/dbt/artifacts/schemas/catalog/v1/__init__.py +0 -0
- dvt_pro-0.1.23/dbt/artifacts/schemas/catalog/v1/catalog.py +59 -0
- dvt_pro-0.1.23/dbt/artifacts/schemas/freshness/__init__.py +1 -0
- dvt_pro-0.1.23/dbt/artifacts/schemas/freshness/v3/__init__.py +0 -0
- dvt_pro-0.1.23/dbt/artifacts/schemas/freshness/v3/freshness.py +158 -0
- dvt_pro-0.1.23/dbt/artifacts/schemas/manifest/__init__.py +2 -0
- dvt_pro-0.1.23/dbt/artifacts/schemas/manifest/v12/__init__.py +0 -0
- dvt_pro-0.1.23/dbt/artifacts/schemas/manifest/v12/manifest.py +182 -0
- dvt_pro-0.1.23/dbt/artifacts/schemas/results.py +145 -0
- dvt_pro-0.1.23/dbt/artifacts/schemas/run/__init__.py +2 -0
- dvt_pro-0.1.23/dbt/artifacts/schemas/run/v5/__init__.py +0 -0
- dvt_pro-0.1.23/dbt/artifacts/schemas/run/v5/run.py +182 -0
- dvt_pro-0.1.23/dbt/artifacts/schemas/upgrades/__init__.py +1 -0
- dvt_pro-0.1.23/dbt/artifacts/schemas/upgrades/upgrade_manifest.py +174 -0
- dvt_pro-0.1.23/dbt/artifacts/utils/validation.py +153 -0
- dvt_pro-0.1.23/dbt/cli/__init__.py +1 -0
- dvt_pro-0.1.23/dbt/cli/context.py +17 -0
- dvt_pro-0.1.23/dbt/cli/exceptions.py +57 -0
- dvt_pro-0.1.23/dbt/cli/flags.py +541 -0
- dvt_pro-0.1.23/dbt/cli/main.py +835 -0
- dvt_pro-0.1.23/dbt/cli/option_types.py +90 -0
- dvt_pro-0.1.23/dbt/cli/options.py +80 -0
- dvt_pro-0.1.23/dbt/cli/params.py +759 -0
- dvt_pro-0.1.23/dbt/cli/requires.py +360 -0
- dvt_pro-0.1.23/dbt/cli/resolvers.py +32 -0
- dvt_pro-0.1.23/dbt/cli/types.py +40 -0
- dvt_pro-0.1.23/dbt/clients/__init__.py +0 -0
- dvt_pro-0.1.23/dbt/clients/git.py +164 -0
- dvt_pro-0.1.23/dbt/clients/jinja.py +206 -0
- dvt_pro-0.1.23/dbt/clients/jinja_static.py +245 -0
- dvt_pro-0.1.23/dbt/clients/registry.py +192 -0
- dvt_pro-0.1.23/dbt/clients/yaml_helper.py +68 -0
- dvt_pro-0.1.23/dbt/compilation.py +642 -0
- dvt_pro-0.1.23/dbt/config/__init__.py +4 -0
- dvt_pro-0.1.23/dbt/config/profile.py +408 -0
- dvt_pro-0.1.23/dbt/config/project.py +839 -0
- dvt_pro-0.1.23/dbt/config/renderer.py +231 -0
- dvt_pro-0.1.23/dbt/config/runtime.py +480 -0
- dvt_pro-0.1.23/dbt/config/selectors.py +206 -0
- dvt_pro-0.1.23/dbt/config/utils.py +66 -0
- dvt_pro-0.1.23/dbt/constants.py +24 -0
- dvt_pro-0.1.23/dbt/context/__init__.py +0 -0
- dvt_pro-0.1.23/dbt/context/base.py +737 -0
- dvt_pro-0.1.23/dbt/context/configured.py +135 -0
- dvt_pro-0.1.23/dbt/context/context_config.py +343 -0
- dvt_pro-0.1.23/dbt/context/docs.py +82 -0
- dvt_pro-0.1.23/dbt/context/exceptions_jinja.py +178 -0
- dvt_pro-0.1.23/dbt/context/macro_resolver.py +195 -0
- dvt_pro-0.1.23/dbt/context/macros.py +171 -0
- dvt_pro-0.1.23/dbt/context/manifest.py +72 -0
- dvt_pro-0.1.23/dbt/context/providers.py +1985 -0
- dvt_pro-0.1.23/dbt/context/query_header.py +13 -0
- dvt_pro-0.1.23/dbt/context/secret.py +58 -0
- dvt_pro-0.1.23/dbt/context/target.py +74 -0
- dvt_pro-0.1.23/dbt/contracts/__init__.py +0 -0
- dvt_pro-0.1.23/dbt/contracts/files.py +410 -0
- dvt_pro-0.1.23/dbt/contracts/graph/__init__.py +0 -0
- dvt_pro-0.1.23/dbt/contracts/graph/manifest.py +1813 -0
- dvt_pro-0.1.23/dbt/contracts/graph/metrics.py +97 -0
- dvt_pro-0.1.23/dbt/contracts/graph/model_config.py +66 -0
- dvt_pro-0.1.23/dbt/contracts/graph/node_args.py +40 -0
- dvt_pro-0.1.23/dbt/contracts/graph/nodes.py +1757 -0
- dvt_pro-0.1.23/dbt/contracts/graph/semantic_manifest.py +231 -0
- dvt_pro-0.1.23/dbt/contracts/graph/unparsed.py +802 -0
- dvt_pro-0.1.23/dbt/contracts/project.py +405 -0
- dvt_pro-0.1.23/dbt/contracts/results.py +53 -0
- dvt_pro-0.1.23/dbt/contracts/selection.py +23 -0
- dvt_pro-0.1.23/dbt/contracts/sql.py +79 -0
- dvt_pro-0.1.23/dbt/contracts/state.py +67 -0
- dvt_pro-0.1.23/dbt/contracts/util.py +46 -0
- dvt_pro-0.1.23/dbt/deprecations.py +200 -0
- dvt_pro-0.1.23/dbt/deps/__init__.py +0 -0
- dvt_pro-0.1.23/dbt/deps/base.py +152 -0
- dvt_pro-0.1.23/dbt/deps/git.py +195 -0
- dvt_pro-0.1.23/dbt/deps/local.py +79 -0
- dvt_pro-0.1.23/dbt/deps/registry.py +130 -0
- dvt_pro-0.1.23/dbt/deps/resolver.py +149 -0
- dvt_pro-0.1.23/dbt/deps/tarball.py +120 -0
- dvt_pro-0.1.23/dbt/docs/source/_ext/dbt_click.py +119 -0
- dvt_pro-0.1.23/dbt/docs/source/conf.py +32 -0
- dvt_pro-0.1.23/dbt/events/__init__.py +15 -0
- dvt_pro-0.1.23/dbt/events/base_types.py +37 -0
- dvt_pro-0.1.23/dbt/events/core_types_pb2.py +822 -0
- dvt_pro-0.1.23/dbt/events/logging.py +116 -0
- dvt_pro-0.1.23/dbt/events/types.py +2169 -0
- dvt_pro-0.1.23/dbt/exceptions.py +1486 -0
- dvt_pro-0.1.23/dbt/flags.py +89 -0
- dvt_pro-0.1.23/dbt/graph/__init__.py +11 -0
- dvt_pro-0.1.23/dbt/graph/cli.py +247 -0
- dvt_pro-0.1.23/dbt/graph/graph.py +160 -0
- dvt_pro-0.1.23/dbt/graph/queue.py +214 -0
- dvt_pro-0.1.23/dbt/graph/selector.py +367 -0
- dvt_pro-0.1.23/dbt/graph/selector_methods.py +961 -0
- dvt_pro-0.1.23/dbt/graph/selector_spec.py +222 -0
- dvt_pro-0.1.23/dbt/graph/thread_pool.py +18 -0
- dvt_pro-0.1.23/dbt/hooks.py +21 -0
- dvt_pro-0.1.23/dbt/include/README.md +63 -0
- dvt_pro-0.1.23/dbt/include/__init__.py +3 -0
- dvt_pro-0.1.23/dbt/include/starter_project/.gitignore +5 -0
- dvt_pro-0.1.23/dbt/include/starter_project/README.md +15 -0
- dvt_pro-0.1.23/dbt/include/starter_project/__init__.py +3 -0
- dvt_pro-0.1.23/dbt/include/starter_project/analyses/.gitkeep +0 -0
- dvt_pro-0.1.23/dbt/include/starter_project/dbt_project.yml +36 -0
- dvt_pro-0.1.23/dbt/include/starter_project/macros/.gitkeep +0 -0
- dvt_pro-0.1.23/dbt/include/starter_project/models/example/my_first_dbt_model.sql +27 -0
- dvt_pro-0.1.23/dbt/include/starter_project/models/example/my_second_dbt_model.sql +6 -0
- dvt_pro-0.1.23/dbt/include/starter_project/models/example/schema.yml +21 -0
- dvt_pro-0.1.23/dbt/include/starter_project/seeds/.gitkeep +0 -0
- dvt_pro-0.1.23/dbt/include/starter_project/snapshots/.gitkeep +0 -0
- dvt_pro-0.1.23/dbt/include/starter_project/tests/.gitkeep +0 -0
- dvt_pro-0.1.23/dbt/internal_deprecations.py +26 -0
- dvt_pro-0.1.23/dbt/links.py +4 -0
- dvt_pro-0.1.23/dbt/materializations/__init__.py +0 -0
- dvt_pro-0.1.23/dbt/materializations/incremental/__init__.py +0 -0
- dvt_pro-0.1.23/dbt/materializations/incremental/microbatch.py +236 -0
- dvt_pro-0.1.23/dbt/mp_context.py +8 -0
- dvt_pro-0.1.23/dbt/node_types.py +36 -0
- dvt_pro-0.1.23/dbt/parser/__init__.py +23 -0
- dvt_pro-0.1.23/dbt/parser/analysis.py +21 -0
- dvt_pro-0.1.23/dbt/parser/base.py +511 -0
- dvt_pro-0.1.23/dbt/parser/common.py +252 -0
- dvt_pro-0.1.23/dbt/parser/docs.py +51 -0
- dvt_pro-0.1.23/dbt/parser/fixtures.py +51 -0
- dvt_pro-0.1.23/dbt/parser/generic_test.py +100 -0
- dvt_pro-0.1.23/dbt/parser/generic_test_builders.py +389 -0
- dvt_pro-0.1.23/dbt/parser/hooks.py +118 -0
- dvt_pro-0.1.23/dbt/parser/macros.py +119 -0
- dvt_pro-0.1.23/dbt/parser/manifest.py +2086 -0
- dvt_pro-0.1.23/dbt/parser/models.py +569 -0
- dvt_pro-0.1.23/dbt/parser/partial.py +1129 -0
- dvt_pro-0.1.23/dbt/parser/read_files.py +440 -0
- dvt_pro-0.1.23/dbt/parser/schema_generic_tests.py +418 -0
- dvt_pro-0.1.23/dbt/parser/schema_renderer.py +100 -0
- dvt_pro-0.1.23/dbt/parser/schema_yaml_readers.py +871 -0
- dvt_pro-0.1.23/dbt/parser/schemas.py +1249 -0
- dvt_pro-0.1.23/dbt/parser/search.py +135 -0
- dvt_pro-0.1.23/dbt/parser/seeds.py +28 -0
- dvt_pro-0.1.23/dbt/parser/singular_test.py +20 -0
- dvt_pro-0.1.23/dbt/parser/snapshots.py +44 -0
- dvt_pro-0.1.23/dbt/parser/sources.py +468 -0
- dvt_pro-0.1.23/dbt/parser/sql.py +62 -0
- dvt_pro-0.1.23/dbt/parser/unit_tests.py +615 -0
- dvt_pro-0.1.23/dbt/plugins/__init__.py +20 -0
- dvt_pro-0.1.23/dbt/plugins/contracts.py +9 -0
- dvt_pro-0.1.23/dbt/plugins/exceptions.py +2 -0
- dvt_pro-0.1.23/dbt/plugins/manager.py +163 -0
- dvt_pro-0.1.23/dbt/plugins/manifest.py +21 -0
- dvt_pro-0.1.23/dbt/profiler.py +20 -0
- dvt_pro-0.1.23/dbt/py.typed +1 -0
- dvt_pro-0.1.23/dbt/selected_resources.py +8 -0
- dvt_pro-0.1.23/dbt/task/__init__.py +0 -0
- dvt_pro-0.1.23/dbt/task/base.py +497 -0
- dvt_pro-0.1.23/dbt/task/build.py +233 -0
- dvt_pro-0.1.23/dbt/task/clean.py +56 -0
- dvt_pro-0.1.23/dbt/task/clone.py +161 -0
- dvt_pro-0.1.23/dbt/task/compile.py +150 -0
- dvt_pro-0.1.23/dbt/task/debug.py +502 -0
- dvt_pro-0.1.23/dbt/task/deps.py +277 -0
- dvt_pro-0.1.23/dbt/task/docs/__init__.py +3 -0
- dvt_pro-0.1.23/dbt/task/docs/generate.py +406 -0
- dvt_pro-0.1.23/dbt/task/docs/index.html +250 -0
- dvt_pro-0.1.23/dbt/task/docs/serve.py +29 -0
- dvt_pro-0.1.23/dbt/task/freshness.py +301 -0
- dvt_pro-0.1.23/dbt/task/group_lookup.py +46 -0
- dvt_pro-0.1.23/dbt/task/init.py +346 -0
- dvt_pro-0.1.23/dbt/task/list.py +214 -0
- dvt_pro-0.1.23/dbt/task/printer.py +166 -0
- dvt_pro-0.1.23/dbt/task/retry.py +174 -0
- dvt_pro-0.1.23/dbt/task/run.py +1115 -0
- dvt_pro-0.1.23/dbt/task/run_operation.py +144 -0
- dvt_pro-0.1.23/dbt/task/runnable.py +743 -0
- dvt_pro-0.1.23/dbt/task/seed.py +101 -0
- dvt_pro-0.1.23/dbt/task/show.py +150 -0
- dvt_pro-0.1.23/dbt/task/snapshot.py +54 -0
- dvt_pro-0.1.23/dbt/task/sql.py +110 -0
- dvt_pro-0.1.23/dbt/task/test.py +463 -0
- dvt_pro-0.1.23/dbt/tests/fixtures/__init__.py +1 -0
- dvt_pro-0.1.23/dbt/tests/fixtures/project.py +609 -0
- dvt_pro-0.1.23/dbt/tests/util.py +651 -0
- dvt_pro-0.1.23/dbt/tracking.py +515 -0
- dvt_pro-0.1.23/dbt/utils.py +408 -0
- dvt_pro-0.1.23/dbt/version.py +232 -0
- dvt_pro-0.1.23/dvt/__init__.py +3 -0
- dvt_pro-0.1.23/dvt/cli/__init__.py +63 -0
- dvt_pro-0.1.23/dvt/cli/main.py +855 -0
- dvt_pro-0.1.23/dvt/config/__init__.py +0 -0
- dvt_pro-0.1.23/dvt/config/parse_state.py +156 -0
- dvt_pro-0.1.23/dvt/config/source_connections.py +195 -0
- dvt_pro-0.1.23/dvt/config/target_resolver.py +199 -0
- dvt_pro-0.1.23/dvt/exceptions.py +92 -0
- dvt_pro-0.1.23/dvt/extraction/__init__.py +0 -0
- dvt_pro-0.1.23/dvt/extraction/connection_mapper.py +269 -0
- dvt_pro-0.1.23/dvt/extraction/sling_client.py +400 -0
- dvt_pro-0.1.23/dvt/extraction/watermark_formatter.py +249 -0
- dvt_pro-0.1.23/dvt/federation/__init__.py +0 -0
- dvt_pro-0.1.23/dvt/federation/duckdb_compute.py +123 -0
- dvt_pro-0.1.23/dvt/federation/dvt_cache.py +223 -0
- dvt_pro-0.1.23/dvt/federation/optimizer.py +348 -0
- dvt_pro-0.1.23/dvt/loading/__init__.py +0 -0
- dvt_pro-0.1.23/dvt/runners/__init__.py +0 -0
- dvt_pro-0.1.23/dvt/runners/model_runner.py +599 -0
- dvt_pro-0.1.23/dvt/runners/seed_runner.py +159 -0
- dvt_pro-0.1.23/dvt/sync/__init__.py +0 -0
- dvt_pro-0.1.23/dvt/sync/adapter_installer.py +213 -0
- dvt_pro-0.1.23/dvt/sync/cloud_deps.py +48 -0
- dvt_pro-0.1.23/dvt/sync/duckdb_extensions.py +71 -0
- dvt_pro-0.1.23/dvt/sync/profiles_reader.py +90 -0
- dvt_pro-0.1.23/dvt/sync/sling_checker.py +124 -0
- dvt_pro-0.1.23/dvt/tasks/__init__.py +0 -0
- dvt_pro-0.1.23/dvt/tasks/build.py +23 -0
- dvt_pro-0.1.23/dvt/tasks/debug.py +290 -0
- dvt_pro-0.1.23/dvt/tasks/docs.py +390 -0
- dvt_pro-0.1.23/dvt/tasks/retract.py +278 -0
- dvt_pro-0.1.23/dvt/tasks/run.py +191 -0
- dvt_pro-0.1.23/dvt/tasks/seed.py +49 -0
- dvt_pro-0.1.23/dvt/tasks/show.py +308 -0
- dvt_pro-0.1.23/dvt/tasks/sync.py +250 -0
- dvt_pro-0.1.23/dvt_pro.egg-info/PKG-INFO +407 -0
- dvt_pro-0.1.23/dvt_pro.egg-info/SOURCES.txt +259 -0
- dvt_pro-0.1.23/dvt_pro.egg-info/dependency_links.txt +1 -0
- dvt_pro-0.1.23/dvt_pro.egg-info/entry_points.txt +3 -0
- dvt_pro-0.1.23/dvt_pro.egg-info/not-zip-safe +1 -0
- dvt_pro-0.1.23/dvt_pro.egg-info/requires.txt +23 -0
- dvt_pro-0.1.23/dvt_pro.egg-info/top_level.txt +2 -0
- dvt_pro-0.1.23/setup.cfg +4 -0
- dvt_pro-0.1.23/setup.py +109 -0
dvt_pro-0.1.23/PKG-INFO
ADDED
|
@@ -0,0 +1,407 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: dvt-pro
|
|
3
|
+
Version: 0.1.23
|
|
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>
|