Bases: BaseService
A service class for Python-related operations.
This class provides methods for managing Python virtual environments and dependencies.
The constructor for the PythonService class.
It initializes package managers for dependency management.
Source code in dev_tool/services/python/service.py
| def __init__(self) -> None:
"""
The constructor for the PythonService class.
It initializes package managers for dependency management.
"""
super().__init__()
self.container_manager = ContainerPackageManager()
self.resolver = DependencyResolver()
self.manager, self.fallback = PackageManagerFactory.create_package_manager()
if sys.platform == OperatingSystem.WINDOWS:
EnvironmentVariables.refresh_environment()
|
A method that removes an existing virtual environment.
Source code in dev_tool/services/python/service.py
| def clean_virtual_environment(self) -> None:
"""A method that removes an existing virtual environment."""
if self._is_containerized():
message = 'Skipping virtual environment cleanup in containerized mode.'
self.notification.normal_text(message)
log.debug(message)
return
message = 'Cleaning virtual environment...'
self.notification.normal_text(message)
if VENV.exists():
self._remove_directory(VENV)
message = f'Removed virtual environment at {VENV}'
self.notification.normal_text(message)
else:
message = f'No virtual environment found at {VENV}'
self.notification.warning_banner(message)
log.debug(message)
|
A method that creates a Python virtual environment.
Source code in dev_tool/services/python/service.py
| def create_virtual_environment(self) -> None:
"""A method that creates a Python virtual environment."""
if self._is_containerized():
message = 'Skipping virtual environment creation in containerized mode.'
self.notification.normal_text(message)
log.debug(message)
return
message = 'Setting up virtual environment...'
self.notification.normal_text(message)
self.install_package_manager()
if not self.manager.create_virtual_environment():
message = 'Failed to create virtual environment with preferred manager, falling back...'
self.notification.warning_text(message)
log.debug(message)
if not self.fallback.create_virtual_environment():
message = 'Failed to create virtual environment with any package manager'
log.debug(message)
raise VirtualEnvironmentError(message)
|
A method that lists all available dependency sources.
This method discovers and returns information about all available
dependency sources including requirements files and pyproject.toml extras.
Returns:
-
dict[str, list[str]]
–
A dictionary mapping source types to available sources.
Source code in dev_tool/services/python/service.py
| def get_available_dependencies(self) -> dict[str, list[str]]:
"""
A method that lists all available dependency sources.
This method discovers and returns information about all available
dependency sources including requirements files and pyproject.toml extras.
:return: A dictionary mapping source types to available sources.
"""
sources = self.resolver.discover_sources()
result: dict[str, list[str]] = {}
for source in sources:
source_type = source.source.value
if source_type not in result:
result[source_type] = []
result[source_type].append(source.name)
return result
|
A method that installs dependencies based on selected sources.
Parameters:
-
types
(list[str] | None, default:
None
)
–
Optional list of dependency types to install.
Source code in dev_tool/services/python/service.py
| @is_virtual_environment
def install_dependencies(self, types: list[str] | None = None) -> None:
"""
A method that installs dependencies based on selected sources.
:param types: Optional list of dependency types to install.
"""
sources = self.resolver.discover_sources()
if not sources:
message = 'No dependency sources found'
self.notification.warning_text(message)
log.debug(message)
return
selected = self._select_sources(sources, types)
if not selected:
return
if self._is_containerized():
self.container_manager.install_dependencies(selected)
return
for source in selected:
self._install_source(source)
|
A method that installs a Python package.
It requires a virtual environment to be active or containerized mode.
Source code in dev_tool/services/python/service.py
| @is_virtual_environment
def install_package(self) -> None:
"""
A method that installs a Python package.
It requires a virtual environment to be active or containerized mode.
"""
package = get_user_input('Which package do you want to install?')
if not package:
message = 'No package specified. Aborting...'
self.notification.warning_text(message)
log.debug(message)
return
if self._is_containerized():
if not self.container_manager.install_package(package):
message = f'Failed to install package "{package}"'
log.debug(message)
raise DependencyInstallationError(message)
message = f'The {package} package installed successfully.'
self.notification.normal_text(message)
log.debug(message)
return
self.install_package_manager()
if not self.manager.install_package(package):
message = 'Failed to install package with preferred manager, falling back...'
self.notification.warning_text(message)
log.debug(message)
if not self.fallback.install_package(package):
message = f'Failed to install package "{package}" with any package manager'
log.debug(message)
raise DependencyInstallationError(message)
message = f'The {package} package installed successfully.'
self.notification.normal_text(message)
log.debug(message)
|
A method that installs the preferred package manager.
It falls back to an alternative if the preferred manager cannot be installed.
Source code in dev_tool/services/python/service.py
| def install_package_manager(self) -> bool:
"""
A method that installs the preferred package manager.
It falls back to an alternative if the preferred manager cannot be installed.
"""
if self._is_containerized():
message = 'Package manager already available in container.'
self.notification.normal_text(message)
log.debug(message)
return True
if self.manager is None or self.fallback is None:
message = 'Package managers not initialized'
self.notification.error_banner(message)
log.debug(message)
return False
if self.manager.is_available():
message = 'uv is already installed.'
self.notification.normal_text(message)
log.debug(message)
return True
if not self.manager.install_package_manager():
message = 'Failed to install preferred package manager, falling back...'
self.notification.warning_text(message)
log.debug(message)
if not self.fallback.install_package_manager():
message = 'Failed to install any package manager'
log.debug(message)
raise PackageManagerError(message)
return False
|
A method that sets up a complete virtual environment.
Creates a virtual environment if needed, upgrades the package manager,
and installs all dependencies.
Parameters:
-
types
(list[str] | None, default:
None
)
–
Optional list of dependency types to install.
Source code in dev_tool/services/python/service.py
| def setup_venv(self, types: list[str] | None = None) -> None:
"""
A method that sets up a complete virtual environment.
Creates a virtual environment if needed, upgrades the package manager,
and installs all dependencies.
:param types: Optional list of dependency types to install.
"""
if self._is_containerized():
message = 'Skipping virtual environment setup in containerized mode.'
self.notification.normal_text(message)
log.debug(message)
return
if not VENV.exists():
self.create_virtual_environment()
self.upgrade_package_manager()
self.install_dependencies(types=types)
|
A method that uninstalls a Python package.
It requires a virtual environment to be active or containerized mode.
Source code in dev_tool/services/python/service.py
| @is_virtual_environment
def uninstall_dependencies(self) -> None:
"""
A method that uninstalls a Python package.
It requires a virtual environment to be active or containerized mode.
"""
package = get_user_input('Which package do you want to uninstall?')
if not package:
message = 'No package specified. Aborting...'
self.notification.warning_text(message)
log.debug(message)
return
if self._is_containerized():
installed = self.container_manager.list_packages()
if package.lower() not in installed:
message = f'The "{package}" package is not installed.'
self.notification.warning_text(message)
log.debug(message)
return
if not self.container_manager.uninstall_package(package):
message = f'Failed to uninstall package "{package}"'
log.debug(message)
raise PackageUninstallationError(message)
message = f'The {package} package uninstalled successfully.'
self.notification.normal_text(message)
log.debug(message)
return
self.install_package_manager()
installed = self.manager.list_installed_packages()
if not installed:
installed = self.fallback.list_installed_packages()
if package not in installed:
message = f'The "{package}" package is not installed.'
self.notification.warning_text(message)
log.debug(message)
return
if not self.manager.uninstall_package(package):
message = 'Failed to uninstall package with preferred manager, falling back...'
self.notification.warning_text(message)
log.debug(message)
if not self.fallback.uninstall_package(package):
message = f'Failed to uninstall package "{package}" with any package manager'
log.debug(message)
raise PackageUninstallationError(message)
message = f'The {package} package uninstalled successfully.'
self.notification.normal_text(message)
log.debug(message)
|
A method that upgrades the package manager to the latest version.
It requires a virtual environment to be active or containerized mode.
Source code in dev_tool/services/python/service.py
| @is_virtual_environment
def upgrade_package_manager(self) -> None:
"""
A method that upgrades the package manager to the latest version.
It requires a virtual environment to be active or containerized mode.
"""
if self._is_containerized():
message = 'Package manager is managed by container image.'
self.notification.normal_text(message)
log.debug(message)
return
if not self.manager.upgrade_package_manager():
message = 'Failed to upgrade package manager with preferred manager, falling back...'
self.notification.warning_text(message)
log.debug(message)
if not self.fallback.upgrade_package_manager():
message = 'Failed to upgrade any package manager'
log.debug(message)
raise PackageManagerError(message)
|