meerschaum 2.2.6__py3-none-any.whl → 2.3.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/__init__.py +6 -1
- meerschaum/__main__.py +9 -9
- meerschaum/_internal/arguments/__init__.py +1 -1
- meerschaum/_internal/arguments/_parse_arguments.py +72 -6
- meerschaum/_internal/arguments/_parser.py +45 -15
- meerschaum/_internal/docs/index.py +265 -8
- meerschaum/_internal/entry.py +167 -37
- meerschaum/_internal/shell/Shell.py +290 -99
- meerschaum/_internal/shell/updates.py +175 -0
- meerschaum/actions/__init__.py +29 -17
- meerschaum/actions/api.py +12 -12
- meerschaum/actions/attach.py +113 -0
- meerschaum/actions/copy.py +68 -41
- meerschaum/actions/delete.py +112 -50
- meerschaum/actions/edit.py +3 -3
- meerschaum/actions/install.py +40 -32
- meerschaum/actions/pause.py +44 -27
- meerschaum/actions/register.py +19 -5
- meerschaum/actions/restart.py +107 -0
- meerschaum/actions/show.py +130 -159
- meerschaum/actions/start.py +161 -100
- meerschaum/actions/stop.py +78 -42
- meerschaum/actions/sync.py +3 -3
- meerschaum/actions/upgrade.py +28 -36
- meerschaum/api/_events.py +25 -1
- meerschaum/api/_oauth2.py +2 -0
- meerschaum/api/_websockets.py +2 -2
- meerschaum/api/dash/callbacks/jobs.py +36 -44
- meerschaum/api/dash/jobs.py +89 -78
- meerschaum/api/routes/__init__.py +1 -0
- meerschaum/api/routes/_actions.py +148 -17
- meerschaum/api/routes/_jobs.py +407 -0
- meerschaum/api/routes/_pipes.py +25 -25
- meerschaum/config/_default.py +1 -0
- meerschaum/config/_formatting.py +1 -0
- meerschaum/config/_jobs.py +1 -1
- meerschaum/config/_paths.py +11 -0
- meerschaum/config/_shell.py +84 -67
- meerschaum/config/_version.py +1 -1
- meerschaum/config/static/__init__.py +18 -0
- meerschaum/connectors/Connector.py +13 -7
- meerschaum/connectors/__init__.py +28 -15
- meerschaum/connectors/api/APIConnector.py +27 -1
- meerschaum/connectors/api/_actions.py +71 -6
- meerschaum/connectors/api/_jobs.py +368 -0
- meerschaum/connectors/api/_misc.py +1 -1
- meerschaum/connectors/api/_pipes.py +85 -84
- meerschaum/connectors/api/_request.py +13 -9
- meerschaum/connectors/parse.py +27 -15
- meerschaum/core/Pipe/_bootstrap.py +16 -8
- meerschaum/core/Pipe/_sync.py +3 -0
- meerschaum/jobs/_Executor.py +69 -0
- meerschaum/jobs/_Job.py +899 -0
- meerschaum/jobs/__init__.py +396 -0
- meerschaum/jobs/systemd.py +694 -0
- meerschaum/plugins/__init__.py +97 -12
- meerschaum/utils/daemon/Daemon.py +352 -147
- meerschaum/utils/daemon/FileDescriptorInterceptor.py +19 -10
- meerschaum/utils/daemon/RotatingFile.py +22 -8
- meerschaum/utils/daemon/StdinFile.py +121 -0
- meerschaum/utils/daemon/__init__.py +42 -27
- meerschaum/utils/daemon/_names.py +15 -13
- meerschaum/utils/formatting/__init__.py +83 -37
- meerschaum/utils/formatting/_jobs.py +146 -55
- meerschaum/utils/formatting/_shell.py +6 -0
- meerschaum/utils/misc.py +41 -22
- meerschaum/utils/packages/__init__.py +21 -15
- meerschaum/utils/packages/_packages.py +9 -6
- meerschaum/utils/process.py +9 -9
- meerschaum/utils/prompt.py +20 -7
- meerschaum/utils/schedule.py +21 -15
- meerschaum/utils/venv/__init__.py +2 -2
- {meerschaum-2.2.6.dist-info → meerschaum-2.3.0.dist-info}/METADATA +22 -25
- {meerschaum-2.2.6.dist-info → meerschaum-2.3.0.dist-info}/RECORD +80 -70
- {meerschaum-2.2.6.dist-info → meerschaum-2.3.0.dist-info}/WHEEL +1 -1
- {meerschaum-2.2.6.dist-info → meerschaum-2.3.0.dist-info}/LICENSE +0 -0
- {meerschaum-2.2.6.dist-info → meerschaum-2.3.0.dist-info}/NOTICE +0 -0
- {meerschaum-2.2.6.dist-info → meerschaum-2.3.0.dist-info}/entry_points.txt +0 -0
- {meerschaum-2.2.6.dist-info → meerschaum-2.3.0.dist-info}/top_level.txt +0 -0
- {meerschaum-2.2.6.dist-info → meerschaum-2.3.0.dist-info}/zip-safe +0 -0
@@ -11,7 +11,7 @@ import urllib.parse
|
|
11
11
|
import pathlib
|
12
12
|
from meerschaum.utils.typing import Any, Optional, Dict, Union
|
13
13
|
from meerschaum.utils.debug import dprint
|
14
|
-
from meerschaum.
|
14
|
+
from meerschaum.config.static import STATIC_CONFIG
|
15
15
|
|
16
16
|
METHODS = {
|
17
17
|
'GET',
|
@@ -23,15 +23,16 @@ METHODS = {
|
|
23
23
|
'DELETE',
|
24
24
|
}
|
25
25
|
|
26
|
+
|
26
27
|
def make_request(
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
28
|
+
self,
|
29
|
+
method: str,
|
30
|
+
r_url: str,
|
31
|
+
headers: Optional[Dict[str, Any]] = None,
|
32
|
+
use_token: bool = True,
|
33
|
+
debug: bool = False,
|
34
|
+
**kwargs: Any
|
35
|
+
) -> 'requests.Response':
|
35
36
|
"""
|
36
37
|
Make a request to this APIConnector's endpoint using the in-memory session.
|
37
38
|
|
@@ -84,6 +85,9 @@ def make_request(
|
|
84
85
|
if use_token:
|
85
86
|
headers.update({'Authorization': f'Bearer {self.token}'})
|
86
87
|
|
88
|
+
if 'timeout' not in kwargs:
|
89
|
+
kwargs['timeout'] = STATIC_CONFIG['api']['default_timeout']
|
90
|
+
|
87
91
|
request_url = urllib.parse.urljoin(self.url, r_url)
|
88
92
|
if debug:
|
89
93
|
dprint(f"[{self}] Sending a '{method.upper()}' request to {request_url}")
|
meerschaum/connectors/parse.py
CHANGED
@@ -10,11 +10,11 @@ from __future__ import annotations
|
|
10
10
|
from meerschaum.utils.typing import Mapping, Any, SuccessTuple, Union, Optional, Dict, Tuple
|
11
11
|
|
12
12
|
def parse_connector_keys(
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
13
|
+
keys: str,
|
14
|
+
construct: bool = True,
|
15
|
+
as_tuple: bool = False,
|
16
|
+
**kw: Any
|
17
|
+
) -> (
|
18
18
|
Union[
|
19
19
|
meerschaum.connectors.Connector,
|
20
20
|
Dict[str, Any],
|
@@ -87,19 +87,17 @@ def parse_connector_keys(
|
|
87
87
|
|
88
88
|
|
89
89
|
def parse_instance_keys(
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
90
|
+
keys: Optional[str],
|
91
|
+
construct: bool = True,
|
92
|
+
as_tuple: bool = False,
|
93
|
+
**kw
|
94
|
+
):
|
95
95
|
"""
|
96
96
|
Parse the Meerschaum instance value into a Connector object.
|
97
97
|
"""
|
98
98
|
from meerschaum.utils.warnings import warn
|
99
99
|
from meerschaum.config import get_config
|
100
100
|
|
101
|
-
### TODO Check for valid types? Not sure how to do that if construct = False.
|
102
|
-
|
103
101
|
if keys is None:
|
104
102
|
keys = get_config('meerschaum', 'instance')
|
105
103
|
keys = str(keys)
|
@@ -119,10 +117,24 @@ def parse_repo_keys(keys: Optional[str] = None, **kw):
|
|
119
117
|
return parse_connector_keys(keys, **kw)
|
120
118
|
|
121
119
|
|
120
|
+
def parse_executor_keys(keys: Optional[str] = None, **kw):
|
121
|
+
"""Parse the executor keys into an APIConnector or string."""
|
122
|
+
from meerschaum.jobs import get_executor_keys_from_context
|
123
|
+
if keys is None:
|
124
|
+
keys = get_executor_keys_from_context()
|
125
|
+
|
126
|
+
if keys is None or keys == 'local':
|
127
|
+
return 'local'
|
128
|
+
|
129
|
+
keys = str(keys)
|
130
|
+
return parse_connector_keys(keys, **kw)
|
131
|
+
|
132
|
+
|
122
133
|
def is_valid_connector_keys(
|
123
|
-
|
124
|
-
|
125
|
-
"""
|
134
|
+
keys: str
|
135
|
+
) -> bool:
|
136
|
+
"""
|
137
|
+
Verify a connector_keys string references a valid connector.
|
126
138
|
"""
|
127
139
|
try:
|
128
140
|
success = parse_connector_keys(keys, construct=False) is not None
|
@@ -88,21 +88,29 @@ def bootstrap(
|
|
88
88
|
|
89
89
|
try:
|
90
90
|
if yes_no(
|
91
|
-
f"Would you like to edit the definition for {self}?",
|
91
|
+
f"Would you like to edit the definition for {self}?",
|
92
|
+
yes=yes,
|
93
|
+
noask=noask,
|
94
|
+
default='n',
|
92
95
|
):
|
93
96
|
edit_tuple = self.edit_definition(debug=debug)
|
94
97
|
if not edit_tuple[0]:
|
95
98
|
return edit_tuple
|
96
99
|
|
97
|
-
if yes_no(
|
100
|
+
if yes_no(
|
101
|
+
f"Would you like to try syncing {self} now?",
|
102
|
+
yes=yes,
|
103
|
+
noask=noask,
|
104
|
+
default='n',
|
105
|
+
):
|
98
106
|
sync_tuple = actions['sync'](
|
99
107
|
['pipes'],
|
100
|
-
connector_keys
|
101
|
-
metric_keys
|
102
|
-
location_keys
|
103
|
-
mrsm_instance
|
104
|
-
debug
|
105
|
-
shell
|
108
|
+
connector_keys=[self.connector_keys],
|
109
|
+
metric_keys=[self.metric_key],
|
110
|
+
location_keys=[self.location_key],
|
111
|
+
mrsm_instance=str(self.instance_connector),
|
112
|
+
debug=debug,
|
113
|
+
shell=shell,
|
106
114
|
)
|
107
115
|
if not sync_tuple[0]:
|
108
116
|
return sync_tuple
|
meerschaum/core/Pipe/_sync.py
CHANGED
@@ -194,6 +194,9 @@ def sync(
|
|
194
194
|
if hasattr(df, 'MRSM_INFER_FETCH'):
|
195
195
|
try:
|
196
196
|
if p.connector is None:
|
197
|
+
if ':' not in p.connector_keys:
|
198
|
+
return True, f"{p} does not support fetching; nothing to do."
|
199
|
+
|
197
200
|
msg = f"{p} does not have a valid connector."
|
198
201
|
if p.connector_keys.startswith('plugin:'):
|
199
202
|
msg += f"\n Perhaps {p.connector_keys} has a syntax error?"
|
@@ -0,0 +1,69 @@
|
|
1
|
+
#! /usr/bin/env python3
|
2
|
+
# vim:fenc=utf-8
|
3
|
+
|
4
|
+
"""
|
5
|
+
Define the base class for a Job executor.
|
6
|
+
"""
|
7
|
+
|
8
|
+
from __future__ import annotations
|
9
|
+
|
10
|
+
from abc import abstractmethod
|
11
|
+
|
12
|
+
from meerschaum.connectors import Connector
|
13
|
+
from meerschaum.utils.typing import List, Dict, SuccessTuple, TYPE_CHECKING
|
14
|
+
|
15
|
+
if TYPE_CHECKING:
|
16
|
+
from meerschaum.jobs import Job
|
17
|
+
|
18
|
+
class Executor(Connector):
|
19
|
+
"""
|
20
|
+
Define the methods for managing jobs.
|
21
|
+
"""
|
22
|
+
|
23
|
+
@abstractmethod
|
24
|
+
def get_job_exists(self, name: str, debug: bool = False) -> bool:
|
25
|
+
"""
|
26
|
+
Return whether a job exists.
|
27
|
+
"""
|
28
|
+
|
29
|
+
@abstractmethod
|
30
|
+
def get_jobs(self) -> Dict[str, Job]:
|
31
|
+
"""
|
32
|
+
Return a dictionary of names -> Jobs.
|
33
|
+
"""
|
34
|
+
|
35
|
+
@abstractmethod
|
36
|
+
def create_job(self, name: str, sysargs: List[str], debug: bool = False) -> SuccessTuple:
|
37
|
+
"""
|
38
|
+
Create a new job.
|
39
|
+
"""
|
40
|
+
|
41
|
+
@abstractmethod
|
42
|
+
def start_job(self, name: str, debug: bool = False) -> SuccessTuple:
|
43
|
+
"""
|
44
|
+
Start a job.
|
45
|
+
"""
|
46
|
+
|
47
|
+
@abstractmethod
|
48
|
+
def stop_job(self, name: str, debug: bool = False) -> SuccessTuple:
|
49
|
+
"""
|
50
|
+
Stop a job.
|
51
|
+
"""
|
52
|
+
|
53
|
+
@abstractmethod
|
54
|
+
def pause_job(self, name: str, debug: bool = False) -> SuccessTuple:
|
55
|
+
"""
|
56
|
+
Pause a job.
|
57
|
+
"""
|
58
|
+
|
59
|
+
@abstractmethod
|
60
|
+
def delete_job(self, name: str, debug: bool = False) -> SuccessTuple:
|
61
|
+
"""
|
62
|
+
Delete a job.
|
63
|
+
"""
|
64
|
+
|
65
|
+
@abstractmethod
|
66
|
+
def get_logs(self, name: str, debug: bool = False) -> str:
|
67
|
+
"""
|
68
|
+
Return a job's log output.
|
69
|
+
"""
|