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

1import locale as pylocale 

2import logging 

3import sys 

4 

5from importlib import import_module 

6from typing import Any, List, Optional, Tuple 

7 

8from .config import AVAILABLE_LOCALES, DEFAULT_LOCALE, PROVIDERS 

9from .generator import Generator 

10from .utils.loading import list_module 

11 

12logger = logging.getLogger(__name__) 

13 

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.") 

20 

21 

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 = [] 

37 

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) 

44 

45 config["locale"] = locale 

46 config["use_weighting"] = use_weighting 

47 providers = providers or PROVIDERS 

48 

49 providers += includes 

50 

51 faker = generator or Generator(**config) 

52 

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 

56 

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) 

63 

64 return faker 

65 

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]]: 

72 

73 provider_module = import_module(provider_path) 

74 default_locale = getattr(provider_module, "default_locale", "") 

75 

76 if getattr(provider_module, "localized", False): 

77 

78 logger.debug( 

79 "Looking for locale `%s` in provider `%s`.", 

80 locale, 

81 provider_module.__name__, 

82 ) 

83 

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 ) 

102 

103 path = f"{provider_path}.{locale}" 

104 provider_module = import_module(path) 

105 

106 else: 

107 

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 

117 

118 return provider_module.Provider, locale, default_locale # type: ignore