/ .github / utils / pyproject_to_requirements.py
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)