meerschaum 2.9.5__py3-none-any.whl → 3.0.0rc2__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 (158) hide show
  1. meerschaum/__init__.py +5 -2
  2. meerschaum/_internal/__init__.py +1 -0
  3. meerschaum/_internal/arguments/_parse_arguments.py +4 -4
  4. meerschaum/_internal/arguments/_parser.py +19 -2
  5. meerschaum/_internal/docs/index.py +49 -2
  6. meerschaum/_internal/entry.py +6 -6
  7. meerschaum/_internal/shell/Shell.py +1 -1
  8. meerschaum/_internal/static.py +356 -0
  9. meerschaum/actions/api.py +12 -2
  10. meerschaum/actions/bootstrap.py +7 -7
  11. meerschaum/actions/edit.py +142 -18
  12. meerschaum/actions/register.py +137 -6
  13. meerschaum/actions/show.py +117 -29
  14. meerschaum/actions/stop.py +4 -1
  15. meerschaum/actions/sync.py +1 -1
  16. meerschaum/actions/tag.py +9 -8
  17. meerschaum/actions/verify.py +5 -8
  18. meerschaum/api/__init__.py +11 -3
  19. meerschaum/api/_events.py +39 -2
  20. meerschaum/api/_oauth2.py +118 -8
  21. meerschaum/api/_tokens.py +102 -0
  22. meerschaum/api/dash/__init__.py +0 -3
  23. meerschaum/api/dash/callbacks/custom.py +2 -2
  24. meerschaum/api/dash/callbacks/dashboard.py +103 -19
  25. meerschaum/api/dash/callbacks/plugins.py +0 -1
  26. meerschaum/api/dash/callbacks/register.py +1 -1
  27. meerschaum/api/dash/callbacks/settings/__init__.py +1 -0
  28. meerschaum/api/dash/callbacks/settings/password_reset.py +2 -2
  29. meerschaum/api/dash/callbacks/settings/tokens.py +388 -0
  30. meerschaum/api/dash/components.py +30 -8
  31. meerschaum/api/dash/keys.py +19 -93
  32. meerschaum/api/dash/pages/dashboard.py +1 -20
  33. meerschaum/api/dash/pages/settings/__init__.py +1 -0
  34. meerschaum/api/dash/pages/settings/password_reset.py +1 -1
  35. meerschaum/api/dash/pages/settings/tokens.py +55 -0
  36. meerschaum/api/dash/pipes.py +94 -59
  37. meerschaum/api/dash/sessions.py +12 -0
  38. meerschaum/api/dash/tokens.py +606 -0
  39. meerschaum/api/dash/websockets.py +1 -1
  40. meerschaum/api/dash/webterm.py +4 -0
  41. meerschaum/api/models/__init__.py +23 -3
  42. meerschaum/api/models/_actions.py +22 -0
  43. meerschaum/api/models/_pipes.py +85 -7
  44. meerschaum/api/models/_tokens.py +81 -0
  45. meerschaum/api/resources/templates/termpage.html +12 -0
  46. meerschaum/api/routes/__init__.py +1 -0
  47. meerschaum/api/routes/_actions.py +3 -4
  48. meerschaum/api/routes/_connectors.py +3 -7
  49. meerschaum/api/routes/_jobs.py +14 -35
  50. meerschaum/api/routes/_login.py +49 -12
  51. meerschaum/api/routes/_misc.py +5 -10
  52. meerschaum/api/routes/_pipes.py +173 -140
  53. meerschaum/api/routes/_plugins.py +38 -28
  54. meerschaum/api/routes/_tokens.py +236 -0
  55. meerschaum/api/routes/_users.py +47 -35
  56. meerschaum/api/routes/_version.py +3 -3
  57. meerschaum/config/__init__.py +43 -20
  58. meerschaum/config/_default.py +43 -6
  59. meerschaum/config/_edit.py +28 -24
  60. meerschaum/config/_environment.py +1 -1
  61. meerschaum/config/_patch.py +6 -6
  62. meerschaum/config/_paths.py +5 -1
  63. meerschaum/config/_read_config.py +65 -34
  64. meerschaum/config/_sync.py +6 -3
  65. meerschaum/config/_version.py +1 -1
  66. meerschaum/config/stack/__init__.py +31 -11
  67. meerschaum/config/static.py +18 -0
  68. meerschaum/connectors/_Connector.py +10 -4
  69. meerschaum/connectors/__init__.py +4 -20
  70. meerschaum/connectors/api/_APIConnector.py +34 -6
  71. meerschaum/connectors/api/_actions.py +2 -2
  72. meerschaum/connectors/api/_jobs.py +1 -1
  73. meerschaum/connectors/api/_login.py +33 -7
  74. meerschaum/connectors/api/_misc.py +2 -2
  75. meerschaum/connectors/api/_pipes.py +16 -31
  76. meerschaum/connectors/api/_plugins.py +2 -2
  77. meerschaum/connectors/api/_request.py +1 -1
  78. meerschaum/connectors/api/_tokens.py +146 -0
  79. meerschaum/connectors/api/_users.py +70 -58
  80. meerschaum/connectors/instance/_InstanceConnector.py +83 -0
  81. meerschaum/connectors/instance/__init__.py +10 -0
  82. meerschaum/connectors/instance/_pipes.py +442 -0
  83. meerschaum/connectors/instance/_plugins.py +151 -0
  84. meerschaum/connectors/instance/_tokens.py +296 -0
  85. meerschaum/connectors/instance/_users.py +181 -0
  86. meerschaum/connectors/parse.py +4 -1
  87. meerschaum/connectors/sql/_SQLConnector.py +8 -5
  88. meerschaum/connectors/sql/_cli.py +12 -11
  89. meerschaum/connectors/sql/_create_engine.py +9 -168
  90. meerschaum/connectors/sql/_fetch.py +2 -18
  91. meerschaum/connectors/sql/_pipes.py +156 -190
  92. meerschaum/connectors/sql/_plugins.py +29 -0
  93. meerschaum/connectors/sql/_sql.py +46 -21
  94. meerschaum/connectors/sql/_users.py +29 -2
  95. meerschaum/connectors/sql/tables/__init__.py +1 -1
  96. meerschaum/connectors/valkey/_ValkeyConnector.py +2 -4
  97. meerschaum/connectors/valkey/_pipes.py +53 -26
  98. meerschaum/connectors/valkey/_plugins.py +2 -26
  99. meerschaum/core/Pipe/__init__.py +59 -19
  100. meerschaum/core/Pipe/_attributes.py +412 -90
  101. meerschaum/core/Pipe/_bootstrap.py +54 -24
  102. meerschaum/core/Pipe/_data.py +96 -18
  103. meerschaum/core/Pipe/_dtypes.py +48 -18
  104. meerschaum/core/Pipe/_edit.py +14 -4
  105. meerschaum/core/Pipe/_fetch.py +1 -1
  106. meerschaum/core/Pipe/_show.py +5 -5
  107. meerschaum/core/Pipe/_sync.py +118 -193
  108. meerschaum/core/Pipe/_verify.py +4 -4
  109. meerschaum/{plugins → core/Plugin}/_Plugin.py +9 -11
  110. meerschaum/core/Plugin/__init__.py +1 -1
  111. meerschaum/core/Token/_Token.py +220 -0
  112. meerschaum/core/Token/__init__.py +12 -0
  113. meerschaum/core/User/_User.py +34 -8
  114. meerschaum/core/User/__init__.py +9 -1
  115. meerschaum/core/__init__.py +1 -0
  116. meerschaum/jobs/_Job.py +3 -2
  117. meerschaum/jobs/__init__.py +3 -2
  118. meerschaum/jobs/systemd.py +1 -1
  119. meerschaum/models/__init__.py +35 -0
  120. meerschaum/models/pipes.py +247 -0
  121. meerschaum/models/tokens.py +38 -0
  122. meerschaum/models/users.py +26 -0
  123. meerschaum/plugins/__init__.py +22 -7
  124. meerschaum/plugins/bootstrap.py +2 -1
  125. meerschaum/utils/_get_pipes.py +68 -27
  126. meerschaum/utils/daemon/Daemon.py +2 -1
  127. meerschaum/utils/daemon/__init__.py +30 -2
  128. meerschaum/utils/dataframe.py +473 -81
  129. meerschaum/utils/debug.py +15 -15
  130. meerschaum/utils/dtypes/__init__.py +473 -34
  131. meerschaum/utils/dtypes/sql.py +368 -28
  132. meerschaum/utils/formatting/__init__.py +1 -1
  133. meerschaum/utils/formatting/_pipes.py +5 -4
  134. meerschaum/utils/formatting/_shell.py +11 -9
  135. meerschaum/utils/misc.py +246 -148
  136. meerschaum/utils/packages/__init__.py +10 -27
  137. meerschaum/utils/packages/_packages.py +41 -34
  138. meerschaum/utils/pipes.py +181 -0
  139. meerschaum/utils/process.py +1 -1
  140. meerschaum/utils/prompt.py +3 -1
  141. meerschaum/utils/schedule.py +2 -1
  142. meerschaum/utils/sql.py +121 -44
  143. meerschaum/utils/typing.py +1 -4
  144. meerschaum/utils/venv/_Venv.py +2 -2
  145. meerschaum/utils/venv/__init__.py +5 -7
  146. {meerschaum-2.9.5.dist-info → meerschaum-3.0.0rc2.dist-info}/METADATA +92 -96
  147. meerschaum-3.0.0rc2.dist-info/RECORD +283 -0
  148. {meerschaum-2.9.5.dist-info → meerschaum-3.0.0rc2.dist-info}/WHEEL +1 -1
  149. meerschaum-3.0.0rc2.dist-info/licenses/NOTICE +2 -0
  150. meerschaum/api/models/_interfaces.py +0 -15
  151. meerschaum/api/models/_locations.py +0 -15
  152. meerschaum/api/models/_metrics.py +0 -15
  153. meerschaum/config/static/__init__.py +0 -186
  154. meerschaum-2.9.5.dist-info/RECORD +0 -263
  155. {meerschaum-2.9.5.dist-info → meerschaum-3.0.0rc2.dist-info}/entry_points.txt +0 -0
  156. {meerschaum-2.9.5.dist-info → meerschaum-3.0.0rc2.dist-info}/licenses/LICENSE +0 -0
  157. {meerschaum-2.9.5.dist-info → meerschaum-3.0.0rc2.dist-info}/top_level.txt +0 -0
  158. {meerschaum-2.9.5.dist-info → meerschaum-3.0.0rc2.dist-info}/zip-safe +0 -0
meerschaum/__init__.py CHANGED
@@ -3,7 +3,7 @@
3
3
  # vim:fenc=utf-8
4
4
 
5
5
  """
6
- Copyright 2023 Bennett Meares
6
+ Copyright 2025 Bennett Meares
7
7
 
8
8
  Licensed under the Apache License, Version 2.0 (the "License");
9
9
  you may not use this file except in compliance with the License.
@@ -19,13 +19,14 @@ limitations under the License.
19
19
  """
20
20
 
21
21
  import atexit
22
+
22
23
  from meerschaum.utils.typing import SuccessTuple
23
24
  from meerschaum.utils.packages import attempt_import
24
25
  from meerschaum.core.Pipe import Pipe
25
26
  from meerschaum.plugins import Plugin
26
27
  from meerschaum.utils.venv import Venv
27
28
  from meerschaum.jobs import Job, make_executor
28
- from meerschaum.connectors import get_connector, Connector, make_connector
29
+ from meerschaum.connectors import get_connector, Connector, InstanceConnector, make_connector
29
30
  from meerschaum.utils import get_pipes
30
31
  from meerschaum.utils.formatting import pprint
31
32
  from meerschaum._internal.docs import index as __doc__
@@ -42,6 +43,7 @@ __all__ = (
42
43
  "get_config",
43
44
  "Pipe",
44
45
  "Plugin",
46
+ "SuccessTuple",
45
47
  "Venv",
46
48
  "Plugin",
47
49
  "Job",
@@ -55,6 +57,7 @@ __all__ = (
55
57
  "utils",
56
58
  "SuccessTuple",
57
59
  "Connector",
60
+ "InstanceConnector",
58
61
  "make_connector",
59
62
  "entry",
60
63
  )
@@ -6,3 +6,4 @@
6
6
  Modules, classes, and variables declared in _internal are not intended for general public use.
7
7
  """
8
8
 
9
+ from meerschaum._internal.static import STATIC_CONFIG
@@ -23,7 +23,7 @@ def split_pipeline_sysargs(sysargs: List[str]) -> Tuple[List[str], List[str]]:
23
23
  """
24
24
  Split `sysargs` into the main pipeline and the flags following the pipeline separator (`:`).
25
25
  """
26
- from meerschaum.config.static import STATIC_CONFIG
26
+ from meerschaum._internal.static import STATIC_CONFIG
27
27
  pipeline_key = STATIC_CONFIG['system']['arguments']['pipeline_key']
28
28
  if pipeline_key not in sysargs:
29
29
  return sysargs, []
@@ -40,7 +40,7 @@ def split_chained_sysargs(sysargs: List[str]) -> List[List[str]]:
40
40
  Split a `sysargs` list containing "and" keys (`+`)
41
41
  into a list of individual `sysargs`.
42
42
  """
43
- from meerschaum.config.static import STATIC_CONFIG
43
+ from meerschaum._internal.static import STATIC_CONFIG
44
44
  and_key = STATIC_CONFIG['system']['arguments']['and_key']
45
45
 
46
46
  if not sysargs or and_key not in sysargs:
@@ -90,7 +90,7 @@ def parse_arguments(sysargs: List[str]) -> Dict[str, Any]:
90
90
 
91
91
  """
92
92
  import shlex
93
- from meerschaum.config.static import STATIC_CONFIG
93
+ from meerschaum._internal.static import STATIC_CONFIG
94
94
  from meerschaum._internal.arguments._parser import parser
95
95
 
96
96
  global _loaded_plugins_args
@@ -360,7 +360,7 @@ def remove_leading_action(
360
360
  """
361
361
  from meerschaum.actions import get_action, get_main_action_name
362
362
  from meerschaum.utils.warnings import warn
363
- from meerschaum.config.static import STATIC_CONFIG
363
+ from meerschaum._internal.static import STATIC_CONFIG
364
364
  action_function = get_action(action, _actions=_actions)
365
365
  if action_function is None:
366
366
  return action
@@ -40,7 +40,8 @@ class ArgumentParser(argparse.ArgumentParser):
40
40
 
41
41
  def parse_datetime(dt_str: str) -> Union[datetime, int, str]:
42
42
  """Parse a string into a datetime."""
43
- from meerschaum.utils.misc import is_int, round_time
43
+ from meerschaum.utils.dtypes import round_time
44
+ from meerschaum.utils.misc import is_int
44
45
  if is_int(dt_str):
45
46
  return int(dt_str)
46
47
 
@@ -195,6 +196,7 @@ groups['pipes'] = parser.add_argument_group(title='Pipes options')
195
196
  groups['sync'] = parser.add_argument_group(title='Sync options')
196
197
  groups['api'] = parser.add_argument_group(title='API options')
197
198
  groups['plugins'] = parser.add_argument_group(title='Plugins options')
199
+ groups['tokens'] = parser.add_argument_group(title='Tokens options')
198
200
  groups['packages'] = parser.add_argument_group(title='Packages options')
199
201
  groups['debug'] = parser.add_argument_group(title='Debugging options')
200
202
  groups['misc'] = parser.add_argument_group(title='Miscellaneous options')
@@ -393,7 +395,11 @@ groups['api'].add_argument(
393
395
  )
394
396
  groups['api'].add_argument(
395
397
  '--no-dash', '--nodash', action='store_true',
396
- help = 'When starting the API, do not start the Web interface.',
398
+ help = 'When starting the API, do not start the Web Console dashboard.',
399
+ )
400
+ groups['api'].add_argument(
401
+ '--no-webterm', '--nowebterm', action='store_true',
402
+ help="When starting the API, do not start the Webterm.",
397
403
  )
398
404
  groups['api'].add_argument(
399
405
  '--private', '--private-mode', action='store_true',
@@ -419,12 +425,23 @@ groups['api'].add_argument(
419
425
  '--certfile', type=str,
420
426
  help = "Start the API server with this certfile (requires --keyfile).",
421
427
  )
428
+
422
429
  ### Plugins options
423
430
  groups['plugins'].add_argument(
424
431
  '-r', '--repository', '--repo', type=str,
425
432
  help="Meerschaum plugins repository to connect to. Specify an API label (default: 'mrsm')"
426
433
  )
427
434
 
435
+ ### Tokens options
436
+ groups['tokens'].add_argument(
437
+ '--ttl-days', type=int,
438
+ help="For how many days should a token be valid.",
439
+ )
440
+ groups['tokens'].add_argument(
441
+ '--scopes', '--scope', nargs='+',
442
+ help="Which scope permissions to grant to a token.",
443
+ )
444
+
428
445
  ### Packages options
429
446
  groups['packages'].add_argument(
430
447
  '--venv', type=str,
@@ -98,7 +98,7 @@ Decorate your connector classes with `meerschaum.make_connector()` to designate
98
98
  from datetime import datetime, timezone
99
99
  from random import randint
100
100
  import meerschaum as mrsm
101
- from meerschaum.utils.misc import round_time
101
+ from meerschaum.utils.dtypes import round_time
102
102
 
103
103
  @mrsm.make_connector
104
104
  class FooConnector(mrsm.Connector):
@@ -535,14 +535,25 @@ def init_dash(dash_app):
535
535
  <p></p>
536
536
  <ul>
537
537
  <li><code>meerschaum.utils.dataframe.add_missing_cols_to_df()</code></li>
538
+ <li><code>meerschaum.utils.dataframe.chunksize_to_npartitions()</code></li>
539
+ <li><code>meerschaum.utils.dataframe.df_from_literal()</code></li>
538
540
  <li><code>meerschaum.utils.dataframe.df_is_chunk_generator()</code></li>
539
541
  <li><code>meerschaum.utils.dataframe.enforce_dtypes()</code></li>
540
542
  <li><code>meerschaum.utils.dataframe.filter_unseen_df()</code></li>
543
+ <li><code>meerschaum.utils.dataframe.get_bool_cols()</code></li>
544
+ <li><code>meerschaum.utils.dataframe.get_bytes_cols()</code></li>
541
545
  <li><code>meerschaum.utils.dataframe.get_datetime_bound_from_df()</code></li>
546
+ <li><code>meerschaum.utils.dataframe.get_datetime_cols()</code></li>
547
+ <li><code>meerschaum.utils.dataframe.get_datetime_cols_types()</code></li>
542
548
  <li><code>meerschaum.utils.dataframe.get_first_valid_dask_partition()</code></li>
549
+ <li><code>meerschaum.utils.dataframe.get_geometry_cols()</code></li>
550
+ <li><code>meerschaum.utils.dataframe.get_geometry_cols_types()</code></li>
543
551
  <li><code>meerschaum.utils.dataframe.get_json_cols()</code></li>
544
552
  <li><code>meerschaum.utils.dataframe.get_numeric_cols()</code></li>
553
+ <li><code>meerschaum.utils.dataframe.get_special_cols()</code></li>
545
554
  <li><code>meerschaum.utils.dataframe.get_unhashable_cols()</code></li>
555
+ <li><code>meerschaum.utils.dataframe.get_unique_index_values()</code></li>
556
+ <li><code>meerschaum.utils.dataframe.get_uuid_cols()</code></li>
546
557
  <li><code>meerschaum.utils.dataframe.parse_df_datetimes()</code></li>
547
558
  <li><code>meerschaum.utils.dataframe.query_df()</code></li>
548
559
  <li><code>meerschaum.utils.dataframe.to_json()</code></li>
@@ -559,14 +570,51 @@ def init_dash(dash_app):
559
570
  <p></p>
560
571
  <ul>
561
572
  <li><code>meerschaum.utils.dtypes.are_dtypes_equal()</code></li>
573
+ <li><code>meerschaum.utils.dtypes.attempt_cast_to_bytes()</code></li>
574
+ <li><code>meerschaum.utils.dtypes.attempt_cast_to_geometry()</code></li>
562
575
  <li><code>meerschaum.utils.dtypes.attempt_cast_to_numeric()</code></li>
576
+ <li><code>meerschaum.utils.dtypes.attempt_cast_to_uuid()</code></li>
577
+ <li><code>meerschaum.utils.dtypes.coerce_timezone()</code></li>
578
+ <li><code>meerschaum.utils.dtypes.deserialize_base64()</code></li>
579
+ <li><code>meerschaum.utils.dtypes.deserialize_bytes_string()</code></li>
580
+ <li><code>meerschaum.utils.dtypes.deserialize_geometry()</code></li>
581
+ <li><code>meerschaum.utils.dtypes.dtype_is_special()</code></li>
582
+ <li><code>meerschaum.utils.dtypes.encode_bytes_for_bytea()</code></li>
583
+ <li><code>meerschaum.utils.dtypes.geometry_is_wkt()</code></li>
584
+ <li><code>meerschaum.utils.dtypes.get_current_timestamp()</code></li>
585
+ <li><code>meerschaum.utils.dtypes.get_geometry_type_srid()</code></li>
563
586
  <li><code>meerschaum.utils.dtypes.is_dtype_numeric()</code></li>
587
+ <li><code>meerschaum.utils.dtypes.json_serialize_value()</code></li>
564
588
  <li><code>meerschaum.utils.dtypes.none_if_null()</code></li>
589
+ <li><code>meerschaum.utils.dtypes.project_geometry()</code></li>
565
590
  <li><code>meerschaum.utils.dtypes.quantize_decimal()</code></li>
591
+ <li><code>meerschaum.utils.dtypes.serialize_bytes()</code></li>
592
+ <li><code>meerschaum.utils.dtypes.serialize_datetime()</code></li>
593
+ <li><code>meerschaum.utils.dtypes.serialize_date()</code></li>
594
+ <li><code>meerschaum.utils.dtypes.serialize_decimal()</code></li>
595
+ <li><code>meerschaum.utils.dtypes.serialize_geometry()</code></li>
596
+ <li><code>meerschaum.utils.dtypes.to_datetime()</code></li>
566
597
  <li><code>meerschaum.utils.dtypes.to_pandas_dtype()</code></li>
567
598
  <li><code>meerschaum.utils.dtypes.value_is_null()</code></li>
599
+ <li><code>meerschaum.utils.dtypes.get_current_timestamp()</code></li>
600
+ <li><code>meerschaum.utils.dtypes.dtype_is_special()</code></li>
601
+ <li><code>meerschaum.utils.dtypes.get_next_precision_unit()</code></li>
602
+ <li><code>meerschaum.utils.dtypes.round_time()</code></li>
603
+ </ul>
604
+ </details>
605
+ </ul>
606
+
607
+ <ul>
608
+ <details>
609
+ <summary>
610
+ <code>meerschaum.utils.dtypes.sql</code><br>
611
+ Work with SQL data types.<br>
612
+ </summary>
613
+ <p></p>
614
+ <ul>
568
615
  <li><code>meerschaum.utils.dtypes.sql.get_pd_type_from_db_type()</code></li>
569
616
  <li><code>meerschaum.utils.dtypes.sql.get_db_type_from_pd_type()</code></li>
617
+ <li><code>meerschaum.utils.dtypes.sql.get_numeric_precision_scale()</code></li>
570
618
  </ul>
571
619
  </details>
572
620
  </ul>
@@ -605,7 +653,6 @@ def init_dash(dash_app):
605
653
  <p></p>
606
654
  <ul>
607
655
  <li><code>meerschaum.utils.misc.items_str()</code></li>
608
- <li><code>meerschaum.utils.misc.round_time()</code></li>
609
656
  <li><code>meerschaum.utils.misc.is_int()</code></li>
610
657
  <li><code>meerschaum.utils.misc.interval_str()</code></li>
611
658
  <li><code>meerschaum.utils.misc.filter_keywords()</code></li>
@@ -15,7 +15,7 @@ import pathlib
15
15
 
16
16
  import meerschaum as mrsm
17
17
  from meerschaum.utils.typing import SuccessTuple, List, Optional, Dict, Callable, Any
18
- from meerschaum.config.static import STATIC_CONFIG as _STATIC_CONFIG
18
+ from meerschaum._internal.static import STATIC_CONFIG as _STATIC_CONFIG
19
19
 
20
20
  _systemd_result_path = None
21
21
  if (_STATIC_CONFIG['environment']['systemd_log_path']) in os.environ:
@@ -66,7 +66,7 @@ def entry(
66
66
  sysargs_has_api_executor_keys,
67
67
  get_pipeline_sysargs,
68
68
  )
69
- from meerschaum.config.static import STATIC_CONFIG
69
+ from meerschaum._internal.static import STATIC_CONFIG
70
70
  if sysargs is None:
71
71
  sysargs = []
72
72
  if not isinstance(sysargs, list):
@@ -206,7 +206,7 @@ def entry_with_args(
206
206
  from meerschaum.actions import get_action
207
207
  from meerschaum._internal.arguments import remove_leading_action
208
208
  from meerschaum.utils.venv import active_venvs, deactivate_venv
209
- from meerschaum.config.static import STATIC_CONFIG
209
+ from meerschaum._internal.static import STATIC_CONFIG
210
210
  from meerschaum.utils.typing import is_success_tuple
211
211
 
212
212
  if _patch_args:
@@ -325,9 +325,9 @@ def _do_action_wrapper(
325
325
  import traceback
326
326
  traceback.print_exception(type(e), e, e.__traceback__)
327
327
  result = False, (
328
- f"Failed to execute `{action_name}` "
329
- + "with exception:\n\n" +
330
- f"{e}."
328
+ f"Failed to execute `{action_name.strip()}` "
329
+ + f"with `{type(e).__name__}`"
330
+ + (f':\n\n{e}' if str(e) else '.')
331
331
  + (
332
332
  "\n\nRun again with '--debug' to see a full stacktrace."
333
333
  if not kw.get('debug', False) else ''
@@ -35,7 +35,7 @@ _clear_screen = get_config('shell', 'clear_screen', patch=True)
35
35
  from meerschaum.utils.misc import string_width, remove_ansi
36
36
  from meerschaum.utils.warnings import warn
37
37
  from meerschaum.jobs import get_executor_keys_from_context
38
- from meerschaum.config.static import STATIC_CONFIG
38
+ from meerschaum._internal.static import STATIC_CONFIG
39
39
  from meerschaum._internal.arguments._parse_arguments import (
40
40
  split_chained_sysargs,
41
41
  split_pipeline_sysargs,
@@ -0,0 +1,356 @@
1
+ #! /usr/bin/env python3
2
+ # vim:fenc=utf-8
3
+
4
+ """
5
+ Define internal static config (formerly `meerschaum.config.static`).
6
+ """
7
+
8
+ import os
9
+ import random
10
+ import string
11
+ from typing import Dict, Any
12
+
13
+ __all__ = ('STATIC_CONFIG',)
14
+
15
+ _default_create_engine_args = {
16
+ # 'method': 'multi',
17
+ 'pool_size': (os.cpu_count() or 5),
18
+ 'max_overflow': (os.cpu_count() or 10),
19
+ 'pool_recycle': 3600,
20
+ 'connect_args': {},
21
+ }
22
+ _default_db_requirements = {
23
+ 'username',
24
+ 'password',
25
+ 'host',
26
+ 'database',
27
+ }
28
+ SERVER_ID: str = os.environ.get('MRSM_SERVER_ID', ''.join(random.sample(string.ascii_lowercase+string.digits, 6)))
29
+ STATIC_CONFIG: Dict[str, Any] = {
30
+ 'api': {
31
+ 'endpoints': {
32
+ 'index': '/',
33
+ 'favicon': '/favicon.ico',
34
+ 'plugins': '/plugins',
35
+ 'pipes': '/pipes',
36
+ 'metadata': '/metadata',
37
+ 'actions': '/actions',
38
+ 'jobs': '/jobs',
39
+ 'logs': '/logs',
40
+ 'users': '/users',
41
+ 'tokens': '/tokens',
42
+ 'login': '/login',
43
+ 'connectors': '/connectors',
44
+ 'version': '/version',
45
+ 'chaining': '/chaining',
46
+ 'websocket': '/ws',
47
+ 'dash': '/dash',
48
+ 'webterm': r'/webterm/{session_id}',
49
+ 'webterm_websocket': r'/websocket/{session_id}',
50
+ 'info': '/info',
51
+ 'healthcheck': '/healthcheck',
52
+ 'docs': '/docs',
53
+ 'redoc': '/redoc',
54
+ 'openapi': '/openapi.json',
55
+ },
56
+ 'oauth': {
57
+ 'token_expires_minutes': 720,
58
+ },
59
+ 'webterm_job_name': '_webterm',
60
+ 'default_timeout': 600,
61
+ 'jobs': {
62
+ 'stdin_message': 'MRSM_STDIN',
63
+ 'stop_message': 'MRSM_STOP',
64
+ 'metadata_cache_seconds': 5,
65
+ 'temp_prefix': '.api-temp-',
66
+ },
67
+ },
68
+ 'sql': {
69
+ 'internal_schema': '_mrsm_internal',
70
+ 'instance_schema': 'mrsm',
71
+ 'default_create_engine_args': _default_create_engine_args,
72
+ 'create_engine_flavors': {
73
+ 'timescaledb': {
74
+ 'engine': 'postgresql+psycopg',
75
+ 'create_engine': _default_create_engine_args,
76
+ 'omit_create_engine': {'method',},
77
+ 'to_sql': {},
78
+ 'requirements': _default_db_requirements,
79
+ 'defaults': {
80
+ 'port': 5432,
81
+ },
82
+ },
83
+ 'timescaledb-ha': {
84
+ 'engine': 'postgresql+psycopg',
85
+ 'create_engine': _default_create_engine_args,
86
+ 'omit_create_engine': {'method',},
87
+ 'to_sql': {},
88
+ 'requirements': _default_db_requirements,
89
+ 'defaults': {
90
+ 'port': 5432,
91
+ },
92
+ },
93
+ 'postgresql': {
94
+ 'engine': 'postgresql+psycopg',
95
+ 'create_engine': _default_create_engine_args,
96
+ 'omit_create_engine': {'method',},
97
+ 'to_sql': {},
98
+ 'requirements': _default_db_requirements,
99
+ 'defaults': {
100
+ 'port': 5432,
101
+ },
102
+ },
103
+ 'postgis': {
104
+ 'engine': 'postgresql+psycopg',
105
+ 'create_engine': _default_create_engine_args,
106
+ 'omit_create_engine': {'method',},
107
+ 'to_sql': {},
108
+ 'requirements': _default_db_requirements,
109
+ 'defaults': {
110
+ 'port': 5432,
111
+ },
112
+ },
113
+ 'citus': {
114
+ 'engine': 'postgresql+psycopg',
115
+ 'create_engine': _default_create_engine_args,
116
+ 'omit_create_engine': {'method',},
117
+ 'to_sql': {},
118
+ 'requirements': _default_db_requirements,
119
+ 'defaults': {
120
+ 'port': 5432,
121
+ },
122
+ },
123
+ 'mssql': {
124
+ 'engine': 'mssql+pyodbc',
125
+ 'create_engine': {
126
+ 'fast_executemany': True,
127
+ 'use_insertmanyvalues': False,
128
+ 'isolation_level': 'AUTOCOMMIT',
129
+ 'use_setinputsizes': False,
130
+ 'pool_pre_ping': True,
131
+ 'ignore_no_transaction_on_rollback': True,
132
+ },
133
+ 'omit_create_engine': {'method',},
134
+ 'to_sql': {
135
+ 'method': None,
136
+ },
137
+ 'requirements': _default_db_requirements,
138
+ 'defaults': {
139
+ 'port': 1433,
140
+ 'options': (
141
+ "driver=ODBC Driver 18 for SQL Server"
142
+ "&UseFMTONLY=Yes"
143
+ "&TrustServerCertificate=yes"
144
+ "&Encrypt=no"
145
+ "&MARS_Connection=yes"
146
+ ),
147
+ },
148
+ },
149
+ 'mysql': {
150
+ 'engine': 'mysql+pymysql',
151
+ 'create_engine': _default_create_engine_args,
152
+ 'omit_create_engine': {'method',},
153
+ 'to_sql': {
154
+ 'method': 'multi',
155
+ },
156
+ 'requirements': _default_db_requirements,
157
+ 'defaults': {
158
+ 'port': 3306,
159
+ },
160
+ },
161
+ 'mariadb': {
162
+ 'engine': 'mysql+pymysql',
163
+ 'create_engine': _default_create_engine_args,
164
+ 'omit_create_engine': {'method',},
165
+ 'to_sql': {
166
+ 'method': 'multi',
167
+ },
168
+ 'requirements': _default_db_requirements,
169
+ 'defaults': {
170
+ 'port': 3306,
171
+ },
172
+ },
173
+ 'oracle': {
174
+ 'engine': 'oracle+oracledb',
175
+ 'create_engine': _default_create_engine_args,
176
+ 'omit_create_engine': {'method',},
177
+ 'to_sql': {
178
+ 'method': None,
179
+ },
180
+ 'requirements': _default_db_requirements,
181
+ 'defaults': {
182
+ 'port': 1521,
183
+ },
184
+ },
185
+ 'sqlite': {
186
+ 'engine': 'sqlite',
187
+ 'create_engine': _default_create_engine_args,
188
+ 'omit_create_engine': {'method',},
189
+ 'to_sql': {
190
+ 'method': 'multi',
191
+ },
192
+ 'requirements': {'database'},
193
+ 'defaults': {},
194
+ },
195
+ 'duckdb': {
196
+ 'engine': 'duckdb',
197
+ 'create_engine': {},
198
+ 'omit_create_engine': {'ALL',},
199
+ 'to_sql': {
200
+ 'method': 'multi',
201
+ },
202
+ 'requirements': '',
203
+ 'defaults': {},
204
+ },
205
+ 'cockroachdb': {
206
+ 'engine': 'cockroachdb',
207
+ 'omit_create_engine': {'method',},
208
+ 'create_engine': _default_create_engine_args,
209
+ 'to_sql': {
210
+ 'method': 'multi',
211
+ },
212
+ 'requirements': {'host'},
213
+ 'defaults': {
214
+ 'port': 26257,
215
+ 'database': 'defaultdb',
216
+ 'username': 'root',
217
+ 'password': 'admin',
218
+ },
219
+ },
220
+ },
221
+ },
222
+ 'valkey': {
223
+ 'colon': '-_',
224
+ },
225
+ 'environment': {
226
+ 'config': 'MRSM_CONFIG',
227
+ 'config_dir': 'MRSM_CONFIG_DIR',
228
+ 'patch': 'MRSM_PATCH',
229
+ 'root': 'MRSM_ROOT_DIR',
230
+ 'plugins': 'MRSM_PLUGINS_DIR',
231
+ 'venvs': 'MRSM_VENVS_DIR',
232
+ 'runtime': 'MRSM_RUNTIME',
233
+ 'work_dir': 'MRSM_WORK_DIR',
234
+ 'user': 'MRSM_USER',
235
+ 'dep_group': 'MRSM_DEP_GROUP',
236
+ 'home': 'MRSM_HOME',
237
+ 'src': 'MRSM_SRC',
238
+ 'uid': 'MRSM_UID',
239
+ 'gid': 'MRSM_GID',
240
+ 'noask': 'MRSM_NOASK',
241
+ 'noninteractive': 'MRSM_NONINTERACTIVE',
242
+ 'id': 'MRSM_SERVER_ID',
243
+ 'daemon_id': 'MRSM_DAEMON_ID',
244
+ 'systemd_log_path': 'MRSM_SYSTEMD_LOG_PATH',
245
+ 'systemd_stdin_path': 'MRSM_SYSTEMD_STDIN_PATH',
246
+ 'systemd_result_path': 'MRSM_SYSTEMD_RESULT_PATH',
247
+ 'systemd_delete_job': 'MRSM_SYSTEMD_DELETE_JOB',
248
+ 'uri_regex': r'MRSM_([a-zA-Z0-9]*)_(\d*[a-zA-Z][a-zA-Z0-9-_+]*$)',
249
+ 'prefix': 'MRSM_',
250
+ },
251
+ 'config': {
252
+ 'default_filetype': 'json',
253
+ 'symlinks_key': '_symlinks',
254
+ },
255
+ 'system': {
256
+ 'arguments': {
257
+ 'sub_decorators': (
258
+ '[',
259
+ ']'
260
+ ),
261
+ 'underscore_standin': '<UNDERSCORE>', ### Temporary replacement for parsing.
262
+ 'failure_key': '_argparse_exception',
263
+ 'and_key': '+',
264
+ 'escaped_and_key': '++',
265
+ 'pipeline_key': ':',
266
+ 'escaped_pipeline_key': '::',
267
+ },
268
+ 'urls': {
269
+ 'get-pip.py': 'https://bootstrap.pypa.io/get-pip.py',
270
+ },
271
+ 'success': {
272
+ 'ignore': (
273
+ 'Success',
274
+ 'success'
275
+ 'Succeeded',
276
+ '',
277
+ None,
278
+ ),
279
+ },
280
+ 'prompt': {
281
+ 'web': False,
282
+ },
283
+ 'fetch_pipes_keys': {
284
+ 'negation_prefix': '_',
285
+ },
286
+ },
287
+ 'connectors': {
288
+ 'default_label': 'main',
289
+ },
290
+ 'dtypes': {
291
+ 'datetime': {
292
+ 'default_precision_unit': 'microsecond',
293
+ },
294
+ },
295
+ 'stack': {
296
+ 'dollar_standin': '<DOLLAR>', ### Temporary replacement for docker-compose.yaml.
297
+ },
298
+ 'users': {
299
+ 'password_hash': {
300
+ 'algorithm_name': 'sha256',
301
+ 'salt_bytes': 16,
302
+ 'schemes': [
303
+ 'pbkdf2_sha256',
304
+ ],
305
+ 'default': 'pbkdf2_sha256',
306
+ 'pbkdf2_sha256__default_rounds': 1_000_000,
307
+ },
308
+ 'min_username_length': 1,
309
+ 'max_username_length': 60,
310
+ 'min_password_length': 5,
311
+ },
312
+ 'plugins': {
313
+ 'repo_separator': '@',
314
+ 'lock_sleep_total': 1.0,
315
+ 'lock_sleep_increment': 0.1,
316
+ },
317
+ 'pipes': {
318
+ 'dtypes': {
319
+ 'min_ratio_columns_changed_for_full_astype': 0.5,
320
+ },
321
+ 'max_bound_time_days': 36525,
322
+ },
323
+ 'jobs': {
324
+ 'check_restart_seconds': 1.0,
325
+ },
326
+ 'tokens': {
327
+ 'minimum_length': 24,
328
+ 'maximum_length': 32,
329
+ 'hash_rounds': 100_000,
330
+ 'scopes': {
331
+ 'pipes:read': "Read pipes' parameters and the contents of target tables.",
332
+ 'pipes:write': "Update pipes' parameters and sync to target tables.",
333
+ 'pipes:drop': "Drop target tables.",
334
+ 'pipes:delete': "Delete pipes' parameters and drop target tables.",
335
+ 'actions:execute': "Execute arbitrary actions.",
336
+ 'connectors:read': "Read the available connectors.",
337
+ 'jobs:read': "Read jobs' properties",
338
+ 'jobs:write': "Write jobs' properties",
339
+ 'jobs:execute': "Run jobs.",
340
+ 'jobs:delete': "Delete jobs.",
341
+ 'logs:read': "Read jobs' logs.",
342
+ 'jobs:stop': "Stop running jobs.",
343
+ 'jobs:pause': "Pause running jobs.",
344
+ 'instance:read': "Read an instance's system-level metadata.",
345
+ 'instance:chain': "Allow chaining API instances using the associated credentials.",
346
+ 'plugins:write': "Register and update plugins' metadata.",
347
+ 'plugins:read': "Read attributes of registered plugins.",
348
+ 'plugins:delete': "Delete plugins (owned by user) from the repository.",
349
+ 'users:read': "Read metadata about the associated account.",
350
+ 'users:write': "Write metadata for the associated account.",
351
+ 'users:register': "Register new user accounts.",
352
+ 'users:delete': "Delete the associated user account (or other users for admins).",
353
+ },
354
+ },
355
+
356
+ }