def _verify_executable_exists(ctx: ProjectContext, alias: Optional[str]) -> bool: """Return true if an alias maps to a file in a context and provide user messaging.""" if alias is None: print('Cannot find an executable for a null alias.') return False if not ctx.has_registered_program(alias): print(f'No alias exists for {alias}') recommended: Optional[str] = mp.recommended_executable(mp.root_to_executable(alias)) if recommended is not None: choice: str = input(f'Use recommended path for alias "{alias}": {recommended} (saves in .crank) [y/N]? ') if choice == 'y': print(f'Setting alias {alias} -> {recommended}') if ctx.register_program(alias, recommended): ctx.save() return True print('Use `crank register ALIAS PATH` to register a program for use.') print('Example: crank register cmake "C:/Program Files/CMake/bin/cmake.exe"') return False program_path = ctx.path_for_program(alias) if not os.path.isfile(program_path): print(f'Executable path for {alias} does not exist at {program_path}') return False return True
def cmd_pysetup(ctx: ProjectContext, args: argparse.Namespace) -> int: """Creates a virtual environment for helper module installs.""" if not _verify_executable_exists(ctx, 'python3'): return 1 if os.path.isfile(ctx.venv_dir()): print(f'Cannot create venv, {ctx.venv_dir()} is a file.') return 1 if os.path.isdir(ctx.venv_dir()) and args.clean: shutil.rmtree(ctx.venv_dir()) if not os.path.isdir(ctx.venv_dir()): venv_args = [(ctx.path_for_program('python3')), '-m', 'venv', ctx.venv_dir()] venv_setup = run_program(venv_args, cwd=ctx.calendon_home()) if venv_setup != 0: print(f'Could not create virtual environment at {ctx.venv_dir()}') return venv_setup ctx.register_program('localpython3', os.path.join(ctx.venv_bin_dir(), mp.root_to_executable('python')), override=True) pip_upgrade_result = run_program( [(ctx.path_for_program('localpython3')), '-m', 'pip', 'install', '--upgrade', 'pip', 'setuptools', 'wheel'], cwd=ctx.calendon_home()) if pip_upgrade_result != 0: print('Could not upgrade pip.') requirements_file = os.path.join(ctx.py_dir(), 'requirements.txt') if os.path.isfile(requirements_file): pip_install_args = [ctx.path_for_program('localpython3'), '-m', 'pip', 'install', '-r', requirements_file] else: required_dev_packages = ['mypy', 'pylint', 'pydocstyle', 'pycodestyle', 'bandit', 'colorama'] required_dev_packages.extend(['sphinx', 'sphinx_rtd_theme', 'breathe']) pip_install_args = [ctx.path_for_program('localpython3'), '-m', 'pip', 'install'] pip_install_args.extend(required_dev_packages) sphinx_build_path: str = os.path.join(ctx.venv_bin_dir(), mp.root_to_executable('sphinx-build')) ctx.register_program('sphinx-build', sphinx_build_path, override=True) return run_program(pip_install_args, cwd=ctx.calendon_home())
def cmd_register(ctx: ProjectContext, args: argparse.Namespace) -> int: """Registers a new program for use in the given context.""" if os.path.isfile(args.path) or args.force: if args.dry_run: if ctx.has_registered_program(args.alias) and not args.override: print(f'Trying to override {ctx.path_for_program(args.alias)} of {args.alias} with {args.path}') return 1 else: print(f'Would have added alias {args.alias} -> {args.path}') return 0 else: if ctx.register_program(args.alias, args.path, args.override): return 0 return 1 print(f'No program exists at {args.path}.') return 1