Skip to content

Main

Copier Template Tester.

Based on: https://github.com/copier-org/copier/blob/ccfbc9a923f4228af7ca2bf067493665aa15d07c/tests/helpers.py#L20-L81

Attributes⚓︎

Classes⚓︎

Functions⚓︎

run ⚓︎

run(*, base_dir=None, check_untracked=False, continue_on_error=False)

Entry point.

Source code in copier_template_tester/main.py
def run(*, base_dir: Path | None = None, check_untracked: bool = False, continue_on_error: bool = False) -> None:
    """Entry point."""
    base_dir = base_dir or Path.cwd()
    try:
        read_copier_template(base_dir=base_dir)
    except FileNotFoundError:
        message = f"Please add a '{DEFAULT_TEMPLATE_FILE_NAME}' file to '{base_dir}'"
        logger.warning(message)
        return

    logger.text(f'Starting Copier Template Tester for {base_dir}')
    logger.text('\tNote: If files were modified, pre-commit will report a failure.')
    logger.text('')
    config = load_config(base_dir)
    defaults = config.get('defaults', {})

    input_path = base_dir
    paths = set()
    reporter = RunReporter()
    for key, data in config['output'].items():
        output_path = base_dir / key
        paths.add(output_path)
        with group_context(key):
            logger.text(f'Using `copier` to create: {key}')
            data_with_defaults = defaults | data
            post_tasks = _resolve_post_tasks(data_with_defaults)
            pre_tasks = data_with_defaults.pop('_pre_tasks', [])
            skip_tasks = data_with_defaults.pop('_skip_tasks', False)
            try:
                write_output(
                    src_path=input_path,
                    dst_path=base_dir / output_path,
                    data=data_with_defaults,
                    post_tasks=post_tasks,
                    pre_tasks=pre_tasks,
                    skip_tasks=skip_tasks,
                )
                if continue_on_error:
                    reporter.record_pass(key)
            except Exception as err:
                if not continue_on_error:
                    raise
                reporter.record_failure(key, err)

    if continue_on_error:
        reporter.summary()
        reporter.raise_if_any_failures()

    if check_untracked:  # pragma: no cover
        check_for_untracked(base_dir)

run_cli ⚓︎

run_cli()

Accept CLI configuration for running ctt.

Source code in copier_template_tester/main.py
def run_cli() -> None:  # pragma: no cover
    """Accept CLI configuration for running ctt."""
    def dir_path(pth: str | None) -> Path:
        if pth and Path(pth).is_dir():
            return Path(pth).resolve()
        msg = f'Expected a path to a directory. Received: `{pth}`'
        raise ArgumentTypeError(msg)

    cli = ArgumentParser()
    cli.add_argument(
        '-b',
        '--base-dir',
        help='Specify the path to the directory that contains the configuration file',
        type=dir_path)
    cli.add_argument('--check-untracked', help='Only used for pre-commit', action='store_true')
    cli.add_argument('--continue-on-error', help='Run all test cases and print a summary', action='store_true')

    args = cli.parse_args()
    continue_on_error = args.continue_on_error or os.environ.get('CTT_CONTINUE_ON_ERROR') == '1'
    run(base_dir=args.base_dir, check_untracked=args.check_untracked, continue_on_error=continue_on_error)