dekshell 0.2.7__py3-none-any.whl → 0.2.9__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.
@@ -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': os.chdir,
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, ExecCmdcallLinesMarker, ExecCmdcallMarker,
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 = cmd_call_prefix_simple * 3
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 = cls.split_raw(s, 1)
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
- expression = cls.translate_case(context, expression, translate)
243
+ max_item = None
235
244
  expression = expression[len(cmd_call_prefix_chain):]
236
- index = re.search(
237
- r"%s|%s" % (re.escape(cmd_call_prefix_simple), re.escape(cmd_call_eval_prefix)), expression).span()[0]
238
- funcs = cls.split_raw(expression[:index])
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
- return cls.cmd_call(context, expression[len(cmd_call_prefix_simple):], True)
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, cmd_call_prefix, cmd_call_prefix_simple, \
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 ExecCmdcallMarker(MarkerBase):
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 ExecCmdcallLinesMarker(MarkerWithEnd):
41
- tag_head = f'{cmd_call_prefix_chain}{cmd_call_prefix_simple}'
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.cmd_call_marker_cls.tag_head + ' ' + child.command,
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\n]*%s"
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
- tag_head_re_args = cmd_call_prefix_simple
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, cmd_call_prefix_simple + expression, False)
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):
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: dekshell
3
- Version: 0.2.7
3
+ Version: 0.2.9
4
4
  Author-Email: sanzenwin <sanzenwin@gmail.com>
5
5
  License: MIT
6
6
  Requires-Python: >=3.8
@@ -1,15 +1,15 @@
1
- dekshell-0.2.7.dist-info/METADATA,sha256=6KZynQkCledNS27CLnsBIOlxnCBf2QDi9JX8HvTSz7M,572
2
- dekshell-0.2.7.dist-info/WHEEL,sha256=tSfRZzRHthuv7vxpI4aehrdN9scLjk-dCJkPLzkHxGg,90
3
- dekshell-0.2.7.dist-info/entry_points.txt,sha256=d-kbfULiUTZWIBBsrQF3J_-wESncF-4K2rwHT08grlI,75
1
+ dekshell-0.2.9.dist-info/METADATA,sha256=jQr2EOL1fMZ89s4wFbcoj3FgePYiLdUMwAk6uJYwEt8,572
2
+ dekshell-0.2.9.dist-info/WHEEL,sha256=tSfRZzRHthuv7vxpI4aehrdN9scLjk-dCJkPLzkHxGg,90
3
+ dekshell-0.2.9.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=rFzB_exzPQaIcbbms5PdHAU3NGdl2MBaYbq9v7g7BOI,1870
7
7
  dekshell/core/__init__.py,sha256=ZAJtMPFCVClHCPkoP5rmTq1vVLLMQRa8MP-QJXLBgNM,5337
8
8
  dekshell/core/contexts/__init__.py,sha256=ynsfv37azOKfI2UKd0iPl2M6iBW-k5cb1BqSLOWuJpI,482
9
- dekshell/core/contexts/methods.py,sha256=EXIGyrywib0ZBfxXkxFVUGVpPHAusVb-x3grDq06AFM,7164
9
+ dekshell/core/contexts/methods.py,sha256=tOfgG-t4oh0-BjKgK9uk34bgZ1Zmp1AM-kpmB78jM_w,7485
10
10
  dekshell/core/contexts/properties.py,sha256=6rEQjExvAmZ69OfhPLLIQwnynRzAjX0nIbcBuZ5yuzM,2314
11
- dekshell/core/markers/__init__.py,sha256=O5N5rURhTW0sZvnVVvtTX_w53zHYjb6KfcUShY46YmM,1762
12
- dekshell/core/markers/base/__init__.py,sha256=AQYr7H0F06izu5jhu8EgLYJ2ERzJh0eS38h9gtl6OZs,13067
11
+ dekshell/core/markers/__init__.py,sha256=BRp4z_IkbwV7xQr-5wugd7GCCyGp8k4z_p8qRgVjKxw,1850
12
+ dekshell/core/markers/base/__init__.py,sha256=To25RVX3h1MluV3OmktVMw2bigex79GjWHUPWtIlczI,13433
13
13
  dekshell/core/markers/base/core.py,sha256=99aRcSXohpfTW5OSO1CUyvnptr21ueKjizCk-FK6rcM,10830
14
14
  dekshell/core/markers/commands.py,sha256=4frmkrTa7-7ZYWztXEmYprbWRkoCIuJuiy28pBGcz8A,987
15
15
  dekshell/core/markers/comment.py,sha256=28iccgLs_0bRdXLhHyQR2I_kzlWdeMSqqNUFW-2vkes,818
@@ -17,7 +17,7 @@ dekshell/core/markers/define.py,sha256=LpMSfz9ziXq2aFJ6oMpUFFo93TpBx7GxKYNzCeht4
17
17
  dekshell/core/markers/echo.py,sha256=1H61qQbY9tZnrKsdTI_shTmDY5ZaSGipDuBSRptAuZw,660
18
18
  dekshell/core/markers/empty.py,sha256=xMYoZIxn7Tt1RjFtLhJERisra8jqsGjJ0G7OID0oD3o,776
19
19
  dekshell/core/markers/env.py,sha256=6ZtiMNdKFbGR_DBjG6C7A8L_lJsiymN5Y5AbnTzyMrE,1158
20
- dekshell/core/markers/exec.py,sha256=zT3mI7bBSgOpBICCjeb-vhAWbra9i8rABuUAVNnuMns,2032
20
+ dekshell/core/markers/exec.py,sha256=3vQc-jH7toU_89rNFTipowr0ZrNn79pqmNbYuHxCPDI,2370
21
21
  dekshell/core/markers/for_.py,sha256=uNOEwyDsjffttEBtUYasdlj7FP_sGnQzWuTV5d5esHY,2142
22
22
  dekshell/core/markers/function.py,sha256=RPh56_rYbWXCTkNPiJu8zNEj-OE6txKgEw7Im9fBM3c,3592
23
23
  dekshell/core/markers/if_.py,sha256=bBG1fDCZd5alE5FSm0QhgHl6ZJn5awiqZAXnPnO-thc,1112
@@ -26,7 +26,7 @@ dekshell/core/markers/invoke.py,sha256=To_U_FscoCbf7osvjC5MQTk2gjH5Mu_-06Kb22YQP
26
26
  dekshell/core/markers/pip_.py,sha256=mxXa_oqcrk4Qz-HvhlkMoirsl-SbM9Fz610leNqP1o0,832
27
27
  dekshell/core/markers/redirect.py,sha256=ZMqHnntzJabgqlNXU7Xj1GcYNlfwOyUsZ3rrJTd1yXk,1589
28
28
  dekshell/core/markers/shell.py,sha256=6Gy59gjI-BFIQadwGxApD6w3LndIRMao_4D9pMpB5Hk,1906
29
- dekshell/core/markers/var.py,sha256=rj-gIdu-V8RQigmZ87skCLS-H103ndGgh3zrf3gQEZw,4571
29
+ dekshell/core/markers/var.py,sha256=O-lpWhnLOkKMwF1jR0rVwyHLa8YUWwacCs80wFzwfdQ,4838
30
30
  dekshell/core/markers/while_.py,sha256=e7lI5jsIM-qxNHMY_wUyCMvvesdXQibR5Ez2jNO9csc,1195
31
31
  dekshell/core/plugin/__init__.py,sha256=jAB_KnnHJsyJR_zIfBU_HNLngyhcyyqVv05PdlNZtF8,428
32
32
  dekshell/core/redirect.py,sha256=6YCJpG0TkQ4WMt7LBtDD_W1T-C-QkLtGRQw0S60qe54,1058
@@ -36,4 +36,4 @@ dekshell/utils/cmd.py,sha256=akykpgPCovXpvavKF28G-eNM3mOZ4TY0LlSWGozDp34,1204
36
36
  dekshell/utils/pkg.py,sha256=TgYqRqawoJfjkxt6UAHnp9ttmpjuHiWRFbqxADOS1VE,1337
37
37
  dekshell/utils/serializer.py,sha256=aIdF2Wzo-qHmIshv46jn1XD0X66vQ1JFdU-g3ZFbH2w,386
38
38
  dekshell/utils/shell.py,sha256=0NoA2-SOOMinbmZZipwzL-npBbzPOdWEfdPVYqq5G5g,92
39
- dekshell-0.2.7.dist-info/RECORD,,
39
+ dekshell-0.2.9.dist-info/RECORD,,