Coverage for opt/mealie/lib/python3.12/site-packages/mealie/pkgs/i18n/provider_factory.py: 78%

34 statements  

« prev     ^ index     » next       coverage.py v7.15.2, created at 2026-10-07 03:04 +0000

1from dataclasses import dataclass, field 

2from functools import cached_property 

3from pathlib import Path 

4 

5from .json_provider import JsonProvider 

6 

7 

8@dataclass(slots=True) 

9class InUseProvider: 

10 provider: JsonProvider 

11 locks: int 

12 

13 

14@dataclass 

15class ProviderFactory: 

16 directory: Path 

17 fallback_locale: str = "en-US" 

18 filename_format = "{locale}.{format}" 

19 

20 _store: dict[str, InUseProvider] = field(default_factory=dict) 

21 

22 @property 

23 def fallback_file(self) -> Path: 

24 return self.directory / self.filename_format.format(locale=self.fallback_locale, format="json") 

25 

26 @cached_property 

27 def supported_locales(self) -> list[str]: 

28 return [path.stem for path in self.directory.glob(self.filename_format.format(locale="*", format="json"))] 

29 

30 def _load(self, locale: str) -> JsonProvider: 

31 filename = self.filename_format.format(locale=locale, format="json") 

32 path = self.directory / filename 

33 

34 return JsonProvider(path) if path.exists() else JsonProvider(self.fallback_file) 

35 

36 def release(self, locale) -> None: 

37 if locale in self._store: 

38 self._store[locale].locks -= 1 

39 if self._store[locale].locks == 0: 

40 del self._store[locale] 

41 

42 def get(self, locale: str) -> JsonProvider: 

43 if locale in self._store: 

44 self._store[locale].locks += 1 

45 else: 

46 self._store[locale] = InUseProvider(provider=self._load(locale), locks=1) 

47 

48 return self._store[locale].provider