meerschaum 2.2.1__py3-none-any.whl → 2.2.2rc2__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.
@@ -203,6 +203,29 @@ def _check_complete_keys(line: str) -> Optional[List[str]]:
203
203
  return None
204
204
 
205
205
 
206
+ def get_shell_intro(with_color: bool = True) -> str:
207
+ """
208
+ Return the introduction message string.
209
+ """
210
+ from meerschaum.utils.formatting import CHARSET, ANSI, colored
211
+ intro = get_config('shell', CHARSET, 'intro', patch=patch)
212
+ intro += '\n' + ''.join(
213
+ [' '
214
+ for i in range(
215
+ string_width(intro) - len('v' + version)
216
+ )
217
+ ]
218
+ ) + 'v' + version
219
+
220
+ if not with_color or not ANSI:
221
+ return intro
222
+
223
+ return colored(
224
+ intro,
225
+ **get_config('shell', 'ansi', 'intro', 'rich')
226
+ )
227
+
228
+
206
229
  class Shell(cmd.Cmd):
207
230
  def __init__(
208
231
  self,
@@ -277,25 +300,20 @@ class Shell(cmd.Cmd):
277
300
  except Exception as e:
278
301
  pass
279
302
 
280
-
281
303
  def load_config(self, instance: Optional[str] = None):
282
304
  """
283
305
  Set attributes from the shell configuration.
284
306
  """
285
307
  from meerschaum.utils.misc import remove_ansi
286
- from meerschaum.utils.formatting import CHARSET, ANSI, UNICODE, colored
308
+ from meerschaum.utils.formatting import CHARSET, ANSI, colored
287
309
 
288
310
  if shell_attrs.get('intro', None) != '':
289
- self.intro = get_config('shell', CHARSET, 'intro', patch=patch)
290
- self.intro += '\n' + ''.join(
291
- [' '
292
- for i in range(
293
- string_width(self.intro) - len('v' + version)
294
- )
295
- ]
296
- ) + 'v' + version
297
- else:
298
- self.intro = ""
311
+ self.intro = (
312
+ get_shell_intro(with_color=False)
313
+ if shell_attrs.get('intro', None) != ''
314
+ else ""
315
+ )
316
+
299
317
  shell_attrs['intro'] = self.intro
300
318
  shell_attrs['_prompt'] = get_config('shell', CHARSET, 'prompt', patch=patch)
301
319
  self.prompt = shell_attrs['_prompt']
@@ -822,7 +840,7 @@ def input_with_sigint(_input, session, shell: Optional[Shell] = None):
822
840
  """
823
841
  Replace built-in `input()` with prompt_toolkit.prompt.
824
842
  """
825
- from meerschaum.utils.formatting import CHARSET, ANSI, UNICODE, colored
843
+ from meerschaum.utils.formatting import CHARSET, ANSI, colored
826
844
  from meerschaum.connectors import is_connected, connectors
827
845
  from meerschaum.utils.misc import remove_ansi
828
846
  from meerschaum.config import get_config
@@ -16,7 +16,7 @@ from meerschaum._internal.term.TermPageHandler import TermPageHandler
16
16
  from meerschaum.config._paths import API_TEMPLATES_PATH, API_STATIC_PATH
17
17
 
18
18
  tornado, tornado_ioloop, terminado = attempt_import(
19
- 'tornado', 'tornado.ioloop', 'terminado', lazy=False, venv=None,
19
+ 'tornado', 'tornado.ioloop', 'terminado', lazy=False,
20
20
  )
21
21
 
22
22
  def get_webterm_app_and_manager() -> Tuple[
@@ -17,7 +17,7 @@ def is_webterm_running(host: str, port: int, protocol: str = 'http') -> int:
17
17
  requests = attempt_import('requests')
18
18
  url = f'{protocol}://{host}:{port}'
19
19
  try:
20
- r = requests.get(url)
20
+ r = requests.get(url, timeout=3)
21
21
  except Exception as e:
22
22
  return False
23
23
  if not r:
meerschaum/actions/api.py CHANGED
@@ -169,7 +169,7 @@ def _api_start(
169
169
  ### `check_update` must be False, because otherwise Uvicorn's hidden imports will break things.
170
170
  dotenv = attempt_import('dotenv', lazy=False)
171
171
  uvicorn, gunicorn = attempt_import(
172
- 'uvicorn', 'gunicorn', venv=None, lazy=False, check_update=False,
172
+ 'uvicorn', 'gunicorn', lazy=False, check_update=False,
173
173
  )
174
174
 
175
175
  uvicorn_config_path = API_UVICORN_RESOURCES_PATH / SERVER_ID / 'config.json'
@@ -306,15 +306,50 @@ def _api_start(
306
306
 
307
307
  def _run_uvicorn():
308
308
  try:
309
- uvicorn.run(
310
- **filter_keywords(
311
- uvicorn.run,
312
- **{
313
- k: v
314
- for k, v in uvicorn_config.items()
315
- if k not in custom_keys
316
- }
317
- )
309
+ uvicorn_flags = [
310
+ '--host', host,
311
+ '--port', str(port),
312
+ (
313
+ '--proxy-headers'
314
+ if uvicorn_config.get('proxy_headers')
315
+ else '--no-proxy-headers'
316
+ ),
317
+ (
318
+ '--use-colors'
319
+ if uvicorn_config.get('use_colors')
320
+ else '--no-use-colors'
321
+ ),
322
+ '--env-file', uvicorn_config['env_file'],
323
+ ]
324
+ if uvicorn_reload := uvicorn_config.get('reload'):
325
+ uvicorn_flags.append('--reload')
326
+ if (
327
+ uvicorn_reload
328
+ and (reload_dirs := uvicorn_config.get('reload_dirs'))
329
+ ):
330
+ if not isinstance(reload_dirs, list):
331
+ reload_dirs = [reload_dirs]
332
+ for reload_dir in reload_dirs:
333
+ uvicorn_flags += ['--reload-dir', reload_dir]
334
+ if (
335
+ uvicorn_reload
336
+ and (reload_excludes := uvicorn_config.get('reload_excludes'))
337
+ ):
338
+ if not isinstance(reload_excludes, list):
339
+ reload_excludes = [reload_excludes]
340
+ for reload_exclude in reload_excludes:
341
+ uvicorn_flags += ['--reload-exclude', reload_exclude]
342
+ if (uvicorn_workers := uvicorn_config.get('workers')) is not None:
343
+ uvicorn_flags += ['--workers', str(uvicorn_workers)]
344
+
345
+ uvicorn_args = uvicorn_flags + ['meerschaum.api:app']
346
+ proc = run_python_package(
347
+ 'uvicorn',
348
+ uvicorn_args,
349
+ venv = 'mrsm',
350
+ as_proc = True,
351
+ foreground = True,
352
+ debug = debug,
318
353
  )
319
354
  except KeyboardInterrupt:
320
355
  pass
@@ -350,7 +385,7 @@ def _api_start(
350
385
  )
351
386
  for k, v in env_dict.items()
352
387
  },
353
- venv = None,
388
+ venv = 'mrsm',
354
389
  debug = debug,
355
390
  )
356
391
  except KeyboardInterrupt:
@@ -10,36 +10,37 @@ from meerschaum.utils.typing import SuccessTuple, Any, List, Optional
10
10
 
11
11
  def python(
12
12
  action: Optional[List[str]] = None,
13
+ venv: Optional[str] = 'mrsm',
14
+ sub_args: Optional[List[str]] = None,
13
15
  debug: bool = False,
14
16
  **kw: Any
15
17
  ) -> SuccessTuple:
16
18
  """
17
- Launch a Python interpreter with Meerschaum imported. Commands are optional.
18
- Note that quotes must be escaped and commands must be separated by semicolons
19
+ Launch a virtual environment's Python interpreter with Meerschaum imported.
20
+ You may pass flags to the Python binary by surrounding each flag with `[]`.
19
21
 
20
22
  Usage:
21
23
  `python {commands}`
22
24
 
23
- Example:
24
- `python print(\\'Hello, World!\\'); pipes = mrsm.get_pipes()`
25
-
26
- ```
27
- Hello, World!
28
-
29
- >>> import meerschaum as mrsm
30
- >>> print('Hello, World!')
31
- >>> pipes = mrsm.get_pipes()
32
- ```
25
+ Examples:
26
+ mrsm python
27
+ mrsm python --venv noaa
28
+ mrsm python [-i] [-c 'print("hi")']
33
29
  """
34
- import sys, subprocess
30
+ import sys, subprocess, os
35
31
  from meerschaum.utils.debug import dprint
36
32
  from meerschaum.utils.warnings import warn, error
37
33
  from meerschaum.utils.process import run_process
34
+ from meerschaum.utils.venv import venv_executable
38
35
  from meerschaum.config import __version__ as _version
36
+ from meerschaum.config.paths import VIRTENV_RESOURCES_PATH
39
37
 
40
38
  if action is None:
41
39
  action = []
42
40
 
41
+ if venv == 'None':
42
+ venv = None
43
+
43
44
  joined_actions = ['import meerschaum as mrsm']
44
45
  line = ""
45
46
  for i, a in enumerate(action):
@@ -51,7 +52,6 @@ def python(
51
52
  line = ""
52
53
 
53
54
  ### ensure meerschaum is imported
54
- # joined_actions = ['import meerschaum as mrsm;'] + joined_actions
55
55
  if debug:
56
56
  dprint(joined_actions)
57
57
 
@@ -75,8 +75,24 @@ def python(
75
75
 
76
76
  if debug:
77
77
  dprint(f"command:\n{command}")
78
+
79
+ env_dict = os.environ.copy()
80
+ venv_path = (VIRTENV_RESOURCES_PATH / venv) if venv is not None else None
81
+ if venv_path is not None:
82
+ env_dict.update({'VIRTUAL_ENV': venv_path.as_posix()})
83
+
84
+ args_to_run = (
85
+ [venv_executable(venv), '-i', '-c', command]
86
+ if not sub_args
87
+ else [venv_executable(venv)] + sub_args
88
+ )
89
+
78
90
  try:
79
- return_code = run_process([sys.executable, '-i', '-c', command], foreground=True)
91
+ return_code = run_process(
92
+ args_to_run,
93
+ foreground = True,
94
+ env = env_dict,
95
+ )
80
96
  except KeyboardInterrupt:
81
97
  return_code = 1
82
98
  return return_code == 0, (
@@ -333,8 +333,7 @@ def _start_gui(
333
333
  from meerschaum.connectors.parse import parse_instance_keys
334
334
  from meerschaum._internal.term.tools import is_webterm_running
335
335
  import platform
336
- webview = attempt_import('webview')
337
- requests = attempt_import('requests')
336
+ webview, requests = attempt_import('webview', 'requests')
338
337
  import json
339
338
  import time
340
339
 
@@ -365,7 +364,7 @@ def _start_gui(
365
364
  base_url = 'http://' + api_kw['host'] + ':' + str(api_kw['port'])
366
365
 
367
366
  process = venv_exec(
368
- start_tornado_code, as_proc=True, venv=None, debug=debug, capture_output=(not debug)
367
+ start_tornado_code, as_proc=True, debug=debug, capture_output=(not debug)
369
368
  )
370
369
  timeout = 10
371
370
  start = time.perf_counter()
@@ -446,7 +445,6 @@ def _start_webterm(
446
445
  + " Include `-f` to start another server on a new port\n"
447
446
  + " or specify a different port with `-p`."
448
447
  )
449
-
450
448
  if not nopretty:
451
449
  info(f"Starting the webterm at http://{host}:{port} ...\n Press CTRL+C to quit.")
452
450
  tornado_app.listen(port, host)
@@ -140,7 +140,7 @@ def _upgrade_packages(
140
140
  if venv is NoVenv:
141
141
  venv = 'mrsm'
142
142
  if len(action) == 0:
143
- group = 'full'
143
+ group = 'api'
144
144
  else:
145
145
  group = action[0]
146
146
 
@@ -31,6 +31,7 @@ CHECK_UPDATE = os.environ.get(STATIC_CONFIG['environment']['runtime'], None) !=
31
31
 
32
32
  endpoints = STATIC_CONFIG['api']['endpoints']
33
33
 
34
+ uv = attempt_import('uv', lazy=False, check_update=CHECK_UPDATE)
34
35
  (
35
36
  fastapi,
36
37
  aiofiles,
@@ -12,7 +12,7 @@ from meerschaum.utils.packages import attempt_import, import_dcc, import_html
12
12
  from meerschaum.utils.typing import SuccessTuple, List
13
13
  from meerschaum.config.static import STATIC_CONFIG
14
14
  from meerschaum.utils.misc import remove_ansi
15
- from meerschaum.actions import get_shell
15
+ from meerschaum._internal.shell.Shell import get_shell_intro
16
16
  from meerschaum.api import endpoints, CHECK_UPDATE
17
17
  from meerschaum.connectors import instance_types
18
18
  from meerschaum.utils.misc import get_connector_labels
@@ -69,7 +69,10 @@ bottom_buttons_content = dbc.Card(
69
69
  ])
70
70
  )
71
71
  )
72
- console_div = html.Div(id='console-div', children=[html.Pre(get_shell().intro, id='console-pre')])
72
+ console_div = html.Div(
73
+ id = 'console-div',
74
+ children = [html.Pre(get_shell_intro(), id='console-pre')],
75
+ )
73
76
 
74
77
  location = dcc.Location(id='location', refresh=False)
75
78
 
@@ -110,6 +110,7 @@ default_system_config = {
110
110
  'space': False,
111
111
  'join_fetch': False,
112
112
  'inplace_sync': True,
113
+ 'uv_pip': True,
113
114
  },
114
115
  }
115
116
  default_pipes_config = {
@@ -82,24 +82,24 @@ for _plugin_path in _plugins_paths_to_remove:
82
82
 
83
83
  ENVIRONMENT_VENVS_DIR = STATIC_CONFIG['environment']['venvs']
84
84
  if ENVIRONMENT_VENVS_DIR in os.environ:
85
- VENVS_DIR_PATH = Path(os.environ[ENVIRONMENT_VENVS_DIR]).resolve()
86
- if not VENVS_DIR_PATH.exists():
85
+ _VENVS_DIR_PATH = Path(os.environ[ENVIRONMENT_VENVS_DIR]).resolve()
86
+ if not _VENVS_DIR_PATH.exists():
87
87
  try:
88
- VENVS_DIR_PATH.mkdir(parents=True, exist_ok=True)
88
+ _VENVS_DIR_PATH.mkdir(parents=True, exist_ok=True)
89
89
  except Exception as e:
90
90
  print(
91
91
  f"Invalid path set for environment variable '{ENVIRONMENT_VENVS_DIR}':\n"
92
- + f"{VENVS_DIR_PATH}"
92
+ + f"{_VENVS_DIR_PATH}"
93
93
  )
94
- VENVS_DIR_PATH = (_ROOT_DIR_PATH / 'venvs').resolve()
95
- print(f"Will use the following path for venvs instead:\n{VENVS_DIR_PATH}")
94
+ _VENVS_DIR_PATH = (_ROOT_DIR_PATH / 'venvs').resolve()
95
+ print(f"Will use the following path for venvs instead:\n{_VENVS_DIR_PATH}")
96
96
  else:
97
- VENVS_DIR_PATH = _ROOT_DIR_PATH / 'venvs'
97
+ _VENVS_DIR_PATH = _ROOT_DIR_PATH / 'venvs'
98
98
 
99
99
  paths = {
100
- 'PACKAGE_ROOT_PATH' : str(Path(__file__).parent.parent.resolve()),
101
- 'ROOT_DIR_PATH' : str(_ROOT_DIR_PATH),
102
- 'VIRTENV_RESOURCES_PATH' : str(VENVS_DIR_PATH),
100
+ 'PACKAGE_ROOT_PATH' : Path(__file__).parent.parent.resolve().as_posix(),
101
+ 'ROOT_DIR_PATH' : _ROOT_DIR_PATH.as_posix(),
102
+ 'VIRTENV_RESOURCES_PATH' : _VENVS_DIR_PATH.as_posix(),
103
103
  'CONFIG_DIR_PATH' : ('{ROOT_DIR_PATH}', 'config'),
104
104
  'DEFAULT_CONFIG_DIR_PATH' : ('{ROOT_DIR_PATH}', 'default_config'),
105
105
  'PATCH_DIR_PATH' : ('{ROOT_DIR_PATH}', 'patch_config'),
@@ -186,7 +186,6 @@ def __getattr__(name: str) -> Path:
186
186
  if name.endswith('RESOURCES_PATH') or name == 'CONFIG_DIR_PATH':
187
187
  path.mkdir(parents=True, exist_ok=True)
188
188
  elif 'FILENAME' in name:
189
- path = str(path)
189
+ path = path.as_posix()
190
190
 
191
191
  return path
192
-
@@ -2,4 +2,4 @@
2
2
  Specify the Meerschaum release version.
3
3
  """
4
4
 
5
- __version__ = "2.2.1"
5
+ __version__ = "2.2.2rc2"
@@ -0,0 +1,10 @@
1
+ #! /usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ # vim:fenc=utf-8
4
+
5
+ """
6
+ External API for importing Meerschaum paths.
7
+ """
8
+
9
+ from meerschaum.config._paths import __getattr__, paths
10
+ __all__ = tuple(paths.keys())
@@ -110,7 +110,7 @@ STATIC_CONFIG: Dict[str, Any] = {
110
110
  'pbkdf2_sha256',
111
111
  ],
112
112
  'default': 'pbkdf2_sha256',
113
- 'pbkdf2_sha256__default_rounds': 3_000_000,
113
+ 'pbkdf2_sha256__default_rounds': 1_000_000,
114
114
  },
115
115
  'min_username_length': 1,
116
116
  'max_username_length': 26,
@@ -215,9 +215,8 @@ def sync(
215
215
 
216
216
  ### Activate and invoke `sync(pipe)` for plugin connectors with `sync` methods.
217
217
  try:
218
- if p.connector.type == 'plugin' and p.connector.sync is not None:
219
- connector_plugin = Plugin(p.connector.label)
220
- with Venv(connector_plugin, debug=debug):
218
+ if getattr(p.connector, 'sync', None) is not None:
219
+ with Venv(get_connector_plugin(p.connector), debug=debug):
221
220
  return_tuple = p.connector.sync(p, debug=debug, **kw)
222
221
  p._exists = None
223
222
  if not isinstance(return_tuple, tuple):
@@ -46,6 +46,8 @@ def get_module_path(
46
46
  """
47
47
  Get a module's path without importing.
48
48
  """
49
+ import site
50
+ import pathlib
49
51
  if debug:
50
52
  from meerschaum.utils.debug import dprint
51
53
  if not _try_install_name_on_fail:
@@ -54,33 +56,52 @@ def get_module_path(
54
56
  import_name_lower = install_name_lower
55
57
  else:
56
58
  import_name_lower = import_name.lower().replace('-', '_')
59
+
57
60
  vtp = venv_target_path(venv, allow_nonexistent=True, debug=debug)
58
61
  if not vtp.exists():
59
62
  if debug:
60
63
  dprint(f"Venv '{venv}' does not exist, cannot import '{import_name}'.", color=False)
61
64
  return None
65
+
66
+ venv_target_candidate_paths = [vtp]
67
+ if venv is None:
68
+ site_user_packages_dirs = [pathlib.Path(site.getusersitepackages())]
69
+ site_packages_dirs = [pathlib.Path(path) for path in site.getsitepackages()]
70
+
71
+ paths_to_add = [
72
+ path
73
+ for path in site_user_packages_dirs + site_packages_dirs
74
+ if path not in venv_target_candidate_paths
75
+ ]
76
+ venv_target_candidate_paths += paths_to_add
77
+
62
78
  candidates = []
63
- for file_name in os.listdir(vtp):
64
- file_name_lower = file_name.lower().replace('-', '_')
65
- if not file_name_lower.startswith(import_name_lower):
66
- continue
67
- if file_name.endswith('dist_info'):
79
+ for venv_target_candidate in venv_target_candidate_paths:
80
+ try:
81
+ file_names = os.listdir(venv_target_candidate)
82
+ except FileNotFoundError:
68
83
  continue
69
- file_path = vtp / file_name
84
+ for file_name in file_names:
85
+ file_name_lower = file_name.lower().replace('-', '_')
86
+ if not file_name_lower.startswith(import_name_lower):
87
+ continue
88
+ if file_name.endswith('dist_info'):
89
+ continue
90
+ file_path = venv_target_candidate / file_name
70
91
 
71
- ### Most likely: Is a directory with __init__.py
72
- if file_name_lower == import_name_lower and file_path.is_dir():
73
- init_path = file_path / '__init__.py'
74
- if init_path.exists():
75
- candidates.append(init_path)
92
+ ### Most likely: Is a directory with __init__.py
93
+ if file_name_lower == import_name_lower and file_path.is_dir():
94
+ init_path = file_path / '__init__.py'
95
+ if init_path.exists():
96
+ candidates.append(init_path)
76
97
 
77
- ### May be a standalone .py file.
78
- elif file_name_lower == import_name_lower + '.py':
79
- candidates.append(file_path)
98
+ ### May be a standalone .py file.
99
+ elif file_name_lower == import_name_lower + '.py':
100
+ candidates.append(file_path)
80
101
 
81
- ### Compiled wheels (e.g. pyodbc)
82
- elif file_name_lower.startswith(import_name_lower + '.'):
83
- candidates.append(file_path)
102
+ ### Compiled wheels (e.g. pyodbc)
103
+ elif file_name_lower.startswith(import_name_lower + '.'):
104
+ candidates.append(file_path)
84
105
 
85
106
  if len(candidates) == 1:
86
107
  return candidates[0]
@@ -466,12 +487,13 @@ def _get_package_metadata(import_name: str, venv: Optional[str]) -> Dict[str, st
466
487
  import re
467
488
  from meerschaum.config._paths import VIRTENV_RESOURCES_PATH
468
489
  install_name = _import_to_install_name(import_name)
469
- _args = ['show', install_name]
490
+ _args = ['pip', 'show', install_name]
470
491
  if venv is not None:
471
492
  cache_dir_path = VIRTENV_RESOURCES_PATH / venv / 'cache'
472
- _args += ['--cache-dir', str(cache_dir_path)]
493
+ _args += ['--cache-dir', cache_dir_path.as_posix()]
494
+
473
495
  proc = run_python_package(
474
- 'pip', _args,
496
+ 'uv', _args,
475
497
  capture_output=True, as_proc=True, venv=venv, universal_newlines=True,
476
498
  )
477
499
  outs, errs = proc.communicate()
@@ -721,6 +743,7 @@ def pip_install(
721
743
  check_pypi: bool = True,
722
744
  check_wheel: bool = True,
723
745
  _uninstall: bool = False,
746
+ _install_uv_pip: bool = True,
724
747
  color: bool = True,
725
748
  silent: bool = False,
726
749
  debug: bool = False,
@@ -776,6 +799,7 @@ def pip_install(
776
799
 
777
800
  """
778
801
  from meerschaum.config._paths import VIRTENV_RESOURCES_PATH
802
+ from meerschaum.config import get_config
779
803
  from meerschaum.utils.warnings import warn
780
804
  if args is None:
781
805
  args = ['--upgrade'] if not _uninstall else []
@@ -787,9 +811,38 @@ def pip_install(
787
811
  have_wheel = venv_contains_package('wheel', venv=venv, debug=debug)
788
812
 
789
813
  _args = list(args)
790
- have_pip = venv_contains_package('pip', venv=venv, debug=debug)
814
+ have_pip = venv_contains_package('pip', venv=None, debug=debug)
815
+ try:
816
+ import pip
817
+ have_pip = True
818
+ except ImportError:
819
+ have_pip = False
820
+ try:
821
+ import uv
822
+ uv_bin = uv.find_uv_bin()
823
+ have_uv_pip = True
824
+ except (ImportError, FileNotFoundError):
825
+ uv_bin = None
826
+ have_uv_pip = False
827
+ if have_pip and not have_uv_pip and _install_uv_pip:
828
+ if not pip_install(
829
+ 'uv',
830
+ venv = None,
831
+ debug = debug,
832
+ _install_uv_pip = False,
833
+ check_update = False,
834
+ check_pypi = False,
835
+ check_wheel = False,
836
+ ):
837
+ warn(
838
+ f"Failed to install `uv` for virtual environment '{venv}'.",
839
+ color = False,
840
+ )
841
+
842
+ use_uv_pip = venv_contains_package('uv', venv=None, debug=debug) and uv_bin is not None
843
+
791
844
  import sys
792
- if not have_pip:
845
+ if not have_pip and not use_uv_pip:
793
846
  if not get_pip(venv=venv, debug=debug):
794
847
  import sys
795
848
  minor = sys.version_info.minor
@@ -806,13 +859,18 @@ def pip_install(
806
859
 
807
860
  with Venv(venv, debug=debug):
808
861
  if venv is not None:
809
- if '--ignore-installed' not in args and '-I' not in _args and not _uninstall:
862
+ if (
863
+ '--ignore-installed' not in args
864
+ and '-I' not in _args
865
+ and not _uninstall
866
+ and not use_uv_pip
867
+ ):
810
868
  _args += ['--ignore-installed']
811
869
  if '--cache-dir' not in args and not _uninstall:
812
870
  cache_dir_path = VIRTENV_RESOURCES_PATH / venv / 'cache'
813
871
  _args += ['--cache-dir', str(cache_dir_path)]
814
872
 
815
- if 'pip' not in ' '.join(_args):
873
+ if 'pip' not in ' '.join(_args) and not use_uv_pip:
816
874
  if check_update and not _uninstall:
817
875
  pip = attempt_import('pip', venv=venv, install=False, debug=debug, lazy=False)
818
876
  if need_update(pip, check_pypi=check_pypi, debug=debug):
@@ -820,13 +878,16 @@ def pip_install(
820
878
 
821
879
  _args = (['install'] if not _uninstall else ['uninstall']) + _args
822
880
 
823
- if check_wheel and not _uninstall:
881
+ if check_wheel and not _uninstall and not use_uv_pip:
824
882
  if not have_wheel:
825
883
  if not pip_install(
826
- 'setuptools', 'wheel',
884
+ 'setuptools', 'wheel', 'uv',
827
885
  venv = venv,
828
- check_update = False, check_pypi = False,
829
- check_wheel = False, debug = debug,
886
+ check_update = False,
887
+ check_pypi = False,
888
+ check_wheel = False,
889
+ debug = debug,
890
+ _install_uv_pip = False,
830
891
  ):
831
892
  warn(
832
893
  (
@@ -838,21 +899,21 @@ def pip_install(
838
899
 
839
900
  if requirements_file_path is not None:
840
901
  _args.append('-r')
841
- _args.append(str(pathlib.Path(requirements_file_path).resolve()))
902
+ _args.append(pathlib.Path(requirements_file_path).resolve().as_posix())
842
903
 
843
904
  if not ANSI and '--no-color' not in _args:
844
905
  _args.append('--no-color')
845
906
 
846
- if '--no-input' not in _args:
907
+ if '--no-input' not in _args and not use_uv_pip:
847
908
  _args.append('--no-input')
848
909
 
849
- if _uninstall and '-y' not in _args:
910
+ if _uninstall and '-y' not in _args and not use_uv_pip:
850
911
  _args.append('-y')
851
912
 
852
- if '--no-warn-conflicts' not in _args and not _uninstall:
913
+ if '--no-warn-conflicts' not in _args and not _uninstall and not use_uv_pip:
853
914
  _args.append('--no-warn-conflicts')
854
915
 
855
- if '--disable-pip-version-check' not in _args:
916
+ if '--disable-pip-version-check' not in _args and not use_uv_pip:
856
917
  _args.append('--disable-pip-version-check')
857
918
 
858
919
  if '--target' not in _args and '-t' not in _args and not _uninstall:
@@ -863,12 +924,16 @@ def pip_install(
863
924
  and '-t' not in _args
864
925
  and not inside_venv()
865
926
  and not _uninstall
927
+ and not use_uv_pip
866
928
  ):
867
929
  _args += ['--user']
930
+ if '--break-system-packages' not in _args and not _uninstall:
931
+ _args.append('--break-system-packages')
868
932
 
869
933
  if debug:
870
934
  if '-v' not in _args or '-vv' not in _args or '-vvv' not in _args:
871
- pass
935
+ if use_uv_pip:
936
+ _args.append('--verbose')
872
937
  else:
873
938
  if '-q' not in _args or '-qq' not in _args or '-qqq' not in _args:
874
939
  pass
@@ -883,7 +948,7 @@ def pip_install(
883
948
  if not silent:
884
949
  print(msg)
885
950
 
886
- if not _uninstall:
951
+ if _uninstall:
887
952
  for install_name in _packages:
888
953
  _install_no_version = get_install_no_version(install_name)
889
954
  if _install_no_version in ('pip', 'wheel'):
@@ -896,10 +961,15 @@ def pip_install(
896
961
  f"Failed to clean up package '{_install_no_version}'.",
897
962
  )
898
963
 
964
+ if use_uv_pip:
965
+ _args.insert(0, 'pip')
966
+ if not _uninstall:
967
+ _args.append('--prerelease=allow')
968
+
899
969
  rc = run_python_package(
900
- 'pip',
970
+ ('pip' if not use_uv_pip else 'uv'),
901
971
  _args + _packages,
902
- venv = venv,
972
+ venv = None,
903
973
  env = _get_pip_os_env(),
904
974
  debug = debug,
905
975
  )
@@ -1031,6 +1101,10 @@ def run_python_package(
1031
1101
  if cwd is not None:
1032
1102
  os.chdir(cwd)
1033
1103
  executable = venv_executable(venv=venv)
1104
+ venv_path = (VIRTENV_RESOURCES_PATH / venv) if venv is not None else None
1105
+ env_dict = kw.get('env', os.environ).copy()
1106
+ if venv_path is not None:
1107
+ env_dict.update({'VIRTUAL_ENV': venv_path.as_posix()})
1034
1108
  command = [executable, '-m', str(package_name)] + [str(a) for a in args]
1035
1109
  import traceback
1036
1110
  if debug:
@@ -1055,7 +1129,7 @@ def run_python_package(
1055
1129
  command,
1056
1130
  stdout = stdout,
1057
1131
  stderr = stderr,
1058
- env = kw.get('env', os.environ),
1132
+ env = env_dict,
1059
1133
  )
1060
1134
  to_return = proc if as_proc else proc.wait()
1061
1135
  except KeyboardInterrupt:
@@ -1623,6 +1697,8 @@ def venv_contains_package(
1623
1697
  """
1624
1698
  Search the contents of a virtual environment for a package.
1625
1699
  """
1700
+ import site
1701
+ import pathlib
1626
1702
  root_name = import_name.split('.')[0] if split else import_name
1627
1703
  return get_module_path(root_name, venv=venv, debug=debug) is not None
1628
1704
 
@@ -53,6 +53,7 @@ packages: Dict[str, Dict[str, str]] = {
53
53
  'dill' : 'dill>=0.3.3',
54
54
  'virtualenv' : 'virtualenv>=20.1.0',
55
55
  'apscheduler' : 'APScheduler>=4.0.0a5',
56
+ 'uv' : 'uv>=0.2.11',
56
57
  },
57
58
  'drivers': {
58
59
  'cryptography' : 'cryptography>=38.0.1',
@@ -147,7 +147,6 @@ def run_process(
147
147
  store_proc_dict[store_proc_key] = child
148
148
  _ret = poll_process(child, line_callback) if line_callback is not None else child.wait()
149
149
  ret = _ret if not as_proc else child
150
-
151
150
  finally:
152
151
  if foreground:
153
152
  # we have to mask SIGTTOU because tcsetpgrp
@@ -8,7 +8,7 @@ Schedule processes and threads.
8
8
 
9
9
  from __future__ import annotations
10
10
  import sys
11
- from datetime import datetime, timezone, timedelta, timedelta
11
+ from datetime import datetime, timezone, timedelta
12
12
  import meerschaum as mrsm
13
13
  from meerschaum.utils.typing import Callable, Any, Optional, List, Dict
14
14
 
@@ -79,7 +79,7 @@ def activate_venv(
79
79
  else:
80
80
  threads_active_venvs[thread_id][venv] += 1
81
81
 
82
- target = str(venv_target_path(venv, debug=debug))
82
+ target = venv_target_path(venv, debug=debug).as_posix()
83
83
  if venv in active_venvs_order:
84
84
  sys.path.remove(target)
85
85
  try:
@@ -171,7 +171,7 @@ def deactivate_venv(
171
171
  if sys.path is None:
172
172
  return False
173
173
 
174
- target = str(venv_target_path(venv, allow_nonexistent=force, debug=debug))
174
+ target = venv_target_path(venv, allow_nonexistent=force, debug=debug).as_posix()
175
175
  with LOCKS['sys.path']:
176
176
  if target in sys.path:
177
177
  sys.path.remove(target)
@@ -361,6 +361,8 @@ def init_venv(
361
361
  verified_venvs.add(venv)
362
362
  return True
363
363
 
364
+ import io
365
+ from contextlib import redirect_stdout, redirect_stderr
364
366
  import sys, platform, os, pathlib, shutil
365
367
  from meerschaum.config.static import STATIC_CONFIG
366
368
  from meerschaum.config._paths import VIRTENV_RESOURCES_PATH
@@ -381,25 +383,34 @@ def init_venv(
381
383
  verified_venvs.add(venv)
382
384
  return True
383
385
 
384
- from meerschaum.utils.packages import run_python_package, attempt_import
386
+ from meerschaum.utils.packages import run_python_package, attempt_import, _get_pip_os_env
385
387
  global tried_virtualenv
386
388
  try:
387
389
  import venv as _venv
390
+ uv = attempt_import('uv', venv=None, debug=debug)
388
391
  virtualenv = None
389
392
  except ImportError:
390
393
  _venv = None
394
+ uv = None
391
395
  virtualenv = None
392
-
393
396
 
394
397
  _venv_success = False
395
- if _venv is not None:
396
- import io
397
- from contextlib import redirect_stdout
398
+
399
+ if uv is not None:
400
+ _venv_success = run_python_package(
401
+ 'uv',
402
+ ['venv', venv_path.as_posix(), '-q'],
403
+ venv = None,
404
+ env = _get_pip_os_env(),
405
+ debug = debug,
406
+ ) == 0
407
+
408
+ if _venv is not None and not _venv_success:
398
409
  f = io.StringIO()
399
410
  with redirect_stdout(f):
400
411
  _venv_success = run_python_package(
401
412
  'venv',
402
- [str(venv_path)] + (
413
+ [venv_path.as_posix()] + (
403
414
  ['--symlinks'] if platform.system() != 'Windows' else []
404
415
  ),
405
416
  venv=None, debug=debug
@@ -438,7 +449,7 @@ def init_venv(
438
449
  except Exception as e:
439
450
  import traceback
440
451
  traceback.print_exc()
441
- virtualenv.cli_run([str(venv_path)])
452
+ virtualenv.cli_run([venv_path.as_posix()])
442
453
  if dist_packages_path.exists():
443
454
  vtp.mkdir(exist_ok=True, parents=True)
444
455
  for file_path in dist_packages_path.glob('*'):
@@ -614,7 +625,7 @@ def venv_target_path(
614
625
  return site_path
615
626
 
616
627
  ### Allow for dist-level paths (running as root).
617
- for possible_dist in reversed(site.getsitepackages()):
628
+ for possible_dist in site.getsitepackages():
618
629
  dist_path = pathlib.Path(possible_dist)
619
630
  if not dist_path.exists():
620
631
  continue
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: meerschaum
3
- Version: 2.2.1
3
+ Version: 2.2.2rc2
4
4
  Summary: Sync Time-Series Pipes with Meerschaum
5
5
  Home-page: https://meerschaum.io
6
6
  Author: Bennett Meares
@@ -79,6 +79,7 @@ Requires-Dist: watchfiles >=0.21.0 ; extra == 'api'
79
79
  Requires-Dist: dill >=0.3.3 ; extra == 'api'
80
80
  Requires-Dist: virtualenv >=20.1.0 ; extra == 'api'
81
81
  Requires-Dist: APScheduler >=4.0.0a5 ; extra == 'api'
82
+ Requires-Dist: uv >=0.2.11 ; extra == 'api'
82
83
  Requires-Dist: pprintpp >=0.4.0 ; extra == 'api'
83
84
  Requires-Dist: asciitree >=0.3.3 ; extra == 'api'
84
85
  Requires-Dist: typing-extensions >=4.7.1 ; extra == 'api'
@@ -127,6 +128,7 @@ Requires-Dist: watchfiles >=0.21.0 ; extra == 'core'
127
128
  Requires-Dist: dill >=0.3.3 ; extra == 'core'
128
129
  Requires-Dist: virtualenv >=20.1.0 ; extra == 'core'
129
130
  Requires-Dist: APScheduler >=4.0.0a5 ; extra == 'core'
131
+ Requires-Dist: uv >=0.2.11 ; extra == 'core'
130
132
  Provides-Extra: dash
131
133
  Requires-Dist: Flask-Compress >=1.10.1 ; extra == 'dash'
132
134
  Requires-Dist: dash >=2.6.2 ; extra == 'dash'
@@ -212,6 +214,7 @@ Requires-Dist: watchfiles >=0.21.0 ; extra == 'full'
212
214
  Requires-Dist: dill >=0.3.3 ; extra == 'full'
213
215
  Requires-Dist: virtualenv >=20.1.0 ; extra == 'full'
214
216
  Requires-Dist: APScheduler >=4.0.0a5 ; extra == 'full'
217
+ Requires-Dist: uv >=0.2.11 ; extra == 'full'
215
218
  Requires-Dist: cryptography >=38.0.1 ; extra == 'full'
216
219
  Requires-Dist: psycopg[binary] >=3.1.18 ; extra == 'full'
217
220
  Requires-Dist: PyMySQL >=0.9.0 ; extra == 'full'
@@ -295,6 +298,7 @@ Requires-Dist: watchfiles >=0.21.0 ; extra == 'sql'
295
298
  Requires-Dist: dill >=0.3.3 ; extra == 'sql'
296
299
  Requires-Dist: virtualenv >=20.1.0 ; extra == 'sql'
297
300
  Requires-Dist: APScheduler >=4.0.0a5 ; extra == 'sql'
301
+ Requires-Dist: uv >=0.2.11 ; extra == 'sql'
298
302
  Provides-Extra: stack
299
303
  Requires-Dist: docker-compose >=1.29.2 ; extra == 'stack'
300
304
 
@@ -12,16 +12,16 @@ 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=zcgajt0FGH5ou0kqmOrYAvNfunOsn_CN6LHFYFXBBlI,32826
15
+ meerschaum/_internal/shell/Shell.py,sha256=NqRowEvTUd-7uuamD_X6mt2Nw3yfuDW7z_g5sfay0Og,33194
16
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
20
20
  meerschaum/_internal/term/TermPageHandler.py,sha256=Rt5S47Pr_3HLJc8xIXpZUczYE_Dw2qT8qwf1jZFtUHQ,520
21
- meerschaum/_internal/term/__init__.py,sha256=xIwEWXyq1qaU7Rx-AryTtANJPdm__fy3XSMzxaFn0wU,1594
22
- meerschaum/_internal/term/tools.py,sha256=bpYexJBDCQXfzz6ESMvmpSHM1AIy4qWsrAHl95tSW2I,716
21
+ meerschaum/_internal/term/__init__.py,sha256=QZQerwLmqE6SS1MHH8HbZkoUunLhhcmZDmPf52y2dhM,1583
22
+ meerschaum/_internal/term/tools.py,sha256=dXVAimKD-Yv2fg2WOTr0YGBY7XDKjQqw-RizcS65YVI,727
23
23
  meerschaum/actions/__init__.py,sha256=7CNoKEqkqqafqMcChspJX9cR9OdgEWk9ggj0000Jl98,11360
24
- meerschaum/actions/api.py,sha256=mWhv4bn3Ap17_Gqf2Cx9bAsHKG-Zhy072pBbNzHLEJc,12756
24
+ meerschaum/actions/api.py,sha256=pBVTGq9iI7rRspPPkilJthIxi6JDt6LsVXu2NXNHN_Y,14262
25
25
  meerschaum/actions/bootstrap.py,sha256=JnIyJ4odw6cA4e0Cw7J8THkLavMcj68nRyGsQDAT8nc,13396
26
26
  meerschaum/actions/clear.py,sha256=OoFZE0bK5m8s3GLNZcixuVT0DMj1izXVxGCATcmUGbI,4851
27
27
  meerschaum/actions/copy.py,sha256=8g3ANXfVdvuyaoXcZjgTg3BxHTOhHGrzVDOOsTBrpSU,6213
@@ -33,7 +33,7 @@ meerschaum/actions/install.py,sha256=akzzgsvy5yqUFuUqzSMG4eBKARY2iSnL3n_BiaNcM58
33
33
  meerschaum/actions/login.py,sha256=fNgsgkrFCn9wBQJY50SQhz2PwsN_TvEYYHnXK3JG4ig,4206
34
34
  meerschaum/actions/os.py,sha256=dtoppoBhLzW3rLNF0SFovEfNxA4WJWt_9WrOGlS5KbA,2251
35
35
  meerschaum/actions/pause.py,sha256=kDK0UMm90TuohFEG5Gugl3PEbuqGua-ghidqvgYShoc,3909
36
- meerschaum/actions/python.py,sha256=eXSpAli8ARo9k2NeZi11TwiyA6T5leMSDQXKS6dgRkM,2395
36
+ meerschaum/actions/python.py,sha256=pdrgBCGdoYGFwVoyo71Q59hLS1vwzPHAW71U3JdroYo,2831
37
37
  meerschaum/actions/register.py,sha256=l_21LWZCzKwJVex_xAXECC5WVW1VEuIX9HSp7CuyCwA,11326
38
38
  meerschaum/actions/reload.py,sha256=gMXeFBGVfyQ7uhKhYf6bLaDMD0fLPcA9BrLBSiuvWIc,508
39
39
  meerschaum/actions/setup.py,sha256=KkAGWcgwzl_L6A19fTmTX1KtBjW2FwD8QenLjPy0mQQ,3205
@@ -41,21 +41,21 @@ meerschaum/actions/sh.py,sha256=fLfTJaacKu4sjLTRqEzzYlT2WbbdZBEczsKb6F-qAek,2026
41
41
  meerschaum/actions/show.py,sha256=p92UahbFeKOThGooO8Ul5Z6s6_Ll54FCxXsMAFnhuT0,29024
42
42
  meerschaum/actions/sql.py,sha256=wYofwk1vGO96U2ncigGEfMtYMZeprz2FR1PRRZhkAPI,4311
43
43
  meerschaum/actions/stack.py,sha256=WMRMebyYwZGNlbnj6Ja09qvCSDNteFJOTa8_joHlnVo,5886
44
- meerschaum/actions/start.py,sha256=mNFWqxc_o9moavvDQWE4YoZF6b-SW2nKyw5MtwIj-90,18384
44
+ meerschaum/actions/start.py,sha256=9Ej3Hk7qXfbrBaQq17KirTII_4Pa-BWSdrkutMnLA3k,18352
45
45
  meerschaum/actions/stop.py,sha256=KTBadAmJ6SbReqlltkwfqZW6EryB4kZXupl0ZyInI0Q,4311
46
46
  meerschaum/actions/sync.py,sha256=10uPREu3HBVgtzakVxhCegQOz_mistABJlsNNCMgywY,17518
47
47
  meerschaum/actions/tag.py,sha256=SJf5qFW0ccLXjqlTdkK_0MCcrCMdg6xhYrhKdco0hdA,3053
48
48
  meerschaum/actions/uninstall.py,sha256=2fUd5ZK45VGGCI8V4NLmSnavdKjOv7cGM22x2WlTStw,6068
49
- meerschaum/actions/upgrade.py,sha256=VQKyjCGioEF2FYbQmldHh21imDqApNl0xal0rhxzrJk,6302
49
+ meerschaum/actions/upgrade.py,sha256=w0f7QmJcOMU6RuwvLNCQBJgFV0iQe9jDrH1nZZEmvRk,6301
50
50
  meerschaum/actions/verify.py,sha256=tY5slGpHiWiE0v9TDnjbmxSKn86zBnu9WBpixUgKNQU,4885
51
- meerschaum/api/__init__.py,sha256=LEAAhOBNT6VHRTiLKWfVxBHBbqeucilHXLelrPkxjZI,7385
51
+ meerschaum/api/__init__.py,sha256=oOYwNnkXM2s-h52EYnN2NGPfrlaQh6D4-zmHa7uPLG0,7450
52
52
  meerschaum/api/_chain.py,sha256=h8-WXUGXX6AqzdALfsBC5uv0FkAcLdHJXCGzqzuq89k,875
53
53
  meerschaum/api/_events.py,sha256=NrjiabEr7rmHMfxnX07DOGzr9sPiEbRkFqPjuA_8Zx8,1603
54
54
  meerschaum/api/_oauth2.py,sha256=He8JnFDhfCq25Wlz1Jh3TcGz83VOttrJk6RgzJKbFLw,1056
55
55
  meerschaum/api/_websockets.py,sha256=OmrSDGx3xGlfP5XXeLEyYW6-Y3iRUcB-xSqL3RWsjqQ,1609
56
56
  meerschaum/api/dash/__init__.py,sha256=yr4zR7uFPlLFc_lDpwa2rCM1h9ZWGiu5-2XhHcM-5f8,2252
57
57
  meerschaum/api/dash/actions.py,sha256=eUClPPdNVNSCtyq8Ecr1saasxj5VBgd1gcXejvQxXEc,9418
58
- meerschaum/api/dash/components.py,sha256=hdcxQahw9lHDBlZlztj-IKX4GueZRTVKfjGC6fFcj_8,6364
58
+ meerschaum/api/dash/components.py,sha256=oGX7HFzNCi37iMww747iL3bbB52ZTt9tFa2iLohffg4,6399
59
59
  meerschaum/api/dash/connectors.py,sha256=nJxBOFldtCMJLYjUSVYZwX5BO-LNjTNHgoEaXe-0XMo,843
60
60
  meerschaum/api/dash/graphs.py,sha256=wJUDWzcLN8-C3xko6rj0F2v7Rt8YDkSXoVkkXJjYGIk,2046
61
61
  meerschaum/api/dash/jobs.py,sha256=htqnrtAGCOgn2-THezMGYM8n1E-M-sM5A5qNmOGfHzg,7529
@@ -124,25 +124,26 @@ meerschaum/api/routes/_webterm.py,sha256=7eilgDXckpEc2LyeNmJS5YO6HxlyMkwPnAMWd7e
124
124
  meerschaum/api/tables/__init__.py,sha256=e2aNC0CdlWICTUMx1i9RauF8Pm426J0RZJbsJWv4SWo,482
125
125
  meerschaum/config/__init__.py,sha256=01hZ4Z8jGs4LbcIwNTeVzSvHD-Y0nAgiewRgngVUYb4,11517
126
126
  meerschaum/config/_dash.py,sha256=BJHl4xMrQB-YHUEU7ldEW8q_nOPoIRSOqLrfGElc6Dw,187
127
- meerschaum/config/_default.py,sha256=DSbyVcAL55Xf8MJCTxpgF7ZXL-O9peeMEqL29WFfsJ4,5251
127
+ meerschaum/config/_default.py,sha256=J6AWxxXM4mntCdkM6bKIpyQznZ5NuMICmTaurF11J9Q,5275
128
128
  meerschaum/config/_edit.py,sha256=CE8gumBiOtnZZdTATCLAZgUnhL04yJdReaNCrv1yuJc,8218
129
129
  meerschaum/config/_environment.py,sha256=Vv4DLDfc2vKLbCLsMvkQDj77K4kEvHKEBmUBo-wCrgo,4419
130
130
  meerschaum/config/_formatting.py,sha256=RT_oU0OSfUkzeqbY5jvEJwuove_t9sP4MyUb1Px250U,6635
131
131
  meerschaum/config/_jobs.py,sha256=2bEikO48qVSguFS3lrbWz6uiKt_0b3oSRWhwyz8RRDM,1279
132
132
  meerschaum/config/_patch.py,sha256=21N30q1ANmWMDQ-2RUjpMx7KafWfPQ3lKx9rrMqg1s4,1526
133
- meerschaum/config/_paths.py,sha256=TihDGA6IQou3ms1xKYHmRTU48kOflqV5ZOMguG25NM4,8154
133
+ meerschaum/config/_paths.py,sha256=xS7zim8Dr7LIJQBTzDH8IOhTZ4AHMvc5a1np8SGX4Rg,8185
134
134
  meerschaum/config/_preprocess.py,sha256=-AEA8m_--KivZwTQ1sWN6LTn5sio_fUr2XZ51BO6wLs,1220
135
135
  meerschaum/config/_read_config.py,sha256=WFZKIXZMDe_ca0ES7ivgM_mnwShvFxLdoeisT_X5-h0,14720
136
136
  meerschaum/config/_shell.py,sha256=s74cmJl8NrhM_Y1cB_P41_JDUYXV0g4WXnKFZWMtnrY,3551
137
137
  meerschaum/config/_sync.py,sha256=oK2ZujO2T1he08BXCFyiniBUevNGWSQKXLcS_jRv_7Y,4155
138
- meerschaum/config/_version.py,sha256=OydT3amCDUZG1dyzap3MREBRuMd53MMaduOv0qZtPL8,71
138
+ meerschaum/config/_version.py,sha256=EInJbGE14rCfVET_lXzEeEKw-tGc7n8tgXJiPluDNic,74
139
+ meerschaum/config/paths.py,sha256=Z7vaOunaEJbVFXiSSz4IthhNOQDI-dhtpi5TpSyrcXg,206
139
140
  meerschaum/config/resources/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
140
141
  meerschaum/config/stack/__init__.py,sha256=c_WdTSejVdj8lqSE_pK5MhIBkHoftiZWDuEuB9dmk2I,9007
141
142
  meerschaum/config/stack/grafana/__init__.py,sha256=LNXQw2FvHKrD68RDhqDmi2wJjAHaKw9IWx8rNuyWEPo,2010
142
143
  meerschaum/config/stack/mosquitto/__init__.py,sha256=-OwOjq8KiBoSH_pmgCAAF3Dp3CRD4KgAEdimZSadROs,186
143
144
  meerschaum/config/stack/mosquitto/resources/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
144
145
  meerschaum/config/stack/resources/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
145
- meerschaum/config/static/__init__.py,sha256=zsSq54OkLqjfG_QGyH6zXzZnoaGpDyjmV0OCvbygFr8,4474
146
+ meerschaum/config/static/__init__.py,sha256=d3bkER5FJwsvrL8TM5V8Vmy0Bi7Fq7H8U-4jjfpV4Og,4474
146
147
  meerschaum/connectors/Connector.py,sha256=cJKinmk7eWZwCBvtX4H9r66macTZOY1qjxR7JUEmDmg,6381
147
148
  meerschaum/connectors/__init__.py,sha256=zXumYuKTWOyu3U6J1zvMQS30HImYLE8ssBdJs-I134M,12106
148
149
  meerschaum/connectors/parse.py,sha256=gidA2jvOLTvEeL5hM9JjcUwkMRBadUhd4IfA5Jy1tgg,4044
@@ -188,7 +189,7 @@ meerschaum/core/Pipe/_edit.py,sha256=ZH2A0ZOpZKsVDnQxKzmXspNQKTEFUhkkZDjwOkmWtaY
188
189
  meerschaum/core/Pipe/_fetch.py,sha256=zV3DzD7kfx08O6zda0I-9cX91m0Z_wO_on1ozHaqWnk,5234
189
190
  meerschaum/core/Pipe/_register.py,sha256=Sd5xaAW8H7uLTIoommcKb-6kHPRuHJLWNSbPnt2UbvA,2240
190
191
  meerschaum/core/Pipe/_show.py,sha256=nG50y8eBT9TVuKkRgAKtNDNIxysJvMNxfu__lkL1F9k,1352
191
- meerschaum/core/Pipe/_sync.py,sha256=48qk1xvkcKOqfzzYf3QdA7ojsP80yrso1YU8QIGJxwE,28038
192
+ meerschaum/core/Pipe/_sync.py,sha256=g_cQ4e4fd6_8qzjOjSH4hhO5vy2y0ZF8InOP9Lolzj8,27975
192
193
  meerschaum/core/Pipe/_verify.py,sha256=KSnthUzImRLjt9fxyBaLvArqDuOLRpKBfk0tnseJClc,14262
193
194
  meerschaum/core/Plugin/__init__.py,sha256=UXg64EvJPgI1PCxkY_KM02-ZmBm4FZpLPIQR_uSJJDc,137
194
195
  meerschaum/core/User/_User.py,sha256=CApB7Y0QJL6S9QOCCfrG4SbPuPXJ9AsAYQ5pASMP_Aw,6527
@@ -203,9 +204,9 @@ meerschaum/utils/interactive.py,sha256=t-6jWozXSqL7lYGDHuwiOjTgr-UKhdcg61q_eR5mi
203
204
  meerschaum/utils/misc.py,sha256=H26hLtCP8QHwXoHlvkxjWu6cPTwudDbbsbRkGw6ultg,43296
204
205
  meerschaum/utils/networking.py,sha256=Sr_eYUGW8_UV9-k9LqRFf7xLtbUcsDucODyLCRsFRUc,1006
205
206
  meerschaum/utils/pool.py,sha256=vkE42af4fjrTEJTxf6Ek3xGucm1MtEkpsSEiaVzNKHs,2655
206
- meerschaum/utils/process.py,sha256=IHnUhX79XofHwMsOs1A_irLMa7i48xXB-GCL83MtZOY,7192
207
+ meerschaum/utils/process.py,sha256=BFT9ntuTSlIXTLFGGSnrjgUlJqCLzbOHfIf6iCcuf9A,7191
207
208
  meerschaum/utils/prompt.py,sha256=0mBFbgi_l9rCou9UnC_6qKTHkqyl1Z_jSRzfmc0xRXM,16490
208
- meerschaum/utils/schedule.py,sha256=2UpXg5E9mfjg83w3N6C2_Q7tlE2exVJehro2Bvp6PzQ,10871
209
+ meerschaum/utils/schedule.py,sha256=btAeSDaoFH62-7wTO0U7NK9P9QHV46PtY3DJ8DN_mCY,10860
209
210
  meerschaum/utils/sql.py,sha256=4sCNEpgUd6uFz6ySs4nnUMVaOT0YAvPM1ZlQYJTSF-0,46656
210
211
  meerschaum/utils/threading.py,sha256=3N8JXPAnwqJiSjuQcbbJg3Rv9-CCUMJpeQRfKFR7MaA,2489
211
212
  meerschaum/utils/typing.py,sha256=L05wOXfWdn_nJ0KnZVr-2zdMYcqjdyOW_7InT3xe6-s,2807
@@ -223,16 +224,16 @@ meerschaum/utils/formatting/_jobs.py,sha256=s1lVcdMkzNj5Bqw-GsUhcguUFtahi5nQ-kg1
223
224
  meerschaum/utils/formatting/_pipes.py,sha256=wy0iWJFsFl3X2VloaiA_gp9Yx9w6tD3FQZvAQAqef4A,19492
224
225
  meerschaum/utils/formatting/_pprint.py,sha256=tgrT3FyGyu5CWJYysqK3kX1xdZYorlbOk9fcU_vt9Qg,3096
225
226
  meerschaum/utils/formatting/_shell.py,sha256=ox75O7VHDAiwzSvdMSJZhXLadvAqYJVeihU6WeZ2Ogc,3677
226
- meerschaum/utils/packages/__init__.py,sha256=HEJYz_rceqljpyRFlnToLR6vc_b7r-2d2K8zh_th2lg,57185
227
- meerschaum/utils/packages/_packages.py,sha256=P1Y0mc0TlX5iCL08U-4WkMG9LpEt_REWo30GJUn38cM,7865
227
+ meerschaum/utils/packages/__init__.py,sha256=TTNgCWgIpdyG21Pk86dDne7eTG02_0nERxopLBD1tHo,59811
228
+ meerschaum/utils/packages/_packages.py,sha256=kWoo1KWvpQgR3rY_rpHzvGIh14BBFH92Erw5UtW7yX0,7918
228
229
  meerschaum/utils/packages/lazy_loader.py,sha256=VHnph3VozH29R4JnSSBfwtA5WKZYZQFT_GeQSShCnuc,2540
229
230
  meerschaum/utils/venv/_Venv.py,sha256=sBnlmxHdAh2bx8btfVoD79-H9-cYsv5lP02IIXkyECs,3553
230
- meerschaum/utils/venv/__init__.py,sha256=sj-n8scWH2NPDJGAxfpqzsYqVUt2jMEr-7Uq9G7YUNQ,23183
231
- meerschaum-2.2.1.dist-info/LICENSE,sha256=jG2zQEdRNt88EgHUWPpXVWmOrOduUQRx7MnYV9YIPaw,11359
232
- meerschaum-2.2.1.dist-info/METADATA,sha256=XUYdU9OV2qtydf3XiXIvkA0gE-Nikh43zj_KRqA4ruo,23807
233
- meerschaum-2.2.1.dist-info/NOTICE,sha256=OTA9Fcthjf5BRvWDDIcBC_xfLpeDV-RPZh3M-HQBRtQ,114
234
- meerschaum-2.2.1.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
235
- meerschaum-2.2.1.dist-info/entry_points.txt,sha256=5YBVzibw-0rNA_1VjB16z5GABsOGf-CDhW4yqH8C7Gc,88
236
- meerschaum-2.2.1.dist-info/top_level.txt,sha256=bNoSiDj0El6buocix-FRoAtJOeq1qOF5rRm2u9i7Q6A,11
237
- meerschaum-2.2.1.dist-info/zip-safe,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
238
- meerschaum-2.2.1.dist-info/RECORD,,
231
+ meerschaum/utils/venv/__init__.py,sha256=iVBBncvP_1FHaxpRo4BGDdTc6AXvP3sO_NXUuwdJWOU,23557
232
+ meerschaum-2.2.2rc2.dist-info/LICENSE,sha256=jG2zQEdRNt88EgHUWPpXVWmOrOduUQRx7MnYV9YIPaw,11359
233
+ meerschaum-2.2.2rc2.dist-info/METADATA,sha256=Fuc1OkYDzgjosH8VDHUmwZdpJsYK8aMApbiLipzUAx0,23988
234
+ meerschaum-2.2.2rc2.dist-info/NOTICE,sha256=OTA9Fcthjf5BRvWDDIcBC_xfLpeDV-RPZh3M-HQBRtQ,114
235
+ meerschaum-2.2.2rc2.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
236
+ meerschaum-2.2.2rc2.dist-info/entry_points.txt,sha256=5YBVzibw-0rNA_1VjB16z5GABsOGf-CDhW4yqH8C7Gc,88
237
+ meerschaum-2.2.2rc2.dist-info/top_level.txt,sha256=bNoSiDj0El6buocix-FRoAtJOeq1qOF5rRm2u9i7Q6A,11
238
+ meerschaum-2.2.2rc2.dist-info/zip-safe,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
239
+ meerschaum-2.2.2rc2.dist-info/RECORD,,