meerschaum 2.3.5.dev0__py3-none-any.whl → 2.4.0__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 (99) hide show
  1. meerschaum/_internal/arguments/__init__.py +2 -1
  2. meerschaum/_internal/arguments/_parse_arguments.py +88 -12
  3. meerschaum/_internal/docs/index.py +3 -2
  4. meerschaum/_internal/entry.py +42 -20
  5. meerschaum/_internal/shell/Shell.py +38 -44
  6. meerschaum/_internal/term/TermPageHandler.py +2 -3
  7. meerschaum/_internal/term/__init__.py +13 -11
  8. meerschaum/actions/api.py +26 -23
  9. meerschaum/actions/bootstrap.py +38 -11
  10. meerschaum/actions/copy.py +3 -3
  11. meerschaum/actions/delete.py +4 -1
  12. meerschaum/actions/register.py +1 -3
  13. meerschaum/actions/stack.py +24 -19
  14. meerschaum/actions/start.py +41 -41
  15. meerschaum/actions/sync.py +53 -52
  16. meerschaum/api/__init__.py +48 -14
  17. meerschaum/api/_events.py +26 -17
  18. meerschaum/api/_oauth2.py +2 -2
  19. meerschaum/api/_websockets.py +5 -4
  20. meerschaum/api/dash/__init__.py +7 -16
  21. meerschaum/api/dash/callbacks/__init__.py +1 -0
  22. meerschaum/api/dash/callbacks/dashboard.py +52 -58
  23. meerschaum/api/dash/callbacks/jobs.py +15 -16
  24. meerschaum/api/dash/callbacks/login.py +16 -10
  25. meerschaum/api/dash/callbacks/pipes.py +41 -0
  26. meerschaum/api/dash/callbacks/plugins.py +1 -1
  27. meerschaum/api/dash/callbacks/register.py +15 -11
  28. meerschaum/api/dash/components.py +54 -59
  29. meerschaum/api/dash/jobs.py +5 -9
  30. meerschaum/api/dash/pages/__init__.py +1 -0
  31. meerschaum/api/dash/pages/pipes.py +19 -0
  32. meerschaum/api/dash/pipes.py +86 -58
  33. meerschaum/api/dash/plugins.py +6 -4
  34. meerschaum/api/dash/sessions.py +176 -0
  35. meerschaum/api/dash/users.py +3 -41
  36. meerschaum/api/dash/webterm.py +12 -17
  37. meerschaum/api/resources/static/js/terminado.js +1 -1
  38. meerschaum/api/routes/_actions.py +4 -118
  39. meerschaum/api/routes/_jobs.py +45 -24
  40. meerschaum/api/routes/_login.py +4 -4
  41. meerschaum/api/routes/_pipes.py +3 -3
  42. meerschaum/api/routes/_webterm.py +5 -6
  43. meerschaum/config/_default.py +15 -3
  44. meerschaum/config/_version.py +1 -1
  45. meerschaum/config/stack/__init__.py +64 -21
  46. meerschaum/config/static/__init__.py +6 -0
  47. meerschaum/connectors/{Connector.py → _Connector.py} +19 -13
  48. meerschaum/connectors/__init__.py +24 -14
  49. meerschaum/connectors/api/{APIConnector.py → _APIConnector.py} +3 -1
  50. meerschaum/connectors/api/__init__.py +2 -1
  51. meerschaum/connectors/api/_actions.py +22 -36
  52. meerschaum/connectors/api/_jobs.py +1 -0
  53. meerschaum/connectors/parse.py +18 -16
  54. meerschaum/connectors/poll.py +30 -24
  55. meerschaum/connectors/sql/__init__.py +3 -1
  56. meerschaum/connectors/sql/_pipes.py +172 -197
  57. meerschaum/connectors/sql/_plugins.py +45 -43
  58. meerschaum/connectors/sql/_users.py +46 -38
  59. meerschaum/connectors/valkey/_ValkeyConnector.py +535 -0
  60. meerschaum/connectors/valkey/__init__.py +10 -0
  61. meerschaum/connectors/valkey/_fetch.py +75 -0
  62. meerschaum/connectors/valkey/_pipes.py +844 -0
  63. meerschaum/connectors/valkey/_plugins.py +265 -0
  64. meerschaum/connectors/valkey/_users.py +305 -0
  65. meerschaum/core/Pipe/__init__.py +3 -0
  66. meerschaum/core/Pipe/_attributes.py +1 -2
  67. meerschaum/core/Pipe/_clear.py +16 -13
  68. meerschaum/core/Pipe/_copy.py +106 -0
  69. meerschaum/core/Pipe/_data.py +165 -101
  70. meerschaum/core/Pipe/_drop.py +4 -4
  71. meerschaum/core/Pipe/_dtypes.py +14 -14
  72. meerschaum/core/Pipe/_edit.py +15 -14
  73. meerschaum/core/Pipe/_sync.py +134 -53
  74. meerschaum/core/Pipe/_verify.py +11 -11
  75. meerschaum/core/User/_User.py +14 -12
  76. meerschaum/jobs/_Job.py +27 -14
  77. meerschaum/jobs/__init__.py +7 -2
  78. meerschaum/jobs/systemd.py +20 -8
  79. meerschaum/plugins/_Plugin.py +17 -13
  80. meerschaum/utils/_get_pipes.py +14 -20
  81. meerschaum/utils/dataframe.py +291 -101
  82. meerschaum/utils/dtypes/__init__.py +31 -6
  83. meerschaum/utils/dtypes/sql.py +4 -4
  84. meerschaum/utils/formatting/_shell.py +5 -6
  85. meerschaum/utils/misc.py +3 -3
  86. meerschaum/utils/packages/__init__.py +14 -9
  87. meerschaum/utils/packages/_packages.py +2 -0
  88. meerschaum/utils/prompt.py +1 -1
  89. meerschaum/utils/schedule.py +1 -0
  90. {meerschaum-2.3.5.dev0.dist-info → meerschaum-2.4.0.dist-info}/METADATA +7 -1
  91. {meerschaum-2.3.5.dev0.dist-info → meerschaum-2.4.0.dist-info}/RECORD +98 -89
  92. {meerschaum-2.3.5.dev0.dist-info → meerschaum-2.4.0.dist-info}/WHEEL +1 -1
  93. meerschaum/api/dash/actions.py +0 -255
  94. /meerschaum/connectors/sql/{SQLConnector.py → _SQLConnector.py} +0 -0
  95. {meerschaum-2.3.5.dev0.dist-info → meerschaum-2.4.0.dist-info}/LICENSE +0 -0
  96. {meerschaum-2.3.5.dev0.dist-info → meerschaum-2.4.0.dist-info}/NOTICE +0 -0
  97. {meerschaum-2.3.5.dev0.dist-info → meerschaum-2.4.0.dist-info}/entry_points.txt +0 -0
  98. {meerschaum-2.3.5.dev0.dist-info → meerschaum-2.4.0.dist-info}/top_level.txt +0 -0
  99. {meerschaum-2.3.5.dev0.dist-info → meerschaum-2.4.0.dist-info}/zip-safe +0 -0
@@ -7,15 +7,19 @@ Functions for managing plugins registration via the SQL connector
7
7
  """
8
8
 
9
9
  from __future__ import annotations
10
+
11
+ import json
12
+
13
+ import meerschaum as mrsm
10
14
  from meerschaum.utils.typing import Optional, Any, List, SuccessTuple, Dict
11
15
 
12
16
  def register_plugin(
13
- self,
14
- plugin: 'meerschaum.core.Plugin',
15
- force: bool = False,
16
- debug: bool = False,
17
- **kw: Any
18
- ) -> SuccessTuple:
17
+ self,
18
+ plugin: 'mrsm.core.Plugin',
19
+ force: bool = False,
20
+ debug: bool = False,
21
+ **kw: Any
22
+ ) -> SuccessTuple:
19
23
  """Register a new plugin to the plugins table."""
20
24
  from meerschaum.utils.warnings import warn, error
21
25
  from meerschaum.utils.packages import attempt_import
@@ -46,14 +50,13 @@ def register_plugin(
46
50
  f"must be greater than existing version '{old_version}'."
47
51
  )
48
52
 
49
- import json
50
53
  bind_variables = {
51
- 'plugin_name' : plugin.name,
52
- 'version' : plugin.version,
53
- 'attributes' : (
54
+ 'plugin_name': plugin.name,
55
+ 'version': plugin.version,
56
+ 'attributes': (
54
57
  json.dumps(plugin.attributes) if self.flavor not in json_flavors else plugin.attributes
55
58
  ),
56
- 'user_id' : plugin.user_id,
59
+ 'user_id': plugin.user_id,
57
60
  }
58
61
 
59
62
  if old_id is None:
@@ -71,10 +74,10 @@ def register_plugin(
71
74
  return True, f"Successfully registered plugin '{plugin}'."
72
75
 
73
76
  def get_plugin_id(
74
- self,
75
- plugin: 'meerschaum.core.Plugin',
76
- debug: bool = False
77
- ) -> Optional[int]:
77
+ self,
78
+ plugin: 'mrsm.core.Plugin',
79
+ debug: bool = False
80
+ ) -> Optional[int]:
78
81
  """
79
82
  Return a plugin's ID.
80
83
  """
@@ -96,10 +99,10 @@ def get_plugin_id(
96
99
  return None
97
100
 
98
101
  def get_plugin_version(
99
- self,
100
- plugin: 'meerschaum.core.Plugin',
101
- debug: bool = False
102
- ) -> Optional[str]:
102
+ self,
103
+ plugin: 'mrsm.core.Plugin',
104
+ debug: bool = False
105
+ ) -> Optional[str]:
103
106
  """
104
107
  Return a plugin's version.
105
108
  """
@@ -112,10 +115,10 @@ def get_plugin_version(
112
115
  return self.value(query, debug=debug)
113
116
 
114
117
  def get_plugin_user_id(
115
- self,
116
- plugin: 'meerschaum.core.Plugin',
117
- debug: bool = False
118
- ) -> Optional[int]:
118
+ self,
119
+ plugin: 'mrsm.core.Plugin',
120
+ debug: bool = False
121
+ ) -> Optional[int]:
119
122
  """
120
123
  Return a plugin's user ID.
121
124
  """
@@ -137,10 +140,10 @@ def get_plugin_user_id(
137
140
  return None
138
141
 
139
142
  def get_plugin_username(
140
- self,
141
- plugin: 'meerschaum.core.Plugin',
142
- debug: bool = False
143
- ) -> Optional[str]:
143
+ self,
144
+ plugin: 'mrsm.core.Plugin',
145
+ debug: bool = False
146
+ ) -> Optional[str]:
144
147
  """
145
148
  Return the username of a plugin's owner.
146
149
  """
@@ -163,16 +166,15 @@ def get_plugin_username(
163
166
 
164
167
 
165
168
  def get_plugin_attributes(
166
- self,
167
- plugin: 'meerschaum.core.Plugin',
168
- debug: bool = False
169
- ) -> Dict[str, Any]:
169
+ self,
170
+ plugin: 'mrsm.core.Plugin',
171
+ debug: bool = False
172
+ ) -> Dict[str, Any]:
170
173
  """
171
174
  Return the attributes of a plugin.
172
175
  """
173
176
  ### ensure plugins table exists
174
177
  from meerschaum.connectors.sql.tables import get_tables
175
- import json
176
178
  plugins_tbl = get_tables(mrsm_instance=self, debug=debug)['plugins']
177
179
  from meerschaum.utils.packages import attempt_import
178
180
  sqlalchemy = attempt_import('sqlalchemy')
@@ -191,12 +193,12 @@ def get_plugin_attributes(
191
193
  return _attr
192
194
 
193
195
  def get_plugins(
194
- self,
195
- user_id: Optional[int] = None,
196
- search_term: Optional[str] = None,
197
- debug: bool = False,
198
- **kw: Any
199
- ) -> List[str]:
196
+ self,
197
+ user_id: Optional[int] = None,
198
+ search_term: Optional[str] = None,
199
+ debug: bool = False,
200
+ **kw: Any
201
+ ) -> List[str]:
200
202
  """
201
203
  Return a list of all registered plugins.
202
204
 
@@ -238,11 +240,11 @@ def get_plugins(
238
240
 
239
241
 
240
242
  def delete_plugin(
241
- self,
242
- plugin: 'meerschaum.core.Plugin',
243
- debug: bool = False,
244
- **kw: Any
245
- ) -> SuccessTuple:
243
+ self,
244
+ plugin: 'mrsm.core.Plugin',
245
+ debug: bool = False,
246
+ **kw: Any
247
+ ) -> SuccessTuple:
246
248
  """Delete a plugin from the plugins table."""
247
249
  from meerschaum.utils.warnings import warn, error
248
250
  from meerschaum.utils.packages import attempt_import
@@ -7,14 +7,17 @@ Manage users via the SQL Connector
7
7
  """
8
8
 
9
9
  from __future__ import annotations
10
+
11
+ import meerschaum as mrsm
10
12
  from meerschaum.utils.typing import SuccessTuple, Optional, Any, Dict, List, Union
11
13
 
14
+
12
15
  def register_user(
13
- self,
14
- user: meerschaum.core.User,
15
- debug: bool = False,
16
- **kw: Any
17
- ) -> SuccessTuple:
16
+ self,
17
+ user: mrsm.core.User,
18
+ debug: bool = False,
19
+ **kw: Any
20
+ ) -> SuccessTuple:
18
21
  """Register a new user."""
19
22
  from meerschaum.utils.warnings import warn, error, info
20
23
  from meerschaum.utils.packages import attempt_import
@@ -57,6 +60,7 @@ def register_user(
57
60
  return False, f"Failed to register user '{user}'."
58
61
  return True, f"Successfully registered user '{user}'."
59
62
 
63
+
60
64
  def valid_username(username: str) -> SuccessTuple:
61
65
  """Verify that a given username is valid."""
62
66
  from meerschaum.config.static import STATIC_CONFIG
@@ -75,7 +79,7 @@ def valid_username(username: str) -> SuccessTuple:
75
79
  if not c.isalnum() and c not in acceptable_chars:
76
80
  fail_reasons.append(
77
81
  (
78
- f"Usernames may only contain alphanumeric characters " +
82
+ "Usernames may only contain alphanumeric characters " +
79
83
  "and the following special characters: "
80
84
  + str(list(acceptable_chars))
81
85
  )
@@ -92,11 +96,11 @@ def valid_username(username: str) -> SuccessTuple:
92
96
 
93
97
 
94
98
  def edit_user(
95
- self,
96
- user: meerschaum.core.User,
97
- debug: bool = False,
98
- **kw: Any
99
- ) -> SuccessTuple:
99
+ self,
100
+ user: 'mrsm.core.User',
101
+ debug: bool = False,
102
+ **kw: Any
103
+ ) -> SuccessTuple:
100
104
  """Update an existing user's metadata."""
101
105
  from meerschaum.utils.packages import attempt_import
102
106
  sqlalchemy = attempt_import('sqlalchemy')
@@ -145,11 +149,12 @@ def edit_user(
145
149
  return False, f"Failed to edit user '{user}'."
146
150
  return True, f"Successfully edited user '{user}'."
147
151
 
152
+
148
153
  def get_user_id(
149
- self,
150
- user: meerschaum.core.User,
151
- debug : bool = False
152
- ) -> Optional[int]:
154
+ self,
155
+ user: 'mrsm.core.User',
156
+ debug: bool = False
157
+ ) -> Optional[int]:
153
158
  """If a user is registered, return the `user_id`."""
154
159
  ### ensure users table exists
155
160
  from meerschaum.utils.packages import attempt_import
@@ -168,10 +173,10 @@ def get_user_id(
168
173
  return None
169
174
 
170
175
  def get_user_attributes(
171
- self,
172
- user: meerschaum.core.User,
173
- debug: bool = False
174
- ) -> Union[Dict[str, Any], None]:
176
+ self,
177
+ user: 'mrsm.core.User',
178
+ debug: bool = False
179
+ ) -> Union[Dict[str, Any], None]:
175
180
  """
176
181
  Return the user's attributes.
177
182
  """
@@ -208,10 +213,10 @@ def get_user_attributes(
208
213
  return result
209
214
 
210
215
  def delete_user(
211
- self,
212
- user: meerschaum.core.User,
213
- debug: bool = False
214
- ) -> SuccessTuple:
216
+ self,
217
+ user: 'mrsm.core.User',
218
+ debug: bool = False
219
+ ) -> SuccessTuple:
215
220
  """Delete a user's record from the users table."""
216
221
  ### ensure users table exists
217
222
  from meerschaum.connectors.sql.tables import get_tables
@@ -238,11 +243,12 @@ def delete_user(
238
243
 
239
244
  return True, f"Successfully deleted user '{user}'"
240
245
 
246
+
241
247
  def get_users(
242
- self,
243
- debug: bool = False,
244
- **kw: Any
245
- ) -> List[str]:
248
+ self,
249
+ debug: bool = False,
250
+ **kw: Any
251
+ ) -> List[str]:
246
252
  """
247
253
  Get the registered usernames.
248
254
  """
@@ -256,12 +262,13 @@ def get_users(
256
262
 
257
263
  return list(self.read(query, debug=debug)['username'])
258
264
 
265
+
259
266
  def get_user_password_hash(
260
- self,
261
- user: meerschaum.core.User,
262
- debug: bool = False,
263
- **kw: Any
264
- ) -> Optional[str]:
267
+ self,
268
+ user: 'mrsm.core.User',
269
+ debug: bool = False,
270
+ **kw: Any
271
+ ) -> Optional[str]:
265
272
  """
266
273
  Return the password has for a user.
267
274
  **NOTE**: This may be dangerous and is only allowed if the security settings explicity allow it.
@@ -278,7 +285,7 @@ def get_user_password_hash(
278
285
  dprint(f"Already given user_id: {user_id}")
279
286
  else:
280
287
  if debug:
281
- dprint(f"Fetching user_id...")
288
+ dprint("Fetching user_id...")
282
289
  user_id = self.get_user_id(user, debug=debug)
283
290
 
284
291
  if user_id is None:
@@ -288,12 +295,13 @@ def get_user_password_hash(
288
295
 
289
296
  return self.value(query, debug=debug)
290
297
 
298
+
291
299
  def get_user_type(
292
- self,
293
- user: meerschaum.core.User,
294
- debug: bool = False,
295
- **kw: Any
296
- ) -> Optional[str]:
300
+ self,
301
+ user: 'mrsm.core.User',
302
+ debug: bool = False,
303
+ **kw: Any
304
+ ) -> Optional[str]:
297
305
  """
298
306
  Return the user's type.
299
307
  """