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.
Files changed (80) hide show
  1. meerschaum/__init__.py +6 -1
  2. meerschaum/__main__.py +9 -9
  3. meerschaum/_internal/arguments/__init__.py +1 -1
  4. meerschaum/_internal/arguments/_parse_arguments.py +72 -6
  5. meerschaum/_internal/arguments/_parser.py +45 -15
  6. meerschaum/_internal/docs/index.py +265 -8
  7. meerschaum/_internal/entry.py +167 -37
  8. meerschaum/_internal/shell/Shell.py +290 -99
  9. meerschaum/_internal/shell/updates.py +175 -0
  10. meerschaum/actions/__init__.py +29 -17
  11. meerschaum/actions/api.py +12 -12
  12. meerschaum/actions/attach.py +113 -0
  13. meerschaum/actions/copy.py +68 -41
  14. meerschaum/actions/delete.py +112 -50
  15. meerschaum/actions/edit.py +3 -3
  16. meerschaum/actions/install.py +40 -32
  17. meerschaum/actions/pause.py +44 -27
  18. meerschaum/actions/register.py +19 -5
  19. meerschaum/actions/restart.py +107 -0
  20. meerschaum/actions/show.py +130 -159
  21. meerschaum/actions/start.py +161 -100
  22. meerschaum/actions/stop.py +78 -42
  23. meerschaum/actions/sync.py +3 -3
  24. meerschaum/actions/upgrade.py +28 -36
  25. meerschaum/api/_events.py +25 -1
  26. meerschaum/api/_oauth2.py +2 -0
  27. meerschaum/api/_websockets.py +2 -2
  28. meerschaum/api/dash/callbacks/jobs.py +36 -44
  29. meerschaum/api/dash/jobs.py +89 -78
  30. meerschaum/api/routes/__init__.py +1 -0
  31. meerschaum/api/routes/_actions.py +148 -17
  32. meerschaum/api/routes/_jobs.py +407 -0
  33. meerschaum/api/routes/_pipes.py +25 -25
  34. meerschaum/config/_default.py +1 -0
  35. meerschaum/config/_formatting.py +1 -0
  36. meerschaum/config/_jobs.py +1 -1
  37. meerschaum/config/_paths.py +11 -0
  38. meerschaum/config/_shell.py +84 -67
  39. meerschaum/config/_version.py +1 -1
  40. meerschaum/config/static/__init__.py +18 -0
  41. meerschaum/connectors/Connector.py +13 -7
  42. meerschaum/connectors/__init__.py +28 -15
  43. meerschaum/connectors/api/APIConnector.py +27 -1
  44. meerschaum/connectors/api/_actions.py +71 -6
  45. meerschaum/connectors/api/_jobs.py +368 -0
  46. meerschaum/connectors/api/_misc.py +1 -1
  47. meerschaum/connectors/api/_pipes.py +85 -84
  48. meerschaum/connectors/api/_request.py +13 -9
  49. meerschaum/connectors/parse.py +27 -15
  50. meerschaum/core/Pipe/_bootstrap.py +16 -8
  51. meerschaum/core/Pipe/_sync.py +3 -0
  52. meerschaum/jobs/_Executor.py +69 -0
  53. meerschaum/jobs/_Job.py +899 -0
  54. meerschaum/jobs/__init__.py +396 -0
  55. meerschaum/jobs/systemd.py +694 -0
  56. meerschaum/plugins/__init__.py +97 -12
  57. meerschaum/utils/daemon/Daemon.py +352 -147
  58. meerschaum/utils/daemon/FileDescriptorInterceptor.py +19 -10
  59. meerschaum/utils/daemon/RotatingFile.py +22 -8
  60. meerschaum/utils/daemon/StdinFile.py +121 -0
  61. meerschaum/utils/daemon/__init__.py +42 -27
  62. meerschaum/utils/daemon/_names.py +15 -13
  63. meerschaum/utils/formatting/__init__.py +83 -37
  64. meerschaum/utils/formatting/_jobs.py +146 -55
  65. meerschaum/utils/formatting/_shell.py +6 -0
  66. meerschaum/utils/misc.py +41 -22
  67. meerschaum/utils/packages/__init__.py +21 -15
  68. meerschaum/utils/packages/_packages.py +9 -6
  69. meerschaum/utils/process.py +9 -9
  70. meerschaum/utils/prompt.py +20 -7
  71. meerschaum/utils/schedule.py +21 -15
  72. meerschaum/utils/venv/__init__.py +2 -2
  73. {meerschaum-2.2.6.dist-info → meerschaum-2.3.0.dist-info}/METADATA +22 -25
  74. {meerschaum-2.2.6.dist-info → meerschaum-2.3.0.dist-info}/RECORD +80 -70
  75. {meerschaum-2.2.6.dist-info → meerschaum-2.3.0.dist-info}/WHEEL +1 -1
  76. {meerschaum-2.2.6.dist-info → meerschaum-2.3.0.dist-info}/LICENSE +0 -0
  77. {meerschaum-2.2.6.dist-info → meerschaum-2.3.0.dist-info}/NOTICE +0 -0
  78. {meerschaum-2.2.6.dist-info → meerschaum-2.3.0.dist-info}/entry_points.txt +0 -0
  79. {meerschaum-2.2.6.dist-info → meerschaum-2.3.0.dist-info}/top_level.txt +0 -0
  80. {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.utils.formatting import pprint
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
- self,
28
- method: str,
29
- r_url: str,
30
- headers: Optional[Dict[str, Any]] = None,
31
- use_token: bool = True,
32
- debug: bool = False,
33
- **kwargs: Any
34
- ) -> 'requests.Response':
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}")
@@ -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
- keys: str,
14
- construct: bool = True,
15
- as_tuple: bool = False,
16
- **kw: Any
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
- keys: Optional[str],
91
- construct: bool = True,
92
- as_tuple: bool = False,
93
- **kw
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
- keys: str
124
- ) -> bool:
125
- """Verify a connector_keys string references a valid connector.
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}?", yes=yes, noask=noask
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(f"Would you like to try syncing {self} now?", yes=yes, noask=noask):
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 = [self.connector_keys],
101
- metric_keys = [self.metric_key],
102
- location_keys = [self.location_key],
103
- mrsm_instance = str(self.instance_connector),
104
- debug = debug,
105
- shell = 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
@@ -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
+ """