Skip to content

init

trestle.core.commands.init ¤

Trestle Init Command.

logger ¤

Classes¤

InitCmd (CommandBase) ¤

Initialize a trestle working directory.

Source code in trestle/core/commands/init.py
class InitCmd(CommandBase):
    """Initialize a trestle working directory."""

    name = 'init'

    def _init_arguments(self) -> None:

        self.add_argument(const.INIT_FULL_SHORT, const.INIT_FULL_LONG, help=const.INIT_FULL_HELP, action='store_true')
        self.add_argument(
            const.INIT_LOCAL_SHORT, const.INIT_LOCAL_LONG, help=const.INIT_LOCAL_HELP, action='store_true'
        )
        self.add_argument(
            const.INIT_GOVDOCS_SHORT, const.INIT_GOVDOCS_LONG, help=const.INIT_GOVDOCS_HELP, action='store_true'
        )

    def _run(self, args: argparse.Namespace) -> int:
        """Create a trestle workspace in the current directory."""
        try:
            log.set_log_level_from_args(args)
            dir_path: pathlib.Path = args.trestle_root
            if not dir_path.exists() or not dir_path.is_dir():
                raise TrestleRootError(
                    f'Initialization failed. Given directory {dir_path} does not exist or is not a directory.'
                )

            if not (args.full or args.local or args.govdocs):
                # Running in full mode by default
                args.full = True

            init_dist_folder = True if args.full else False
            init_oscal_folders = True if args.local or args.full else False
            copy_config_file = True if args.full or args.local else False

            self._create_directories(dir_path, init_oscal_folders, init_dist_folder)

            if copy_config_file:
                self._copy_config_file(dir_path)

            logger.info(f'Initialized trestle project successfully in {dir_path}')

            return CmdReturnCodes.SUCCESS.value

        except Exception as e:  # pragma: no cover
            return handle_generic_command_exception(e, logger, 'Failed to initialize Trestle working directory.')

    def _create_directories(self, root: pathlib.Path, create_model_folders: bool, create_dist_folder: bool) -> None:
        """Create the directory tree if it does not exist."""
        # Prepare directory list to be created
        try:
            directory_list = [root / pathlib.Path(const.TRESTLE_CONFIG_DIR)]

            if create_model_folders:
                for model_dir in const.MODEL_DIR_LIST:
                    directory_list.append(root / pathlib.Path(model_dir))
                    if create_dist_folder:
                        directory_list.append(root / pathlib.Path(const.TRESTLE_DIST_DIR) / model_dir)

            # Create directories
            for directory in directory_list:
                directory.mkdir(parents=True, exist_ok=True)
                file_path = pathlib.Path(directory) / const.TRESTLE_KEEP_FILE
                file_utils.make_hidden_file(file_path)
        except OSError as e:
            raise TrestleError(f'Error while creating directories: {e}')
        except Exception as e:
            raise TrestleError(f'Unexpected error while creating directories: {e}')

    def _copy_config_file(self, root: pathlib.Path) -> None:
        """Copy the initial config.ini file to .trestle directory."""
        try:
            ref = importlib_resources.files('trestle.resources') / const.TRESTLE_CONFIG_FILE
            with importlib_resources.as_file(ref) as source_path:
                destination_path = (root / pathlib.Path(const.TRESTLE_CONFIG_DIR) / const.TRESTLE_CONFIG_FILE).resolve()
                copyfile(source_path, destination_path)

        except (shutil.SameFileError, OSError) as e:
            raise TrestleError(f'Error while copying config file: {e}')
        except Exception as e:
            raise TrestleError(f'Unexpected error while copying config file: {e}')
name ¤

handler: python