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.
Files changed (36) hide show
  1. meerschaum/api/dash/pages/login.py +17 -17
  2. meerschaum/api/dash/pipes.py +13 -4
  3. meerschaum/api/routes/_pipes.py +162 -136
  4. meerschaum/config/_version.py +1 -1
  5. meerschaum/config/static/__init__.py +1 -0
  6. meerschaum/connectors/api/_APIConnector.py +1 -0
  7. meerschaum/connectors/api/_pipes.py +46 -13
  8. meerschaum/connectors/sql/_SQLConnector.py +4 -3
  9. meerschaum/connectors/sql/_fetch.py +4 -2
  10. meerschaum/connectors/sql/_pipes.py +496 -147
  11. meerschaum/connectors/sql/_sql.py +37 -16
  12. meerschaum/connectors/valkey/_ValkeyConnector.py +3 -2
  13. meerschaum/connectors/valkey/_pipes.py +13 -5
  14. meerschaum/core/Pipe/__init__.py +20 -0
  15. meerschaum/core/Pipe/_attributes.py +179 -9
  16. meerschaum/core/Pipe/_clear.py +10 -8
  17. meerschaum/core/Pipe/_copy.py +2 -0
  18. meerschaum/core/Pipe/_data.py +57 -28
  19. meerschaum/core/Pipe/_deduplicate.py +30 -28
  20. meerschaum/core/Pipe/_dtypes.py +12 -2
  21. meerschaum/core/Pipe/_fetch.py +11 -9
  22. meerschaum/core/Pipe/_sync.py +24 -7
  23. meerschaum/core/Pipe/_verify.py +51 -48
  24. meerschaum/utils/dataframe.py +16 -8
  25. meerschaum/utils/dtypes/__init__.py +9 -1
  26. meerschaum/utils/dtypes/sql.py +32 -6
  27. meerschaum/utils/misc.py +8 -8
  28. meerschaum/utils/sql.py +485 -16
  29. {meerschaum-2.6.0.dev1.dist-info → meerschaum-2.6.2.dist-info}/METADATA +1 -1
  30. {meerschaum-2.6.0.dev1.dist-info → meerschaum-2.6.2.dist-info}/RECORD +36 -36
  31. {meerschaum-2.6.0.dev1.dist-info → meerschaum-2.6.2.dist-info}/LICENSE +0 -0
  32. {meerschaum-2.6.0.dev1.dist-info → meerschaum-2.6.2.dist-info}/NOTICE +0 -0
  33. {meerschaum-2.6.0.dev1.dist-info → meerschaum-2.6.2.dist-info}/WHEEL +0 -0
  34. {meerschaum-2.6.0.dev1.dist-info → meerschaum-2.6.2.dist-info}/entry_points.txt +0 -0
  35. {meerschaum-2.6.0.dev1.dist-info → meerschaum-2.6.2.dist-info}/top_level.txt +0 -0
  36. {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
- dt_is_series = hasattr(dt, 'dtype')
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))
@@ -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, 4),
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': 'TIMESTAMP WITH TIME ZONE',
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': 'TIMESTAMP',
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': 'NVARCHAR(2000)',
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': 'UnicodeText',
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
- 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':
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.