(parser)
| 202 | |
| 203 | |
| 204 | def add_traceback_cli(parser): |
| 205 | parser.add_argument('--traceback', '--tb', action='store_true', |
| 206 | default=TRACEBACK) |
| 207 | parser.add_argument('--no-traceback', '--no-tb', dest='traceback', |
| 208 | action='store_const', const=False) |
| 209 | |
| 210 | def process_args(args, *, argv=None): |
| 211 | ns = vars(args) |
| 212 | key = 'traceback_cm' |
| 213 | if key in ns: |
| 214 | parser.error(f'duplicate arg {key!r}') |
| 215 | showtb = ns.pop('traceback') |
| 216 | |
| 217 | @contextlib.contextmanager |
| 218 | def traceback_cm(): |
| 219 | restore = loggingutil.hide_emit_errors() |
| 220 | try: |
| 221 | yield |
| 222 | except BrokenPipeError: |
| 223 | # It was piped to "head" or something similar. |
| 224 | pass |
| 225 | except NotImplementedError: |
| 226 | raise # re-raise |
| 227 | except Exception as exc: |
| 228 | if not showtb: |
| 229 | sys.exit(f'ERROR: {exc}') |
| 230 | raise # re-raise |
| 231 | except KeyboardInterrupt: |
| 232 | if not showtb: |
| 233 | sys.exit('\nINTERRUPTED') |
| 234 | raise # re-raise |
| 235 | except BaseException as exc: |
| 236 | if not showtb: |
| 237 | sys.exit(f'{type(exc).__name__}: {exc}') |
| 238 | raise # re-raise |
| 239 | finally: |
| 240 | restore() |
| 241 | ns[key] = traceback_cm() |
| 242 | return key |
| 243 | return process_args |
| 244 | |
| 245 | |
| 246 | def add_sepval_cli(parser, opt, dest, choices, *, sep=',', **kwargs): |
no test coverage detected
searching dependent graphs…