bundle.py 2.2 KB

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