codekingpro/portable-devtools
114k
1from __future__ import annotations2 3import json4import logging5 6 7class Session:8 """Represents a virtual environment creation session."""9 10 def __init__(self, verbosity, app_data, interpreter, creator, seeder, activators) -> None: # noqa: PLR091311 self._verbosity = verbosity12 self._app_data = app_data13 self._interpreter = interpreter14 self._creator = creator15 self._seeder = seeder16 self._activators = activators17 18 @property19 def verbosity(self):20 """The verbosity of the run."""21 return self._verbosity22 23 @property24 def interpreter(self):25 """Create a virtual environment based on this reference interpreter."""26 return self._interpreter27 28 @property29 def creator(self):30 """The creator used to build the virtual environment (must be compatible with the interpreter)."""31 return self._creator32 33 @property34 def seeder(self):35 """The mechanism used to provide the seed packages (pip, setuptools, wheel)."""36 return self._seeder37 38 @property39 def activators(self):40 """Activators used to generate activations scripts."""41 return self._activators42 43 def run(self):44 self._create()45 self._seed()46 self._activate()47 self.creator.pyenv_cfg.write()48 49 def _create(self):50 logging.info("create virtual environment via %s", self.creator)51 self.creator.run()52 logging.debug(_DEBUG_MARKER)53 logging.debug("%s", _Debug(self.creator))54 55 def _seed(self):56 if self.seeder is not None and self.seeder.enabled:57 logging.info("add seed packages via %s", self.seeder)58 self.seeder.run(self.creator)59 60 def _activate(self):61 if self.activators:62 active = ", ".join(type(i).__name__.replace("Activator", "") for i in self.activators)63 logging.info("add activators for %s", active)64 for activator in self.activators:65 activator.generate(self.creator)66 67 def __enter__(self):68 return self69 70 def __exit__(self, exc_type, exc_val, exc_tb):71 self._app_data.close()72 73 74_DEBUG_MARKER = "=" * 30 + " target debug " + "=" * 3075 76 77class _Debug:78 """lazily populate debug."""79 80 def __init__(self, creator) -> None:81 self.creator = creator82 83 def __repr__(self) -> str:84 return json.dumps(self.creator.debug, indent=2)85 86 87__all__ = [88 "Session",89]90 