meerschaum 2.9.4__py3-none-any.whl → 3.0.0rc1__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 (154) 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 +17 -1
  5. meerschaum/_internal/entry.py +6 -6
  6. meerschaum/_internal/shell/Shell.py +1 -1
  7. meerschaum/_internal/static.py +372 -0
  8. meerschaum/actions/api.py +12 -2
  9. meerschaum/actions/bootstrap.py +7 -7
  10. meerschaum/actions/edit.py +142 -18
  11. meerschaum/actions/register.py +137 -6
  12. meerschaum/actions/show.py +117 -29
  13. meerschaum/actions/stop.py +4 -1
  14. meerschaum/actions/sync.py +1 -1
  15. meerschaum/actions/tag.py +9 -8
  16. meerschaum/api/__init__.py +9 -2
  17. meerschaum/api/_events.py +39 -2
  18. meerschaum/api/_oauth2.py +118 -8
  19. meerschaum/api/_tokens.py +102 -0
  20. meerschaum/api/dash/__init__.py +0 -1
  21. meerschaum/api/dash/callbacks/custom.py +2 -2
  22. meerschaum/api/dash/callbacks/dashboard.py +133 -18
  23. meerschaum/api/dash/callbacks/plugins.py +0 -1
  24. meerschaum/api/dash/callbacks/register.py +1 -1
  25. meerschaum/api/dash/callbacks/settings/__init__.py +1 -0
  26. meerschaum/api/dash/callbacks/settings/password_reset.py +2 -2
  27. meerschaum/api/dash/callbacks/settings/tokens.py +388 -0
  28. meerschaum/api/dash/components.py +30 -8
  29. meerschaum/api/dash/keys.py +19 -93
  30. meerschaum/api/dash/pages/dashboard.py +1 -20
  31. meerschaum/api/dash/pages/settings/__init__.py +1 -0
  32. meerschaum/api/dash/pages/settings/password_reset.py +1 -1
  33. meerschaum/api/dash/pages/settings/tokens.py +55 -0
  34. meerschaum/api/dash/pipes.py +156 -58
  35. meerschaum/api/dash/sessions.py +12 -0
  36. meerschaum/api/dash/tokens.py +606 -0
  37. meerschaum/api/dash/websockets.py +1 -1
  38. meerschaum/api/dash/webterm.py +4 -0
  39. meerschaum/api/models/__init__.py +23 -3
  40. meerschaum/api/models/_actions.py +22 -0
  41. meerschaum/api/models/_pipes.py +85 -7
  42. meerschaum/api/models/_tokens.py +81 -0
  43. meerschaum/api/resources/static/css/dash.css +16 -0
  44. meerschaum/api/resources/templates/termpage.html +12 -0
  45. meerschaum/api/routes/__init__.py +1 -0
  46. meerschaum/api/routes/_actions.py +3 -4
  47. meerschaum/api/routes/_connectors.py +3 -7
  48. meerschaum/api/routes/_jobs.py +14 -35
  49. meerschaum/api/routes/_login.py +49 -12
  50. meerschaum/api/routes/_misc.py +5 -10
  51. meerschaum/api/routes/_pipes.py +134 -111
  52. meerschaum/api/routes/_plugins.py +38 -28
  53. meerschaum/api/routes/_tokens.py +236 -0
  54. meerschaum/api/routes/_users.py +47 -35
  55. meerschaum/api/routes/_version.py +3 -3
  56. meerschaum/config/__init__.py +43 -20
  57. meerschaum/config/_default.py +32 -5
  58. meerschaum/config/_edit.py +28 -24
  59. meerschaum/config/_environment.py +1 -1
  60. meerschaum/config/_patch.py +6 -6
  61. meerschaum/config/_paths.py +5 -1
  62. meerschaum/config/_read_config.py +65 -34
  63. meerschaum/config/_sync.py +6 -3
  64. meerschaum/config/_version.py +1 -1
  65. meerschaum/config/stack/__init__.py +24 -5
  66. meerschaum/config/static.py +18 -0
  67. meerschaum/connectors/_Connector.py +10 -4
  68. meerschaum/connectors/__init__.py +4 -20
  69. meerschaum/connectors/api/_APIConnector.py +34 -6
  70. meerschaum/connectors/api/_actions.py +2 -2
  71. meerschaum/connectors/api/_jobs.py +1 -1
  72. meerschaum/connectors/api/_login.py +33 -7
  73. meerschaum/connectors/api/_misc.py +2 -2
  74. meerschaum/connectors/api/_pipes.py +15 -14
  75. meerschaum/connectors/api/_plugins.py +2 -2
  76. meerschaum/connectors/api/_request.py +1 -1
  77. meerschaum/connectors/api/_tokens.py +146 -0
  78. meerschaum/connectors/api/_users.py +70 -58
  79. meerschaum/connectors/instance/_InstanceConnector.py +83 -0
  80. meerschaum/connectors/instance/__init__.py +10 -0
  81. meerschaum/connectors/instance/_pipes.py +442 -0
  82. meerschaum/connectors/instance/_plugins.py +151 -0
  83. meerschaum/connectors/instance/_tokens.py +296 -0
  84. meerschaum/connectors/instance/_users.py +181 -0
  85. meerschaum/connectors/parse.py +4 -1
  86. meerschaum/connectors/sql/_SQLConnector.py +8 -5
  87. meerschaum/connectors/sql/_cli.py +12 -11
  88. meerschaum/connectors/sql/_create_engine.py +6 -154
  89. meerschaum/connectors/sql/_fetch.py +2 -18
  90. meerschaum/connectors/sql/_pipes.py +42 -31
  91. meerschaum/connectors/sql/_plugins.py +29 -0
  92. meerschaum/connectors/sql/_sql.py +9 -2
  93. meerschaum/connectors/sql/_users.py +29 -2
  94. meerschaum/connectors/sql/tables/__init__.py +1 -1
  95. meerschaum/connectors/valkey/_ValkeyConnector.py +2 -4
  96. meerschaum/connectors/valkey/_pipes.py +9 -10
  97. meerschaum/connectors/valkey/_plugins.py +2 -26
  98. meerschaum/core/Pipe/__init__.py +31 -14
  99. meerschaum/core/Pipe/_attributes.py +156 -58
  100. meerschaum/core/Pipe/_bootstrap.py +54 -24
  101. meerschaum/core/Pipe/_data.py +41 -1
  102. meerschaum/core/Pipe/_dtypes.py +29 -14
  103. meerschaum/core/Pipe/_edit.py +12 -4
  104. meerschaum/core/Pipe/_show.py +5 -5
  105. meerschaum/core/Pipe/_sync.py +48 -53
  106. meerschaum/core/Pipe/_verify.py +1 -1
  107. meerschaum/{plugins → core/Plugin}/_Plugin.py +9 -11
  108. meerschaum/core/Plugin/__init__.py +1 -1
  109. meerschaum/core/Token/_Token.py +221 -0
  110. meerschaum/core/Token/__init__.py +12 -0
  111. meerschaum/core/User/_User.py +34 -8
  112. meerschaum/core/User/__init__.py +9 -1
  113. meerschaum/core/__init__.py +1 -0
  114. meerschaum/jobs/_Job.py +3 -2
  115. meerschaum/jobs/__init__.py +3 -2
  116. meerschaum/jobs/systemd.py +1 -1
  117. meerschaum/models/__init__.py +35 -0
  118. meerschaum/models/pipes.py +247 -0
  119. meerschaum/models/tokens.py +38 -0
  120. meerschaum/models/users.py +26 -0
  121. meerschaum/plugins/__init__.py +22 -7
  122. meerschaum/plugins/bootstrap.py +2 -1
  123. meerschaum/utils/_get_pipes.py +68 -27
  124. meerschaum/utils/daemon/Daemon.py +2 -1
  125. meerschaum/utils/daemon/__init__.py +30 -2
  126. meerschaum/utils/dataframe.py +96 -15
  127. meerschaum/utils/dtypes/__init__.py +93 -21
  128. meerschaum/utils/dtypes/sql.py +44 -0
  129. meerschaum/utils/formatting/__init__.py +1 -1
  130. meerschaum/utils/formatting/_pipes.py +5 -4
  131. meerschaum/utils/formatting/_shell.py +11 -9
  132. meerschaum/utils/misc.py +237 -80
  133. meerschaum/utils/packages/__init__.py +3 -6
  134. meerschaum/utils/packages/_packages.py +34 -32
  135. meerschaum/utils/pipes.py +181 -0
  136. meerschaum/utils/process.py +1 -1
  137. meerschaum/utils/prompt.py +3 -1
  138. meerschaum/utils/schedule.py +1 -0
  139. meerschaum/utils/sql.py +115 -39
  140. meerschaum/utils/typing.py +1 -4
  141. meerschaum/utils/venv/_Venv.py +2 -2
  142. meerschaum/utils/venv/__init__.py +5 -7
  143. {meerschaum-2.9.4.dist-info → meerschaum-3.0.0rc1.dist-info}/METADATA +88 -80
  144. meerschaum-3.0.0rc1.dist-info/RECORD +282 -0
  145. {meerschaum-2.9.4.dist-info → meerschaum-3.0.0rc1.dist-info}/WHEEL +1 -1
  146. meerschaum/api/models/_interfaces.py +0 -15
  147. meerschaum/api/models/_locations.py +0 -15
  148. meerschaum/api/models/_metrics.py +0 -15
  149. meerschaum/config/static/__init__.py +0 -186
  150. meerschaum-2.9.4.dist-info/RECORD +0 -263
  151. {meerschaum-2.9.4.dist-info → meerschaum-3.0.0rc1.dist-info}/entry_points.txt +0 -0
  152. {meerschaum-2.9.4.dist-info → meerschaum-3.0.0rc1.dist-info}/licenses/LICENSE +0 -0
  153. {meerschaum-2.9.4.dist-info → meerschaum-3.0.0rc1.dist-info}/top_level.txt +0 -0
  154. {meerschaum-2.9.4.dist-info → meerschaum-3.0.0rc1.dist-info}/zip-safe +0 -0
@@ -7,18 +7,23 @@ Manage users via the API Connector.
7
7
  """
8
8
 
9
9
  from __future__ import annotations
10
- from meerschaum.utils.typing import Optional, Any, List, SuccessTuple
10
+
11
+ import json
12
+ from uuid import UUID
13
+
14
+ import meerschaum as mrsm
15
+ from meerschaum.utils.typing import Optional, Any, List, SuccessTuple, Union
16
+
11
17
 
12
18
  def get_users(
13
- self,
14
- debug: bool = False,
15
- **kw : Any
16
- ) -> List[str]:
19
+ self,
20
+ debug: bool = False,
21
+ **kw: Any
22
+ ) -> List[str]:
17
23
  """
18
24
  Return a list of registered usernames.
19
25
  """
20
- from meerschaum.config.static import STATIC_CONFIG
21
- import json
26
+ from meerschaum._internal.static import STATIC_CONFIG
22
27
  response = self.get(
23
28
  f"{STATIC_CONFIG['api']['endpoints']['users']}",
24
29
  debug = debug,
@@ -31,15 +36,15 @@ def get_users(
31
36
  except Exception as e:
32
37
  return []
33
38
 
39
+
34
40
  def edit_user(
35
- self,
36
- user: 'meerschaum.core.User',
37
- debug: bool = False,
38
- **kw: Any
39
- ) -> SuccessTuple:
41
+ self,
42
+ user: mrsm.core.User,
43
+ debug: bool = False,
44
+ **kw: Any
45
+ ) -> SuccessTuple:
40
46
  """Edit an existing user."""
41
- import json
42
- from meerschaum.config.static import STATIC_CONFIG
47
+ from meerschaum._internal.static import STATIC_CONFIG
43
48
  r_url = f"{STATIC_CONFIG['api']['endpoints']['users']}/edit"
44
49
  data = {
45
50
  'username': user.username,
@@ -54,7 +59,7 @@ def edit_user(
54
59
  if isinstance(_json, dict) and 'detail' in _json:
55
60
  return False, _json['detail']
56
61
  success_tuple = tuple(_json)
57
- except Exception as e:
62
+ except Exception:
58
63
  msg = response.text if response else f"Failed to edit user '{user}'."
59
64
  return False, msg
60
65
 
@@ -62,14 +67,13 @@ def edit_user(
62
67
 
63
68
 
64
69
  def register_user(
65
- self,
66
- user: 'meerschaum.core.User',
67
- debug: bool = False,
68
- **kw: Any
69
- ) -> SuccessTuple:
70
+ self,
71
+ user: mrsm.core.User,
72
+ debug: bool = False,
73
+ **kw: Any
74
+ ) -> SuccessTuple:
70
75
  """Register a new user."""
71
- import json
72
- from meerschaum.config.static import STATIC_CONFIG
76
+ from meerschaum._internal.static import STATIC_CONFIG
73
77
  r_url = f"{STATIC_CONFIG['api']['endpoints']['users']}/register"
74
78
  data = {
75
79
  'username': user.username,
@@ -94,31 +98,37 @@ def register_user(
94
98
 
95
99
 
96
100
  def get_user_id(
97
- self,
98
- user: 'meerschaum.core.User',
99
- debug: bool = False,
100
- **kw: Any
101
- ) -> Optional[int]:
101
+ self,
102
+ user: mrsm.core.User,
103
+ debug: bool = False,
104
+ **kw: Any
105
+ ) -> Union[int, str, UUID, None]:
102
106
  """Get a user's ID."""
103
- from meerschaum.config.static import STATIC_CONFIG
104
- import json
107
+ from meerschaum._internal.static import STATIC_CONFIG
108
+ from meerschaum.utils.misc import is_int, is_uuid
105
109
  r_url = f"{STATIC_CONFIG['api']['endpoints']['users']}/{user.username}/id"
106
110
  response = self.get(r_url, debug=debug, **kw)
107
111
  try:
108
- user_id = int(json.loads(response.text))
112
+ id_text = str(json.loads(response.text))
113
+ if is_int(id_text):
114
+ user_id = int(id_text)
115
+ elif is_uuid(id_text):
116
+ user_id = UUID(id_text)
117
+ else:
118
+ user_id = id_text
109
119
  except Exception as e:
110
120
  user_id = None
111
121
  return user_id
112
122
 
123
+
113
124
  def delete_user(
114
- self,
115
- user: 'meerschaum.core.User',
116
- debug: bool = False,
117
- **kw: Any
118
- ) -> SuccessTuple:
125
+ self,
126
+ user: mrsm.core.User,
127
+ debug: bool = False,
128
+ **kw: Any
129
+ ) -> SuccessTuple:
119
130
  """Delete a user."""
120
- from meerschaum.config.static import STATIC_CONFIG
121
- import json
131
+ from meerschaum._internal.static import STATIC_CONFIG
122
132
  r_url = f"{STATIC_CONFIG['api']['endpoints']['users']}/{user.username}"
123
133
  response = self.delete(r_url, debug=debug)
124
134
  try:
@@ -126,53 +136,55 @@ def delete_user(
126
136
  if isinstance(_json, dict) and 'detail' in _json:
127
137
  return False, _json['detail']
128
138
  success_tuple = tuple(_json)
129
- except Exception as e:
139
+ except Exception:
130
140
  success_tuple = False, f"Failed to delete user '{user.username}'."
131
141
  return success_tuple
132
142
 
143
+
133
144
  def get_user_attributes(
134
- self,
135
- user: 'meerschaum.core.User',
136
- debug: bool = False,
137
- **kw
138
- ) -> int:
145
+ self,
146
+ user: mrsm.core.User,
147
+ debug: bool = False,
148
+ **kw
149
+ ) -> int:
139
150
  """Get a user's attributes."""
140
- from meerschaum.config.static import STATIC_CONFIG
141
- import json
151
+ from meerschaum._internal.static import STATIC_CONFIG
142
152
  r_url = f"{STATIC_CONFIG['api']['endpoints']['users']}/{user.username}/attributes"
143
153
  response = self.get(r_url, debug=debug, **kw)
144
154
  try:
145
155
  attributes = json.loads(response.text)
146
- except Exception as e:
156
+ except Exception:
147
157
  attributes = None
148
158
  return attributes
149
159
 
160
+
150
161
  #############################
151
162
  # Chaining functions below. #
152
163
  #############################
153
164
 
154
165
  def get_user_password_hash(
155
- self,
156
- user: 'meerschaum.core.User',
157
- debug: bool = False,
158
- **kw: Any
159
- ) -> Optional[str]:
166
+ self,
167
+ user: mrsm.core.User,
168
+ debug: bool = False,
169
+ **kw: Any
170
+ ) -> Optional[str]:
160
171
  """If configured, get a user's password hash."""
161
- from meerschaum.config.static import STATIC_CONFIG
172
+ from meerschaum._internal.static import STATIC_CONFIG
162
173
  r_url = STATIC_CONFIG['api']['endpoints']['users'] + '/' + user.username + '/password_hash'
163
174
  response = self.get(r_url, debug=debug, **kw)
164
175
  if not response:
165
176
  return None
166
177
  return response.json()
167
178
 
179
+
168
180
  def get_user_type(
169
- self,
170
- user: 'meerschaum.core.User',
171
- debug: bool = False,
172
- **kw: Any
173
- ) -> Optional[str]:
181
+ self,
182
+ user: mrsm.core.User,
183
+ debug: bool = False,
184
+ **kw: Any
185
+ ) -> Optional[str]:
174
186
  """If configured, get a user's type."""
175
- from meerschaum.config.static import STATIC_CONFIG
187
+ from meerschaum._internal.static import STATIC_CONFIG
176
188
  r_url = STATIC_CONFIG['api']['endpoints']['users'] + '/' + user.username + '/type'
177
189
  response = self.get(r_url, debug=debug, **kw)
178
190
  if not response:
@@ -0,0 +1,83 @@
1
+ #! /usr/bin/env python3
2
+ # vim:fenc=utf-8
3
+
4
+ """
5
+ Define the interface for instance connectors.
6
+ """
7
+
8
+ from __future__ import annotations
9
+
10
+ import abc
11
+ from typing import Any, Union, Dict, List, Tuple, Optional
12
+
13
+ import meerschaum as mrsm
14
+ from meerschaum.connectors._Connector import Connector
15
+
16
+
17
+ class InstanceConnector(Connector):
18
+ """
19
+ Instance connectors define the interface for managing pipes and provide methods
20
+ for management of users, plugins, tokens, and other metadata built atop pipes.
21
+ """
22
+
23
+ IS_INSTANCE: bool = True
24
+ IS_THREAD_SAFE: bool = False
25
+
26
+ from ._users import (
27
+ get_users_pipe,
28
+ register_user,
29
+ get_user_id,
30
+ get_username,
31
+ get_users,
32
+ edit_user,
33
+ delete_user,
34
+ get_user_password_hash,
35
+ get_user_type,
36
+ get_user_attributes,
37
+ )
38
+
39
+ from ._plugins import (
40
+ get_plugins_pipe,
41
+ register_plugin,
42
+ get_plugin_user_id,
43
+ delete_plugin,
44
+ get_plugin_id,
45
+ get_plugin_version,
46
+ get_plugins,
47
+ get_plugin_user_id,
48
+ get_plugin_username,
49
+ get_plugin_attributes,
50
+ )
51
+
52
+ from ._tokens import (
53
+ get_tokens_pipe,
54
+ register_token,
55
+ edit_token,
56
+ invalidate_token,
57
+ delete_token,
58
+ get_token,
59
+ get_tokens,
60
+ get_token_model,
61
+ get_token_secret_hash,
62
+ token_exists,
63
+ get_token_scopes,
64
+ )
65
+
66
+ from ._pipes import (
67
+ register_pipe,
68
+ get_pipe_attributes,
69
+ get_pipe_id,
70
+ edit_pipe,
71
+ delete_pipe,
72
+ fetch_pipes_keys,
73
+ pipe_exists,
74
+ drop_pipe,
75
+ drop_pipe_indices,
76
+ sync_pipe,
77
+ create_pipe_indices,
78
+ clear_pipe,
79
+ get_pipe_data,
80
+ get_sync_time,
81
+ get_pipe_columns_types,
82
+ get_pipe_columns_indices,
83
+ )
@@ -0,0 +1,10 @@
1
+ #! /usr/bin/env python3
2
+ # vim:fenc=utf-8
3
+
4
+ """
5
+ Define high-level instance connector methods.
6
+ """
7
+
8
+ from meerschaum.connectors.instance._InstanceConnector import InstanceConnector
9
+
10
+ __all__ = ('InstanceConnector',)