meerschaum 2.8.2__py3-none-any.whl → 2.8.3__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.
@@ -21,6 +21,7 @@ from meerschaum.plugins import _api_plugins
21
21
  from meerschaum.utils.warnings import warn, dprint
22
22
  from meerschaum.utils.threading import RLock
23
23
  from meerschaum.utils.misc import is_pipe_registered
24
+ from meerschaum.connectors.parse import parse_instance_keys
24
25
 
25
26
  from meerschaum import __version__ as version
26
27
  __version__ = version
@@ -99,7 +100,6 @@ production = get_uvicorn_config().get('production', False)
99
100
  _include_dash = (not no_dash)
100
101
  docs_enabled = not production or sys_config.get('endpoints', {}).get('docs_in_production', True)
101
102
 
102
- connector = None
103
103
  default_instance_keys = None
104
104
  _instance_connectors = defaultdict(lambda: None)
105
105
  def get_api_connector(instance_keys: Optional[str] = None):
@@ -130,12 +130,19 @@ def get_api_connector(instance_keys: Optional[str] = None):
130
130
  )
131
131
 
132
132
  with _locks[f'instance-{instance_keys}']:
133
- connector = _instance_connectors[instance_keys]
134
- if connector is None:
135
- from meerschaum.connectors.parse import parse_instance_keys
136
- connector = parse_instance_keys(instance_keys, debug=debug)
137
- _instance_connectors[instance_keys] = connector
138
- return connector
133
+ if _instance_connectors[instance_keys] is None:
134
+ try:
135
+ is_valid_connector = True
136
+ _instance_connectors[instance_keys] = parse_instance_keys(instance_keys, debug=debug)
137
+ except Exception:
138
+ is_valid_connector = False
139
+
140
+ if not is_valid_connector:
141
+ raise fastapi.HTTPException(
142
+ status_code=422,
143
+ detail="Invalid instance keys.",
144
+ )
145
+ return _instance_connectors[instance_keys]
139
146
 
140
147
 
141
148
  cache_connector = None
@@ -164,7 +171,6 @@ def get_cache_connector(connector_keys: Optional[str] = None):
164
171
  return None
165
172
 
166
173
  if cache_connector is None:
167
- from meerschaum.connectors.parse import parse_instance_keys
168
174
  cache_connector = parse_instance_keys(connector_keys)
169
175
 
170
176
  if debug:
@@ -311,7 +311,7 @@ def get_sync_time(
311
311
  newest: bool = True,
312
312
  remote: bool = False,
313
313
  round_down: bool = True,
314
- debug: bool = False,
314
+ instance_keys: Optional[str] = None,
315
315
  curr_user = (
316
316
  fastapi.Depends(manager) if not no_auth else None
317
317
  ),
@@ -322,12 +322,11 @@ def get_sync_time(
322
322
  """
323
323
  if location_key == '[None]':
324
324
  location_key = None
325
- pipe = get_pipe(connector_keys, metric_key, location_key)
325
+ pipe = get_pipe(connector_keys, metric_key, location_key, instance_keys)
326
326
  sync_time = pipe.get_sync_time(
327
- params = params,
328
- newest = newest,
329
- debug = debug,
330
- round_down = round_down,
327
+ params=params,
328
+ newest=newest,
329
+ round_down=round_down,
331
330
  )
332
331
  if isinstance(sync_time, datetime):
333
332
  sync_time = sync_time.isoformat()
@@ -339,7 +338,8 @@ def sync_pipe(
339
338
  connector_keys: str,
340
339
  metric_key: str,
341
340
  location_key: str,
342
- data: dict = None,
341
+ data: Union[List[Dict[Any, Any]], Dict[Any, Any]],
342
+ instance_keys: Optional[str] = None,
343
343
  check_existing: bool = True,
344
344
  blocking: bool = True,
345
345
  force: bool = False,
@@ -354,9 +354,9 @@ def sync_pipe(
354
354
  Add data to an existing Pipe.
355
355
  See [`meerschaum.Pipe.sync`](https://docs.meerschaum.io/meerschaum.html#Pipe.sync).
356
356
  """
357
- if data is None:
358
- data = {}
359
- pipe = get_pipe(connector_keys, metric_key, location_key)
357
+ if not data:
358
+ return [True, "No data to sync."]
359
+ pipe = get_pipe(connector_keys, metric_key, location_key, instance_keys)
360
360
  if pipe.target in ('mrsm_users', 'mrsm_plugins', 'mrsm_pipes'):
361
361
  raise fastapi.HTTPException(
362
362
  status_code=409,
@@ -365,21 +365,16 @@ def sync_pipe(
365
365
 
366
366
  if not pipe.columns and columns is not None:
367
367
  pipe.columns = json.loads(columns)
368
- if not pipe.columns and not is_pipe_registered(pipe, pipes(refresh=True)):
369
- raise fastapi.HTTPException(
370
- status_code=409,
371
- detail="Pipe must be registered with index columns specified."
372
- )
373
368
 
374
- result = list(pipe.sync(
369
+ success, msg = pipe.sync(
375
370
  data,
376
371
  debug=debug,
377
372
  check_existing=check_existing,
378
373
  blocking=blocking,
379
374
  force=force,
380
375
  workers=workers,
381
- ))
382
- return result
376
+ )
377
+ return list((success, msg))
383
378
 
384
379
 
385
380
  @app.get(pipes_endpoint + '/{connector_keys}/{metric_key}/{location_key}/data', tags=['Pipes'])
@@ -543,7 +538,7 @@ def get_pipe_csv(
543
538
  if not is_pipe_registered(pipe, pipes(instance_keys, refresh=True)):
544
539
  raise fastapi.HTTPException(
545
540
  status_code=409,
546
- detail="Pipe must be registered with the datetime column specified."
541
+ detail="Pipe must be registered."
547
542
  )
548
543
 
549
544
  dt_col = pipe.columns.get('datetime', None)
@@ -173,6 +173,9 @@ default_pipes_config = {
173
173
  'sync': {
174
174
  'filter_params_index_limit': 250,
175
175
  },
176
+ 'verify': {
177
+ 'max_chunks_syncs': 3,
178
+ },
176
179
  }
177
180
  default_plugins_config = {}
178
181
  default_experimental_config = {
@@ -2,4 +2,4 @@
2
2
  Specify the Meerschaum release version.
3
3
  """
4
4
 
5
- __version__ = "2.8.2"
5
+ __version__ = "2.8.3"
@@ -137,7 +137,7 @@ STATIC_CONFIG: Dict[str, Any] = {
137
137
  'pbkdf2_sha256__default_rounds': 1_000_000,
138
138
  },
139
139
  'min_username_length': 1,
140
- 'max_username_length': 26,
140
+ 'max_username_length': 60,
141
141
  'min_password_length': 5,
142
142
  },
143
143
  'plugins': {
@@ -100,7 +100,13 @@ def _cli_exit(
100
100
  ### yet defined (e.g. 'sql:local').
101
101
  cli_arg_str = self.DATABASE_URL
102
102
  if self.flavor in ('sqlite', 'duckdb'):
103
- cli_arg_str = str(self.database)
103
+ cli_arg_str = (
104
+ str(self.database)
105
+ if 'database' in self.__dict__
106
+ else self.parse_uri(self.URI).get('database', None)
107
+ )
108
+ if not cli_arg_str:
109
+ raise ValueError(f"Cannot determine database from connector '{self}'.")
104
110
  if cli_arg_str.startswith('postgresql+psycopg://'):
105
111
  cli_arg_str = cli_arg_str.replace('postgresql+psycopg://', 'postgresql://')
106
112
 
@@ -256,8 +256,11 @@ def create_engine(
256
256
  ) if not _uri else _uri
257
257
 
258
258
  ### Sometimes the timescaledb:// flavor can slip in.
259
- if _uri and self.flavor in ('timescaledb',) and self.flavor in _uri:
260
- engine_str = engine_str.replace(f'{self.flavor}', 'postgresql', 1)
259
+ if _uri and self.flavor in _uri:
260
+ if self.flavor == 'timescaledb':
261
+ engine_str = engine_str.replace(f'{self.flavor}', 'postgresql', 1)
262
+ elif _uri.startswith('postgresql://'):
263
+ engine_str = engine_str.replace('postgresql://', 'postgresql+psycopg2://')
261
264
 
262
265
  if debug:
263
266
  dprint(
@@ -303,7 +306,7 @@ def create_engine(
303
306
  echo = debug,
304
307
  **_create_engine_args
305
308
  )
306
- except Exception as e:
309
+ except Exception:
307
310
  warn(f"Failed to create connector '{self}':\n{traceback.format_exc()}", stack=False)
308
311
  engine = None
309
312
 
@@ -43,7 +43,9 @@ def register_user(
43
43
  'password_hash': user.password_hash,
44
44
  'user_type': user.type,
45
45
  'attributes': (
46
- json.dumps(user.attributes) if self.flavor not in json_flavors else user.attributes
46
+ json.dumps(user.attributes)
47
+ if self.flavor not in json_flavors
48
+ else user.attributes
47
49
  ),
48
50
  }
49
51
  if old_id is not None:
@@ -109,7 +111,7 @@ def edit_user(
109
111
  user_id = user.user_id if user.user_id is not None else self.get_user_id(user, debug=debug)
110
112
  if user_id is None:
111
113
  return False, (
112
- f"User '{user.username}' does not exist. " +
114
+ f"User '{user.username}' does not exist. "
113
115
  f"Register user '{user.username}' before editing."
114
116
  )
115
117
  user.user_id = user_id
@@ -7,6 +7,7 @@ Verify the contents of a pipe by resyncing its interval.
7
7
  """
8
8
 
9
9
  from datetime import datetime, timedelta
10
+ import time
10
11
 
11
12
  import meerschaum as mrsm
12
13
  from meerschaum.utils.typing import SuccessTuple, Any, Optional, Union, Tuple, Dict
@@ -183,6 +184,7 @@ def verify(
183
184
  )
184
185
  )
185
186
  message_header = f"{begin_to_print} - {end_to_print}"
187
+ max_chunks_syncs = mrsm.get_config('pipes', 'verify', 'max_chunks_syncs')
186
188
 
187
189
  info(
188
190
  f"Verifying {self}:\n Syncing {len(chunk_bounds)} chunk"
@@ -219,9 +221,9 @@ def verify(
219
221
  debug=debug,
220
222
  )
221
223
  checked_rows_str = (
222
- f"checked {existing_rowcount} row"
224
+ f"checked {existing_rowcount:,} row"
223
225
  + ("s" if existing_rowcount != 1 else '')
224
- + f" vs {remote_rowcount} remote"
226
+ + f" vs {remote_rowcount:,} remote"
225
227
  )
226
228
  if (
227
229
  existing_rowcount is not None
@@ -239,19 +241,26 @@ def verify(
239
241
  f"Row-counts are out-of-sync ({checked_rows_str})."
240
242
  )
241
243
 
242
- chunk_success, chunk_msg = self.sync(
243
- begin=chunk_begin,
244
- end=chunk_end,
245
- params=params,
246
- workers=_workers,
247
- debug=debug,
248
- **kwargs
249
- ) if do_sync else (chunk_success, chunk_msg)
244
+ num_syncs = 0
245
+ while num_syncs < max_chunks_syncs:
246
+ chunk_success, chunk_msg = self.sync(
247
+ begin=chunk_begin,
248
+ end=chunk_end,
249
+ params=params,
250
+ workers=_workers,
251
+ debug=debug,
252
+ **kwargs
253
+ ) if do_sync else (chunk_success, chunk_msg)
254
+ if chunk_success:
255
+ break
256
+ num_syncs += 1
257
+ time.sleep(num_syncs**2)
250
258
  chunk_msg = chunk_msg.strip()
251
259
  if ' - ' not in chunk_msg:
252
260
  chunk_label = f"{chunk_begin} - {chunk_end}"
253
261
  chunk_msg = f'Verified chunk for {self}:\n{chunk_label}\n{chunk_msg}'
254
262
  mrsm.pprint((chunk_success, chunk_msg))
263
+
255
264
  return chunk_begin_and_end, (chunk_success, chunk_msg)
256
265
 
257
266
  ### If we have more than one chunk, attempt to sync the first one and return if its fails.
@@ -222,7 +222,7 @@ def filter_unseen_df(
222
222
  numeric_cols_precisions_scales = {
223
223
  col: get_numeric_precision_scale(None, typ)
224
224
  for col, typ in dtypes.items()
225
- if col and typ and typ.startswith('numeric')
225
+ if col and str(typ).lower().startswith('numeric')
226
226
  }
227
227
 
228
228
  dt_dtypes = {
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: meerschaum
3
- Version: 2.8.2
3
+ Version: 2.8.3
4
4
  Summary: Sync Time-Series Pipes with Meerschaum
5
5
  Home-page: https://meerschaum.io
6
6
  Author: Bennett Meares
@@ -52,7 +52,7 @@ meerschaum/actions/tag.py,sha256=SJf5qFW0ccLXjqlTdkK_0MCcrCMdg6xhYrhKdco0hdA,305
52
52
  meerschaum/actions/uninstall.py,sha256=tBXhdXggSieGEQe4EPGxpgMK0MZTJCweNvAJ9-59El0,5776
53
53
  meerschaum/actions/upgrade.py,sha256=AjuC93Te-I_GWwIfuNkFJ2q1zVHDQ2Oco34S4JgK2iA,6485
54
54
  meerschaum/actions/verify.py,sha256=81Km4sPkLVAzPG6pDbMfoBpEWsk8pxjVGXgu-k8seSs,5019
55
- meerschaum/api/__init__.py,sha256=X_ZM0v1OmNBRO9yOeiF6pR7lBvPZcl13jttHBhjteRk,10049
55
+ meerschaum/api/__init__.py,sha256=3mgIsSGCefplGlRWyHShajFUm83LdnO925FikKlv0jI,10243
56
56
  meerschaum/api/_chain.py,sha256=h8-WXUGXX6AqzdALfsBC5uv0FkAcLdHJXCGzqzuq89k,875
57
57
  meerschaum/api/_events.py,sha256=f-98AXHU10IL9zRGX1FrZFANxxiMz5ryeJnfFWaU8R8,2232
58
58
  meerschaum/api/_exceptions.py,sha256=xfbWp8F8JYrMUdtDXesn8C8e39_jAXHz51IosIGjkVM,463
@@ -126,7 +126,7 @@ meerschaum/api/routes/_index.py,sha256=Z8kuyqm3vmJadw8iIYyswYI4-3IOJ7KXdkhDTv1oU
126
126
  meerschaum/api/routes/_jobs.py,sha256=sEt-UtVd5pN-hJgikTvj1oTKJQ2hhNe8XhjkclwOXOE,12568
127
127
  meerschaum/api/routes/_login.py,sha256=tygEp50EVOMgvTG6CEASlShflbtEK8viJ9O07o0lnnE,2434
128
128
  meerschaum/api/routes/_misc.py,sha256=XxfSvXNGAm8rdvXePXWxX8wc5tjeAdBOSZwYveL3oAM,2591
129
- meerschaum/api/routes/_pipes.py,sha256=kwXuYh8Tm0ZEdjsqywLHXuu7VrU-8vuaRogbT9y2cPs,25403
129
+ meerschaum/api/routes/_pipes.py,sha256=eITQRzvMfa2WY9r_FIPIH3LlnE1TOcy-J2bic2wGwno,25262
130
130
  meerschaum/api/routes/_plugins.py,sha256=okstNlv9Bhoiy6JvQWgwjxEi4kQ8adPUcir6k3Y7hH8,6329
131
131
  meerschaum/api/routes/_users.py,sha256=i55LuLTQ2cuzIyWz0PxkWji6aQQUIBPf_FEryKwXI50,7197
132
132
  meerschaum/api/routes/_version.py,sha256=-3A0i4Gk54netFOOwjI_x3YQik9vgHjtq7G_VYbzIJo,750
@@ -134,7 +134,7 @@ meerschaum/api/routes/_webterm.py,sha256=S7RXV8vvaTFbmVeehh4UhyXb4NCgcsyOQzoAG7j
134
134
  meerschaum/api/tables/__init__.py,sha256=e2aNC0CdlWICTUMx1i9RauF8Pm426J0RZJbsJWv4SWo,482
135
135
  meerschaum/config/__init__.py,sha256=5ZBq71P9t3nb74r5CGvMfNuauPscfegBX-nkaAUi5C4,11541
136
136
  meerschaum/config/_dash.py,sha256=BJHl4xMrQB-YHUEU7ldEW8q_nOPoIRSOqLrfGElc6Dw,187
137
- meerschaum/config/_default.py,sha256=F5xaXGQ6-v0fZpmUj2y8qE7iO-enQviwGAnUbvz8_3k,6419
137
+ meerschaum/config/_default.py,sha256=F1xVug-lhVeIXTL1wvHrIPFmBsL2dGz4lHFakIleeZk,6473
138
138
  meerschaum/config/_edit.py,sha256=M9yX_SDD24gV5kWITZpy7p9AWTizJsIAGWAs3WZx-Ws,9087
139
139
  meerschaum/config/_environment.py,sha256=Vv4DLDfc2vKLbCLsMvkQDj77K4kEvHKEBmUBo-wCrgo,4419
140
140
  meerschaum/config/_formatting.py,sha256=OMuqS1EWOsj_34wSs2tOqGIWci3bTMIZ5l-uelZgsIM,6672
@@ -145,7 +145,7 @@ meerschaum/config/_preprocess.py,sha256=-AEA8m_--KivZwTQ1sWN6LTn5sio_fUr2XZ51BO6
145
145
  meerschaum/config/_read_config.py,sha256=RLC3HHi_1ndj7ITVDKLD9_uULY3caGRwSz3ATYE-ixA,15014
146
146
  meerschaum/config/_shell.py,sha256=46_m49Txc5q1rGfCgO49ca48BODx45DQJi8D0zz1R18,4245
147
147
  meerschaum/config/_sync.py,sha256=jHcWRkxd82_BgX8Xo8agsWvf7BSbv3qHLWmYl6ehp_0,4242
148
- meerschaum/config/_version.py,sha256=B0gGbZXyLfnqfiT23qBJe-NHZMivqpuqpG5wrd_mK5o,71
148
+ meerschaum/config/_version.py,sha256=D5OmoCDgj2pHwQuMvP2bpXNp9kyBtMIihn1h-y2p88k,71
149
149
  meerschaum/config/paths.py,sha256=JjibeGN3YAdSNceRwsd42aNmeUrIgM6ndzC8qZAmNI0,621
150
150
  meerschaum/config/resources/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
151
151
  meerschaum/config/stack/__init__.py,sha256=2UukC0Lmk-aVL1o1qXzumqmuIrw3vu9fD7iCuz4XD4I,10544
@@ -153,7 +153,7 @@ meerschaum/config/stack/grafana/__init__.py,sha256=LNXQw2FvHKrD68RDhqDmi2wJjAHaK
153
153
  meerschaum/config/stack/mosquitto/__init__.py,sha256=-OwOjq8KiBoSH_pmgCAAF3Dp3CRD4KgAEdimZSadROs,186
154
154
  meerschaum/config/stack/mosquitto/resources/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
155
155
  meerschaum/config/stack/resources/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
156
- meerschaum/config/static/__init__.py,sha256=X2iAAJs2OFRolAUApHY6MLcSmc9PG3QgcKyacRmO9wg,5519
156
+ meerschaum/config/static/__init__.py,sha256=ccm5oaYnLu0j5B85C9a8Y7jWsw4ReJq5RqyvLd-rW_s,5519
157
157
  meerschaum/connectors/_Connector.py,sha256=VaVNg0SlQCTXk4shl3c68QdkbymA2Y9ScUlUjckk8PY,6795
158
158
  meerschaum/connectors/__init__.py,sha256=bpWsnU0uvoowWyUkFTwfEkadK84pssZUJ4M7yReudOU,12703
159
159
  meerschaum/connectors/parse.py,sha256=tnqzkzt_suOXYzktn_XVUrprtfym9ThijUf8HXZZlhY,4194
@@ -174,15 +174,15 @@ meerschaum/connectors/plugin/PluginConnector.py,sha256=aQ1QaB7MordCFimZqoGLb0R12
174
174
  meerschaum/connectors/plugin/__init__.py,sha256=pwF7TGY4WNz2_HaVdmK4rPQ9ZwTOEuPHgzOqsGcoXJw,198
175
175
  meerschaum/connectors/sql/_SQLConnector.py,sha256=B2-ltIIQy_n2qjeeT-sZk60tLJrg2Oefscytt7sGqb4,12083
176
176
  meerschaum/connectors/sql/__init__.py,sha256=3cqYiDkVasn7zWdtOTAZbT4bo95AuvGOmDD2TkaAxtw,205
177
- meerschaum/connectors/sql/_cli.py,sha256=xzTPMplDU-E2kPq_gPgN1Cq9RqpcEFwGavAYunAwEaw,4873
178
- meerschaum/connectors/sql/_create_engine.py,sha256=VfGtqF2hDNbgl2g-ZPcz28gKkfL6UOk4rKxUB4tKHdU,10567
177
+ meerschaum/connectors/sql/_cli.py,sha256=3wXRfPSr5mXlM6Wt8UqrBYfWvkLVZ4jTzKRUd04enCo,5116
178
+ meerschaum/connectors/sql/_create_engine.py,sha256=h7c1nwdDWi33PBkRioPomHRT8h1DLc08EQ7INWyC_1Q,10717
179
179
  meerschaum/connectors/sql/_fetch.py,sha256=mVe5zQo7SM9PSUU3Vjhacg4Bq1-Vttb7KkXL4p5YQdQ,12818
180
180
  meerschaum/connectors/sql/_instance.py,sha256=xCc8M0xWMzF5Tu_1uWIFivAoHey5N1ccFhN_Z7u04zk,6304
181
181
  meerschaum/connectors/sql/_pipes.py,sha256=8pp10lOYX8oVEqKHB9907Jny4nkT9fTgF8PrvhsdohI,128855
182
182
  meerschaum/connectors/sql/_plugins.py,sha256=OVEdZ_UHTi-x5sF-5lu2TmR9ONxddp6SwDOmFo5TpU8,8051
183
183
  meerschaum/connectors/sql/_sql.py,sha256=3hrANOId2DAoXsl8nvePnxvoXo5rtB5UfQsJK_fCY9s,42696
184
184
  meerschaum/connectors/sql/_uri.py,sha256=BFzu5pjlbL3kxLH13vHWlpKGYTPfg8wuA2j58O9NsCM,3440
185
- meerschaum/connectors/sql/_users.py,sha256=Dbe79FV07ms5QVHwp68cruDzkGeKR4cE1-xc9Gza8Hs,9932
185
+ meerschaum/connectors/sql/_users.py,sha256=mRyjsUCfPV52nfTQUbpu9gMXfV_DHXNqEhw4N-lSS4Q,9954
186
186
  meerschaum/connectors/sql/tools.py,sha256=jz8huOaRCwGlYdtGfAqAh7SoK8uydYBrasKQba9FT38,187
187
187
  meerschaum/connectors/sql/tables/__init__.py,sha256=53EeJsvmGjj68SpSShdt6kyLuk5Md5O8DnvWC1ra3u8,8876
188
188
  meerschaum/connectors/sql/tables/types.py,sha256=Jc_MTHIBM-KHpQt__Lckp39CeOo7tGOiAk5faDx-znY,1573
@@ -209,7 +209,7 @@ meerschaum/core/Pipe/_index.py,sha256=cYgaVwBVfAYxJBZ6j6MXDqOxnOrD_QnYi33_kIwy_F
209
209
  meerschaum/core/Pipe/_register.py,sha256=Sd5xaAW8H7uLTIoommcKb-6kHPRuHJLWNSbPnt2UbvA,2240
210
210
  meerschaum/core/Pipe/_show.py,sha256=nG50y8eBT9TVuKkRgAKtNDNIxysJvMNxfu__lkL1F9k,1352
211
211
  meerschaum/core/Pipe/_sync.py,sha256=NGiGhBI7M_nyIvVvyIA9_4jUKis1YpK4YL_pnceYGjg,38077
212
- meerschaum/core/Pipe/_verify.py,sha256=3BcFYGYCTQMTiAA7SVbWuKlTKPr96XYYgbdEMqk2bpM,21630
212
+ meerschaum/core/Pipe/_verify.py,sha256=OBjN7rxf1csUxV29fWy50ZpEtSycBs4RTqWmdkjikUA,21939
213
213
  meerschaum/core/Plugin/__init__.py,sha256=UXg64EvJPgI1PCxkY_KM02-ZmBm4FZpLPIQR_uSJJDc,137
214
214
  meerschaum/core/User/_User.py,sha256=qbI0GIkr3G0PI4d9S49uatbJQ2kH_-z5-GoVJ0fuEtA,6624
215
215
  meerschaum/core/User/__init__.py,sha256=8WkDRSBmxsprnKE7GB6j1yXSfEz9RinRkSzW0bzVP1I,870
@@ -222,7 +222,7 @@ meerschaum/plugins/__init__.py,sha256=Kl7Dz0CwUUxyjRC5RWnYo6WMLsOvdX2eQ38Rh3Bjdz
222
222
  meerschaum/plugins/bootstrap.py,sha256=VwjpZAuYdqPJW0YoVgAoM_taHkdQHqP902-8T7OWWCI,11339
223
223
  meerschaum/utils/__init__.py,sha256=QrK1K9hIbPCRCM5k2nZGFqGnrqhA0Eh-iSmCU7FG6Cs,612
224
224
  meerschaum/utils/_get_pipes.py,sha256=tu4xKPoDn79Dz2kWM13cXTP4DSCkn-3G9M8KiLftopw,11073
225
- meerschaum/utils/dataframe.py,sha256=eMJO7WnHsbYpRiidOE0i2qSPsnsusvGQon186dF_VRA,49336
225
+ meerschaum/utils/dataframe.py,sha256=f9h3fmG_ePHHls2NQmGHNqUurUEZBBvpS1UR7tQgwjI,49341
226
226
  meerschaum/utils/debug.py,sha256=GyIzJmunkoPnOcZNYVQdT4Sgd-aOb5MI2VbIgATOjIQ,3695
227
227
  meerschaum/utils/interactive.py,sha256=t-6jWozXSqL7lYGDHuwiOjTgr-UKhdcg61q_eR5mikI,3196
228
228
  meerschaum/utils/misc.py,sha256=8TOQQlFyF_aYnc8tnx98lccXr9tFrdlS-ngXeOQjHHY,47407
@@ -254,11 +254,11 @@ meerschaum/utils/packages/_packages.py,sha256=UcQ0yEK3lIy4jSETHxrOylArUw5qnf6RFS
254
254
  meerschaum/utils/packages/lazy_loader.py,sha256=VHnph3VozH29R4JnSSBfwtA5WKZYZQFT_GeQSShCnuc,2540
255
255
  meerschaum/utils/venv/_Venv.py,sha256=gc1TCeAj-kTZbQFAT9xl1bi4HXFV5ApT0dPOJfxwr78,3748
256
256
  meerschaum/utils/venv/__init__.py,sha256=-Mpfvz1mJ41TzVL0xKJCKOsU3nFi6XabbNiN7UbdVXs,27067
257
- meerschaum-2.8.2.dist-info/LICENSE,sha256=jG2zQEdRNt88EgHUWPpXVWmOrOduUQRx7MnYV9YIPaw,11359
258
- meerschaum-2.8.2.dist-info/METADATA,sha256=BbCV2FeNpThFdyh2xezk358MuN_0KrxqiyI9r9wnlU4,24489
259
- meerschaum-2.8.2.dist-info/NOTICE,sha256=OTA9Fcthjf5BRvWDDIcBC_xfLpeDV-RPZh3M-HQBRtQ,114
260
- meerschaum-2.8.2.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
261
- meerschaum-2.8.2.dist-info/entry_points.txt,sha256=5YBVzibw-0rNA_1VjB16z5GABsOGf-CDhW4yqH8C7Gc,88
262
- meerschaum-2.8.2.dist-info/top_level.txt,sha256=bNoSiDj0El6buocix-FRoAtJOeq1qOF5rRm2u9i7Q6A,11
263
- meerschaum-2.8.2.dist-info/zip-safe,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
264
- meerschaum-2.8.2.dist-info/RECORD,,
257
+ meerschaum-2.8.3.dist-info/LICENSE,sha256=jG2zQEdRNt88EgHUWPpXVWmOrOduUQRx7MnYV9YIPaw,11359
258
+ meerschaum-2.8.3.dist-info/METADATA,sha256=-3ku-lStPrYFIaHj31hcRmWClB_cPn2Z5c0gshj_01g,24489
259
+ meerschaum-2.8.3.dist-info/NOTICE,sha256=OTA9Fcthjf5BRvWDDIcBC_xfLpeDV-RPZh3M-HQBRtQ,114
260
+ meerschaum-2.8.3.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
261
+ meerschaum-2.8.3.dist-info/entry_points.txt,sha256=5YBVzibw-0rNA_1VjB16z5GABsOGf-CDhW4yqH8C7Gc,88
262
+ meerschaum-2.8.3.dist-info/top_level.txt,sha256=bNoSiDj0El6buocix-FRoAtJOeq1qOF5rRm2u9i7Q6A,11
263
+ meerschaum-2.8.3.dist-info/zip-safe,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
264
+ meerschaum-2.8.3.dist-info/RECORD,,