dekshell 0.2.4__tar.gz → 0.2.5__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 (39) hide show
  1. {dekshell-0.2.4 → dekshell-0.2.5}/PKG-INFO +1 -1
  2. {dekshell-0.2.4 → dekshell-0.2.5}/dekshell/core/__init__.py +1 -1
  3. {dekshell-0.2.4 → dekshell-0.2.5}/dekshell/core/contexts/methods.py +4 -0
  4. {dekshell-0.2.4 → dekshell-0.2.5}/dekshell/core/markers/__init__.py +5 -5
  5. dekshell-0.2.4/dekshell/core/markers/shell.py → dekshell-0.2.5/dekshell/core/markers/commands.py +1 -1
  6. {dekshell-0.2.4 → dekshell-0.2.5}/dekshell/core/markers/invoke.py +2 -2
  7. {dekshell-0.2.4 → dekshell-0.2.5}/dekshell/core/markers/redirect.py +1 -1
  8. dekshell-0.2.5/dekshell/core/markers/shell.py +56 -0
  9. {dekshell-0.2.4 → dekshell-0.2.5}/dekshell/core/markers/var.py +10 -1
  10. {dekshell-0.2.4 → dekshell-0.2.5}/dekshell/utils/cmd.py +1 -1
  11. {dekshell-0.2.4 → dekshell-0.2.5}/pyproject.toml +1 -1
  12. dekshell-0.2.4/dekshell/core/markers/timout.py +0 -26
  13. {dekshell-0.2.4 → dekshell-0.2.5}/README.md +0 -0
  14. {dekshell-0.2.4 → dekshell-0.2.5}/dekshell/__init__.py +0 -0
  15. {dekshell-0.2.4 → dekshell-0.2.5}/dekshell/click/__entry__.py +0 -0
  16. {dekshell-0.2.4 → dekshell-0.2.5}/dekshell/click/__init__.py +0 -0
  17. {dekshell-0.2.4 → dekshell-0.2.5}/dekshell/core/contexts/__init__.py +0 -0
  18. {dekshell-0.2.4 → dekshell-0.2.5}/dekshell/core/contexts/properties.py +0 -0
  19. {dekshell-0.2.4 → dekshell-0.2.5}/dekshell/core/markers/base/__init__.py +0 -0
  20. {dekshell-0.2.4 → dekshell-0.2.5}/dekshell/core/markers/base/core.py +0 -0
  21. {dekshell-0.2.4 → dekshell-0.2.5}/dekshell/core/markers/comment.py +0 -0
  22. {dekshell-0.2.4 → dekshell-0.2.5}/dekshell/core/markers/define.py +0 -0
  23. {dekshell-0.2.4 → dekshell-0.2.5}/dekshell/core/markers/echo.py +0 -0
  24. {dekshell-0.2.4 → dekshell-0.2.5}/dekshell/core/markers/empty.py +0 -0
  25. {dekshell-0.2.4 → dekshell-0.2.5}/dekshell/core/markers/env.py +0 -0
  26. {dekshell-0.2.4 → dekshell-0.2.5}/dekshell/core/markers/exec.py +0 -0
  27. {dekshell-0.2.4 → dekshell-0.2.5}/dekshell/core/markers/for_.py +0 -0
  28. {dekshell-0.2.4 → dekshell-0.2.5}/dekshell/core/markers/function.py +0 -0
  29. {dekshell-0.2.4 → dekshell-0.2.5}/dekshell/core/markers/if_.py +0 -0
  30. {dekshell-0.2.4 → dekshell-0.2.5}/dekshell/core/markers/input.py +0 -0
  31. {dekshell-0.2.4 → dekshell-0.2.5}/dekshell/core/markers/pip_.py +0 -0
  32. {dekshell-0.2.4 → dekshell-0.2.5}/dekshell/core/markers/while_.py +0 -0
  33. {dekshell-0.2.4 → dekshell-0.2.5}/dekshell/core/plugin/__init__.py +0 -0
  34. {dekshell-0.2.4 → dekshell-0.2.5}/dekshell/core/redirect.py +0 -0
  35. {dekshell-0.2.4 → dekshell-0.2.5}/dekshell/utils/__init__.py +0 -0
  36. {dekshell-0.2.4 → dekshell-0.2.5}/dekshell/utils/beep.py +0 -0
  37. {dekshell-0.2.4 → dekshell-0.2.5}/dekshell/utils/pkg.py +0 -0
  38. {dekshell-0.2.4 → dekshell-0.2.5}/dekshell/utils/serializer.py +0 -0
  39. {dekshell-0.2.4 → dekshell-0.2.5}/dekshell/utils/shell.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: dekshell
3
- Version: 0.2.4
3
+ Version: 0.2.5
4
4
  Author-Email: sanzenwin <sanzenwin@gmail.com>
5
5
  License: MIT
6
6
  Requires-Python: >=3.8
@@ -87,7 +87,7 @@ def shell_command_batch_core(
87
87
  def shell_exec(filepath, c=None):
88
88
  return shell_command_file(
89
89
  filepath,
90
- context=(context or {}) | (c or {}),
90
+ context=c or {},
91
91
  marker=marker,
92
92
  ms_names=ms_names,
93
93
  marker_set_cls=marker_set_cls,
@@ -3,6 +3,8 @@ import shutil
3
3
  import sys
4
4
  import tempfile
5
5
  import getpass
6
+ from functools import reduce
7
+ from itertools import chain
6
8
  from pathlib import Path
7
9
  from dektools.file import sure_dir, write_file, read_text, remove_path, sure_parent_dir, normal_path, \
8
10
  format_path_desc, read_file, split_ext, path_ext, clear_dir, copy_recurse_ignore, \
@@ -138,6 +140,8 @@ path_common_methods = {
138
140
  }
139
141
 
140
142
  default_methods = {
143
+ 'reduce': reduce,
144
+ 'chain': chain,
141
145
  'xeval': _xeval,
142
146
  'echo': lambda *x, **y: print(*x, **dict(flush=True) | y),
143
147
  'echos': lambda *x, **y: print(*x, **dict(end='', flush=True) | y),
@@ -12,10 +12,10 @@ from .function import *
12
12
  from .exec import *
13
13
  from .echo import *
14
14
  from .pip_ import *
15
- from .shell import *
15
+ from .commands import *
16
16
  from .redirect import *
17
17
  from .input import *
18
- from .timout import *
18
+ from .shell import *
19
19
  from .empty import *
20
20
 
21
21
 
@@ -39,12 +39,12 @@ def generate_markers(*args, **kwargs):
39
39
  EndMarker, BreakMarker, ContinueMarker,
40
40
  CommentMultiLineMarker, CommentMarker, CommentShebangMarker, CommentConfigMarker,
41
41
  PipMarker,
42
- ShellMarker,
42
+ CommandsMarker,
43
43
  RedirectMarker, ShiftMarker,
44
- TimeoutMarker,
44
+ TimeoutMarker, RetryMarker,
45
45
  IgnoreMarker,
46
46
  PrefixShellMarker,
47
- AssignCallMarker, AssignInvokerMarker, AssignGotoMarker, AssignTimeoutMarker,
47
+ AssignCallMarker, AssignInvokerMarker, AssignGotoMarker, AssignTimeoutMarker, AssignRetryMarker,
48
48
  AssignExecMarker, AssignEvalMarker, AssignCmdcallMarker,
49
49
  AssignMultiLineRawStrMarker, AssignMultiLineStrMarker, AssignRawStrMarker, AssignStrMarker,
50
50
  EmptyMarker, # must be at the tail
@@ -2,7 +2,7 @@ from .base import MarkerWithEnd
2
2
  from .empty import EmptyMarker
3
3
 
4
4
 
5
- class ShellMarker(MarkerWithEnd):
5
+ class CommandsMarker(MarkerWithEnd):
6
6
  tag_head = "@@"
7
7
  target_marker_cls = EmptyMarker
8
8
 
@@ -1,6 +1,6 @@
1
1
  import os
2
2
  from dektools.file import normal_path
3
- from ...utils.cmd import pack_context
3
+ from ...utils.cmd import pack_context_full
4
4
  from .base import MarkerBase
5
5
  from .base.core import get_inner_vars
6
6
 
@@ -18,7 +18,7 @@ class MarkerInvokerBase(MarkerBase):
18
18
  def execute_file(cls, marker_set, filepath, args, kwargs):
19
19
  if marker_set is None:
20
20
  marker_set = get_inner_vars('__inner_marker_set__')
21
- return cls._run_file(marker_set, normal_path(filepath), pack_context(args, kwargs))
21
+ return cls._run_file(marker_set, normal_path(filepath), pack_context_full(args, kwargs))
22
22
 
23
23
  @classmethod
24
24
  def _run_file(cls, marker_set, filepath, attrs):
@@ -28,7 +28,7 @@ class RedirectMarker(MarkerRedirect):
28
28
  shell_properties = make_shell_properties(path_shell)
29
29
  if shell_properties['shell'] != current_shell:
30
30
  fp = self.eval(context, "fp")
31
- fpp = os.path.dirname(fp).relace('/', os.sep)
31
+ fpp = os.path.dirname(fp).replace('/', os.sep)
32
32
  shell = shell_properties['sh']['rfc' if os.getcwd() == fpp else 'rf']
33
33
  args, kwargs = self.eval(context, f'({key_args}, {key_kwargs})')
34
34
  argv = ak2cmd(args, kwargs)
@@ -0,0 +1,56 @@
1
+ import subprocess
2
+ from dektools.shell import shell_timeout, shell_wrapper, shell_retry
3
+ from .empty import MarkerShell, ShellCommand
4
+
5
+
6
+ class TimeoutShellCommand(ShellCommand):
7
+ def shell(self, command, timeout=None, env=None, **kwargs):
8
+ try:
9
+ if timeout > 0:
10
+ return shell_timeout(command, timeout, env=env)
11
+ else:
12
+ return shell_wrapper(command, env=env)
13
+ except subprocess.SubprocessError as e:
14
+ return e
15
+
16
+
17
+ class TimeoutMarker(MarkerShell):
18
+ tag_head = "timeout"
19
+
20
+ shell_cls = TimeoutShellCommand
21
+
22
+ def execute(self, context, command, marker_node, marker_set):
23
+ _, timeout, command = self.split_raw(command, 2)
24
+ if command:
25
+ self.execute_core_timeout(context, command, marker_node, marker_set, timeout)
26
+
27
+ @classmethod
28
+ def execute_core_timeout(cls, context, command, marker_node, marker_set, timeout):
29
+ return cls.execute_core(context, command, marker_node, marker_set, dict(timeout=int(float(timeout))))
30
+
31
+
32
+ class RetryShellCommand(ShellCommand):
33
+ def shell(self, command, times=None, env=None, **kwargs):
34
+ try:
35
+ return shell_retry(command=command, times=times, env=env)
36
+ except subprocess.SubprocessError as e:
37
+ return e
38
+
39
+
40
+ class RetryMarker(MarkerShell):
41
+ tag_head = "retry"
42
+
43
+ shell_cls = RetryShellCommand
44
+
45
+ def execute(self, context, command, marker_node, marker_set):
46
+ _, times, command = self.split_raw(command, 2)
47
+ if command:
48
+ self.execute_core_retry(context, command, marker_node, marker_set, times)
49
+
50
+ @classmethod
51
+ def execute_core_retry(cls, context, command, marker_node, marker_set, times):
52
+ try:
53
+ times = int(float(times))
54
+ except ValueError:
55
+ times = None
56
+ return cls.execute_core(context, command, marker_node, marker_set, dict(times=times))
@@ -1,7 +1,7 @@
1
1
  import re
2
2
  from .base import MarkerBase, MarkerWithEnd, MarkerNoTranslator, cmd_call_prefix_simple
3
3
  from .function import CallMarker
4
- from .timout import TimeoutMarker
4
+ from .shell import TimeoutMarker, RetryMarker
5
5
  from .invoke import MarkerInvokerBase, InvokeMarker, GotoMarker
6
6
 
7
7
 
@@ -114,6 +114,15 @@ class AssignTimeoutMarker(MarkerAssignValueBase, TimeoutMarker):
114
114
  return self.execute_core_timeout(context, expression, marker_node, marker_set, timeout)
115
115
 
116
116
 
117
+ class AssignRetryMarker(MarkerAssignValueBase, RetryMarker):
118
+ tag_head = None
119
+ tag_head_re_args = r'retry[ \t\f\r\n]+'
120
+
121
+ def get_value(self, context, marker_node, marker_set, expression):
122
+ times, expression = self.split_raw(expression, 1)
123
+ return self.execute_core_retry(context, expression, marker_node, marker_set, times)
124
+
125
+
117
126
  class DelVarMarker(MarkerBase):
118
127
  tag_head = "del"
119
128
 
@@ -34,7 +34,7 @@ def ak2cmd(args, kwargs=None):
34
34
 
35
35
 
36
36
  def pack_context(args, kwargs):
37
- return {f'{key_arg}{i}': arg for i, arg in enumerate(args)} | {key_args: args, key_kwargs: kwargs} | kwargs
37
+ return {f'{key_arg}{i}': arg for i, arg in enumerate(args)} | {key_args: tuple(args), key_kwargs: kwargs} | kwargs
38
38
 
39
39
 
40
40
  def pack_context_argv():
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "dekshell"
3
- version = "0.2.4"
3
+ version = "0.2.5"
4
4
  description = ""
5
5
  authors = [
6
6
  { name = "sanzenwin", email = "sanzenwin@gmail.com" },
@@ -1,26 +0,0 @@
1
- import subprocess
2
- from dektools.shell import shell_timeout
3
- from .empty import MarkerShell, ShellCommand
4
-
5
-
6
- class TimeoutShellCommand(ShellCommand):
7
- def shell(self, command, timeout=None, env=None, **kwargs):
8
- try:
9
- return shell_timeout(command, timeout, env=env, check=True)
10
- except subprocess.CalledProcessError as e:
11
- return e
12
-
13
-
14
- class TimeoutMarker(MarkerShell):
15
- tag_head = "timeout"
16
-
17
- shell_cls = TimeoutShellCommand
18
-
19
- def execute(self, context, command, marker_node, marker_set):
20
- _, timeout, command = self.split_raw(command, 2)
21
- if command:
22
- self.execute_core_timeout(context, command, marker_node, marker_set, timeout)
23
-
24
- @classmethod
25
- def execute_core_timeout(cls, context, command, marker_node, marker_set, timeout):
26
- return cls.execute_core(context, command, marker_node, marker_set, dict(timeout=int(float(timeout))))
File without changes
File without changes
File without changes