dagster-duckdb 0.20.3__tar.gz → 0.28.6__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 (23) hide show
  1. {dagster-duckdb-0.20.3 → dagster_duckdb-0.28.6}/LICENSE +1 -1
  2. dagster_duckdb-0.28.6/PKG-INFO +29 -0
  3. dagster_duckdb-0.28.6/README.md +4 -0
  4. dagster_duckdb-0.28.6/dagster_duckdb/__init__.py +10 -0
  5. {dagster-duckdb-0.20.3 → dagster_duckdb-0.28.6}/dagster_duckdb/io_manager.py +121 -33
  6. {dagster-duckdb-0.20.3 → dagster_duckdb-0.28.6}/dagster_duckdb/resource.py +25 -2
  7. dagster_duckdb-0.28.6/dagster_duckdb/version.py +1 -0
  8. dagster_duckdb-0.28.6/dagster_duckdb.egg-info/PKG-INFO +29 -0
  9. dagster_duckdb-0.28.6/dagster_duckdb.egg-info/requires.txt +8 -0
  10. {dagster-duckdb-0.20.3 → dagster_duckdb-0.28.6}/setup.py +8 -12
  11. dagster-duckdb-0.20.3/PKG-INFO +0 -16
  12. dagster-duckdb-0.20.3/README.md +0 -4
  13. dagster-duckdb-0.20.3/dagster_duckdb/__init__.py +0 -10
  14. dagster-duckdb-0.20.3/dagster_duckdb/version.py +0 -1
  15. dagster-duckdb-0.20.3/dagster_duckdb.egg-info/PKG-INFO +0 -16
  16. dagster-duckdb-0.20.3/dagster_duckdb.egg-info/requires.txt +0 -13
  17. {dagster-duckdb-0.20.3 → dagster_duckdb-0.28.6}/MANIFEST.in +0 -0
  18. {dagster-duckdb-0.20.3 → dagster_duckdb-0.28.6}/dagster_duckdb/py.typed +0 -0
  19. {dagster-duckdb-0.20.3 → dagster_duckdb-0.28.6}/dagster_duckdb.egg-info/SOURCES.txt +0 -0
  20. {dagster-duckdb-0.20.3 → dagster_duckdb-0.28.6}/dagster_duckdb.egg-info/dependency_links.txt +0 -0
  21. {dagster-duckdb-0.20.3 → dagster_duckdb-0.28.6}/dagster_duckdb.egg-info/not-zip-safe +0 -0
  22. {dagster-duckdb-0.20.3 → dagster_duckdb-0.28.6}/dagster_duckdb.egg-info/top_level.txt +0 -0
  23. {dagster-duckdb-0.20.3 → dagster_duckdb-0.28.6}/setup.cfg +0 -0
@@ -186,7 +186,7 @@
186
186
  same "printed page" as the copyright notice for easier
187
187
  identification within third-party archives.
188
188
 
189
- Copyright 2023 Elementl, Inc.
189
+ Copyright 2025 Dagster Labs, Inc.
190
190
 
191
191
  Licensed under the Apache License, Version 2.0 (the "License");
192
192
  you may not use this file except in compliance with the License.
@@ -0,0 +1,29 @@
1
+ Metadata-Version: 2.4
2
+ Name: dagster-duckdb
3
+ Version: 0.28.6
4
+ Summary: Package for DuckDB-specific Dagster framework op and resource components.
5
+ Home-page: https://github.com/dagster-io/dagster/tree/master/python_modules/libraries/dagster-duckb
6
+ Author: Dagster Labs
7
+ Author-email: hello@dagsterlabs.com
8
+ License: Apache-2.0
9
+ Classifier: Programming Language :: Python :: 3.10
10
+ Classifier: License :: OSI Approved :: Apache Software License
11
+ Classifier: Operating System :: OS Independent
12
+ Requires-Python: >=3.10,<3.14
13
+ License-File: LICENSE
14
+ Requires-Dist: duckdb
15
+ Requires-Dist: dagster==1.12.6
16
+ Provides-Extra: pandas
17
+ Requires-Dist: pandas; extra == "pandas"
18
+ Provides-Extra: pyspark
19
+ Requires-Dist: pyspark<4,>=3; extra == "pyspark"
20
+ Dynamic: author
21
+ Dynamic: author-email
22
+ Dynamic: classifier
23
+ Dynamic: home-page
24
+ Dynamic: license
25
+ Dynamic: license-file
26
+ Dynamic: provides-extra
27
+ Dynamic: requires-dist
28
+ Dynamic: requires-python
29
+ Dynamic: summary
@@ -0,0 +1,4 @@
1
+ # dagster-duckdb
2
+
3
+ The docs for `dagster-duckdb` can be found
4
+ [here](https://docs.dagster.io/api/python-api/libraries/dagster-duckdb).
@@ -0,0 +1,10 @@
1
+ from dagster_shared.libraries import DagsterLibraryRegistry
2
+
3
+ from dagster_duckdb.io_manager import (
4
+ DuckDBIOManager as DuckDBIOManager,
5
+ build_duckdb_io_manager as build_duckdb_io_manager,
6
+ )
7
+ from dagster_duckdb.resource import DuckDBResource as DuckDBResource
8
+ from dagster_duckdb.version import __version__
9
+
10
+ DagsterLibraryRegistry.register("dagster-duckdb", __version__)
@@ -1,13 +1,12 @@
1
1
  from abc import abstractmethod
2
+ from collections.abc import Sequence
2
3
  from contextlib import contextmanager
3
- from typing import Optional, Sequence, Type, cast
4
+ from typing import Any, Optional, cast
4
5
 
5
6
  import duckdb
6
7
  from dagster import IOManagerDefinition, OutputContext, io_manager
7
- from dagster._config.pythonic_config import (
8
- ConfigurableIOManagerFactory,
9
- )
10
- from dagster._core.definitions.time_window_partitions import TimeWindow
8
+ from dagster._config.pythonic_config import ConfigurableIOManagerFactory
9
+ from dagster._core.definitions.partitions.utils import TimeWindow
11
10
  from dagster._core.storage.db_io_manager import (
12
11
  DbClient,
13
12
  DbIOManager,
@@ -17,20 +16,21 @@ from dagster._core.storage.db_io_manager import (
17
16
  )
18
17
  from dagster._core.storage.io_manager import dagster_maintained_io_manager
19
18
  from dagster._utils.backoff import backoff
19
+ from packaging.version import Version
20
20
  from pydantic import Field
21
21
 
22
22
  DUCKDB_DATETIME_FORMAT = "%Y-%m-%d %H:%M:%S"
23
23
 
24
24
 
25
25
  def build_duckdb_io_manager(
26
- type_handlers: Sequence[DbTypeHandler], default_load_type: Optional[Type] = None
26
+ type_handlers: Sequence[DbTypeHandler], default_load_type: Optional[type] = None
27
27
  ) -> IOManagerDefinition:
28
28
  """Builds an IO manager definition that reads inputs from and writes outputs to DuckDB.
29
29
 
30
30
  Args:
31
31
  type_handlers (Sequence[DbTypeHandler]): Each handler defines how to translate between
32
32
  DuckDB tables and an in-memory type - e.g. a Pandas DataFrame. If only
33
- one DbTypeHandler is provided, it will be used as teh default_load_type.
33
+ one DbTypeHandler is provided, it will be used as the default_load_type.
34
34
  default_load_type (Type): When an input has no type annotation, load it as this type.
35
35
 
36
36
  Returns:
@@ -50,17 +50,43 @@ def build_duckdb_io_manager(
50
50
 
51
51
  duckdb_io_manager = build_duckdb_io_manager([DuckDBPandasTypeHandler()])
52
52
 
53
- @repository
54
- def my_repo():
55
- return with_resources(
56
- [my_table],
57
- {"io_manager": duckdb_io_manager.configured({"database": "my_db.duckdb"})}
58
- )
53
+ Definitions(
54
+ assets=[my_table]
55
+ resources={"io_manager" duckdb_io_manager.configured({"database": "my_db.duckdb"})}
56
+ )
57
+
58
+ You can set a default schema to store the assets using the ``schema`` configuration value of the DuckDB I/O
59
+ Manager. This schema will be used if no other schema is specified directly on an asset or op.
60
+
61
+ .. code-block:: python
62
+
63
+ Definitions(
64
+ assets=[my_table]
65
+ resources={"io_manager" duckdb_io_manager.configured(
66
+ {"database": "my_db.duckdb", "schema": "my_schema"} # will be used as the schema
67
+ )}
68
+ )
69
+
59
70
 
60
- If you do not provide a schema, Dagster will determine a schema based on the assets and ops using
61
- the IO Manager. For assets, the schema will be determined from the asset key. For ops, the schema can be
62
- specified by including a "schema" entry in output metadata. If none of these is provided, the schema will
63
- default to "public".
71
+ On individual assets, you an also specify the schema where they should be stored using metadata or
72
+ by adding a ``key_prefix`` to the asset key. If both ``key_prefix`` and metadata are defined, the metadata will
73
+ take precedence.
74
+
75
+ .. code-block:: python
76
+
77
+ @asset(
78
+ key_prefix=["my_schema"] # will be used as the schema in duckdb
79
+ )
80
+ def my_table() -> pd.DataFrame:
81
+ ...
82
+
83
+ @asset(
84
+ metadata={"schema": "my_schema"} # will be used as the schema in duckdb
85
+ )
86
+ def my_other_table() -> pd.DataFrame:
87
+ ...
88
+
89
+ For ops, the schema can be specified by including a "schema" entry in output metadata.
64
90
 
65
91
  .. code-block:: python
66
92
 
@@ -70,6 +96,8 @@ def build_duckdb_io_manager(
70
96
  def make_my_table() -> pd.DataFrame:
71
97
  ...
72
98
 
99
+ If none of these is provided, the schema will default to "public".
100
+
73
101
  To only use specific columns of a table as input to a downstream op or asset, add the metadata "columns" to the
74
102
  In or AssetIn.
75
103
 
@@ -126,15 +154,40 @@ class DuckDBIOManager(ConfigurableIOManagerFactory):
126
154
  def my_table() -> pd.DataFrame: # the name of the asset will be the table name
127
155
  ...
128
156
 
129
- defs = Definitions(
157
+ Definitions(
130
158
  assets=[my_table],
131
159
  resources={"io_manager": MyDuckDBIOManager(database="my_db.duckdb")}
132
160
  )
133
161
 
134
- If you do not provide a schema, Dagster will determine a schema based on the assets and ops using
135
- the IO Manager. For assets, the schema will be determined from the asset key, as in the above example.
136
- For ops, the schema can be specified by including a "schema" entry in output metadata. If none
137
- of these is provided, the schema will default to "public".
162
+ You can set a default schema to store the assets using the ``schema`` configuration value of the DuckDB I/O
163
+ Manager. This schema will be used if no other schema is specified directly on an asset or op.
164
+
165
+ .. code-block:: python
166
+
167
+ Definitions(
168
+ assets=[my_table],
169
+ resources={"io_manager": MyDuckDBIOManager(database="my_db.duckdb", schema="my_schema")}
170
+ )
171
+
172
+ On individual assets, you an also specify the schema where they should be stored using metadata or
173
+ by adding a ``key_prefix`` to the asset key. If both ``key_prefix`` and metadata are defined, the metadata will
174
+ take precedence.
175
+
176
+ .. code-block:: python
177
+
178
+ @asset(
179
+ key_prefix=["my_schema"] # will be used as the schema in duckdb
180
+ )
181
+ def my_table() -> pd.DataFrame:
182
+ ...
183
+
184
+ @asset(
185
+ metadata={"schema": "my_schema"} # will be used as the schema in duckdb
186
+ )
187
+ def my_other_table() -> pd.DataFrame:
188
+ ...
189
+
190
+ For ops, the schema can be specified by including a "schema" entry in output metadata.
138
191
 
139
192
  .. code-block:: python
140
193
 
@@ -144,6 +197,8 @@ class DuckDBIOManager(ConfigurableIOManagerFactory):
144
197
  def make_my_table() -> pd.DataFrame:
145
198
  ...
146
199
 
200
+ If none of these is provided, the schema will default to "public".
201
+
147
202
  To only use specific columns of a table as input to a downstream op or asset, add the metadata "columns" to the
148
203
  In or AssetIn.
149
204
 
@@ -156,20 +211,37 @@ class DuckDBIOManager(ConfigurableIOManagerFactory):
156
211
  # my_table will just contain the data from column "a"
157
212
  ...
158
213
 
214
+ Set DuckDB configuration options using the connection_config field. See
215
+ https://duckdb.org/docs/sql/configuration.html for all available settings.
216
+
217
+ .. code-block:: python
218
+
219
+ Definitions(
220
+ assets=[my_table],
221
+ resources={"io_manager": MyDuckDBIOManager(database="my_db.duckdb",
222
+ connection_config={"arrow_large_buffer_size": True})}
223
+ )
224
+
159
225
  """
160
226
 
161
227
  database: str = Field(description="Path to the DuckDB database.")
228
+ connection_config: dict[str, Any] = Field(
229
+ description=(
230
+ "DuckDB connection configuration options. See"
231
+ " https://duckdb.org/docs/sql/configuration.html"
232
+ ),
233
+ default={},
234
+ )
162
235
  schema_: Optional[str] = Field(
163
236
  default=None, alias="schema", description="Name of the schema to use."
164
237
  ) # schema is a reserved word for pydantic
165
238
 
166
239
  @staticmethod
167
240
  @abstractmethod
168
- def type_handlers() -> Sequence[DbTypeHandler]:
169
- ...
241
+ def type_handlers() -> Sequence[DbTypeHandler]: ...
170
242
 
171
243
  @staticmethod
172
- def default_load_type() -> Optional[Type]:
244
+ def default_load_type() -> Optional[type]:
173
245
  return None
174
246
 
175
247
  def create_io_manager(self, context) -> DbIOManager:
@@ -200,7 +272,7 @@ class DuckDbClient(DbClient):
200
272
  def get_select_statement(table_slice: TableSlice) -> str:
201
273
  col_str = ", ".join(table_slice.columns) if table_slice.columns else "*"
202
274
 
203
- if table_slice.partition_dimensions and len(table_slice.partition_dimensions) > 0:
275
+ if table_slice.partition_dimensions:
204
276
  query = f"SELECT {col_str} FROM {table_slice.schema}.{table_slice.table} WHERE\n"
205
277
  return query + _partition_where_clause(table_slice.partition_dimensions)
206
278
  else:
@@ -208,11 +280,25 @@ class DuckDbClient(DbClient):
208
280
 
209
281
  @staticmethod
210
282
  @contextmanager
211
- def connect(context, _):
283
+ def connect(context, _): # pyright: ignore[reportIncompatibleMethodOverride]
284
+ config = context.resource_config["connection_config"]
285
+
286
+ # support for `custom_user_agent` was added in v1.0.0
287
+ # https://github.com/duckdb/duckdb/commit/0c66b6007b736ed2197bca54d20c9ad9a5eeef46
288
+ if Version(duckdb.__version__) >= Version("1.0.0"):
289
+ config = {
290
+ "custom_user_agent": "dagster",
291
+ **config,
292
+ }
293
+
212
294
  conn = backoff(
213
295
  fn=duckdb.connect,
214
296
  retry_on=(RuntimeError, duckdb.IOException),
215
- kwargs={"database": context.resource_config["database"], "read_only": False},
297
+ kwargs={
298
+ "database": context.resource_config["database"],
299
+ "read_only": False,
300
+ "config": config,
301
+ },
216
302
  max_retries=10,
217
303
  )
218
304
 
@@ -225,7 +311,7 @@ def _get_cleanup_statement(table_slice: TableSlice) -> str:
225
311
  """Returns a SQL statement that deletes data in the given table to make way for the output data
226
312
  being written.
227
313
  """
228
- if table_slice.partition_dimensions and len(table_slice.partition_dimensions) > 0:
314
+ if table_slice.partition_dimensions:
229
315
  query = f"DELETE FROM {table_slice.schema}.{table_slice.table} WHERE\n"
230
316
  return query + _partition_where_clause(table_slice.partition_dimensions)
231
317
  else:
@@ -234,15 +320,17 @@ def _get_cleanup_statement(table_slice: TableSlice) -> str:
234
320
 
235
321
  def _partition_where_clause(partition_dimensions: Sequence[TablePartitionDimension]) -> str:
236
322
  return " AND\n".join(
237
- _time_window_where_clause(partition_dimension)
238
- if isinstance(partition_dimension.partitions, TimeWindow)
239
- else _static_where_clause(partition_dimension)
323
+ (
324
+ _time_window_where_clause(partition_dimension)
325
+ if isinstance(partition_dimension.partitions, TimeWindow)
326
+ else _static_where_clause(partition_dimension)
327
+ )
240
328
  for partition_dimension in partition_dimensions
241
329
  )
242
330
 
243
331
 
244
332
  def _time_window_where_clause(table_partition: TablePartitionDimension) -> str:
245
- partition = cast(TimeWindow, table_partition.partitions)
333
+ partition = cast("TimeWindow", table_partition.partitions)
246
334
  start_dt, end_dt = partition
247
335
  start_dt_str = start_dt.strftime(DUCKDB_DATETIME_FORMAT)
248
336
  end_dt_str = end_dt.strftime(DUCKDB_DATETIME_FORMAT)
@@ -1,8 +1,10 @@
1
1
  from contextlib import contextmanager
2
+ from typing import Any
2
3
 
3
4
  import duckdb
4
5
  from dagster import ConfigurableResource
5
6
  from dagster._utils.backoff import backoff
7
+ from packaging.version import Version
6
8
  from pydantic import Field
7
9
 
8
10
 
@@ -20,7 +22,7 @@ class DuckDBResource(ConfigurableResource):
20
22
  with duckdb.get_connection() as conn:
21
23
  conn.execute("SELECT * from MY_SCHEMA.MY_TABLE")
22
24
 
23
- defs = Definitions(
25
+ Definitions(
24
26
  assets=[my_table],
25
27
  resources={"duckdb": DuckDBResource(database="path/to/db.duckdb")}
26
28
  )
@@ -33,6 +35,13 @@ class DuckDBResource(ConfigurableResource):
33
35
  " database "
34
36
  )
35
37
  )
38
+ connection_config: dict[str, Any] = Field(
39
+ description=(
40
+ "DuckDB connection configuration options. See"
41
+ " https://duckdb.org/docs/sql/configuration.html"
42
+ ),
43
+ default={},
44
+ )
36
45
 
37
46
  @classmethod
38
47
  def _is_dagster_maintained(cls) -> bool:
@@ -40,10 +49,24 @@ class DuckDBResource(ConfigurableResource):
40
49
 
41
50
  @contextmanager
42
51
  def get_connection(self):
52
+ config = self.connection_config
53
+
54
+ # support for `custom_user_agent` was added in v1.0.0
55
+ # https://github.com/duckdb/duckdb/commit/0c66b6007b736ed2197bca54d20c9ad9a5eeef46
56
+ if Version(duckdb.__version__) >= Version("1.0.0"):
57
+ config = {
58
+ "custom_user_agent": "dagster",
59
+ **config,
60
+ }
61
+
43
62
  conn = backoff(
44
63
  fn=duckdb.connect,
45
64
  retry_on=(RuntimeError, duckdb.IOException),
46
- kwargs={"database": self.database, "read_only": False},
65
+ kwargs={
66
+ "database": self.database,
67
+ "read_only": False,
68
+ "config": config,
69
+ },
47
70
  max_retries=10,
48
71
  )
49
72
 
@@ -0,0 +1 @@
1
+ __version__ = "0.28.6"
@@ -0,0 +1,29 @@
1
+ Metadata-Version: 2.4
2
+ Name: dagster-duckdb
3
+ Version: 0.28.6
4
+ Summary: Package for DuckDB-specific Dagster framework op and resource components.
5
+ Home-page: https://github.com/dagster-io/dagster/tree/master/python_modules/libraries/dagster-duckb
6
+ Author: Dagster Labs
7
+ Author-email: hello@dagsterlabs.com
8
+ License: Apache-2.0
9
+ Classifier: Programming Language :: Python :: 3.10
10
+ Classifier: License :: OSI Approved :: Apache Software License
11
+ Classifier: Operating System :: OS Independent
12
+ Requires-Python: >=3.10,<3.14
13
+ License-File: LICENSE
14
+ Requires-Dist: duckdb
15
+ Requires-Dist: dagster==1.12.6
16
+ Provides-Extra: pandas
17
+ Requires-Dist: pandas; extra == "pandas"
18
+ Provides-Extra: pyspark
19
+ Requires-Dist: pyspark<4,>=3; extra == "pyspark"
20
+ Dynamic: author
21
+ Dynamic: author-email
22
+ Dynamic: classifier
23
+ Dynamic: home-page
24
+ Dynamic: license
25
+ Dynamic: license-file
26
+ Dynamic: provides-extra
27
+ Dynamic: requires-dist
28
+ Dynamic: requires-python
29
+ Dynamic: summary
@@ -0,0 +1,8 @@
1
+ duckdb
2
+ dagster==1.12.6
3
+
4
+ [pandas]
5
+ pandas
6
+
7
+ [pyspark]
8
+ pyspark<4,>=3
@@ -1,11 +1,10 @@
1
1
  from pathlib import Path
2
- from typing import Dict
3
2
 
4
3
  from setuptools import find_packages, setup
5
4
 
6
5
 
7
6
  def get_version() -> str:
8
- version: Dict[str, str] = {}
7
+ version: dict[str, str] = {}
9
8
  with open(Path(__file__).parent / "dagster_duckdb/version.py", encoding="utf8") as fp:
10
9
  exec(fp.read(), version)
11
10
 
@@ -18,31 +17,28 @@ pin = "" if ver == "1!0+dev" else f"=={ver}"
18
17
  setup(
19
18
  name="dagster-duckdb",
20
19
  version=ver,
21
- author="Elementl",
22
- author_email="hello@elementl.com",
20
+ author="Dagster Labs",
21
+ author_email="hello@dagsterlabs.com",
23
22
  license="Apache-2.0",
24
23
  description="Package for DuckDB-specific Dagster framework op and resource components.",
25
24
  url="https://github.com/dagster-io/dagster/tree/master/python_modules/libraries/dagster-duckb",
26
25
  classifiers=[
27
- "Programming Language :: Python :: 3.8",
28
- "Programming Language :: Python :: 3.9",
29
26
  "Programming Language :: Python :: 3.10",
30
27
  "License :: OSI Approved :: Apache Software License",
31
28
  "Operating System :: OS Independent",
32
29
  ],
33
30
  packages=find_packages(exclude=["dagster_duckdb_tests*"]),
34
31
  include_package_data=True,
32
+ python_requires=">=3.10,<3.14",
35
33
  install_requires=[
36
34
  "duckdb",
37
- "dagster==1.4.3",
35
+ "dagster==1.12.6",
38
36
  ],
39
37
  extras_require={
40
- "pandas": ["pandas"],
41
- # Pyspark 2.x is incompatible with Python 3.8+
42
- "pyspark": [
43
- 'pyspark>=3.0.0; python_version >= "3.8"',
44
- 'pyspark>=2.0.2; python_version < "3.8"',
38
+ "pandas": [
39
+ "pandas",
45
40
  ],
41
+ "pyspark": ["pyspark>=3,<4"],
46
42
  },
47
43
  zip_safe=False,
48
44
  )
@@ -1,16 +0,0 @@
1
- Metadata-Version: 2.1
2
- Name: dagster-duckdb
3
- Version: 0.20.3
4
- Summary: Package for DuckDB-specific Dagster framework op and resource components.
5
- Home-page: https://github.com/dagster-io/dagster/tree/master/python_modules/libraries/dagster-duckb
6
- Author: Elementl
7
- Author-email: hello@elementl.com
8
- License: Apache-2.0
9
- Classifier: Programming Language :: Python :: 3.8
10
- Classifier: Programming Language :: Python :: 3.9
11
- Classifier: Programming Language :: Python :: 3.10
12
- Classifier: License :: OSI Approved :: Apache Software License
13
- Classifier: Operating System :: OS Independent
14
- Provides-Extra: pandas
15
- Provides-Extra: pyspark
16
- License-File: LICENSE
@@ -1,4 +0,0 @@
1
- # dagster-duckdb
2
-
3
- The docs for `dagster-duckdb` can be found
4
- [here](https://docs.dagster.io/_apidocs/libraries/dagster-duckdb).
@@ -1,10 +0,0 @@
1
- from dagster._core.libraries import DagsterLibraryRegistry
2
-
3
- from .io_manager import (
4
- DuckDBIOManager as DuckDBIOManager,
5
- build_duckdb_io_manager as build_duckdb_io_manager,
6
- )
7
- from .resource import DuckDBResource as DuckDBResource
8
- from .version import __version__
9
-
10
- DagsterLibraryRegistry.register("dagster-duckdb", __version__)
@@ -1 +0,0 @@
1
- __version__ = "0.20.3"
@@ -1,16 +0,0 @@
1
- Metadata-Version: 2.1
2
- Name: dagster-duckdb
3
- Version: 0.20.3
4
- Summary: Package for DuckDB-specific Dagster framework op and resource components.
5
- Home-page: https://github.com/dagster-io/dagster/tree/master/python_modules/libraries/dagster-duckb
6
- Author: Elementl
7
- Author-email: hello@elementl.com
8
- License: Apache-2.0
9
- Classifier: Programming Language :: Python :: 3.8
10
- Classifier: Programming Language :: Python :: 3.9
11
- Classifier: Programming Language :: Python :: 3.10
12
- Classifier: License :: OSI Approved :: Apache Software License
13
- Classifier: Operating System :: OS Independent
14
- Provides-Extra: pandas
15
- Provides-Extra: pyspark
16
- License-File: LICENSE
@@ -1,13 +0,0 @@
1
- duckdb
2
- dagster==1.4.3
3
-
4
- [pandas]
5
- pandas
6
-
7
- [pyspark]
8
-
9
- [pyspark:python_version < "3.8"]
10
- pyspark>=2.0.2
11
-
12
- [pyspark:python_version >= "3.8"]
13
- pyspark>=3.0.0