Browse Source

simplify script/update-requirements

Signed-off-by: Ivan Schaller <ivan@schaller.sh>
pull/1261/head
Ivan Schaller 6 months ago
parent
commit
4045f7d229
1 changed files with 31 additions and 29 deletions
  1. +31
    -29
      script/update-requirements

+ 31
- 29
script/update-requirements View File

@ -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__':


Loading…
Cancel
Save