pyproject_to_requirements.py
1 import argparse 2 import re 3 import sys 4 from pathlib import Path 5 6 import toml 7 8 matcher = re.compile(r"farm-haystack\[(.+)\]") 9 parser = argparse.ArgumentParser( 10 prog="pyproject_to_requirements.py", description="Convert pyproject.toml to requirements.txt" 11 ) 12 parser.add_argument("pyproject_path") 13 parser.add_argument("--extra", default="") 14 15 16 def resolve(target: str, extras: dict, results: set) -> None: 17 """ 18 Resolve the dependencies for a given target. 19 """ 20 if target not in extras: 21 results.add(target) 22 return 23 24 for t in extras[target]: 25 m = matcher.match(t) 26 if m: 27 for i in m.group(1).split(","): 28 resolve(i, extras, results) 29 else: 30 resolve(t, extras, results) 31 32 33 def main(pyproject_path: Path, extra: str = "") -> None: 34 """ 35 Convert a pyproject.toml file to a requirements.txt file. 36 """ 37 content = toml.load(pyproject_path) 38 # basic set of dependencies 39 deps = set(content["project"]["dependencies"]) 40 41 if extra: 42 extras = content["project"]["optional-dependencies"] 43 resolve(extra, extras, deps) 44 45 sys.stdout.write("\n".join(sorted(deps))) 46 sys.stdout.write("\n") 47 48 49 if __name__ == "__main__": 50 args = parser.parse_args() 51 pyproject_path = Path(args.pyproject_path).absolute() 52 53 main(pyproject_path, args.extra)