in cli/srecli/group/__init__.py [0:0]
def __call__(self, func: Callable) -> Callable:
@wraps(func)
def wrapper(*args, **kwargs):
modular_mode = False
if Path(__file__).parents[3].name == MODULAR_ADMIN: # TODO check some other way
modular_mode = True
json_view = Env.RESPONSE_FORMAT.get() == 'json' or kwargs.get('json')
verbose = Env.VERBOSE.get() or kwargs.get('verbose') # todo verbose can be enabled earlier if from env
kwargs.pop('json', None)
kwargs.pop('verbose', None)
if verbose:
enable_verbose_logs()
ctx = cast(click.Context, click.get_current_context())
self.update_context(ctx)
try:
self._check_context(ctx)
resp: CustodianResponse = click.pass_obj(func)(*args, **kwargs)
except click.ClickException as e:
_LOG.info('Click exception has occurred')
resp = response(e.format_message(), code=HTTPStatus.BAD_REQUEST)
except Exception as e:
_LOG.error(f'Unexpected error has occurred: {e}')
resp = response(str(e), code=HTTPStatus.INTERNAL_SERVER_ERROR)
if modular_mode:
_LOG.info('The cli is installed as a module. '
'Returning m3 modular cli response')
formatted = ModularResponseProcessor().format(resp)
return json.dumps(formatted, separators=(',', ':'))
if not json_view: # table view
_LOG.info('Returning table view')
prepared = TableResponseProcessor().format(resp)
trace_id = resp.trace_id
next_token = (resp.data or {}).get(NEXT_TOKEN_ATTR)
try:
printer = TablePrinter(
items_per_column=ctx.obj['config'].items_per_column,
attributes_order=self._attributes_order
)
table = printer.print(
prepared,
raise_on_overflow=not Env.NO_PROMPT.get()
)
except ColumnOverflow as ce:
_LOG.info(f'Awaiting user to respond to - {ce!r}.')
to_revert = click.prompt(
REVERT_TO_JSON_MESSAGE,
type=click.Choice(('y', 'n'))
)
if to_revert == 'n':
table = ce.table
else:
table, json_view = None, True
if table:
if verbose:
click.echo(f'Trace id: \'{trace_id}\'')
if next_token:
click.echo(f'Next token: \'{next_token}\'')
click.echo(table)
_LOG.info(f'Finished request: \'{trace_id}\'')
if json_view:
_LOG.info('Returning json view')
data = JsonResponseProcessor().format(resp)
click.echo(json.dumps(data, indent=4))
sys.exit(self.to_exit_code(resp.code))
return wrapper