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