dekshell 0.2.6__tar.gz → 0.2.8__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.
Files changed (38) hide show
  1. {dekshell-0.2.6 → dekshell-0.2.8}/PKG-INFO +1 -1
  2. {dekshell-0.2.6 → dekshell-0.2.8}/dekshell/core/contexts/methods.py +12 -1
  3. {dekshell-0.2.6 → dekshell-0.2.8}/dekshell/core/markers/__init__.py +3 -2
  4. {dekshell-0.2.6 → dekshell-0.2.8}/dekshell/core/markers/base/__init__.py +41 -22
  5. {dekshell-0.2.6 → dekshell-0.2.8}/dekshell/core/markers/exec.py +19 -7
  6. {dekshell-0.2.6 → dekshell-0.2.8}/dekshell/core/markers/var.py +10 -4
  7. {dekshell-0.2.6 → dekshell-0.2.8}/pyproject.toml +1 -1
  8. {dekshell-0.2.6 → dekshell-0.2.8}/README.md +0 -0
  9. {dekshell-0.2.6 → dekshell-0.2.8}/dekshell/__init__.py +0 -0
  10. {dekshell-0.2.6 → dekshell-0.2.8}/dekshell/click/__entry__.py +0 -0
  11. {dekshell-0.2.6 → dekshell-0.2.8}/dekshell/click/__init__.py +0 -0
  12. {dekshell-0.2.6 → dekshell-0.2.8}/dekshell/core/__init__.py +0 -0
  13. {dekshell-0.2.6 → dekshell-0.2.8}/dekshell/core/contexts/__init__.py +0 -0
  14. {dekshell-0.2.6 → dekshell-0.2.8}/dekshell/core/contexts/properties.py +0 -0
  15. {dekshell-0.2.6 → dekshell-0.2.8}/dekshell/core/markers/base/core.py +0 -0
  16. {dekshell-0.2.6 → dekshell-0.2.8}/dekshell/core/markers/commands.py +0 -0
  17. {dekshell-0.2.6 → dekshell-0.2.8}/dekshell/core/markers/comment.py +0 -0
  18. {dekshell-0.2.6 → dekshell-0.2.8}/dekshell/core/markers/define.py +0 -0
  19. {dekshell-0.2.6 → dekshell-0.2.8}/dekshell/core/markers/echo.py +0 -0
  20. {dekshell-0.2.6 → dekshell-0.2.8}/dekshell/core/markers/empty.py +0 -0
  21. {dekshell-0.2.6 → dekshell-0.2.8}/dekshell/core/markers/env.py +0 -0
  22. {dekshell-0.2.6 → dekshell-0.2.8}/dekshell/core/markers/for_.py +0 -0
  23. {dekshell-0.2.6 → dekshell-0.2.8}/dekshell/core/markers/function.py +0 -0
  24. {dekshell-0.2.6 → dekshell-0.2.8}/dekshell/core/markers/if_.py +0 -0
  25. {dekshell-0.2.6 → dekshell-0.2.8}/dekshell/core/markers/input.py +0 -0
  26. {dekshell-0.2.6 → dekshell-0.2.8}/dekshell/core/markers/invoke.py +0 -0
  27. {dekshell-0.2.6 → dekshell-0.2.8}/dekshell/core/markers/pip_.py +0 -0
  28. {dekshell-0.2.6 → dekshell-0.2.8}/dekshell/core/markers/redirect.py +0 -0
  29. {dekshell-0.2.6 → dekshell-0.2.8}/dekshell/core/markers/shell.py +0 -0
  30. {dekshell-0.2.6 → dekshell-0.2.8}/dekshell/core/markers/while_.py +0 -0
  31. {dekshell-0.2.6 → dekshell-0.2.8}/dekshell/core/plugin/__init__.py +0 -0
  32. {dekshell-0.2.6 → dekshell-0.2.8}/dekshell/core/redirect.py +0 -0
  33. {dekshell-0.2.6 → dekshell-0.2.8}/dekshell/utils/__init__.py +0 -0
  34. {dekshell-0.2.6 → dekshell-0.2.8}/dekshell/utils/beep.py +0 -0
  35. {dekshell-0.2.6 → dekshell-0.2.8}/dekshell/utils/cmd.py +0 -0
  36. {dekshell-0.2.6 → dekshell-0.2.8}/dekshell/utils/pkg.py +0 -0
  37. {dekshell-0.2.6 → dekshell-0.2.8}/dekshell/utils/serializer.py +0 -0
  38. {dekshell-0.2.6 → dekshell-0.2.8}/dekshell/utils/shell.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: dekshell
3
- Version: 0.2.6
3
+ Version: 0.2.8
4
4
  Author-Email: sanzenwin <sanzenwin@gmail.com>
5
5
  License: MIT
6
6
  Requires-Python: >=3.8
@@ -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, \
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,6 +131,12 @@ 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
+
132
140
  path_common_methods = {
133
141
  'cd': os.chdir,
134
142
  'cwd': lambda: os.getcwd(),
@@ -140,6 +148,7 @@ path_common_methods = {
140
148
  }
141
149
 
142
150
  default_methods = {
151
+ 'io': _io,
143
152
  'reduce': reduce,
144
153
  'chain': chain,
145
154
  'xeval': _xeval,
@@ -156,6 +165,7 @@ default_methods = {
156
165
  **path_common_methods,
157
166
  'tree': _tree,
158
167
  'exists': os.path.exists,
168
+ 'empty': path_is_empty,
159
169
  'parent': _parent_dir,
160
170
  'abs': normal_path,
161
171
  'rel': os.path.relpath,
@@ -178,6 +188,7 @@ default_methods = {
178
188
  'rm': _remove_path,
179
189
  'wf': write_file,
180
190
  'rt': read_text,
191
+ 'rl': read_lines,
181
192
  'rf': read_file,
182
193
  'ci': copy_recurse_ignore,
183
194
 
@@ -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
  [project]
2
2
  name = "dekshell"
3
- version = "0.2.6"
3
+ version = "0.2.8"
4
4
  description = ""
5
5
  authors = [
6
6
  { name = "sanzenwin", email = "sanzenwin@gmail.com" },
File without changes
File without changes
File without changes
File without changes