meerschaum 2.2.5.dev3__py3-none-any.whl → 2.2.7__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 (65) hide show
  1. meerschaum/__init__.py +4 -1
  2. meerschaum/__main__.py +10 -5
  3. meerschaum/_internal/arguments/_parser.py +13 -2
  4. meerschaum/_internal/docs/index.py +523 -26
  5. meerschaum/_internal/entry.py +13 -13
  6. meerschaum/_internal/shell/Shell.py +26 -22
  7. meerschaum/_internal/shell/updates.py +175 -0
  8. meerschaum/_internal/term/__init__.py +2 -2
  9. meerschaum/actions/bootstrap.py +13 -14
  10. meerschaum/actions/python.py +11 -8
  11. meerschaum/actions/register.py +149 -37
  12. meerschaum/actions/show.py +79 -71
  13. meerschaum/actions/stop.py +11 -11
  14. meerschaum/actions/sync.py +3 -3
  15. meerschaum/actions/upgrade.py +28 -36
  16. meerschaum/api/dash/callbacks/login.py +21 -13
  17. meerschaum/api/dash/pages/login.py +2 -2
  18. meerschaum/api/routes/_login.py +5 -5
  19. meerschaum/api/routes/_pipes.py +20 -20
  20. meerschaum/config/__init__.py +8 -1
  21. meerschaum/config/_formatting.py +1 -0
  22. meerschaum/config/_paths.py +24 -2
  23. meerschaum/config/_shell.py +78 -66
  24. meerschaum/config/_version.py +1 -1
  25. meerschaum/config/paths.py +21 -2
  26. meerschaum/config/static/__init__.py +2 -0
  27. meerschaum/connectors/Connector.py +7 -2
  28. meerschaum/connectors/__init__.py +7 -5
  29. meerschaum/connectors/api/APIConnector.py +7 -2
  30. meerschaum/connectors/api/_actions.py +23 -31
  31. meerschaum/connectors/api/_misc.py +1 -1
  32. meerschaum/connectors/api/_request.py +13 -9
  33. meerschaum/connectors/api/_uri.py +5 -5
  34. meerschaum/core/Pipe/__init__.py +7 -3
  35. meerschaum/core/Pipe/_data.py +23 -15
  36. meerschaum/core/Pipe/_deduplicate.py +1 -1
  37. meerschaum/core/Pipe/_dtypes.py +5 -0
  38. meerschaum/core/Pipe/_fetch.py +18 -16
  39. meerschaum/core/Pipe/_sync.py +23 -15
  40. meerschaum/plugins/_Plugin.py +6 -6
  41. meerschaum/plugins/__init__.py +1 -1
  42. meerschaum/utils/daemon/Daemon.py +88 -129
  43. meerschaum/utils/daemon/FileDescriptorInterceptor.py +14 -5
  44. meerschaum/utils/daemon/RotatingFile.py +23 -17
  45. meerschaum/utils/daemon/__init__.py +28 -21
  46. meerschaum/utils/dataframe.py +12 -4
  47. meerschaum/utils/debug.py +9 -15
  48. meerschaum/utils/formatting/__init__.py +92 -46
  49. meerschaum/utils/formatting/_jobs.py +47 -9
  50. meerschaum/utils/misc.py +117 -11
  51. meerschaum/utils/packages/__init__.py +28 -16
  52. meerschaum/utils/prompt.py +5 -0
  53. meerschaum/utils/schedule.py +21 -15
  54. meerschaum/utils/typing.py +1 -0
  55. meerschaum/utils/venv/__init__.py +5 -1
  56. meerschaum/utils/warnings.py +8 -1
  57. meerschaum/utils/yaml.py +2 -2
  58. {meerschaum-2.2.5.dev3.dist-info → meerschaum-2.2.7.dist-info}/METADATA +1 -1
  59. {meerschaum-2.2.5.dev3.dist-info → meerschaum-2.2.7.dist-info}/RECORD +65 -64
  60. {meerschaum-2.2.5.dev3.dist-info → meerschaum-2.2.7.dist-info}/WHEEL +1 -1
  61. {meerschaum-2.2.5.dev3.dist-info → meerschaum-2.2.7.dist-info}/LICENSE +0 -0
  62. {meerschaum-2.2.5.dev3.dist-info → meerschaum-2.2.7.dist-info}/NOTICE +0 -0
  63. {meerschaum-2.2.5.dev3.dist-info → meerschaum-2.2.7.dist-info}/entry_points.txt +0 -0
  64. {meerschaum-2.2.5.dev3.dist-info → meerschaum-2.2.7.dist-info}/top_level.txt +0 -0
  65. {meerschaum-2.2.5.dev3.dist-info → meerschaum-2.2.7.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
  )
meerschaum/__main__.py CHANGED
@@ -19,9 +19,15 @@ See the License for the specific language governing permissions and
19
19
  limitations under the License.
20
20
  """
21
21
 
22
- import sys, os, copy
22
+ import sys
23
+ import os
24
+ import copy
23
25
 
24
- def main(sysargs: list = None) -> None:
26
+ from meerschaum.utils.typing import List, Optional
27
+ from meerschaum.utils.formatting import print_tuple as _print_tuple
28
+
29
+
30
+ def main(sysargs: Optional[List[str]] = None) -> None:
25
31
  """Main CLI entry point."""
26
32
  if sysargs is None:
27
33
  sysargs = copy.deepcopy(sys.argv[1:])
@@ -41,7 +47,7 @@ def main(sysargs: list = None) -> None:
41
47
 
42
48
  if ('-d' in sysargs or '--daemon' in sysargs) and ('stack' not in sysargs):
43
49
  from meerschaum.utils.daemon import daemon_entry
44
- daemon_entry(sysargs)
50
+ _print_tuple(daemon_entry(sysargs), upper_padding=1)
45
51
  return _exit(old_cwd=old_cwd)
46
52
 
47
53
  from meerschaum._internal.entry import entry, get_shell
@@ -57,8 +63,7 @@ def main(sysargs: list = None) -> None:
57
63
  return_tuple = entry(sysargs)
58
64
  rc = 0
59
65
  if isinstance(return_tuple, tuple) and '--nopretty' not in sysargs:
60
- from meerschaum.utils.formatting import print_tuple
61
- print_tuple(return_tuple, upper_padding=1)
66
+ _print_tuple(return_tuple, upper_padding=1)
62
67
  rc = 0 if (return_tuple[0] is True) else 1
63
68
 
64
69
  return _exit(rc, old_cwd=old_cwd)
@@ -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
  """