Coverage for /var/srv/projects/api.amasfac.comuna18.com/tmp/venv/lib/python3.9/site-packages/faker/factory.py: 88%
56 statements
« prev ^ index » next coverage.py v6.4.4, created at 2023-07-17 14:22 -0600
« prev ^ index » next coverage.py v6.4.4, created at 2023-07-17 14:22 -0600
1import locale as pylocale
2import logging
3import sys
5from importlib import import_module
6from typing import Any, List, Optional, Tuple
8from .config import AVAILABLE_LOCALES, DEFAULT_LOCALE, PROVIDERS
9from .generator import Generator
10from .utils.loading import list_module
12logger = logging.getLogger(__name__)
14# identify if python is being run in interactive mode. If so, disable logging.
15inREPL = bool(getattr(sys, "ps1", False))
16if inREPL: 16 ↛ 17line 16 didn't jump to line 17, because the condition on line 16 was never true
17 logger.setLevel(logging.CRITICAL)
18else:
19 logger.debug("Not in REPL -> leaving logger event level as is.")
22class Factory:
23 @classmethod
24 def create(
25 cls,
26 locale: Optional[str] = None,
27 providers: Optional[List[str]] = None,
28 generator: Optional[Generator] = None,
29 includes: Optional[List[str]] = None,
30 # Should we use weightings (more realistic) or weight every element equally (faster)?
31 # By default, use weightings for backwards compatibility & realism
32 use_weighting: bool = True,
33 **config: Any,
34 ) -> Generator:
35 if includes is None: 35 ↛ 39line 35 didn't jump to line 39, because the condition on line 35 was never false
36 includes = []
38 # fix locale to package name
39 locale = locale.replace("-", "_") if locale else DEFAULT_LOCALE
40 locale = pylocale.normalize(locale).split(".")[0]
41 if locale not in AVAILABLE_LOCALES: 41 ↛ 42line 41 didn't jump to line 42, because the condition on line 41 was never true
42 msg = f"Invalid configuration for faker locale `{locale}`"
43 raise AttributeError(msg)
45 config["locale"] = locale
46 config["use_weighting"] = use_weighting
47 providers = providers or PROVIDERS
49 providers += includes
51 faker = generator or Generator(**config)
53 for prov_name in providers:
54 if prov_name == "faker.providers": 54 ↛ 55line 54 didn't jump to line 55, because the condition on line 54 was never true
55 continue
57 prov_cls, lang_found, _ = cls._find_provider_class(prov_name, locale)
58 provider = prov_cls(faker)
59 provider.__use_weighting__ = use_weighting
60 provider.__provider__ = prov_name
61 provider.__lang__ = lang_found
62 faker.add_provider(provider)
64 return faker
66 @classmethod
67 def _find_provider_class(
68 cls,
69 provider_path: str,
70 locale: Optional[str] = None,
71 ) -> Tuple[Any, Optional[str], Optional[str]]:
73 provider_module = import_module(provider_path)
74 default_locale = getattr(provider_module, "default_locale", "")
76 if getattr(provider_module, "localized", False):
78 logger.debug(
79 "Looking for locale `%s` in provider `%s`.",
80 locale,
81 provider_module.__name__,
82 )
84 available_locales = list_module(provider_module)
85 if not locale or locale not in available_locales:
86 unavailable_locale = locale
87 locale = default_locale or DEFAULT_LOCALE
88 logger.debug(
89 "Specified locale `%s` is not available for "
90 "provider `%s`. Locale reset to `%s` for this "
91 "provider.",
92 unavailable_locale,
93 provider_module.__name__,
94 locale,
95 )
96 else:
97 logger.debug(
98 "Provider `%s` has been localized to `%s`.",
99 provider_module.__name__,
100 locale,
101 )
103 path = f"{provider_path}.{locale}"
104 provider_module = import_module(path)
106 else:
108 if locale: 108 ↛ 116line 108 didn't jump to line 116, because the condition on line 108 was never false
109 logger.debug(
110 "Provider `%s` does not feature localization. "
111 "Specified locale `%s` is not utilized for this "
112 "provider.",
113 provider_module.__name__,
114 locale,
115 )
116 locale = default_locale = None
118 return provider_module.Provider, locale, default_locale # type: ignore