meerschaum 2.1.3.dev2__py3-none-any.whl → 2.1.3.dev3__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.
@@ -118,6 +118,7 @@ def entry_with_args(
118
118
  return result
119
119
 
120
120
 
121
+ _shells = []
121
122
  _shell = None
122
123
  def get_shell(
123
124
  sysargs: Optional[List[str]] = None,
@@ -141,4 +142,6 @@ def get_shell(
141
142
  _shell = shell_pkg.Shell(actions, sysargs=sysargs)
142
143
  elif reload:
143
144
  _shell.__init__()
145
+
146
+ _shells.append(_shell)
144
147
  return _shell
@@ -64,6 +64,10 @@ reserved_completers = {
64
64
  'instance', 'repo'
65
65
  }
66
66
 
67
+ ### To handle dynamic reloading, store shell attributes externally.
68
+ ### This is because the shell object address gets lost upon reloads.
69
+ shell_attrs = {}
70
+
67
71
  def _insert_shell_actions(
68
72
  _shell: Optional['Shell'] = None,
69
73
  actions: Optional[Dict[str, Callable[[Any], SuccessTuple]]] = None,
@@ -229,7 +233,7 @@ class Shell(cmd.Cmd):
229
233
  pass
230
234
 
231
235
  from meerschaum.config._paths import SHELL_HISTORY_PATH
232
- self.session = prompt_toolkit_shortcuts.PromptSession(
236
+ shell_attrs['session'] = prompt_toolkit_shortcuts.PromptSession(
233
237
  history = prompt_toolkit_history.FileHistory(str(SHELL_HISTORY_PATH)),
234
238
  auto_suggest = ValidAutoSuggest(),
235
239
  completer = ShellCompleter(),
@@ -260,15 +264,15 @@ class Shell(cmd.Cmd):
260
264
  pass
261
265
 
262
266
  ### NOTE: custom actions must be added to the self._actions dictionary
263
- self._actions = actions
264
- self._sysargs = sysargs
265
- self._actions['instance'] = self.do_instance
266
- self._actions['repo'] = self.do_repo
267
- self._actions['debug'] = self.do_debug
268
- self._update_bottom_toolbar = True
269
- self._old_bottom_toolbar = ''
270
- self.debug = False
271
- self._reload = True
267
+ shell_attrs['_actions'] = actions
268
+ shell_attrs['_sysargs'] = sysargs
269
+ shell_attrs['_actions']['instance'] = self.do_instance
270
+ shell_attrs['_actions']['repo'] = self.do_repo
271
+ shell_attrs['_actions']['debug'] = self.do_debug
272
+ shell_attrs['_update_bottom_toolbar'] = True
273
+ shell_attrs['_old_bottom_toolbar'] = ''
274
+ shell_attrs['debug'] = False
275
+ shell_attrs['_reload'] = True
272
276
  self.load_config()
273
277
  self.hidden_commands = []
274
278
  ### update hidden commands list (cmd2 only)
@@ -286,7 +290,7 @@ class Shell(cmd.Cmd):
286
290
  from meerschaum.utils.misc import remove_ansi
287
291
  from meerschaum.utils.formatting import CHARSET, ANSI, UNICODE, colored
288
292
 
289
- if self.__dict__.get('intro', None) != '':
293
+ if shell_attrs.get('intro', None) != '':
290
294
  self.intro = get_config('shell', CHARSET, 'intro', patch=patch)
291
295
  self.intro += '\n' + ''.join(
292
296
  [' '
@@ -297,25 +301,30 @@ class Shell(cmd.Cmd):
297
301
  ) + 'v' + version
298
302
  else:
299
303
  self.intro = ""
300
- self._prompt = get_config('shell', CHARSET, 'prompt', patch=patch)
301
- self.prompt = self._prompt
302
- self.ruler = get_config('shell', CHARSET, 'ruler', patch=patch)
303
- self.close_message = get_config('shell', CHARSET, 'close_message', patch=patch)
304
- self.doc_header = get_config('shell', CHARSET, 'doc_header', patch=patch)
305
- self.undoc_header = get_config('shell', CHARSET, 'undoc_header', patch=patch)
304
+ shell_attrs['intro'] = self.intro
305
+ shell_attrs['_prompt'] = get_config('shell', CHARSET, 'prompt', patch=patch)
306
+ self.prompt = shell_attrs['_prompt']
307
+ shell_attrs['ruler'] = get_config('shell', CHARSET, 'ruler', patch=patch)
308
+ self.ruler = shell_attrs['ruler']
309
+ shell_attrs['close_message'] = get_config('shell', CHARSET, 'close_message', patch=patch)
310
+ self.close_message = shell_attrs['close_message']
311
+ shell_attrs['doc_header'] = get_config('shell', CHARSET, 'doc_header', patch=patch)
312
+ self.doc_header = shell_attrs['doc_header']
313
+ shell_attrs['undoc_header'] = get_config('shell', CHARSET, 'undoc_header', patch=patch)
314
+ self.undoc_header = shell_attrs['undoc_header']
306
315
 
307
316
  if instance is None and self.__dict__.get('instance_keys', None) is None:
308
317
  ### create default instance and repository connectors
309
- self.instance_keys = remove_ansi(get_config('meerschaum', 'instance', patch=patch))
310
- ### self.instance is a stylized version of self.instance_keys
311
- self.instance = str(self.instance_keys)
318
+ shell_attrs['instance_keys'] = remove_ansi(get_config('meerschaum', 'instance', patch=patch))
319
+ ### instance is a stylized version of instance_keys
320
+ shell_attrs['instance'] = str(shell_attrs['instance_keys'])
312
321
  else:
313
- self.instance = instance
314
- self.instance_keys = remove_ansi(str(instance))
315
- if self.__dict__.get('repo_keys', None) is None:
316
- self.repo_keys = get_config('meerschaum', 'default_repository', patch=patch)
322
+ shell_attrs['instance'] = instance
323
+ shell_attrs['instance_keys'] = remove_ansi(str(instance))
324
+ if shell_attrs.get('repo_keys', None) is None:
325
+ shell_attrs['repo_keys'] = get_config('meerschaum', 'default_repository', patch=patch)
317
326
  ### this will be updated later in update_prompt ONLY IF {username} is in the prompt
318
- self.username = ''
327
+ shell_attrs['username'] = ''
319
328
 
320
329
  if ANSI:
321
330
  def apply_colors(attr, key):
@@ -325,48 +334,54 @@ class Shell(cmd.Cmd):
325
334
  )
326
335
 
327
336
  for attr_key in get_config('shell', 'ansi'):
328
- if attr_key not in self.__dict__:
337
+ if attr_key not in shell_attrs:
329
338
  continue
330
- self.__dict__[attr_key] = apply_colors(self.__dict__[attr_key], attr_key)
339
+ shell_attrs[attr_key] = apply_colors(shell_attrs[attr_key], attr_key)
340
+ self.__dict__[attr_key] = shell_attrs[attr_key]
331
341
 
332
342
  ### refresh actions
333
343
  _insert_shell_actions(_shell=self, keep_self=True)
334
344
 
335
345
  ### replace {instance} in prompt with stylized instance string
336
346
  self.update_prompt()
337
- self._dict_backup = {k:v for k, v in self.__dict__.copy().items() if k != '_dict_backup'}
338
347
 
339
348
  def insert_actions(self):
340
349
  from meerschaum.actions import actions
341
350
 
342
351
  def update_prompt(self, instance: Optional[str] = None, username: Optional[str] = None):
343
352
  from meerschaum.utils.formatting import ANSI, colored
344
- cmd.__builtins__['input'] = input_with_sigint(_old_input, self.session, shell=self)
345
- prompt = self._prompt
353
+ from meerschaum._internal.entry import _shell, get_shell
354
+
355
+ cmd.__builtins__['input'] = input_with_sigint(
356
+ _old_input,
357
+ shell_attrs['session'],
358
+ shell = self,
359
+ )
360
+ prompt = shell_attrs['_prompt']
346
361
  mask = prompt
347
- self._update_bottom_toolbar = True
362
+ shell_attrs['_update_bottom_toolbar'] = True
348
363
 
349
- if '{instance}' in self._prompt:
364
+ if '{instance}' in shell_attrs['_prompt']:
350
365
  if instance is None:
351
- instance = self.instance_keys
352
- self.instance = instance
366
+ instance = shell_attrs['instance_keys']
367
+ shell_attrs['instance'] = instance
353
368
  if ANSI:
354
- self.instance = colored(
355
- self.instance, **get_config(
369
+ shell_attrs['instance'] = colored(
370
+ shell_attrs['instance'], **get_config(
356
371
  'shell', 'ansi', 'instance', 'rich'
357
372
  )
358
373
  )
359
- prompt = prompt.replace('{instance}', self.instance)
374
+ prompt = prompt.replace('{instance}', shell_attrs['instance'])
360
375
  mask = mask.replace('{instance}', ''.join(['\0' for c in '{instance}']))
361
376
 
362
- if '{username}' in self._prompt:
377
+ if '{username}' in shell_attrs['_prompt']:
363
378
  if username is None:
364
379
  from meerschaum.utils.misc import remove_ansi
365
380
  from meerschaum.connectors.parse import parse_instance_keys
366
381
  from meerschaum.connectors.sql import SQLConnector
367
382
  try:
368
383
  conn_attrs = parse_instance_keys(
369
- remove_ansi(self.instance_keys), construct=False
384
+ remove_ansi(shell_attrs['instance_keys']), construct=False
370
385
  )
371
386
  if 'username' not in conn_attrs:
372
387
  if 'uri' in conn_attrs:
@@ -379,14 +394,14 @@ class Shell(cmd.Cmd):
379
394
  username = str(e)
380
395
  if username is None:
381
396
  username = '(no username)'
382
- self.username = (
397
+ shell_attrs['username'] = (
383
398
  username if not ANSI else
384
399
  colored(username, **get_config('shell', 'ansi', 'username', 'rich'))
385
400
  )
386
- prompt = prompt.replace('{username}', self.username)
401
+ prompt = prompt.replace('{username}', shell_attrs['username'])
387
402
  mask = mask.replace('{username}', ''.join(['\0' for c in '{username}']))
388
403
 
389
- remainder_prompt = list(self._prompt)
404
+ remainder_prompt = list(shell_attrs['_prompt'])
390
405
  for i, c in enumerate(mask):
391
406
  if c != '\0':
392
407
  _c = c
@@ -394,10 +409,11 @@ class Shell(cmd.Cmd):
394
409
  _c = colored(_c, **get_config('shell', 'ansi', 'prompt', 'rich'))
395
410
  remainder_prompt[i] = _c
396
411
  self.prompt = ''.join(remainder_prompt).replace(
397
- '{username}', self.username
412
+ '{username}', shell_attrs['username']
398
413
  ).replace(
399
- '{instance}', self.instance
414
+ '{instance}', shell_attrs['instance']
400
415
  )
416
+ shell_attrs['prompt'] = self.prompt
401
417
  ### flush stdout
402
418
  print("", end="", flush=True)
403
419
 
@@ -412,6 +428,9 @@ class Shell(cmd.Cmd):
412
428
  ### Preserve the working directory.
413
429
  old_cwd = os.getcwd()
414
430
 
431
+ from meerschaum._internal.entry import _shell, get_shell
432
+ self = get_shell(sysargs=shell_attrs['_sysargs'], debug=shell_attrs.get('debug', False))
433
+
415
434
  ### make a backup of line for later
416
435
  original_line = deepcopy(line)
417
436
 
@@ -427,7 +446,7 @@ class Shell(cmd.Cmd):
427
446
  ### if the user specifies, clear the screen before executing any commands
428
447
  if _clear_screen:
429
448
  from meerschaum.utils.formatting._shell import clear_screen
430
- clear_screen(debug=self.debug)
449
+ clear_screen(debug=shell_attrs['debug'])
431
450
 
432
451
  ### return blank commands (spaces break argparse)
433
452
  if original_line is None or len(str(line).strip()) == 0:
@@ -456,11 +475,10 @@ class Shell(cmd.Cmd):
456
475
  args['shell'] = True
457
476
  args['line'] = line
458
477
 
459
-
460
478
  ### if debug is not set on the command line,
461
479
  ### default to shell setting
462
480
  if not args.get('debug', False):
463
- args['debug'] = self.debug
481
+ args['debug'] = shell_attrs['debug']
464
482
 
465
483
  ### Make sure an action was provided.
466
484
  if not args.get('action', None):
@@ -479,17 +497,19 @@ class Shell(cmd.Cmd):
479
497
  from meerschaum.actions import get_main_action_name
480
498
  main_action_name = get_main_action_name(args['action'])
481
499
  if main_action_name is None:
482
- if not hasattr(self, 'do_'+args['action'][0]):
500
+ if not hasattr(self, 'do_' + args['action'][0]):
483
501
  args['action'].insert(0, 'sh')
484
502
  main_action_name = 'sh'
503
+ else:
504
+ main_action_name = args['action'][0]
485
505
 
486
506
  ### if no instance is provided, use current shell default,
487
507
  ### but not for the 'api' command (to avoid recursion)
488
508
  if 'mrsm_instance' not in args and main_action_name != 'api':
489
- args['mrsm_instance'] = str(self.instance_keys)
509
+ args['mrsm_instance'] = str(shell_attrs['instance_keys'])
490
510
 
491
511
  if 'repository' not in args and main_action_name != 'api':
492
- args['repository'] = str(self.repo_keys)
512
+ args['repository'] = str(shell_attrs['repo_keys'])
493
513
 
494
514
  ### parse out empty strings
495
515
  if args['action'][0].strip("\"'") == '':
@@ -501,21 +521,25 @@ class Shell(cmd.Cmd):
501
521
  args['action'] = ['start', 'jobs'] + args['action']
502
522
  main_action_name = 'start'
503
523
 
504
- positional_only = (main_action_name not in self._actions)
524
+ positional_only = (main_action_name not in shell_attrs['_actions'])
505
525
  if positional_only:
506
526
  return original_line
507
527
 
508
528
  from meerschaum._internal.entry import entry_with_args
509
529
 
510
530
  try:
511
- success_tuple = entry_with_args(_actions=self._actions, **args)
531
+ success_tuple = entry_with_args(_actions=shell_attrs['_actions'], **args)
532
+ # success_tuple = entry_with_args(**args)
512
533
  except Exception as e:
513
534
  success_tuple = False, str(e)
514
535
 
515
536
  from meerschaum.utils.formatting import print_tuple
516
537
  if isinstance(success_tuple, tuple):
517
538
  print_tuple(
518
- success_tuple, skip_common=(not self.debug), upper_padding=1, lower_padding=0,
539
+ success_tuple,
540
+ skip_common = (not shell_attrs['debug']),
541
+ upper_padding = 1,
542
+ lower_padding = 0,
519
543
  )
520
544
 
521
545
  ### Restore the old working directory.
@@ -525,9 +549,9 @@ class Shell(cmd.Cmd):
525
549
  return ""
526
550
 
527
551
  def postcmd(self, stop : bool = False, line : str = ""):
528
- _reload = self._reload
552
+ _reload = shell_attrs['_reload']
529
553
  if _reload:
530
- self.load_config(self.instance)
554
+ self.load_config(shell_attrs['instance'])
531
555
  if stop:
532
556
  return True
533
557
 
@@ -555,15 +579,15 @@ class Shell(cmd.Cmd):
555
579
  except (IndexError, AttributeError):
556
580
  state = ''
557
581
  if state == '':
558
- self.debug = not self.debug
582
+ shell_attrs['debug'] = not shell_attrs['debug']
559
583
  elif state.lower() in on_commands:
560
- self.debug = True
584
+ shell_attrs['debug'] = True
561
585
  elif state.lower() in off_commands:
562
- self.debug = False
586
+ shell_attrs['debug'] = False
563
587
  else:
564
588
  info(f"Unknown state '{state}'. Ignoring...")
565
589
 
566
- info(f"Debug mode is {'on' if self.debug else 'off'}.")
590
+ info(f"Debug mode is {'on' if shell_attrs['debug'] else 'off'}.")
567
591
 
568
592
  def do_instance(
569
593
  self,
@@ -619,7 +643,7 @@ class Shell(cmd.Cmd):
619
643
  else:
620
644
  conn_keys = instance_keys
621
645
 
622
- self.instance_keys = conn_keys
646
+ shell_attrs['instance_keys'] = conn_keys
623
647
 
624
648
  self.update_prompt(instance=conn_keys)
625
649
  info(f"Default instance for the current shell: {conn_keys}")
@@ -683,7 +707,7 @@ class Shell(cmd.Cmd):
683
707
  if conn is None or not conn:
684
708
  conn = get_connector('api', debug=debug)
685
709
 
686
- self.repo_keys = str(conn)
710
+ shell_attrs['repo_keys'] = str(conn)
687
711
 
688
712
  info(f"Default repository for the current shell: {conn}")
689
713
  return True, "Success"
@@ -712,9 +736,9 @@ class Shell(cmd.Cmd):
712
736
  args = parse_line(line)
713
737
  if len(args['action']) == 0:
714
738
  del args['action']
715
- self._actions['show'](['actions'], **args)
739
+ shell_attrs['_actions']['show'](['actions'], **args)
716
740
  return ""
717
- if args['action'][0] not in self._actions:
741
+ if args['action'][0] not in shell_attrs['_actions']:
718
742
  try:
719
743
  print(textwrap.dedent(getattr(self, f"do_{args['action'][0]}").__doc__))
720
744
  except Exception as e:
@@ -780,17 +804,21 @@ class Shell(cmd.Cmd):
780
804
  Patch builtin cmdloop with my own input (defined below).
781
805
  """
782
806
  import signal, os
783
- cmd.__builtins__['input'] = input_with_sigint(_old_input, self.session, shell=self)
807
+ cmd.__builtins__['input'] = input_with_sigint(
808
+ _old_input,
809
+ shell_attrs['session'],
810
+ shell = self,
811
+ )
784
812
 
785
813
  ### if the user specifies, clear the screen before initializing the shell
786
814
  if _clear_screen:
787
815
  from meerschaum.utils.formatting._shell import clear_screen
788
- clear_screen(debug=self.debug)
816
+ clear_screen(debug=shell_attrs['debug'])
789
817
 
790
818
  ### if sysargs are provided, skip printing the intro and execute instead
791
- if self._sysargs:
792
- self.intro = ""
793
- self.precmd(' '.join(self._sysargs))
819
+ if shell_attrs['_sysargs']:
820
+ shell_attrs['intro'] = ""
821
+ self.precmd(' '.join(shell_attrs['_sysargs']))
794
822
 
795
823
  def postloop(self):
796
824
  print('\n' + self.close_message)
@@ -816,24 +844,24 @@ def input_with_sigint(_input, session, shell: Optional[Shell] = None):
816
844
  nonlocal last_connected
817
845
  if not get_config('shell', 'bottom_toolbar', 'enabled'):
818
846
  return None
819
- if not shell._update_bottom_toolbar and platform.system() == 'Windows':
820
- return shell._old_bottom_toolbar
847
+ if not shell_attrs['_update_bottom_toolbar'] and platform.system() == 'Windows':
848
+ return shell_attrs['_old_bottom_toolbar']
821
849
  size = os.get_terminal_size()
822
850
  num_cols, num_lines = size.columns, size.lines
823
851
 
824
852
  instance_colored = (
825
853
  colored(
826
- shell.instance_keys, 'on ' + get_config(
854
+ shell_attrs['instance_keys'], 'on ' + get_config(
827
855
  'shell', 'ansi', 'instance', 'rich', 'style'
828
856
  )
829
- ) if ANSI else colored(shell.instance_keys, 'on white')
857
+ ) if ANSI else colored(shell_attrs['instance_keys'], 'on white')
830
858
  )
831
859
  repo_colored = (
832
- colored(shell.repo_keys, 'on ' + get_config('shell', 'ansi', 'repo', 'rich', 'style'))
833
- if ANSI else colored(shell.repo_keys, 'on white')
860
+ colored(shell_attrs['repo_keys'], 'on ' + get_config('shell', 'ansi', 'repo', 'rich', 'style'))
861
+ if ANSI else colored(shell_attrs['repo_keys'], 'on white')
834
862
  )
835
863
  try:
836
- typ, label = shell.instance_keys.split(':')
864
+ typ, label = shell_attrs['instance_keys'].split(':')
837
865
  connected = typ in connectors and label in connectors[typ]
838
866
  except Exception as e:
839
867
  connected = False
@@ -859,9 +887,9 @@ def input_with_sigint(_input, session, shell: Optional[Shell] = None):
859
887
  )
860
888
  buffer = (' ' * buffer_size) if buffer_size > 0 else '\n '
861
889
  text = left + buffer + right
862
- shell._old_bottom_toolbar = prompt_toolkit_formatted_text.ANSI(text)
863
- shell._update_bottom_toolbar = False
864
- return shell._old_bottom_toolbar
890
+ shell_attrs['_old_bottom_toolbar'] = prompt_toolkit_formatted_text.ANSI(text)
891
+ shell_attrs['_update_bottom_toolbar'] = False
892
+ return shell_attrs['_old_bottom_toolbar']
865
893
 
866
894
  def _patched_prompt(*args):
867
895
  _args = []
@@ -24,7 +24,9 @@ class ShellCompleter(Completer):
24
24
  """
25
25
  Bridge the built-in cmd completer with the `prompt_toolkit` completer system.
26
26
  """
27
- shell_actions = [a[3:] for a in dir(get_shell()) if a.startswith('do_')]
27
+ from meerschaum._internal.shell.Shell import shell_attrs
28
+ shell = get_shell()
29
+ shell_actions = [a[3:] for a in dir(shell) if a.startswith('do_')]
28
30
  yielded = []
29
31
  ensure_readline()
30
32
  parts = document.text.split('-')
@@ -32,7 +34,6 @@ class ShellCompleter(Completer):
32
34
  part_0_subbed_spaces = parts[0].replace(' ', '_')
33
35
  parsed_text = part_0_subbed_spaces + '-'.join(parts[1:])
34
36
 
35
- shell = get_shell()
36
37
 
37
38
  ### Index is the rank order (0 is closest match).
38
39
  ### Break when no results are returned.
@@ -50,11 +51,14 @@ class ShellCompleter(Completer):
50
51
  yielded.append(poss)
51
52
 
52
53
  args = parse_line(document.text)
53
- action_function = get_action(args['action'], _actions=shell._actions)
54
+ action_function = get_action(args['action'], _actions=shell_attrs.get('_actions', None))
54
55
  if action_function is None:
55
56
  return
56
57
 
57
- main_action_name = get_main_action_name(args['action'], _actions=shell._actions)
58
+ main_action_name = get_main_action_name(
59
+ args['action'],
60
+ _actions = shell_attrs.get('_actions', None)
61
+ )
58
62
 
59
63
  ### If we haven't yet hit space, don't suggest subactions.
60
64
  if not parsed_text.replace(
@@ -17,8 +17,5 @@ def reload(
17
17
  """
18
18
  Reload the running Meerschaum instance.
19
19
  """
20
- from meerschaum.utils.packages import reload_package
21
- from meerschaum.plugins import reload_plugins
22
- reload_package('meerschaum')
23
- reload_plugins(debug=debug)
24
- return True, "Success"
20
+ from meerschaum.utils.packages import reload_meerschaum
21
+ return reload_meerschaum(debug=debug)
@@ -7,7 +7,8 @@ This module contains functions for printing elements.
7
7
  """
8
8
 
9
9
  from __future__ import annotations
10
- from meerschaum.utils.typing import SuccessTuple, Union, Sequence, Any, Optional, List, Dict
10
+ import meerschaum as mrsm
11
+ from meerschaum.utils.typing import SuccessTuple, Union, Sequence, Any, Optional, List, Dict, Tuple
11
12
 
12
13
  def show(
13
14
  action: Optional[List[str]] = None,
@@ -738,34 +739,69 @@ def _show_environment(
738
739
 
739
740
  def _show_tags(
740
741
  tags: Optional[List[str]] = None,
742
+ workers: Optional[int] = None,
741
743
  nopretty: bool = False,
742
744
  **kwargs
743
745
  ) -> SuccessTuple:
744
746
  """
745
747
  Show the existing tags and their associated pipes.
746
748
  """
749
+ import json
747
750
  from collections import defaultdict
748
751
  import meerschaum as mrsm
749
- from meerschaum.utils.formatting import pipe_repr
750
- rich_tree = mrsm.attempt_import('rich.tree')
751
- tree = rich_tree.Tree('Tags')
752
+ from meerschaum.utils.formatting import pipe_repr, UNICODE, ANSI
753
+ from meerschaum.utils.pool import get_pool
754
+ from meerschaum.config import get_config
755
+ rich_tree, rich_panel, rich_text, rich_console, rich_columns = (
756
+ mrsm.attempt_import('rich.tree', 'rich.panel', 'rich.text', 'rich.console', 'rich.columns')
757
+ )
758
+ panel = rich_panel.Panel.fit('Tags')
759
+ tree = rich_tree.Tree(panel)
752
760
  pipes = mrsm.get_pipes(as_list=True, **kwargs)
761
+ pool = get_pool(workers=workers)
762
+ tag_prefix = get_config('formatting', 'pipes', 'unicode', 'icons', 'tag') if UNICODE else ''
763
+ tag_style = get_config('formatting', 'pipes', 'ansi', 'styles', 'tags') if ANSI else None
753
764
 
754
765
  tags_pipes = defaultdict(lambda: [])
766
+ gather_pipe_tags = lambda pipe: (pipe, (pipe.tags or []))
767
+
768
+ pipes_tags = dict(pool.map(gather_pipe_tags, pipes))
755
769
 
756
- for pipe in pipes:
757
- for tag in pipe.tags:
770
+ for pipe, tags in pipes_tags.items():
771
+ for tag in tags:
758
772
  tags_pipes[tag].append(pipe)
759
773
 
774
+ columns = []
760
775
  sorted_tags = sorted([tag for tag in tags_pipes])
761
776
  for tag in sorted_tags:
762
777
  _pipes = tags_pipes[tag]
763
- tag_branch = tree.add(tag)
764
- for pipe in _pipes:
765
- tag_branch.add(pipe_repr(pipe, as_rich_text=True))
766
-
767
- mrsm.pprint(tree, nopretty=nopretty)
778
+ tag_text = (
779
+ rich_text.Text(tag_prefix)
780
+ + rich_text.Text(
781
+ tag,
782
+ style = tag_style,
783
+ )
784
+ )
785
+ pipes_texts = [
786
+ pipe_repr(pipe, as_rich_text=True)
787
+ for pipe in _pipes
788
+ ]
789
+ tag_group = rich_console.Group(*pipes_texts)
790
+ tag_panel = rich_panel.Panel(tag_group, title=tag_text, title_align='left')
791
+ columns.append(tag_panel)
768
792
 
793
+ if not nopretty:
794
+ mrsm.pprint(
795
+ rich_columns.Columns(
796
+ columns,
797
+ equal = True,
798
+ ),
799
+ )
800
+ else:
801
+ for tag, _pipes in tags_pipes.items():
802
+ print(tag)
803
+ for pipe in _pipes:
804
+ print(json.dumps(pipe.meta))
769
805
 
770
806
  return True, "Success"
771
807
 
@@ -6,9 +6,9 @@
6
6
  Functions for editing the configuration file
7
7
  """
8
8
 
9
- # from meerschaum.utils.debug import dprint
10
9
  from __future__ import annotations
11
10
  import sys
11
+ import pathlib
12
12
  from meerschaum.utils.typing import Optional, Any, SuccessTuple, Mapping, Dict, List, Union
13
13
 
14
14
  def edit_config(
@@ -21,7 +21,7 @@ def edit_config(
21
21
  from meerschaum.config import get_config, config
22
22
  from meerschaum.config._read_config import get_keyfile_path
23
23
  from meerschaum.config._paths import CONFIG_DIR_PATH
24
- from meerschaum.utils.packages import reload_package
24
+ from meerschaum.utils.packages import reload_meerschaum
25
25
  from meerschaum.utils.misc import edit_file
26
26
  from meerschaum.utils.debug import dprint
27
27
 
@@ -35,10 +35,7 @@ def edit_config(
35
35
  get_config(k, write_missing=True, warn=False)
36
36
  edit_file(get_keyfile_path(k, create_new=True))
37
37
 
38
- if debug:
39
- dprint("Reloading configuration...")
40
- reload_package('meerschaum', debug=debug, **kw)
41
-
38
+ reload_meerschaum(debug=debug)
42
39
  return (True, "Success")
43
40
 
44
41
 
@@ -78,7 +75,7 @@ def write_config(
78
75
  from meerschaum.utils.debug import dprint
79
76
  from meerschaum.utils.yaml import yaml
80
77
  from meerschaum.utils.misc import filter_keywords
81
- import json, os, pathlib
78
+ import json, os
82
79
  if config_dict is None:
83
80
  from meerschaum.config import _config
84
81
  cf = _config()
@@ -162,7 +159,6 @@ def general_write_yaml_config(
162
159
  """
163
160
 
164
161
  from meerschaum.utils.debug import dprint
165
- from pathlib import Path
166
162
 
167
163
  if files is None:
168
164
  files = {}
@@ -172,7 +168,7 @@ def general_write_yaml_config(
172
168
  header = None
173
169
  if isinstance(value, tuple):
174
170
  config, header = value
175
- path = Path(fp)
171
+ path = pathlib.Path(fp)
176
172
  path.parent.mkdir(parents=True, exist_ok=True)
177
173
  path.touch(exist_ok=True)
178
174
  with open(path, 'w+') as f:
@@ -193,32 +189,12 @@ def general_write_yaml_config(
193
189
  return True
194
190
 
195
191
  def general_edit_config(
196
- action : Optional[List[str]] = None,
197
- files : Optional[Dict[str, Union[str, pathlib.Path]]] = None,
198
- default : str = None,
199
- debug : bool = False
192
+ action: Optional[List[str]] = None,
193
+ files: Optional[Dict[str, Union[str, pathlib.Path]]] = None,
194
+ default: Optional[str] = None,
195
+ debug: bool = False
200
196
  ):
201
- """Edit any config files
202
-
203
- Parameters
204
- ----------
205
- action : Optional[List[str]] :
206
- (Default value = None)
207
- files : Optional[Dict[str :
208
-
209
- Union[str :
210
-
211
- pathlib.Path]]] :
212
- (Default value = None)
213
- default : str :
214
- (Default value = None)
215
- debug : bool :
216
- (Default value = False)
217
-
218
- Returns
219
- -------
220
-
221
- """
197
+ """Prompt the user to edit any config files."""
222
198
  if default is None:
223
199
  raise Exception("Provide a default choice for which file to edit")
224
200
  import os
@@ -35,6 +35,7 @@ default_formatting_config = {
35
35
  'running' : '🟢',
36
36
  'paused' : '🟡',
37
37
  'stopped' : '🔴',
38
+ 'tag' : '🏷️',
38
39
  },
39
40
  'pipes' : {
40
41
  'unicode' : {
@@ -43,6 +44,7 @@ default_formatting_config = {
43
44
  'metric' : 'MRSM{formatting:emoji:metric} ',
44
45
  'location' : 'MRSM{formatting:emoji:location} ',
45
46
  'key' : 'MRSM{formatting:emoji:key} ',
47
+ 'tag' : 'MRSM{formatting:emoji:tag} ',
46
48
  },
47
49
  },
48
50
  'ascii' : {
@@ -51,6 +53,7 @@ default_formatting_config = {
51
53
  'metric' : '',
52
54
  'location' : '',
53
55
  'key' : '',
56
+ 'tag' : '',
54
57
  },
55
58
  },
56
59
  'ansi' : {
@@ -61,6 +64,7 @@ default_formatting_config = {
61
64
  'key' : '',
62
65
  'guide' : 'dim',
63
66
  'none' : 'black on magenta',
67
+ 'tags' : 'bold yellow underline',
64
68
  },
65
69
  },
66
70
  '__repr__' : {
@@ -2,4 +2,4 @@
2
2
  Specify the Meerschaum release version.
3
3
  """
4
4
 
5
- __version__ = "2.1.3.dev2"
5
+ __version__ = "2.1.3.dev3"
@@ -56,6 +56,8 @@ STATIC_CONFIG: Dict[str, Any] = {
56
56
  'dep_group': 'MRSM_DEP_GROUP',
57
57
  'home': 'MRSM_HOME',
58
58
  'src': 'MRSM_SRC',
59
+ 'uid': 'MRSM_UID',
60
+ 'gid': 'MRSM_GID',
59
61
  'noask': 'MRSM_NOASK',
60
62
  'id': 'MRSM_SERVER_ID',
61
63
  'uri_regex': r'MRSM_([a-zA-Z0-9]*)_(\d*[a-zA-Z][a-zA-Z0-9-_+]*$)',
@@ -283,8 +283,8 @@ class Plugin:
283
283
  import tarfile
284
284
  import re
285
285
  import ast
286
- from meerschaum.plugins import reload_plugins, sync_plugins_symlinks
287
- from meerschaum.utils.packages import attempt_import, determine_version, reload_package
286
+ from meerschaum.plugins import sync_plugins_symlinks
287
+ from meerschaum.utils.packages import attempt_import, determine_version, reload_meerschaum
288
288
  from meerschaum.utils.venv import init_venv
289
289
  from meerschaum.utils.misc import safely_extract_tar
290
290
  old_cwd = os.getcwd()
@@ -415,8 +415,7 @@ class Plugin:
415
415
  if '_module' in self.__dict__:
416
416
  del self.__dict__['_module']
417
417
  init_venv(venv=self.name, force=True, debug=debug)
418
- reload_package('meerschaum')
419
- reload_plugins([self.name], debug=debug)
418
+ reload_meerschaum(debug=debug)
420
419
 
421
420
  ### if we've already failed, return here
422
421
  if not success or abort:
@@ -493,8 +492,8 @@ class Plugin:
493
492
  """
494
493
  Remove a plugin, its virtual environment, and archive file.
495
494
  """
496
- from meerschaum.utils.packages import reload_package
497
- from meerschaum.plugins import reload_plugins, sync_plugins_symlinks
495
+ from meerschaum.utils.packages import reload_meerschaum
496
+ from meerschaum.plugins import sync_plugins_symlinks
498
497
  from meerschaum.utils.warnings import warn, info
499
498
  warnings_thrown_count: int = 0
500
499
  max_warnings: int = 3
@@ -529,8 +528,7 @@ class Plugin:
529
528
  success = warnings_thrown_count < max_warnings
530
529
  sync_plugins_symlinks(debug=debug)
531
530
  self.deactivate_venv(force=True, debug=debug)
532
- reload_package('meerschaum')
533
- reload_plugins(debug=debug)
531
+ reload_meerschaum(debug=debug)
534
532
  return success, (
535
533
  f"Successfully uninstalled plugin '{self}'." if success
536
534
  else f"Failed to uninstall plugin '{self}'."
@@ -9,7 +9,7 @@ Functions for managing packages and virtual environments reside here.
9
9
  from __future__ import annotations
10
10
 
11
11
  import importlib.util, os, pathlib
12
- from meerschaum.utils.typing import Any, List, SuccessTuple, Optional, Union, Tuple, Dict
12
+ from meerschaum.utils.typing import Any, List, SuccessTuple, Optional, Union, Tuple, Dict, Iterable
13
13
  from meerschaum.utils.threading import Lock, RLock
14
14
  from meerschaum.utils.packages._packages import packages, all_packages, get_install_names
15
15
  from meerschaum.utils.venv import (
@@ -1494,16 +1494,18 @@ def import_children(
1494
1494
  return members
1495
1495
 
1496
1496
 
1497
+ _reload_module_cache = {}
1497
1498
  def reload_package(
1498
1499
  package: str,
1500
+ skip_submodules: Optional[List[str]] = None,
1499
1501
  lazy: bool = False,
1500
1502
  debug: bool = False,
1501
1503
  **kw: Any
1502
- ) -> 'ModuleType':
1504
+ ):
1503
1505
  """
1504
1506
  Recursively load a package's subpackages, even if they were not previously loaded.
1505
1507
  """
1506
- import pydoc
1508
+ import sys
1507
1509
  if isinstance(package, str):
1508
1510
  package_name = package
1509
1511
  else:
@@ -1511,7 +1513,44 @@ def reload_package(
1511
1513
  package_name = package.__name__
1512
1514
  except Exception as e:
1513
1515
  package_name = str(package)
1514
- return pydoc.safeimport(package_name, forceload=1)
1516
+
1517
+ skip_submodules = skip_submodules or []
1518
+ if 'meerschaum.utils.packages' not in skip_submodules:
1519
+ skip_submodules.append('meerschaum.utils.packages')
1520
+ def safeimport():
1521
+ subs = [
1522
+ m for m in sys.modules
1523
+ if m.startswith(package_name + '.')
1524
+ ]
1525
+ subs_to_skip = []
1526
+ for skip_mod in skip_submodules:
1527
+ for mod in subs:
1528
+ if mod.startswith(skip_mod):
1529
+ subs_to_skip.append(mod)
1530
+ continue
1531
+
1532
+ subs = [m for m in subs if m not in subs_to_skip]
1533
+ for module_name in subs:
1534
+ _reload_module_cache[module_name] = sys.modules.pop(module_name, None)
1535
+ if not subs_to_skip:
1536
+ _reload_module_cache[package_name] = sys.modules.pop(package_name, None)
1537
+
1538
+ return _import_module(package_name)
1539
+
1540
+ return safeimport()
1541
+
1542
+
1543
+ def reload_meerschaum(debug: bool = False) -> SuccessTuple:
1544
+ """
1545
+ Reload the currently loaded Meercshaum modules, refreshing plugins and shell configuration.
1546
+ """
1547
+ reload_package('meerschaum', skip_submodules=['meerschaum._internal.shell'])
1548
+
1549
+ from meerschaum.plugins import reload_plugins
1550
+ from meerschaum._internal.shell.Shell import _insert_shell_actions
1551
+ reload_plugins(debug=debug)
1552
+ _insert_shell_actions()
1553
+ return True, "Success"
1515
1554
 
1516
1555
 
1517
1556
  def is_installed(
@@ -362,7 +362,24 @@ def init_venv(
362
362
  return True
363
363
 
364
364
  import sys, platform, os, pathlib, shutil
365
+ from meerschaum.config.static import STATIC_CONFIG
365
366
  from meerschaum.config._paths import VIRTENV_RESOURCES_PATH
367
+ venv_path = VIRTENV_RESOURCES_PATH / venv
368
+ docker_home_venv_path = pathlib.Path('/home/meerschaum/venvs/mrsm')
369
+
370
+ runtime_env_var = STATIC_CONFIG['environment']['runtime']
371
+ if (
372
+ not force
373
+ and venv == 'mrsm'
374
+ and os.environ.get(runtime_env_var, None) == 'docker'
375
+ and docker_home_venv_path.exists()
376
+ ):
377
+ shutil.move(docker_home_venv_path, venv_path)
378
+ if verify:
379
+ verify_venv(venv, debug=debug)
380
+ verified_venvs.add(venv)
381
+ return True
382
+
366
383
  from meerschaum.utils.packages import run_python_package, attempt_import
367
384
  global tried_virtualenv
368
385
  try:
@@ -372,7 +389,6 @@ def init_venv(
372
389
  _venv = None
373
390
  virtualenv = None
374
391
 
375
- venv_path = VIRTENV_RESOURCES_PATH / venv
376
392
 
377
393
  _venv_success = False
378
394
  if _venv is not None:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: meerschaum
3
- Version: 2.1.3.dev2
3
+ Version: 2.1.3.dev3
4
4
  Summary: Sync Time-Series Pipes with Meerschaum
5
5
  Home-page: https://meerschaum.io
6
6
  Author: Bennett Meares
@@ -1,7 +1,7 @@
1
1
  meerschaum/__init__.py,sha256=mw_PhxT7155SW8d_S51T4-WTibL5g205CwMa3qX8qyA,1487
2
2
  meerschaum/__main__.py,sha256=6JMfERA83SyJH2_UHPyrl2v4rjoyXqGh6h4x3UNe3xU,2774
3
3
  meerschaum/_internal/__init__.py,sha256=ilC7utfKtin7GAvuN34fKyUQYfPyqH0Mm3MJF5iyEf4,169
4
- meerschaum/_internal/entry.py,sha256=Np5gAs8fxiz9QfPTL79sZjZUJIxVYTRi5BV9dXvJ9Dc,4775
4
+ meerschaum/_internal/entry.py,sha256=_76FVDQGzZ_AU37XfC42ZVIDx4KHx4Xf5-lEQR2nmwg,4820
5
5
  meerschaum/_internal/arguments/__init__.py,sha256=HFciFQgo2ZOT19Mo6CpLhPYlpLYh2sNn1C9Lo7NMADc,519
6
6
  meerschaum/_internal/arguments/_parse_arguments.py,sha256=dNVDBvXYNgEw-TrlZJ9A6VPlG696EpQcQm6FOAhseqw,10249
7
7
  meerschaum/_internal/arguments/_parser.py,sha256=siHYO_li3h206iYik786KFT_ZnaHC052zaZK7FFESjQ,13548
@@ -12,8 +12,8 @@ meerschaum/_internal/gui/app/__init__.py,sha256=rKUa8hHk6Fai-PDF61tQcpT1myxKcfmv
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=UonUxR4rQyBuS1-wDe5-EoyCZmLZuGpFJfWPsLgxg0Q,31489
16
- meerschaum/_internal/shell/ShellCompleter.py,sha256=8grr7vRvUVug8GY8MDZM3uinQGWZcdH3apxZSDzcGZ0,2981
15
+ meerschaum/_internal/shell/Shell.py,sha256=34lDd4FVTyvj17L4WdcSWwN60VXu0NpiVzY45IGTWq4,33102
16
+ meerschaum/_internal/shell/ShellCompleter.py,sha256=bbG-mExNXO4pltWBOXdbMp8P2wLgy8_BgipIr5aGp5s,3114
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/resources/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -35,10 +35,10 @@ meerschaum/actions/os.py,sha256=dtoppoBhLzW3rLNF0SFovEfNxA4WJWt_9WrOGlS5KbA,2251
35
35
  meerschaum/actions/pause.py,sha256=kDK0UMm90TuohFEG5Gugl3PEbuqGua-ghidqvgYShoc,3909
36
36
  meerschaum/actions/python.py,sha256=eXSpAli8ARo9k2NeZi11TwiyA6T5leMSDQXKS6dgRkM,2395
37
37
  meerschaum/actions/register.py,sha256=d99u0Yr395f3g23oWH7VMOqAlWQLZHVaS6woZqrNViU,11214
38
- meerschaum/actions/reload.py,sha256=8DHOEZn98LT3HJTQehkjHMEAq_Lz4xAHweUn3iZdvMQ,605
38
+ meerschaum/actions/reload.py,sha256=gMXeFBGVfyQ7uhKhYf6bLaDMD0fLPcA9BrLBSiuvWIc,508
39
39
  meerschaum/actions/setup.py,sha256=KkAGWcgwzl_L6A19fTmTX1KtBjW2FwD8QenLjPy0mQQ,3205
40
40
  meerschaum/actions/sh.py,sha256=fLfTJaacKu4sjLTRqEzzYlT2WbbdZBEczsKb6F-qAek,2026
41
- meerschaum/actions/show.py,sha256=tD0eULofGfgcjrQlJ-KiqZ6lsKxzNARSpqICWNfMhtA,24527
41
+ meerschaum/actions/show.py,sha256=pmH2G3CA-10YM_MLLaHdpXOMmZo112rE17hB2yEEj2Y,25865
42
42
  meerschaum/actions/sql.py,sha256=wYofwk1vGO96U2ncigGEfMtYMZeprz2FR1PRRZhkAPI,4311
43
43
  meerschaum/actions/stack.py,sha256=WMRMebyYwZGNlbnj6Ja09qvCSDNteFJOTa8_joHlnVo,5886
44
44
  meerschaum/actions/start.py,sha256=mNFWqxc_o9moavvDQWE4YoZF6b-SW2nKyw5MtwIj-90,18384
@@ -123,9 +123,9 @@ meerschaum/api/routes/_webterm.py,sha256=7eilgDXckpEc2LyeNmJS5YO6HxlyMkwPnAMWd7e
123
123
  meerschaum/api/tables/__init__.py,sha256=e2aNC0CdlWICTUMx1i9RauF8Pm426J0RZJbsJWv4SWo,482
124
124
  meerschaum/config/__init__.py,sha256=01hZ4Z8jGs4LbcIwNTeVzSvHD-Y0nAgiewRgngVUYb4,11517
125
125
  meerschaum/config/_default.py,sha256=SJqekCM-90yQQHduF43aNvP6EqvB_fkZqozJSeJ7Wz8,5184
126
- meerschaum/config/_edit.py,sha256=z7gBr5YGYkUbwkUsZwd9xncmxttkdxcS9cVbgLo2zCA,8679
126
+ meerschaum/config/_edit.py,sha256=CE8gumBiOtnZZdTATCLAZgUnhL04yJdReaNCrv1yuJc,8218
127
127
  meerschaum/config/_environment.py,sha256=Vv4DLDfc2vKLbCLsMvkQDj77K4kEvHKEBmUBo-wCrgo,4419
128
- meerschaum/config/_formatting.py,sha256=5HVYrRfhZlhbQt_ks4Mg1ttZX0T6awO2NwbREHYlYMI,6451
128
+ meerschaum/config/_formatting.py,sha256=BxpWY0vGM8strR2v17cdDqFDrpr6NQ-0cH4uDFPOCWE,6638
129
129
  meerschaum/config/_jobs.py,sha256=2VGbg885rgz8jsIF52Z_Q76kdmAXNKDk7p2dnahmsnc,1073
130
130
  meerschaum/config/_patch.py,sha256=21N30q1ANmWMDQ-2RUjpMx7KafWfPQ3lKx9rrMqg1s4,1526
131
131
  meerschaum/config/_paths.py,sha256=ORzpEpYE5OM06H6Hw_nh51R8fkk45MyGPI7mDd1QzqI,7983
@@ -133,14 +133,14 @@ meerschaum/config/_preprocess.py,sha256=-AEA8m_--KivZwTQ1sWN6LTn5sio_fUr2XZ51BO6
133
133
  meerschaum/config/_read_config.py,sha256=WFZKIXZMDe_ca0ES7ivgM_mnwShvFxLdoeisT_X5-h0,14720
134
134
  meerschaum/config/_shell.py,sha256=k6PH0BEr2imhgURLYlR5p6s5gXfYpWoyZSV29U-SsXk,3589
135
135
  meerschaum/config/_sync.py,sha256=Q-sz5YcjL3CJS2Dyw4rVRQsz9th9GWa9o5F9D0Jrmn8,4120
136
- meerschaum/config/_version.py,sha256=EHQL7tGckWgXyQLhAbfj7rG1WaSX0gEAZ7-bYVDUJGM,76
136
+ meerschaum/config/_version.py,sha256=EuhT63apwdqJ99P_Z2S28D5qOFqBNhYmqcl2TE_MXX0,76
137
137
  meerschaum/config/resources/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
138
138
  meerschaum/config/stack/__init__.py,sha256=4a_up1oxkitwgIylWWk0vA4XkGhEpWazUaENOPEdYQI,9034
139
139
  meerschaum/config/stack/grafana/__init__.py,sha256=wzuoch_AK49lcn7lH2qTSJ_PPbSagF4lcweeipz_XiE,2010
140
140
  meerschaum/config/stack/mosquitto/__init__.py,sha256=-OwOjq8KiBoSH_pmgCAAF3Dp3CRD4KgAEdimZSadROs,186
141
141
  meerschaum/config/stack/mosquitto/resources/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
142
142
  meerschaum/config/stack/resources/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
143
- meerschaum/config/static/__init__.py,sha256=UUaQsEYzd8hZaeAYmCu5YNyFTty9AmKddaO6HMuGRMQ,4307
143
+ meerschaum/config/static/__init__.py,sha256=oDxx1wVGowW-AQsbVGmr4R4ZvCF-f1pdAalX5x5OpJE,4361
144
144
  meerschaum/connectors/Connector.py,sha256=cJKinmk7eWZwCBvtX4H9r66macTZOY1qjxR7JUEmDmg,6381
145
145
  meerschaum/connectors/__init__.py,sha256=0uAfGRyLhUI19p161wytmzAurx3znhh4I9O9PyZ4w_E,12023
146
146
  meerschaum/connectors/parse.py,sha256=gidA2jvOLTvEeL5hM9JjcUwkMRBadUhd4IfA5Jy1tgg,4044
@@ -191,7 +191,7 @@ meerschaum/core/Pipe/_verify.py,sha256=KSnthUzImRLjt9fxyBaLvArqDuOLRpKBfk0tnseJC
191
191
  meerschaum/core/Plugin/__init__.py,sha256=UXg64EvJPgI1PCxkY_KM02-ZmBm4FZpLPIQR_uSJJDc,137
192
192
  meerschaum/core/User/_User.py,sha256=waVdpH4SFZSXNYBgX5KFQ8csbCSxRLI5T2efAzVONks,2448
193
193
  meerschaum/core/User/__init__.py,sha256=EiL0rYdtNeu2HqXFLurJcyomjyw3UTFdAR8rgb_vlbU,161
194
- meerschaum/plugins/_Plugin.py,sha256=Vzu5I01sjM9r_pbI13qYZXw2BxByi0ZPbWXy2O0rdgk,33813
194
+ meerschaum/plugins/_Plugin.py,sha256=f0RDPazwzYSTZmD21rxwF48abUeVyFWKggBC9cWR7sw,33706
195
195
  meerschaum/plugins/__init__.py,sha256=pVRgbBk1UMlqLrM5p1s7_x_mN70epdDBZOa4vrt6C6w,20760
196
196
  meerschaum/utils/__init__.py,sha256=Hf-9PtssyubKGBFMjB3R3_N7TVjy24wfm4SLqO4r4_A,552
197
197
  meerschaum/utils/dataframe.py,sha256=OHf2IQOjA77pvpMorHWd3lICMcvkaZsvPE2PZjFakPw,26427
@@ -220,16 +220,16 @@ meerschaum/utils/formatting/_jobs.py,sha256=s1lVcdMkzNj5Bqw-GsUhcguUFtahi5nQ-kg1
220
220
  meerschaum/utils/formatting/_pipes.py,sha256=vixqKIUYNC7yDtU-MoeSXnHug9IGkK1N2yqujxvJ-i0,18414
221
221
  meerschaum/utils/formatting/_pprint.py,sha256=tgrT3FyGyu5CWJYysqK3kX1xdZYorlbOk9fcU_vt9Qg,3096
222
222
  meerschaum/utils/formatting/_shell.py,sha256=ox75O7VHDAiwzSvdMSJZhXLadvAqYJVeihU6WeZ2Ogc,3677
223
- meerschaum/utils/packages/__init__.py,sha256=n3S5pFABtIjYNv2Ts78mcuaN5eE7r1vzPiOqpRQvi4w,55011
223
+ meerschaum/utils/packages/__init__.py,sha256=86mVkFEZP4aCu0EdTA9shBPR0DUPxQvu9c_yIDw4Hh8,56361
224
224
  meerschaum/utils/packages/_packages.py,sha256=KmuQpMNhYb698HlWgG72nFyKQdcAwaDAQCJO3ECwAMc,8024
225
225
  meerschaum/utils/packages/lazy_loader.py,sha256=VHnph3VozH29R4JnSSBfwtA5WKZYZQFT_GeQSShCnuc,2540
226
226
  meerschaum/utils/venv/_Venv.py,sha256=sBnlmxHdAh2bx8btfVoD79-H9-cYsv5lP02IIXkyECs,3553
227
- meerschaum/utils/venv/__init__.py,sha256=IZ-4XW-coDJlABT9Fh-c-vxJwvg13lQrCzkAcnojI1U,22588
228
- meerschaum-2.1.3.dev2.dist-info/LICENSE,sha256=jG2zQEdRNt88EgHUWPpXVWmOrOduUQRx7MnYV9YIPaw,11359
229
- meerschaum-2.1.3.dev2.dist-info/METADATA,sha256=RaXYdppqzQpfm2vNUl1TzZwkyQ_AuWD7HS0hbjTViZ4,24120
230
- meerschaum-2.1.3.dev2.dist-info/NOTICE,sha256=OTA9Fcthjf5BRvWDDIcBC_xfLpeDV-RPZh3M-HQBRtQ,114
231
- meerschaum-2.1.3.dev2.dist-info/WHEEL,sha256=Xo9-1PvkuimrydujYJAjF7pCkriuXBpUPEjma1nZyJ0,92
232
- meerschaum-2.1.3.dev2.dist-info/entry_points.txt,sha256=5YBVzibw-0rNA_1VjB16z5GABsOGf-CDhW4yqH8C7Gc,88
233
- meerschaum-2.1.3.dev2.dist-info/top_level.txt,sha256=bNoSiDj0El6buocix-FRoAtJOeq1qOF5rRm2u9i7Q6A,11
234
- meerschaum-2.1.3.dev2.dist-info/zip-safe,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
235
- meerschaum-2.1.3.dev2.dist-info/RECORD,,
227
+ meerschaum/utils/venv/__init__.py,sha256=Ln-EguP8g-Jc8OrtDj0orRCJ_VPj2izFkYbV4arIbhE,23118
228
+ meerschaum-2.1.3.dev3.dist-info/LICENSE,sha256=jG2zQEdRNt88EgHUWPpXVWmOrOduUQRx7MnYV9YIPaw,11359
229
+ meerschaum-2.1.3.dev3.dist-info/METADATA,sha256=m9L4ibFqN4-zStsrcCpndEWcsxTPkz7i7wCFWYnYHyE,24120
230
+ meerschaum-2.1.3.dev3.dist-info/NOTICE,sha256=OTA9Fcthjf5BRvWDDIcBC_xfLpeDV-RPZh3M-HQBRtQ,114
231
+ meerschaum-2.1.3.dev3.dist-info/WHEEL,sha256=Xo9-1PvkuimrydujYJAjF7pCkriuXBpUPEjma1nZyJ0,92
232
+ meerschaum-2.1.3.dev3.dist-info/entry_points.txt,sha256=5YBVzibw-0rNA_1VjB16z5GABsOGf-CDhW4yqH8C7Gc,88
233
+ meerschaum-2.1.3.dev3.dist-info/top_level.txt,sha256=bNoSiDj0El6buocix-FRoAtJOeq1qOF5rRm2u9i7Q6A,11
234
+ meerschaum-2.1.3.dev3.dist-info/zip-safe,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
235
+ meerschaum-2.1.3.dev3.dist-info/RECORD,,