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

1"""Codebase Settings.""" 

2from __future__ import annotations 

3 

4from pathlib import Path 

5import sys 

6from typing import Optional, Union 

7 

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

9 from typing_extensions import Annotated 

10else: 

11 from typing import Annotated 

12 

13from pydantic import Field, field_validator, model_validator, ValidationError 

14 

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 

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_', dotenv_extra='ignore') 

28 

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 

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 @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 

66 

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