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
« 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
5from .json_provider import JsonProvider
8@dataclass(slots=True)
9class InUseProvider:
10 provider: JsonProvider
11 locks: int
14@dataclass
15class ProviderFactory:
16 directory: Path
17 fallback_locale: str = "en-US"
18 filename_format = "{locale}.{format}"
20 _store: dict[str, InUseProvider] = field(default_factory=dict)
22 @property
23 def fallback_file(self) -> Path:
24 return self.directory / self.filename_format.format(locale=self.fallback_locale, format="json")
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"))]
30 def _load(self, locale: str) -> JsonProvider:
31 filename = self.filename_format.format(locale=locale, format="json")
32 path = self.directory / filename
34 return JsonProvider(path) if path.exists() else JsonProvider(self.fallback_file)
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]
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)
48 return self._store[locale].provider