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

1"""Codebase Settings.""" 

2from __future__ import annotations 

3 

4import sys 

5from typing import Optional 

6 

7if sys.version_info.major <= 3 and sys.version_info.minor <= 8: 

8 from typing_extensions import Annotated 

9else: 

10 from typing import Annotated 

11 

12from pydantic import Field, field_validator, ValidationError 

13from pydantic_settings import SettingsConfigDict 

14 

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 

21 

22logger = logger_factory.get_logger(__name__) 

23 

24 

25class CodebaseSettings(BaseConfiguration): 

26 """Codebase settings object.""" 

27 model_config = SettingsConfigDict(env_file='.env', env_prefix='NSKIT_VCS_CODEBASE_') 

28 

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 

34 

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 

55 

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