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.
@@ -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 _invoke(__placeholder__filepath, *args, **kwargs):
129
- marker_set = get_inner_vars('__inner_marker_set__', full=True)
130
- filepath = normal_path(__placeholder__filepath)
131
- cwd = os.getcwd()
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
- 'invoke': _invoke,
260
- 'goto': _goto,
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.get_env(item.upper(), '')
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.get_env(item.upper(), default)
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.get_env(item.upper(), default)
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, AssignTimeoutMarker, AssignRetryMarker,
50
- AssignExecMarker, AssignTranslatorEvalMarker, AssignEvalMarker, AssignCmdcallMarker, AssignCmdcallChainMarker,
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
- def set_var(self, context, array, index, value):
103
- self.set_var_raw(context, self.get_item(array, index, self.var_name_anonymous), value)
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(rf'[ \t\f\r]*({cmd_call_prefix_simple}[{cmd_call_prefix_simple}]?)[ \t\f\r]*([^\W\d][\w.]*)', s)
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
- ignore = False
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 ignore and expression.startswith(cls.trans_marker__ignore):
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
- ignore = True
167
- change +=1
170
+ ignore_errors = True
171
+ change += 1
168
172
  if change in (0, 2):
169
173
  break
170
- value = handler_core(expression, ignore)
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
- def evaluate(expression, ignore, default):
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, expression, False)
189
+ return cls.eval_mixin(context, expr, False)
178
190
  except NameError:
179
- if ignore:
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
- translate = deep_format(
219
- s,
220
- # f"{re.escape(cls.trans_marker__begin)}({cls.trans_marker__set})?",
221
- f"{re.escape(cls.trans_marker__begin)}",
222
- re.escape(cls.trans_marker__end), handler, cls.trans_marker__escape)
223
- return translate
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 get_env(self, name, default=None):
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
- return QuitContext.real(self.execute_nodes(context, marker_set, [self]))
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
- return root.execute(
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
@@ -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, Function(name, params, marker_node.children[:]))
55
+ self.set_var_raw(context, name, self.function_cls(name, params, marker_node.children[:]))
55
56
  return []
56
57
 
57
58
 
@@ -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))
@@ -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 AssignCmdcallMarker(MarkerAssignValueBase):
85
- tag_head_re_args_raw = cmd_call_prefix_simple
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.eval_mixin(context, self.tag_head_re_args_raw + expression, False)
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 AssignCmdcallChainMarker(AssignCmdcallMarker):
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,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: dekshell
3
- Version: 0.2.42
3
+ Version: 0.2.43
4
4
  Author-Email: sanzenwin <sanzenwin@gmail.com>
5
5
  License: MIT
6
6
  Requires-Python: >=3.8
@@ -1,16 +1,16 @@
1
- dekshell-0.2.42.dist-info/METADATA,sha256=_Qmh2L_sLWIq08ko5SNnZZITaHfsXTMxgNUUQ4zKXCE,573
2
- dekshell-0.2.42.dist-info/WHEEL,sha256=tSfRZzRHthuv7vxpI4aehrdN9scLjk-dCJkPLzkHxGg,90
3
- dekshell-0.2.42.dist-info/entry_points.txt,sha256=d-kbfULiUTZWIBBsrQF3J_-wESncF-4K2rwHT08grlI,75
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=uSepT9G6VT2NSs_EtSWZdFD3kt6dwcHcZOSknPougCg,11089
10
- dekshell/core/contexts/properties.py,sha256=yilnRe2I6FTIui4kXUBCWvH2ymvpEfc_13on8pAZwnY,3456
11
- dekshell/core/markers/__init__.py,sha256=yRQazZ1dxMltFao_RQnDnawSnQcjN_4B930MjJhaZ40,1968
12
- dekshell/core/markers/base/__init__.py,sha256=CsbNYGQ2Od3XdekR9RFMJ7mo9Roj-LlXS62SY50fiAY,16826
13
- dekshell/core/markers/base/core.py,sha256=InsUA3md2gC6GyXQsvARfeNTrfbVD3gGOYxTM8VqqPA,11679
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=4_7FRUEgbAtt0_9r8TmOar_Zi6VXxe6E7p3RL6sVgQg,2705
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=rLi8Lc9nf7ex3xdj8-VdJkgC1qXpr5JVMndH1YlH4mM,3815
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=ReE-i-ji2Bl90M8xLi8-kZrc-lL5mRUmjbGPoRcIoPw,1452
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=CnmBDQvA5XcQlioczXFhCvIbDc8ex4RIAgDeQvFdIiY,5176
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.42.dist-info/RECORD,,
40
+ dekshell-0.2.43.dist-info/RECORD,,