meerschaum 2.2.5.dev0__py3-none-any.whl → 2.2.5.dev3__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (30) hide show
  1. meerschaum/_internal/arguments/_parse_arguments.py +23 -14
  2. meerschaum/_internal/arguments/_parser.py +4 -2
  3. meerschaum/_internal/docs/index.py +31 -125
  4. meerschaum/_internal/shell/Shell.py +0 -3
  5. meerschaum/actions/bootstrap.py +14 -235
  6. meerschaum/actions/edit.py +98 -15
  7. meerschaum/actions/show.py +13 -4
  8. meerschaum/actions/stack.py +12 -12
  9. meerschaum/actions/uninstall.py +24 -29
  10. meerschaum/api/__init__.py +0 -1
  11. meerschaum/api/dash/__init__.py +0 -1
  12. meerschaum/api/dash/callbacks/custom.py +1 -1
  13. meerschaum/api/dash/plugins.py +5 -6
  14. meerschaum/config/__init__.py +16 -6
  15. meerschaum/config/_version.py +1 -1
  16. meerschaum/core/Pipe/_fetch.py +25 -21
  17. meerschaum/core/Pipe/_sync.py +89 -59
  18. meerschaum/plugins/bootstrap.py +333 -0
  19. meerschaum/utils/formatting/__init__.py +22 -10
  20. meerschaum/utils/prompt.py +11 -4
  21. meerschaum/utils/warnings.py +1 -0
  22. {meerschaum-2.2.5.dev0.dist-info → meerschaum-2.2.5.dev3.dist-info}/METADATA +1 -1
  23. {meerschaum-2.2.5.dev0.dist-info → meerschaum-2.2.5.dev3.dist-info}/RECORD +29 -29
  24. meerschaum/actions/backup.py +0 -43
  25. {meerschaum-2.2.5.dev0.dist-info → meerschaum-2.2.5.dev3.dist-info}/LICENSE +0 -0
  26. {meerschaum-2.2.5.dev0.dist-info → meerschaum-2.2.5.dev3.dist-info}/NOTICE +0 -0
  27. {meerschaum-2.2.5.dev0.dist-info → meerschaum-2.2.5.dev3.dist-info}/WHEEL +0 -0
  28. {meerschaum-2.2.5.dev0.dist-info → meerschaum-2.2.5.dev3.dist-info}/entry_points.txt +0 -0
  29. {meerschaum-2.2.5.dev0.dist-info → meerschaum-2.2.5.dev3.dist-info}/top_level.txt +0 -0
  30. {meerschaum-2.2.5.dev0.dist-info → meerschaum-2.2.5.dev3.dist-info}/zip-safe +0 -0
@@ -7,6 +7,7 @@ Functions for editing elements belong here.
7
7
  """
8
8
 
9
9
  from __future__ import annotations
10
+ import meerschaum as mrsm
10
11
  from meerschaum.utils.typing import List, Any, SuccessTuple, Optional, Dict
11
12
 
12
13
  def edit(
@@ -22,19 +23,22 @@ def edit(
22
23
  'pipes' : _edit_pipes,
23
24
  'definition': _edit_definition,
24
25
  'users' : _edit_users,
26
+ 'plugins' : _edit_plugins,
25
27
  }
26
28
  return choose_subaction(action, options, **kw)
27
29
 
28
30
 
29
31
  def _complete_edit(
30
- action: Optional[List[str]] = None,
31
- **kw: Any
32
- ) -> List[str]:
32
+ action: Optional[List[str]] = None,
33
+ **kw: Any
34
+ ) -> List[str]:
33
35
  """
34
36
  Override the default Meerschaum `complete_` function.
35
37
  """
36
38
  options = {
37
39
  'config': _complete_edit_config,
40
+ 'plugin': _complete_edit_plugins,
41
+ 'plugins': _complete_edit_plugins,
38
42
  }
39
43
 
40
44
  if action is None:
@@ -78,7 +82,7 @@ def _edit_config(action : Optional[List[str]] = None, **kw : Any) -> SuccessTupl
78
82
  action.append('meerschaum')
79
83
  return edit_config(keys=action, **kw)
80
84
 
81
- def _complete_edit_config(action: Optional[List[str]] = None, **kw : Any) -> List[str]:
85
+ def _complete_edit_config(action: Optional[List[str]] = None, **kw: Any) -> List[str]:
82
86
  from meerschaum.config._read_config import get_possible_keys
83
87
  keys = get_possible_keys()
84
88
  if not action:
@@ -172,9 +176,9 @@ def _edit_pipes(
172
176
 
173
177
 
174
178
  def _edit_definition(
175
- action: Optional[List[str]] = None,
176
- **kw
177
- ) -> SuccessTuple:
179
+ action: Optional[List[str]] = None,
180
+ **kw
181
+ ) -> SuccessTuple:
178
182
  """
179
183
  Edit pipes' definitions.
180
184
  Alias for `edit pipes definition`.
@@ -183,13 +187,13 @@ def _edit_definition(
183
187
 
184
188
 
185
189
  def _edit_users(
186
- action: Optional[List[str]] = None,
187
- mrsm_instance: Optional[str] = None,
188
- yes: bool = False,
189
- noask: bool = False,
190
- debug: bool = False,
191
- **kw: Any
192
- ) -> SuccessTuple:
190
+ action: Optional[List[str]] = None,
191
+ mrsm_instance: Optional[str] = None,
192
+ yes: bool = False,
193
+ noask: bool = False,
194
+ debug: bool = False,
195
+ **kw: Any
196
+ ) -> SuccessTuple:
193
197
  """
194
198
  Edit users' registration information.
195
199
  """
@@ -262,7 +266,7 @@ def _edit_users(
262
266
  if not action:
263
267
  return False, "No users to edit."
264
268
 
265
- success = dict()
269
+ success = {}
266
270
  for username in action:
267
271
  try:
268
272
  user = build_user(username)
@@ -289,6 +293,85 @@ def _edit_users(
289
293
  info(msg)
290
294
  return True, msg
291
295
 
296
+
297
+ def _edit_plugins(
298
+ action: Optional[List[str]] = None,
299
+ debug: bool = False,
300
+ **kwargs: Any
301
+ ):
302
+ """
303
+ Edit a plugin's source code.
304
+ """
305
+ import pathlib
306
+ from meerschaum.utils.warnings import warn
307
+ from meerschaum.utils.prompt import prompt, yes_no
308
+ from meerschaum.utils.misc import edit_file
309
+ from meerschaum.utils.packages import reload_meerschaum
310
+ from meerschaum.actions import actions
311
+
312
+ if not action:
313
+ return False, "Specify which plugin to edit."
314
+
315
+ for plugin_name in action:
316
+ plugin = mrsm.Plugin(plugin_name)
317
+
318
+ if not plugin.is_installed():
319
+ warn(f"Plugin '{plugin_name}' is not installed.", stack=False)
320
+
321
+ if not yes_no(
322
+ f"Would you like to create a new plugin '{plugin_name}'?",
323
+ **kwargs
324
+ ):
325
+ return False, f"Plugin '{plugin_name}' does not exist."
326
+
327
+ actions['bootstrap'](
328
+ ['plugins', plugin_name],
329
+ debug = debug,
330
+ **kwargs
331
+ )
332
+ continue
333
+
334
+ plugin_file_path = pathlib.Path(plugin.__file__).resolve()
335
+
336
+ try:
337
+ _ = prompt(f"Press [Enter] to open '{plugin_file_path}':", icon=False)
338
+ except (KeyboardInterrupt, Exception):
339
+ continue
340
+
341
+ edit_file(plugin_file_path)
342
+ reload_meerschaum(debug=debug)
343
+
344
+ return True, "Success"
345
+
346
+
347
+ def _complete_edit_plugins(
348
+ action: Optional[List[str]] = None,
349
+ line: Optional[str] = None,
350
+ **kw: Any
351
+ ) -> List[str]:
352
+ from meerschaum.plugins import get_plugins_names
353
+ plugins_names = get_plugins_names(try_import=False)
354
+ if not action:
355
+ return plugins_names
356
+
357
+ last_word = action[-1]
358
+ if last_word in plugins_names and (line or '')[-1] == ' ':
359
+ return [
360
+ plugin_name
361
+ for plugin_name in plugins_names
362
+ if plugin_name not in action
363
+ ]
364
+
365
+ possibilities = []
366
+ for plugin_name in plugins_names:
367
+ if (
368
+ plugin_name.startswith(last_word)
369
+ and plugin_name not in action
370
+ ):
371
+ possibilities.append(plugin_name)
372
+ return possibilities
373
+
374
+
292
375
  ### NOTE: This must be the final statement of the module.
293
376
  ### Any subactions added below these lines will not
294
377
  ### be added to the `help` docstring.
@@ -219,15 +219,24 @@ def _show_connectors(
219
219
  from meerschaum.config import get_config
220
220
  from meerschaum.utils.formatting import make_header
221
221
  from meerschaum.utils.formatting import pprint
222
+
223
+ conn_type = action[0].split(':')[0] if action else None
224
+
222
225
  if not nopretty:
223
- print(make_header("\nConfigured connectors:"))
224
- pprint(get_config('meerschaum', 'connectors'), nopretty=nopretty)
225
- if not nopretty:
226
+ print(make_header(
227
+ f"""\nConfigured {"'" + (conn_type + "' ") if conn_type else ''}Connectors:"""
228
+ ))
229
+
230
+ keys = ['meerschaum', 'connectors']
231
+ if conn_type:
232
+ keys.append(conn_type)
233
+ pprint(get_config(*keys), nopretty=nopretty)
234
+ if not nopretty and not conn_type:
226
235
  print(make_header("\nActive connectors:"))
227
236
  pprint(connectors, nopretty=nopretty)
228
237
 
229
238
  from meerschaum.connectors.parse import parse_instance_keys
230
- if action:
239
+ if action and ':' in action[0]:
231
240
  attr, keys = parse_instance_keys(action[0], construct=False, as_tuple=True, debug=debug)
232
241
  if attr:
233
242
  if not nopretty:
@@ -7,7 +7,7 @@ Functions for running the Docker Compose stack
7
7
  """
8
8
 
9
9
  from __future__ import annotations
10
- from meerschaum.utils.typing import SuccessTuple, Any, List, Optional
10
+ from meerschaum.utils.typing import SuccessTuple, Any, List, Optional, Union
11
11
 
12
12
  def stack(
13
13
  action: Optional[List[str]] = None,
@@ -19,7 +19,7 @@ def stack(
19
19
  debug: bool = False,
20
20
  _capture_output: bool = False,
21
21
  **kw: Any
22
- ) -> SuccessTuple:
22
+ ) -> Union[SuccessTuple, 'subprocess.Popen']:
23
23
  """
24
24
  Control the Meerschaum stack with Docker Compose.
25
25
  Usage: `stack {command}`
@@ -147,18 +147,18 @@ def stack(
147
147
  ['docker', 'compose'] if has_builtin_compose
148
148
  else ['docker-compose']
149
149
  ) + cmd_list,
150
- cwd = STACK_COMPOSE_PATH.parent,
151
- stdout = stdout,
152
- stderr = stderr,
153
- env = stack_env_dict,
150
+ cwd=STACK_COMPOSE_PATH.parent,
151
+ stdout=stdout,
152
+ stderr=stderr,
153
+ env=stack_env_dict,
154
154
  ) if (has_builtin_compose or has_binary_compose) else run_python_package(
155
155
  'compose',
156
- args = cmd_list,
157
- cwd = STACK_COMPOSE_PATH.parent,
158
- venv = _compose_venv,
159
- capture_output = _capture_output,
160
- as_proc = True,
161
- env = stack_env_dict,
156
+ args=cmd_list,
157
+ cwd=STACK_COMPOSE_PATH.parent,
158
+ venv=_compose_venv,
159
+ capture_output=_capture_output,
160
+ as_proc=True,
161
+ env=stack_env_dict,
162
162
  )
163
163
  try:
164
164
  rc = proc.wait() if proc is not None else 1
@@ -25,9 +25,9 @@ def uninstall(
25
25
 
26
26
 
27
27
  def _complete_uninstall(
28
- action: Optional[List[str]] = None,
29
- **kw: Any
30
- ) -> List[str]:
28
+ action: Optional[List[str]] = None,
29
+ **kw: Any
30
+ ) -> List[str]:
31
31
  """
32
32
  Override the default Meerschaum `complete_` function.
33
33
  """
@@ -49,15 +49,16 @@ def _complete_uninstall(
49
49
  from meerschaum._internal.shell import default_action_completer
50
50
  return default_action_completer(action=(['uninstall'] + action), **kw)
51
51
 
52
+
52
53
  def _uninstall_plugins(
53
- action: Optional[List[str]] = None,
54
- repository: Optional[str] = None,
55
- yes: bool = False,
56
- force: bool = False,
57
- noask: bool = False,
58
- debug: bool = False,
59
- **kw: Any
60
- ) -> SuccessTuple:
54
+ action: Optional[List[str]] = None,
55
+ repository: Optional[str] = None,
56
+ yes: bool = False,
57
+ force: bool = False,
58
+ noask: bool = False,
59
+ debug: bool = False,
60
+ **kw: Any
61
+ ) -> SuccessTuple:
61
62
  """
62
63
  Remove installed plugins. Does not affect repository registrations.
63
64
  """
@@ -135,26 +136,20 @@ def _uninstall_plugins(
135
136
 
136
137
 
137
138
  def _complete_uninstall_plugins(action: Optional[List[str]] = None, **kw) -> List[str]:
138
- from meerschaum.plugins import get_plugins_names
139
- _plugin_names = get_plugins_names()
140
- if not action:
141
- return _plugin_names
142
- possibilities = []
143
- for name in _plugin_names:
144
- if name.startswith(action[0]) and action[0] != name:
145
- possibilities.append(name)
146
- return possibilities
139
+ from meerschaum.actions.edit import _complete_edit_plugins
140
+ return _complete_edit_plugins(action=action, **kw)
141
+
147
142
 
148
143
  def _uninstall_packages(
149
- action: Optional[List[str]] = None,
150
- sub_args: Optional[List[str]] = None,
151
- venv: Optional[str] = 'mrsm',
152
- yes: bool = False,
153
- force: bool = False,
154
- noask: bool = False,
155
- debug: bool = False,
156
- **kw: Any
157
- ) -> SuccessTuple:
144
+ action: Optional[List[str]] = None,
145
+ sub_args: Optional[List[str]] = None,
146
+ venv: Optional[str] = 'mrsm',
147
+ yes: bool = False,
148
+ force: bool = False,
149
+ noask: bool = False,
150
+ debug: bool = False,
151
+ **kw: Any
152
+ ) -> SuccessTuple:
158
153
  """
159
154
  Uninstall PyPI packages from the Meerschaum virtual environment.
160
155
 
@@ -237,4 +237,3 @@ for module_name, functions_list in _api_plugins.items():
237
237
  + f"when executing function '{function.__name__}' with exception:\n{e}",
238
238
  stack=False,
239
239
  )
240
-
@@ -50,7 +50,6 @@ stylesheets = [
50
50
  '/static/css/bootstrap.min.css',
51
51
  '/static/css/dbc_dark.css',
52
52
  '/static/css/dash.css',
53
- # '/static/js/node_modules/xterm/css/xterm.css',
54
53
  ]
55
54
  scripts = ['/static/js/node_modules/xterm/lib/xterm.js']
56
55
  dash_app = enrich.DashProxy(
@@ -21,7 +21,7 @@ def init_dash_plugins():
21
21
  for _function in _functions:
22
22
  try:
23
23
  _function(dash_app)
24
- except Exception as e:
24
+ except Exception:
25
25
  warn(
26
26
  f"Failed to load function '{_function.__name__}' "
27
27
  + f"from plugin '{_module_name}':\n"
@@ -7,7 +7,7 @@ Functions for interacting with plugins via the web interface.
7
7
  """
8
8
 
9
9
  from __future__ import annotations
10
- from meerschaum.utils.typing import List, Tuple, SuccessTuple
10
+ from meerschaum.utils.typing import List, Tuple, SuccessTuple, Optional, WebState, Dict, Any
11
11
  from meerschaum.utils.packages import import_dcc, import_html
12
12
  from meerschaum.api import get_api_connector, endpoints, CHECK_UPDATE
13
13
  html, dcc = import_html(check_update=CHECK_UPDATE), import_dcc(check_update=CHECK_UPDATE)
@@ -17,10 +17,10 @@ from meerschaum.api.dash import dash_app, debug, active_sessions
17
17
 
18
18
 
19
19
  def get_plugins_cards(
20
- state: Optional[WebState] = None,
21
- search_term: Optional[str] = None,
22
- session_data: Optional[Dict[str, Any]] = None,
23
- ) -> Tuple[List[dbc.Card], List[SuccessTuple]]:
20
+ state: Optional[WebState] = None,
21
+ search_term: Optional[str] = None,
22
+ session_data: Optional[Dict[str, Any]] = None,
23
+ ) -> Tuple[List[dbc.Card], List[SuccessTuple]]:
24
24
  """
25
25
  Return the cards and alerts for plugins.
26
26
  """
@@ -96,4 +96,3 @@ def is_plugin_owner(plugin_name: str, session_data: Dict['str', Any]) -> bool:
96
96
  _username is not None
97
97
  and _username == _plugin_username
98
98
  )
99
-
@@ -12,7 +12,7 @@ from __future__ import annotations
12
12
  import os, shutil, sys, pathlib, copy
13
13
  from meerschaum.utils.typing import Any, Dict, Optional, Union
14
14
  from meerschaum.utils.threading import RLock
15
- from meerschaum.utils.warnings import warn
15
+ from meerschaum.utils.warnings import warn, error
16
16
 
17
17
  from meerschaum.config._version import __version__
18
18
  from meerschaum.config._edit import edit_config, write_config
@@ -239,17 +239,28 @@ def get_config(
239
239
  return c
240
240
 
241
241
 
242
- def get_plugin_config(*keys : str, **kw : Any) -> Optional[Any]:
242
+ def get_plugin_config(
243
+ *keys: str,
244
+ warn: bool = False,
245
+ **kw: Any
246
+ ) -> Optional[Any]:
243
247
  """
244
248
  This may only be called from within a Meerschaum plugin.
245
249
  See `meerschaum.config.get_config` for arguments.
246
250
  """
247
- from meerschaum.utils.warnings import warn, error
248
251
  from meerschaum.plugins import _get_parent_plugin
249
252
  parent_plugin_name = _get_parent_plugin(2)
250
253
  if parent_plugin_name is None:
251
- error(f"You may only call `get_plugin_config()` from within a Meerschaum plugin.")
252
- return get_config(*(['plugins', parent_plugin_name] + list(keys)), **kw)
254
+ error(
255
+ "You may only call `get_plugin_config()` "
256
+ "from within a Meerschaum plugin."
257
+ )
258
+
259
+ return get_config(
260
+ *(['plugins', parent_plugin_name] + list(keys)),
261
+ warn=warn,
262
+ **kw
263
+ )
253
264
 
254
265
 
255
266
  def write_plugin_config(
@@ -259,7 +270,6 @@ def write_plugin_config(
259
270
  """
260
271
  Write a plugin's configuration dictionary.
261
272
  """
262
- from meerschaum.utils.warnings import warn, error
263
273
  from meerschaum.plugins import _get_parent_plugin
264
274
  parent_plugin_name = _get_parent_plugin(2)
265
275
  if parent_plugin_name is None:
@@ -2,4 +2,4 @@
2
2
  Specify the Meerschaum release version.
3
3
  """
4
4
 
5
- __version__ = "2.2.5.dev0"
5
+ __version__ = "2.2.5.dev3"
@@ -12,6 +12,7 @@ import meerschaum as mrsm
12
12
  from meerschaum.utils.typing import Optional, Any, Union, SuccessTuple, Iterator
13
13
  from meerschaum.config import get_config
14
14
  from meerschaum.utils.warnings import warn
15
+ from meerschaum.utils.misc import filter_keywords
15
16
 
16
17
  def fetch(
17
18
  self,
@@ -75,25 +76,28 @@ def fetch(
75
76
  with mrsm.Venv(get_connector_plugin(self.connector)):
76
77
  df = self.connector.fetch(
77
78
  self,
78
- begin = _determine_begin(
79
- self,
80
- begin,
81
- check_existing = check_existing,
82
- debug = debug,
83
- ),
84
- end = end,
85
- chunk_hook = _chunk_hook,
86
- debug = debug,
87
- **kw
79
+ **filter_keywords(
80
+ self.connector.fetch,
81
+ begin=_determine_begin(
82
+ self,
83
+ begin,
84
+ check_existing=check_existing,
85
+ debug=debug,
86
+ ),
87
+ end=end,
88
+ chunk_hook=_chunk_hook,
89
+ debug=debug,
90
+ **kw
91
+ )
88
92
  )
89
93
  return df
90
94
 
91
95
 
92
96
  def get_backtrack_interval(
93
- self,
94
- check_existing: bool = True,
95
- debug: bool = False,
96
- ) -> Union[timedelta, int]:
97
+ self,
98
+ check_existing: bool = True,
99
+ debug: bool = False,
100
+ ) -> Union[timedelta, int]:
97
101
  """
98
102
  Get the chunk interval to use for this pipe.
99
103
 
@@ -127,17 +131,17 @@ def get_backtrack_interval(
127
131
 
128
132
 
129
133
  def _determine_begin(
130
- pipe: mrsm.Pipe,
131
- begin: Union[datetime, int, str] = '',
132
- check_existing: bool = True,
133
- debug: bool = False,
134
- ) -> Union[datetime, int, None]:
134
+ pipe: mrsm.Pipe,
135
+ begin: Union[datetime, int, str, None] = '',
136
+ check_existing: bool = True,
137
+ debug: bool = False,
138
+ ) -> Union[datetime, int, None]:
135
139
  """
136
140
  Apply the backtrack interval if `--begin` is not provided.
137
141
 
138
142
  Parameters
139
143
  ----------
140
- begin: Union[datetime, int, str], default ''
144
+ begin: Union[datetime, int, str, None], default ''
141
145
  The provided begin timestamp.
142
146
 
143
147
  check_existing: bool, default True
@@ -160,4 +164,4 @@ def _determine_begin(
160
164
  return sync_time - backtrack_interval
161
165
  except Exception as e:
162
166
  warn(f"Unable to substract backtrack interval {backtrack_interval} from {sync_time}.")
163
- return sync_time
167
+ return sync_time