Mercurial > libervia-backend
annotate sat_frontends/jp/cmd_input.py @ 3849:bc24ce903835
plugin XEP-0060: handle priority in `addManagedNode`:
Priority lets order the callback list when an event is received. This is important in some
use case, notably when a plugin needs to check the former item before it is deleted from
cache or updated.
rel 370
author | Goffi <goffi@goffi.org> |
---|---|
date | Thu, 14 Jul 2022 12:55:30 +0200 |
parents | be6d91572633 |
children | 524856bd7b19 |
rev | line source |
---|---|
3137 | 1 #!/usr/bin/env python3 |
2 | |
2278 | 3 |
4 # jp: a SàT command line tool | |
3479 | 5 # Copyright (C) 2009-2021 Jérôme Poisson (goffi@goffi.org) |
2278 | 6 |
7 # This program is free software: you can redistribute it and/or modify | |
8 # it under the terms of the GNU Affero General Public License as published by | |
9 # the Free Software Foundation, either version 3 of the License, or | |
10 # (at your option) any later version. | |
11 | |
12 # This program is distributed in the hope that it will be useful, | |
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of | |
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
15 # GNU Affero General Public License for more details. | |
16 | |
17 # You should have received a copy of the GNU Affero General Public License | |
18 # along with this program. If not, see <http://www.gnu.org/licenses/>. | |
19 | |
20 | |
3040 | 21 import subprocess |
22 import argparse | |
23 import sys | |
24 import shlex | |
25 import asyncio | |
3028 | 26 from . import base |
2278 | 27 from sat.core.i18n import _ |
2282
d8e48c850ad2
jp (input): log improvments + empty filter:
Goffi <goffi@goffi.org>
parents:
2278
diff
changeset
|
28 from sat.core import exceptions |
2278 | 29 from sat_frontends.jp.constants import Const as C |
30 from sat.tools.common.ansi import ANSI as A | |
31 | |
32 __commands__ = ["Input"] | |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
33 OPT_STDIN = "stdin" |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
34 OPT_SHORT = "short" |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
35 OPT_LONG = "long" |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
36 OPT_POS = "positional" |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
37 OPT_IGNORE = "ignore" |
2278 | 38 OPT_TYPES = (OPT_STDIN, OPT_SHORT, OPT_LONG, OPT_POS, OPT_IGNORE) |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
39 OPT_EMPTY_SKIP = "skip" |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
40 OPT_EMPTY_IGNORE = "ignore" |
2282
d8e48c850ad2
jp (input): log improvments + empty filter:
Goffi <goffi@goffi.org>
parents:
2278
diff
changeset
|
41 OPT_EMPTY_CHOICES = (OPT_EMPTY_SKIP, OPT_EMPTY_IGNORE) |
2278 | 42 |
43 | |
44 class InputCommon(base.CommandBase): | |
45 def __init__(self, host, name, help): | |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
46 base.CommandBase.__init__( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
47 self, host, name, use_verbose=True, use_profile=False, help=help |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
48 ) |
2278 | 49 self.idx = 0 |
50 self.reset() | |
51 | |
52 def reset(self): | |
53 self.args_idx = 0 | |
54 self._stdin = [] | |
55 self._opts = [] | |
56 self._pos = [] | |
2282
d8e48c850ad2
jp (input): log improvments + empty filter:
Goffi <goffi@goffi.org>
parents:
2278
diff
changeset
|
57 self._values_ori = [] |
2278 | 58 |
59 def add_parser_options(self): | |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
60 self.parser.add_argument( |
3028 | 61 "--encoding", default="utf-8", help=_("encoding of the input data") |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
62 ) |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
63 self.parser.add_argument( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
64 "-i", |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
65 "--stdin", |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
66 action="append_const", |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
67 const=(OPT_STDIN, None), |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
68 dest="arguments", |
3028 | 69 help=_("standard input"), |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
70 ) |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
71 self.parser.add_argument( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
72 "-s", |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
73 "--short", |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
74 type=self.opt(OPT_SHORT), |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
75 action="append", |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
76 dest="arguments", |
3028 | 77 help=_("short option"), |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
78 ) |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
79 self.parser.add_argument( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
80 "-l", |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
81 "--long", |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
82 type=self.opt(OPT_LONG), |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
83 action="append", |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
84 dest="arguments", |
3028 | 85 help=_("long option"), |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
86 ) |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
87 self.parser.add_argument( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
88 "-p", |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
89 "--positional", |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
90 type=self.opt(OPT_POS), |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
91 action="append", |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
92 dest="arguments", |
3028 | 93 help=_("positional argument"), |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
94 ) |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
95 self.parser.add_argument( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
96 "-x", |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
97 "--ignore", |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
98 action="append_const", |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
99 const=(OPT_IGNORE, None), |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
100 dest="arguments", |
3028 | 101 help=_("ignore value"), |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
102 ) |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
103 self.parser.add_argument( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
104 "-D", |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
105 "--debug", |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
106 action="store_true", |
3028 | 107 help=_("don't actually run commands but echo what would be launched"), |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
108 ) |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
109 self.parser.add_argument( |
3040 | 110 "--log", type=argparse.FileType("w"), help=_("log stdout to FILE") |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
111 ) |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
112 self.parser.add_argument( |
3040 | 113 "--log-err", type=argparse.FileType("w"), help=_("log stderr to FILE") |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
114 ) |
2278 | 115 self.parser.add_argument("command", nargs=argparse.REMAINDER) |
116 | |
117 def opt(self, type_): | |
118 return lambda s: (type_, s) | |
119 | |
120 def addValue(self, value): | |
121 """add a parsed value according to arguments sequence""" | |
2282
d8e48c850ad2
jp (input): log improvments + empty filter:
Goffi <goffi@goffi.org>
parents:
2278
diff
changeset
|
122 self._values_ori.append(value) |
2278 | 123 arguments = self.args.arguments |
124 try: | |
125 arg_type, arg_name = arguments[self.args_idx] | |
126 except IndexError: | |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
127 self.disp( |
3028 | 128 _("arguments in input data and in arguments sequence don't match"), |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
129 error=True, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
130 ) |
2278 | 131 self.host.quit(C.EXIT_DATA_ERROR) |
132 self.args_idx += 1 | |
133 while self.args_idx < len(arguments): | |
134 next_arg = arguments[self.args_idx] | |
135 if next_arg[0] not in OPT_TYPES: | |
2282
d8e48c850ad2
jp (input): log improvments + empty filter:
Goffi <goffi@goffi.org>
parents:
2278
diff
changeset
|
136 # value will not be used if False or None, so we skip filter |
d8e48c850ad2
jp (input): log improvments + empty filter:
Goffi <goffi@goffi.org>
parents:
2278
diff
changeset
|
137 if value not in (False, None): |
d8e48c850ad2
jp (input): log improvments + empty filter:
Goffi <goffi@goffi.org>
parents:
2278
diff
changeset
|
138 # we have a filter |
d8e48c850ad2
jp (input): log improvments + empty filter:
Goffi <goffi@goffi.org>
parents:
2278
diff
changeset
|
139 filter_type, filter_arg = arguments[self.args_idx] |
d8e48c850ad2
jp (input): log improvments + empty filter:
Goffi <goffi@goffi.org>
parents:
2278
diff
changeset
|
140 value = self.filter(filter_type, filter_arg, value) |
2278 | 141 else: |
142 break | |
143 self.args_idx += 1 | |
144 | |
2282
d8e48c850ad2
jp (input): log improvments + empty filter:
Goffi <goffi@goffi.org>
parents:
2278
diff
changeset
|
145 if value is None: |
d8e48c850ad2
jp (input): log improvments + empty filter:
Goffi <goffi@goffi.org>
parents:
2278
diff
changeset
|
146 # we ignore this argument |
d8e48c850ad2
jp (input): log improvments + empty filter:
Goffi <goffi@goffi.org>
parents:
2278
diff
changeset
|
147 return |
d8e48c850ad2
jp (input): log improvments + empty filter:
Goffi <goffi@goffi.org>
parents:
2278
diff
changeset
|
148 |
d8e48c850ad2
jp (input): log improvments + empty filter:
Goffi <goffi@goffi.org>
parents:
2278
diff
changeset
|
149 if value is False: |
d8e48c850ad2
jp (input): log improvments + empty filter:
Goffi <goffi@goffi.org>
parents:
2278
diff
changeset
|
150 # we skip the whole row |
d8e48c850ad2
jp (input): log improvments + empty filter:
Goffi <goffi@goffi.org>
parents:
2278
diff
changeset
|
151 if self.args.debug: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
152 self.disp( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
153 A.color( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
154 C.A_SUBHEADER, |
3028 | 155 _("values: "), |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
156 A.RESET, |
3028 | 157 ", ".join(self._values_ori), |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
158 ), |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
159 2, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
160 ) |
3028 | 161 self.disp(A.color(A.BOLD, _("**SKIPPING**\n"))) |
2282
d8e48c850ad2
jp (input): log improvments + empty filter:
Goffi <goffi@goffi.org>
parents:
2278
diff
changeset
|
162 self.reset() |
d8e48c850ad2
jp (input): log improvments + empty filter:
Goffi <goffi@goffi.org>
parents:
2278
diff
changeset
|
163 self.idx += 1 |
d8e48c850ad2
jp (input): log improvments + empty filter:
Goffi <goffi@goffi.org>
parents:
2278
diff
changeset
|
164 raise exceptions.CancelError |
d8e48c850ad2
jp (input): log improvments + empty filter:
Goffi <goffi@goffi.org>
parents:
2278
diff
changeset
|
165 |
2278 | 166 if not isinstance(value, list): |
167 value = [value] | |
168 | |
169 for v in value: | |
170 if arg_type == OPT_STDIN: | |
3040 | 171 self._stdin.append(v) |
2278 | 172 elif arg_type == OPT_SHORT: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
173 self._opts.append("-{}".format(arg_name)) |
3040 | 174 self._opts.append(v) |
2278 | 175 elif arg_type == OPT_LONG: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
176 self._opts.append("--{}".format(arg_name)) |
3040 | 177 self._opts.append(v) |
2278 | 178 elif arg_type == OPT_POS: |
3040 | 179 self._pos.append(v) |
2278 | 180 elif arg_type == OPT_IGNORE: |
181 pass | |
182 else: | |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
183 self.parser.error( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
184 _( |
3028 | 185 "Invalid argument, an option type is expected, got {type_}:{name}" |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
186 ).format(type_=arg_type, name=arg_name) |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
187 ) |
2278 | 188 |
3040 | 189 async def runCommand(self): |
2278 | 190 """run requested command with parsed arguments""" |
191 if self.args_idx != len(self.args.arguments): | |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
192 self.disp( |
3028 | 193 _("arguments in input data and in arguments sequence don't match"), |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
194 error=True, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
195 ) |
2278 | 196 self.host.quit(C.EXIT_DATA_ERROR) |
3407
2f0be2b7de68
jp: replace `no_lf` argument by `end` in `disp` (same as in `print`)
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
197 end = '\n' if self.args.debug else ' ' |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
198 self.disp( |
3028 | 199 A.color(C.A_HEADER, _("command {idx}").format(idx=self.idx)), |
3407
2f0be2b7de68
jp: replace `no_lf` argument by `end` in `disp` (same as in `print`)
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
200 end = end, |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
201 ) |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
202 stdin = "".join(self._stdin) |
2278 | 203 if self.args.debug: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
204 self.disp( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
205 A.color( |
3040 | 206 C.A_SUBHEADER, |
207 _("values: "), | |
208 A.RESET, | |
209 ", ".join([shlex.quote(a) for a in self._values_ori]) | |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
210 ), |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
211 2, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
212 ) |
2282
d8e48c850ad2
jp (input): log improvments + empty filter:
Goffi <goffi@goffi.org>
parents:
2278
diff
changeset
|
213 |
2278 | 214 if stdin: |
3028 | 215 self.disp(A.color(C.A_SUBHEADER, "--- STDIN ---")) |
216 self.disp(stdin) | |
217 self.disp(A.color(C.A_SUBHEADER, "-------------")) | |
3040 | 218 |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
219 self.disp( |
3028 | 220 "{indent}{prog} {static} {options} {positionals}".format( |
221 indent=4 * " ", | |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
222 prog=sys.argv[0], |
3028 | 223 static=" ".join(self.args.command), |
3040 | 224 options=" ".join(shlex.quote(o) for o in self._opts), |
225 positionals=" ".join(shlex.quote(p) for p in self._pos), | |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
226 ) |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
227 ) |
3028 | 228 self.disp("\n") |
2278 | 229 else: |
3407
2f0be2b7de68
jp: replace `no_lf` argument by `end` in `disp` (same as in `print`)
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
230 self.disp(" (" + ", ".join(self._values_ori) + ")", 2, end=' ') |
2282
d8e48c850ad2
jp (input): log improvments + empty filter:
Goffi <goffi@goffi.org>
parents:
2278
diff
changeset
|
231 args = [sys.argv[0]] + self.args.command + self._opts + self._pos |
3040 | 232 p = await asyncio.create_subprocess_exec( |
233 *args, | |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
234 stdin=subprocess.PIPE, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
235 stdout=subprocess.PIPE, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
236 stderr=subprocess.PIPE, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
237 ) |
3040 | 238 stdout, stderr = await p.communicate(stdin.encode('utf-8')) |
2282
d8e48c850ad2
jp (input): log improvments + empty filter:
Goffi <goffi@goffi.org>
parents:
2278
diff
changeset
|
239 log = self.args.log |
d8e48c850ad2
jp (input): log improvments + empty filter:
Goffi <goffi@goffi.org>
parents:
2278
diff
changeset
|
240 log_err = self.args.log_err |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
241 log_tpl = "{command}\n{buff}\n\n" |
2282
d8e48c850ad2
jp (input): log improvments + empty filter:
Goffi <goffi@goffi.org>
parents:
2278
diff
changeset
|
242 if log: |
3040 | 243 log.write(log_tpl.format( |
244 command=" ".join(shlex.quote(a) for a in args), | |
245 buff=stdout.decode('utf-8', 'replace'))) | |
2282
d8e48c850ad2
jp (input): log improvments + empty filter:
Goffi <goffi@goffi.org>
parents:
2278
diff
changeset
|
246 if log_err: |
3040 | 247 log_err.write(log_tpl.format( |
248 command=" ".join(shlex.quote(a) for a in args), | |
249 buff=stderr.decode('utf-8', 'replace'))) | |
250 ret = p.returncode | |
2278 | 251 if ret == 0: |
3028 | 252 self.disp(A.color(C.A_SUCCESS, _("OK"))) |
2278 | 253 else: |
3028 | 254 self.disp(A.color(C.A_FAILURE, _("FAILED"))) |
2278 | 255 |
256 self.reset() | |
257 self.idx += 1 | |
258 | |
259 def filter(self, filter_type, filter_arg, value): | |
2282
d8e48c850ad2
jp (input): log improvments + empty filter:
Goffi <goffi@goffi.org>
parents:
2278
diff
changeset
|
260 """change input value |
d8e48c850ad2
jp (input): log improvments + empty filter:
Goffi <goffi@goffi.org>
parents:
2278
diff
changeset
|
261 |
d8e48c850ad2
jp (input): log improvments + empty filter:
Goffi <goffi@goffi.org>
parents:
2278
diff
changeset
|
262 @param filter_type(unicode): name of the filter |
d8e48c850ad2
jp (input): log improvments + empty filter:
Goffi <goffi@goffi.org>
parents:
2278
diff
changeset
|
263 @param filter_arg(unicode, None): argument of the filter |
d8e48c850ad2
jp (input): log improvments + empty filter:
Goffi <goffi@goffi.org>
parents:
2278
diff
changeset
|
264 @param value(unicode): value to filter |
d8e48c850ad2
jp (input): log improvments + empty filter:
Goffi <goffi@goffi.org>
parents:
2278
diff
changeset
|
265 @return (unicode, False, None): modified value |
d8e48c850ad2
jp (input): log improvments + empty filter:
Goffi <goffi@goffi.org>
parents:
2278
diff
changeset
|
266 False to skip the whole row |
d8e48c850ad2
jp (input): log improvments + empty filter:
Goffi <goffi@goffi.org>
parents:
2278
diff
changeset
|
267 None to ignore this argument (but continue row with other ones) |
d8e48c850ad2
jp (input): log improvments + empty filter:
Goffi <goffi@goffi.org>
parents:
2278
diff
changeset
|
268 """ |
2278 | 269 raise NotImplementedError |
270 | |
271 | |
272 class Csv(InputCommon): | |
273 def __init__(self, host): | |
3028 | 274 super(Csv, self).__init__(host, "csv", _("comma-separated values")) |
2278 | 275 |
276 def add_parser_options(self): | |
277 InputCommon.add_parser_options(self) | |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
278 self.parser.add_argument( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
279 "-r", |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
280 "--row", |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
281 type=int, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
282 default=0, |
3028 | 283 help=_("starting row (previous ones will be ignored)"), |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
284 ) |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
285 self.parser.add_argument( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
286 "-S", |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
287 "--split", |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
288 action="append_const", |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
289 const=("split", None), |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
290 dest="arguments", |
3028 | 291 help=_("split value in several options"), |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
292 ) |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
293 self.parser.add_argument( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
294 "-E", |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
295 "--empty", |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
296 action="append", |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
297 type=self.opt("empty"), |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
298 dest="arguments", |
3028 | 299 help=_("action to do on empty value ({choices})").format( |
300 choices=", ".join(OPT_EMPTY_CHOICES) | |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
301 ), |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
302 ) |
2278 | 303 |
2282
d8e48c850ad2
jp (input): log improvments + empty filter:
Goffi <goffi@goffi.org>
parents:
2278
diff
changeset
|
304 def filter(self, filter_type, filter_arg, value): |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
305 if filter_type == "split": |
2278 | 306 return value.split() |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
307 elif filter_type == "empty": |
2282
d8e48c850ad2
jp (input): log improvments + empty filter:
Goffi <goffi@goffi.org>
parents:
2278
diff
changeset
|
308 if filter_arg == OPT_EMPTY_IGNORE: |
d8e48c850ad2
jp (input): log improvments + empty filter:
Goffi <goffi@goffi.org>
parents:
2278
diff
changeset
|
309 return value if value else None |
d8e48c850ad2
jp (input): log improvments + empty filter:
Goffi <goffi@goffi.org>
parents:
2278
diff
changeset
|
310 elif filter_arg == OPT_EMPTY_SKIP: |
d8e48c850ad2
jp (input): log improvments + empty filter:
Goffi <goffi@goffi.org>
parents:
2278
diff
changeset
|
311 return value if value else False |
d8e48c850ad2
jp (input): log improvments + empty filter:
Goffi <goffi@goffi.org>
parents:
2278
diff
changeset
|
312 else: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
313 self.parser.error( |
3028 | 314 _("--empty value must be one of {choices}").format( |
315 choices=", ".join(OPT_EMPTY_CHOICES) | |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
316 ) |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
317 ) |
2278 | 318 |
319 super(Csv, self).filter(filter_type, filter_arg, value) | |
320 | |
3040 | 321 async def start(self): |
2278 | 322 import csv |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
323 |
3040 | 324 if self.args.encoding: |
325 sys.stdin.reconfigure(encoding=self.args.encoding, errors="replace") | |
2278 | 326 reader = csv.reader(sys.stdin) |
327 for idx, row in enumerate(reader): | |
2282
d8e48c850ad2
jp (input): log improvments + empty filter:
Goffi <goffi@goffi.org>
parents:
2278
diff
changeset
|
328 try: |
d8e48c850ad2
jp (input): log improvments + empty filter:
Goffi <goffi@goffi.org>
parents:
2278
diff
changeset
|
329 if idx < self.args.row: |
d8e48c850ad2
jp (input): log improvments + empty filter:
Goffi <goffi@goffi.org>
parents:
2278
diff
changeset
|
330 continue |
d8e48c850ad2
jp (input): log improvments + empty filter:
Goffi <goffi@goffi.org>
parents:
2278
diff
changeset
|
331 for value in row: |
3040 | 332 self.addValue(value) |
333 await self.runCommand() | |
2282
d8e48c850ad2
jp (input): log improvments + empty filter:
Goffi <goffi@goffi.org>
parents:
2278
diff
changeset
|
334 except exceptions.CancelError: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
335 # this row has been cancelled, we skip it |
2278 | 336 continue |
337 | |
3040 | 338 self.host.quit() |
339 | |
2278 | 340 |
341 class Input(base.CommandBase): | |
342 subcommands = (Csv,) | |
343 | |
344 def __init__(self, host): | |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
345 super(Input, self).__init__( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
346 host, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
347 "input", |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
348 use_profile=False, |
3028 | 349 help=_("launch command with external input"), |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
350 ) |