in bowler/main.py [0:0]
def run(codemod: str, argv: List[str]) -> None:
"""
Execute a file-based code modification.
Takes either a path to a python script, or an importable module name, and attempts
to import and run a "main()" function from that script/module if found.
Extra arguments to this command will be supplied to the script/module.
Use `--` to forcibly pass through all following options or arguments.
"""
try:
original_argv = sys.argv[1:]
sys.argv[1:] = argv
path = Path(codemod)
if path.exists():
if path.is_dir():
raise click.ClickException("running directories not supported")
spec = importlib.util.spec_from_file_location( # type: ignore
path.name, path
)
module = importlib.util.module_from_spec(spec)
spec.loader.exec_module(module) # type: ignore
else:
module = importlib.import_module(codemod)
main = getattr(module, "main", None)
if main is not None:
main()
except ImportError as e:
raise click.ClickException(f"failed to import codemod: {e}") from e
finally:
sys.argv[1:] = original_argv