meerschaum 2.2.5.dev3__py3-none-any.whl → 2.2.6__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 (48) hide show
  1. meerschaum/__init__.py +4 -1
  2. meerschaum/_internal/arguments/_parser.py +13 -2
  3. meerschaum/_internal/docs/index.py +523 -26
  4. meerschaum/_internal/term/__init__.py +2 -2
  5. meerschaum/actions/bootstrap.py +13 -14
  6. meerschaum/actions/python.py +11 -8
  7. meerschaum/actions/register.py +130 -32
  8. meerschaum/actions/show.py +79 -71
  9. meerschaum/actions/stop.py +11 -11
  10. meerschaum/api/dash/callbacks/login.py +21 -13
  11. meerschaum/api/dash/pages/login.py +2 -2
  12. meerschaum/api/routes/_login.py +5 -5
  13. meerschaum/config/__init__.py +8 -1
  14. meerschaum/config/_paths.py +20 -2
  15. meerschaum/config/_version.py +1 -1
  16. meerschaum/config/paths.py +21 -2
  17. meerschaum/config/static/__init__.py +1 -0
  18. meerschaum/connectors/Connector.py +7 -2
  19. meerschaum/connectors/__init__.py +7 -5
  20. meerschaum/connectors/api/APIConnector.py +7 -2
  21. meerschaum/connectors/api/_actions.py +23 -31
  22. meerschaum/connectors/api/_uri.py +5 -5
  23. meerschaum/core/Pipe/__init__.py +7 -3
  24. meerschaum/core/Pipe/_data.py +23 -15
  25. meerschaum/core/Pipe/_deduplicate.py +1 -1
  26. meerschaum/core/Pipe/_dtypes.py +5 -0
  27. meerschaum/core/Pipe/_fetch.py +18 -16
  28. meerschaum/core/Pipe/_sync.py +20 -15
  29. meerschaum/plugins/_Plugin.py +6 -6
  30. meerschaum/plugins/__init__.py +1 -1
  31. meerschaum/utils/daemon/RotatingFile.py +15 -16
  32. meerschaum/utils/dataframe.py +12 -4
  33. meerschaum/utils/debug.py +9 -15
  34. meerschaum/utils/formatting/__init__.py +13 -12
  35. meerschaum/utils/misc.py +117 -11
  36. meerschaum/utils/packages/__init__.py +7 -1
  37. meerschaum/utils/typing.py +1 -0
  38. meerschaum/utils/venv/__init__.py +5 -1
  39. meerschaum/utils/warnings.py +8 -1
  40. meerschaum/utils/yaml.py +2 -2
  41. {meerschaum-2.2.5.dev3.dist-info → meerschaum-2.2.6.dist-info}/METADATA +1 -1
  42. {meerschaum-2.2.5.dev3.dist-info → meerschaum-2.2.6.dist-info}/RECORD +48 -48
  43. {meerschaum-2.2.5.dev3.dist-info → meerschaum-2.2.6.dist-info}/WHEEL +1 -1
  44. {meerschaum-2.2.5.dev3.dist-info → meerschaum-2.2.6.dist-info}/LICENSE +0 -0
  45. {meerschaum-2.2.5.dev3.dist-info → meerschaum-2.2.6.dist-info}/NOTICE +0 -0
  46. {meerschaum-2.2.5.dev3.dist-info → meerschaum-2.2.6.dist-info}/entry_points.txt +0 -0
  47. {meerschaum-2.2.5.dev3.dist-info → meerschaum-2.2.6.dist-info}/top_level.txt +0 -0
  48. {meerschaum-2.2.5.dev3.dist-info → meerschaum-2.2.6.dist-info}/zip-safe +0 -0
meerschaum/__init__.py CHANGED
@@ -23,7 +23,7 @@ from meerschaum.utils.typing import SuccessTuple
23
23
  from meerschaum.core.Pipe import Pipe
24
24
  from meerschaum.plugins import Plugin
25
25
  from meerschaum.utils.venv import Venv
26
- from meerschaum.connectors import get_connector
26
+ from meerschaum.connectors import get_connector, Connector, make_connector
27
27
  from meerschaum.utils import get_pipes
28
28
  from meerschaum.utils.formatting import pprint
29
29
  from meerschaum._internal.docs import index as __doc__
@@ -49,4 +49,7 @@ __all__ = (
49
49
  "connectors",
50
50
  "plugins",
51
51
  "utils",
52
+ "SuccessTuple",
53
+ "Connector",
54
+ "make_connector",
52
55
  )
@@ -61,6 +61,7 @@ def parse_datetime(dt_str: str) -> Union[datetime, int, str]:
61
61
  error(f"'{dt_str}' is not a valid datetime format.", stack=False)
62
62
  return dt
63
63
 
64
+
64
65
  def parse_help(sysargs : Union[List[str], Dict[str, Any]]) -> None:
65
66
  """Parse the `--help` flag to determine which help message to print."""
66
67
  from meerschaum._internal.arguments._parse_arguments import parse_arguments, parse_line
@@ -97,7 +98,8 @@ def parse_help(sysargs : Union[List[str], Dict[str, Any]]) -> None:
97
98
  doc = "No help available for '" + f"{args['action'][0]}" + "'."
98
99
  return print(textwrap.dedent(doc))
99
100
 
100
- def parse_version(sysargs : List[str]):
101
+
102
+ def parse_version(sysargs: List[str]):
101
103
  """Print the Meerschaum version."""
102
104
  from meerschaum.config import __version__ as version
103
105
  from meerschaum.config import __doc__ as doc
@@ -105,6 +107,15 @@ def parse_version(sysargs : List[str]):
105
107
  return print(version)
106
108
  return print(doc)
107
109
 
110
+
111
+ def parse_name(name_str: str) -> str:
112
+ """
113
+ Ensure that `--name` is not an empty string.
114
+ """
115
+ if not name_str:
116
+ return None
117
+ return name_str
118
+
108
119
  def get_arguments_triggers() -> Dict[str, Tuple[str]]:
109
120
  """ """
110
121
  triggers = {}
@@ -162,7 +173,7 @@ groups['actions'].add_argument(
162
173
  '--rm', action='store_true', help="Delete a job once it has finished executing."
163
174
  )
164
175
  groups['actions'].add_argument(
165
- '--name', '--job-name', type=str, help=(
176
+ '--name', '--job-name', type=parse_name, help=(
166
177
  "Assign a name to a job. If no name is provided, a random name will be assigned."
167
178
  ),
168
179
  )
@@ -3,38 +3,535 @@
3
3
  # vim:fenc=utf-8
4
4
 
5
5
  """
6
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
7
+ <style>
8
+
9
+ .container {
10
+ display: flex;
11
+ justify-content: space-between;
12
+ }
13
+ .left, .right {
14
+ width: 45%; /* Adjust width as needed */
15
+ }
16
+
17
+ </style>
18
+
6
19
  <img src="https://meerschaum.io/assets/banner_1920x320.png" alt="Meerschaum banner" style="width: 100%;"/>
7
20
 
8
21
  # Meerschaum Python API
9
22
 
10
- Welcome to the Meerschaum Python API technical documentation!
23
+ Welcome to the Meerschaum Python API technical documentation! Here you can find information about the classes and functions provided by the `meerschaum` package. Visit [meerschaum.io](https://meerschaum.io) for general usage documentation.
24
+
25
+ ## Root Module
26
+
27
+ For your convenience, the following classes and functions may be imported from the root `meerschaum` namespace:
28
+
29
+ <div class="container" style="display: flex; justify-content: space-between">
30
+
31
+ <div class="left" style="width: 45%;">
32
+
33
+ <h3>Classes</h3>
34
+
35
+ <ul>
36
+ <li><code>meerschaum.Connector</code></li>
37
+ <li><code>meerschaum.Pipe</code></li>
38
+ <li><code>meerschaum.Plugin</code></li>
39
+ <li><code>meerschaum.SuccessTuple</code></li>
40
+ <li><code>meerschaum.Venv</code></li>
41
+ </ul>
42
+
43
+ </div>
44
+
45
+
46
+ <div class="right" style="width: 45%">
47
+
48
+ <h3>Functions</h3>
49
+
50
+ <ul>
51
+ <li><code>meerschaum.get_config()</code></li>
52
+ <li><code>meerschaum.get_connector()</code></li>
53
+ <li><code>meerschaum.get_pipes()</code></li>
54
+ <li><code>meerschaum.make_connector()</code></li>
55
+ <li><code>meerschaum.pprint()</code></li>
56
+ <li><code>meerschaum.attempt_import()</code></li>
57
+ </ul>
58
+
59
+ </div>
60
+ </div>
61
+
62
+ ### Examples
63
+
64
+ #### Build a Connector
65
+
66
+ ```python
67
+ import meerschaum as mrsm
68
+
69
+ sql_conn = mrsm.get_connector(
70
+ 'sql:temp',
71
+ flavor='sqlite',
72
+ database='/tmp/tmp.db',
73
+ )
74
+ df = sql_conn.read("SELECT 1 AS foo")
75
+ print(df)
76
+ # foo
77
+ # 0 1
78
+
79
+ sql_conn.to_sql(df, 'foo')
80
+ print(sql_conn.read('foo'))
81
+ # foo
82
+ # 0 1
83
+ ```
84
+
85
+ #### Create a Custom Connector Class
86
+
87
+ ```python
88
+ from datetime import datetime, timezone
89
+ from random import randint
90
+ import meerschaum as mrsm
91
+ from meerschaum.utils.misc import round_time
92
+
93
+ @mrsm.make_connector
94
+ class FooConnector(mrsm.Connector):
95
+ REQUIRED_ATTRIBUTES = ['username', 'password']
96
+
97
+ def fetch(
98
+ self,
99
+ begin: datetime | None = None,
100
+ end: datetime | None = None,
101
+ ):
102
+ now = begin or round_time(datetime.now(timezone.utc))
103
+ return [
104
+ {'ts': now, 'id': 1, 'vl': randint(1, 100)},
105
+ {'ts': now, 'id': 2, 'vl': randint(1, 100)},
106
+ {'ts': now, 'id': 3, 'vl': randint(1, 100)},
107
+ ]
108
+
109
+ foo_conn = mrsm.get_connector(
110
+ 'foo:bar',
111
+ username='foo',
112
+ password='bar',
113
+ )
114
+ docs = foo_conn.fetch()
115
+ ```
116
+
117
+ #### Build a Pipe
118
+
119
+ ```python
120
+ from datetime import datetime
121
+ import meerschaum as mrsm
122
+
123
+ pipe = mrsm.Pipe(
124
+ foo_conn, 'demo',
125
+ instance=sql_conn,
126
+ columns={'datetime': 'ts', 'id': 'id'},
127
+ tags=['production'],
128
+ )
129
+ pipe.sync(begin=datetime(2024, 1, 1))
130
+ df = pipe.get_data()
131
+ print(df)
132
+ # ts id vl
133
+ # 0 2024-01-01 1 97
134
+ # 1 2024-01-01 2 18
135
+ # 2 2024-01-01 3 96
136
+ ```
137
+
138
+ #### Get Registered Pipes
139
+
140
+ ```python
141
+ import meerschaum as mrsm
11
142
 
12
- - `meerschaum.actions`
143
+ pipes = mrsm.get_pipes(
144
+ tags=['production'],
145
+ instance=sql_conn,
146
+ as_list=True,
147
+ )
148
+ print(pipes)
149
+ # [Pipe('foo:bar', 'demo', instance='sql:temp')]
150
+ ```
151
+
152
+ #### Access a Plugin's Module
153
+
154
+ ```python
155
+ import meerschaum as mrsm
156
+
157
+ plugin = mrsm.Plugin('noaa')
158
+ with mrsm.Venv(plugin):
159
+ noaa = plugin.module
160
+ print(noaa.get_station_info('KGMU'))
161
+ # {'name': 'Greenville Downtown Airport', 'geometry': {'type': 'Point', 'coordinates': [-82.35004, 34.84873]}}
162
+ ```
163
+
164
+ ## Submodules
165
+
166
+ <details>
167
+ <summary>
168
+ `meerschaum.actions`<br>
13
169
  Access functions for actions and subactions.
14
- - `meerschaum.connectors`
15
- - `meerschaum.utils`
16
- Utility functions are available in several submodules, such as functions for:
17
- - `meerschaum.utils.daemon`
18
- Managing background processes.\n
19
- - `meerschaum.utils.dataframe`
20
- Manipulating dataframes.\n
21
- - `meerschaum.utils.dtypes`
22
- Working with data types.\n
23
- - `meerschaum.utils.formatting`
24
- Formatting output text.\n
25
- - `meerschaum.utils.misc`
26
- Miscellaneous utility functions (e.g. `meerschaum.utils.misc.round_time()`).\n
27
- - `meerschaum.utils.packages`
28
- Managing Python packages.\n
29
- - `meerschaum.utils.prompt`
30
- Reading input from the user.\n
31
- - `meerschaum.utils.schedule`
32
- Scheduling processes and threads.\n
33
- - `meerschaum.utils.sql`
34
- Building SQL queries.\n
35
- - `meerschaum.utils.venv`
36
- Managing virtual environments.\n
37
- - `meerschaum.utils.warnings`
170
+ </summary>
171
+
172
+ - `meerschaum.actions.actions`
173
+ - `meerschaum.actions.get_action()`
174
+ - `meerschaum.actions.get_completer()`
175
+ - `meerschaum.actions.get_main_action_name()`
176
+ - `meerschaum.actions.get_subactions()`
177
+
178
+ </details>
179
+
180
+ <details>
181
+ <summary>
182
+ `meerschaum.config`<br>
183
+ Read and write the Meerschaum configuration registry.
184
+ </summary>
185
+
186
+ - `meerschaum.config.get_config()`
187
+ - `meerschaum.config.get_plugin_config()`
188
+ - `meerschaum.config.write_config()`
189
+ - `meerschaum.config.write_plugin_config()`
190
+
191
+ </details>
192
+
193
+ <details>
194
+ <summary>
195
+ `meerschaum.connectors`<br>
196
+ Build connectors to interact with databases and fetch data.
197
+ </summary>
198
+
199
+ - `meerschaum.connectors.get_connector()`
200
+ - `meerschaum.connectors.make_connector()`
201
+ - `meerschaum.connectors.is_connected()`
202
+ - `meerschaum.connectors.poll.retry_connect()`
203
+ - `meerschaum.connectors.Connector`
204
+ - `meerschaum.connectors.SQLConnector`
205
+ - `meerschaum.connectors.APIConnector`
206
+
207
+ </details>
208
+
209
+ <details>
210
+ <summary>
211
+ `meerschaum.plugins`<br>
212
+ Access plugin modules and other API utilties.
213
+ </summary>
214
+
215
+ - `meerschaum.plugins.Plugin`
216
+ - `meerschaum.plugins.api_plugin()`
217
+ - `meerschaum.plugins.dash_plugin()`
218
+ - `meerschaum.plugins.import_plugins()`
219
+ - `meerschaum.plugins.reload_plugins()`
220
+ - `meerschaum.plugins.get_plugins()`
221
+ - `meerschaum.plugins.get_data_plugins()`
222
+ - `meerschaum.plugins.add_plugin_argument()`
223
+ - `meerschaum.plugins.pre_sync_hook()`
224
+ - `meerschaum.plugins.post_sync_hook()`
225
+
226
+ </details>
227
+
228
+ <details>
229
+ <summary><code>meerschaum.utils</code><br>
230
+ Utility functions are available in several submodules:<br>
231
+ </summary>
232
+
233
+ <ul>
234
+ <details>
235
+ <summary>
236
+ <code>meerschaum.utils.daemon</code><br>
237
+ Manage background jobs.<br>
238
+ </summary>
239
+ <p></p>
240
+ <ul>
241
+ <li><code>meerschaum.utils.daemon.daemon_entry()</code></li>
242
+ <li><code>meerschaum.utils.daemon.daemon_action()</code></li>
243
+ <li><code>meerschaum.utils.daemon.get_daemons()</code></li>
244
+ <li><code>meerschaum.utils.daemon.get_daemon_ids()</code></li>
245
+ <li><code>meerschaum.utils.daemon.get_running_daemons()</code></li>
246
+ <li><code>meerschaum.utils.daemon.get_paused_daemons()</code></li>
247
+ <li><code>meerschaum.utils.daemon.get_stopped_daemons()</code></li>
248
+ <li><code>meerschaum.utils.daemon.get_filtered_daemons()</code></li>
249
+ <li><code>meerschaum.utils.daemon.run_daemon()</code></li>
250
+ <li><code>meerschaum.utils.daemon.Daemon</code></li>
251
+ <li><code>meerschaum.utils.daemon.FileDescriptorInterceptor</code></li>
252
+ <li><code>meerschaum.utils.daemon.RotatingFile</code></li>
253
+ </ul>
254
+ </details>
255
+ </ul>
256
+
257
+ <ul>
258
+ <details>
259
+ <summary>
260
+ <code>meerschaum.utils.debug</code><br>
261
+ Debugging tools.<br>
262
+ </summary>
263
+ <p></p>
264
+ <ul>
265
+ <li><code>meerschaum.utils.debug.dprint()</code></li>
266
+ <li><code>meerschaum.utils.debug.trace()</code></li>
267
+ </ul>
268
+ </details>
269
+ </ul>
270
+
271
+ <ul>
272
+ <details>
273
+ <summary>
274
+ <code>meerschaum.utils.dataframe</code><br>
275
+ Manipulate dataframes.<br>
276
+ </summary>
277
+ <p></p>
278
+ <ul>
279
+ <li><code>meerschaum.utils.dataframe.add_missing_cols_to_df()</code></li>
280
+ <li><code>meerschaum.utils.dataframe.df_is_chunk_generator()</code></li>
281
+ <li><code>meerschaum.utils.dataframe.enforce_dtypes()</code></li>
282
+ <li><code>meerschaum.utils.dataframe.filter_unseen_df()</code></li>
283
+ <li><code>meerschaum.utils.dataframe.get_datetime_bound_from_df()</code></li>
284
+ <li><code>meerschaum.utils.dataframe.get_first_valid_dask_partition()</code></li>
285
+ <li><code>meerschaum.utils.dataframe.get_json_cols()</code></li>
286
+ <li><code>meerschaum.utils.dataframe.get_numeric_cols()</code></li>
287
+ <li><code>meerschaum.utils.dataframe.get_unhashable_cols()</code></li>
288
+ <li><code>meerschaum.utils.dataframe.parse_df_datetimes()</code></li>
289
+ <li><code>meerschaum.utils.dataframe.query_df()</code></li>
290
+ </ul>
291
+ </details>
292
+ </ul>
293
+
294
+ <ul>
295
+ <details>
296
+ <summary>
297
+ <code>meerschaum.utils.dtypes</code><br>
298
+ Work with data types.<br>
299
+ </summary>
300
+ <p></p>
301
+ <ul>
302
+ <li><code>meerschaum.utils.dtypes.are_dtypes_equal()</code></li>
303
+ <li><code>meerschaum.utils.dtypes.attempt_cast_to_numeric()</code></li>
304
+ <li><code>meerschaum.utils.dtypes.is_dtype_numeric()</code></li>
305
+ <li><code>meerschaum.utils.dtypes.none_if_null()</code></li>
306
+ <li><code>meerschaum.utils.dtypes.quantize_decimal()</code></li>
307
+ <li><code>meerschaum.utils.dtypes.to_pandas_dtype()</code></li>
308
+ <li><code>meerschaum.utils.dtypes.value_is_null()</code></li>
309
+ <li><code>meerschaum.utils.dtypes.sql.get_pd_type_from_db_type()</code></li>
310
+ <li><code>meerschaum.utils.dtypes.sql.get_db_type_from_pd_type()</code></li>
311
+ </ul>
312
+ </details>
313
+ </ul>
314
+
315
+ <ul>
316
+ <details>
317
+ <summary>
318
+ <code>meerschaum.utils.formatting</code><br>
319
+ Format output text.<br>
320
+ </summary>
321
+ <p></p>
322
+ <ul>
323
+ <li><code>meerschaum.utils.formatting.colored()</code></li>
324
+ <li><code>meerschaum.utils.formatting.extract_stats_from_message()</code></li>
325
+ <li><code>meerschaum.utils.formatting.fill_ansi()</code></li>
326
+ <li><code>meerschaum.utils.formatting.get_console()</code></li>
327
+ <li><code>meerschaum.utils.formatting.highlight_pipes()</code></li>
328
+ <li><code>meerschaum.utils.formatting.make_header()</code></li>
329
+ <li><code>meerschaum.utils.formatting.pipe_repr()</code></li>
330
+ <li><code>meerschaum.utils.formatting.pprint()</code></li>
331
+ <li><code>meerschaum.utils.formatting.pprint_pipes()</code></li>
332
+ <li><code>meerschaum.utils.formatting.print_options()</code></li>
333
+ <li><code>meerschaum.utils.formatting.print_pipes_results()</code></li>
334
+ <li><code>meerschaum.utils.formatting.print_tuple()</code></li>
335
+ <li><code>meerschaum.utils.formatting.translate_rich_to_termcolor()</code></li>
336
+ </ul>
337
+ </details>
338
+ </ul>
339
+
340
+ <ul>
341
+ <details>
342
+ <summary>
343
+ <code>meerschaum.utils.misc</code><br>
344
+ Miscellaneous utility functions.<br>
345
+ </summary>
346
+ <p></p>
347
+ <ul>
348
+ <li><code>meerschaum.utils.misc.items_str()</code></li>
349
+ <li><code>meerschaum.utils.misc.round_time()</code></li>
350
+ <li><code>meerschaum.utils.misc.is_int()</code></li>
351
+ <li><code>meerschaum.utils.misc.interval_str()</code></li>
352
+ <li><code>meerschaum.utils.misc.filter_keywords()</code></li>
353
+ <li><code>meerschaum.utils.misc.generate_password()</code></li>
354
+ <li><code>meerschaum.utils.misc.string_to_dict()</code></li>
355
+ <li><code>meerschaum.utils.misc.iterate_chunks()</code></li>
356
+ <li><code>meerschaum.utils.misc.timed_input()</code></li>
357
+ <li><code>meerschaum.utils.misc.replace_pipes_in_dict()</code></li>
358
+ <li><code>meerschaum.utils.misc.is_valid_email()</code></li>
359
+ <li><code>meerschaum.utils.misc.string_width()</code></li>
360
+ <li><code>meerschaum.utils.misc.replace_password()</code></li>
361
+ <li><code>meerschaum.utils.misc.parse_config_substitution()</code></li>
362
+ <li><code>meerschaum.utils.misc.edit_file()</code></li>
363
+ <li><code>meerschaum.utils.misc.get_in_ex_params()</code></li>
364
+ <li><code>meerschaum.utils.misc.separate_negation_values()</code></li>
365
+ <li><code>meerschaum.utils.misc.flatten_list()</code></li>
366
+ <li><code>meerschaum.utils.misc.make_symlink()</code></li>
367
+ <li><code>meerschaum.utils.misc.is_symlink()</code></li>
368
+ <li><code>meerschaum.utils.misc.wget()</code></li>
369
+ <li><code>meerschaum.utils.misc.add_method_to_class()</code></li>
370
+ <li><code>meerschaum.utils.misc.is_pipe_registered()</code></li>
371
+ <li><code>meerschaum.utils.misc.get_cols_lines()</code></li>
372
+ <li><code>meerschaum.utils.misc.sorted_dict()</code></li>
373
+ <li><code>meerschaum.utils.misc.flatten_pipes_dict()</code></li>
374
+ <li><code>meerschaum.utils.misc.dict_from_od()</code></li>
375
+ <li><code>meerschaum.utils.misc.remove_ansi()</code></li>
376
+ <li><code>meerschaum.utils.misc.get_connector_labels()</code></li>
377
+ <li><code>meerschaum.utils.misc.json_serialize_datetime()</code></li>
378
+ <li><code>meerschaum.utils.misc.async_wrap()</code></li>
379
+ <li><code>meerschaum.utils.misc.is_docker_available()</code></li>
380
+ <li><code>meerschaum.utils.misc.is_android()</code></li>
381
+ <li><code>meerschaum.utils.misc.is_bcp_available()</code></li>
382
+ <li><code>meerschaum.utils.misc.truncate_string_sections()</code></li>
383
+ <li><code>meerschaum.utils.misc.safely_extract_tar()</code></li>
384
+ </ul>
385
+ </details>
386
+ </ul>
387
+
388
+ <ul>
389
+ <details>
390
+ <summary>
391
+ <code>meerschaum.utils.packages</code><br>
392
+ Manage Python packages.
393
+ <br>
394
+ </summary>
395
+ <p></p>
396
+ <ul>
397
+ <li><code>meerschaum.utils.packages.attempt_import()</code></li>
398
+ <li><code>meerschaum.utils.packages.get_module_path()</code></li>
399
+ <li><code>meerschaum.utils.packages.manually_import_module()</code></li>
400
+ <li><code>meerschaum.utils.packages.get_install_no_version()</code></li>
401
+ <li><code>meerschaum.utils.packages.determine_version()</code></li>
402
+ <li><code>meerschaum.utils.packages.need_update()</code></li>
403
+ <li><code>meerschaum.utils.packages.get_pip()</code></li>
404
+ <li><code>meerschaum.utils.packages.pip_install()</code></li>
405
+ <li><code>meerschaum.utils.packages.pip_uninstall()</code></li>
406
+ <li><code>meerschaum.utils.packages.completely_uninstall_package()</code></li>
407
+ <li><code>meerschaum.utils.packages.run_python_package()</code></li>
408
+ <li><code>meerschaum.utils.packages.lazy_import()</code></li>
409
+ <li><code>meerschaum.utils.packages.pandas_name()</code></li>
410
+ <li><code>meerschaum.utils.packages.import_pandas()</code></li>
411
+ <li><code>meerschaum.utils.packages.import_rich()</code></li>
412
+ <li><code>meerschaum.utils.packages.import_dcc()</code></li>
413
+ <li><code>meerschaum.utils.packages.import_html()</code></li>
414
+ <li><code>meerschaum.utils.packages.get_modules_from_package()</code></li>
415
+ <li><code>meerschaum.utils.packages.import_children()</code></li>
416
+ <li><code>meerschaum.utils.packages.reload_package()</code></li>
417
+ <li><code>meerschaum.utils.packages.reload_meerschaum()</code></li>
418
+ <li><code>meerschaum.utils.packages.is_installed()</code></li>
419
+ <li><code>meerschaum.utils.packages.venv_contains_package()</code></li>
420
+ <li><code>meerschaum.utils.packages.package_venv()</code></li>
421
+ <li><code>meerschaum.utils.packages.ensure_readline()</code></li>
422
+ <li><code>meerschaum.utils.packages.get_prerelease_dependencies()</code></li>
423
+ </ul>
424
+ </details>
425
+ </ul>
426
+
427
+ <ul>
428
+ <details>
429
+ <summary>
430
+ <code>meerschaum.utils.prompt</code><br>
431
+ Read input from the user.
432
+ <br>
433
+ </summary>
434
+ <p></p>
435
+ <ul>
436
+ <li><code>meerschaum.utils.prompt.prompt()</code></li>
437
+ <li><code>meerschaum.utils.prompt.yes_no()</code></li>
438
+ <li><code>meerschaum.utils.prompt.choose()</code></li>
439
+ <li><code>meerschaum.utils.prompt.get_password()</code></li>
440
+ <li><code>meerschaum.utils.prompt.get_email()</code></li>
441
+ </ul>
442
+ </details>
443
+ </ul>
444
+
445
+ <ul>
446
+ <details>
447
+ <summary>
448
+ <code>meerschaum.utils.schedule</code><br>
449
+ Schedule processes and threads.
450
+ <br>
451
+ </summary>
452
+ <p></p>
453
+ <ul>
454
+ <li><code>meerschaum.utils.schedule.schedule_function()</code></li>
455
+ <li><code>meerschaum.utils.schedule.parse_schedule()</code></li>
456
+ <li><code>meerschaum.utils.schedule.parse_start_time()</code></li>
457
+ </ul>
458
+ </details>
459
+ </ul>
460
+
461
+ <ul>
462
+ <details>
463
+ <summary>
464
+ <code>meerschaum.utils.sql</code><br>
465
+ Build SQL queries.
466
+ <br>
467
+ </summary>
468
+ <p></p>
469
+ <ul>
470
+ <li><code>meerschaum.utils.sql.build_where()</code></li>
471
+ <li><code>meerschaum.utils.sql.clean()</code></li>
472
+ <li><code>meerschaum.utils.sql.dateadd_str()</code></li>
473
+ <li><code>meerschaum.utils.sql.test_connection()</code></li>
474
+ <li><code>meerschaum.utils.sql.get_distinct_col_count()</code></li>
475
+ <li><code>meerschaum.utils.sql.sql_item_name()</code></li>
476
+ <li><code>meerschaum.utils.sql.pg_capital()</code></li>
477
+ <li><code>meerschaum.utils.sql.oracle_capital()</code></li>
478
+ <li><code>meerschaum.utils.sql.truncate_item_name()</code></li>
479
+ <li><code>meerschaum.utils.sql.table_exists()</code></li>
480
+ <li><code>meerschaum.utils.sql.get_table_cols_types()</code></li>
481
+ <li><code>meerschaum.utils.sql.get_update_queries()</code></li>
482
+ <li><code>meerschaum.utils.sql.get_null_replacement()</code></li>
483
+ <li><code>meerschaum.utils.sql.get_db_version()</code></li>
484
+ <li><code>meerschaum.utils.sql.get_rename_table_queries()</code></li>
485
+ <li><code>meerschaum.utils.sql.get_create_table_query()</code></li>
486
+ <li><code>meerschaum.utils.sql.format_cte_subquery()</code></li>
487
+ <li><code>meerschaum.utils.sql.session_execute()</code></li>
488
+ </ul>
489
+ </details>
490
+ </ul>
491
+
492
+ <ul>
493
+ <details>
494
+ <summary>
495
+ <code>meerschaum.utils.venv</code><br>
496
+ Manage virtual environments.
497
+ <br>
498
+ </summary>
499
+ <p></p>
500
+ <ul>
501
+ <li><code>meerschaum.utils.venv.Venv</code></li>
502
+ <li><code>meerschaum.utils.venv.activate_venv()</code></li>
503
+ <li><code>meerschaum.utils.venv.deactivate_venv()</code></li>
504
+ <li><code>meerschaum.utils.venv.get_module_venv()</code></li>
505
+ <li><code>meerschaum.utils.venv.get_venvs()</code></li>
506
+ <li><code>meerschaum.utils.venv.init_venv()</code></li>
507
+ <li><code>meerschaum.utils.venv.inside_venv()</code></li>
508
+ <li><code>meerschaum.utils.venv.is_venv_active()</code></li>
509
+ <li><code>meerschaum.utils.venv.venv_exec()</code></li>
510
+ <li><code>meerschaum.utils.venv.venv_executable()</code></li>
511
+ <li><code>meerschaum.utils.venv.venv_exists()</code></li>
512
+ <li><code>meerschaum.utils.venv.venv_target_path()</code></li>
513
+ <li><code>meerschaum.utils.venv.verify_venv()</code></li>
514
+ </ul>
515
+ </details>
516
+ </ul>
517
+
518
+ <ul>
519
+ <details>
520
+ <summary>
521
+ <code>meerschaum.utils.warnings</code><br>
38
522
  Print warnings, errors, info, and debug messages.
523
+ <br>
524
+ </summary>
525
+ <p></p>
526
+ <ul>
527
+ <li><code>meerschaum.utils.warnings.dprint()</code></li>
528
+ <li><code>meerschaum.utils.warnings.error()</code></li>
529
+ <li><code>meerschaum.utils.warnings.info()</code></li>
530
+ <li><code>meerschaum.utils.warnings.warn()</code></li>
531
+ </ul>
532
+ </details>
533
+ </ul>
534
+
535
+ </details>
39
536
 
40
537
  """
@@ -22,7 +22,7 @@ tornado, tornado_ioloop, terminado = attempt_import(
22
22
 
23
23
  def get_webterm_app_and_manager() -> Tuple[
24
24
  tornado.web.Application,
25
- terminado.UniqueTermManager,
25
+ terminado.UniqueTermManager,
26
26
  ]:
27
27
  """
28
28
  Construct the Tornado web app and term manager from the provided sysargs.
@@ -47,7 +47,7 @@ def get_webterm_app_and_manager() -> Tuple[
47
47
  {'term_manager': term_manager}
48
48
  ),
49
49
  (
50
- r"/",
50
+ r"/",
51
51
  TermPageHandler
52
52
  ),
53
53
  ]
@@ -221,18 +221,17 @@ def _bootstrap_pipes(
221
221
  return (successes > 0), msg
222
222
 
223
223
  def _bootstrap_connectors(
224
- action : Optional[List[str]] = None,
225
- connector_keys : Optional[List[str]] = None,
226
- yes : bool = False,
227
- force : bool = False,
228
- noask : bool = False,
229
- debug : bool = False,
230
- return_keys : bool = False,
231
- **kw : Any
232
- ) -> Union[SuccessTuple, Tuple[str, str]]:
224
+ action: Optional[List[str]] = None,
225
+ connector_keys: Optional[List[str]] = None,
226
+ yes: bool = False,
227
+ force: bool = False,
228
+ noask: bool = False,
229
+ debug: bool = False,
230
+ return_keys: bool = False,
231
+ **kw: Any
232
+ ) -> Union[SuccessTuple, Tuple[str, str]]:
233
233
  """
234
234
  Prompt the user for the details necessary to create a Connector.
235
-
236
235
  """
237
236
  from meerschaum.connectors.parse import is_valid_connector_keys
238
237
  from meerschaum.connectors import connectors, get_connector, types, custom_types
@@ -386,10 +385,10 @@ def _bootstrap_connectors(
386
385
 
387
386
 
388
387
  def _bootstrap_plugins(
389
- action: Optional[List[str]] = None,
390
- debug: bool = False,
391
- **kwargs: Any
392
- ) -> SuccessTuple:
388
+ action: Optional[List[str]] = None,
389
+ debug: bool = False,
390
+ **kwargs: Any
391
+ ) -> SuccessTuple:
393
392
  """
394
393
  Launch an interactive wizard to guide the user to creating a new plugin.
395
394
  """