meerschaum 2.3.6__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.
- meerschaum/_internal/arguments/_parse_arguments.py +2 -5
- meerschaum/_internal/docs/index.py +3 -2
- meerschaum/_internal/entry.py +13 -7
- meerschaum/_internal/shell/Shell.py +38 -44
- meerschaum/_internal/term/TermPageHandler.py +2 -3
- meerschaum/_internal/term/__init__.py +13 -11
- meerschaum/actions/api.py +10 -7
- meerschaum/actions/bootstrap.py +38 -11
- meerschaum/actions/copy.py +3 -3
- meerschaum/actions/delete.py +4 -1
- meerschaum/actions/register.py +1 -3
- meerschaum/actions/stack.py +24 -19
- meerschaum/actions/start.py +38 -40
- meerschaum/actions/sync.py +53 -52
- meerschaum/api/__init__.py +48 -14
- meerschaum/api/_events.py +15 -10
- meerschaum/api/_oauth2.py +2 -2
- meerschaum/api/_websockets.py +5 -4
- meerschaum/api/dash/__init__.py +7 -16
- meerschaum/api/dash/callbacks/__init__.py +1 -0
- meerschaum/api/dash/callbacks/dashboard.py +52 -58
- meerschaum/api/dash/callbacks/jobs.py +15 -16
- meerschaum/api/dash/callbacks/login.py +16 -10
- meerschaum/api/dash/callbacks/pipes.py +41 -0
- meerschaum/api/dash/callbacks/plugins.py +1 -1
- meerschaum/api/dash/callbacks/register.py +15 -11
- meerschaum/api/dash/components.py +54 -59
- meerschaum/api/dash/jobs.py +5 -9
- meerschaum/api/dash/pages/__init__.py +1 -0
- meerschaum/api/dash/pages/pipes.py +19 -0
- meerschaum/api/dash/pipes.py +86 -58
- meerschaum/api/dash/plugins.py +6 -4
- meerschaum/api/dash/sessions.py +176 -0
- meerschaum/api/dash/users.py +3 -41
- meerschaum/api/dash/webterm.py +12 -17
- meerschaum/api/resources/static/js/terminado.js +1 -1
- meerschaum/api/routes/_actions.py +4 -20
- meerschaum/api/routes/_jobs.py +8 -7
- meerschaum/api/routes/_login.py +4 -4
- meerschaum/api/routes/_pipes.py +3 -3
- meerschaum/api/routes/_webterm.py +5 -6
- meerschaum/config/_default.py +15 -2
- meerschaum/config/_version.py +1 -1
- meerschaum/config/stack/__init__.py +64 -19
- meerschaum/config/static/__init__.py +4 -0
- meerschaum/connectors/{Connector.py → _Connector.py} +19 -13
- meerschaum/connectors/__init__.py +24 -14
- meerschaum/connectors/api/{APIConnector.py → _APIConnector.py} +3 -1
- meerschaum/connectors/api/__init__.py +2 -1
- meerschaum/connectors/parse.py +18 -16
- meerschaum/connectors/poll.py +30 -24
- meerschaum/connectors/sql/__init__.py +3 -1
- meerschaum/connectors/sql/_pipes.py +172 -197
- meerschaum/connectors/sql/_plugins.py +45 -43
- meerschaum/connectors/sql/_users.py +46 -38
- meerschaum/connectors/valkey/_ValkeyConnector.py +535 -0
- meerschaum/connectors/valkey/__init__.py +10 -0
- meerschaum/connectors/valkey/_fetch.py +75 -0
- meerschaum/connectors/valkey/_pipes.py +844 -0
- meerschaum/connectors/valkey/_plugins.py +265 -0
- meerschaum/connectors/valkey/_users.py +305 -0
- meerschaum/core/Pipe/__init__.py +3 -0
- meerschaum/core/Pipe/_attributes.py +1 -2
- meerschaum/core/Pipe/_clear.py +16 -13
- meerschaum/core/Pipe/_copy.py +106 -0
- meerschaum/core/Pipe/_data.py +165 -101
- meerschaum/core/Pipe/_drop.py +4 -4
- meerschaum/core/Pipe/_dtypes.py +14 -14
- meerschaum/core/Pipe/_edit.py +15 -14
- meerschaum/core/Pipe/_sync.py +134 -53
- meerschaum/core/Pipe/_verify.py +11 -11
- meerschaum/core/User/_User.py +14 -12
- meerschaum/jobs/_Job.py +1 -6
- meerschaum/jobs/__init__.py +7 -2
- meerschaum/plugins/_Plugin.py +17 -13
- meerschaum/utils/_get_pipes.py +14 -20
- meerschaum/utils/dataframe.py +291 -101
- meerschaum/utils/dtypes/__init__.py +31 -6
- meerschaum/utils/dtypes/sql.py +4 -4
- meerschaum/utils/formatting/_shell.py +5 -6
- meerschaum/utils/misc.py +3 -3
- meerschaum/utils/packages/__init__.py +14 -9
- meerschaum/utils/packages/_packages.py +2 -0
- meerschaum/utils/schedule.py +1 -0
- {meerschaum-2.3.6.dist-info → meerschaum-2.4.0.dist-info}/METADATA +7 -1
- {meerschaum-2.3.6.dist-info → meerschaum-2.4.0.dist-info}/RECORD +93 -84
- {meerschaum-2.3.6.dist-info → meerschaum-2.4.0.dist-info}/WHEEL +1 -1
- meerschaum/api/dash/actions.py +0 -255
- /meerschaum/connectors/sql/{SQLConnector.py → _SQLConnector.py} +0 -0
- {meerschaum-2.3.6.dist-info → meerschaum-2.4.0.dist-info}/LICENSE +0 -0
- {meerschaum-2.3.6.dist-info → meerschaum-2.4.0.dist-info}/NOTICE +0 -0
- {meerschaum-2.3.6.dist-info → meerschaum-2.4.0.dist-info}/entry_points.txt +0 -0
- {meerschaum-2.3.6.dist-info → meerschaum-2.4.0.dist-info}/top_level.txt +0 -0
- {meerschaum-2.3.6.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
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
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'
|
52
|
-
'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'
|
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
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
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
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
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
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
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
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
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
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
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
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
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
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
|
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
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
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
|
-
|
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
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
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
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
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
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
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
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
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
|
-
|
243
|
-
|
244
|
-
|
245
|
-
|
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
|
-
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
|
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(
|
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
|
-
|
293
|
-
|
294
|
-
|
295
|
-
|
296
|
-
|
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
|
"""
|