meerschaum 2.4.11__py3-none-any.whl → 2.4.12__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 (31) hide show
  1. meerschaum/_internal/arguments/_parse_arguments.py +15 -1
  2. meerschaum/_internal/docs/index.py +1 -0
  3. meerschaum/_internal/shell/Shell.py +19 -9
  4. meerschaum/_internal/shell/ShellCompleter.py +11 -6
  5. meerschaum/actions/bootstrap.py +120 -15
  6. meerschaum/actions/clear.py +41 -30
  7. meerschaum/actions/edit.py +89 -0
  8. meerschaum/actions/start.py +3 -2
  9. meerschaum/api/dash/callbacks/dashboard.py +2 -1
  10. meerschaum/api/dash/callbacks/jobs.py +53 -7
  11. meerschaum/api/dash/callbacks/pipes.py +1 -1
  12. meerschaum/api/dash/jobs.py +86 -60
  13. meerschaum/api/dash/pages/__init__.py +1 -0
  14. meerschaum/api/dash/pages/job.py +21 -0
  15. meerschaum/api/routes/_jobs.py +3 -3
  16. meerschaum/config/_version.py +1 -1
  17. meerschaum/connectors/sql/_fetch.py +65 -61
  18. meerschaum/connectors/sql/_pipes.py +36 -29
  19. meerschaum/utils/formatting/__init__.py +32 -16
  20. meerschaum/utils/formatting/_pipes.py +1 -1
  21. meerschaum/utils/formatting/_shell.py +4 -3
  22. meerschaum/utils/prompt.py +16 -15
  23. meerschaum/utils/sql.py +107 -35
  24. {meerschaum-2.4.11.dist-info → meerschaum-2.4.12.dist-info}/METADATA +1 -1
  25. {meerschaum-2.4.11.dist-info → meerschaum-2.4.12.dist-info}/RECORD +31 -30
  26. {meerschaum-2.4.11.dist-info → meerschaum-2.4.12.dist-info}/WHEEL +1 -1
  27. {meerschaum-2.4.11.dist-info → meerschaum-2.4.12.dist-info}/LICENSE +0 -0
  28. {meerschaum-2.4.11.dist-info → meerschaum-2.4.12.dist-info}/NOTICE +0 -0
  29. {meerschaum-2.4.11.dist-info → meerschaum-2.4.12.dist-info}/entry_points.txt +0 -0
  30. {meerschaum-2.4.11.dist-info → meerschaum-2.4.12.dist-info}/top_level.txt +0 -0
  31. {meerschaum-2.4.11.dist-info → meerschaum-2.4.12.dist-info}/zip-safe +0 -0
@@ -11,7 +11,7 @@ import platform
11
11
  import os
12
12
  import sys
13
13
  import meerschaum as mrsm
14
- from meerschaum.utils.typing import Optional, Union, Any, Dict
14
+ from meerschaum.utils.typing import Optional, Union, Any, Dict, Iterable
15
15
  from meerschaum.utils.formatting._shell import make_header
16
16
  from meerschaum.utils.formatting._pprint import pprint
17
17
  from meerschaum.utils.formatting._pipes import (
@@ -322,14 +322,14 @@ def format_success_tuple(
322
322
  from meerschaum.config import get_config
323
323
  status_config = get_config('formatting', status, patch=True)
324
324
 
325
- msg = (' ' * left_padding) + status_config[CHARSET]['icon'] + ' ' + str(tup[1])
325
+ msg = (' ' * left_padding) + status_config[CHARSET]['icon'] + ' ' + str(highlight_pipes(tup[1]))
326
326
  lines = msg.split('\n')
327
327
  lines = [lines[0]] + [
328
328
  ((' ' + line if not line.startswith(' ') else line))
329
329
  for line in lines[1:]
330
330
  ]
331
331
  if ANSI:
332
- lines[0] = fill_ansi(highlight_pipes(lines[0]), **status_config['ansi']['rich'])
332
+ lines[0] = fill_ansi(lines[0], **status_config['ansi']['rich'])
333
333
 
334
334
  msg = '\n'.join(lines)
335
335
  msg = ('\n' * upper_padding) + msg + ('\n' * lower_padding)
@@ -337,7 +337,7 @@ def format_success_tuple(
337
337
 
338
338
 
339
339
  def print_options(
340
- options: Optional[Dict[str, Any]] = None,
340
+ options: Optional[Iterable[Any]] = None,
341
341
  nopretty: bool = False,
342
342
  no_rich: bool = False,
343
343
  name: str = 'options',
@@ -345,6 +345,7 @@ def print_options(
345
345
  num_cols: Optional[int] = None,
346
346
  adjust_cols: bool = True,
347
347
  sort_options: bool = False,
348
+ number_options: bool = False,
348
349
  **kw
349
350
  ) -> None:
350
351
  """
@@ -373,6 +374,12 @@ def print_options(
373
374
  adjust_cols: bool, default True
374
375
  If `True`, adjust the number of columns depending on the terminal size.
375
376
 
377
+ sort_options: bool, default False
378
+ If `True`, print the options in sorted order.
379
+
380
+ number_options: bool, default False
381
+ If `True`, print the option's number in the list (1 index).
382
+
376
383
  """
377
384
  import os
378
385
  from meerschaum.utils.packages import import_rich
@@ -398,9 +405,10 @@ def print_options(
398
405
  print()
399
406
  print(make_header(_header))
400
407
  ### print actions
401
- for option in _options:
408
+ for i, option in enumerate(_options):
409
+ marker = '-' if not number_options else (str(i + 1) + '.')
402
410
  if not nopretty:
403
- print(" - ", end="")
411
+ print(f" {marker} ", end="")
404
412
  print(option)
405
413
  if not nopretty:
406
414
  print()
@@ -434,11 +442,11 @@ def print_options(
434
442
 
435
443
  if _header is not None:
436
444
  table = Table(
437
- title = _header,
438
- box = box.SIMPLE,
439
- show_header = False,
440
- show_footer = False,
441
- title_style = '',
445
+ title=_header,
446
+ box=box.SIMPLE,
447
+ show_header=False,
448
+ show_footer=False,
449
+ title_style='',
442
450
  expand = True,
443
451
  )
444
452
  else:
@@ -447,18 +455,26 @@ def print_options(
447
455
  table.add_column()
448
456
 
449
457
  if len(_options) < 12:
450
- # If fewer than 12 items, use a single column
451
- for option in _options:
452
- table.add_row(Text.from_ansi(highlight_pipes(option)))
458
+ ### If fewer than 12 items, use a single column
459
+ for i, option in enumerate(_options):
460
+ item = highlight_pipes(option)
461
+ if number_options:
462
+ item = str(i + 1) + '. ' + item
463
+ table.add_row(Text.from_ansi(item))
453
464
  else:
454
- # Otherwise, use multiple columns as before
465
+ ### Otherwise, use multiple columns as before
455
466
  num_rows = (len(_options) + num_cols - 1) // num_cols
467
+ item_ix = 0
456
468
  for i in range(num_rows):
457
469
  row = []
458
470
  for j in range(num_cols):
459
471
  index = i + j * num_rows
460
472
  if index < len(_options):
461
- row.append(Text.from_ansi(highlight_pipes(_options[index])))
473
+ item = highlight_pipes(_options[index])
474
+ if number_options:
475
+ item = str(i + 1) + '. ' + item
476
+ row.append(Text.from_ansi(item))
477
+ item_ix += 1
462
478
  else:
463
479
  row.append('')
464
480
  table.add_row(*row)
@@ -323,7 +323,7 @@ def pipe_repr(
323
323
  )
324
324
  if as_rich_text:
325
325
  return text_obj
326
- return rich_text_to_str(text_obj)
326
+ return rich_text_to_str(text_obj).replace('\n', '')
327
327
 
328
328
 
329
329
  def highlight_pipes(message: str) -> str:
@@ -10,10 +10,11 @@ from re import sub
10
10
  from meerschaum.utils.threading import Lock
11
11
  _locks = {'_tried_clear_command': Lock()}
12
12
 
13
+
13
14
  def make_header(
14
- message : str,
15
- ruler : str = '─',
16
- ) -> str:
15
+ message: str,
16
+ ruler: str = '─',
17
+ ) -> str:
17
18
  """Format a message string with a ruler.
18
19
  Length of the ruler is the length of the longest word.
19
20
 
@@ -10,17 +10,18 @@ from __future__ import annotations
10
10
  import os
11
11
  from meerschaum.utils.typing import Any, Union, Optional, Tuple, List
12
12
 
13
+
13
14
  def prompt(
14
- question: str,
15
- icon: bool = True,
16
- default: Union[str, Tuple[str, str], None] = None,
17
- default_editable: Optional[str] = None,
18
- detect_password: bool = True,
19
- is_password: bool = False,
20
- wrap_lines: bool = True,
21
- noask: bool = False,
22
- **kw: Any
23
- ) -> str:
15
+ question: str,
16
+ icon: bool = True,
17
+ default: Union[str, Tuple[str, str], None] = None,
18
+ default_editable: Optional[str] = None,
19
+ detect_password: bool = True,
20
+ is_password: bool = False,
21
+ wrap_lines: bool = True,
22
+ noask: bool = False,
23
+ **kw: Any
24
+ ) -> str:
24
25
  """
25
26
  Ask the user a question and return the answer.
26
27
  Wrapper around `prompt_toolkit.prompt()` with modified behavior.
@@ -75,7 +76,7 @@ def prompt(
75
76
  ### if a default is provided, append it to the question.
76
77
  default_answer = default
77
78
  if default is not None:
78
- question += f" (default: "
79
+ question += " (default: "
79
80
  if isinstance(default, tuple) and len(default) > 1:
80
81
  question += f"{default[0]} [{default[1]}]"
81
82
  default_answer = default[0]
@@ -86,7 +87,7 @@ def prompt(
86
87
  ### detect password
87
88
  if (detect_password and 'password' in question.lower()) or is_password:
88
89
  kw['is_password'] = True
89
-
90
+
90
91
  ### Add the icon and only color the first line.
91
92
  lines = question.split('\n')
92
93
  first_line = lines[0]
@@ -107,15 +108,15 @@ def prompt(
107
108
  answer = (
108
109
  prompt_toolkit.prompt(
109
110
  prompt_toolkit.formatted_text.ANSI(question),
110
- wrap_lines = wrap_lines,
111
- default = default_editable or '',
111
+ wrap_lines=wrap_lines,
112
+ default=default_editable or '',
112
113
  **filter_keywords(prompt_toolkit.prompt, **kw)
113
114
  ) if not noask else ''
114
115
  )
115
116
  else:
116
117
  print(question, end='\n', flush=True)
117
118
  try:
118
- answer = input()
119
+ answer = input() if not noask else ''
119
120
  except EOFError:
120
121
  answer = ''
121
122
  if noask:
meerschaum/utils/sql.py CHANGED
@@ -758,11 +758,11 @@ def build_where(
758
758
 
759
759
 
760
760
  def table_exists(
761
- table: str,
762
- connector: mrsm.connectors.sql.SQLConnector,
763
- schema: Optional[str] = None,
764
- debug: bool = False,
765
- ) -> bool:
761
+ table: str,
762
+ connector: mrsm.connectors.sql.SQLConnector,
763
+ schema: Optional[str] = None,
764
+ debug: bool = False,
765
+ ) -> bool:
766
766
  """Check if a table exists.
767
767
 
768
768
  Parameters
@@ -793,12 +793,12 @@ def table_exists(
793
793
 
794
794
 
795
795
  def get_sqlalchemy_table(
796
- table: str,
797
- connector: Optional[meerschaum.connectors.sql.SQLConnector] = None,
798
- schema: Optional[str] = None,
799
- refresh: bool = False,
800
- debug: bool = False,
801
- ) -> 'sqlalchemy.Table':
796
+ table: str,
797
+ connector: Optional[mrsm.connectors.sql.SQLConnector] = None,
798
+ schema: Optional[str] = None,
799
+ refresh: bool = False,
800
+ debug: bool = False,
801
+ ) -> Union['sqlalchemy.Table', None]:
802
802
  """
803
803
  Construct a SQLAlchemy table from its name.
804
804
 
@@ -829,6 +829,9 @@ def get_sqlalchemy_table(
829
829
  from meerschaum import get_connector
830
830
  connector = get_connector('sql')
831
831
 
832
+ if connector.flavor == 'duckdb':
833
+ return None
834
+
832
835
  from meerschaum.connectors.sql.tables import get_tables
833
836
  from meerschaum.utils.packages import attempt_import
834
837
  from meerschaum.utils.warnings import warn
@@ -1333,11 +1336,11 @@ def get_rename_table_queries(
1333
1336
 
1334
1337
 
1335
1338
  def get_create_table_query(
1336
- query: str,
1337
- new_table: str,
1338
- flavor: str,
1339
- schema: Optional[str] = None,
1340
- ) -> str:
1339
+ query: str,
1340
+ new_table: str,
1341
+ flavor: str,
1342
+ schema: Optional[str] = None,
1343
+ ) -> str:
1341
1344
  """
1342
1345
  Return a query to create a new table from a `SELECT` query.
1343
1346
 
@@ -1365,10 +1368,8 @@ def get_create_table_query(
1365
1368
  new_table_name = sql_item_name(new_table, flavor, schema)
1366
1369
  if flavor in ('mssql',):
1367
1370
  query = query.lstrip()
1368
- original_query = query
1369
1371
  if 'with ' in query.lower():
1370
1372
  final_select_ix = query.lower().rfind('select')
1371
- def_name = query[len('WITH '):].split(' ', maxsplit=1)[0]
1372
1373
  return (
1373
1374
  query[:final_select_ix].rstrip() + ',\n'
1374
1375
  + f"{create_cte_name} AS (\n"
@@ -1405,12 +1406,86 @@ def get_create_table_query(
1405
1406
  return textwrap.dedent(create_table_query)
1406
1407
 
1407
1408
 
1409
+ def wrap_query_with_cte(
1410
+ sub_query: str,
1411
+ parent_query: str,
1412
+ flavor: str,
1413
+ cte_name: str = "src",
1414
+ ) -> str:
1415
+ """
1416
+ Wrap a subquery in a CTE and append an encapsulating query.
1417
+
1418
+ Parameters
1419
+ ----------
1420
+ sub_query: str
1421
+ The query to be referenced. This may itself contain CTEs.
1422
+ Unless `cte_name` is provided, this will be aliased as `src`.
1423
+
1424
+ parent_query: str
1425
+ The larger query to append which references the subquery.
1426
+ This must not contain CTEs.
1427
+
1428
+ flavor: str
1429
+ The database flavor, e.g. `'mssql'`.
1430
+
1431
+ cte_name: str, default 'src'
1432
+ The CTE alias, defaults to `src`.
1433
+
1434
+ Returns
1435
+ -------
1436
+ An encapsulating query which allows you to treat `sub_query` as a temporary table.
1437
+
1438
+ Examples
1439
+ --------
1440
+
1441
+ ```python
1442
+ from meerschaum.utils.sql import wrap_query_with_cte
1443
+ sub_query = "WITH foo AS (SELECT 1 AS val) SELECT (val * 2) AS newval FROM foo"
1444
+ parent_query = "SELECT newval * 3 FROM src"
1445
+ query = wrap_query_with_cte(sub_query, parent_query, 'mssql')
1446
+ print(query)
1447
+ # WITH foo AS (SELECT 1 AS val),
1448
+ # [src] AS (
1449
+ # SELECT (val * 2) AS newval FROM foo
1450
+ # )
1451
+ # SELECT newval * 3 FROM src
1452
+ ```
1453
+
1454
+ """
1455
+ sub_query = sub_query.lstrip()
1456
+ cte_name_quoted = sql_item_name(cte_name, flavor, None)
1457
+
1458
+ if flavor in NO_CTE_FLAVORS:
1459
+ return (
1460
+ parent_query
1461
+ .replace(cte_name_quoted, '--MRSM_SUBQUERY--')
1462
+ .replace(cte_name, '--MRSM_SUBQUERY--')
1463
+ .replace('--MRSM_SUBQUERY--', f"(\n{sub_query}\n) AS {cte_name_quoted}")
1464
+ )
1465
+
1466
+ if 'with ' in sub_query.lower():
1467
+ final_select_ix = sub_query.lower().rfind('select')
1468
+ return (
1469
+ sub_query[:final_select_ix].rstrip() + ',\n'
1470
+ + f"{cte_name_quoted} AS (\n"
1471
+ + ' ' + sub_query[final_select_ix:]
1472
+ + "\n)\n"
1473
+ + parent_query
1474
+ )
1475
+
1476
+ return (
1477
+ f"WITH {cte_name_quoted} AS (\n"
1478
+ f" {sub_query}\n"
1479
+ f")\n{parent_query}"
1480
+ )
1481
+
1482
+
1408
1483
  def format_cte_subquery(
1409
- sub_query: str,
1410
- flavor: str,
1411
- sub_name: str = 'src',
1412
- cols_to_select: Union[List[str], str] = '*',
1413
- ) -> str:
1484
+ sub_query: str,
1485
+ flavor: str,
1486
+ sub_name: str = 'src',
1487
+ cols_to_select: Union[List[str], str] = '*',
1488
+ ) -> str:
1414
1489
  """
1415
1490
  Given a subquery, build a wrapper query that selects from the CTE subquery.
1416
1491
 
@@ -1434,28 +1509,25 @@ def format_cte_subquery(
1434
1509
  -------
1435
1510
  A wrapper query that selects from the CTE.
1436
1511
  """
1437
- import textwrap
1438
1512
  quoted_sub_name = sql_item_name(sub_name, flavor, None)
1439
1513
  cols_str = (
1440
1514
  cols_to_select
1441
1515
  if isinstance(cols_to_select, str)
1442
1516
  else ', '.join([sql_item_name(col, flavor, None) for col in cols_to_select])
1443
1517
  )
1444
- return textwrap.dedent(
1445
- f"""
1446
- SELECT {cols_str}
1447
- FROM ({sub_query})"""
1448
- + (f' AS {quoted_sub_name}' if flavor != 'oracle' else '') + """
1449
- """
1518
+ parent_query = (
1519
+ f"SELECT {cols_str}\n"
1520
+ f"FROM {quoted_sub_name}"
1450
1521
  )
1522
+ return wrap_query_with_cte(sub_query, parent_query, flavor, cte_name=sub_name)
1451
1523
 
1452
1524
 
1453
1525
  def session_execute(
1454
- session: 'sqlalchemy.orm.session.Session',
1455
- queries: Union[List[str], str],
1456
- with_results: bool = False,
1457
- debug: bool = False,
1458
- ) -> Union[mrsm.SuccessTuple, Tuple[mrsm.SuccessTuple, List['sqlalchemy.sql.ResultProxy']]]:
1526
+ session: 'sqlalchemy.orm.session.Session',
1527
+ queries: Union[List[str], str],
1528
+ with_results: bool = False,
1529
+ debug: bool = False,
1530
+ ) -> Union[mrsm.SuccessTuple, Tuple[mrsm.SuccessTuple, List['sqlalchemy.sql.ResultProxy']]]:
1459
1531
  """
1460
1532
  Similar to `SQLConnector.exec_queries()`, execute a list of queries
1461
1533
  and roll back when one fails.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: meerschaum
3
- Version: 2.4.11
3
+ Version: 2.4.12
4
4
  Summary: Sync Time-Series Pipes with Meerschaum
5
5
  Home-page: https://meerschaum.io
6
6
  Author: Bennett Meares
@@ -3,17 +3,17 @@ meerschaum/__main__.py,sha256=r5UjYxH1WA6dGG9YGBPul5xOdgF3Iwl0X4dWDtXU-30,2646
3
3
  meerschaum/_internal/__init__.py,sha256=ilC7utfKtin7GAvuN34fKyUQYfPyqH0Mm3MJF5iyEf4,169
4
4
  meerschaum/_internal/entry.py,sha256=5vBZxQbtN0l9lia9HcvvLVWDCpSeThg-505dGhKiOBo,12234
5
5
  meerschaum/_internal/arguments/__init__.py,sha256=_nSKKVLXNsJeSv-buxEZsx8_c0BAbkhRyE4nT6Bv6q0,541
6
- meerschaum/_internal/arguments/_parse_arguments.py,sha256=602U0rQrKKGfJQYY_c13GcCD0avjOa44c5GoqIAD_iE,15805
6
+ meerschaum/_internal/arguments/_parse_arguments.py,sha256=H492J571CetGVIEzOZhwQVS3bcm4t6hjWg8Gsf6dw0Y,16340
7
7
  meerschaum/_internal/arguments/_parser.py,sha256=l2RYIn-1MEpjyUz2yczkeeuwg2liYaO2MNvEZ4Amk1o,16364
8
8
  meerschaum/_internal/docs/__init__.py,sha256=ZQYHWo6n0kfLLkyG36YXqTYvv2Pc7it5HZHMylT6cBA,126
9
- meerschaum/_internal/docs/index.py,sha256=IBVotNZ6f9KTSefXq5cCikcZ7mnjDy98JOeb-KPLkyg,24514
9
+ meerschaum/_internal/docs/index.py,sha256=8nU5Ck4I8ZrTTT2yWRCJYx92g2OfL23LWNZZ2eFSXaU,24585
10
10
  meerschaum/_internal/gui/__init__.py,sha256=KF6Opae0aBOjIndMZ2txoPs7ozCXRlR-lcTsicLO7fc,1313
11
11
  meerschaum/_internal/gui/app/__init__.py,sha256=rKUa8hHk6Fai-PDF61tQcpT1myxKcfmvEMDHxThNp7o,1565
12
12
  meerschaum/_internal/gui/app/_windows.py,sha256=-VHdjTzA3V596fVqnbmTxemONSp_80-sTNJ0CTB8FwU,2632
13
13
  meerschaum/_internal/gui/app/actions.py,sha256=rx37qXf3uoa7Ou0n1cISqNFZNL0nr4wO7vSUmWO8f2E,935
14
14
  meerschaum/_internal/gui/app/pipes.py,sha256=4nAQ0rrHb_2bNgDF0Ru2YlbPaCDDzAl5beOGU4Af-4A,1596
15
- meerschaum/_internal/shell/Shell.py,sha256=KfJBubM9ajjPgTF8p-QBbv-UvcpG9m5BD4lNEdngQuk,39883
16
- meerschaum/_internal/shell/ShellCompleter.py,sha256=bbG-mExNXO4pltWBOXdbMp8P2wLgy8_BgipIr5aGp5s,3114
15
+ meerschaum/_internal/shell/Shell.py,sha256=-dw1k9NbG0VGX0Sve1c8gQ1_XsMYcmYl0VwSO98ERVk,40099
16
+ meerschaum/_internal/shell/ShellCompleter.py,sha256=uWo-SYBXDGEeKExsjVWi-u7yfnc5XWWCy4Nl4eSO8j4,3340
17
17
  meerschaum/_internal/shell/ValidAutoSuggest.py,sha256=bARjOWMidz0dvMelLUe6yRPto5l3gcEHYHqFDjoh22I,1280
18
18
  meerschaum/_internal/shell/__init__.py,sha256=vXQoQPEVlYiUYai1b5AwQAlTnja6A2cSABnqXhzlS7I,281
19
19
  meerschaum/_internal/shell/updates.py,sha256=FmKu1NsIE7AI1zq8zNeKneZzORv6BeURQeX0lRR81Ag,5040
@@ -24,13 +24,13 @@ meerschaum/_internal/term/tools.py,sha256=dXVAimKD-Yv2fg2WOTr0YGBY7XDKjQqw-RizcS
24
24
  meerschaum/actions/__init__.py,sha256=MHPs8aRBhbZQXnqd_6tVtisTrNCgPAPgnNcXYbn0zP8,11640
25
25
  meerschaum/actions/api.py,sha256=xeqkf4S-DEzFR8roIF1mzy-i_mAnUPkF7y3nIu8twCo,12593
26
26
  meerschaum/actions/attach.py,sha256=UV19d9W_2WYcrf7BRz7k3mriDoX1V4rA4AKvbLdor0o,3106
27
- meerschaum/actions/bootstrap.py,sha256=z6Wmx9EDKr5gfyMyMmyiTf_oVDASdcgChkKyzHYPOmQ,14924
28
- meerschaum/actions/clear.py,sha256=OoFZE0bK5m8s3GLNZcixuVT0DMj1izXVxGCATcmUGbI,4851
27
+ meerschaum/actions/bootstrap.py,sha256=XmWv1UP2cGb28GRKSVKywAV6_9pk3HQR-Ad8hjnMcK8,18280
28
+ meerschaum/actions/clear.py,sha256=tMacHFv8btWpkNnXHtKDOMiCDNhGb5S6CJhCDIrrNDk,4914
29
29
  meerschaum/actions/copy.py,sha256=NwTwj3IMdK1TFRuJXCxsbIEFNVeoNGoMkvE6H1ZQZzo,6838
30
30
  meerschaum/actions/deduplicate.py,sha256=puYyxeFYEUy1Sd2IOcZB2e6MrNxAZl2bTLmNzFDkCiw,1167
31
31
  meerschaum/actions/delete.py,sha256=DnEdkt_H4OYoee2DG-1mSDpTBp_Ay2aI1euRa4twPJU,19029
32
32
  meerschaum/actions/drop.py,sha256=Hd5h4rrWd7qL2rTqglsTonUsEoH7qQlsfqNFSHGeqr0,2453
33
- meerschaum/actions/edit.py,sha256=6d1Y8Ejd4zQWVARvx04cvbGyRA2r4ihJXWqMFiFX0aM,11740
33
+ meerschaum/actions/edit.py,sha256=f51kHaVu2hMllAszVJtfLh7uKDrZ5OViSQcg12tSsl4,14598
34
34
  meerschaum/actions/install.py,sha256=jdhOrR_KlvinTKr0YJNkUHsnh5EY6OzA7cRq0Vnp1oU,7494
35
35
  meerschaum/actions/login.py,sha256=fNgsgkrFCn9wBQJY50SQhz2PwsN_TvEYYHnXK3JG4ig,4206
36
36
  meerschaum/actions/os.py,sha256=dtoppoBhLzW3rLNF0SFovEfNxA4WJWt_9WrOGlS5KbA,2251
@@ -44,7 +44,7 @@ meerschaum/actions/sh.py,sha256=fLfTJaacKu4sjLTRqEzzYlT2WbbdZBEczsKb6F-qAek,2026
44
44
  meerschaum/actions/show.py,sha256=T8Ol1o-762cI9rlUzd-8svvwgT4slYXYfOPQETh9Koo,28446
45
45
  meerschaum/actions/sql.py,sha256=8BSvlnccfEqLrscLq67Toa5D4FJ7I598IdxEe_yzmV8,4263
46
46
  meerschaum/actions/stack.py,sha256=ZwrCTGJ0x3jjZkRieWcvqasQHYCqNtB1HYvTX-r3Z3g,5996
47
- meerschaum/actions/start.py,sha256=7B6zLHh-DNWnJta1h_RV9ccGJ4EnbEDu3k-GdwAsU8M,19208
47
+ meerschaum/actions/start.py,sha256=PTYk-EzsSHnPyG5dEF0LHSLLNrJBaN6B9UuJGPhfRbM,19205
48
48
  meerschaum/actions/stop.py,sha256=5fdUw70YN-yuUWrC-NhA88cxr9FZ5NbssbQ8xXO8nFU,4632
49
49
  meerschaum/actions/sync.py,sha256=DTWDIx7QGwh9zCxwG9L1k3k598h_ePPkrVkybwWUt4w,17225
50
50
  meerschaum/actions/tag.py,sha256=SJf5qFW0ccLXjqlTdkK_0MCcrCMdg6xhYrhKdco0hdA,3053
@@ -60,7 +60,7 @@ meerschaum/api/dash/__init__.py,sha256=Qs7Q1wMI3TWl1gRECgHyJpPb7Zh70F_6TLIF8_qDv
60
60
  meerschaum/api/dash/components.py,sha256=t2goHW7oioao5Ew6Dro9U4LZDnHF-YWb4flLPx46GP8,6293
61
61
  meerschaum/api/dash/connectors.py,sha256=nJxBOFldtCMJLYjUSVYZwX5BO-LNjTNHgoEaXe-0XMo,843
62
62
  meerschaum/api/dash/graphs.py,sha256=wJUDWzcLN8-C3xko6rj0F2v7Rt8YDkSXoVkkXJjYGIk,2046
63
- meerschaum/api/dash/jobs.py,sha256=kcWBdOk3tNQTTuN91nd5qbS4u8MmAl3SX0gkAfdKnpk,7279
63
+ meerschaum/api/dash/jobs.py,sha256=mj9STE6AaQY4fwkjD1JcYRG0iW3VEcP04bO1SlKgiXw,7681
64
64
  meerschaum/api/dash/keys.py,sha256=hzEVeN60SAfVTVSO5lajGaykxRIKGhj9Ph00HRJnNoE,12598
65
65
  meerschaum/api/dash/pipes.py,sha256=Bgp33bGkIFcqjrLiUxEubpxcXVVssY8bzwi7kLp6UQ8,21814
66
66
  meerschaum/api/dash/plugins.py,sha256=KdfG04f6SsUpBg-nm7MUJegFGuElOj-GAkxDX98hi60,3768
@@ -77,15 +77,16 @@ meerschaum/api/dash/assets/logo_48x48.png,sha256=hTR5BHUHEN4yP2xiqAcDciuigoII9T3
77
77
  meerschaum/api/dash/assets/logo_500x500.png,sha256=9EUtf6wQcEZTXHKfQ2kjNXod6Rn_4DTB_BkTgxggq00,67702
78
78
  meerschaum/api/dash/callbacks/__init__.py,sha256=5nLDkziaWWWt5ivmuMNG3kVBMOfqB6KQNIAS8f16bmA,493
79
79
  meerschaum/api/dash/callbacks/custom.py,sha256=N9pVolAF8sIuJD3V6xBSgS7k8THJo_f8d1qAoh1Kg60,1161
80
- meerschaum/api/dash/callbacks/dashboard.py,sha256=c0gEHVfxR4QeB87F3Bx4_cLK5xSrfqAzsiz7MwQRvdU,32731
81
- meerschaum/api/dash/callbacks/jobs.py,sha256=F0H8dDUMOr_1C6Pr8yNQCAHhqgJQklHBiOzstOjiQQo,7282
80
+ meerschaum/api/dash/callbacks/dashboard.py,sha256=aXZ22qcVq_MOn2GWBuFV1MUjmojLjyDk24QyaUnkkk4,32757
81
+ meerschaum/api/dash/callbacks/jobs.py,sha256=JYTrDcUEte_MIT3EegLDmQDsmU_Mxqw8L60dvF71ho4,8418
82
82
  meerschaum/api/dash/callbacks/login.py,sha256=mEvMgV-f85H6DvqNdTvJPoiwHqTnhWY2nf_zLB26ipE,2876
83
- meerschaum/api/dash/callbacks/pipes.py,sha256=AJcs-1BTc_gCxIE6Y2-DM7GB2Cg4QS3V_1HMCzwHF1Q,1688
83
+ meerschaum/api/dash/callbacks/pipes.py,sha256=byphQn-wJOe8ft-fGU9wac0n5xsMjVHJzNvYYb9NsKU,1693
84
84
  meerschaum/api/dash/callbacks/plugins.py,sha256=znPgw_Uf3__QEjKxoIHADfjVNubTehCDaTJ02b16pQo,2760
85
85
  meerschaum/api/dash/callbacks/register.py,sha256=KfMFgXWiFkemz0YriSPaLQBVnFDG8q6_t9gHuempOS0,3666
86
- meerschaum/api/dash/pages/__init__.py,sha256=ZZAWLCgFjl8Gh5MzqeWM7HkXP3uSUuUn-73vQisnAKc,312
86
+ meerschaum/api/dash/pages/__init__.py,sha256=E3MI73_FR21R_-npTJ9HBNd7hdbOwQ75V-TMpq3ohz8,349
87
87
  meerschaum/api/dash/pages/dashboard.py,sha256=WKwy40kgm2Qy0k1ZTIueFnnVu0YBzFAd_8AT6CHHvfM,3835
88
88
  meerschaum/api/dash/pages/error.py,sha256=-uCrASuIBrceHcc-leLeEoLos2ibSBWG0XMFQzFwtbw,595
89
+ meerschaum/api/dash/pages/job.py,sha256=bAXXDB0fM3bSiqqJ2XlTwVdg2lohRaWdIGZp7ZtTZOw,544
89
90
  meerschaum/api/dash/pages/login.py,sha256=w8Cy1l4HSiMMgUndE4X_8pB0odU_iG7x1dwe9JrwR88,4633
90
91
  meerschaum/api/dash/pages/pipes.py,sha256=Cd5XY_m4nBIsEk6TQadpcajuBRzxw1cyDaTtojwykcI,506
91
92
  meerschaum/api/dash/pages/plugins.py,sha256=9VpRqWW-3OhgZDUoo4J8PYswd231HaxlcSntxOOKsQA,1549
@@ -120,7 +121,7 @@ meerschaum/api/routes/__init__.py,sha256=jbkeFNl51Tg8aT5gWe560ZLZLojFJsLMe5IENRj
120
121
  meerschaum/api/routes/_actions.py,sha256=KGUlPyWiO0e7t7Fj8-nIowWokDVP22Gr9z1XxLx5tpw,3063
121
122
  meerschaum/api/routes/_connectors.py,sha256=NNbcn5xWhKqw2PqueSEaqRaZ95hFGDKazG5lE7gsssc,1849
122
123
  meerschaum/api/routes/_index.py,sha256=QI6CBo6pI2Zi0a6fJHDjZfiLa9f4okb0BGe3A_JD0kM,578
123
- meerschaum/api/routes/_jobs.py,sha256=vO6CJYUme7bHIOy9gAv6VyEM1M8EKdJmtfw2nSnZ24Q,11639
124
+ meerschaum/api/routes/_jobs.py,sha256=deKv9Y9XtCAB6u3ZyI2_zeMbrzkA8Q8-o6PWmTf9sxc,11702
124
125
  meerschaum/api/routes/_login.py,sha256=ti2onNOemOGLHLoPubAQOYtD7eq7FA1jOlbOSVSjXVo,2466
125
126
  meerschaum/api/routes/_misc.py,sha256=05--9ZVFeaCgZrHER2kA3SYdK4TyfkEXOCjLvPbum-w,2469
126
127
  meerschaum/api/routes/_pipes.py,sha256=g88AU_NUM6tlX3bFl4EOGiQWZYqvDxDFlaLIYbYn1c4,21397
@@ -142,7 +143,7 @@ meerschaum/config/_preprocess.py,sha256=-AEA8m_--KivZwTQ1sWN6LTn5sio_fUr2XZ51BO6
142
143
  meerschaum/config/_read_config.py,sha256=oxnLjuhy6JBBld886FkBX07wUdkpzEzTItYMUa9qw1Q,14688
143
144
  meerschaum/config/_shell.py,sha256=46_m49Txc5q1rGfCgO49ca48BODx45DQJi8D0zz1R18,4245
144
145
  meerschaum/config/_sync.py,sha256=jHcWRkxd82_BgX8Xo8agsWvf7BSbv3qHLWmYl6ehp_0,4242
145
- meerschaum/config/_version.py,sha256=9NLPMqpdHoxcmqv9rrCsNQ_rVMY6J9XihmkfJDNleHI,72
146
+ meerschaum/config/_version.py,sha256=xIXlWHgz3jJoMBNfzTMSvX_D7PqRAasEI5rlJLcWiyA,72
146
147
  meerschaum/config/paths.py,sha256=JjibeGN3YAdSNceRwsd42aNmeUrIgM6ndzC8qZAmNI0,621
147
148
  meerschaum/config/resources/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
148
149
  meerschaum/config/stack/__init__.py,sha256=gGVxXgNnGb9u25iF__IiNPlZt1BLUVmHmFJ0jvnJg3Q,10548
@@ -173,9 +174,9 @@ meerschaum/connectors/sql/_SQLConnector.py,sha256=QlC2Af7AM7bIlPHjUO57mTyzot3zU7
173
174
  meerschaum/connectors/sql/__init__.py,sha256=3cqYiDkVasn7zWdtOTAZbT4bo95AuvGOmDD2TkaAxtw,205
174
175
  meerschaum/connectors/sql/_cli.py,sha256=1SgnWeMIAihoxp4FzbNrcq1npXf0dSOQnCntpU9hUXA,4405
175
176
  meerschaum/connectors/sql/_create_engine.py,sha256=pZPjy-ne8DtVfu-wqMJopIGkgm8vul-y3E9d4tUyTgM,10215
176
- meerschaum/connectors/sql/_fetch.py,sha256=NYYWDoEd-aGIS337KwH-D9_3KVWVCZOHAspGLfdEuUE,13086
177
+ meerschaum/connectors/sql/_fetch.py,sha256=pReFEPwwS2UuDn4A-EkAm6O2IpekM88pLujCkby9fyc,12913
177
178
  meerschaum/connectors/sql/_instance.py,sha256=zXPZnEqvOAeOUPMeh6CcfkB1pOjjwJxdUOwXccRbuwk,6465
178
- meerschaum/connectors/sql/_pipes.py,sha256=zrpdCOaAnVN0I_XVkSQu-voDMpRYibj5Y0k358IgkRQ,100593
179
+ meerschaum/connectors/sql/_pipes.py,sha256=-jbuBjZ8EET2bkhgAWQmqci5FNcBCZUqnOcF_tuHq8M,101055
179
180
  meerschaum/connectors/sql/_plugins.py,sha256=wbxcNxqTtjfDsxPvdVGTllasYf6NHHzODaQ72hEUSBQ,8135
180
181
  meerschaum/connectors/sql/_sql.py,sha256=zEh6fbOLJhfLOF-4x9OTQ5Fi3NMSVES3oixmnGYcNG8,36381
181
182
  meerschaum/connectors/sql/_uri.py,sha256=0BrhQtqQdzg9mR04gWBZINs_BbPFtSlTECXT_TCUwik,3460
@@ -225,9 +226,9 @@ meerschaum/utils/misc.py,sha256=OijhS1TMjlqkDvahbxhqfUdo0Myeor-kTKrvqqG8wN0,4634
225
226
  meerschaum/utils/networking.py,sha256=Sr_eYUGW8_UV9-k9LqRFf7xLtbUcsDucODyLCRsFRUc,1006
226
227
  meerschaum/utils/pool.py,sha256=vkE42af4fjrTEJTxf6Ek3xGucm1MtEkpsSEiaVzNKHs,2655
227
228
  meerschaum/utils/process.py,sha256=o7UtTQX87YGkg2dItPhlvN7gNQPkElXTYSzKf5Ro8Uc,7474
228
- meerschaum/utils/prompt.py,sha256=0asF_ndumQIN7p5kEOzK-ldsdE4m8FFapcT3-4wgPi8,19010
229
+ meerschaum/utils/prompt.py,sha256=6J--mZJ_NcEdSX6KMjtY4fXXezyILLHP24VdxFFqOIc,18985
229
230
  meerschaum/utils/schedule.py,sha256=6I2TFGa1aPRU9wTdd3YFrJq-DCPpnl-sTWeFEnrINYA,10886
230
- meerschaum/utils/sql.py,sha256=vZx6HyvaFKrvWDMZYSzHZaSQWMMWQOUmK-LLW5Kx7Lg,47993
231
+ meerschaum/utils/sql.py,sha256=R_hX92brvZDqID7c85-PNUVVR6RWXGXEgn1vFpHmi88,49869
231
232
  meerschaum/utils/threading.py,sha256=3N8JXPAnwqJiSjuQcbbJg3Rv9-CCUMJpeQRfKFR7MaA,2489
232
233
  meerschaum/utils/typing.py,sha256=U3MC347sh1umpa3Xr1k71eADyDmk4LB6TnVCpq8dVzI,2830
233
234
  meerschaum/utils/warnings.py,sha256=IDiwYspsfjIi1gtk3V9cSo9vNLckB9bCsHhRClpPJTc,6639
@@ -240,21 +241,21 @@ meerschaum/utils/daemon/__init__.py,sha256=o9jWb4lRTIyny4EPt7fPXFgV_vIf1mUofsTwo
240
241
  meerschaum/utils/daemon/_names.py,sha256=d2ZwTxBoTAqXZkCfZ5LuX2XrkQmLNUq1OTlUqfoH5dA,4515
241
242
  meerschaum/utils/dtypes/__init__.py,sha256=LawV4XrCLZRhyGquUen3i0HvK2IRHG-Ud4MYi3L4phA,7391
242
243
  meerschaum/utils/dtypes/sql.py,sha256=K0pginy3U5UvgtM9af-HRoiqdvFlwiAmKNQBPGChIUA,16267
243
- meerschaum/utils/formatting/__init__.py,sha256=GLx3fvTQi7EnC9fo31WggpMRpmR7yTWIuZmHdZgqvuM,15370
244
+ meerschaum/utils/formatting/__init__.py,sha256=GpJQWeqkdWw5IuDmW4Rgmapjzv-KkI4jhBZllJi4QIg,15999
244
245
  meerschaum/utils/formatting/_jobs.py,sha256=izsqPJhTtUkXUUtWnbXtReYsUYwulXtci3pBj72Ne64,6637
245
- meerschaum/utils/formatting/_pipes.py,sha256=qud_zaGKP3gh-Z5BMYadwEKWSwzUyR44Jg1RGCzAsXI,19476
246
+ meerschaum/utils/formatting/_pipes.py,sha256=840O5rg2aHhQoraCDOh2ZtBo43_W2W6R60yYufEoXp8,19494
246
247
  meerschaum/utils/formatting/_pprint.py,sha256=tgrT3FyGyu5CWJYysqK3kX1xdZYorlbOk9fcU_vt9Qg,3096
247
- meerschaum/utils/formatting/_shell.py,sha256=OMFh3cSZNr83z8m265irkS_JtEWHwjkEY2ybnMIOllY,3774
248
+ meerschaum/utils/formatting/_shell.py,sha256=XH7VFLteNv7NGtWhJl7FdIGt80sKeTiDoJokGSDAwBM,3761
248
249
  meerschaum/utils/packages/__init__.py,sha256=m3HLTkKJxXco1g-h75q2l5skBwKXWaJtNmfQOsijchI,63965
249
250
  meerschaum/utils/packages/_packages.py,sha256=8Ox9fiQTVmmKAmlxZBV-7Wtq_jhPnnf3AMXvktGE-KY,8319
250
251
  meerschaum/utils/packages/lazy_loader.py,sha256=VHnph3VozH29R4JnSSBfwtA5WKZYZQFT_GeQSShCnuc,2540
251
252
  meerschaum/utils/venv/_Venv.py,sha256=sBnlmxHdAh2bx8btfVoD79-H9-cYsv5lP02IIXkyECs,3553
252
253
  meerschaum/utils/venv/__init__.py,sha256=G3KXL4ByWNqVxBRLs_RaJbO3h3tOKXkazkAYuoUW568,24420
253
- meerschaum-2.4.11.dist-info/LICENSE,sha256=jG2zQEdRNt88EgHUWPpXVWmOrOduUQRx7MnYV9YIPaw,11359
254
- meerschaum-2.4.11.dist-info/METADATA,sha256=wM7_OUJbfvPeKsipK-mBIrh8ffGAWhPB1yP3HiI3-lA,24820
255
- meerschaum-2.4.11.dist-info/NOTICE,sha256=OTA9Fcthjf5BRvWDDIcBC_xfLpeDV-RPZh3M-HQBRtQ,114
256
- meerschaum-2.4.11.dist-info/WHEEL,sha256=GV9aMThwP_4oNCtvEC2ec3qUYutgWeAzklro_0m4WJQ,91
257
- meerschaum-2.4.11.dist-info/entry_points.txt,sha256=5YBVzibw-0rNA_1VjB16z5GABsOGf-CDhW4yqH8C7Gc,88
258
- meerschaum-2.4.11.dist-info/top_level.txt,sha256=bNoSiDj0El6buocix-FRoAtJOeq1qOF5rRm2u9i7Q6A,11
259
- meerschaum-2.4.11.dist-info/zip-safe,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
260
- meerschaum-2.4.11.dist-info/RECORD,,
254
+ meerschaum-2.4.12.dist-info/LICENSE,sha256=jG2zQEdRNt88EgHUWPpXVWmOrOduUQRx7MnYV9YIPaw,11359
255
+ meerschaum-2.4.12.dist-info/METADATA,sha256=rVQS3Zz8YZeAYGAa3AEkifTMrDyvBW2B-epRjrf7xc8,24820
256
+ meerschaum-2.4.12.dist-info/NOTICE,sha256=OTA9Fcthjf5BRvWDDIcBC_xfLpeDV-RPZh3M-HQBRtQ,114
257
+ meerschaum-2.4.12.dist-info/WHEEL,sha256=OVMc5UfuAQiSplgO0_WdW7vXVGAt9Hdd6qtN4HotdyA,91
258
+ meerschaum-2.4.12.dist-info/entry_points.txt,sha256=5YBVzibw-0rNA_1VjB16z5GABsOGf-CDhW4yqH8C7Gc,88
259
+ meerschaum-2.4.12.dist-info/top_level.txt,sha256=bNoSiDj0El6buocix-FRoAtJOeq1qOF5rRm2u9i7Q6A,11
260
+ meerschaum-2.4.12.dist-info/zip-safe,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
261
+ meerschaum-2.4.12.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (75.1.0)
2
+ Generator: setuptools (75.2.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5