dagster-airbyte 0.26.18rc2__tar.gz → 0.26.19__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.

Potentially problematic release.


This version of dagster-airbyte might be problematic. Click here for more details.

Files changed (32) hide show
  1. {dagster_airbyte-0.26.18rc2/dagster_airbyte.egg-info → dagster_airbyte-0.26.19}/PKG-INFO +3 -3
  2. {dagster_airbyte-0.26.18rc2 → dagster_airbyte-0.26.19}/dagster_airbyte/asset_defs.py +35 -4
  3. {dagster_airbyte-0.26.18rc2 → dagster_airbyte-0.26.19}/dagster_airbyte/resources.py +55 -10
  4. dagster_airbyte-0.26.19/dagster_airbyte/version.py +1 -0
  5. {dagster_airbyte-0.26.18rc2 → dagster_airbyte-0.26.19/dagster_airbyte.egg-info}/PKG-INFO +3 -3
  6. dagster_airbyte-0.26.19/dagster_airbyte.egg-info/requires.txt +9 -0
  7. {dagster_airbyte-0.26.18rc2 → dagster_airbyte-0.26.19}/setup.py +2 -2
  8. dagster_airbyte-0.26.18rc2/dagster_airbyte/version.py +0 -1
  9. dagster_airbyte-0.26.18rc2/dagster_airbyte.egg-info/requires.txt +0 -9
  10. {dagster_airbyte-0.26.18rc2 → dagster_airbyte-0.26.19}/LICENSE +0 -0
  11. {dagster_airbyte-0.26.18rc2 → dagster_airbyte-0.26.19}/MANIFEST.in +0 -0
  12. {dagster_airbyte-0.26.18rc2 → dagster_airbyte-0.26.19}/README.md +0 -0
  13. {dagster_airbyte-0.26.18rc2 → dagster_airbyte-0.26.19}/dagster_airbyte/__init__.py +0 -0
  14. {dagster_airbyte-0.26.18rc2 → dagster_airbyte-0.26.19}/dagster_airbyte/asset_decorator.py +0 -0
  15. {dagster_airbyte-0.26.18rc2 → dagster_airbyte-0.26.19}/dagster_airbyte/cli.py +0 -0
  16. {dagster_airbyte-0.26.18rc2 → dagster_airbyte-0.26.19}/dagster_airbyte/managed/__init__.py +0 -0
  17. {dagster_airbyte-0.26.18rc2 → dagster_airbyte-0.26.19}/dagster_airbyte/managed/generated/__init__.py +0 -0
  18. {dagster_airbyte-0.26.18rc2 → dagster_airbyte-0.26.19}/dagster_airbyte/managed/generated/destinations.py +0 -0
  19. {dagster_airbyte-0.26.18rc2 → dagster_airbyte-0.26.19}/dagster_airbyte/managed/generated/sources.py +0 -0
  20. {dagster_airbyte-0.26.18rc2 → dagster_airbyte-0.26.19}/dagster_airbyte/managed/reconciliation.py +0 -0
  21. {dagster_airbyte-0.26.18rc2 → dagster_airbyte-0.26.19}/dagster_airbyte/managed/types.py +0 -0
  22. {dagster_airbyte-0.26.18rc2 → dagster_airbyte-0.26.19}/dagster_airbyte/ops.py +0 -0
  23. {dagster_airbyte-0.26.18rc2 → dagster_airbyte-0.26.19}/dagster_airbyte/py.typed +0 -0
  24. {dagster_airbyte-0.26.18rc2 → dagster_airbyte-0.26.19}/dagster_airbyte/translator.py +0 -0
  25. {dagster_airbyte-0.26.18rc2 → dagster_airbyte-0.26.19}/dagster_airbyte/types.py +0 -0
  26. {dagster_airbyte-0.26.18rc2 → dagster_airbyte-0.26.19}/dagster_airbyte/utils.py +0 -0
  27. {dagster_airbyte-0.26.18rc2 → dagster_airbyte-0.26.19}/dagster_airbyte.egg-info/SOURCES.txt +0 -0
  28. {dagster_airbyte-0.26.18rc2 → dagster_airbyte-0.26.19}/dagster_airbyte.egg-info/dependency_links.txt +0 -0
  29. {dagster_airbyte-0.26.18rc2 → dagster_airbyte-0.26.19}/dagster_airbyte.egg-info/entry_points.txt +0 -0
  30. {dagster_airbyte-0.26.18rc2 → dagster_airbyte-0.26.19}/dagster_airbyte.egg-info/not-zip-safe +0 -0
  31. {dagster_airbyte-0.26.18rc2 → dagster_airbyte-0.26.19}/dagster_airbyte.egg-info/top_level.txt +0 -0
  32. {dagster_airbyte-0.26.18rc2 → dagster_airbyte-0.26.19}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dagster-airbyte
3
- Version: 0.26.18rc2
3
+ Version: 0.26.19
4
4
  Summary: Package for integrating Airbyte with Dagster.
5
5
  Home-page: https://github.com/dagster-io/dagster/tree/master/python_modules/libraries/dagster-airbyte
6
6
  Author: Dagster Labs
@@ -14,13 +14,13 @@ Classifier: License :: OSI Approved :: Apache Software License
14
14
  Classifier: Operating System :: OS Independent
15
15
  Requires-Python: >=3.9,<3.13
16
16
  License-File: LICENSE
17
- Requires-Dist: dagster==1.10.18rc2
17
+ Requires-Dist: dagster==1.10.19
18
18
  Requires-Dist: requests
19
19
  Provides-Extra: test
20
20
  Requires-Dist: requests-mock; extra == "test"
21
21
  Requires-Dist: flaky; extra == "test"
22
22
  Provides-Extra: managed
23
- Requires-Dist: dagster-managed-elements==0.26.18rc2; extra == "managed"
23
+ Requires-Dist: dagster-managed-elements==0.26.19; extra == "managed"
24
24
  Dynamic: author
25
25
  Dynamic: author-email
26
26
  Dynamic: classifier
@@ -40,7 +40,11 @@ from dagster_airbyte.resources import (
40
40
  AirbyteResource,
41
41
  BaseAirbyteResource,
42
42
  )
43
- from dagster_airbyte.translator import AirbyteMetadataSet, DagsterAirbyteTranslator
43
+ from dagster_airbyte.translator import (
44
+ AirbyteConnection,
45
+ AirbyteMetadataSet,
46
+ DagsterAirbyteTranslator,
47
+ )
44
48
  from dagster_airbyte.types import AirbyteTableMetadata
45
49
  from dagster_airbyte.utils import (
46
50
  clean_name,
@@ -1035,6 +1039,7 @@ def build_airbyte_assets_definitions(
1035
1039
  *,
1036
1040
  workspace: AirbyteCloudWorkspace,
1037
1041
  dagster_airbyte_translator: Optional[DagsterAirbyteTranslator] = None,
1042
+ connection_selector_fn: Optional[Callable[[AirbyteConnection], bool]] = None,
1038
1043
  ) -> Sequence[AssetsDefinition]:
1039
1044
  """The list of AssetsDefinition for all connections in the Airbyte workspace.
1040
1045
 
@@ -1043,6 +1048,8 @@ def build_airbyte_assets_definitions(
1043
1048
  dagster_airbyte_translator (Optional[DagsterAirbyteTranslator], optional): The translator to use
1044
1049
  to convert Airbyte content into :py:class:`dagster.AssetSpec`.
1045
1050
  Defaults to :py:class:`DagsterAirbyteTranslator`.
1051
+ connection_selector_fn (Optional[Callable[[AirbyteConnection], bool]]): A function that allows for filtering
1052
+ which Airbyte connection assets are created for.
1046
1053
 
1047
1054
  Returns:
1048
1055
  List[AssetsDefinition]: The list of AssetsDefinition for all connections in the Airbyte workspace.
@@ -1062,7 +1069,6 @@ def build_airbyte_assets_definitions(
1062
1069
  client_secret=dg.EnvVar("AIRBYTE_CLOUD_CLIENT_SECRET"),
1063
1070
  )
1064
1071
 
1065
-
1066
1072
  airbyte_assets = build_airbyte_assets_definitions(workspace=workspace)
1067
1073
 
1068
1074
  defs = dg.Definitions(
@@ -1096,21 +1102,46 @@ def build_airbyte_assets_definitions(
1096
1102
  client_secret=dg.EnvVar("AIRBYTE_CLOUD_CLIENT_SECRET"),
1097
1103
  )
1098
1104
 
1099
-
1100
1105
  airbyte_assets = build_airbyte_assets_definitions(
1101
1106
  workspace=workspace,
1102
1107
  dagster_airbyte_translator=CustomDagsterAirbyteTranslator()
1103
1108
  )
1104
1109
 
1110
+ defs = dg.Definitions(
1111
+ assets=airbyte_assets,
1112
+ resources={"airbyte": airbyte_workspace},
1113
+ )
1114
+
1115
+ Filter connections by name:
1116
+
1117
+ .. code-block:: python
1118
+
1119
+ from dagster_airbyte import AirbyteCloudWorkspace, build_airbyte_assets_definitions
1120
+
1121
+ import dagster as dg
1122
+
1123
+ airbyte_workspace = AirbyteCloudWorkspace(
1124
+ workspace_id=dg.EnvVar("AIRBYTE_CLOUD_WORKSPACE_ID"),
1125
+ client_id=dg.EnvVar("AIRBYTE_CLOUD_CLIENT_ID"),
1126
+ client_secret=dg.EnvVar("AIRBYTE_CLOUD_CLIENT_SECRET"),
1127
+ )
1128
+
1129
+ airbyte_assets = build_airbyte_assets_definitions(
1130
+ workspace=workspace,
1131
+ connection_selector_fn=lambda connection: connection.name in ["connection1", "connection2"]
1132
+ )
1133
+
1105
1134
  defs = dg.Definitions(
1106
1135
  assets=airbyte_assets,
1107
1136
  resources={"airbyte": airbyte_workspace},
1108
1137
  )
1109
1138
  """
1110
1139
  dagster_airbyte_translator = dagster_airbyte_translator or DagsterAirbyteTranslator()
1140
+ connection_selector_fn = connection_selector_fn or (lambda connection: True)
1111
1141
 
1112
1142
  all_asset_specs = workspace.load_asset_specs(
1113
- dagster_airbyte_translator=dagster_airbyte_translator
1143
+ dagster_airbyte_translator=dagster_airbyte_translator,
1144
+ connection_selector_fn=connection_selector_fn,
1114
1145
  )
1115
1146
 
1116
1147
  connections = {
@@ -4,10 +4,10 @@ import logging
4
4
  import sys
5
5
  import time
6
6
  from abc import abstractmethod
7
- from collections.abc import Mapping, Sequence
7
+ from collections.abc import Iterator, Mapping, Sequence
8
8
  from contextlib import contextmanager
9
9
  from datetime import datetime, timedelta
10
- from typing import Any, Optional, cast
10
+ from typing import Any, Callable, Optional, cast
11
11
 
12
12
  import requests
13
13
  from dagster import (
@@ -1142,7 +1142,6 @@ class AirbyteCloudWorkspace(ConfigurableResource):
1142
1142
  default=15,
1143
1143
  description="Time (in seconds) after which the requests to Airbyte are declared timed out.",
1144
1144
  )
1145
-
1146
1145
  _client: AirbyteCloudClient = PrivateAttr(default=None) # type: ignore
1147
1146
 
1148
1147
  @cached_method
@@ -1197,6 +1196,7 @@ class AirbyteCloudWorkspace(ConfigurableResource):
1197
1196
  def load_asset_specs(
1198
1197
  self,
1199
1198
  dagster_airbyte_translator: Optional[DagsterAirbyteTranslator] = None,
1199
+ connection_selector_fn: Optional[Callable[[AirbyteConnection], bool]] = None,
1200
1200
  ) -> Sequence[AssetSpec]:
1201
1201
  """Returns a list of AssetSpecs representing the Airbyte content in the workspace.
1202
1202
 
@@ -1204,6 +1204,8 @@ class AirbyteCloudWorkspace(ConfigurableResource):
1204
1204
  dagster_airbyte_translator (Optional[DagsterAirbyteTranslator], optional): The translator to use
1205
1205
  to convert Airbyte content into :py:class:`dagster.AssetSpec`.
1206
1206
  Defaults to :py:class:`DagsterAirbyteTranslator`.
1207
+ connection_selector_fn (Optional[Callable[[AirbyteConnection], bool]]): A function that allows for filtering
1208
+ which Airbyte connection assets are created for.
1207
1209
 
1208
1210
  Returns:
1209
1211
  List[AssetSpec]: The set of assets representing the Airbyte content in the workspace.
@@ -1228,7 +1230,9 @@ class AirbyteCloudWorkspace(ConfigurableResource):
1228
1230
  dagster_airbyte_translator = dagster_airbyte_translator or DagsterAirbyteTranslator()
1229
1231
 
1230
1232
  return load_airbyte_cloud_asset_specs(
1231
- workspace=self, dagster_airbyte_translator=dagster_airbyte_translator
1233
+ workspace=self,
1234
+ dagster_airbyte_translator=dagster_airbyte_translator,
1235
+ connection_selector_fn=connection_selector_fn,
1232
1236
  )
1233
1237
 
1234
1238
  def _generate_materialization(
@@ -1317,11 +1321,27 @@ class AirbyteCloudWorkspace(ConfigurableResource):
1317
1321
  if unmaterialized_asset_keys:
1318
1322
  context.log.warning(f"Assets were not materialized: {unmaterialized_asset_keys}")
1319
1323
 
1324
+ @contextmanager
1325
+ def process_config_and_initialize_cm_cached(self) -> Iterator["AirbyteCloudWorkspace"]:
1326
+ # Hack to avoid reconstructing initialized copies of this resource, which invalidates
1327
+ # @cached_method caches. This means that multiple calls to load_airbyte_cloud_asset_specs
1328
+ # will not trigger multiple API calls to fetch the workspace data.
1329
+ # Bespoke impl since @cached_method doesn't play nice with iterators; it's exhausted after
1330
+ # the first call.
1331
+ if hasattr(self, "_initialized"):
1332
+ yield getattr(self, "_initialized")
1333
+ else:
1334
+ with self.process_config_and_initialize_cm() as initialized_workspace:
1335
+ initialized = initialized_workspace
1336
+ setattr(self, "_initialized", initialized)
1337
+ yield initialized
1338
+
1320
1339
 
1321
1340
  @beta
1322
1341
  def load_airbyte_cloud_asset_specs(
1323
1342
  workspace: AirbyteCloudWorkspace,
1324
1343
  dagster_airbyte_translator: Optional[DagsterAirbyteTranslator] = None,
1344
+ connection_selector_fn: Optional[Callable[[AirbyteConnection], bool]] = None,
1325
1345
  ) -> Sequence[AssetSpec]:
1326
1346
  """Returns a list of AssetSpecs representing the Airbyte content in the workspace.
1327
1347
 
@@ -1330,6 +1350,8 @@ def load_airbyte_cloud_asset_specs(
1330
1350
  dagster_airbyte_translator (Optional[DagsterAirbyteTranslator], optional): The translator to use
1331
1351
  to convert Airbyte content into :py:class:`dagster.AssetSpec`.
1332
1352
  Defaults to :py:class:`DagsterAirbyteTranslator`.
1353
+ connection_selector_fn (Optional[Callable[[AirbyteConnection], bool]]): A function that allows for filtering
1354
+ which Airbyte connection assets are created for.
1333
1355
 
1334
1356
  Returns:
1335
1357
  List[AssetSpec]: The set of assets representing the Airbyte content in the workspace.
@@ -1349,13 +1371,32 @@ def load_airbyte_cloud_asset_specs(
1349
1371
  client_secret=dg.EnvVar("AIRBYTE_CLOUD_CLIENT_SECRET"),
1350
1372
  )
1351
1373
 
1352
-
1353
1374
  airbyte_cloud_specs = load_airbyte_cloud_asset_specs(airbyte_cloud_workspace)
1354
1375
  defs = dg.Definitions(assets=airbyte_cloud_specs)
1376
+
1377
+ Filter connections by name:
1378
+
1379
+ .. code-block:: python
1380
+
1381
+ from dagster_airbyte import AirbyteCloudWorkspace, load_airbyte_cloud_asset_specs
1382
+
1383
+ import dagster as dg
1384
+
1385
+ airbyte_cloud_workspace = AirbyteCloudWorkspace(
1386
+ workspace_id=dg.EnvVar("AIRBYTE_CLOUD_WORKSPACE_ID"),
1387
+ client_id=dg.EnvVar("AIRBYTE_CLOUD_CLIENT_ID"),
1388
+ client_secret=dg.EnvVar("AIRBYTE_CLOUD_CLIENT_SECRET"),
1389
+ )
1390
+
1391
+ airbyte_cloud_specs = load_airbyte_cloud_asset_specs(
1392
+ workspace=airbyte_cloud_workspace,
1393
+ connection_selector_fn=lambda connection: connection.name in ["connection1", "connection2"]
1394
+ )
1395
+ defs = dg.Definitions(assets=airbyte_cloud_specs)
1355
1396
  """
1356
1397
  dagster_airbyte_translator = dagster_airbyte_translator or DagsterAirbyteTranslator()
1357
1398
 
1358
- with workspace.process_config_and_initialize_cm() as initialized_workspace:
1399
+ with workspace.process_config_and_initialize_cm_cached() as initialized_workspace:
1359
1400
  return [
1360
1401
  spec.merge_attributes(
1361
1402
  metadata={DAGSTER_AIRBYTE_TRANSLATOR_METADATA_KEY: dagster_airbyte_translator}
@@ -1364,6 +1405,7 @@ def load_airbyte_cloud_asset_specs(
1364
1405
  AirbyteCloudWorkspaceDefsLoader(
1365
1406
  workspace=initialized_workspace,
1366
1407
  translator=dagster_airbyte_translator,
1408
+ connection_selector_fn=connection_selector_fn,
1367
1409
  )
1368
1410
  .build_defs()
1369
1411
  .assets,
@@ -1373,21 +1415,24 @@ def load_airbyte_cloud_asset_specs(
1373
1415
 
1374
1416
 
1375
1417
  @record
1376
- class AirbyteCloudWorkspaceDefsLoader(StateBackedDefinitionsLoader[Mapping[str, Any]]):
1418
+ class AirbyteCloudWorkspaceDefsLoader(StateBackedDefinitionsLoader[AirbyteWorkspaceData]):
1377
1419
  workspace: AirbyteCloudWorkspace
1378
1420
  translator: DagsterAirbyteTranslator
1421
+ connection_selector_fn: Optional[Callable[[AirbyteConnection], bool]]
1379
1422
 
1380
1423
  @property
1381
1424
  def defs_key(self) -> str:
1382
- return f"{AIRBYTE_RECONSTRUCTION_METADATA_KEY_PREFIX}/{self.workspace.workspace_id}"
1425
+ return f"{AIRBYTE_RECONSTRUCTION_METADATA_KEY_PREFIX}.{self.workspace.workspace_id}"
1383
1426
 
1384
- def fetch_state(self) -> AirbyteWorkspaceData: # pyright: ignore[reportIncompatibleMethodOverride]
1427
+ def fetch_state(self) -> AirbyteWorkspaceData:
1385
1428
  return self.workspace.fetch_airbyte_workspace_data()
1386
1429
 
1387
- def defs_from_state(self, state: AirbyteWorkspaceData) -> Definitions: # pyright: ignore[reportIncompatibleMethodOverride]
1430
+ def defs_from_state(self, state: AirbyteWorkspaceData) -> Definitions:
1388
1431
  all_asset_specs = [
1389
1432
  self.translator.get_asset_spec(props)
1390
1433
  for props in state.to_airbyte_connection_table_props_data()
1434
+ if not self.connection_selector_fn
1435
+ or self.connection_selector_fn(state.connections_by_id[props.connection_id])
1391
1436
  ]
1392
1437
 
1393
1438
  return Definitions(assets=all_asset_specs)
@@ -0,0 +1 @@
1
+ __version__ = "0.26.19"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dagster-airbyte
3
- Version: 0.26.18rc2
3
+ Version: 0.26.19
4
4
  Summary: Package for integrating Airbyte with Dagster.
5
5
  Home-page: https://github.com/dagster-io/dagster/tree/master/python_modules/libraries/dagster-airbyte
6
6
  Author: Dagster Labs
@@ -14,13 +14,13 @@ Classifier: License :: OSI Approved :: Apache Software License
14
14
  Classifier: Operating System :: OS Independent
15
15
  Requires-Python: >=3.9,<3.13
16
16
  License-File: LICENSE
17
- Requires-Dist: dagster==1.10.18rc2
17
+ Requires-Dist: dagster==1.10.19
18
18
  Requires-Dist: requests
19
19
  Provides-Extra: test
20
20
  Requires-Dist: requests-mock; extra == "test"
21
21
  Requires-Dist: flaky; extra == "test"
22
22
  Provides-Extra: managed
23
- Requires-Dist: dagster-managed-elements==0.26.18rc2; extra == "managed"
23
+ Requires-Dist: dagster-managed-elements==0.26.19; extra == "managed"
24
24
  Dynamic: author
25
25
  Dynamic: author-email
26
26
  Dynamic: classifier
@@ -0,0 +1,9 @@
1
+ dagster==1.10.19
2
+ requests
3
+
4
+ [managed]
5
+ dagster-managed-elements==0.26.19
6
+
7
+ [test]
8
+ requests-mock
9
+ flaky
@@ -36,7 +36,7 @@ setup(
36
36
  include_package_data=True,
37
37
  python_requires=">=3.9,<3.13",
38
38
  install_requires=[
39
- "dagster==1.10.18rc2",
39
+ "dagster==1.10.19",
40
40
  "requests",
41
41
  ],
42
42
  zip_safe=False,
@@ -51,7 +51,7 @@ setup(
51
51
  "flaky",
52
52
  ],
53
53
  "managed": [
54
- "dagster-managed-elements==0.26.18rc2",
54
+ "dagster-managed-elements==0.26.19",
55
55
  ],
56
56
  },
57
57
  )
@@ -1 +0,0 @@
1
- __version__ = "0.26.18rc2"
@@ -1,9 +0,0 @@
1
- dagster==1.10.18rc2
2
- requests
3
-
4
- [managed]
5
- dagster-managed-elements==0.26.18rc2
6
-
7
- [test]
8
- requests-mock
9
- flaky