dekshell 0.2.7__tar.gz → 0.2.9__tar.gz
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.
- {dekshell-0.2.7 → dekshell-0.2.9}/PKG-INFO +1 -1
- {dekshell-0.2.7 → dekshell-0.2.9}/dekshell/core/contexts/methods.py +19 -2
- {dekshell-0.2.7 → dekshell-0.2.9}/dekshell/core/markers/__init__.py +3 -2
- {dekshell-0.2.7 → dekshell-0.2.9}/dekshell/core/markers/base/__init__.py +41 -22
- {dekshell-0.2.7 → dekshell-0.2.9}/dekshell/core/markers/exec.py +19 -7
- {dekshell-0.2.7 → dekshell-0.2.9}/dekshell/core/markers/var.py +10 -4
- {dekshell-0.2.7 → dekshell-0.2.9}/pyproject.toml +1 -1
- {dekshell-0.2.7 → dekshell-0.2.9}/README.md +0 -0
- {dekshell-0.2.7 → dekshell-0.2.9}/dekshell/__init__.py +0 -0
- {dekshell-0.2.7 → dekshell-0.2.9}/dekshell/click/__entry__.py +0 -0
- {dekshell-0.2.7 → dekshell-0.2.9}/dekshell/click/__init__.py +0 -0
- {dekshell-0.2.7 → dekshell-0.2.9}/dekshell/core/__init__.py +0 -0
- {dekshell-0.2.7 → dekshell-0.2.9}/dekshell/core/contexts/__init__.py +0 -0
- {dekshell-0.2.7 → dekshell-0.2.9}/dekshell/core/contexts/properties.py +0 -0
- {dekshell-0.2.7 → dekshell-0.2.9}/dekshell/core/markers/base/core.py +0 -0
- {dekshell-0.2.7 → dekshell-0.2.9}/dekshell/core/markers/commands.py +0 -0
- {dekshell-0.2.7 → dekshell-0.2.9}/dekshell/core/markers/comment.py +0 -0
- {dekshell-0.2.7 → dekshell-0.2.9}/dekshell/core/markers/define.py +0 -0
- {dekshell-0.2.7 → dekshell-0.2.9}/dekshell/core/markers/echo.py +0 -0
- {dekshell-0.2.7 → dekshell-0.2.9}/dekshell/core/markers/empty.py +0 -0
- {dekshell-0.2.7 → dekshell-0.2.9}/dekshell/core/markers/env.py +0 -0
- {dekshell-0.2.7 → dekshell-0.2.9}/dekshell/core/markers/for_.py +0 -0
- {dekshell-0.2.7 → dekshell-0.2.9}/dekshell/core/markers/function.py +0 -0
- {dekshell-0.2.7 → dekshell-0.2.9}/dekshell/core/markers/if_.py +0 -0
- {dekshell-0.2.7 → dekshell-0.2.9}/dekshell/core/markers/input.py +0 -0
- {dekshell-0.2.7 → dekshell-0.2.9}/dekshell/core/markers/invoke.py +0 -0
- {dekshell-0.2.7 → dekshell-0.2.9}/dekshell/core/markers/pip_.py +0 -0
- {dekshell-0.2.7 → dekshell-0.2.9}/dekshell/core/markers/redirect.py +0 -0
- {dekshell-0.2.7 → dekshell-0.2.9}/dekshell/core/markers/shell.py +0 -0
- {dekshell-0.2.7 → dekshell-0.2.9}/dekshell/core/markers/while_.py +0 -0
- {dekshell-0.2.7 → dekshell-0.2.9}/dekshell/core/plugin/__init__.py +0 -0
- {dekshell-0.2.7 → dekshell-0.2.9}/dekshell/core/redirect.py +0 -0
- {dekshell-0.2.7 → dekshell-0.2.9}/dekshell/utils/__init__.py +0 -0
- {dekshell-0.2.7 → dekshell-0.2.9}/dekshell/utils/beep.py +0 -0
- {dekshell-0.2.7 → dekshell-0.2.9}/dekshell/utils/cmd.py +0 -0
- {dekshell-0.2.7 → dekshell-0.2.9}/dekshell/utils/pkg.py +0 -0
- {dekshell-0.2.7 → dekshell-0.2.9}/dekshell/utils/serializer.py +0 -0
- {dekshell-0.2.7 → dekshell-0.2.9}/dekshell/utils/shell.py +0 -0
|
@@ -6,8 +6,10 @@ import getpass
|
|
|
6
6
|
from functools import reduce
|
|
7
7
|
from itertools import chain
|
|
8
8
|
from pathlib import Path
|
|
9
|
+
from io import BytesIO, StringIO
|
|
9
10
|
from dektools.file import sure_dir, write_file, read_text, remove_path, sure_parent_dir, normal_path, \
|
|
10
|
-
format_path_desc, read_file, split_ext, path_ext, clear_dir, copy_recurse_ignore, path_is_empty
|
|
11
|
+
format_path_desc, read_file, split_ext, path_ext, clear_dir, copy_recurse_ignore, path_is_empty, \
|
|
12
|
+
read_lines, \
|
|
11
13
|
split_file, combine_split_files, remove_split_files, meta_split_file, tree, iglob, \
|
|
12
14
|
where, where_list, which, which_list
|
|
13
15
|
from dektools.hash import hash_file
|
|
@@ -129,8 +131,21 @@ def _install(name):
|
|
|
129
131
|
shell_wrapper(command)
|
|
130
132
|
|
|
131
133
|
|
|
134
|
+
def _io(x=None):
|
|
135
|
+
if x is None:
|
|
136
|
+
x = b''
|
|
137
|
+
return BytesIO(x) if isinstance(x, bytes) else StringIO(x)
|
|
138
|
+
|
|
139
|
+
|
|
140
|
+
def _cd(path=None):
|
|
141
|
+
if path is None:
|
|
142
|
+
path = os.path.expanduser('~')
|
|
143
|
+
os.chdir(path)
|
|
144
|
+
return path
|
|
145
|
+
|
|
146
|
+
|
|
132
147
|
path_common_methods = {
|
|
133
|
-
'cd':
|
|
148
|
+
'cd': _cd,
|
|
134
149
|
'cwd': lambda: os.getcwd(),
|
|
135
150
|
'which': lambda *x: which(*x) or '',
|
|
136
151
|
'where': lambda *x: where(*x) or '',
|
|
@@ -140,6 +155,7 @@ path_common_methods = {
|
|
|
140
155
|
}
|
|
141
156
|
|
|
142
157
|
default_methods = {
|
|
158
|
+
'io': _io,
|
|
143
159
|
'reduce': reduce,
|
|
144
160
|
'chain': chain,
|
|
145
161
|
'xeval': _xeval,
|
|
@@ -179,6 +195,7 @@ default_methods = {
|
|
|
179
195
|
'rm': _remove_path,
|
|
180
196
|
'wf': write_file,
|
|
181
197
|
'rt': read_text,
|
|
198
|
+
'rl': read_lines,
|
|
182
199
|
'rf': read_file,
|
|
183
200
|
'ci': copy_recurse_ignore,
|
|
184
201
|
|
|
@@ -26,7 +26,8 @@ def generate_markers(*args, **kwargs):
|
|
|
26
26
|
ErrorEchoMarker, EchoNoWrapMarker, EchoMarker,
|
|
27
27
|
InputMarker,
|
|
28
28
|
DelVarMarker,
|
|
29
|
-
ExecLinesUpdateMarker, ExecLinesMarker, ExecMarker,
|
|
29
|
+
ExecLinesUpdateMarker, ExecLinesMarker, ExecMarker, ExecCmdcallSimpleLinesMarker, ExecCmdcallLinesMarker,
|
|
30
|
+
ExecCmdcallMarker, ExecCmdcallChainMarker,
|
|
30
31
|
EnvShellMarker, EnvMarker,
|
|
31
32
|
IfMarker, IfElifMarker, IfElseMarker,
|
|
32
33
|
WhileMarker, WhileElseMarker,
|
|
@@ -45,7 +46,7 @@ def generate_markers(*args, **kwargs):
|
|
|
45
46
|
IgnoreMarker,
|
|
46
47
|
PrefixShellMarker,
|
|
47
48
|
AssignCallMarker, AssignInvokerMarker, AssignGotoMarker, AssignTimeoutMarker, AssignRetryMarker,
|
|
48
|
-
AssignExecMarker, AssignEvalMarker, AssignCmdcallMarker,
|
|
49
|
+
AssignExecMarker, AssignEvalMarker, AssignCmdcallMarker, AssignCmdcallChainMarker,
|
|
49
50
|
AssignMultiLineRawStrMarker, AssignMultiLineStrMarker, AssignRawStrMarker, AssignStrMarker,
|
|
50
51
|
EmptyMarker, # must be at the tail
|
|
51
52
|
]
|
|
@@ -9,7 +9,7 @@ from ....utils.cmd import cmd2ak
|
|
|
9
9
|
|
|
10
10
|
cmd_call_prefix_simple = '>'
|
|
11
11
|
cmd_call_prefix = cmd_call_prefix_simple * 2
|
|
12
|
-
cmd_call_prefix_chain =
|
|
12
|
+
cmd_call_prefix_chain = '*'
|
|
13
13
|
cmd_call_eval_prefix = '='
|
|
14
14
|
cmd_call_eval_escape = '\\'
|
|
15
15
|
|
|
@@ -104,10 +104,25 @@ class MarkerBase:
|
|
|
104
104
|
def remove_var(context, name):
|
|
105
105
|
context.remove_variable(name)
|
|
106
106
|
|
|
107
|
+
@classmethod
|
|
108
|
+
def cmd_call_split(cls, s, max_item=None):
|
|
109
|
+
if max_item == 0:
|
|
110
|
+
return [], s.lstrip()
|
|
111
|
+
m = re.match(rf'[ \t\f\r]*({cmd_call_prefix_simple}[{cmd_call_prefix_simple}]?)[ \t\f\r]*([^\W\d][\w.]*)', s)
|
|
112
|
+
if not m:
|
|
113
|
+
return [], s.lstrip()
|
|
114
|
+
rest = s[m.span()[1]:]
|
|
115
|
+
if max_item is not None:
|
|
116
|
+
max_item -= 1
|
|
117
|
+
items, body = cls.cmd_call_split(rest, max_item)
|
|
118
|
+
items = [(m.group(2), m.group(1) == cmd_call_prefix_simple), *items]
|
|
119
|
+
return items, body
|
|
120
|
+
|
|
107
121
|
@classmethod
|
|
108
122
|
def cmd_call_parse(cls, context, s, simple):
|
|
123
|
+
s = s.lstrip()
|
|
109
124
|
if simple:
|
|
110
|
-
argv =
|
|
125
|
+
argv = re.split(r'[ \t\f\r]+', s, 1)
|
|
111
126
|
args = argv[1:]
|
|
112
127
|
kwargs = {}
|
|
113
128
|
else:
|
|
@@ -117,12 +132,6 @@ class MarkerBase:
|
|
|
117
132
|
func = argv[0]
|
|
118
133
|
return func, args, kwargs
|
|
119
134
|
|
|
120
|
-
@classmethod
|
|
121
|
-
def cmd_call(cls, context, s, simple):
|
|
122
|
-
func, args, kwargs = cls.cmd_call_parse(context, s, simple)
|
|
123
|
-
func = cls.eval(context, func)
|
|
124
|
-
return func(*args, **kwargs)
|
|
125
|
-
|
|
126
135
|
@classmethod
|
|
127
136
|
def translate_case(cls, context, s, case=None):
|
|
128
137
|
if case is None:
|
|
@@ -231,22 +240,32 @@ class MarkerBase:
|
|
|
231
240
|
__inner_context__ = context # noqa
|
|
232
241
|
expression = expression.lstrip()
|
|
233
242
|
if expression.startswith(cmd_call_prefix_chain):
|
|
234
|
-
|
|
243
|
+
max_item = None
|
|
235
244
|
expression = expression[len(cmd_call_prefix_chain):]
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
value = cls.eval_mixin(context, expression[index:], False)
|
|
240
|
-
for func in reversed(funcs):
|
|
241
|
-
if func:
|
|
242
|
-
value = cls.eval(context, func)(value)
|
|
243
|
-
return value
|
|
244
|
-
elif expression.startswith(cmd_call_prefix):
|
|
245
|
-
expression = cls.translate_case(context, expression, translate)
|
|
246
|
-
return cls.cmd_call(context, expression[len(cmd_call_prefix):], False)
|
|
247
|
-
elif expression.startswith(cmd_call_prefix_simple):
|
|
245
|
+
else:
|
|
246
|
+
max_item = 1
|
|
247
|
+
if expression.startswith(cmd_call_prefix_simple):
|
|
248
248
|
expression = cls.translate_case(context, expression, translate)
|
|
249
|
-
|
|
249
|
+
funcs, body = cls.cmd_call_split(expression, max_item)
|
|
250
|
+
if funcs:
|
|
251
|
+
func, simple = funcs[-1]
|
|
252
|
+
f = cls.eval(context, func)
|
|
253
|
+
if simple:
|
|
254
|
+
value = f(body)
|
|
255
|
+
else:
|
|
256
|
+
if body:
|
|
257
|
+
args, kwargs = cls.cmd2ak(cls.split(body))
|
|
258
|
+
args, kwargs = cls.var_map_batch(context, *args, **kwargs)
|
|
259
|
+
else:
|
|
260
|
+
args, kwargs = [], {}
|
|
261
|
+
value = f(*args, **kwargs)
|
|
262
|
+
for func, simple in reversed(funcs[:-1]):
|
|
263
|
+
f = cls.eval(context, func)
|
|
264
|
+
if simple:
|
|
265
|
+
value = f(value)
|
|
266
|
+
else:
|
|
267
|
+
value = f(*value)
|
|
268
|
+
return value
|
|
250
269
|
else:
|
|
251
270
|
if expression.startswith(cmd_call_eval_prefix):
|
|
252
271
|
expression = expression[len(cmd_call_eval_prefix):]
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
from .base import MarkerBase, MarkerWithEnd, MarkerNoTranslator,
|
|
1
|
+
from .base import MarkerBase, MarkerWithEnd, MarkerNoTranslator, cmd_call_prefix_simple, \
|
|
2
2
|
cmd_call_prefix_chain
|
|
3
3
|
from .empty import EmptyMarker
|
|
4
4
|
|
|
@@ -30,15 +30,22 @@ class ExecLinesUpdateMarker(MarkerWithEnd, MarkerNoTranslator):
|
|
|
30
30
|
return []
|
|
31
31
|
|
|
32
32
|
|
|
33
|
-
class
|
|
34
|
-
tag_head = cmd_call_prefix_simple
|
|
35
|
-
|
|
33
|
+
class ExecCmdcallMarkerBase(MarkerBase):
|
|
36
34
|
def execute(self, context, command, marker_node, marker_set):
|
|
37
35
|
self.eval_mixin(context, command, False)
|
|
38
36
|
|
|
39
37
|
|
|
40
|
-
class
|
|
41
|
-
tag_head =
|
|
38
|
+
class ExecCmdcallMarker(ExecCmdcallMarkerBase):
|
|
39
|
+
tag_head = cmd_call_prefix_simple
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
class ExecCmdcallChainMarker(ExecCmdcallMarkerBase):
|
|
43
|
+
tag_head = cmd_call_prefix_chain + cmd_call_prefix_simple
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
class ExecCmdcallSimpleLinesMarker(MarkerWithEnd):
|
|
47
|
+
command_append_prefix = cmd_call_prefix_simple
|
|
48
|
+
tag_head = cmd_call_prefix_simple * 3
|
|
42
49
|
cmd_call_marker_cls = ExecCmdcallMarker
|
|
43
50
|
targets_marker_cls = (EmptyMarker,)
|
|
44
51
|
|
|
@@ -49,7 +56,7 @@ class ExecCmdcallLinesMarker(MarkerWithEnd):
|
|
|
49
56
|
if child.is_type(*self.targets_marker_cls):
|
|
50
57
|
node = marker_set.node_cls(
|
|
51
58
|
marker,
|
|
52
|
-
self.
|
|
59
|
+
self.command_append_prefix + ' ' + child.command,
|
|
53
60
|
child.index,
|
|
54
61
|
marker_node,
|
|
55
62
|
child.command
|
|
@@ -58,3 +65,8 @@ class ExecCmdcallLinesMarker(MarkerWithEnd):
|
|
|
58
65
|
else:
|
|
59
66
|
result.append(child)
|
|
60
67
|
return result
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
class ExecCmdcallLinesMarker(ExecCmdcallSimpleLinesMarker):
|
|
71
|
+
command_append_prefix = cmd_call_prefix_simple * 2
|
|
72
|
+
tag_head = cmd_call_prefix_simple * 4
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import re
|
|
2
|
-
from .base import MarkerBase, MarkerWithEnd, MarkerNoTranslator, cmd_call_prefix_simple
|
|
2
|
+
from .base import MarkerBase, MarkerWithEnd, MarkerNoTranslator, cmd_call_prefix_simple, cmd_call_prefix_chain
|
|
3
3
|
from .function import CallMarker
|
|
4
4
|
from .shell import TimeoutMarker, RetryMarker
|
|
5
5
|
from .invoke import MarkerInvokerBase, InvokeMarker, GotoMarker
|
|
6
6
|
|
|
7
7
|
|
|
8
8
|
class MarkerAssignBase(MarkerBase):
|
|
9
|
-
tag_head_re = r"[^\W\d]\w*[ \t\f\r
|
|
9
|
+
tag_head_re = r"[^\W\d]\w*[ \t\f\r]*%s"
|
|
10
10
|
|
|
11
11
|
|
|
12
12
|
class MarkerAssignValueBase(MarkerAssignBase):
|
|
@@ -73,10 +73,16 @@ class AssignExecMarker(MarkerAssignBase, MarkerWithEnd, MarkerNoTranslator):
|
|
|
73
73
|
|
|
74
74
|
|
|
75
75
|
class AssignCmdcallMarker(MarkerAssignValueBase):
|
|
76
|
-
|
|
76
|
+
tag_head_re_args_raw = cmd_call_prefix_simple
|
|
77
|
+
tag_head_re_args = re.escape(tag_head_re_args_raw)
|
|
77
78
|
|
|
78
79
|
def get_value(self, context, marker_node, marker_set, expression):
|
|
79
|
-
return self.eval_mixin(context,
|
|
80
|
+
return self.eval_mixin(context, self.tag_head_re_args_raw + expression, False)
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
class AssignCmdcallChainMarker(AssignCmdcallMarker):
|
|
84
|
+
tag_head_re_args_raw = cmd_call_prefix_chain + cmd_call_prefix_simple
|
|
85
|
+
tag_head_re_args = re.escape(tag_head_re_args_raw)
|
|
80
86
|
|
|
81
87
|
|
|
82
88
|
class AssignCallMarker(MarkerAssignValueBase, CallMarker):
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|