meerschaum 2.4.1__py3-none-any.whl → 2.4.2__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -336,7 +336,7 @@ def _bootstrap_connectors(
336
336
  return abort_tuple
337
337
  new_attributes['flavor'] = flavor
338
338
  required = sorted(list(connector_attributes[_type]['flavors'][flavor]['requirements']))
339
- required = sorted(list(connector_attributes[_type]['flavors'][flavor]['optional']))
339
+ optional = sorted(list(connector_attributes[_type]['flavors'][flavor].get('optional', {})))
340
340
  default = type_attributes['flavors'][flavor].get('defaults', {})
341
341
  else:
342
342
  required = sorted(list(type_attributes.get('required', {})))
@@ -79,15 +79,15 @@ def set_config(cf: Dict[str, Any]) -> Dict[str, Any]:
79
79
 
80
80
 
81
81
  def get_config(
82
- *keys: str,
83
- patch: bool = True,
84
- substitute: bool = True,
85
- sync_files: bool = True,
86
- write_missing: bool = True,
87
- as_tuple: bool = False,
88
- warn: bool = True,
89
- debug: bool = False
90
- ) -> Any:
82
+ *keys: str,
83
+ patch: bool = True,
84
+ substitute: bool = True,
85
+ sync_files: bool = True,
86
+ write_missing: bool = True,
87
+ as_tuple: bool = False,
88
+ warn: bool = True,
89
+ debug: bool = False
90
+ ) -> Any:
91
91
  """
92
92
  Return the Meerschaum configuration dictionary.
93
93
  If positional arguments are provided, index by the keys.
@@ -10,12 +10,12 @@ from meerschaum.utils.typing import Optional, Dict, Any, List, Tuple, Union
10
10
  from meerschaum.config import get_config
11
11
 
12
12
  def read_config(
13
- directory: Optional[str] = None,
14
- keys: Optional[List[str]] = None,
15
- write_missing : bool = True,
16
- substitute : bool = True,
17
- with_filenames : bool = False,
18
- ) -> Union[Dict[str, Any], Tuple[Dict[str, Any], List[str]]]:
13
+ directory: Optional[str] = None,
14
+ keys: Optional[List[str]] = None,
15
+ write_missing : bool = True,
16
+ substitute : bool = True,
17
+ with_filenames : bool = False,
18
+ ) -> Union[Dict[str, Any], Tuple[Dict[str, Any], List[str]]]:
19
19
  """
20
20
  Read the configuration directory.
21
21
 
@@ -313,10 +313,10 @@ def search_and_substitute_config(
313
313
  try:
314
314
  valid, value = get_config(
315
315
  *keys,
316
- substitute = False,
317
- as_tuple = True,
318
- write_missing = False,
319
- sync_files = False,
316
+ substitute=False,
317
+ as_tuple=True,
318
+ write_missing=False,
319
+ sync_files=False,
320
320
  )
321
321
  except Exception as e:
322
322
  import traceback
@@ -7,17 +7,20 @@ Synchronize across config files
7
7
  """
8
8
 
9
9
  from __future__ import annotations
10
+ import pathlib
10
11
  from meerschaum.utils.typing import Optional, List, Tuple
11
12
 
13
+
12
14
  def sync_yaml_configs(
13
- keys: List[str],
14
- sub_path: pathlib.Path,
15
- substitute: bool = True,
16
- permissions: Optional[int] = None,
17
- replace_tuples: Optional[List[Tuple[str, str]]] = None,
18
- ) -> None:
19
- """Synchronize sub-configuration with main configuration file.
20
-
15
+ keys: List[str],
16
+ sub_path: pathlib.Path,
17
+ substitute: bool = True,
18
+ permissions: Optional[int] = None,
19
+ replace_tuples: Optional[List[Tuple[str, str]]] = None,
20
+ ) -> None:
21
+ """
22
+ Synchronize sub-configuration with main configuration file.
23
+
21
24
  Parameters
22
25
  ----------
23
26
  keys: List[str]
@@ -84,12 +87,14 @@ def sync_yaml_configs(
84
87
  new_path = sub_path
85
88
 
86
89
  ### write changes
90
+ new_path.parent.mkdir(exist_ok=True, parents=True)
87
91
  with open(new_path, 'w+', encoding='utf-8') as f:
88
92
  f.write(new_header)
89
93
  f.write(new_config_text)
90
94
  if permissions is not None:
91
95
  os.chmod(new_path, permissions)
92
96
 
97
+
93
98
  def sync_files(keys: Optional[List[str]] = None):
94
99
  if keys is None:
95
100
  keys = []
@@ -110,21 +115,23 @@ def sync_files(keys: Optional[List[str]] = None):
110
115
  sync_yaml_configs(
111
116
  ['stack', STACK_COMPOSE_FILENAME],
112
117
  STACK_COMPOSE_PATH,
113
- substitute = True,
114
- replace_tuples = [('$', '$$'), ('<DOLLAR>', '$')],
118
+ substitute=True,
119
+ replace_tuples=[
120
+ ('$', '$$'),
121
+ ('<DOLLAR>', '$'),
122
+ ],
115
123
  )
116
124
  sync_yaml_configs(
117
125
  ['stack', 'grafana', 'datasource'],
118
126
  GRAFANA_DATASOURCE_PATH,
119
- substitute = True,
127
+ substitute=True,
120
128
  )
121
129
  sync_yaml_configs(
122
130
  ['stack', 'grafana', 'dashboard'],
123
131
  GRAFANA_DASHBOARD_PATH,
124
- substitute = True,
132
+ substitute=True,
125
133
  )
126
134
 
127
-
128
135
  key_functions = {
129
136
  'stack': _stack,
130
137
  }
@@ -2,4 +2,4 @@
2
2
  Specify the Meerschaum release version.
3
3
  """
4
4
 
5
- __version__ = "2.4.1"
5
+ __version__ = "2.4.2"
@@ -55,7 +55,7 @@ env_dict['MEERSCHAUM_API_CONFIG'] = json.dumps(
55
55
  'meerschaum': 'MRSM{!meerschaum}',
56
56
  'system': 'MRSM{!system}',
57
57
  },
58
- indent = 4,
58
+ indent=4,
59
59
  ).replace(
60
60
  '"MRSM{!system}"', 'MRSM{!system}'
61
61
  ).replace(
@@ -168,7 +168,8 @@ class APIConnector(Connector):
168
168
  @property
169
169
  def session(self):
170
170
  if self._session is None:
171
- requests = attempt_import('requests')
171
+ certifi = attempt_import('certifi', lazy=False)
172
+ requests = attempt_import('requests', lazy=False)
172
173
  if requests:
173
174
  self._session = requests.Session()
174
175
  if self._session is None:
@@ -27,39 +27,39 @@ default_create_engine_args = {
27
27
  'connect_args': {},
28
28
  }
29
29
  flavor_configs = {
30
- 'timescaledb' : {
31
- 'engine' : 'postgresql+psycopg',
32
- 'create_engine' : default_create_engine_args,
30
+ 'timescaledb': {
31
+ 'engine': 'postgresql+psycopg',
32
+ 'create_engine': default_create_engine_args,
33
33
  'omit_create_engine': {'method',},
34
- 'to_sql' : {},
35
- 'requirements' : default_requirements,
36
- 'defaults' : {
37
- 'port' : 5432,
34
+ 'to_sql': {},
35
+ 'requirements': default_requirements,
36
+ 'defaults': {
37
+ 'port': 5432,
38
38
  },
39
39
  },
40
- 'postgresql' : {
41
- 'engine' : 'postgresql+psycopg',
42
- 'create_engine' : default_create_engine_args,
40
+ 'postgresql': {
41
+ 'engine': 'postgresql+psycopg',
42
+ 'create_engine': default_create_engine_args,
43
43
  'omit_create_engine': {'method',},
44
- 'to_sql' : {},
45
- 'requirements' : default_requirements,
46
- 'defaults' : {
47
- 'port' : 5432,
44
+ 'to_sql': {},
45
+ 'requirements': default_requirements,
46
+ 'defaults': {
47
+ 'port': 5432,
48
48
  },
49
49
  },
50
- 'citus' : {
51
- 'engine' : 'postgresql+psycopg',
52
- 'create_engine' : default_create_engine_args,
50
+ 'citus': {
51
+ 'engine': 'postgresql+psycopg',
52
+ 'create_engine': default_create_engine_args,
53
53
  'omit_create_engine': {'method',},
54
- 'to_sql' : {},
55
- 'requirements' : default_requirements,
56
- 'defaults' : {
57
- 'port' : 5432,
54
+ 'to_sql': {},
55
+ 'requirements': default_requirements,
56
+ 'defaults': {
57
+ 'port': 5432,
58
58
  },
59
59
  },
60
- 'mssql' : {
61
- 'engine' : 'mssql+pyodbc',
62
- 'create_engine' : {
60
+ 'mssql': {
61
+ 'engine': 'mssql+pyodbc',
62
+ 'create_engine': {
63
63
  'fast_executemany': True,
64
64
  'isolation_level': 'AUTOCOMMIT',
65
65
  'use_setinputsizes': False,
@@ -68,84 +68,81 @@ flavor_configs = {
68
68
  'to_sql': {
69
69
  'method': None,
70
70
  },
71
- 'requirements' : default_requirements,
72
- 'defaults' : {
73
- 'port' : 1433,
74
- 'options' : {
75
- 'driver' : 'ODBC Driver 17 for SQL Server',
76
- 'UseFMTONLY': 'Yes',
77
- },
71
+ 'requirements': default_requirements,
72
+ 'defaults': {
73
+ 'port': 1433,
74
+ 'options': "driver=ODBC Driver 17 for SQL Server&UseFMTONLY=Yes",
78
75
  },
79
76
  },
80
- 'mysql' : {
81
- 'engine' : 'mysql+pymysql',
82
- 'create_engine' : default_create_engine_args,
77
+ 'mysql': {
78
+ 'engine': 'mysql+pymysql',
79
+ 'create_engine': default_create_engine_args,
83
80
  'omit_create_engine': {'method',},
84
81
  'to_sql': {
85
82
  'method': 'multi',
86
83
  },
87
- 'requirements' : default_requirements,
88
- 'defaults' : {
89
- 'port' : 3306,
84
+ 'requirements': default_requirements,
85
+ 'defaults': {
86
+ 'port': 3306,
90
87
  },
91
88
  },
92
- 'mariadb' : {
93
- 'engine' : 'mysql+pymysql',
94
- 'create_engine' : default_create_engine_args,
89
+ 'mariadb': {
90
+ 'engine': 'mysql+pymysql',
91
+ 'create_engine': default_create_engine_args,
95
92
  'omit_create_engine': {'method',},
96
93
  'to_sql': {
97
94
  'method': 'multi',
98
95
  },
99
- 'requirements' : default_requirements,
100
- 'defaults' : {
101
- 'port' : 3306,
96
+ 'requirements': default_requirements,
97
+ 'defaults': {
98
+ 'port': 3306,
102
99
  },
103
100
  },
104
- 'oracle' : {
105
- 'engine' : 'oracle+cx_oracle',
106
- 'create_engine' : default_create_engine_args,
101
+ 'oracle': {
102
+ 'engine': 'oracle+cx_oracle',
103
+ 'create_engine': default_create_engine_args,
107
104
  'omit_create_engine': {'method',},
108
105
  'to_sql': {
109
106
  'method': None,
110
107
  },
111
- 'requirements' : default_requirements,
112
- 'defaults' : {
113
- 'port' : 1521,
108
+ 'requirements': default_requirements,
109
+ 'defaults': {
110
+ 'port': 1521,
114
111
  },
115
112
  },
116
- 'sqlite' : {
117
- 'engine' : 'sqlite',
118
- 'create_engine' : default_create_engine_args,
113
+ 'sqlite': {
114
+ 'engine': 'sqlite',
115
+ 'create_engine': default_create_engine_args,
119
116
  'omit_create_engine': {'method',},
120
117
  'to_sql': {
121
118
  'method': 'multi',
122
119
  },
123
- 'requirements' : {'database'},
124
- 'defaults' : {},
120
+ 'requirements': {'database'},
121
+ 'defaults': {},
125
122
  },
126
- 'duckdb' : {
127
- 'engine' : 'duckdb',
128
- 'create_engine' : {},
123
+ 'duckdb': {
124
+ 'engine': 'duckdb',
125
+ 'create_engine': {},
129
126
  'omit_create_engine': {'ALL',},
130
127
  'to_sql': {
131
128
  'method': 'multi',
132
129
  },
133
- 'requirements' : '',
134
- 'defaults' : {},
130
+ 'requirements': '',
131
+ 'defaults': {},
135
132
  },
136
- 'cockroachdb' : {
137
- 'engine' : 'cockroachdb',
133
+ 'cockroachdb': {
134
+ 'engine': 'cockroachdb',
138
135
  'omit_create_engine': {'method',},
139
136
  'create_engine': default_create_engine_args,
140
137
  'to_sql': {
141
138
  'method': 'multi',
142
139
  },
143
- 'requirements' : {'host'},
144
- 'defaults' : {
145
- 'port' : 26257,
146
- 'database' : 'defaultdb',
147
- 'username' : 'root',
148
- 'password' : 'admin',
140
+ 'requirements': {'host'},
141
+ 'defaults': {
142
+ 'port': 26257,
143
+ 'database': 'defaultdb',
144
+ 'username': 'root',
145
+ 'password': 'admin',
149
146
  },
150
147
  },
151
148
  }
@@ -240,11 +240,11 @@ def manually_import_module(
240
240
  if install:
241
241
  if not pip_install(
242
242
  root_name,
243
- venv = venv,
244
- split = False,
245
- check_update = check_update,
246
- color = color,
247
- debug = debug
243
+ venv=venv,
244
+ split=False,
245
+ check_update=check_update,
246
+ color=color,
247
+ debug=debug
248
248
  ) and warn:
249
249
  warn_function(
250
250
  f"There's an update available for '{install_name}', "
@@ -252,14 +252,14 @@ def manually_import_module(
252
252
  + "Try installig via Meerschaum with "
253
253
  + "`install packages '{install_name}'`.",
254
254
  ImportWarning,
255
- stacklevel = 3,
256
- color = False,
255
+ stacklevel=3,
256
+ color=False,
257
257
  )
258
258
  elif warn:
259
259
  warn_function(
260
260
  f"There's an update available for '{root_name}'.",
261
- stack = False,
262
- color = False,
261
+ stack=False,
262
+ color=False,
263
263
  )
264
264
  spec = (
265
265
  importlib.util.find_spec(import_name)
@@ -267,7 +267,6 @@ def manually_import_module(
267
267
  else importlib.util.spec_from_file_location(import_name, str(mod_path))
268
268
  )
269
269
 
270
-
271
270
  if spec is None:
272
271
  try:
273
272
  mod = _import_module(import_name)
@@ -291,7 +290,7 @@ def manually_import_module(
291
290
  sys.modules[import_name] = old_sys_mod
292
291
  else:
293
292
  del sys.modules[import_name]
294
-
293
+
295
294
  return mod
296
295
 
297
296
 
@@ -497,8 +496,19 @@ def _get_package_metadata(import_name: str, venv: Optional[str]) -> Dict[str, st
497
496
  cache_dir_path = VIRTENV_RESOURCES_PATH / venv / 'cache'
498
497
  _args += ['--cache-dir', cache_dir_path.as_posix()]
499
498
 
499
+ if use_uv():
500
+ package_name = 'uv'
501
+ _args = ['pip', 'show', install_name]
502
+ else:
503
+ package_name = 'pip'
504
+ _args = ['show', install_name]
505
+
506
+ print(f"{package_name=}")
507
+ import traceback
508
+ traceback.print_stack()
509
+
500
510
  proc = run_python_package(
501
- 'uv', _args,
511
+ package_name, _args,
502
512
  capture_output=True, as_proc=True, venv=venv, universal_newlines=True,
503
513
  )
504
514
  outs, errs = proc.communicate()
@@ -515,16 +525,16 @@ def _get_package_metadata(import_name: str, venv: Optional[str]) -> Dict[str, st
515
525
 
516
526
 
517
527
  def need_update(
518
- package: Optional['ModuleType'] = None,
519
- install_name: Optional[str] = None,
520
- import_name: Optional[str] = None,
521
- version: Optional[str] = None,
522
- check_pypi: bool = False,
523
- split: bool = True,
524
- color: bool = True,
525
- debug: bool = False,
526
- _run_determine_version: bool = True,
527
- ) -> bool:
528
+ package: Optional['ModuleType'] = None,
529
+ install_name: Optional[str] = None,
530
+ import_name: Optional[str] = None,
531
+ version: Optional[str] = None,
532
+ check_pypi: bool = False,
533
+ split: bool = True,
534
+ color: bool = True,
535
+ debug: bool = False,
536
+ _run_determine_version: bool = True,
537
+ ) -> bool:
528
538
  """
529
539
  Check if a Meerschaum dependency needs an update.
530
540
  Returns a bool for whether or not a package needs to be updated.
@@ -749,21 +759,21 @@ def get_pip(
749
759
 
750
760
 
751
761
  def pip_install(
752
- *install_names: str,
753
- args: Optional[List[str]] = None,
754
- requirements_file_path: Union[pathlib.Path, str, None] = None,
755
- venv: Optional[str] = 'mrsm',
756
- split: bool = False,
757
- check_update: bool = True,
758
- check_pypi: bool = True,
759
- check_wheel: bool = True,
760
- _uninstall: bool = False,
761
- _from_completely_uninstall: bool = False,
762
- _install_uv_pip: bool = True,
763
- color: bool = True,
764
- silent: bool = False,
765
- debug: bool = False,
766
- ) -> bool:
762
+ *install_names: str,
763
+ args: Optional[List[str]] = None,
764
+ requirements_file_path: Union[pathlib.Path, str, None] = None,
765
+ venv: Optional[str] = 'mrsm',
766
+ split: bool = False,
767
+ check_update: bool = True,
768
+ check_pypi: bool = True,
769
+ check_wheel: bool = True,
770
+ _uninstall: bool = False,
771
+ _from_completely_uninstall: bool = False,
772
+ _install_uv_pip: bool = True,
773
+ color: bool = True,
774
+ silent: bool = False,
775
+ debug: bool = False,
776
+ ) -> bool:
767
777
  """
768
778
  Install packages from PyPI with `pip`.
769
779
 
@@ -818,7 +828,6 @@ def pip_install(
818
828
  from meerschaum.config import get_config
819
829
  from meerschaum.config.static import STATIC_CONFIG
820
830
  from meerschaum.utils.warnings import warn
821
- from meerschaum.utils.misc import is_android
822
831
  if args is None:
823
832
  args = ['--upgrade'] if not _uninstall else []
824
833
  if color:
@@ -847,7 +856,7 @@ def pip_install(
847
856
  except (ImportError, FileNotFoundError):
848
857
  uv_bin = None
849
858
  have_uv_pip = False
850
- if have_pip and not have_uv_pip and _install_uv_pip and not is_android():
859
+ if have_pip and not have_uv_pip and _install_uv_pip and is_uv_enabled():
851
860
  if not pip_install(
852
861
  'uv',
853
862
  venv=None,
@@ -866,6 +875,7 @@ def pip_install(
866
875
  venv_contains_package('uv', venv=None, debug=debug)
867
876
  and uv_bin is not None
868
877
  and venv is not None
878
+ and is_uv_enabled()
869
879
  )
870
880
 
871
881
  import sys
@@ -883,7 +893,7 @@ def pip_install(
883
893
  + "https://pip.pypa.io/en/stable/installing/"
884
894
  )
885
895
  sys.exit(1)
886
-
896
+
887
897
  with Venv(venv, debug=debug):
888
898
  if venv is not None:
889
899
  if (
@@ -909,7 +919,7 @@ def pip_install(
909
919
  if not have_wheel:
910
920
  setup_packages_to_install = (
911
921
  ['setuptools', 'wheel']
912
- + ([] if is_android() else ['uv'])
922
+ + (['uv'] if is_uv_enabled() else [])
913
923
  )
914
924
  if not pip_install(
915
925
  *setup_packages_to_install,
@@ -1047,10 +1057,10 @@ def get_prerelease_dependencies(_packages: Optional[List[str]] = None):
1047
1057
 
1048
1058
 
1049
1059
  def completely_uninstall_package(
1050
- install_name: str,
1051
- venv: str = 'mrsm',
1052
- debug: bool = False,
1053
- ) -> bool:
1060
+ install_name: str,
1061
+ venv: str = 'mrsm',
1062
+ debug: bool = False,
1063
+ ) -> bool:
1054
1064
  """
1055
1065
  Continue calling `pip uninstall` until a package is completely
1056
1066
  removed from a virtual environment.
@@ -1092,8 +1102,8 @@ def completely_uninstall_package(
1092
1102
 
1093
1103
 
1094
1104
  def pip_uninstall(
1095
- *args, **kw
1096
- ) -> bool:
1105
+ *args, **kw
1106
+ ) -> bool:
1097
1107
  """
1098
1108
  Uninstall Python packages.
1099
1109
  This function is a wrapper around `pip_install()` but with `_uninstall` enforced as `True`.
@@ -1102,16 +1112,16 @@ def pip_uninstall(
1102
1112
 
1103
1113
 
1104
1114
  def run_python_package(
1105
- package_name: str,
1106
- args: Optional[List[str]] = None,
1107
- venv: Optional[str] = 'mrsm',
1108
- cwd: Optional[str] = None,
1109
- foreground: bool = False,
1110
- as_proc: bool = False,
1111
- capture_output: bool = False,
1112
- debug: bool = False,
1113
- **kw: Any,
1114
- ) -> Union[int, subprocess.Popen, None]:
1115
+ package_name: str,
1116
+ args: Optional[List[str]] = None,
1117
+ venv: Optional[str] = 'mrsm',
1118
+ cwd: Optional[str] = None,
1119
+ foreground: bool = False,
1120
+ as_proc: bool = False,
1121
+ capture_output: bool = False,
1122
+ debug: bool = False,
1123
+ **kw: Any,
1124
+ ) -> Union[int, subprocess.Popen, None]:
1115
1125
  """
1116
1126
  Runs an installed python package.
1117
1127
  E.g. Translates to `/usr/bin/python -m [package]`
@@ -1172,9 +1182,9 @@ def run_python_package(
1172
1182
  try:
1173
1183
  to_return = run_process(
1174
1184
  command,
1175
- foreground = foreground,
1176
- as_proc = as_proc,
1177
- capture_output = capture_output,
1185
+ foreground=foreground,
1186
+ as_proc=as_proc,
1187
+ capture_output=capture_output,
1178
1188
  **kw
1179
1189
  )
1180
1190
  except Exception as e:
@@ -1187,9 +1197,9 @@ def run_python_package(
1187
1197
  )
1188
1198
  proc = subprocess.Popen(
1189
1199
  command,
1190
- stdout = stdout,
1191
- stderr = stderr,
1192
- env = env_dict,
1200
+ stdout=stdout,
1201
+ stderr=stderr,
1202
+ env=env_dict,
1193
1203
  )
1194
1204
  to_return = proc if as_proc else proc.wait()
1195
1205
  except KeyboardInterrupt:
@@ -1199,20 +1209,20 @@ def run_python_package(
1199
1209
 
1200
1210
 
1201
1211
  def attempt_import(
1202
- *names: str,
1203
- lazy: bool = True,
1204
- warn: bool = True,
1205
- install: bool = True,
1206
- venv: Optional[str] = 'mrsm',
1207
- precheck: bool = True,
1208
- split: bool = True,
1209
- check_update: bool = False,
1210
- check_pypi: bool = False,
1211
- check_is_installed: bool = True,
1212
- allow_outside_venv: bool = True,
1213
- color: bool = True,
1214
- debug: bool = False
1215
- ) -> Any:
1212
+ *names: str,
1213
+ lazy: bool = True,
1214
+ warn: bool = True,
1215
+ install: bool = True,
1216
+ venv: Optional[str] = 'mrsm',
1217
+ precheck: bool = True,
1218
+ split: bool = True,
1219
+ check_update: bool = False,
1220
+ check_pypi: bool = False,
1221
+ check_is_installed: bool = True,
1222
+ allow_outside_venv: bool = True,
1223
+ color: bool = True,
1224
+ debug: bool = False
1225
+ ) -> Any:
1216
1226
  """
1217
1227
  Raise a warning if packages are not installed; otherwise import and return modules.
1218
1228
  If `lazy` is `True`, return lazy-imported modules.
@@ -1399,10 +1409,10 @@ def attempt_import(
1399
1409
 
1400
1410
 
1401
1411
  def lazy_import(
1402
- name: str,
1403
- local_name: str = None,
1404
- **kw
1405
- ) -> meerschaum.utils.packages.lazy_loader.LazyLoader:
1412
+ name: str,
1413
+ local_name: str = None,
1414
+ **kw
1415
+ ) -> meerschaum.utils.packages.lazy_loader.LazyLoader:
1406
1416
  """
1407
1417
  Lazily import a package.
1408
1418
  """
@@ -1440,10 +1450,10 @@ def pandas_name() -> str:
1440
1450
 
1441
1451
  emitted_pandas_warning: bool = False
1442
1452
  def import_pandas(
1443
- debug: bool = False,
1444
- lazy: bool = False,
1445
- **kw
1446
- ) -> 'ModuleType':
1453
+ debug: bool = False,
1454
+ lazy: bool = False,
1455
+ **kw
1456
+ ) -> 'ModuleType':
1447
1457
  """
1448
1458
  Quality-of-life function to attempt to import the configured version of `pandas`.
1449
1459
  """
@@ -1472,10 +1482,10 @@ def import_pandas(
1472
1482
 
1473
1483
 
1474
1484
  def import_rich(
1475
- lazy: bool = True,
1476
- debug: bool = False,
1477
- **kw : Any
1478
- ) -> 'ModuleType':
1485
+ lazy: bool = True,
1486
+ debug: bool = False,
1487
+ **kw : Any
1488
+ ) -> 'ModuleType':
1479
1489
  """
1480
1490
  Quality of life function for importing `rich`.
1481
1491
  """
@@ -1530,13 +1540,13 @@ def import_html(warn=False, **kw) -> 'ModuleType':
1530
1540
 
1531
1541
 
1532
1542
  def get_modules_from_package(
1533
- package: 'package',
1534
- names: bool = False,
1535
- recursive: bool = False,
1536
- lazy: bool = False,
1537
- modules_venvs: bool = False,
1538
- debug: bool = False
1539
- ):
1543
+ package: 'package',
1544
+ names: bool = False,
1545
+ recursive: bool = False,
1546
+ lazy: bool = False,
1547
+ modules_venvs: bool = False,
1548
+ debug: bool = False
1549
+ ):
1540
1550
  """
1541
1551
  Find and import all modules in a package.
1542
1552
 
@@ -1585,13 +1595,13 @@ def get_modules_from_package(
1585
1595
 
1586
1596
 
1587
1597
  def import_children(
1588
- package: Optional['ModuleType'] = None,
1589
- package_name: Optional[str] = None,
1590
- types : Optional[List[str]] = None,
1591
- lazy: bool = True,
1592
- recursive: bool = False,
1593
- debug: bool = False
1594
- ) -> List['ModuleType']:
1598
+ package: Optional['ModuleType'] = None,
1599
+ package_name: Optional[str] = None,
1600
+ types : Optional[List[str]] = None,
1601
+ lazy: bool = True,
1602
+ recursive: bool = False,
1603
+ debug: bool = False
1604
+ ) -> List['ModuleType']:
1595
1605
  """
1596
1606
  Import all functions in a package to its `__init__`.
1597
1607
 
@@ -1660,12 +1670,12 @@ def import_children(
1660
1670
 
1661
1671
  _reload_module_cache = {}
1662
1672
  def reload_package(
1663
- package: str,
1664
- skip_submodules: Optional[List[str]] = None,
1665
- lazy: bool = False,
1666
- debug: bool = False,
1667
- **kw: Any
1668
- ):
1673
+ package: str,
1674
+ skip_submodules: Optional[List[str]] = None,
1675
+ lazy: bool = False,
1676
+ debug: bool = False,
1677
+ **kw: Any
1678
+ ):
1669
1679
  """
1670
1680
  Recursively load a package's subpackages, even if they were not previously loaded.
1671
1681
  """
@@ -1724,12 +1734,12 @@ def reload_meerschaum(debug: bool = False) -> SuccessTuple:
1724
1734
 
1725
1735
 
1726
1736
  def is_installed(
1727
- import_name: str,
1728
- venv: Optional[str] = 'mrsm',
1729
- split: bool = True,
1730
- allow_outside_venv: bool = True,
1731
- debug: bool = False,
1732
- ) -> bool:
1737
+ import_name: str,
1738
+ venv: Optional[str] = 'mrsm',
1739
+ split: bool = True,
1740
+ allow_outside_venv: bool = True,
1741
+ debug: bool = False,
1742
+ ) -> bool:
1733
1743
  """
1734
1744
  Check whether a package is installed.
1735
1745
 
@@ -1782,11 +1792,11 @@ def is_installed(
1782
1792
 
1783
1793
 
1784
1794
  def venv_contains_package(
1785
- import_name: str,
1786
- venv: Optional[str] = 'mrsm',
1787
- split: bool = True,
1788
- debug: bool = False,
1789
- ) -> bool:
1795
+ import_name: str,
1796
+ venv: Optional[str] = 'mrsm',
1797
+ split: bool = True,
1798
+ debug: bool = False,
1799
+ ) -> bool:
1790
1800
  """
1791
1801
  Search the contents of a virtual environment for a package.
1792
1802
  """
@@ -1821,10 +1831,10 @@ def ensure_readline() -> 'ModuleType':
1821
1831
  try:
1822
1832
  rl = attempt_import(
1823
1833
  rl_name,
1824
- lazy = False,
1825
- install = True,
1826
- venv = None,
1827
- warn = False,
1834
+ lazy=False,
1835
+ install=True,
1836
+ venv=None,
1837
+ warn=False,
1828
1838
  )
1829
1839
  except (ImportError, ModuleNotFoundError):
1830
1840
  if not pip_install(rl_name, args=['--upgrade', '--ignore-installed'], venv=None):
@@ -1867,9 +1877,51 @@ def _get_pip_os_env(color: bool = True):
1867
1877
  path_sep = ':' if platform.system() != 'Windows' else ';'
1868
1878
  pip_os_env.update({
1869
1879
  'PIP_BREAK_SYSTEM_PACKAGES': 'true',
1880
+ 'UV_BREAK_SYSTEM_PACKAGES': 'true',
1870
1881
  ('FORCE_COLOR' if color else 'NO_COLOR'): '1',
1871
1882
  })
1872
1883
  if str(python_bin_path) not in path_str:
1873
1884
  pip_os_env['PATH'] = str(python_bin_path.parent) + path_sep + path_str
1874
1885
 
1875
1886
  return pip_os_env
1887
+
1888
+
1889
+ def use_uv() -> bool:
1890
+ """
1891
+ Return whether `uv` is available and enabled.
1892
+ """
1893
+ from meerschaum.utils.misc import is_android
1894
+ if is_android():
1895
+ return False
1896
+
1897
+ if not is_uv_enabled():
1898
+ return False
1899
+
1900
+ try:
1901
+ import uv
1902
+ uv_bin = uv.find_uv_bin()
1903
+ except (ImportError, FileNotFoundError):
1904
+ uv_bin = None
1905
+
1906
+ if uv_bin is None:
1907
+ return False
1908
+
1909
+ return True
1910
+
1911
+
1912
+ def is_uv_enabled() -> bool:
1913
+ """
1914
+ Return whether the user has disabled `uv`.
1915
+ """
1916
+ from meerschaum.utils.misc import is_android
1917
+ if is_android():
1918
+ return False
1919
+
1920
+ try:
1921
+ import yaml
1922
+ except ImportError:
1923
+ return False
1924
+
1925
+ from meerschaum.config import get_config
1926
+ enabled = get_config('system', 'experimental', 'uv_pip')
1927
+ return enabled
@@ -39,7 +39,9 @@ packages: Dict[str, Dict[str, str]] = {
39
39
  'semver' : 'semver>=3.0.0',
40
40
  'pathspec' : 'pathspec>=0.9.0',
41
41
  'dateutil' : 'python-dateutil>=2.7.5',
42
- 'requests' : 'requests>=2.23.0',
42
+ 'requests' : 'requests>=2.32.3',
43
+ 'certifi' : 'certifi>=2024.8.30',
44
+ 'idna' : 'idna>=3.10.0',
43
45
  'binaryornot' : 'binaryornot>=0.4.4',
44
46
  'pyvim' : 'pyvim>=3.0.2',
45
47
  'ptpython' : 'ptpython>=3.0.27',
@@ -330,11 +330,11 @@ def verify_venv(
330
330
 
331
331
  tried_virtualenv = False
332
332
  def init_venv(
333
- venv: str = 'mrsm',
334
- verify: bool = True,
335
- force: bool = False,
336
- debug: bool = False,
337
- ) -> bool:
333
+ venv: str = 'mrsm',
334
+ verify: bool = True,
335
+ force: bool = False,
336
+ debug: bool = False,
337
+ ) -> bool:
338
338
  """
339
339
  Initialize the virtual environment.
340
340
 
@@ -366,6 +366,7 @@ def init_venv(
366
366
  import sys, platform, os, pathlib, shutil
367
367
  from meerschaum.config.static import STATIC_CONFIG
368
368
  from meerschaum.config._paths import VIRTENV_RESOURCES_PATH
369
+ from meerschaum.utils.packages import is_uv_enabled
369
370
  venv_path = VIRTENV_RESOURCES_PATH / venv
370
371
  docker_home_venv_path = pathlib.Path('/home/meerschaum/venvs/mrsm')
371
372
 
@@ -387,7 +388,7 @@ def init_venv(
387
388
  global tried_virtualenv
388
389
  try:
389
390
  import venv as _venv
390
- uv = attempt_import('uv', venv=None, debug=debug)
391
+ uv = attempt_import('uv', venv=None, debug=debug) if is_uv_enabled() else None
391
392
  virtualenv = None
392
393
  except ImportError:
393
394
  _venv = None
@@ -400,9 +401,9 @@ def init_venv(
400
401
  _venv_success = run_python_package(
401
402
  'uv',
402
403
  ['venv', venv_path.as_posix(), '-q'],
403
- venv = None,
404
- env = _get_pip_os_env(),
405
- debug = debug,
404
+ venv=None,
405
+ env=_get_pip_os_env(),
406
+ debug=debug,
406
407
  ) == 0
407
408
 
408
409
  if _venv is not None and not _venv_success:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: meerschaum
3
- Version: 2.4.1
3
+ Version: 2.4.2
4
4
  Summary: Sync Time-Series Pipes with Meerschaum
5
5
  Home-page: https://meerschaum.io
6
6
  Author: Bennett Meares
@@ -66,7 +66,9 @@ Requires-Dist: update-checker >=0.18.0 ; extra == 'api'
66
66
  Requires-Dist: semver >=3.0.0 ; extra == 'api'
67
67
  Requires-Dist: pathspec >=0.9.0 ; extra == 'api'
68
68
  Requires-Dist: python-dateutil >=2.7.5 ; extra == 'api'
69
- Requires-Dist: requests >=2.23.0 ; extra == 'api'
69
+ Requires-Dist: requests >=2.32.3 ; extra == 'api'
70
+ Requires-Dist: certifi >=2024.8.30 ; extra == 'api'
71
+ Requires-Dist: idna >=3.10.0 ; extra == 'api'
70
72
  Requires-Dist: binaryornot >=0.4.4 ; extra == 'api'
71
73
  Requires-Dist: pyvim >=3.0.2 ; extra == 'api'
72
74
  Requires-Dist: ptpython >=3.0.27 ; extra == 'api'
@@ -117,7 +119,9 @@ Requires-Dist: update-checker >=0.18.0 ; extra == 'core'
117
119
  Requires-Dist: semver >=3.0.0 ; extra == 'core'
118
120
  Requires-Dist: pathspec >=0.9.0 ; extra == 'core'
119
121
  Requires-Dist: python-dateutil >=2.7.5 ; extra == 'core'
120
- Requires-Dist: requests >=2.23.0 ; extra == 'core'
122
+ Requires-Dist: requests >=2.32.3 ; extra == 'core'
123
+ Requires-Dist: certifi >=2024.8.30 ; extra == 'core'
124
+ Requires-Dist: idna >=3.10.0 ; extra == 'core'
121
125
  Requires-Dist: binaryornot >=0.4.4 ; extra == 'core'
122
126
  Requires-Dist: pyvim >=3.0.2 ; extra == 'core'
123
127
  Requires-Dist: ptpython >=3.0.27 ; extra == 'core'
@@ -201,7 +205,9 @@ Requires-Dist: update-checker >=0.18.0 ; extra == 'full'
201
205
  Requires-Dist: semver >=3.0.0 ; extra == 'full'
202
206
  Requires-Dist: pathspec >=0.9.0 ; extra == 'full'
203
207
  Requires-Dist: python-dateutil >=2.7.5 ; extra == 'full'
204
- Requires-Dist: requests >=2.23.0 ; extra == 'full'
208
+ Requires-Dist: requests >=2.32.3 ; extra == 'full'
209
+ Requires-Dist: certifi >=2024.8.30 ; extra == 'full'
210
+ Requires-Dist: idna >=3.10.0 ; extra == 'full'
205
211
  Requires-Dist: binaryornot >=0.4.4 ; extra == 'full'
206
212
  Requires-Dist: pyvim >=3.0.2 ; extra == 'full'
207
213
  Requires-Dist: ptpython >=3.0.27 ; extra == 'full'
@@ -293,7 +299,9 @@ Requires-Dist: update-checker >=0.18.0 ; extra == 'sql'
293
299
  Requires-Dist: semver >=3.0.0 ; extra == 'sql'
294
300
  Requires-Dist: pathspec >=0.9.0 ; extra == 'sql'
295
301
  Requires-Dist: python-dateutil >=2.7.5 ; extra == 'sql'
296
- Requires-Dist: requests >=2.23.0 ; extra == 'sql'
302
+ Requires-Dist: requests >=2.32.3 ; extra == 'sql'
303
+ Requires-Dist: certifi >=2024.8.30 ; extra == 'sql'
304
+ Requires-Dist: idna >=3.10.0 ; extra == 'sql'
297
305
  Requires-Dist: binaryornot >=0.4.4 ; extra == 'sql'
298
306
  Requires-Dist: pyvim >=3.0.2 ; extra == 'sql'
299
307
  Requires-Dist: ptpython >=3.0.27 ; extra == 'sql'
@@ -24,7 +24,7 @@ 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=X2YpYcxDR1vijj4YlJcdmErnt2FpF2s_tgyHVjpvISc,14916
27
+ meerschaum/actions/bootstrap.py,sha256=z6Wmx9EDKr5gfyMyMmyiTf_oVDASdcgChkKyzHYPOmQ,14924
28
28
  meerschaum/actions/clear.py,sha256=OoFZE0bK5m8s3GLNZcixuVT0DMj1izXVxGCATcmUGbI,4851
29
29
  meerschaum/actions/copy.py,sha256=NwTwj3IMdK1TFRuJXCxsbIEFNVeoNGoMkvE6H1ZQZzo,6838
30
30
  meerschaum/actions/deduplicate.py,sha256=puYyxeFYEUy1Sd2IOcZB2e6MrNxAZl2bTLmNzFDkCiw,1167
@@ -129,7 +129,7 @@ meerschaum/api/routes/_users.py,sha256=SfAkZFKrKnGjpzj8SFIKzPemzQJOH3oB72h19EaUv
129
129
  meerschaum/api/routes/_version.py,sha256=2t-nw_9IxCVZCNEar0LOwmut2zsClRVHjiOOUx16cu0,825
130
130
  meerschaum/api/routes/_webterm.py,sha256=twjQyVReYwXypvxLPICYWjB5hR-XHzUWEuYRbSq27nc,3834
131
131
  meerschaum/api/tables/__init__.py,sha256=e2aNC0CdlWICTUMx1i9RauF8Pm426J0RZJbsJWv4SWo,482
132
- meerschaum/config/__init__.py,sha256=jZgQSjvbOWyvGouqRgIeYBg9Pp343_9CDsCWWpwYDGY,11577
132
+ meerschaum/config/__init__.py,sha256=5ZBq71P9t3nb74r5CGvMfNuauPscfegBX-nkaAUi5C4,11541
133
133
  meerschaum/config/_dash.py,sha256=BJHl4xMrQB-YHUEU7ldEW8q_nOPoIRSOqLrfGElc6Dw,187
134
134
  meerschaum/config/_default.py,sha256=gGkF9dGiwiKtMSXAE85LNhZ8ZXQ5EbeBPTSG0A9MBNQ,5675
135
135
  meerschaum/config/_edit.py,sha256=_kabgFbJdI5kcLs-JIsoaTo0JdyxnPnBdrlTyTAgPm8,8236
@@ -139,13 +139,13 @@ meerschaum/config/_jobs.py,sha256=gS_4mMGdmVP7WB4V5Sz8kYP0HmhWcMY2jSWGR7jX6cw,12
139
139
  meerschaum/config/_patch.py,sha256=21N30q1ANmWMDQ-2RUjpMx7KafWfPQ3lKx9rrMqg1s4,1526
140
140
  meerschaum/config/_paths.py,sha256=Ycuj4TYTzXO-6JkWX40fMK0CVV6L5HG_rPlCi-Ckhto,9763
141
141
  meerschaum/config/_preprocess.py,sha256=-AEA8m_--KivZwTQ1sWN6LTn5sio_fUr2XZ51BO6wLs,1220
142
- meerschaum/config/_read_config.py,sha256=WFZKIXZMDe_ca0ES7ivgM_mnwShvFxLdoeisT_X5-h0,14720
142
+ meerschaum/config/_read_config.py,sha256=oxnLjuhy6JBBld886FkBX07wUdkpzEzTItYMUa9qw1Q,14688
143
143
  meerschaum/config/_shell.py,sha256=46_m49Txc5q1rGfCgO49ca48BODx45DQJi8D0zz1R18,4245
144
- meerschaum/config/_sync.py,sha256=oK2ZujO2T1he08BXCFyiniBUevNGWSQKXLcS_jRv_7Y,4155
145
- meerschaum/config/_version.py,sha256=MWDIPuVPrx0N5vxzIOy58EultrUEFqxSmbIAnQtAUAo,71
144
+ meerschaum/config/_sync.py,sha256=jHcWRkxd82_BgX8Xo8agsWvf7BSbv3qHLWmYl6ehp_0,4242
145
+ meerschaum/config/_version.py,sha256=gEdmihoOiv3_8gcV8s_UNuiav3ge2HDCUUdRpRT0lFI,71
146
146
  meerschaum/config/paths.py,sha256=JjibeGN3YAdSNceRwsd42aNmeUrIgM6ndzC8qZAmNI0,621
147
147
  meerschaum/config/resources/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
148
- meerschaum/config/stack/__init__.py,sha256=jHnk1HE7riEVOFbt0SHgTM7kmrdRVic1raQSs220wn0,10550
148
+ meerschaum/config/stack/__init__.py,sha256=gGVxXgNnGb9u25iF__IiNPlZt1BLUVmHmFJ0jvnJg3Q,10548
149
149
  meerschaum/config/stack/grafana/__init__.py,sha256=LNXQw2FvHKrD68RDhqDmi2wJjAHaKw9IWx8rNuyWEPo,2010
150
150
  meerschaum/config/stack/mosquitto/__init__.py,sha256=-OwOjq8KiBoSH_pmgCAAF3Dp3CRD4KgAEdimZSadROs,186
151
151
  meerschaum/config/stack/mosquitto/resources/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -155,7 +155,7 @@ meerschaum/connectors/_Connector.py,sha256=VaVNg0SlQCTXk4shl3c68QdkbymA2Y9ScUlUj
155
155
  meerschaum/connectors/__init__.py,sha256=bpWsnU0uvoowWyUkFTwfEkadK84pssZUJ4M7yReudOU,12703
156
156
  meerschaum/connectors/parse.py,sha256=tnqzkzt_suOXYzktn_XVUrprtfym9ThijUf8HXZZlhY,4194
157
157
  meerschaum/connectors/poll.py,sha256=23yRUeIqqyNVt8VoJErhirW543YZ6X0ocfBauMJnC_g,7465
158
- meerschaum/connectors/api/_APIConnector.py,sha256=lUsyAf0b-k6X25501FAJQiWX395Vf86MYSaRM4np2h0,5070
158
+ meerschaum/connectors/api/_APIConnector.py,sha256=Cujs8FDsvaxEV4mnnuft5zjvjiuhM5DybOZtfd8-YJI,5142
159
159
  meerschaum/connectors/api/__init__.py,sha256=rYHDMK7n-5X5HoxiRITt-sVLgePnPQbgwntkhzvJvOk,234
160
160
  meerschaum/connectors/api/_actions.py,sha256=gd3F8i5BvN8XRvMcPvPVR8sc1DeLzgoBHdDhc8PtACE,3966
161
161
  meerschaum/connectors/api/_fetch.py,sha256=Khq9AFr1nk8Dsmcedb77aWhAuHw0JGgVeahDG95Q5MQ,2072
@@ -172,7 +172,7 @@ meerschaum/connectors/plugin/__init__.py,sha256=pwF7TGY4WNz2_HaVdmK4rPQ9ZwTOEuPH
172
172
  meerschaum/connectors/sql/_SQLConnector.py,sha256=QvsFgAv2NAUdsJrcNYZIkQ9x_ow5JRe4Ie_UgSrDz3M,11709
173
173
  meerschaum/connectors/sql/__init__.py,sha256=3cqYiDkVasn7zWdtOTAZbT4bo95AuvGOmDD2TkaAxtw,205
174
174
  meerschaum/connectors/sql/_cli.py,sha256=1SgnWeMIAihoxp4FzbNrcq1npXf0dSOQnCntpU9hUXA,4405
175
- meerschaum/connectors/sql/_create_engine.py,sha256=vPVwR3cpfcQm0aW9xo_DUWA3gMdlkuB0wJ8JoTpRYD0,10396
175
+ meerschaum/connectors/sql/_create_engine.py,sha256=ulKtML7e5p0Me0pHKVVSEd9WF8UI9sdEPuk-6t4REpo,10068
176
176
  meerschaum/connectors/sql/_fetch.py,sha256=NYYWDoEd-aGIS337KwH-D9_3KVWVCZOHAspGLfdEuUE,13086
177
177
  meerschaum/connectors/sql/_instance.py,sha256=r_S96vzSuKnBVGROSKQAPl-DnFnOOEPUkz1KFDFPHFQ,6509
178
178
  meerschaum/connectors/sql/_pipes.py,sha256=cVdc929CIjyPPzM_QNVEkNfvROrksakEifgqJbm6jH0,99622
@@ -245,16 +245,16 @@ meerschaum/utils/formatting/_jobs.py,sha256=izsqPJhTtUkXUUtWnbXtReYsUYwulXtci3pB
245
245
  meerschaum/utils/formatting/_pipes.py,sha256=wy0iWJFsFl3X2VloaiA_gp9Yx9w6tD3FQZvAQAqef4A,19492
246
246
  meerschaum/utils/formatting/_pprint.py,sha256=tgrT3FyGyu5CWJYysqK3kX1xdZYorlbOk9fcU_vt9Qg,3096
247
247
  meerschaum/utils/formatting/_shell.py,sha256=OMFh3cSZNr83z8m265irkS_JtEWHwjkEY2ybnMIOllY,3774
248
- meerschaum/utils/packages/__init__.py,sha256=aByhWPf4H7yilmSkEP4Qa0IXsZv6Aq1l19b40QydvG4,63393
249
- meerschaum/utils/packages/_packages.py,sha256=987HQ1SnjGh2r4Gp8pziX7VUzUHm-tM_g2oYsDdLfpM,8149
248
+ meerschaum/utils/packages/__init__.py,sha256=ZWOa9zR7rwmX_5f7MNe2vEbX0GiG-Bo_1W6pdVxHKxU,64045
249
+ meerschaum/utils/packages/_packages.py,sha256=kwXoGePzmaNVRB5YQP6JJOWQqnPiUpM-TPtb38DrPXg,8265
250
250
  meerschaum/utils/packages/lazy_loader.py,sha256=VHnph3VozH29R4JnSSBfwtA5WKZYZQFT_GeQSShCnuc,2540
251
251
  meerschaum/utils/venv/_Venv.py,sha256=sBnlmxHdAh2bx8btfVoD79-H9-cYsv5lP02IIXkyECs,3553
252
- meerschaum/utils/venv/__init__.py,sha256=bLAWnllKDuE_z6bLk7gLh4mI3Sp1j5hsboTqPKOQq84,24361
253
- meerschaum-2.4.1.dist-info/LICENSE,sha256=jG2zQEdRNt88EgHUWPpXVWmOrOduUQRx7MnYV9YIPaw,11359
254
- meerschaum-2.4.1.dist-info/METADATA,sha256=akMpC-0UIHkMfPhDD1FqFnlWqTD3AXae8OtWtWJRyyc,24287
255
- meerschaum-2.4.1.dist-info/NOTICE,sha256=OTA9Fcthjf5BRvWDDIcBC_xfLpeDV-RPZh3M-HQBRtQ,114
256
- meerschaum-2.4.1.dist-info/WHEEL,sha256=5Mi1sN9lKoFv_gxcPtisEVrJZihrm_beibeg5R6xb4I,91
257
- meerschaum-2.4.1.dist-info/entry_points.txt,sha256=5YBVzibw-0rNA_1VjB16z5GABsOGf-CDhW4yqH8C7Gc,88
258
- meerschaum-2.4.1.dist-info/top_level.txt,sha256=bNoSiDj0El6buocix-FRoAtJOeq1qOF5rRm2u9i7Q6A,11
259
- meerschaum-2.4.1.dist-info/zip-safe,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
260
- meerschaum-2.4.1.dist-info/RECORD,,
252
+ meerschaum/utils/venv/__init__.py,sha256=G3KXL4ByWNqVxBRLs_RaJbO3h3tOKXkazkAYuoUW568,24420
253
+ meerschaum-2.4.2.dist-info/LICENSE,sha256=jG2zQEdRNt88EgHUWPpXVWmOrOduUQRx7MnYV9YIPaw,11359
254
+ meerschaum-2.4.2.dist-info/METADATA,sha256=Q38pjxkuUYk8AVaVM2VpmCgeIpr1VnQeA5q3wCLO0Vo,24683
255
+ meerschaum-2.4.2.dist-info/NOTICE,sha256=OTA9Fcthjf5BRvWDDIcBC_xfLpeDV-RPZh3M-HQBRtQ,114
256
+ meerschaum-2.4.2.dist-info/WHEEL,sha256=GV9aMThwP_4oNCtvEC2ec3qUYutgWeAzklro_0m4WJQ,91
257
+ meerschaum-2.4.2.dist-info/entry_points.txt,sha256=5YBVzibw-0rNA_1VjB16z5GABsOGf-CDhW4yqH8C7Gc,88
258
+ meerschaum-2.4.2.dist-info/top_level.txt,sha256=bNoSiDj0El6buocix-FRoAtJOeq1qOF5rRm2u9i7Q6A,11
259
+ meerschaum-2.4.2.dist-info/zip-safe,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
260
+ meerschaum-2.4.2.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (75.0.0)
2
+ Generator: setuptools (75.1.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5