Hide keyboard shortcuts

Hot-keys on this page

r m x p   toggle line displays

j k   next/prev highlighted chunk

0   (zero) top of page

1   (one) first highlighted chunk

1import locale as pylocale 

2import logging 

3import sys 

4 

5from importlib import import_module 

6 

7from faker.config import AVAILABLE_LOCALES, DEFAULT_LOCALE, PROVIDERS 

8from faker.generator import Generator 

9from faker.utils.loading import list_module 

10 

11logger = logging.getLogger(__name__) 

12 

13# identify if python is being run in interactive mode. If so, disable logging. 

14inREPL = bool(getattr(sys, 'ps1', False)) 

15if inREPL: 

16 logger.setLevel(logging.CRITICAL) 

17else: 

18 logger.debug('Not in REPL -> leaving logger event level as is.') 

19 

20 

21class Factory: 

22 

23 @classmethod 

24 def create( 

25 cls, 

26 locale=None, 

27 providers=None, 

28 generator=None, 

29 includes=None, 

30 **config): 

31 if includes is None: 

32 includes = [] 

33 

34 # fix locale to package name 

35 locale = locale.replace('-', '_') if locale else DEFAULT_LOCALE 

36 locale = pylocale.normalize(locale).split('.')[0] 

37 if locale not in AVAILABLE_LOCALES: 

38 msg = 'Invalid configuration for faker locale `{}`'.format(locale) 

39 raise AttributeError(msg) 

40 

41 config['locale'] = locale 

42 providers = providers or PROVIDERS 

43 

44 providers += includes 

45 

46 faker = generator or Generator(**config) 

47 

48 for prov_name in providers: 

49 if prov_name == 'faker.providers': 

50 continue 

51 

52 prov_cls, lang_found = cls._get_provider_class(prov_name, locale) 

53 provider = prov_cls(faker) 

54 provider.__provider__ = prov_name 

55 provider.__lang__ = lang_found 

56 faker.add_provider(provider) 

57 

58 return faker 

59 

60 @classmethod 

61 def _get_provider_class(cls, provider, locale=''): 

62 

63 provider_class = cls._find_provider_class(provider, locale) 

64 

65 if provider_class: 

66 return provider_class, locale 

67 

68 if locale and locale != DEFAULT_LOCALE: 

69 # fallback to default locale 

70 provider_class = cls._find_provider_class(provider, DEFAULT_LOCALE) 

71 if provider_class: 

72 return provider_class, DEFAULT_LOCALE 

73 

74 # fallback to no locale 

75 provider_class = cls._find_provider_class(provider) 

76 if provider_class: 

77 return provider_class, None 

78 

79 msg = 'Unable to find provider `{}` with locale `{}`'.format( 

80 provider, locale) 

81 raise ValueError(msg) 

82 

83 @classmethod 

84 def _find_provider_class(cls, provider_path, locale=None): 

85 

86 provider_module = import_module(provider_path) 

87 

88 if getattr(provider_module, 'localized', False): 

89 

90 logger.debug('Looking for locale `{}` in provider `{}`.'.format( 

91 locale, provider_module.__name__)) 

92 

93 available_locales = list_module(provider_module) 

94 if not locale or locale not in available_locales: 

95 unavailable_locale = locale 

96 locale = getattr( 

97 provider_module, 'default_locale', DEFAULT_LOCALE) 

98 logger.debug('Specified locale `{}` is not available for ' 

99 'provider `{}`. Locale reset to `{}` for this ' 

100 'provider.'.format( 

101 unavailable_locale, provider_module.__name__, locale), 

102 ) 

103 else: 

104 logger.debug('Provider `{}` has been localized to `{}`.'.format( 

105 provider_module.__name__, locale)) 

106 

107 path = "{provider_path}.{locale}".format( 

108 provider_path=provider_path, 

109 locale=locale, 

110 ) 

111 provider_module = import_module(path) 

112 

113 else: 

114 

115 logger.debug('Provider `{}` does not feature localization. ' 

116 'Specified locale `{}` is not utilized for this ' 

117 'provider.'.format( 

118 provider_module.__name__, locale), 

119 ) 

120 

121 if locale is not None: 

122 provider_module = import_module(provider_path) 

123 

124 return provider_module.Provider