Source code for OCDocker.Console.app
#!/usr/bin/env python3
# Description
###############################################################################
'''
Console application entrypoint.
Coordinates environment bootstrap (when invoked standalone), logging setup,
banner rendering, namespace construction, and the interactive REPL loop.
'''
from __future__ import annotations
# Imports
###############################################################################
import argparse
import sys
from typing import Optional
import OCDocker.Toolbox.Logging as oclogging
from OCDocker.Console.render import print_welcome_banner
from OCDocker.Console.session import build_namespace, run_interactive
# License
###############################################################################
'''Copyright (c) Federal University of Rio de Janeiro (UFRJ), Artur Duque Rossi, and Pedro Henrique Monteiro Torres.
SPDX-License-Identifier: BSD-3-Clause
See the LICENSE file for full terms.
'''
LOGGER = oclogging.get_logger("cli")
# Functions
###############################################################################
## Public ##
[docs]
def run_console(args: Optional[argparse.Namespace] = None) -> int:
'''Start the console after the environment has been bootstrapped.
Parameters
----------
args : Optional[argparse.Namespace], optional
Parsed CLI namespace from ``ocdocker console``. When provided, logging
is configured from CLI flags and ``--ipython`` is honored.
Returns
-------
int
Exit code (0 for success, non-zero on failure).
'''
if args is not None:
try:
import OCDocker.Error as ocerror
oclogging.configure(
level=ocerror.Error.get_output_level(),
log_file=getattr(args, "log_file", None),
to_stdout=False,
use_rich=True,
)
except (ImportError, AttributeError, OSError):
pass
print_welcome_banner()
try:
namespace = build_namespace()
except ModuleNotFoundError as exc:
from OCDocker.CLI.common import _print_optional_dependency_hint, _suggest_extra_for_missing_module
extra = _suggest_extra_for_missing_module(getattr(exc, "name", ""))
return _print_optional_dependency_hint(
feature="interactive console",
extra=extra,
exc=exc,
)
except Exception:
LOGGER.exception("Failed to build console namespace")
return 1
use_ipython = bool(getattr(args, "ipython", False)) if args is not None else False
return run_interactive(namespace, use_ipython=use_ipython)
[docs]
def main(argv: Optional[list[str]] = None) -> int:
'''Standalone console entry (``python -m OCDocker.Console``).
Bootstraps OCDocker via ``OCDocker.Initialise`` when ``argv`` is ``None``,
or via CLI global-flag preparse when a custom argv list is supplied.
Parameters
----------
argv : Optional[list[str]], optional
Command-line arguments excluding the program name. Defaults to compatibility
Initialise parsing when ``None``.
Returns
-------
int
Exit code from :func:`run_console`.
'''
from OCDocker.CLI.common import _bootstrap_ocdocker_env, _preparse_global_args
from OCDocker.Initialise import argument_parsing, bootstrap
if argv is None:
bootstrap(argument_parsing())
else:
globals_ns = _preparse_global_args(list(argv))
setattr(globals_ns, "_ocdocker_init_db", False)
_bootstrap_ocdocker_env(globals_ns)
return run_console()