bundle.py 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. from __future__ import annotations
  2. from virtualenv.seed.wheels.embed import get_embed_wheel
  3. from .periodic_update import periodic_update
  4. from .util import Version, Wheel, discover_wheels
  5. def from_bundle(distribution, version, for_py_version, search_dirs, app_data, do_periodic_update, env): # noqa: PLR0913
  6. """Load the bundled wheel to a cache directory."""
  7. of_version = Version.of_version(version)
  8. wheel = load_embed_wheel(app_data, distribution, for_py_version, of_version)
  9. if version != Version.embed:
  10. # 2. check if we have upgraded embed
  11. if app_data.can_update:
  12. per = do_periodic_update
  13. wheel = periodic_update(distribution, of_version, for_py_version, wheel, search_dirs, app_data, per, env)
  14. # 3. acquire from extra search dir
  15. found_wheel = from_dir(distribution, of_version, for_py_version, search_dirs)
  16. if found_wheel is not None and (wheel is None or found_wheel.version_tuple > wheel.version_tuple):
  17. wheel = found_wheel
  18. return wheel
  19. def load_embed_wheel(app_data, distribution, for_py_version, version):
  20. wheel = get_embed_wheel(distribution, for_py_version)
  21. if wheel is not None:
  22. version_match = version == wheel.version
  23. if version is None or version_match:
  24. with app_data.ensure_extracted(wheel.path, lambda: app_data.house) as wheel_path:
  25. wheel = Wheel(wheel_path)
  26. else: # if version does not match ignore
  27. wheel = None
  28. return wheel
  29. def from_dir(distribution, version, for_py_version, directories):
  30. """Load a compatible wheel from a given folder."""
  31. for folder in directories:
  32. for wheel in discover_wheels(folder, distribution, version, for_py_version):
  33. return wheel
  34. return None
  35. __all__ = [
  36. "from_bundle",
  37. "load_embed_wheel",
  38. ]