diff --git a/script/update-requirements b/script/update-requirements index 452fd5d..2b5bcbb 100755 --- a/script/update-requirements +++ b/script/update-requirements @@ -11,8 +11,9 @@ TARGETS = ('', 'dev', 'docs') # empty string is used for the base requirements FILE_HEADER = f'# DO NOT EDIT THIS FILE DIRECTLY - use {SCRIPT} to update\n' -def print_packages(packages, heading): +def print_packages(packages: list[str], heading: str, filename: str): print(f'{heading}:') + print(f'file={filename}:') print(' ', end='') print('\n '.join(packages)) @@ -30,6 +31,7 @@ def get_package_name() -> str: def run_command(command: str) -> tuple[str, str, int]: + print(f"running command: '{command}'") try: proc = subprocess.run( command.split(), @@ -39,45 +41,48 @@ def run_command(command: str) -> tuple[str, str, int]: timeout=30, ) except Exception as exc: - print(f"can't run command='{command}'") + print(f"can't run command: '{command}'") raise exc return proc.stdout.strip(), proc.stderr.strip(), proc.returncode -def save_base_reqs(our_package_name: str, tmpdir: str) -> list[str]: - print('installing base') +def filter_output(stdout: str, our_package_name: str) -> list[str]: + output = [*{*stdout.splitlines()}] # dedup items + output = [ + p for p in output if not p.startswith(our_package_name) + ] # remove our package - run_command(f'python3 -m venv {tmpdir}') - run_command(f'{tmpdir}/bin/pip install .') - stdout, _, _ = run_command(f'{tmpdir}/bin/pip freeze') - - frozen = [*{*stdout.splitlines()}] # dedup items - frozen = sorted([p for p in frozen if not p.startswith(our_package_name)]) + return output - print_packages(frozen, 'base-frozen') - Path('requirements.txt').write_text( - FILE_HEADER + '\n'.join(frozen) + '\n', encoding='utf8' +def freeze_reqs(our_package_name: str, tmpdir: str, target: str) -> None: + target_selector = '.' if target == '' else f'.[{target}]' + target_file = ( + 'requirements.txt' if target == '' else f'requirements-{target}.txt' ) - return frozen + print(f"installing selector: '{target_selector}'") + run_command(f'python3 -m venv {tmpdir}') -def save_extra_reqs( - our_package_name: str, tmpdir: str, base_frozen: list[str], extra: str -) -> None: - print(f'installing extra: {extra}') + base_reqs: list[str] = [] + if target != '': + # get base deps for extras + run_command(f'{tmpdir}/bin/pip install .') + _stdout, _, _ = run_command(f'{tmpdir}/bin/pip freeze') + base_reqs = filter_output(_stdout, our_package_name) - run_command(f'{tmpdir}/bin/pip install .[{extra}]') - stdout, _, _ = run_command(f'{tmpdir}/bin/pip freeze') + run_command(f'{tmpdir}/bin/pip install {target_selector}') + _stdout, _, _ = run_command(f'{tmpdir}/bin/pip freeze') + frozen = filter_output(_stdout, our_package_name) # - frozen = [*{*stdout.splitlines()} - {*base_frozen}] # remove base deps - frozen = sorted([p for p in frozen if not p.startswith(our_package_name)]) + # remove base deps from extras + frozen = sorted([*{*frozen} - {*base_reqs}]) - print_packages(frozen, f'{extra}-frozen') + print_packages(frozen, f'frozen: {target_selector}', target_file) - Path(f'requirements-{extra}.txt').write_text( + Path(target_file).write_text( FILE_HEADER + '\n'.join(frozen) + '\n', encoding='utf8' ) @@ -88,11 +93,8 @@ def main() -> None: # install all extra dependencies in a new venv, so we don't get duplicate/unwanted deps for target in TARGETS: with TemporaryDirectory() as tmpdir: - print(f'using tmpdir={tmpdir}') - base_frozen = save_base_reqs(our_package_name, tmpdir) - if not target: - continue # skip extra requirements for base package - save_extra_reqs(our_package_name, tmpdir, base_frozen, target) + print(f"using tmpdir: '{tmpdir}'") + freeze_reqs(our_package_name, tmpdir, target) if __name__ == '__main__':