Coverage for /home/martinb/.local/share/virtualenvs/camcops/lib/python3.6/site-packages/faker/factory.py : 53%

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
5from importlib import import_module
7from faker.config import AVAILABLE_LOCALES, DEFAULT_LOCALE, PROVIDERS
8from faker.generator import Generator
9from faker.utils.loading import list_module
11logger = logging.getLogger(__name__)
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.')
21class Factory:
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 = []
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)
41 config['locale'] = locale
42 providers = providers or PROVIDERS
44 providers += includes
46 faker = generator or Generator(**config)
48 for prov_name in providers:
49 if prov_name == 'faker.providers':
50 continue
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)
58 return faker
60 @classmethod
61 def _get_provider_class(cls, provider, locale=''):
63 provider_class = cls._find_provider_class(provider, locale)
65 if provider_class:
66 return provider_class, locale
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
74 # fallback to no locale
75 provider_class = cls._find_provider_class(provider)
76 if provider_class:
77 return provider_class, None
79 msg = 'Unable to find provider `{}` with locale `{}`'.format(
80 provider, locale)
81 raise ValueError(msg)
83 @classmethod
84 def _find_provider_class(cls, provider_path, locale=None):
86 provider_module = import_module(provider_path)
88 if getattr(provider_module, 'localized', False):
90 logger.debug('Looking for locale `{}` in provider `{}`.'.format(
91 locale, provider_module.__name__))
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))
107 path = "{provider_path}.{locale}".format(
108 provider_path=provider_path,
109 locale=locale,
110 )
111 provider_module = import_module(path)
113 else:
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 )
121 if locale is not None:
122 provider_module = import_module(provider_path)
124 return provider_module.Provider