meerschaum 2.6.0.dev1__py3-none-any.whl → 2.6.2__py3-none-any.whl
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.
- meerschaum/api/dash/pages/login.py +17 -17
- meerschaum/api/dash/pipes.py +13 -4
- meerschaum/api/routes/_pipes.py +162 -136
- meerschaum/config/_version.py +1 -1
- meerschaum/config/static/__init__.py +1 -0
- meerschaum/connectors/api/_APIConnector.py +1 -0
- meerschaum/connectors/api/_pipes.py +46 -13
- meerschaum/connectors/sql/_SQLConnector.py +4 -3
- meerschaum/connectors/sql/_fetch.py +4 -2
- meerschaum/connectors/sql/_pipes.py +496 -147
- meerschaum/connectors/sql/_sql.py +37 -16
- meerschaum/connectors/valkey/_ValkeyConnector.py +3 -2
- meerschaum/connectors/valkey/_pipes.py +13 -5
- meerschaum/core/Pipe/__init__.py +20 -0
- meerschaum/core/Pipe/_attributes.py +179 -9
- meerschaum/core/Pipe/_clear.py +10 -8
- meerschaum/core/Pipe/_copy.py +2 -0
- meerschaum/core/Pipe/_data.py +57 -28
- meerschaum/core/Pipe/_deduplicate.py +30 -28
- meerschaum/core/Pipe/_dtypes.py +12 -2
- meerschaum/core/Pipe/_fetch.py +11 -9
- meerschaum/core/Pipe/_sync.py +24 -7
- meerschaum/core/Pipe/_verify.py +51 -48
- meerschaum/utils/dataframe.py +16 -8
- meerschaum/utils/dtypes/__init__.py +9 -1
- meerschaum/utils/dtypes/sql.py +32 -6
- meerschaum/utils/misc.py +8 -8
- meerschaum/utils/sql.py +485 -16
- {meerschaum-2.6.0.dev1.dist-info → meerschaum-2.6.2.dist-info}/METADATA +1 -1
- {meerschaum-2.6.0.dev1.dist-info → meerschaum-2.6.2.dist-info}/RECORD +36 -36
- {meerschaum-2.6.0.dev1.dist-info → meerschaum-2.6.2.dist-info}/LICENSE +0 -0
- {meerschaum-2.6.0.dev1.dist-info → meerschaum-2.6.2.dist-info}/NOTICE +0 -0
- {meerschaum-2.6.0.dev1.dist-info → meerschaum-2.6.2.dist-info}/WHEEL +0 -0
- {meerschaum-2.6.0.dev1.dist-info → meerschaum-2.6.2.dist-info}/entry_points.txt +0 -0
- {meerschaum-2.6.0.dev1.dist-info → meerschaum-2.6.2.dist-info}/top_level.txt +0 -0
- {meerschaum-2.6.0.dev1.dist-info → meerschaum-2.6.2.dist-info}/zip-safe +0 -0
@@ -259,12 +259,20 @@ def coerce_timezone(
|
|
259
259
|
if isinstance(dt, int):
|
260
260
|
return dt
|
261
261
|
|
262
|
-
|
262
|
+
if isinstance(dt, str):
|
263
|
+
dateutil_parser = mrsm.attempt_import('dateutil.parser')
|
264
|
+
dt = dateutil_parser.parse(dt)
|
265
|
+
|
266
|
+
dt_is_series = hasattr(dt, 'dtype') and hasattr(dt, '__module__')
|
263
267
|
|
264
268
|
if dt_is_series:
|
269
|
+
is_dask = 'dask' in dt.__module__
|
265
270
|
pandas = mrsm.attempt_import('pandas')
|
271
|
+
dd = mrsm.attempt_import('dask.dataframe') if is_dask else None
|
266
272
|
dt_series = (
|
267
273
|
pandas.to_datetime(dt, utc=True)
|
274
|
+
if dd is None
|
275
|
+
else dd.to_datetime(dt, utc=True)
|
268
276
|
)
|
269
277
|
if strip_utc:
|
270
278
|
dt_series = dt_series.apply(lambda x: x.replace(tzinfo=None))
|
meerschaum/utils/dtypes/sql.py
CHANGED
@@ -13,7 +13,7 @@ NUMERIC_PRECISION_FLAVORS: Dict[str, Tuple[int, int]] = {
|
|
13
13
|
'mariadb': (38, 20),
|
14
14
|
'mysql': (38, 20),
|
15
15
|
'mssql': (28, 10),
|
16
|
-
'duckdb': (15,
|
16
|
+
'duckdb': (15, 3),
|
17
17
|
'sqlite': (15, 4),
|
18
18
|
}
|
19
19
|
TIMEZONE_NAIVE_FLAVORS = {'oracle', 'mysql', 'mariadb'}
|
@@ -50,6 +50,7 @@ DB_FLAVORS_CAST_DTYPES = {
|
|
50
50
|
'NVARCHAR(2000)': 'NVARCHAR2(2000)',
|
51
51
|
'NVARCHAR': 'NVARCHAR2(2000)',
|
52
52
|
'NVARCHAR2': 'NVARCHAR2(2000)',
|
53
|
+
'CHAR': 'CHAR(36)', # UUID columns
|
53
54
|
},
|
54
55
|
'mssql': {
|
55
56
|
'NVARCHAR COLLATE "SQL Latin1 General CP1 CI AS"': 'NVARCHAR(MAX)',
|
@@ -57,7 +58,6 @@ DB_FLAVORS_CAST_DTYPES = {
|
|
57
58
|
'VARCHAR COLLATE "SQL Latin1 General CP1 CI AS"': 'NVARCHAR(MAX)',
|
58
59
|
'VARCHAR COLLATE "SQL_Latin1_General_CP1_CI_AS"': 'NVARCHAR(MAX)',
|
59
60
|
'NVARCHAR': 'NVARCHAR(MAX)',
|
60
|
-
'BIT': 'INT',
|
61
61
|
},
|
62
62
|
}
|
63
63
|
for _flavor, (_precision, _scale) in NUMERIC_PRECISION_FLAVORS.items():
|
@@ -174,7 +174,7 @@ PD_TO_DB_DTYPES_FLAVORS: Dict[str, Dict[str, str]] = {
|
|
174
174
|
'datetime64[ns, UTC]': {
|
175
175
|
'timescaledb': 'TIMESTAMPTZ',
|
176
176
|
'postgresql': 'TIMESTAMPTZ',
|
177
|
-
'mariadb': '
|
177
|
+
'mariadb': 'DATETIME',
|
178
178
|
'mysql': 'DATETIME',
|
179
179
|
'mssql': 'DATETIMEOFFSET',
|
180
180
|
'oracle': 'TIMESTAMP',
|
@@ -182,7 +182,20 @@ PD_TO_DB_DTYPES_FLAVORS: Dict[str, Dict[str, str]] = {
|
|
182
182
|
'duckdb': 'TIMESTAMPTZ',
|
183
183
|
'citus': 'TIMESTAMPTZ',
|
184
184
|
'cockroachdb': 'TIMESTAMPTZ',
|
185
|
-
'default': '
|
185
|
+
'default': 'TIMESTAMPTZ',
|
186
|
+
},
|
187
|
+
'datetime': {
|
188
|
+
'timescaledb': 'TIMESTAMPTZ',
|
189
|
+
'postgresql': 'TIMESTAMPTZ',
|
190
|
+
'mariadb': 'DATETIME',
|
191
|
+
'mysql': 'DATETIME',
|
192
|
+
'mssql': 'DATETIMEOFFSET',
|
193
|
+
'oracle': 'TIMESTAMP',
|
194
|
+
'sqlite': 'TIMESTAMP',
|
195
|
+
'duckdb': 'TIMESTAMPTZ',
|
196
|
+
'citus': 'TIMESTAMPTZ',
|
197
|
+
'cockroachdb': 'TIMESTAMPTZ',
|
198
|
+
'default': 'TIMESTAMPTZ',
|
186
199
|
},
|
187
200
|
'bool': {
|
188
201
|
'timescaledb': 'BOOLEAN',
|
@@ -256,7 +269,7 @@ PD_TO_DB_DTYPES_FLAVORS: Dict[str, Dict[str, str]] = {
|
|
256
269
|
'mysql': 'CHAR(36)',
|
257
270
|
'mssql': 'UNIQUEIDENTIFIER',
|
258
271
|
### I know this is too much space, but erring on the side of caution.
|
259
|
-
'oracle': '
|
272
|
+
'oracle': 'CHAR(36)',
|
260
273
|
'sqlite': 'TEXT',
|
261
274
|
'duckdb': 'VARCHAR',
|
262
275
|
'citus': 'UUID',
|
@@ -291,6 +304,19 @@ PD_TO_SQLALCHEMY_DTYPES_FLAVORS: Dict[str, Dict[str, str]] = {
|
|
291
304
|
'cockroachdb': 'Float',
|
292
305
|
'default': 'Float',
|
293
306
|
},
|
307
|
+
'datetime': {
|
308
|
+
'timescaledb': 'DateTime(timezone=True)',
|
309
|
+
'postgresql': 'DateTime(timezone=True)',
|
310
|
+
'mariadb': 'DateTime(timezone=True)',
|
311
|
+
'mysql': 'DateTime(timezone=True)',
|
312
|
+
'mssql': 'sqlalchemy.dialects.mssql.DATETIMEOFFSET',
|
313
|
+
'oracle': 'sqlalchemy.dialects.oracle.TIMESTAMP(timezone=True)',
|
314
|
+
'sqlite': 'DateTime(timezone=True)',
|
315
|
+
'duckdb': 'DateTime(timezone=True)',
|
316
|
+
'citus': 'DateTime(timezone=True)',
|
317
|
+
'cockroachdb': 'DateTime(timezone=True)',
|
318
|
+
'default': 'DateTime(timezone=True)',
|
319
|
+
},
|
294
320
|
'datetime64[ns]': {
|
295
321
|
'timescaledb': 'DateTime',
|
296
322
|
'postgresql': 'DateTime',
|
@@ -388,7 +414,7 @@ PD_TO_SQLALCHEMY_DTYPES_FLAVORS: Dict[str, Dict[str, str]] = {
|
|
388
414
|
'mariadb': 'sqlalchemy.dialects.mysql.CHAR(36)',
|
389
415
|
'mysql': 'sqlalchemy.dialects.mysql.CHAR(36)',
|
390
416
|
'mssql': 'Uuid',
|
391
|
-
'oracle': '
|
417
|
+
'oracle': 'sqlalchemy.dialects.oracle.CHAR(36)',
|
392
418
|
'sqlite': 'UnicodeText',
|
393
419
|
'duckdb': 'UnicodeText',
|
394
420
|
'citus': 'Uuid',
|
meerschaum/utils/misc.py
CHANGED
@@ -975,13 +975,13 @@ def json_serialize_datetime(dt: datetime) -> Union[str, None]:
|
|
975
975
|
|
976
976
|
|
977
977
|
def wget(
|
978
|
-
|
979
|
-
|
980
|
-
|
981
|
-
|
982
|
-
|
983
|
-
|
984
|
-
|
978
|
+
url: str,
|
979
|
+
dest: Optional[Union[str, 'pathlib.Path']] = None,
|
980
|
+
headers: Optional[Dict[str, Any]] = None,
|
981
|
+
color: bool = True,
|
982
|
+
debug: bool = False,
|
983
|
+
**kw: Any
|
984
|
+
) -> 'pathlib.Path':
|
985
985
|
"""
|
986
986
|
Mimic `wget` with `requests`.
|
987
987
|
|
@@ -989,7 +989,7 @@ def wget(
|
|
989
989
|
----------
|
990
990
|
url: str
|
991
991
|
The URL to the resource to be downloaded.
|
992
|
-
|
992
|
+
|
993
993
|
dest: Optional[Union[str, pathlib.Path]], default None
|
994
994
|
The destination path of the downloaded file.
|
995
995
|
If `None`, save to the current directory.
|