meerschaum 2.6.17__py3-none-any.whl → 2.7.0rc1__py3-none-any.whl

Sign up to get free protection for your applications and to get access to all the features.
Files changed (31) hide show
  1. meerschaum/actions/delete.py +65 -69
  2. meerschaum/actions/install.py +1 -2
  3. meerschaum/config/_default.py +1 -1
  4. meerschaum/config/_paths.py +2 -1
  5. meerschaum/config/_version.py +1 -1
  6. meerschaum/connectors/api/_pipes.py +4 -3
  7. meerschaum/connectors/sql/_pipes.py +63 -25
  8. meerschaum/connectors/sql/_sql.py +6 -1
  9. meerschaum/connectors/valkey/_pipes.py +12 -1
  10. meerschaum/core/Pipe/__init__.py +23 -13
  11. meerschaum/core/Pipe/_attributes.py +19 -0
  12. meerschaum/core/Pipe/_dtypes.py +1 -1
  13. meerschaum/core/Pipe/_sync.py +61 -21
  14. meerschaum/core/Pipe/_verify.py +8 -7
  15. meerschaum/plugins/_Plugin.py +11 -14
  16. meerschaum/utils/daemon/Daemon.py +18 -11
  17. meerschaum/utils/dataframe.py +175 -13
  18. meerschaum/utils/dtypes/__init__.py +103 -14
  19. meerschaum/utils/dtypes/sql.py +26 -0
  20. meerschaum/utils/misc.py +8 -8
  21. meerschaum/utils/sql.py +64 -11
  22. meerschaum/utils/venv/_Venv.py +4 -4
  23. meerschaum/utils/venv/__init__.py +33 -13
  24. {meerschaum-2.6.17.dist-info → meerschaum-2.7.0rc1.dist-info}/METADATA +1 -1
  25. {meerschaum-2.6.17.dist-info → meerschaum-2.7.0rc1.dist-info}/RECORD +31 -31
  26. {meerschaum-2.6.17.dist-info → meerschaum-2.7.0rc1.dist-info}/LICENSE +0 -0
  27. {meerschaum-2.6.17.dist-info → meerschaum-2.7.0rc1.dist-info}/NOTICE +0 -0
  28. {meerschaum-2.6.17.dist-info → meerschaum-2.7.0rc1.dist-info}/WHEEL +0 -0
  29. {meerschaum-2.6.17.dist-info → meerschaum-2.7.0rc1.dist-info}/entry_points.txt +0 -0
  30. {meerschaum-2.6.17.dist-info → meerschaum-2.7.0rc1.dist-info}/top_level.txt +0 -0
  31. {meerschaum-2.6.17.dist-info → meerschaum-2.7.0rc1.dist-info}/zip-safe +0 -0
meerschaum/utils/sql.py CHANGED
@@ -108,24 +108,30 @@ update_queries = {
108
108
  {cols_equal_values}
109
109
  """,
110
110
  'mssql': """
111
+ {with_temp_date_bounds}
111
112
  MERGE {target_table_name} f
112
- USING (SELECT DISTINCT {patch_cols_str} FROM {patch_table_name}) p
113
+ USING (SELECT {patch_cols_str} FROM {patch_table_name}) p
113
114
  ON {and_subquery_f}
114
115
  AND {date_bounds_subquery}
115
116
  WHEN MATCHED THEN
116
117
  UPDATE
117
118
  {sets_subquery_none};
118
119
  """,
119
- 'mssql-upsert': """
120
+ 'mssql-upsert': [
121
+ "{identity_insert_on}",
122
+ """
123
+ {with_temp_date_bounds}
120
124
  MERGE {target_table_name} f
121
- USING (SELECT DISTINCT {patch_cols_str} FROM {patch_table_name}) p
125
+ USING (SELECT {patch_cols_str} FROM {patch_table_name}) p
122
126
  ON {and_subquery_f}
123
127
  AND {date_bounds_subquery}
124
128
  {when_matched_update_sets_subquery_none}
125
129
  WHEN NOT MATCHED THEN
126
130
  INSERT ({patch_cols_str})
127
131
  VALUES ({patch_cols_prefixed_str});
128
- """,
132
+ """,
133
+ "{identity_insert_off}",
134
+ ],
129
135
  'oracle': """
130
136
  MERGE INTO {target_table_name} f
131
137
  USING (SELECT DISTINCT {patch_cols_str} FROM {patch_table_name}) p
@@ -1056,7 +1062,7 @@ def get_sqlalchemy_table(
1056
1062
  connector.metadata,
1057
1063
  **table_kwargs
1058
1064
  )
1059
- except sqlalchemy.exc.NoSuchTableError as e:
1065
+ except sqlalchemy.exc.NoSuchTableError:
1060
1066
  warn(f"Table '{truncated_table_name}' does not exist in '{connector}'.")
1061
1067
  return None
1062
1068
  return tables[truncated_table_name]
@@ -1383,6 +1389,7 @@ def get_update_queries(
1383
1389
  datetime_col: Optional[str] = None,
1384
1390
  schema: Optional[str] = None,
1385
1391
  patch_schema: Optional[str] = None,
1392
+ identity_insert: bool = False,
1386
1393
  debug: bool = False,
1387
1394
  ) -> List[str]:
1388
1395
  """
@@ -1420,6 +1427,10 @@ def get_update_queries(
1420
1427
  If provided, use this schema when quoting the patch table.
1421
1428
  Defaults to `schema`.
1422
1429
 
1430
+ identity_insert: bool, default False
1431
+ If `True`, include `SET IDENTITY_INSERT` queries before and after the update queries.
1432
+ Only applies for MSSQL upserts.
1433
+
1423
1434
  debug: bool, default False
1424
1435
  Verbosity toggle.
1425
1436
 
@@ -1554,17 +1565,36 @@ def get_update_queries(
1554
1565
  ) for c_name, c_type in join_cols_types
1555
1566
  ])
1556
1567
 
1568
+ skip_query_val = ""
1557
1569
  target_table_name = sql_item_name(target, flavor, schema)
1558
1570
  patch_table_name = sql_item_name(patch, flavor, patch_schema)
1559
1571
  dt_col_name = sql_item_name(datetime_col, flavor, None) if datetime_col else None
1572
+ date_bounds_table = patch_table_name if flavor != 'mssql' else '[date_bounds]'
1573
+ min_dt_col_name = f"MIN({dt_col_name})" if flavor != 'mssql' else '[Min_dt]'
1574
+ max_dt_col_name = f"MAX({dt_col_name})" if flavor != 'mssql' else '[Max_dt]'
1560
1575
  date_bounds_subquery = (
1561
1576
  f"""
1562
- f.{dt_col_name} >= (SELECT MIN({dt_col_name}) FROM {patch_table_name})
1563
- AND f.{dt_col_name} <= (SELECT MAX({dt_col_name}) FROM {patch_table_name})
1577
+ f.{dt_col_name} >= (SELECT {min_dt_col_name} FROM {date_bounds_table})
1578
+ AND f.{dt_col_name} <= (SELECT {max_dt_col_name} FROM {date_bounds_table})
1564
1579
  """
1565
1580
  if datetime_col
1566
1581
  else "1 = 1"
1567
1582
  )
1583
+ with_temp_date_bounds = f"""
1584
+ WITH [date_bounds] AS (
1585
+ SELECT MIN({dt_col_name}) AS {min_dt_col_name}, MAX({dt_col_name}) AS {max_dt_col_name}
1586
+ FROM {patch_table_name}
1587
+ )""" if datetime_col else ""
1588
+ identity_insert_on = (
1589
+ f"SET IDENTITY_INSERT {target_table_name} ON"
1590
+ if identity_insert
1591
+ else skip_query_val
1592
+ )
1593
+ identity_insert_off = (
1594
+ f"SET IDENTITY_INSERT {target_table_name} OFF"
1595
+ if identity_insert
1596
+ else skip_query_val
1597
+ )
1568
1598
 
1569
1599
  ### NOTE: MSSQL upserts must exclude the update portion if only upserting indices.
1570
1600
  when_matched_update_sets_subquery_none = "" if not value_cols else (
@@ -1585,7 +1615,7 @@ def get_update_queries(
1585
1615
  )
1586
1616
  ignore = "IGNORE " if not value_cols else ""
1587
1617
 
1588
- return [
1618
+ formatted_queries = [
1589
1619
  base_query.format(
1590
1620
  sets_subquery_none=sets_subquery('', 'p.'),
1591
1621
  sets_subquery_none_excluded=sets_subquery('', 'EXCLUDED.'),
@@ -1604,10 +1634,16 @@ def get_update_queries(
1604
1634
  cols_equal_values=cols_equal_values,
1605
1635
  on_duplicate_key_update=on_duplicate_key_update,
1606
1636
  ignore=ignore,
1637
+ with_temp_date_bounds=with_temp_date_bounds,
1638
+ identity_insert_on=identity_insert_on,
1639
+ identity_insert_off=identity_insert_off,
1607
1640
  )
1608
1641
  for base_query in base_queries
1609
1642
  ]
1610
1643
 
1644
+ ### NOTE: Allow for skipping some queries.
1645
+ return [query for query in formatted_queries if query]
1646
+
1611
1647
 
1612
1648
  def get_null_replacement(typ: str, flavor: str) -> str:
1613
1649
  """
@@ -1857,7 +1893,17 @@ def _get_create_table_query_from_dtypes(
1857
1893
 
1858
1894
  table_name = sql_item_name(new_table, schema=schema, flavor=flavor)
1859
1895
  primary_key_name = sql_item_name(primary_key, flavor) if primary_key else None
1896
+ primary_key_constraint_name = (
1897
+ sql_item_name(f'PK_{new_table}', flavor, None)
1898
+ if primary_key
1899
+ else None
1900
+ )
1860
1901
  datetime_column_name = sql_item_name(datetime_column, flavor) if datetime_column else None
1902
+ primary_key_clustered = (
1903
+ "CLUSTERED"
1904
+ if not datetime_column or datetime_column == primary_key
1905
+ else "NONCLUSTERED"
1906
+ )
1861
1907
  query = f"CREATE TABLE {table_name} ("
1862
1908
  if primary_key:
1863
1909
  col_db_type = cols_types[0][1]
@@ -1877,6 +1923,8 @@ def _get_create_table_query_from_dtypes(
1877
1923
  query += f"\n {col_name} {col_db_type} {auto_increment_str} PRIMARY KEY,"
1878
1924
  elif flavor == 'timescaledb' and datetime_column and datetime_column != primary_key:
1879
1925
  query += f"\n {col_name} {col_db_type}{auto_increment_str} NOT NULL,"
1926
+ elif flavor == 'mssql':
1927
+ query += f"\n {col_name} {col_db_type}{auto_increment_str} NOT NULL,"
1880
1928
  else:
1881
1929
  query += f"\n {col_name} {col_db_type} PRIMARY KEY{auto_increment_str} NOT NULL,"
1882
1930
 
@@ -1892,6 +1940,10 @@ def _get_create_table_query_from_dtypes(
1892
1940
  and datetime_column != primary_key
1893
1941
  ):
1894
1942
  query += f"\n PRIMARY KEY({datetime_column_name}, {primary_key_name}),"
1943
+
1944
+ if flavor == 'mssql' and primary_key:
1945
+ query += f"\n CONSTRAINT {primary_key_constraint_name} PRIMARY KEY {primary_key_clustered} ({primary_key_name}),"
1946
+
1895
1947
  query = query[:-1]
1896
1948
  query += "\n)"
1897
1949
 
@@ -1917,7 +1969,7 @@ def _get_create_table_query_from_cte(
1917
1969
  create_cte_name = sql_item_name(create_cte, flavor, None)
1918
1970
  new_table_name = sql_item_name(new_table, flavor, schema)
1919
1971
  primary_key_constraint_name = (
1920
- sql_item_name(f'pk_{new_table}', flavor, None)
1972
+ sql_item_name(f'PK_{new_table}', flavor, None)
1921
1973
  if primary_key
1922
1974
  else None
1923
1975
  )
@@ -1926,6 +1978,7 @@ def _get_create_table_query_from_cte(
1926
1978
  if primary_key
1927
1979
  else None
1928
1980
  )
1981
+ primary_key_clustered = "CLUSTERED" if not datetime_column else "NONCLUSTERED"
1929
1982
  datetime_column_name = (
1930
1983
  sql_item_name(datetime_column, flavor)
1931
1984
  if datetime_column
@@ -1933,7 +1986,7 @@ def _get_create_table_query_from_cte(
1933
1986
  )
1934
1987
  if flavor in ('mssql',):
1935
1988
  query = query.lstrip()
1936
- if 'with ' in query.lower():
1989
+ if query.lower().startswith('with '):
1937
1990
  final_select_ix = query.lower().rfind('select')
1938
1991
  create_table_query = (
1939
1992
  query[:final_select_ix].rstrip() + ',\n'
@@ -1951,7 +2004,7 @@ def _get_create_table_query_from_cte(
1951
2004
 
1952
2005
  alter_type_query = f"""
1953
2006
  ALTER TABLE {new_table_name}
1954
- ADD CONSTRAINT {primary_key_constraint_name} PRIMARY KEY ({primary_key_name})
2007
+ ADD CONSTRAINT {primary_key_constraint_name} PRIMARY KEY {primary_key_clustered} ({primary_key_name})
1955
2008
  """
1956
2009
  elif flavor in (None,):
1957
2010
  create_table_query = f"""
@@ -34,10 +34,10 @@ class Venv:
34
34
  """
35
35
 
36
36
  def __init__(
37
- self,
38
- venv: Union[str, 'meerschaum.plugins.Plugin', None] = 'mrsm',
39
- debug: bool = False,
40
- ) -> None:
37
+ self,
38
+ venv: Union[str, 'meerschaum.plugins.Plugin', None] = 'mrsm',
39
+ debug: bool = False,
40
+ ) -> None:
41
41
  from meerschaum.utils.venv import activate_venv, deactivate_venv, active_venvs
42
42
  ### For some weird threading issue,
43
43
  ### we can't use `isinstance` here.
@@ -65,10 +65,9 @@ def activate_venv(
65
65
  if active_venvs_order and active_venvs_order[0] == venv:
66
66
  if not force:
67
67
  return True
68
- import sys, platform, os
68
+ import sys
69
+ import os
69
70
  from meerschaum.config._paths import VIRTENV_RESOURCES_PATH
70
- if debug:
71
- from meerschaum.utils.debug import dprint
72
71
  if venv is not None:
73
72
  init_venv(venv=venv, debug=debug)
74
73
  with LOCKS['active_venvs']:
@@ -80,12 +79,18 @@ def activate_venv(
80
79
  else:
81
80
  threads_active_venvs[thread_id][venv] += 1
82
81
 
83
- target = venv_target_path(venv, debug=debug).as_posix()
82
+ target_path = venv_target_path(venv, debug=debug, allow_nonexistent=True)
83
+ if not target_path.exists():
84
+ init_venv(venv=venv, force=True, debug=debug)
85
+ if not target_path.exists():
86
+ raise EnvironmentError(f"Could not activate virtual environment '{venv}'.")
87
+ target = target_path.as_posix()
88
+
84
89
  if venv in active_venvs_order:
85
90
  sys.path.remove(target)
86
91
  try:
87
92
  active_venvs_order.remove(venv)
88
- except Exception as e:
93
+ except Exception:
89
94
  pass
90
95
  if venv is not None:
91
96
  sys.path.insert(0, target)
@@ -96,7 +101,7 @@ def activate_venv(
96
101
  sys.path.insert(0, target)
97
102
  try:
98
103
  active_venvs_order.insert(0, venv)
99
- except Exception as e:
104
+ except Exception:
100
105
  pass
101
106
 
102
107
  return True
@@ -245,7 +250,7 @@ def verify_venv(
245
250
  print(f"Unable to remove symlink {current_python_in_venv_path}:\n{e}")
246
251
  try:
247
252
  make_symlink(current_python_in_sys_path, current_python_in_venv_path)
248
- except Exception as e:
253
+ except Exception:
249
254
  print(
250
255
  f"Unable to create symlink {current_python_in_venv_path} "
251
256
  + f"to {current_python_in_sys_path}."
@@ -302,7 +307,7 @@ def verify_venv(
302
307
  if not real_path.exists():
303
308
  try:
304
309
  python_path.unlink()
305
- except Exception as e:
310
+ except Exception:
306
311
  pass
307
312
  init_venv(venv, verify=False, force=True, debug=debug)
308
313
  if not python_path.exists():
@@ -313,7 +318,7 @@ def verify_venv(
313
318
 
314
319
  try:
315
320
  python_path.unlink()
316
- except Exception as e:
321
+ except Exception:
317
322
  pass
318
323
  success, msg = make_symlink(real_path, python_path)
319
324
  if not success:
@@ -366,9 +371,10 @@ def init_venv(
366
371
  from contextlib import redirect_stdout, redirect_stderr
367
372
  import sys, platform, os, pathlib, shutil
368
373
  from meerschaum.config.static import STATIC_CONFIG
369
- from meerschaum.config._paths import VIRTENV_RESOURCES_PATH
374
+ from meerschaum.config._paths import VIRTENV_RESOURCES_PATH, VENVS_CACHE_RESOURCES_PATH
370
375
  from meerschaum.utils.packages import is_uv_enabled
371
376
  venv_path = VIRTENV_RESOURCES_PATH / venv
377
+ vtp = venv_target_path(venv=venv, allow_nonexistent=True, debug=debug)
372
378
  docker_home_venv_path = pathlib.Path('/home/meerschaum/venvs/mrsm')
373
379
 
374
380
  runtime_env_var = STATIC_CONFIG['environment']['runtime']
@@ -397,6 +403,11 @@ def init_venv(
397
403
  virtualenv = None
398
404
 
399
405
  _venv_success = False
406
+ temp_vtp = VENVS_CACHE_RESOURCES_PATH / str(venv)
407
+ rename_vtp = vtp.exists()
408
+
409
+ if rename_vtp:
410
+ vtp.rename(temp_vtp)
400
411
 
401
412
  if uv is not None:
402
413
  _venv_success = run_python_package(
@@ -431,6 +442,8 @@ def init_venv(
431
442
  "Failed to import `venv` or `virtualenv`! "
432
443
  + "Please install `virtualenv` via pip then restart Meerschaum."
433
444
  )
445
+ if rename_vtp and temp_vtp.exists():
446
+ temp_vtp.rename(vtp)
434
447
  return False
435
448
 
436
449
  tried_virtualenv = True
@@ -448,7 +461,7 @@ def init_venv(
448
461
  if bin_path.exists():
449
462
  try:
450
463
  shutil.rmtree(bin_path)
451
- except Exception as e:
464
+ except Exception:
452
465
  import traceback
453
466
  traceback.print_exc()
454
467
  virtualenv.cli_run([venv_path.as_posix()])
@@ -464,13 +477,19 @@ def init_venv(
464
477
  # shutil.move(local_bin_path, bin_path)
465
478
  shutil.rmtree(local_bin_path)
466
479
 
467
- except Exception as e:
480
+ except Exception:
468
481
  import traceback
469
482
  traceback.print_exc()
483
+ if rename_vtp and temp_vtp.exists():
484
+ temp_vtp.rename(vtp)
470
485
  return False
471
486
  if verify:
472
487
  verify_venv(venv, debug=debug)
473
488
  verified_venvs.add(venv)
489
+
490
+ if rename_vtp and temp_vtp.exists():
491
+ temp_vtp.rename(vtp)
492
+
474
493
  return True
475
494
 
476
495
 
@@ -479,7 +498,8 @@ def venv_executable(venv: Optional[str] = 'mrsm') -> str:
479
498
  The Python interpreter executable for a given virtual environment.
480
499
  """
481
500
  from meerschaum.config._paths import VIRTENV_RESOURCES_PATH
482
- import sys, platform, os
501
+ import sys
502
+ import platform
483
503
  return (
484
504
  sys.executable if venv is None
485
505
  else str(
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: meerschaum
3
- Version: 2.6.17
3
+ Version: 2.7.0rc1
4
4
  Summary: Sync Time-Series Pipes with Meerschaum
5
5
  Home-page: https://meerschaum.io
6
6
  Author: Bennett Meares
@@ -28,10 +28,10 @@ meerschaum/actions/bootstrap.py,sha256=08o3PchrJ_Rv8IP30ZBH1Ovk-b8qFBGPedCjF7jRz
28
28
  meerschaum/actions/clear.py,sha256=tMacHFv8btWpkNnXHtKDOMiCDNhGb5S6CJhCDIrrNDk,4914
29
29
  meerschaum/actions/copy.py,sha256=NHoC9cHJGgoox8L8B0afbu8lAxEh_MKa_pNeVunZsl0,6824
30
30
  meerschaum/actions/deduplicate.py,sha256=puYyxeFYEUy1Sd2IOcZB2e6MrNxAZl2bTLmNzFDkCiw,1167
31
- meerschaum/actions/delete.py,sha256=7hW4Ff_WSczW8If-EEDbEUU0U0XzV3fVbFb9gED4S9Q,19032
31
+ meerschaum/actions/delete.py,sha256=H5oP0nE7qIWnFvkuFhZQZQYBVC0IbUevpaQ_2YQKXRA,18559
32
32
  meerschaum/actions/drop.py,sha256=Hd5h4rrWd7qL2rTqglsTonUsEoH7qQlsfqNFSHGeqr0,2453
33
33
  meerschaum/actions/edit.py,sha256=SN-SnfFkhX0-pymAEofi9NDnq4hhia6gkKqr-zTn4I8,16222
34
- meerschaum/actions/install.py,sha256=jdhOrR_KlvinTKr0YJNkUHsnh5EY6OzA7cRq0Vnp1oU,7494
34
+ meerschaum/actions/install.py,sha256=P_M2dnn3sVC2mAn5hwvu4VHWkoh4r9TBUzNcU_Kukpc,7437
35
35
  meerschaum/actions/login.py,sha256=fNgsgkrFCn9wBQJY50SQhz2PwsN_TvEYYHnXK3JG4ig,4206
36
36
  meerschaum/actions/os.py,sha256=dtoppoBhLzW3rLNF0SFovEfNxA4WJWt_9WrOGlS5KbA,2251
37
37
  meerschaum/actions/pause.py,sha256=WI4dQFfjQ6ObWKUzwQ5FrtYPDyEcnxWwval8cSIzzJw,4221
@@ -132,18 +132,18 @@ meerschaum/api/routes/_webterm.py,sha256=gow_xCsojGI37ZZDVfv2gdM18r_H2b2MR0ovFuG
132
132
  meerschaum/api/tables/__init__.py,sha256=e2aNC0CdlWICTUMx1i9RauF8Pm426J0RZJbsJWv4SWo,482
133
133
  meerschaum/config/__init__.py,sha256=5ZBq71P9t3nb74r5CGvMfNuauPscfegBX-nkaAUi5C4,11541
134
134
  meerschaum/config/_dash.py,sha256=BJHl4xMrQB-YHUEU7ldEW8q_nOPoIRSOqLrfGElc6Dw,187
135
- meerschaum/config/_default.py,sha256=Anzz-o8cVCNcf2pjV_1RKaLa4Jx6ETNdCcEy74a_E5k,5651
135
+ meerschaum/config/_default.py,sha256=3HhlLLceFbf7zn3sciIr0DWGynuHpzRmkmXeTyT9J9s,5652
136
136
  meerschaum/config/_edit.py,sha256=M9yX_SDD24gV5kWITZpy7p9AWTizJsIAGWAs3WZx-Ws,9087
137
137
  meerschaum/config/_environment.py,sha256=Vv4DLDfc2vKLbCLsMvkQDj77K4kEvHKEBmUBo-wCrgo,4419
138
138
  meerschaum/config/_formatting.py,sha256=OMuqS1EWOsj_34wSs2tOqGIWci3bTMIZ5l-uelZgsIM,6672
139
139
  meerschaum/config/_jobs.py,sha256=gS_4mMGdmVP7WB4V5Sz8kYP0HmhWcMY2jSWGR7jX6cw,1279
140
140
  meerschaum/config/_patch.py,sha256=21N30q1ANmWMDQ-2RUjpMx7KafWfPQ3lKx9rrMqg1s4,1526
141
- meerschaum/config/_paths.py,sha256=Ycuj4TYTzXO-6JkWX40fMK0CVV6L5HG_rPlCi-Ckhto,9763
141
+ meerschaum/config/_paths.py,sha256=lpzIaWfu5SaEWGg_rf4Wg8ipFUSW2tQktDMThFqfKMg,9834
142
142
  meerschaum/config/_preprocess.py,sha256=-AEA8m_--KivZwTQ1sWN6LTn5sio_fUr2XZ51BO6wLs,1220
143
143
  meerschaum/config/_read_config.py,sha256=RLC3HHi_1ndj7ITVDKLD9_uULY3caGRwSz3ATYE-ixA,15014
144
144
  meerschaum/config/_shell.py,sha256=46_m49Txc5q1rGfCgO49ca48BODx45DQJi8D0zz1R18,4245
145
145
  meerschaum/config/_sync.py,sha256=jHcWRkxd82_BgX8Xo8agsWvf7BSbv3qHLWmYl6ehp_0,4242
146
- meerschaum/config/_version.py,sha256=3MP2d3uOgIHFHI0NYBWcJdnYXKK4IJH4iwN3UKqHZt4,72
146
+ meerschaum/config/_version.py,sha256=36evUT7Ft3s-1kehnNzPZKF86ySwbOhGmHeKhfc9yOg,74
147
147
  meerschaum/config/paths.py,sha256=JjibeGN3YAdSNceRwsd42aNmeUrIgM6ndzC8qZAmNI0,621
148
148
  meerschaum/config/resources/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
149
149
  meerschaum/config/stack/__init__.py,sha256=2UukC0Lmk-aVL1o1qXzumqmuIrw3vu9fD7iCuz4XD4I,10544
@@ -163,7 +163,7 @@ meerschaum/connectors/api/_fetch.py,sha256=Khq9AFr1nk8Dsmcedb77aWhAuHw0JGgVeahDG
163
163
  meerschaum/connectors/api/_jobs.py,sha256=N5lpHFGG10jlVgaJeWAOTuLBQw3AdgjXsEPpp1YwZQE,11270
164
164
  meerschaum/connectors/api/_login.py,sha256=5GsD-B214vr5EYfM3XrTUs1sTFApxZA-9dNxq8oNSyg,2050
165
165
  meerschaum/connectors/api/_misc.py,sha256=OZRZBYOokKIEjmQaR8jUYgu6ZRn9VzXBChzR8CfDv_w,1092
166
- meerschaum/connectors/api/_pipes.py,sha256=ceY-6wlmq73iPvYbvWz59xTUMkSoiiXCiz_BWjTZVMk,21443
166
+ meerschaum/connectors/api/_pipes.py,sha256=6yeNYl6scQ01ABRpCWwnEc3mTOhbJTOScooy98rjXtc,21397
167
167
  meerschaum/connectors/api/_plugins.py,sha256=z04tPjfZZWwa7T60mogZH3X3wDmeLdnoN5Oh8m_YsU8,5217
168
168
  meerschaum/connectors/api/_request.py,sha256=Wc4Y70t0VxEj3_ch5fAeeoSAeFMuRnyNLOV-aUFInjY,6996
169
169
  meerschaum/connectors/api/_uri.py,sha256=HWxqGx4R1cHZ3ywy9Ro9ePbFxxusw4RLaC3hpGt9Z6I,1469
@@ -176,9 +176,9 @@ meerschaum/connectors/sql/_cli.py,sha256=1SgnWeMIAihoxp4FzbNrcq1npXf0dSOQnCntpU9
176
176
  meerschaum/connectors/sql/_create_engine.py,sha256=uFpDeTu9v1Duw6EZ8opeOIU5Z9aPgWAbaequV7vbLW0,10449
177
177
  meerschaum/connectors/sql/_fetch.py,sha256=UIBAvMxassP-ofNxk_FoG-ukHzEac4jyu4lA0SXHcBg,13140
178
178
  meerschaum/connectors/sql/_instance.py,sha256=3KJI3ImwWAJkUfdZIrSL24pcW6Nic8wo5IUeGth9HP4,6459
179
- meerschaum/connectors/sql/_pipes.py,sha256=7SrkUAImbDMl7sy9Ciy0OHU_kQEU5tgxIDZn0ak5pQU,117235
179
+ meerschaum/connectors/sql/_pipes.py,sha256=OhozpYLNU3vkm3NtrfW1jUxuAmXdBglzKcab_ohToNw,118529
180
180
  meerschaum/connectors/sql/_plugins.py,sha256=wbxcNxqTtjfDsxPvdVGTllasYf6NHHzODaQ72hEUSBQ,8135
181
- meerschaum/connectors/sql/_sql.py,sha256=vdSslLKm8ftzIzfCs-0mL3q9zY2pmhZPTpzXSbKROag,37598
181
+ meerschaum/connectors/sql/_sql.py,sha256=rZcALX7Ei1rwqmm5mTzdkcTZsmfgDT-6cQkraSapUZA,37655
182
182
  meerschaum/connectors/sql/_uri.py,sha256=0BrhQtqQdzg9mR04gWBZINs_BbPFtSlTECXT_TCUwik,3460
183
183
  meerschaum/connectors/sql/_users.py,sha256=FJjYeJGhr-TDHziNc6p_5mupGRtGjezKPIYgHFEVSnY,9956
184
184
  meerschaum/connectors/sql/tools.py,sha256=jz8huOaRCwGlYdtGfAqAh7SoK8uydYBrasKQba9FT38,187
@@ -187,12 +187,12 @@ meerschaum/connectors/sql/tables/types.py,sha256=Jc_MTHIBM-KHpQt__Lckp39CeOo7tGO
187
187
  meerschaum/connectors/valkey/_ValkeyConnector.py,sha256=xHld4OCnt0SXmAWH8Yintb3931F-MEgXfWerhTthsXc,15849
188
188
  meerschaum/connectors/valkey/__init__.py,sha256=jkVutsygQCvGPLN17cP6wHAjHajxVycnQJbm2eVMuY0,187
189
189
  meerschaum/connectors/valkey/_fetch.py,sha256=MjeE0h3YI4M3LCzy7axQAc_fX_l82vUqX4WXcYoppxE,1920
190
- meerschaum/connectors/valkey/_pipes.py,sha256=V86tln3TE4SZwvLCgliw8kjQG9K0qk-NS4_-6UItObw,24324
190
+ meerschaum/connectors/valkey/_pipes.py,sha256=sjjO1vehNCkN_2bsqQKy81WWWrOg8a8ElupqzCjZ_7c,24594
191
191
  meerschaum/connectors/valkey/_plugins.py,sha256=ZqiEW4XZCOpw4G8DUK2IKY6Qrph4mYfTjgXWimgakYY,6267
192
192
  meerschaum/connectors/valkey/_users.py,sha256=AS1vLarrkDA9yPK644GWwRiQiTZVa9x3nlLpyntq40g,7730
193
193
  meerschaum/core/__init__.py,sha256=tjASW10n9uLV6bYhcwP4rggh-ESXSJzgxpSBbVsuISs,251
194
- meerschaum/core/Pipe/__init__.py,sha256=knkz0gVpIrHb8au2b_YxvnSC9eXMgPKr5b7TxVQE9O0,18529
195
- meerschaum/core/Pipe/_attributes.py,sha256=cFQPWthsdlEjdddOjkXHuCIMBI9UHJRSqSoY2ChhvLg,21893
194
+ meerschaum/core/Pipe/__init__.py,sha256=NqytRbY1QQM_xDcBDqhcpcVPuEdDRWi26Ou3KuoAseM,18902
195
+ meerschaum/core/Pipe/_attributes.py,sha256=wgtCf2sSC9LFJxBJOPotPgXDATRe9EjhEEVacMdvJ4c,22285
196
196
  meerschaum/core/Pipe/_bootstrap.py,sha256=gTNGh5e2LmTMrgIpHqrVaL60uPKWCphhsuz8j-lJ2HI,7348
197
197
  meerschaum/core/Pipe/_clear.py,sha256=LghXabgyyc1tD7FNQrh9ExT71ipcg2poM9FDA3k9e4M,2230
198
198
  meerschaum/core/Pipe/_copy.py,sha256=YDclAapf_spm9phpFr4-CALyYyw7nUsyKyiaLM1cnm4,2965
@@ -200,13 +200,13 @@ meerschaum/core/Pipe/_data.py,sha256=HOvKlpD9NiBg599mSH1lzUQ_2g8-PsnMbGzMTOJx81E
200
200
  meerschaum/core/Pipe/_deduplicate.py,sha256=xthUdsDxGO2t3m0XGDm9K3F6dpaZoemtjNi8gyKm0e0,10177
201
201
  meerschaum/core/Pipe/_delete.py,sha256=1geNp9BgrocXP1gt76dMbnlJWKYFMuSNqPFA4K4-hXE,2118
202
202
  meerschaum/core/Pipe/_drop.py,sha256=qj5L0obDh2_dKAg7LD3WLI3_L0Q5YECTfTmPc8zZUxI,1135
203
- meerschaum/core/Pipe/_dtypes.py,sha256=LNgZ47W5DMtZ2hwrcQamwapjWPWgtVQ42u67g4M0n3k,4143
203
+ meerschaum/core/Pipe/_dtypes.py,sha256=foFDKPTMZWh3vOemr7wDw16XMT-yj3xcFH64JojG7-E,4167
204
204
  meerschaum/core/Pipe/_edit.py,sha256=HrKWe9vhqKaNOjOcJzW5BNbaUBPIbgNAhJEK8OMsy7c,8416
205
205
  meerschaum/core/Pipe/_fetch.py,sha256=Q_LncNi1nv-YwvRPbh1QK0hf6hflL7Hn9v9lT3oQgF4,5451
206
206
  meerschaum/core/Pipe/_register.py,sha256=Sd5xaAW8H7uLTIoommcKb-6kHPRuHJLWNSbPnt2UbvA,2240
207
207
  meerschaum/core/Pipe/_show.py,sha256=nG50y8eBT9TVuKkRgAKtNDNIxysJvMNxfu__lkL1F9k,1352
208
- meerschaum/core/Pipe/_sync.py,sha256=VsAXcNdjW5kUArQ0PYlB7_0fcgNzAUktlYTgQB-Jcno,34821
209
- meerschaum/core/Pipe/_verify.py,sha256=c3HvsZd4QPydqozaV6cDDRtwYiNz4V91b0IcnKvcimA,14158
208
+ meerschaum/core/Pipe/_sync.py,sha256=_yTM6S1F8j-HZN67XfsSNfOafVVM23TPUlvT-qQDmlA,36512
209
+ meerschaum/core/Pipe/_verify.py,sha256=916xwOECAmefemd3HTUGh8_Rk6uYF4t2f71ez1-s6eY,14194
210
210
  meerschaum/core/Plugin/__init__.py,sha256=UXg64EvJPgI1PCxkY_KM02-ZmBm4FZpLPIQR_uSJJDc,137
211
211
  meerschaum/core/User/_User.py,sha256=qbI0GIkr3G0PI4d9S49uatbJQ2kH_-z5-GoVJ0fuEtA,6624
212
212
  meerschaum/core/User/__init__.py,sha256=9qNy-Gobui4x6GiaE8U7-WOggsdniOM3_wegLN3SVKs,988
@@ -214,33 +214,33 @@ meerschaum/jobs/_Executor.py,sha256=qM62BhFTM4tyJ7p90KOM0y3qyeRY9k3ZV_aTDJMHnO8,
214
214
  meerschaum/jobs/_Job.py,sha256=BQlgjF2jKhdSqp0_yH2woX4YOPf4bODC4D1abobbn64,32093
215
215
  meerschaum/jobs/__init__.py,sha256=q0f_2zWw91sAyafP50IgMM06abe-BIYSR_SCWmI4W3E,12177
216
216
  meerschaum/jobs/systemd.py,sha256=Rq-tsDPslG17ZhpKMrVJ5r8Z0IPr6DEc9APObfIoXCg,24614
217
- meerschaum/plugins/_Plugin.py,sha256=rTiGNQ9nIQeVSG_P9C6DHCMLW0K-J7zzuu3FjNXUOlE,34056
217
+ meerschaum/plugins/_Plugin.py,sha256=bIo4HX8TTWIcwIHROwMt4VK6OoEUhY_3Qc8q-2dp-ZA,33895
218
218
  meerschaum/plugins/__init__.py,sha256=6krcqaMKyzuVqesXMqEL0XEy2SJQ4xfNt2-oI_fJ6v0,26278
219
219
  meerschaum/plugins/bootstrap.py,sha256=VwjpZAuYdqPJW0YoVgAoM_taHkdQHqP902-8T7OWWCI,11339
220
220
  meerschaum/utils/__init__.py,sha256=QrK1K9hIbPCRCM5k2nZGFqGnrqhA0Eh-iSmCU7FG6Cs,612
221
221
  meerschaum/utils/_get_pipes.py,sha256=tu4xKPoDn79Dz2kWM13cXTP4DSCkn-3G9M8KiLftopw,11073
222
- meerschaum/utils/dataframe.py,sha256=R-TgFTV6qbJ3xPEl596Dw6m1lF8Lqz35n1PtFjCYmI0,43400
222
+ meerschaum/utils/dataframe.py,sha256=wt662O3ZfWrRHrz0CMv7Af36ELNY0dIn6TzRIOLf0SA,47753
223
223
  meerschaum/utils/debug.py,sha256=GyIzJmunkoPnOcZNYVQdT4Sgd-aOb5MI2VbIgATOjIQ,3695
224
224
  meerschaum/utils/interactive.py,sha256=t-6jWozXSqL7lYGDHuwiOjTgr-UKhdcg61q_eR5mikI,3196
225
- meerschaum/utils/misc.py,sha256=soGmUooT216Dl15KbcUTzf8E-aC6uNM6Zvy1PiUT_Y4,47089
225
+ meerschaum/utils/misc.py,sha256=RW_WmNtAieP828OtJhr4dHKTQI2nxc4kTwn-Q5N3YBw,47055
226
226
  meerschaum/utils/networking.py,sha256=Sr_eYUGW8_UV9-k9LqRFf7xLtbUcsDucODyLCRsFRUc,1006
227
227
  meerschaum/utils/pool.py,sha256=vkE42af4fjrTEJTxf6Ek3xGucm1MtEkpsSEiaVzNKHs,2655
228
228
  meerschaum/utils/process.py,sha256=9O8PPPJjY9Q5W2f39I3B3lFU6TlSiRiI3bgrzdOOyOw,7843
229
229
  meerschaum/utils/prompt.py,sha256=SOpAvHcVFuk7-J4cqK_LkahWo6oJmLobeHg5fwM_9aY,18949
230
230
  meerschaum/utils/schedule.py,sha256=bUsaCO9CGn2vJO5UvoISScHDDGIiMdCPHxpTFmu7vwE,11531
231
- meerschaum/utils/sql.py,sha256=RiAOK3hzWjo-jswEjpOPHIJKKQezJzh_vbnoXtwz4gU,71619
231
+ meerschaum/utils/sql.py,sha256=Q8MSQamoXZn-FQZjFZvaGsPZXWz69veta50OiOw07M0,73704
232
232
  meerschaum/utils/threading.py,sha256=awjbVL_QR6G-o_9Qk85utac9cSdqkiC8tQSdERCdrG8,2814
233
233
  meerschaum/utils/typing.py,sha256=U3MC347sh1umpa3Xr1k71eADyDmk4LB6TnVCpq8dVzI,2830
234
234
  meerschaum/utils/warnings.py,sha256=n-phr3BftNNgyPnvnXC_VMSjtCvjiCZ-ewmVfcROhkc,6611
235
235
  meerschaum/utils/yaml.py,sha256=PoC1du0pn2hLwTHwL-zuOf_EBWZSbCGOz-P-AZ4BWN0,3901
236
- meerschaum/utils/daemon/Daemon.py,sha256=n6HlLwXPr4oc_DyRQWfyrvtFQb4KecUSxiz8bf9X4js,42424
236
+ meerschaum/utils/daemon/Daemon.py,sha256=V8DRjjRYezKcSb6jrRqjsHcGAOCth16rxMO91VtfIBc,42597
237
237
  meerschaum/utils/daemon/FileDescriptorInterceptor.py,sha256=MJKMO0Syf3d8yWUs6xXcQzg8Ptsuvh2aCRRoglOjusA,5257
238
238
  meerschaum/utils/daemon/RotatingFile.py,sha256=ePm_svjwyFDWh6V1k-bp1RHXCSWlyxDtlFu4SU4XvPU,24369
239
239
  meerschaum/utils/daemon/StdinFile.py,sha256=J6tyUReM8NEp3bBQAxMfe8mjJG5mWi6CzHN4x86VQBI,3237
240
240
  meerschaum/utils/daemon/__init__.py,sha256=o9jWb4lRTIyny4EPt7fPXFgV_vIf1mUofsTwoE1ZecA,8751
241
241
  meerschaum/utils/daemon/_names.py,sha256=d2ZwTxBoTAqXZkCfZ5LuX2XrkQmLNUq1OTlUqfoH5dA,4515
242
- meerschaum/utils/dtypes/__init__.py,sha256=ZG1Ccy8QmTNuR0IP5NSMtgWj7Cseh_VU4wxSQDw2m94,8352
243
- meerschaum/utils/dtypes/sql.py,sha256=IQihwQy4OKSbRjvJy6ky6SszFKR7W1iMs-ruZDsf2js,18701
242
+ meerschaum/utils/dtypes/__init__.py,sha256=mXDTiT2T2QvI2g15i8TvVTmkNfgWG9-gnYOB7pcuxtc,10748
243
+ meerschaum/utils/dtypes/sql.py,sha256=RXjNCDSrC116aSYs0W5EImS1hXn6RSdpUk0aSAf_O0k,19434
244
244
  meerschaum/utils/formatting/__init__.py,sha256=gN9UYYT68CQ-sQiqYaQyB64JUJkaaZ7pALDnTcaLUsY,16041
245
245
  meerschaum/utils/formatting/_jobs.py,sha256=izsqPJhTtUkXUUtWnbXtReYsUYwulXtci3pBj72Ne64,6637
246
246
  meerschaum/utils/formatting/_pipes.py,sha256=840O5rg2aHhQoraCDOh2ZtBo43_W2W6R60yYufEoXp8,19494
@@ -249,13 +249,13 @@ meerschaum/utils/formatting/_shell.py,sha256=XH7VFLteNv7NGtWhJl7FdIGt80sKeTiDoJo
249
249
  meerschaum/utils/packages/__init__.py,sha256=Op93VJkAX3OL4H-js_p3dAaa_PT82jvjCna27aHOsUk,64199
250
250
  meerschaum/utils/packages/_packages.py,sha256=ykannoLv2Fm4iwZwiIlNAGZvt654cMJhjXr1VJPoEDo,8867
251
251
  meerschaum/utils/packages/lazy_loader.py,sha256=VHnph3VozH29R4JnSSBfwtA5WKZYZQFT_GeQSShCnuc,2540
252
- meerschaum/utils/venv/_Venv.py,sha256=sBnlmxHdAh2bx8btfVoD79-H9-cYsv5lP02IIXkyECs,3553
253
- meerschaum/utils/venv/__init__.py,sha256=f3oi67lXYPLKJrnRW9lae7M3A8SFiC7DzaMoBdCVUFs,24609
254
- meerschaum-2.6.17.dist-info/LICENSE,sha256=jG2zQEdRNt88EgHUWPpXVWmOrOduUQRx7MnYV9YIPaw,11359
255
- meerschaum-2.6.17.dist-info/METADATA,sha256=D8iWjbBsvLjjMpwhvtHsXFC2PTIIIqhCDxkmfAytGBg,24225
256
- meerschaum-2.6.17.dist-info/NOTICE,sha256=OTA9Fcthjf5BRvWDDIcBC_xfLpeDV-RPZh3M-HQBRtQ,114
257
- meerschaum-2.6.17.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
258
- meerschaum-2.6.17.dist-info/entry_points.txt,sha256=5YBVzibw-0rNA_1VjB16z5GABsOGf-CDhW4yqH8C7Gc,88
259
- meerschaum-2.6.17.dist-info/top_level.txt,sha256=bNoSiDj0El6buocix-FRoAtJOeq1qOF5rRm2u9i7Q6A,11
260
- meerschaum-2.6.17.dist-info/zip-safe,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
261
- meerschaum-2.6.17.dist-info/RECORD,,
252
+ meerschaum/utils/venv/_Venv.py,sha256=QsnDGEE_YBqXIq53NTWi2TANA1FbkqJBl_xQi9jQP_U,3537
253
+ meerschaum/utils/venv/__init__.py,sha256=6Zxswa8kEXUVN9m4Fw0DhvqKEtzlBMVyf_2k3Y-M4Oo,25275
254
+ meerschaum-2.7.0rc1.dist-info/LICENSE,sha256=jG2zQEdRNt88EgHUWPpXVWmOrOduUQRx7MnYV9YIPaw,11359
255
+ meerschaum-2.7.0rc1.dist-info/METADATA,sha256=2NFIcN6bVYF-FVZcRFrZbBM0eK5N6rywkhh0ekmrY0A,24227
256
+ meerschaum-2.7.0rc1.dist-info/NOTICE,sha256=OTA9Fcthjf5BRvWDDIcBC_xfLpeDV-RPZh3M-HQBRtQ,114
257
+ meerschaum-2.7.0rc1.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
258
+ meerschaum-2.7.0rc1.dist-info/entry_points.txt,sha256=5YBVzibw-0rNA_1VjB16z5GABsOGf-CDhW4yqH8C7Gc,88
259
+ meerschaum-2.7.0rc1.dist-info/top_level.txt,sha256=bNoSiDj0El6buocix-FRoAtJOeq1qOF5rRm2u9i7Q6A,11
260
+ meerschaum-2.7.0rc1.dist-info/zip-safe,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
261
+ meerschaum-2.7.0rc1.dist-info/RECORD,,