Coverage for .nox/test-3-12/lib/python3.12/site-packages/nskit/vcs/settings.py: 98%
44 statements
« prev ^ index » next coverage.py v7.3.3, created at 2023-12-19 17:42 +0000
« prev ^ index » next coverage.py v7.3.3, created at 2023-12-19 17:42 +0000
1"""Codebase Settings."""
2from __future__ import annotations
4import sys
5from typing import Optional
7if sys.version_info.major <= 3 and sys.version_info.minor <= 8:
8 from typing_extensions import Annotated
9else:
10 from typing import Annotated
12from pydantic import Field, field_validator, ValidationError
13from pydantic_settings import SettingsConfigDict
15from nskit._logging import logger_factory
16from nskit.common.configuration import BaseConfiguration
17from nskit.vcs.namespace_validator import ValidationEnum
18from nskit.vcs.providers import ProviderEnum
19from nskit.vcs.providers.abstract import VCSProviderSettings
20from nskit.vcs.repo import NamespaceValidationRepo
22logger = logger_factory.get_logger(__name__)
25class CodebaseSettings(BaseConfiguration):
26 """Codebase settings object."""
27 model_config = SettingsConfigDict(env_file='.env', env_prefix='NSKIT_VCS_CODEBASE_')
29 default_branch: str = 'main'
30 vcs_provider: Annotated[ProviderEnum, Field(validate_default=True)] = None
31 namespace_validation_repo: Optional[NamespaceValidationRepo] = None
32 validation_level: ValidationEnum = ValidationEnum.none
33 _provider_settings = None
35 @field_validator('vcs_provider', mode='before')
36 @classmethod
37 def _validate_vcs_provider(cls, value):
38 if value is None:
39 for provider in cls.model_fields['vcs_provider'].annotation:
40 logger.debug(f'Trying {provider.value}, last configured will be loaded.')
41 try:
42 if provider.extension:
43 provider.extension()
44 else:
45 raise ValueError('Extension not found')
46 # The last provider to correctly initialise will be used
47 logger.info(f'{provider.value} Configured.')
48 value = provider
49 except (ImportError, ValueError, ValidationError):
50 # This provider didn't work
51 logger.info(f'{provider.value} Not Configured.')
52 if cls.model_fields['vcs_provider'].annotation(value).extension is None:
53 raise ValueError('Extension Not Found')
54 return value
56 @property
57 def provider_settings(self) -> VCSProviderSettings:
58 """Get the instantiated provider settings."""
59 if self._provider_settings is None:
60 self._provider_settings = self.vcs_provider.extension()
61 return self._provider_settings