dagster-fivetran 0.27.14__tar.gz → 0.27.16__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.
- {dagster_fivetran-0.27.14/dagster_fivetran.egg-info → dagster_fivetran-0.27.16}/PKG-INFO +3 -3
- {dagster_fivetran-0.27.14 → dagster_fivetran-0.27.16}/dagster_fivetran/components/workspace_component/component.py +58 -28
- dagster_fivetran-0.27.16/dagster_fivetran/version.py +1 -0
- {dagster_fivetran-0.27.14 → dagster_fivetran-0.27.16/dagster_fivetran.egg-info}/PKG-INFO +3 -3
- dagster_fivetran-0.27.16/dagster_fivetran.egg-info/requires.txt +7 -0
- {dagster_fivetran-0.27.14 → dagster_fivetran-0.27.16}/setup.py +2 -2
- dagster_fivetran-0.27.14/dagster_fivetran/version.py +0 -1
- dagster_fivetran-0.27.14/dagster_fivetran.egg-info/requires.txt +0 -7
- {dagster_fivetran-0.27.14 → dagster_fivetran-0.27.16}/LICENSE +0 -0
- {dagster_fivetran-0.27.14 → dagster_fivetran-0.27.16}/MANIFEST.in +0 -0
- {dagster_fivetran-0.27.14 → dagster_fivetran-0.27.16}/README.md +0 -0
- {dagster_fivetran-0.27.14 → dagster_fivetran-0.27.16}/dagster_fivetran/__init__.py +0 -0
- {dagster_fivetran-0.27.14 → dagster_fivetran-0.27.16}/dagster_fivetran/asset_decorator.py +0 -0
- {dagster_fivetran-0.27.14 → dagster_fivetran-0.27.16}/dagster_fivetran/asset_defs.py +0 -0
- {dagster_fivetran-0.27.14 → dagster_fivetran-0.27.16}/dagster_fivetran/cli.py +0 -0
- {dagster_fivetran-0.27.14 → dagster_fivetran-0.27.16}/dagster_fivetran/components/__init__.py +0 -0
- {dagster_fivetran-0.27.14 → dagster_fivetran-0.27.16}/dagster_fivetran/components/workspace_component/__init__.py +0 -0
- {dagster_fivetran-0.27.14 → dagster_fivetran-0.27.16}/dagster_fivetran/components/workspace_component/scaffolder.py +0 -0
- {dagster_fivetran-0.27.14 → dagster_fivetran-0.27.16}/dagster_fivetran/constants.py +0 -0
- {dagster_fivetran-0.27.14 → dagster_fivetran-0.27.16}/dagster_fivetran/fivetran_event_iterator.py +0 -0
- {dagster_fivetran-0.27.14 → dagster_fivetran-0.27.16}/dagster_fivetran/managed/__init__.py +0 -0
- {dagster_fivetran-0.27.14 → dagster_fivetran-0.27.16}/dagster_fivetran/managed/reconciliation.py +0 -0
- {dagster_fivetran-0.27.14 → dagster_fivetran-0.27.16}/dagster_fivetran/managed/types.py +0 -0
- {dagster_fivetran-0.27.14 → dagster_fivetran-0.27.16}/dagster_fivetran/ops.py +0 -0
- {dagster_fivetran-0.27.14 → dagster_fivetran-0.27.16}/dagster_fivetran/py.typed +0 -0
- {dagster_fivetran-0.27.14 → dagster_fivetran-0.27.16}/dagster_fivetran/resources.py +0 -0
- {dagster_fivetran-0.27.14 → dagster_fivetran-0.27.16}/dagster_fivetran/translator.py +0 -0
- {dagster_fivetran-0.27.14 → dagster_fivetran-0.27.16}/dagster_fivetran/types.py +0 -0
- {dagster_fivetran-0.27.14 → dagster_fivetran-0.27.16}/dagster_fivetran/utils.py +0 -0
- {dagster_fivetran-0.27.14 → dagster_fivetran-0.27.16}/dagster_fivetran.egg-info/SOURCES.txt +0 -0
- {dagster_fivetran-0.27.14 → dagster_fivetran-0.27.16}/dagster_fivetran.egg-info/dependency_links.txt +0 -0
- {dagster_fivetran-0.27.14 → dagster_fivetran-0.27.16}/dagster_fivetran.egg-info/entry_points.txt +0 -0
- {dagster_fivetran-0.27.14 → dagster_fivetran-0.27.16}/dagster_fivetran.egg-info/not-zip-safe +0 -0
- {dagster_fivetran-0.27.14 → dagster_fivetran-0.27.16}/dagster_fivetran.egg-info/top_level.txt +0 -0
- {dagster_fivetran-0.27.14 → dagster_fivetran-0.27.16}/setup.cfg +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: dagster-fivetran
|
|
3
|
-
Version: 0.27.
|
|
3
|
+
Version: 0.27.16
|
|
4
4
|
Summary: Package for integrating Fivetran with Dagster.
|
|
5
5
|
Home-page: https://github.com/dagster-io/dagster/tree/master/python_modules/libraries/dagster-fivetran
|
|
6
6
|
Author: Dagster Labs
|
|
@@ -15,9 +15,9 @@ Classifier: License :: OSI Approved :: Apache Software License
|
|
|
15
15
|
Classifier: Operating System :: OS Independent
|
|
16
16
|
Requires-Python: >=3.9,<3.14
|
|
17
17
|
License-File: LICENSE
|
|
18
|
-
Requires-Dist: dagster==1.11.
|
|
18
|
+
Requires-Dist: dagster==1.11.16
|
|
19
19
|
Provides-Extra: managed
|
|
20
|
-
Requires-Dist: dagster-managed-elements==0.27.
|
|
20
|
+
Requires-Dist: dagster-managed-elements==0.27.16; extra == "managed"
|
|
21
21
|
Provides-Extra: test
|
|
22
22
|
Requires-Dist: pytest-order; extra == "test"
|
|
23
23
|
Dynamic: author
|
|
@@ -1,12 +1,20 @@
|
|
|
1
|
+
from collections import defaultdict
|
|
1
2
|
from collections.abc import Iterable, Sequence
|
|
2
3
|
from functools import cached_property
|
|
4
|
+
from pathlib import Path
|
|
3
5
|
from typing import Annotated, Callable, Optional, Union
|
|
4
6
|
|
|
5
7
|
import dagster as dg
|
|
6
8
|
import pydantic
|
|
7
9
|
from dagster._annotations import public
|
|
8
10
|
from dagster._utils.names import clean_name
|
|
11
|
+
from dagster.components.component.state_backed_component import StateBackedComponent
|
|
9
12
|
from dagster.components.resolved.base import resolve_fields
|
|
13
|
+
from dagster.components.utils.defs_state import (
|
|
14
|
+
DefsStateConfig,
|
|
15
|
+
DefsStateConfigArgs,
|
|
16
|
+
ResolvedDefsStateConfig,
|
|
17
|
+
)
|
|
10
18
|
from dagster.components.utils.translation import (
|
|
11
19
|
ComponentTranslator,
|
|
12
20
|
TranslationFn,
|
|
@@ -14,8 +22,8 @@ from dagster.components.utils.translation import (
|
|
|
14
22
|
create_component_translator_cls,
|
|
15
23
|
)
|
|
16
24
|
from dagster_shared import check
|
|
25
|
+
from dagster_shared.serdes.serdes import deserialize_value
|
|
17
26
|
|
|
18
|
-
from dagster_fivetran.asset_decorator import fivetran_assets
|
|
19
27
|
from dagster_fivetran.components.workspace_component.scaffolder import (
|
|
20
28
|
FivetranAccountComponentScaffolder,
|
|
21
29
|
)
|
|
@@ -25,7 +33,9 @@ from dagster_fivetran.translator import (
|
|
|
25
33
|
FivetranConnector,
|
|
26
34
|
FivetranConnectorTableProps,
|
|
27
35
|
FivetranMetadataSet,
|
|
36
|
+
FivetranWorkspaceData,
|
|
28
37
|
)
|
|
38
|
+
from dagster_fivetran.utils import DAGSTER_FIVETRAN_TRANSLATOR_METADATA_KEY
|
|
29
39
|
|
|
30
40
|
|
|
31
41
|
class FivetranWorkspaceModel(pydantic.BaseModel):
|
|
@@ -68,7 +78,7 @@ def resolve_connector_selector(
|
|
|
68
78
|
|
|
69
79
|
@public
|
|
70
80
|
@dg.scaffold_with(FivetranAccountComponentScaffolder)
|
|
71
|
-
class FivetranAccountComponent(
|
|
81
|
+
class FivetranAccountComponent(StateBackedComponent, dg.Model, dg.Resolvable):
|
|
72
82
|
"""Loads Fivetran connectors from a given Fivetran instance as Dagster assets.
|
|
73
83
|
Materializing these assets will trigger a sync of the Fivetran connector, enabling
|
|
74
84
|
you to schedule Fivetran syncs using Dagster.
|
|
@@ -100,6 +110,7 @@ class FivetranAccountComponent(dg.Component, dg.Model, dg.Resolvable):
|
|
|
100
110
|
default=None,
|
|
101
111
|
description="Function used to translate Fivetran connector table properties into Dagster asset specs.",
|
|
102
112
|
)
|
|
113
|
+
defs_state: ResolvedDefsStateConfig = DefsStateConfigArgs.legacy_code_server_snapshots()
|
|
103
114
|
|
|
104
115
|
@cached_property
|
|
105
116
|
def workspace_resource(self) -> FivetranWorkspace:
|
|
@@ -113,6 +124,11 @@ class FivetranAccountComponent(dg.Component, dg.Model, dg.Resolvable):
|
|
|
113
124
|
def _base_translator(self) -> DagsterFivetranTranslator:
|
|
114
125
|
return DagsterFivetranTranslator()
|
|
115
126
|
|
|
127
|
+
@property
|
|
128
|
+
def defs_state_config(self) -> DefsStateConfig:
|
|
129
|
+
default_key = f"{self.__class__.__name__}[{self.workspace_resource.account_id}]"
|
|
130
|
+
return DefsStateConfig.from_args(self.defs_state, default_key=default_key)
|
|
131
|
+
|
|
116
132
|
def get_asset_spec(self, props: FivetranConnectorTableProps) -> dg.AssetSpec:
|
|
117
133
|
return self._base_translator.get_asset_spec(props)
|
|
118
134
|
|
|
@@ -121,36 +137,50 @@ class FivetranAccountComponent(dg.Component, dg.Model, dg.Resolvable):
|
|
|
121
137
|
) -> Iterable[Union[dg.AssetMaterialization, dg.MaterializeResult]]:
|
|
122
138
|
yield from fivetran.sync_and_poll(context=context)
|
|
123
139
|
|
|
124
|
-
def
|
|
140
|
+
def _load_asset_specs(self, state: FivetranWorkspaceData) -> Sequence[dg.AssetSpec]:
|
|
125
141
|
connector_selector_fn = self.connector_selector or (lambda connector: bool(connector))
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
)
|
|
130
|
-
|
|
131
|
-
connectors = {
|
|
132
|
-
(
|
|
133
|
-
check.not_none(FivetranMetadataSet.extract(spec.metadata).connector_id),
|
|
134
|
-
check.not_none(FivetranMetadataSet.extract(spec.metadata).connector_name),
|
|
135
|
-
)
|
|
136
|
-
for spec in all_asset_specs
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
assets = []
|
|
140
|
-
for connector_id, connector_name in connectors:
|
|
141
|
-
|
|
142
|
-
@fivetran_assets(
|
|
143
|
-
connector_id=connector_id,
|
|
144
|
-
workspace=self.workspace_resource,
|
|
145
|
-
name=f"fivetran_{clean_name(connector_name)}",
|
|
146
|
-
dagster_fivetran_translator=self.translator,
|
|
147
|
-
connector_selector_fn=connector_selector_fn,
|
|
142
|
+
return [
|
|
143
|
+
self.translator.get_asset_spec(props).merge_attributes(
|
|
144
|
+
metadata={DAGSTER_FIVETRAN_TRANSLATOR_METADATA_KEY: self.translator}
|
|
148
145
|
)
|
|
149
|
-
|
|
150
|
-
|
|
146
|
+
for props in state.to_workspace_data_selection(
|
|
147
|
+
connector_selector_fn=connector_selector_fn
|
|
148
|
+
).to_fivetran_connector_table_props_data()
|
|
149
|
+
]
|
|
151
150
|
|
|
152
|
-
|
|
151
|
+
def _get_fivetran_assets_def(
|
|
152
|
+
self, connector_name: str, specs: Sequence[dg.AssetSpec]
|
|
153
|
+
) -> dg.AssetsDefinition:
|
|
154
|
+
@dg.multi_asset(name=f"fivetran_{clean_name(connector_name)}", can_subset=True, specs=specs)
|
|
155
|
+
def _asset(context: dg.AssetExecutionContext):
|
|
156
|
+
yield from self.execute(context=context, fivetran=self.workspace)
|
|
157
|
+
|
|
158
|
+
return _asset
|
|
159
|
+
|
|
160
|
+
async def write_state_to_path(self, state_path: Path) -> None:
|
|
161
|
+
state = self.workspace_resource.fetch_fivetran_workspace_data()
|
|
162
|
+
state_path.write_text(dg.serialize_value(state))
|
|
163
|
+
|
|
164
|
+
def build_defs_from_state(
|
|
165
|
+
self, context: dg.ComponentLoadContext, state_path: Optional[Path]
|
|
166
|
+
) -> dg.Definitions:
|
|
167
|
+
if state_path is None:
|
|
168
|
+
return dg.Definitions()
|
|
169
|
+
state = deserialize_value(state_path.read_text(), FivetranWorkspaceData)
|
|
170
|
+
|
|
171
|
+
# group specs by their connector names
|
|
172
|
+
specs_by_connector_name = defaultdict(list)
|
|
173
|
+
for spec in self._load_asset_specs(state):
|
|
174
|
+
connector_name = check.not_none(
|
|
175
|
+
FivetranMetadataSet.extract(spec.metadata).connector_name
|
|
176
|
+
)
|
|
177
|
+
specs_by_connector_name[connector_name].append(spec)
|
|
153
178
|
|
|
179
|
+
# create one assets definition per connector
|
|
180
|
+
assets = [
|
|
181
|
+
self._get_fivetran_assets_def(connector_name, specs)
|
|
182
|
+
for connector_name, specs in specs_by_connector_name.items()
|
|
183
|
+
]
|
|
154
184
|
return dg.Definitions(assets=assets)
|
|
155
185
|
|
|
156
186
|
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = "0.27.16"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: dagster-fivetran
|
|
3
|
-
Version: 0.27.
|
|
3
|
+
Version: 0.27.16
|
|
4
4
|
Summary: Package for integrating Fivetran with Dagster.
|
|
5
5
|
Home-page: https://github.com/dagster-io/dagster/tree/master/python_modules/libraries/dagster-fivetran
|
|
6
6
|
Author: Dagster Labs
|
|
@@ -15,9 +15,9 @@ Classifier: License :: OSI Approved :: Apache Software License
|
|
|
15
15
|
Classifier: Operating System :: OS Independent
|
|
16
16
|
Requires-Python: >=3.9,<3.14
|
|
17
17
|
License-File: LICENSE
|
|
18
|
-
Requires-Dist: dagster==1.11.
|
|
18
|
+
Requires-Dist: dagster==1.11.16
|
|
19
19
|
Provides-Extra: managed
|
|
20
|
-
Requires-Dist: dagster-managed-elements==0.27.
|
|
20
|
+
Requires-Dist: dagster-managed-elements==0.27.16; extra == "managed"
|
|
21
21
|
Provides-Extra: test
|
|
22
22
|
Requires-Dist: pytest-order; extra == "test"
|
|
23
23
|
Dynamic: author
|
|
@@ -34,7 +34,7 @@ setup(
|
|
|
34
34
|
packages=find_packages(exclude=["dagster_fivetran_tests*"]),
|
|
35
35
|
include_package_data=True,
|
|
36
36
|
python_requires=">=3.9,<3.14",
|
|
37
|
-
install_requires=["dagster==1.11.
|
|
37
|
+
install_requires=["dagster==1.11.16"],
|
|
38
38
|
zip_safe=False,
|
|
39
39
|
entry_points={
|
|
40
40
|
"console_scripts": [
|
|
@@ -46,7 +46,7 @@ setup(
|
|
|
46
46
|
},
|
|
47
47
|
extras_require={
|
|
48
48
|
"managed": [
|
|
49
|
-
"dagster-managed-elements==0.27.
|
|
49
|
+
"dagster-managed-elements==0.27.16",
|
|
50
50
|
],
|
|
51
51
|
"test": [
|
|
52
52
|
"pytest-order",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
__version__ = "0.27.14"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{dagster_fivetran-0.27.14 → dagster_fivetran-0.27.16}/dagster_fivetran/components/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{dagster_fivetran-0.27.14 → dagster_fivetran-0.27.16}/dagster_fivetran/fivetran_event_iterator.py
RENAMED
|
File without changes
|
|
File without changes
|
{dagster_fivetran-0.27.14 → dagster_fivetran-0.27.16}/dagster_fivetran/managed/reconciliation.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{dagster_fivetran-0.27.14 → dagster_fivetran-0.27.16}/dagster_fivetran.egg-info/dependency_links.txt
RENAMED
|
File without changes
|
{dagster_fivetran-0.27.14 → dagster_fivetran-0.27.16}/dagster_fivetran.egg-info/entry_points.txt
RENAMED
|
File without changes
|
{dagster_fivetran-0.27.14 → dagster_fivetran-0.27.16}/dagster_fivetran.egg-info/not-zip-safe
RENAMED
|
File without changes
|
{dagster_fivetran-0.27.14 → dagster_fivetran-0.27.16}/dagster_fivetran.egg-info/top_level.txt
RENAMED
|
File without changes
|
|
File without changes
|