Advertisement
cooperlees

Untitled

Jun 7th, 2018
411
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.82 KB | None | 0 0
  1. #!/tmp/deps_calc/bin/python3
  2.  
  3. import json
  4. import re
  5.  
  6. from typing import Dict, List
  7.  
  8. from poetry.packages import Dependency
  9. from poetry.packages import ProjectPackage
  10. from poetry.puzzle import Solver
  11. from poetry.repositories.repository import Repository
  12. from poetry.semver import parse_constraint
  13.  
  14.  
  15. def determine_requirements(requires: List) -> List:
  16.     if not requires:
  17.         return []
  18.  
  19.     requires = parse_name_version_pairs(requires)
  20.     result = []
  21.     for requirement in requires:
  22.         if "version" not in requirement:
  23.             requirement["version"] = "*"
  24.  
  25.         result.append("{} {}".format(requirement["name"],
  26.                                      requirement["version"]))
  27.  
  28.     return result
  29.  
  30.  
  31. def parse_name_version_pairs(pairs: List) -> List:
  32.     result = []
  33.  
  34.     for i in range(len(pairs)):
  35.         pair = re.sub("^([^=: ]+)[=: ](.*)$", "\\1 \\2", pairs[i].strip())
  36.         pair = pair.strip()
  37.  
  38.         if " " in pair:
  39.             name, version = pair.split(" ", 2)
  40.             result.append({"name": name, "version": version})
  41.         else:
  42.             result.append({"name": pair})
  43.  
  44.     return result
  45.  
  46.  
  47. def format_requirements(requirements: List) -> Dict:
  48.     requires = {}
  49.     requirements = parse_name_version_pairs(requirements)
  50.     for requirement in requirements:
  51.         requires[requirement["name"]] = requirement["version"]
  52.  
  53.     return requires
  54.  
  55.  
  56. def resolve_package_deps(
  57.     packages: List[str],
  58.     extras_wanted: List[str],
  59.     py_version: str,
  60. ) -> Dict:
  61.     req_list = determine_requirements(packages)
  62.     requirements = format_requirements(req_list)
  63.  
  64.     # validate requirements format
  65.     for constraint in requirements.values():
  66.         parse_constraint(constraint)
  67.  
  68.     dependencies = []
  69.     for name, constraint in requirements.items():
  70.         dep = Dependency(name, constraint)
  71.         if extras_wanted:
  72.             extras: List[str] = []
  73.             for extra in extras_wanted:
  74.                 if " " in extra:
  75.                     extras += [e.strip() for e in extra.split(" ")]
  76.                 else:
  77.                     extras.append(extra)
  78.  
  79.             for ex in extras:
  80.                 dep.extras.append(ex)
  81.  
  82.         dependencies.append(dep)
  83.  
  84.     # TODO: Work out what these need to be
  85.     package = ProjectPackage("fake-resolve", "69")
  86.  
  87.     package.python_versions = (py_version)
  88.     for dep in dependencies:
  89.         package.requires.append(dep)
  90.  
  91.     # TODO: Create a pool
  92.     solver = Solver(package, poetry.pool, Repository(), Repository(), output)
  93.     ops = solver.solve()
  94.     pkgs: Dict = {}
  95.     for op in ops:
  96.         package = op.package
  97.         pkgs[package.name] = package.version
  98.  
  99.     return pkgs
  100.  
  101.  
  102. if __name__ == '__main__':
  103.     deps = resolve_package_deps(["peerme"], [], "~3.6")
  104.     json.dumps(deps, sort_keys=True, indent=4)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement