Coverage for .nox/test-3-9/lib/python3.9/site-packages/nskit/vcs/settings.py: 98%
51 statements
« prev ^ index » next coverage.py v7.4.2, created at 2024-02-25 17:38 +0000
« prev ^ index » next coverage.py v7.4.2, created at 2024-02-25 17:38 +0000
1"""Codebase Settings."""
2from __future__ import annotations
4from pathlib import Path
5import sys
6from typing import Optional, Union
8if sys.version_info.major <= 3 and sys.version_info.minor <= 8:
9 from typing_extensions import Annotated
10else:
11 from typing import Annotated
13from pydantic import Field, field_validator, model_validator, ValidationError
15from nskit._logging import logger_factory
16from nskit.common.configuration import BaseConfiguration, SettingsConfigDict
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_', dotenv_extra='ignore')
29 default_branch: str = 'main'
30 vcs_provider: Annotated[ProviderEnum, Field(validate_default=True)] = None
31 namespace_validation_repo: Optional[Union[NamespaceValidationRepo, str]] = 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 @model_validator(mode='after')
57 def _validate_namespace_validation_repo_default(self):
58 if self.namespace_validation_repo is None and Path('.namespaces').exists():
59 # Can we handle the root pathing
60 self.namespace_validation_repo = '.namespaces'
61 if isinstance(self.namespace_validation_repo, str):
62 self.namespace_validation_repo = NamespaceValidationRepo(name=self.namespace_validation_repo,
63 local_dir=Path(self.namespace_validation_repo),
64 provider_client=self.provider_settings.repo_client)
65 return self
67 @property
68 def provider_settings(self) -> VCSProviderSettings:
69 """Get the instantiated provider settings."""
70 if self._provider_settings is None:
71 self._provider_settings = self.vcs_provider.extension()
72 return self._provider_settings