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.
Files changed (35) hide show
  1. {dagster_fivetran-0.27.14/dagster_fivetran.egg-info → dagster_fivetran-0.27.16}/PKG-INFO +3 -3
  2. {dagster_fivetran-0.27.14 → dagster_fivetran-0.27.16}/dagster_fivetran/components/workspace_component/component.py +58 -28
  3. dagster_fivetran-0.27.16/dagster_fivetran/version.py +1 -0
  4. {dagster_fivetran-0.27.14 → dagster_fivetran-0.27.16/dagster_fivetran.egg-info}/PKG-INFO +3 -3
  5. dagster_fivetran-0.27.16/dagster_fivetran.egg-info/requires.txt +7 -0
  6. {dagster_fivetran-0.27.14 → dagster_fivetran-0.27.16}/setup.py +2 -2
  7. dagster_fivetran-0.27.14/dagster_fivetran/version.py +0 -1
  8. dagster_fivetran-0.27.14/dagster_fivetran.egg-info/requires.txt +0 -7
  9. {dagster_fivetran-0.27.14 → dagster_fivetran-0.27.16}/LICENSE +0 -0
  10. {dagster_fivetran-0.27.14 → dagster_fivetran-0.27.16}/MANIFEST.in +0 -0
  11. {dagster_fivetran-0.27.14 → dagster_fivetran-0.27.16}/README.md +0 -0
  12. {dagster_fivetran-0.27.14 → dagster_fivetran-0.27.16}/dagster_fivetran/__init__.py +0 -0
  13. {dagster_fivetran-0.27.14 → dagster_fivetran-0.27.16}/dagster_fivetran/asset_decorator.py +0 -0
  14. {dagster_fivetran-0.27.14 → dagster_fivetran-0.27.16}/dagster_fivetran/asset_defs.py +0 -0
  15. {dagster_fivetran-0.27.14 → dagster_fivetran-0.27.16}/dagster_fivetran/cli.py +0 -0
  16. {dagster_fivetran-0.27.14 → dagster_fivetran-0.27.16}/dagster_fivetran/components/__init__.py +0 -0
  17. {dagster_fivetran-0.27.14 → dagster_fivetran-0.27.16}/dagster_fivetran/components/workspace_component/__init__.py +0 -0
  18. {dagster_fivetran-0.27.14 → dagster_fivetran-0.27.16}/dagster_fivetran/components/workspace_component/scaffolder.py +0 -0
  19. {dagster_fivetran-0.27.14 → dagster_fivetran-0.27.16}/dagster_fivetran/constants.py +0 -0
  20. {dagster_fivetran-0.27.14 → dagster_fivetran-0.27.16}/dagster_fivetran/fivetran_event_iterator.py +0 -0
  21. {dagster_fivetran-0.27.14 → dagster_fivetran-0.27.16}/dagster_fivetran/managed/__init__.py +0 -0
  22. {dagster_fivetran-0.27.14 → dagster_fivetran-0.27.16}/dagster_fivetran/managed/reconciliation.py +0 -0
  23. {dagster_fivetran-0.27.14 → dagster_fivetran-0.27.16}/dagster_fivetran/managed/types.py +0 -0
  24. {dagster_fivetran-0.27.14 → dagster_fivetran-0.27.16}/dagster_fivetran/ops.py +0 -0
  25. {dagster_fivetran-0.27.14 → dagster_fivetran-0.27.16}/dagster_fivetran/py.typed +0 -0
  26. {dagster_fivetran-0.27.14 → dagster_fivetran-0.27.16}/dagster_fivetran/resources.py +0 -0
  27. {dagster_fivetran-0.27.14 → dagster_fivetran-0.27.16}/dagster_fivetran/translator.py +0 -0
  28. {dagster_fivetran-0.27.14 → dagster_fivetran-0.27.16}/dagster_fivetran/types.py +0 -0
  29. {dagster_fivetran-0.27.14 → dagster_fivetran-0.27.16}/dagster_fivetran/utils.py +0 -0
  30. {dagster_fivetran-0.27.14 → dagster_fivetran-0.27.16}/dagster_fivetran.egg-info/SOURCES.txt +0 -0
  31. {dagster_fivetran-0.27.14 → dagster_fivetran-0.27.16}/dagster_fivetran.egg-info/dependency_links.txt +0 -0
  32. {dagster_fivetran-0.27.14 → dagster_fivetran-0.27.16}/dagster_fivetran.egg-info/entry_points.txt +0 -0
  33. {dagster_fivetran-0.27.14 → dagster_fivetran-0.27.16}/dagster_fivetran.egg-info/not-zip-safe +0 -0
  34. {dagster_fivetran-0.27.14 → dagster_fivetran-0.27.16}/dagster_fivetran.egg-info/top_level.txt +0 -0
  35. {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.14
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.14
18
+ Requires-Dist: dagster==1.11.16
19
19
  Provides-Extra: managed
20
- Requires-Dist: dagster-managed-elements==0.27.14; extra == "managed"
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(dg.Component, dg.Model, dg.Resolvable):
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 build_defs(self, context: dg.ComponentLoadContext) -> dg.Definitions:
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
- all_asset_specs = self.workspace_resource.load_asset_specs(
127
- dagster_fivetran_translator=self.translator,
128
- connector_selector_fn=connector_selector_fn,
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
- def _asset(context: dg.AssetExecutionContext):
150
- yield from self.execute(context=context, fivetran=self.workspace_resource)
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
- assets.append(_asset)
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.14
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.14
18
+ Requires-Dist: dagster==1.11.16
19
19
  Provides-Extra: managed
20
- Requires-Dist: dagster-managed-elements==0.27.14; extra == "managed"
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
@@ -0,0 +1,7 @@
1
+ dagster==1.11.16
2
+
3
+ [managed]
4
+ dagster-managed-elements==0.27.16
5
+
6
+ [test]
7
+ pytest-order
@@ -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.14"],
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.14",
49
+ "dagster-managed-elements==0.27.16",
50
50
  ],
51
51
  "test": [
52
52
  "pytest-order",
@@ -1 +0,0 @@
1
- __version__ = "0.27.14"
@@ -1,7 +0,0 @@
1
- dagster==1.11.14
2
-
3
- [managed]
4
- dagster-managed-elements==0.27.14
5
-
6
- [test]
7
- pytest-order