dekshell 0.2.31__py3-none-any.whl → 0.2.33__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.
@@ -2,12 +2,13 @@ import sys
2
2
  import typer
3
3
  from dektools.file import normal_path
4
4
  from dektools.output import pprint
5
- from dektools.escape import str_escaped
5
+ from dektools.escape import str_escape_unicode
6
6
  from dektools.shell import associate_console_script, get_current_sys_exe
7
7
  from dektools.typer import command_mixin, command_version
8
8
  from dektools.plugin import iter_plugins
9
9
  from ..core import shell_command_batch, shell_command_file, shell_command_file_cd
10
10
  from ..core.markers.base import MarkerBase
11
+ from ..core.markers.base.core import MarkerContext
11
12
  from ..core.contexts import get_all_context
12
13
  from ..core.markers import generate_markers
13
14
  from ..utils.serializer import serializer, SerializerException
@@ -25,7 +26,9 @@ def get_argv(index=None):
25
26
 
26
27
 
27
28
  def get_kwargs(begin):
28
- return pack_context_full(*MarkerBase.cmd2ak(get_argv()[begin:]))
29
+ args, kwargs = MarkerBase.cmd2ak(get_argv()[begin:])
30
+ args, kwargs = MarkerBase.cmd_trans_batch(MarkerContext(), *args, **kwargs)
31
+ return pack_context_full(args, kwargs)
29
32
 
30
33
 
31
34
  @command_mixin(app)
@@ -34,7 +37,7 @@ def rs(args):
34
37
  args = serializer.load(args)
35
38
  except SerializerException:
36
39
  pass
37
- shell_command_batch(str_escaped(args), context=pack_context_full())
40
+ shell_command_batch(str_escape_unicode(args), context=pack_context_full())
38
41
 
39
42
 
40
43
  @app.command(
dekshell/core/__init__.py CHANGED
@@ -14,15 +14,15 @@ from .markers import generate_markers, CommentConfigMarker
14
14
  from .markers.base.core import MarkerBase, MarkerSet
15
15
  from ..utils.beep import sound_notify
16
16
  from ..utils.shell import shell_bin
17
- from ..utils.cmd import ak2cmd, pack_context_full
17
+ from ..utils.cmd import pack_context_full
18
18
 
19
19
 
20
20
  def shell_file(__placeholder__filepath, *args, **kwargs):
21
- shell_wrapper(f'{shell_bin} rf "{__placeholder__filepath}" {ak2cmd(args, kwargs)}')
21
+ shell_wrapper(f'{shell_bin} rf "{__placeholder__filepath}" {MarkerBase.ak2cmd(args, kwargs)}')
22
22
 
23
23
 
24
24
  def shell_file_cd(__placeholder__filepath, *args, **kwargs):
25
- shell_wrapper(f'{shell_bin} rfc "{__placeholder__filepath}" {ak2cmd(args, kwargs)}')
25
+ shell_wrapper(f'{shell_bin} rfc "{__placeholder__filepath}" {MarkerBase.ak2cmd(args, kwargs)}')
26
26
 
27
27
 
28
28
  def shell_command_file_cd(filepath, **kwargs):
@@ -31,7 +31,7 @@ from dektools.shell import shell_wrapper, is_user_admin, shell_timeout, shell_re
31
31
  from dektools.match import GeneralMatcher, glob2re, glob_compile, glob_match
32
32
  from dektools.cmd.git import git_clean_dir, git_apply, git_parse_modules, git_fetch_min, git_list_remotes, git_head
33
33
  from ...utils.beep import sound_notify
34
- from ...utils.cmd import ak2cmd, pack_context_full
34
+ from ...utils.cmd import pack_context_full
35
35
  from ..markers.base.core import MarkerBase, get_inner_vars
36
36
  from ..markers.invoke import InvokeMarker, GotoMarker
37
37
  from ..redirect import search_bin_by_path_tree
@@ -308,7 +308,7 @@ default_methods = {
308
308
 
309
309
  'sys': {
310
310
  'utf8': lambda: sys.stdout.reconfigure(encoding='utf-8'),
311
- 'ak': ak2cmd,
311
+ 'ak': MarkerBase.ak2cmd,
312
312
  },
313
313
 
314
314
  'compress': compress_files,
@@ -14,6 +14,7 @@ from dektools.file import read_text
14
14
  from dektools.env import is_on_cicd
15
15
  from ...utils.serializer import serializer
16
16
  from ..redirect import shell_name
17
+ from ..markers.base.core import get_inner_vars
17
18
 
18
19
  current_shell = shutil.which(shell_name, path=get_paths()['scripts'])
19
20
  current_os = extra_platforms_current_os()
@@ -50,6 +51,26 @@ class _Env:
50
51
  return item.upper() in os.environ
51
52
 
52
53
 
54
+ class _EnvS:
55
+ def __getattr__(self, item):
56
+ context = get_inner_vars('__inner_context__', full=True)
57
+ return context.get_env(item.upper(), '')
58
+
59
+ def __getitem__(self, item):
60
+ context = get_inner_vars('__inner_context__', full=True)
61
+ default = object()
62
+ ret = context.get_env(item.upper(), default)
63
+ if ret is default:
64
+ raise KeyError(item)
65
+ return ret
66
+
67
+ def __contains__(self, item):
68
+ context = get_inner_vars('__inner_context__', full=True)
69
+ default = object()
70
+ ret = context.get_env(item.upper(), default)
71
+ return ret is not default
72
+
73
+
53
74
  default_properties = {
54
75
  'meta': {
55
76
  'name': package_name,
@@ -82,5 +103,6 @@ default_properties = {
82
103
  'obj': serializer,
83
104
  'mp': ModuleProxy(),
84
105
  'date': DateTime(),
85
- 'envx': _Env(),
106
+ 'env': _Env(),
107
+ 'envs': _EnvS(),
86
108
  }
@@ -1,11 +1,11 @@
1
1
  import os
2
2
  import re
3
3
  import functools
4
- from dektools.str import deep_format, split_table_line, shlex_split
4
+ from dektools.str import deep_format, split_table_line, shlex_split, shlex_quote
5
5
  from dektools.common import classproperty
6
6
  from dektools.shell import shell_output, shell_wrapper, shell_exitcode
7
+ from dektools.escape import str_escape_custom
7
8
  from ....utils.serializer import serializer
8
- from ....utils.cmd import cmd2ak
9
9
 
10
10
  cmd_call_prefix_simple = '>'
11
11
  cmd_call_prefix = cmd_call_prefix_simple * 2
@@ -13,6 +13,7 @@ cmd_call_prefix_chain = '*'
13
13
  cmd_call_eval_prefix = '='
14
14
  cmd_call_eval_trans_prefix = cmd_call_eval_prefix + ':'
15
15
  cmd_call_eval_escape = '\\'
16
+ cmd_call_sep = '--'
16
17
 
17
18
 
18
19
  class MarkerBase:
@@ -133,7 +134,7 @@ class MarkerBase:
133
134
  else:
134
135
  argv = cls.split(s)
135
136
  args, kwargs = cls.cmd2ak(argv[1:])
136
- args, kwargs = cls.var_map_batch(context, *args, **kwargs)
137
+ args, kwargs = cls.cmd_trans_batch(context, *args, **kwargs)
137
138
  func = argv[0]
138
139
  return func, args, kwargs
139
140
 
@@ -260,7 +261,7 @@ class MarkerBase:
260
261
  else:
261
262
  if body:
262
263
  args, kwargs = cls.cmd2ak(cls.split(body))
263
- args, kwargs = cls.var_map_batch(context, *args, **kwargs)
264
+ args, kwargs = cls.cmd_trans_batch(context, *args, **kwargs)
264
265
  else:
265
266
  args, kwargs = [], {}
266
267
  value = f(*args, **kwargs)
@@ -287,21 +288,79 @@ class MarkerBase:
287
288
  return locals_
288
289
 
289
290
  @classmethod
290
- def var_map(cls, context, s):
291
+ def cmd_trans(cls, context, s, trans_sep):
291
292
  if s.startswith(cmd_call_eval_prefix):
292
293
  return cls.eval(context, s[len(cmd_call_eval_prefix):])
293
294
  else:
294
- if s.startswith(f'{cmd_call_eval_escape}{cmd_call_eval_prefix}'):
295
- s = s[len(cmd_call_eval_escape):]
296
- return s
295
+ def skip(c, index):
296
+ if trans_sep:
297
+ nonlocal sep_skip
298
+ if sep_skip:
299
+ return True
300
+ if c == cmd_call_sep:
301
+ if not re.fullmatch(r'[^\W\d]\w*', s[:index - len(cmd_call_eval_escape)]):
302
+ sep_skip = True
303
+ return True
304
+ return False
305
+
306
+ def process(mapping, index, x, y):
307
+ if trans_sep:
308
+ if x == cmd_call_sep:
309
+ nonlocal sep_skip
310
+ sep_skip = True
311
+ else:
312
+ nonlocal clear_eval
313
+ if not clear_eval and (x is None or x == cmd_call_eval_prefix):
314
+ clear_eval = True
315
+ mapping.pop(cmd_call_eval_prefix)
316
+
317
+ clear_eval = False
318
+ sep_skip = False
319
+ targets = [cmd_call_eval_prefix]
320
+ if trans_sep:
321
+ targets.append(cmd_call_sep)
322
+ return str_escape_custom(s, targets, cmd_call_eval_escape, keep=True, process=process, skip=skip)
297
323
 
298
324
  @classmethod
299
- def var_map_batch(cls, context, *args, **kwargs):
300
- return [cls.var_map(context, x) for x in args], {k: cls.var_map(context, v) for k, v in kwargs.items()}
325
+ def cmd_trans_batch(cls, context, *args, **kwargs):
326
+ return (
327
+ [cls.cmd_trans(context, x, True) for x in args],
328
+ {k: cls.cmd_trans(context, v, False) for k, v in kwargs.items()}
329
+ )
301
330
 
302
331
  @staticmethod
303
332
  def cmd2ak(argv):
304
- return cmd2ak(argv)
333
+ # arg0 =arg1-eval-value \=arg2 arg3\--not-kwarg
334
+ # k0--v k1--=eval-value k2--\=v
335
+ args = []
336
+ kwargs = {}
337
+ for x in argv:
338
+ if re.match(r'[^\W\d]\w*' + cmd_call_sep, x):
339
+ k, v = x.split(cmd_call_sep, 1)
340
+ kwargs[k] = v
341
+ else:
342
+ args.append(x)
343
+ return args, kwargs
344
+
345
+ @staticmethod
346
+ def ak2cmd(args=None, kwargs=None):
347
+ result = []
348
+ if args:
349
+ for x in args:
350
+ if isinstance(x, str):
351
+ m = re.match(r'[^\W\d]\w*' + cmd_call_sep, x)
352
+ if m:
353
+ index = m.span()[-1] - len(cmd_call_sep)
354
+ x = x[:index] + cmd_call_eval_escape + x[index:]
355
+ else:
356
+ x = f"={repr(x)}"
357
+ result.append(shlex_quote(x))
358
+ if kwargs:
359
+ for k, v in kwargs.items():
360
+ if not isinstance(v, str):
361
+ v = f"={repr(v)}"
362
+ result.append(shlex_quote(f'{k}--{v}'))
363
+ return ' '.join(result)
305
364
 
306
365
 
307
366
  class EndMarker(MarkerBase):
@@ -71,29 +71,38 @@ class RaiseMarker(MarkerBase):
71
71
  self.raise_(args[1])
72
72
 
73
73
 
74
- class VarGlobalMarker(MarkerBase):
74
+ class MarkerScope(MarkerBase):
75
+ scope_sep = ','
76
+
77
+ def execute_core(self, command, func):
78
+ names = self.split_raw(command, 1)[-1]
79
+ for name in names.split(self.scope_sep):
80
+ func(name.strip())
81
+
82
+
83
+ class VarGlobalMarker(MarkerScope):
75
84
  tag_head = "global"
76
85
 
77
86
  def execute(self, context, command, marker_node, marker_set):
78
- context.variables.mark_global(self.split_raw(command, 1)[-1])
87
+ self.execute_core(command, context.variables.mark_global)
79
88
 
80
89
 
81
- class VarNonlocalMarker(MarkerBase):
90
+ class VarNonlocalMarker(MarkerScope):
82
91
  tag_head = "nonlocal"
83
92
 
84
93
  def execute(self, context, command, marker_node, marker_set):
85
- context.variables.mark_nonlocal(self.split_raw(command, 1)[-1])
94
+ self.execute_core(command, context.variables.mark_nonlocal)
86
95
 
87
96
 
88
- class EnvGlobalMarker(MarkerBase):
97
+ class EnvGlobalMarker(MarkerScope):
89
98
  tag_head = "global$"
90
99
 
91
100
  def execute(self, context, command, marker_node, marker_set):
92
- context.environ.mark_global(self.split_raw(command, 1)[-1])
101
+ self.execute_core(command, context.environ.mark_global)
93
102
 
94
103
 
95
- class EnvNonlocalMarker(MarkerBase):
104
+ class EnvNonlocalMarker(MarkerScope):
96
105
  tag_head = "nonlocal$"
97
106
 
98
107
  def execute(self, context, command, marker_node, marker_set):
99
- context.environ.mark_nonlocal(self.split_raw(command, 1)[-1])
108
+ self.execute_core(command, context.environ.mark_nonlocal)
@@ -2,7 +2,7 @@ import os
2
2
  from dektools.shell import shell_wrapper
3
3
  from dektools.attr import DeepObject
4
4
  from ...core.redirect import redirect_shell_by_path_tree
5
- from ...utils.cmd import ak2cmd, key_args, key_kwargs
5
+ from ...utils.cmd import key_args, key_kwargs
6
6
  from ..contexts.properties import make_shell_properties, current_shell
7
7
  from .base import MarkerBase
8
8
 
@@ -37,7 +37,7 @@ class RedirectMarker(MarkerRedirect):
37
37
  fpp = os.path.dirname(fp).replace('/', os.sep)
38
38
  shell = shell_properties['sh']['rfc' if os.getcwd() == fpp else 'rf']
39
39
  args, kwargs = self.eval(context, f'({key_args}, {key_kwargs})')
40
- argv = ak2cmd(args, kwargs)
40
+ argv = self.ak2cmd(args, kwargs)
41
41
  shell_wrapper(f'{shell} {fp} {argv}', env=context.environ_full())
42
42
  return self.exit()
43
43
  marker_set.check_stack_error(marker_node)
dekshell/utils/cmd.py CHANGED
@@ -1,7 +1,4 @@
1
- import re
2
1
  import sys
3
- from dektools.escape.str import str_escape_one_type
4
- from dektools.str import shlex_quote
5
2
 
6
3
  key_arg = '__arg'
7
4
  key_args = f'{key_arg}s'
@@ -9,30 +6,6 @@ key_kwargs = '__kwargs'
9
6
  key_argv = f'{key_arg}v'
10
7
 
11
8
 
12
- def cmd2ak(argv): # arg0 arg-\-1 k0--kwarg0 k1--kwarg1
13
- args = []
14
- kwargs = {}
15
- for x in argv:
16
- if re.match(r'[^\W\d]\w*--', x):
17
- k, v = x.split('--', 1)
18
- kwargs[k] = v
19
- else:
20
- args.append(str_escape_one_type(x, '-', '-'))
21
- return args, kwargs
22
-
23
-
24
- def ak2cmd(args=None, kwargs=None):
25
- result = []
26
- if args:
27
- for arg in args:
28
- arg = arg.replace('--', r'-\-')
29
- result.append(shlex_quote(arg))
30
- if kwargs:
31
- for k, v in kwargs.items():
32
- result.append(shlex_quote(f'{k}--{v}'))
33
- return ' '.join(result)
34
-
35
-
36
9
  def pack_context(args, kwargs):
37
10
  return {
38
11
  **{f'{key_arg}{i}': arg for i, arg in enumerate(args)}, **{key_args: tuple(args), key_kwargs: kwargs}, **kwargs}
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: dekshell
3
- Version: 0.2.31
3
+ Version: 0.2.33
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.31.dist-info/METADATA,sha256=g-axW4y5shPS9aMpAtNsLb-VPflnb1V52EbKlPGcdBc,573
2
- dekshell-0.2.31.dist-info/WHEEL,sha256=tSfRZzRHthuv7vxpI4aehrdN9scLjk-dCJkPLzkHxGg,90
3
- dekshell-0.2.31.dist-info/entry_points.txt,sha256=d-kbfULiUTZWIBBsrQF3J_-wESncF-4K2rwHT08grlI,75
1
+ dekshell-0.2.33.dist-info/METADATA,sha256=PJWyrsTeOz1Hd2RZ9dZto3UTG18hZBNSoJT-x0naKzs,573
2
+ dekshell-0.2.33.dist-info/WHEEL,sha256=tSfRZzRHthuv7vxpI4aehrdN9scLjk-dCJkPLzkHxGg,90
3
+ dekshell-0.2.33.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
- dekshell/click/__init__.py,sha256=rFzB_exzPQaIcbbms5PdHAU3NGdl2MBaYbq9v7g7BOI,1870
7
- dekshell/core/__init__.py,sha256=acq3wTfUlREzc_9R28ocvJBH7E8cnOQPGpy2dC69fIM,5533
6
+ dekshell/click/__init__.py,sha256=r-AHdO9CEEVvTN20-8Jozr6Zh8XSv_BnktYRwrlhtrE,2046
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=A6t58yBoCEfcQ2rRdmwxwznMpOOGFCUrH8u8RoE2Sow,10375
10
- dekshell/core/contexts/properties.py,sha256=xBUHC6eDmsoPHmOntxPdHNQpZ3iqd7wzkmyTKWm3ZYA,2422
9
+ dekshell/core/contexts/methods.py,sha256=SukHnNNvxnRPySGB6xQNf2eXX-3FaaQBetBJFjN9Fso,10378
10
+ dekshell/core/contexts/properties.py,sha256=wT_gvK89JDU3NDOwiQKz4e2ukrLG6yXUhBsOk8NMQpE,3123
11
11
  dekshell/core/markers/__init__.py,sha256=yRQazZ1dxMltFao_RQnDnawSnQcjN_4B930MjJhaZ40,1968
12
- dekshell/core/markers/base/__init__.py,sha256=mrOgC5glSG60NMpflSi5mb4bXTmDgv2i-ZYUHCef2Nw,13826
12
+ dekshell/core/markers/base/__init__.py,sha256=W5f_Mcn9MLM8kOVqu05NUaDpn3xUNURe_NYerUoH6Js,16021
13
13
  dekshell/core/markers/base/core.py,sha256=InsUA3md2gC6GyXQsvARfeNTrfbVD3gGOYxTM8VqqPA,11679
14
14
  dekshell/core/markers/base/shell.py,sha256=fiFsTUDI8pSDDUCk834OI4ajri2qNWFJkLVhmUk2uAs,484
15
15
  dekshell/core/markers/commands.py,sha256=mDRj4dSfKbDaZ_ts4lPXd6wftvGFI4VKkRoIzxV7otA,1696
@@ -20,12 +20,12 @@ dekshell/core/markers/empty.py,sha256=pWKsHlrp6uXWU6blqOs0IgN_3kYm1OmDQiKGPERabA
20
20
  dekshell/core/markers/env.py,sha256=6ZtiMNdKFbGR_DBjG6C7A8L_lJsiymN5Y5AbnTzyMrE,1158
21
21
  dekshell/core/markers/exec.py,sha256=4_7FRUEgbAtt0_9r8TmOar_Zi6VXxe6E7p3RL6sVgQg,2705
22
22
  dekshell/core/markers/for_.py,sha256=uNOEwyDsjffttEBtUYasdlj7FP_sGnQzWuTV5d5esHY,2142
23
- dekshell/core/markers/function.py,sha256=RPh56_rYbWXCTkNPiJu8zNEj-OE6txKgEw7Im9fBM3c,3592
23
+ dekshell/core/markers/function.py,sha256=V7WZ438RQ0a96wMu9AwWH-dtQMBO9IenaKTWyzRqDUo,3804
24
24
  dekshell/core/markers/if_.py,sha256=bBG1fDCZd5alE5FSm0QhgHl6ZJn5awiqZAXnPnO-thc,1112
25
25
  dekshell/core/markers/input.py,sha256=O0yvGtt1uhbpE2gOReLseAmshVpZYMW3zV-OabZt0lw,1182
26
26
  dekshell/core/markers/invoke.py,sha256=To_U_FscoCbf7osvjC5MQTk2gjH5Mu_-06Kb22YQPTo,1441
27
27
  dekshell/core/markers/pip_.py,sha256=mxXa_oqcrk4Qz-HvhlkMoirsl-SbM9Fz610leNqP1o0,832
28
- dekshell/core/markers/redirect.py,sha256=3vfkRQ2tnQ6rSGGn7csgUlpDi0s2ep5X7JU7NVvo0eI,1984
28
+ dekshell/core/markers/redirect.py,sha256=cpTQaXFAuSwprsrhUNP0xTGDmu06HGNQVcwKsETEjas,1981
29
29
  dekshell/core/markers/shell.py,sha256=43BDAAzMdmgZmemkW5buh_w4LL1GDGw-s9fNZo6vhag,1929
30
30
  dekshell/core/markers/var.py,sha256=CnmBDQvA5XcQlioczXFhCvIbDc8ex4RIAgDeQvFdIiY,5176
31
31
  dekshell/core/markers/while_.py,sha256=e7lI5jsIM-qxNHMY_wUyCMvvesdXQibR5Ez2jNO9csc,1195
@@ -33,8 +33,8 @@ dekshell/core/plugin/__init__.py,sha256=jAB_KnnHJsyJR_zIfBU_HNLngyhcyyqVv05PdlNZ
33
33
  dekshell/core/redirect.py,sha256=6YCJpG0TkQ4WMt7LBtDD_W1T-C-QkLtGRQw0S60qe54,1058
34
34
  dekshell/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
35
35
  dekshell/utils/beep.py,sha256=teuQgHbWDr8BD1xCJ4Pt79X6N1-eq1tTlyGunK6wBIM,120
36
- dekshell/utils/cmd.py,sha256=A0lEixQ7Ui0UxmeuymniyqCZXss9qQdX1C0COM7EEkQ,1234
36
+ 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.31.dist-info/RECORD,,
40
+ dekshell-0.2.33.dist-info/RECORD,,