session.py 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. from __future__ import annotations
  2. import json
  3. import logging
  4. LOGGER = logging.getLogger(__name__)
  5. class Session:
  6. """Represents a virtual environment creation session."""
  7. def __init__(self, verbosity, app_data, interpreter, creator, seeder, activators) -> None: # noqa: PLR0913
  8. self._verbosity = verbosity
  9. self._app_data = app_data
  10. self._interpreter = interpreter
  11. self._creator = creator
  12. self._seeder = seeder
  13. self._activators = activators
  14. @property
  15. def verbosity(self):
  16. """The verbosity of the run."""
  17. return self._verbosity
  18. @property
  19. def interpreter(self):
  20. """Create a virtual environment based on this reference interpreter."""
  21. return self._interpreter
  22. @property
  23. def creator(self):
  24. """The creator used to build the virtual environment (must be compatible with the interpreter)."""
  25. return self._creator
  26. @property
  27. def seeder(self):
  28. """The mechanism used to provide the seed packages (pip, setuptools, wheel)."""
  29. return self._seeder
  30. @property
  31. def activators(self):
  32. """Activators used to generate activations scripts."""
  33. return self._activators
  34. def run(self):
  35. self._create()
  36. self._seed()
  37. self._activate()
  38. self.creator.pyenv_cfg.write()
  39. def _create(self):
  40. LOGGER.info("create virtual environment via %s", self.creator)
  41. self.creator.run()
  42. LOGGER.debug(_DEBUG_MARKER)
  43. LOGGER.debug("%s", _Debug(self.creator))
  44. def _seed(self):
  45. if self.seeder is not None and self.seeder.enabled:
  46. LOGGER.info("add seed packages via %s", self.seeder)
  47. self.seeder.run(self.creator)
  48. def _activate(self):
  49. if self.activators:
  50. active = ", ".join(type(i).__name__.replace("Activator", "") for i in self.activators)
  51. LOGGER.info("add activators for %s", active)
  52. for activator in self.activators:
  53. activator.generate(self.creator)
  54. def __enter__(self):
  55. return self
  56. def __exit__(self, exc_type, exc_val, exc_tb):
  57. self._app_data.close()
  58. _DEBUG_MARKER = "=" * 30 + " target debug " + "=" * 30
  59. class _Debug:
  60. """lazily populate debug."""
  61. def __init__(self, creator) -> None:
  62. self.creator = creator
  63. def __repr__(self) -> str:
  64. return json.dumps(self.creator.debug, indent=2)
  65. __all__ = [
  66. "Session",
  67. ]