Coverage for pipxl/compile.py: 100%
23 statements
« prev ^ index » next coverage.py v6.5.0, created at 2022-11-28 21:27 +0100
« prev ^ index » next coverage.py v6.5.0, created at 2022-11-28 21:27 +0100
1# SPDX-FileCopyrightText: 2022-present Jeroen van Zundert <mail@jeroenvanzundert.nl>
2#
3# SPDX-License-Identifier: MIT
5from __future__ import annotations
7from pathlib import Path
9from pipxl.__about__ import __version__
10from pipxl.data import Environment, ReqFileEntry
11from pipxl.resolver import pip_resolve
14def compile(
15 files_in: list[Path] | None = None,
16 package_spec: list[str] | None = None,
17 file_out: Path = Path("."),
18) -> None:
19 reqs, env = pip_resolve(files_in, package_spec)
21 # for packages specified in the target(s), we do not have a specifier. We add the files. We do not add
22 # the package_spec.
23 if (files_in is not None) and len(files_in):
24 target_str = " ".join([f"-r {p}" for p in files_in])
25 for r in reqs:
26 if r.requested:
27 r.required_by = {target_str: ""} | r.required_by
29 text = _format_file(reqs, env)
30 with file_out.open("w") as fp:
31 fp.write(text)
34def _format_file(reqs: list[ReqFileEntry], env: Environment) -> str:
35 out = f"""# This file has been generated by pipxl {__version__}
36#
37# Environment at time of generation:
38"""
39 for name, val in env.__dict__.items():
40 out += f"#\t{name}: {val}\n"
42 out += "#\n\n"
44 out += "\n".join([req.to_string() for req in reqs])
45 out += "\n"
47 return out