dekshell 0.2.42__py3-none-any.whl → 0.2.43__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.
- dekshell/core/contexts/methods.py +13 -21
- dekshell/core/contexts/properties.py +3 -3
- dekshell/core/markers/__init__.py +6 -2
- dekshell/core/markers/base/__init__.py +56 -49
- dekshell/core/markers/base/core.py +28 -8
- dekshell/core/markers/exec.py +2 -2
- dekshell/core/markers/function.py +3 -2
- dekshell/core/markers/invoke.py +22 -2
- dekshell/core/markers/var.py +59 -10
- {dekshell-0.2.42.dist-info → dekshell-0.2.43.dist-info}/METADATA +1 -1
- {dekshell-0.2.42.dist-info → dekshell-0.2.43.dist-info}/RECORD +13 -13
- {dekshell-0.2.42.dist-info → dekshell-0.2.43.dist-info}/WHEEL +0 -0
- {dekshell-0.2.42.dist-info → dekshell-0.2.43.dist-info}/entry_points.txt +0 -0
|
@@ -37,7 +37,7 @@ from dektools.cmd.git import git_parse_modules, git_clean_dir, git_fetch_min, gi
|
|
|
37
37
|
from ...utils.beep import sound_notify
|
|
38
38
|
from ...utils.cmd import pack_context_full
|
|
39
39
|
from ..markers.base.core import MarkerBase, get_inner_vars
|
|
40
|
-
from ..markers.invoke import InvokeMarker, GotoMarker
|
|
40
|
+
from ..markers.invoke import InvokeMarker, GotoMarker, ImportMarker
|
|
41
41
|
from ..redirect import search_bin_by_path_tree
|
|
42
42
|
|
|
43
43
|
|
|
@@ -125,19 +125,10 @@ def _eval_lines(expression, default=_eval_default):
|
|
|
125
125
|
return default
|
|
126
126
|
|
|
127
127
|
|
|
128
|
-
def
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
os.chdir(os.path.dirname(filepath))
|
|
133
|
-
ret_value = marker_set.shell_exec(filepath, pack_context_full(args, kwargs))
|
|
134
|
-
os.chdir(cwd)
|
|
135
|
-
return ret_value
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
def _goto(__placeholder__filepath, *args, **kwargs):
|
|
139
|
-
marker_set = get_inner_vars('__inner_marker_set__', full=True)
|
|
140
|
-
return marker_set.shell_exec(normal_path(__placeholder__filepath), pack_context_full(args, kwargs))
|
|
128
|
+
def _global_update(variables):
|
|
129
|
+
context = get_inner_vars('__inner_context__', full=True)
|
|
130
|
+
for k, v in variables.items():
|
|
131
|
+
MarkerBase.set_var_raw(context, k, v)
|
|
141
132
|
|
|
142
133
|
|
|
143
134
|
def _defined(name):
|
|
@@ -256,8 +247,14 @@ default_methods = {
|
|
|
256
247
|
'run': shell_wrapper,
|
|
257
248
|
'eval': _eval_mixin,
|
|
258
249
|
'exec': _eval_lines,
|
|
259
|
-
'
|
|
260
|
-
'
|
|
250
|
+
'update': _global_update,
|
|
251
|
+
'assign': lambda k, v: _global_update({k: v}),
|
|
252
|
+
'invoke': lambda __placeholder__filepath, *args, **kwargs: InvokeMarker.execute_file(
|
|
253
|
+
None, __placeholder__filepath, args, kwargs),
|
|
254
|
+
'goto': lambda __placeholder__filepath, *args, **kwargs: GotoMarker.execute_file(
|
|
255
|
+
None, __placeholder__filepath, args, kwargs),
|
|
256
|
+
'imp': lambda __placeholder__filepath, *args, **kwargs: ImportMarker.execute_file(
|
|
257
|
+
None, __placeholder__filepath, args, kwargs),
|
|
261
258
|
},
|
|
262
259
|
'path': {
|
|
263
260
|
**path_common_methods,
|
|
@@ -350,11 +347,6 @@ default_methods = {
|
|
|
350
347
|
|
|
351
348
|
'beep': lambda x=True: sound_notify(x),
|
|
352
349
|
|
|
353
|
-
'invoke': lambda __placeholder__filepath, *args, **kwargs: InvokeMarker.execute_file(
|
|
354
|
-
None, __placeholder__filepath, args, kwargs),
|
|
355
|
-
'goto': lambda __placeholder__filepath, *args, **kwargs: GotoMarker.execute_file(
|
|
356
|
-
None, __placeholder__filepath, args, kwargs),
|
|
357
|
-
|
|
358
350
|
'glob': {
|
|
359
351
|
're': glob2re,
|
|
360
352
|
'compile': glob_compile,
|
|
@@ -58,12 +58,12 @@ class _Env:
|
|
|
58
58
|
class _EnvS:
|
|
59
59
|
def __getattr__(self, item):
|
|
60
60
|
context = get_inner_vars('__inner_context__', full=True)
|
|
61
|
-
return context.
|
|
61
|
+
return context.get_env_full(item.upper(), '')
|
|
62
62
|
|
|
63
63
|
def __getitem__(self, item):
|
|
64
64
|
context = get_inner_vars('__inner_context__', full=True)
|
|
65
65
|
default = object()
|
|
66
|
-
ret = context.
|
|
66
|
+
ret = context.get_env_full(item.upper(), default)
|
|
67
67
|
if ret is default:
|
|
68
68
|
raise KeyError(item)
|
|
69
69
|
return ret
|
|
@@ -71,7 +71,7 @@ class _EnvS:
|
|
|
71
71
|
def __contains__(self, item):
|
|
72
72
|
context = get_inner_vars('__inner_context__', full=True)
|
|
73
73
|
default = object()
|
|
74
|
-
ret = context.
|
|
74
|
+
ret = context.get_env_full(item.upper(), default)
|
|
75
75
|
return ret is not default
|
|
76
76
|
|
|
77
77
|
|
|
@@ -46,8 +46,12 @@ def generate_markers(*args, **kwargs):
|
|
|
46
46
|
TimeoutMarker, RetryMarker,
|
|
47
47
|
IgnoreMarker,
|
|
48
48
|
IgnoreErrorShellMarker, PrefixShellMarker,
|
|
49
|
-
AssignCallMarker, AssignInvokerMarker, AssignGotoMarker,
|
|
50
|
-
|
|
49
|
+
AssignCallMarker, AssignInvokerMarker, AssignGotoMarker, AssignImportMarker, AssignTimeoutMarker,
|
|
50
|
+
AssignRetryMarker,
|
|
51
|
+
AssignExecMarker, AssignTranslatorEvalMarker, AssignEvalMarker,
|
|
52
|
+
AssignCommandRcSilenceMarker, AssignCommandRcMarker, AssignCommandOutputMarker,
|
|
53
|
+
AssignEncodeStrMarker, AssignDecodeMarker, AssignEncodeMarker,
|
|
54
|
+
AssignEnvMarker, AssignEnvFullMarker, AssignCmdcallMarker, AssignCmdcallChainMarker,
|
|
51
55
|
AssignMultiLineRawStrMarker, AssignMultiLineStrMarker, AssignRawStrMarker, AssignStrMarker,
|
|
52
56
|
EmptyMarker, # must be at the tail
|
|
53
57
|
]
|
|
@@ -30,6 +30,7 @@ class MarkerBase:
|
|
|
30
30
|
trans_marker_command_rc_silence = '<<<'
|
|
31
31
|
trans_marker_command_rc = '<<'
|
|
32
32
|
trans_marker_command_output = '<'
|
|
33
|
+
trans_marker_encode_str = '///'
|
|
33
34
|
trans_marker_decode = '//'
|
|
34
35
|
trans_marker_encode = '/'
|
|
35
36
|
trans_marker_env = '$$'
|
|
@@ -99,8 +100,9 @@ class MarkerBase:
|
|
|
99
100
|
def raise_(self, message):
|
|
100
101
|
raise RaiseException(message)
|
|
101
102
|
|
|
102
|
-
|
|
103
|
-
|
|
103
|
+
@classmethod
|
|
104
|
+
def set_var(cls, context, array, index, value):
|
|
105
|
+
cls.set_var_raw(context, cls.get_item(array, index, cls.var_name_anonymous), value)
|
|
104
106
|
|
|
105
107
|
@staticmethod
|
|
106
108
|
def set_var_raw(context, name, value):
|
|
@@ -114,7 +116,9 @@ class MarkerBase:
|
|
|
114
116
|
def cmd_call_split(cls, s, max_item=None):
|
|
115
117
|
if max_item == 0:
|
|
116
118
|
return [], s.lstrip()
|
|
117
|
-
m = re.match(
|
|
119
|
+
m = re.match(
|
|
120
|
+
rf'''[ \t\f\r]*({cmd_call_prefix_simple}[{cmd_call_prefix_simple}]?)[ \t\f\r]*([^\W\d][\w.]*)'''
|
|
121
|
+
, s)
|
|
118
122
|
if not m:
|
|
119
123
|
return [], s.lstrip()
|
|
120
124
|
rest = s[m.span()[1]:]
|
|
@@ -154,73 +158,76 @@ class MarkerBase:
|
|
|
154
158
|
def handler(expression, _, __):
|
|
155
159
|
expression = expression.lstrip()
|
|
156
160
|
as_var = False
|
|
157
|
-
|
|
161
|
+
ignore_errors = False
|
|
158
162
|
while True:
|
|
159
163
|
change = 0
|
|
160
164
|
if not as_var and expression.startswith(cls.trans_marker__as_var):
|
|
161
165
|
expression = expression[len(cls.trans_marker__as_var):].lstrip()
|
|
162
166
|
as_var = True
|
|
163
|
-
change +=1
|
|
164
|
-
if not
|
|
167
|
+
change += 1
|
|
168
|
+
if not ignore_errors and expression.startswith(cls.trans_marker__ignore):
|
|
165
169
|
expression = expression[len(cls.trans_marker__ignore):].lstrip()
|
|
166
|
-
|
|
167
|
-
change +=1
|
|
170
|
+
ignore_errors = True
|
|
171
|
+
change += 1
|
|
168
172
|
if change in (0, 2):
|
|
169
173
|
break
|
|
170
|
-
value =
|
|
174
|
+
value = cls.parse_expression(context, expression, ignore_errors)
|
|
171
175
|
if as_var:
|
|
172
176
|
return context.add_variable_temp(value)
|
|
173
177
|
return value
|
|
174
178
|
|
|
175
|
-
|
|
179
|
+
return deep_format(
|
|
180
|
+
s,
|
|
181
|
+
# f"{re.escape(cls.trans_marker__begin)}({cls.trans_marker__set})?",
|
|
182
|
+
f"{re.escape(cls.trans_marker__begin)}",
|
|
183
|
+
re.escape(cls.trans_marker__end), handler, cls.trans_marker__escape)
|
|
184
|
+
|
|
185
|
+
@classmethod
|
|
186
|
+
def parse_expression(cls, context, expression, ignore_errors=False):
|
|
187
|
+
def evaluate(expr, default):
|
|
176
188
|
try:
|
|
177
|
-
return cls.eval_mixin(context,
|
|
189
|
+
return cls.eval_mixin(context, expr, False)
|
|
178
190
|
except NameError:
|
|
179
|
-
if
|
|
191
|
+
if ignore_errors:
|
|
180
192
|
return default
|
|
181
193
|
else:
|
|
182
194
|
raise
|
|
183
195
|
|
|
184
|
-
def handler_core(expression, ignore):
|
|
185
|
-
if expression.startswith(cls.trans_marker_command_rc_silence):
|
|
186
|
-
expression = expression[len(cls.trans_marker_command_rc_silence):]
|
|
187
|
-
return shell_exitcode(expression, env=context.environ_full())
|
|
188
|
-
elif expression.startswith(cls.trans_marker_command_rc):
|
|
189
|
-
expression = expression[len(cls.trans_marker_command_rc):]
|
|
190
|
-
return shell_wrapper(expression, check=False, env=context.environ_full())
|
|
191
|
-
elif expression.startswith(cls.trans_marker_command_output):
|
|
192
|
-
expression = expression[len(cls.trans_marker_command_output):]
|
|
193
|
-
return shell_output(expression, env=context.environ_full())
|
|
194
|
-
elif expression.startswith(cls.trans_marker_env):
|
|
195
|
-
expression = expression[len(cls.trans_marker_env):]
|
|
196
|
-
return os.getenv(expression.strip(), default_value)
|
|
197
|
-
elif expression.startswith(cls.trans_marker_env_full):
|
|
198
|
-
expression = expression[len(cls.trans_marker_env_full):]
|
|
199
|
-
return context.get_env(expression.strip(), default_value)
|
|
200
|
-
elif expression.startswith(cls.trans_marker_decode):
|
|
201
|
-
expression = expression[len(cls.trans_marker_decode):]
|
|
202
|
-
value = evaluate(expression, ignore, empty_value)
|
|
203
|
-
if value is empty_value:
|
|
204
|
-
return default_value
|
|
205
|
-
return serializer.load(value)
|
|
206
|
-
elif expression.startswith(cls.trans_marker_encode):
|
|
207
|
-
expression = expression[len(cls.trans_marker_encode):]
|
|
208
|
-
value = evaluate(expression, ignore, empty_value)
|
|
209
|
-
if value is empty_value:
|
|
210
|
-
return default_value
|
|
211
|
-
return serializer.dump(value)
|
|
212
|
-
else:
|
|
213
|
-
return evaluate(expression, ignore, default_value)
|
|
214
|
-
|
|
215
196
|
empty_value = object()
|
|
216
197
|
default_value = ''
|
|
217
198
|
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
199
|
+
if expression.startswith(cls.trans_marker_command_rc_silence):
|
|
200
|
+
expression = expression[len(cls.trans_marker_command_rc_silence):]
|
|
201
|
+
return shell_exitcode(expression, env=context.environ_full())
|
|
202
|
+
elif expression.startswith(cls.trans_marker_command_rc):
|
|
203
|
+
expression = expression[len(cls.trans_marker_command_rc):]
|
|
204
|
+
return shell_wrapper(expression, check=False, env=context.environ_full())
|
|
205
|
+
elif expression.startswith(cls.trans_marker_command_output):
|
|
206
|
+
expression = expression[len(cls.trans_marker_command_output):]
|
|
207
|
+
return shell_output(expression, env=context.environ_full())
|
|
208
|
+
elif expression.startswith(cls.trans_marker_env):
|
|
209
|
+
expression = expression[len(cls.trans_marker_env):]
|
|
210
|
+
return context.get_env(expression.strip(), default_value)
|
|
211
|
+
elif expression.startswith(cls.trans_marker_env_full):
|
|
212
|
+
expression = expression[len(cls.trans_marker_env_full):]
|
|
213
|
+
return context.get_env_full(expression.strip(), default_value)
|
|
214
|
+
elif expression.startswith(cls.trans_marker_encode_str):
|
|
215
|
+
expression = expression[len(cls.trans_marker_encode_str):]
|
|
216
|
+
return serializer.dump(expression)
|
|
217
|
+
elif expression.startswith(cls.trans_marker_decode):
|
|
218
|
+
expression = expression[len(cls.trans_marker_decode):]
|
|
219
|
+
value = evaluate(expression, empty_value)
|
|
220
|
+
if value is empty_value:
|
|
221
|
+
return default_value
|
|
222
|
+
return serializer.load(value)
|
|
223
|
+
elif expression.startswith(cls.trans_marker_encode):
|
|
224
|
+
expression = expression[len(cls.trans_marker_encode):]
|
|
225
|
+
value = evaluate(expression, empty_value)
|
|
226
|
+
if value is empty_value:
|
|
227
|
+
return default_value
|
|
228
|
+
return serializer.dump(value)
|
|
229
|
+
else:
|
|
230
|
+
return evaluate(expression, default_value)
|
|
224
231
|
|
|
225
232
|
@classproperty
|
|
226
233
|
@functools.lru_cache(None)
|
|
@@ -87,11 +87,15 @@ class MarkerContext:
|
|
|
87
87
|
environ.update(self.environ.flat())
|
|
88
88
|
return environ
|
|
89
89
|
|
|
90
|
-
def
|
|
90
|
+
def get_env_full(self, name, default=None):
|
|
91
91
|
empty = object()
|
|
92
92
|
value = self.environ.get_item(name, empty)
|
|
93
93
|
if value is not empty:
|
|
94
94
|
return value
|
|
95
|
+
return self.get_env(name, default)
|
|
96
|
+
|
|
97
|
+
@staticmethod
|
|
98
|
+
def get_env(name, default=None):
|
|
95
99
|
return os.environ.get(name, default)
|
|
96
100
|
|
|
97
101
|
|
|
@@ -192,11 +196,12 @@ class MarkerNode:
|
|
|
192
196
|
@classmethod
|
|
193
197
|
def execute_nodes(cls, context, marker_set, nodes):
|
|
194
198
|
__inner_marker_set__ = marker_set # noqa
|
|
199
|
+
context_final = None
|
|
195
200
|
while nodes:
|
|
196
201
|
node = nodes.pop(0)
|
|
197
202
|
result = node.bubble_continue(context, marker_set, node)
|
|
198
203
|
if result is not None:
|
|
199
|
-
return result
|
|
204
|
+
return result, context
|
|
200
205
|
else:
|
|
201
206
|
try:
|
|
202
207
|
changes = node.marker.execute(
|
|
@@ -205,7 +210,7 @@ class MarkerNode:
|
|
|
205
210
|
node, marker_set
|
|
206
211
|
)
|
|
207
212
|
except QuitContextException as e:
|
|
208
|
-
return QuitContext(context, e.args[0])
|
|
213
|
+
return QuitContext(context, e.args[0]), context
|
|
209
214
|
except ExitException:
|
|
210
215
|
raise
|
|
211
216
|
except Exception as e:
|
|
@@ -239,9 +244,10 @@ class MarkerNode:
|
|
|
239
244
|
context_ = context.derive().update_variables(variables)
|
|
240
245
|
elif changes is not None:
|
|
241
246
|
raise TypeError(f"Unknown type of changes: {changes}")
|
|
247
|
+
context_final = context_
|
|
242
248
|
if nodes_ is None:
|
|
243
249
|
nodes_ = node.children[:]
|
|
244
|
-
result = cls.execute_nodes(
|
|
250
|
+
result, _ = cls.execute_nodes(
|
|
245
251
|
context_,
|
|
246
252
|
marker_set,
|
|
247
253
|
nodes_
|
|
@@ -251,16 +257,20 @@ class MarkerNode:
|
|
|
251
257
|
if node is node_cursor: # Depth of the location
|
|
252
258
|
nodes[:0] = node_loop_list
|
|
253
259
|
else:
|
|
254
|
-
return result
|
|
260
|
+
return result, context_
|
|
255
261
|
elif isinstance(result, QuitContext):
|
|
256
262
|
if result.context is context:
|
|
257
|
-
return result
|
|
263
|
+
return result, context_
|
|
258
264
|
else:
|
|
259
265
|
if callback:
|
|
260
266
|
callback(result)
|
|
267
|
+
if context_final is None:
|
|
268
|
+
context_final = context
|
|
269
|
+
return None, context_final
|
|
261
270
|
|
|
262
271
|
def execute(self, context, marker_set):
|
|
263
|
-
|
|
272
|
+
result, context = self.execute_nodes(context, marker_set, [self])
|
|
273
|
+
return QuitContext.real(result), context
|
|
264
274
|
|
|
265
275
|
def walk(self, cb, depth=0):
|
|
266
276
|
cb(self, depth)
|
|
@@ -281,11 +291,20 @@ class MarkerNode:
|
|
|
281
291
|
return self.index + 1
|
|
282
292
|
|
|
283
293
|
|
|
294
|
+
class ShellResult:
|
|
295
|
+
def __init__(self, marker_set: 'MarkerSet', root: MarkerNode, context: MarkerContext, result):
|
|
296
|
+
self.marker_set = marker_set
|
|
297
|
+
self.root = root
|
|
298
|
+
self.context = context
|
|
299
|
+
self.result = result
|
|
300
|
+
|
|
301
|
+
|
|
284
302
|
class MarkerSet:
|
|
285
303
|
node_cls = MarkerNode
|
|
286
304
|
context_cls = MarkerContext
|
|
287
305
|
transformer_cls = TransformerMarker
|
|
288
306
|
hidden_var_set_cls = HiddenVarSet
|
|
307
|
+
shell_result_cls = ShellResult
|
|
289
308
|
|
|
290
309
|
def __init__(self, markers_cls, shell_exec, shell_cmd):
|
|
291
310
|
markers = []
|
|
@@ -353,7 +372,8 @@ class MarkerSet:
|
|
|
353
372
|
def execute(self, commands, context, ln=None):
|
|
354
373
|
try:
|
|
355
374
|
root = self.generate_tree(commands, ln)
|
|
356
|
-
|
|
375
|
+
result, context = root.execute(
|
|
357
376
|
self.context_cls().update_variables({**(context or {}), **dict(__inner_marker_set__=self)}), self)
|
|
377
|
+
return self.shell_result_cls(self, root, context, result)
|
|
358
378
|
except ExitException:
|
|
359
379
|
pass
|
dekshell/core/markers/exec.py
CHANGED
|
@@ -22,7 +22,7 @@ class ExecTranslatorMarker(MarkerBase):
|
|
|
22
22
|
|
|
23
23
|
|
|
24
24
|
class ExecLinesMarker(MarkerWithEnd, MarkerNoTranslator):
|
|
25
|
-
tag_head =
|
|
25
|
+
tag_head = cmd_call_eval_prefix * 2
|
|
26
26
|
|
|
27
27
|
def execute(self, context, command, marker_node, marker_set):
|
|
28
28
|
code = self.get_inner_content(context, marker_node, translate=False)
|
|
@@ -31,7 +31,7 @@ class ExecLinesMarker(MarkerWithEnd, MarkerNoTranslator):
|
|
|
31
31
|
|
|
32
32
|
|
|
33
33
|
class ExecLinesUpdateMarker(MarkerWithEnd, MarkerNoTranslator):
|
|
34
|
-
tag_head =
|
|
34
|
+
tag_head = cmd_call_eval_prefix * 3
|
|
35
35
|
|
|
36
36
|
def execute(self, context, command, marker_node, marker_set):
|
|
37
37
|
code = self.get_inner_content(context, marker_node, translate=False)
|
|
@@ -37,7 +37,7 @@ class Function:
|
|
|
37
37
|
def __call__(self, *args, **kwargs):
|
|
38
38
|
context, marker_set = get_inner_vars('__inner_context__', '__inner_marker_set__', full=True)
|
|
39
39
|
context = context.derive().update_variables(self.pack_variables(context, args, kwargs))
|
|
40
|
-
return QuitContext.real(marker_set.node_cls.execute_nodes(context, marker_set, self.body[:]))
|
|
40
|
+
return QuitContext.real(marker_set.node_cls.execute_nodes(context, marker_set, self.body[:])[0])
|
|
41
41
|
|
|
42
42
|
def __str__(self):
|
|
43
43
|
return f"{self.__class__.__name__}<{self.name}>"
|
|
@@ -48,10 +48,11 @@ class Function:
|
|
|
48
48
|
|
|
49
49
|
class FunctionMarker(MarkerWithEnd):
|
|
50
50
|
tag_head = "function"
|
|
51
|
+
function_cls = Function
|
|
51
52
|
|
|
52
53
|
def execute(self, context, command, marker_node, marker_set):
|
|
53
54
|
name, params = assign_list([''] * 2, self.split_raw(command, 2)[1:])
|
|
54
|
-
self.set_var_raw(context, name,
|
|
55
|
+
self.set_var_raw(context, name, self.function_cls(name, params, marker_node.children[:]))
|
|
55
56
|
return []
|
|
56
57
|
|
|
57
58
|
|
dekshell/core/markers/invoke.py
CHANGED
|
@@ -30,7 +30,7 @@ class GotoMarker(MarkerInvokerBase):
|
|
|
30
30
|
|
|
31
31
|
@classmethod
|
|
32
32
|
def _run_file(cls, marker_set, filepath, attrs):
|
|
33
|
-
return marker_set.shell_exec(filepath, attrs)
|
|
33
|
+
return marker_set.shell_exec(filepath, attrs).result
|
|
34
34
|
|
|
35
35
|
|
|
36
36
|
class InvokeMarker(MarkerInvokerBase):
|
|
@@ -40,6 +40,26 @@ class InvokeMarker(MarkerInvokerBase):
|
|
|
40
40
|
def _run_file(cls, marker_set, filepath, attrs):
|
|
41
41
|
cwd = os.getcwd()
|
|
42
42
|
os.chdir(os.path.dirname(filepath))
|
|
43
|
-
ret_value = marker_set.shell_exec(filepath, attrs)
|
|
43
|
+
ret_value = marker_set.shell_exec(filepath, attrs).result
|
|
44
44
|
os.chdir(cwd)
|
|
45
45
|
return ret_value
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
class Closure:
|
|
49
|
+
def __init__(self, shell_result):
|
|
50
|
+
self.__variables__ = shell_result.context.variables
|
|
51
|
+
|
|
52
|
+
def __getattr__(self, item):
|
|
53
|
+
return self.__variables__.get_item(item)
|
|
54
|
+
|
|
55
|
+
def __getitem__(self, item):
|
|
56
|
+
return self.__variables__.get_item(item, None)
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
class ImportMarker(MarkerInvokerBase):
|
|
60
|
+
tag_head = "import"
|
|
61
|
+
closure_cls = Closure
|
|
62
|
+
|
|
63
|
+
@classmethod
|
|
64
|
+
def _run_file(cls, marker_set, filepath, attrs):
|
|
65
|
+
return cls.closure_cls(marker_set.shell_exec(filepath, attrs))
|
dekshell/core/markers/var.py
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import re
|
|
2
|
-
from .base import MarkerBase, MarkerWithEnd, MarkerNoTranslator, cmd_call_prefix_simple, cmd_call_prefix_chain
|
|
2
|
+
from .base import MarkerBase, MarkerWithEnd, MarkerNoTranslator, cmd_call_prefix_simple, cmd_call_prefix_chain, \
|
|
3
|
+
cmd_call_eval_prefix, cmd_call_eval_trans_prefix
|
|
3
4
|
from .function import CallMarker
|
|
4
5
|
from .shell import TimeoutMarker, RetryMarker
|
|
5
|
-
from .invoke import MarkerInvokerBase, InvokeMarker, GotoMarker
|
|
6
|
+
from .invoke import MarkerInvokerBase, InvokeMarker, GotoMarker, ImportMarker
|
|
6
7
|
|
|
7
8
|
|
|
8
9
|
class MarkerAssignBase(MarkerBase):
|
|
@@ -57,21 +58,21 @@ class AssignMultiLineRawStrMarker(AssignMultiLineStrMarker, MarkerNoTranslator):
|
|
|
57
58
|
|
|
58
59
|
|
|
59
60
|
class AssignEvalMarker(MarkerAssignValueBase, MarkerNoTranslator):
|
|
60
|
-
tag_head_re_args =
|
|
61
|
+
tag_head_re_args = cmd_call_eval_prefix
|
|
61
62
|
|
|
62
63
|
def get_value(self, context, marker_node, marker_set, expression):
|
|
63
64
|
return self.eval(context, expression)
|
|
64
65
|
|
|
65
66
|
|
|
66
67
|
class AssignTranslatorEvalMarker(MarkerAssignValueBase):
|
|
67
|
-
tag_head_re_args =
|
|
68
|
+
tag_head_re_args = cmd_call_eval_trans_prefix
|
|
68
69
|
|
|
69
70
|
def get_value(self, context, marker_node, marker_set, expression):
|
|
70
71
|
return self.eval(context, expression)
|
|
71
72
|
|
|
72
73
|
|
|
73
74
|
class AssignExecMarker(MarkerAssignBase, MarkerWithEnd, MarkerNoTranslator):
|
|
74
|
-
tag_head_re_args =
|
|
75
|
+
tag_head_re_args = cmd_call_eval_prefix * 2
|
|
75
76
|
|
|
76
77
|
def execute(self, context, command, marker_node, marker_set):
|
|
77
78
|
code = self.get_inner_content(context, marker_node, translate=False)
|
|
@@ -81,15 +82,59 @@ class AssignExecMarker(MarkerAssignBase, MarkerWithEnd, MarkerNoTranslator):
|
|
|
81
82
|
return []
|
|
82
83
|
|
|
83
84
|
|
|
84
|
-
class
|
|
85
|
-
tag_head_re_args_raw =
|
|
86
|
-
tag_head_re_args = re.escape(tag_head_re_args_raw)
|
|
85
|
+
class MarkerAssignValueParseExprBase(MarkerAssignValueBase):
|
|
86
|
+
tag_head_re_args_raw = None
|
|
87
87
|
|
|
88
88
|
def get_value(self, context, marker_node, marker_set, expression):
|
|
89
|
-
return self.
|
|
89
|
+
return self.parse_expression(context, self.tag_head_re_args_raw + expression)
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
class AssignCommandRcSilenceMarker(MarkerAssignValueParseExprBase):
|
|
93
|
+
tag_head_re_args_raw = MarkerBase.trans_marker_command_rc_silence
|
|
94
|
+
tag_head_re_args = re.escape(MarkerBase.trans_marker_command_rc_silence)
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
class AssignCommandRcMarker(MarkerAssignValueParseExprBase):
|
|
98
|
+
tag_head_re_args_raw = MarkerBase.trans_marker_command_rc
|
|
99
|
+
tag_head_re_args = re.escape(MarkerBase.trans_marker_command_rc)
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
class AssignCommandOutputMarker(MarkerAssignValueParseExprBase):
|
|
103
|
+
tag_head_re_args_raw = MarkerBase.trans_marker_command_output
|
|
104
|
+
tag_head_re_args = re.escape(MarkerBase.trans_marker_command_output)
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
class AssignEncodeStrMarker(MarkerAssignValueParseExprBase):
|
|
108
|
+
tag_head_re_args_raw = MarkerBase.trans_marker_encode_str
|
|
109
|
+
tag_head_re_args = re.escape(MarkerBase.trans_marker_encode_str)
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
class AssignDecodeMarker(MarkerAssignValueParseExprBase):
|
|
113
|
+
tag_head_re_args_raw = MarkerBase.trans_marker_decode
|
|
114
|
+
tag_head_re_args = re.escape(MarkerBase.trans_marker_decode)
|
|
90
115
|
|
|
91
116
|
|
|
92
|
-
class
|
|
117
|
+
class AssignEncodeMarker(MarkerAssignValueParseExprBase):
|
|
118
|
+
tag_head_re_args_raw = MarkerBase.trans_marker_encode
|
|
119
|
+
tag_head_re_args = re.escape(MarkerBase.trans_marker_encode)
|
|
120
|
+
|
|
121
|
+
|
|
122
|
+
class AssignEnvMarker(MarkerAssignValueParseExprBase):
|
|
123
|
+
tag_head_re_args_raw = MarkerBase.trans_marker_env
|
|
124
|
+
tag_head_re_args = re.escape(MarkerBase.trans_marker_env)
|
|
125
|
+
|
|
126
|
+
|
|
127
|
+
class AssignEnvFullMarker(MarkerAssignValueParseExprBase):
|
|
128
|
+
tag_head_re_args_raw = MarkerBase.trans_marker_env_full
|
|
129
|
+
tag_head_re_args = re.escape(MarkerBase.trans_marker_env_full)
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
class AssignCmdcallMarker(MarkerAssignValueParseExprBase):
|
|
133
|
+
tag_head_re_args_raw = cmd_call_prefix_simple
|
|
134
|
+
tag_head_re_args = re.escape(tag_head_re_args_raw)
|
|
135
|
+
|
|
136
|
+
|
|
137
|
+
class AssignCmdcallChainMarker(MarkerAssignValueParseExprBase):
|
|
93
138
|
tag_head_re_args_raw = cmd_call_prefix_chain + cmd_call_prefix_simple
|
|
94
139
|
tag_head_re_args = re.escape(tag_head_re_args_raw)
|
|
95
140
|
|
|
@@ -120,6 +165,10 @@ class AssignGotoMarker(AssignMarkerInvokerBase, GotoMarker):
|
|
|
120
165
|
tag_head_re_args = r'goto[ \t\f\r\n]+'
|
|
121
166
|
|
|
122
167
|
|
|
168
|
+
class AssignImportMarker(AssignMarkerInvokerBase, ImportMarker):
|
|
169
|
+
tag_head_re_args = r'import[ \t\f\r\n]+'
|
|
170
|
+
|
|
171
|
+
|
|
123
172
|
class AssignTimeoutMarker(MarkerAssignValueBase, TimeoutMarker):
|
|
124
173
|
tag_head = None
|
|
125
174
|
tag_head_re_args = r'timeout[ \t\f\r\n]+'
|
|
@@ -1,16 +1,16 @@
|
|
|
1
|
-
dekshell-0.2.
|
|
2
|
-
dekshell-0.2.
|
|
3
|
-
dekshell-0.2.
|
|
1
|
+
dekshell-0.2.43.dist-info/METADATA,sha256=7_oIag3oGwZRV1DcfxmuNFRmfSzHQRwJYo5ynVNx7Oc,573
|
|
2
|
+
dekshell-0.2.43.dist-info/WHEEL,sha256=tSfRZzRHthuv7vxpI4aehrdN9scLjk-dCJkPLzkHxGg,90
|
|
3
|
+
dekshell-0.2.43.dist-info/entry_points.txt,sha256=d-kbfULiUTZWIBBsrQF3J_-wESncF-4K2rwHT08grlI,75
|
|
4
4
|
dekshell/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
5
5
|
dekshell/click/__entry__.py,sha256=CMuxUzXoEe4TcHFZwv-MNFwHnu1HSZCDpXFpqQ814uM,42
|
|
6
6
|
dekshell/click/__init__.py,sha256=r-AHdO9CEEVvTN20-8Jozr6Zh8XSv_BnktYRwrlhtrE,2046
|
|
7
7
|
dekshell/core/__init__.py,sha256=isDEKwk1odLdvTQNCILCtVNBuXp1uFVPz_uTDNihkVU,5547
|
|
8
8
|
dekshell/core/contexts/__init__.py,sha256=ynsfv37azOKfI2UKd0iPl2M6iBW-k5cb1BqSLOWuJpI,482
|
|
9
|
-
dekshell/core/contexts/methods.py,sha256=
|
|
10
|
-
dekshell/core/contexts/properties.py,sha256=
|
|
11
|
-
dekshell/core/markers/__init__.py,sha256=
|
|
12
|
-
dekshell/core/markers/base/__init__.py,sha256=
|
|
13
|
-
dekshell/core/markers/base/core.py,sha256=
|
|
9
|
+
dekshell/core/contexts/methods.py,sha256=4oGrhKT_KNtZ17Mm9Lw79pQJPkg00NwpZ_OLaM7x5s8,10897
|
|
10
|
+
dekshell/core/contexts/properties.py,sha256=DCMp008aVpD-xEqrt3N1jftXonP9mVSkd80wFoBaxso,3471
|
|
11
|
+
dekshell/core/markers/__init__.py,sha256=lBVNDy3fTImQn17FLvORA6kKQGrq5t_DIqoXJnJdAAY,2201
|
|
12
|
+
dekshell/core/markers/base/__init__.py,sha256=RrGhwhJlgHXsKYYy2Q2oJAXS7kDOuMiLWwzAwO2j4ng,17007
|
|
13
|
+
dekshell/core/markers/base/core.py,sha256=IM5mZ37k62vHfa457s5_Gh0rVEO6CXH5G4zqTeNm1IY,12399
|
|
14
14
|
dekshell/core/markers/base/shell.py,sha256=fiFsTUDI8pSDDUCk834OI4ajri2qNWFJkLVhmUk2uAs,484
|
|
15
15
|
dekshell/core/markers/commands.py,sha256=mDRj4dSfKbDaZ_ts4lPXd6wftvGFI4VKkRoIzxV7otA,1696
|
|
16
16
|
dekshell/core/markers/comment.py,sha256=U1U3Xc4-giTqSEAPa4E_DmilZM9hs9zG-PCJ9nn4y5U,965
|
|
@@ -18,16 +18,16 @@ dekshell/core/markers/define.py,sha256=LpMSfz9ziXq2aFJ6oMpUFFo93TpBx7GxKYNzCeht4
|
|
|
18
18
|
dekshell/core/markers/echo.py,sha256=1H61qQbY9tZnrKsdTI_shTmDY5ZaSGipDuBSRptAuZw,660
|
|
19
19
|
dekshell/core/markers/empty.py,sha256=pWKsHlrp6uXWU6blqOs0IgN_3kYm1OmDQiKGPERabAo,79
|
|
20
20
|
dekshell/core/markers/env.py,sha256=6ZtiMNdKFbGR_DBjG6C7A8L_lJsiymN5Y5AbnTzyMrE,1158
|
|
21
|
-
dekshell/core/markers/exec.py,sha256=
|
|
21
|
+
dekshell/core/markers/exec.py,sha256=3yWpaCpASrMwzqVslDNzBaUVL7Lbn-zWMs-dOxUePZU,2744
|
|
22
22
|
dekshell/core/markers/for_.py,sha256=uNOEwyDsjffttEBtUYasdlj7FP_sGnQzWuTV5d5esHY,2142
|
|
23
|
-
dekshell/core/markers/function.py,sha256=
|
|
23
|
+
dekshell/core/markers/function.py,sha256=lYCfK3SAjBwxmJAanpPAqObY4s1FNvZ15FT32_qkaTc,3855
|
|
24
24
|
dekshell/core/markers/if_.py,sha256=bBG1fDCZd5alE5FSm0QhgHl6ZJn5awiqZAXnPnO-thc,1112
|
|
25
25
|
dekshell/core/markers/input.py,sha256=O0yvGtt1uhbpE2gOReLseAmshVpZYMW3zV-OabZt0lw,1182
|
|
26
|
-
dekshell/core/markers/invoke.py,sha256=
|
|
26
|
+
dekshell/core/markers/invoke.py,sha256=Gf7Y3anFlpXso7oNxecqPtzKoWhFVn3PZVJ8VIgnKls,1986
|
|
27
27
|
dekshell/core/markers/pip_.py,sha256=mxXa_oqcrk4Qz-HvhlkMoirsl-SbM9Fz610leNqP1o0,832
|
|
28
28
|
dekshell/core/markers/redirect.py,sha256=cpTQaXFAuSwprsrhUNP0xTGDmu06HGNQVcwKsETEjas,1981
|
|
29
29
|
dekshell/core/markers/shell.py,sha256=43BDAAzMdmgZmemkW5buh_w4LL1GDGw-s9fNZo6vhag,1929
|
|
30
|
-
dekshell/core/markers/var.py,sha256=
|
|
30
|
+
dekshell/core/markers/var.py,sha256=y7gfEtEKs7x3T95AAUTFN6aG3vFiUMMG_TAjfUJFT6U,7070
|
|
31
31
|
dekshell/core/markers/while_.py,sha256=e7lI5jsIM-qxNHMY_wUyCMvvesdXQibR5Ez2jNO9csc,1195
|
|
32
32
|
dekshell/core/plugin/__init__.py,sha256=jAB_KnnHJsyJR_zIfBU_HNLngyhcyyqVv05PdlNZtF8,428
|
|
33
33
|
dekshell/core/redirect.py,sha256=6YCJpG0TkQ4WMt7LBtDD_W1T-C-QkLtGRQw0S60qe54,1058
|
|
@@ -37,4 +37,4 @@ dekshell/utils/cmd.py,sha256=K9FbXgHcGFchHA58xI0_t4YK4yb8XkWbxsNoztYRx3Y,518
|
|
|
37
37
|
dekshell/utils/pkg.py,sha256=TgYqRqawoJfjkxt6UAHnp9ttmpjuHiWRFbqxADOS1VE,1337
|
|
38
38
|
dekshell/utils/serializer.py,sha256=aIdF2Wzo-qHmIshv46jn1XD0X66vQ1JFdU-g3ZFbH2w,386
|
|
39
39
|
dekshell/utils/shell.py,sha256=0NoA2-SOOMinbmZZipwzL-npBbzPOdWEfdPVYqq5G5g,92
|
|
40
|
-
dekshell-0.2.
|
|
40
|
+
dekshell-0.2.43.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|