123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105 |
- # coding=utf-8
- #
- # This file is part of Hypothesis, which may be found at
- # https://github.com/HypothesisWorks/hypothesis-python
- #
- # Most of this work is copyright (C) 2013-2018 David R. MacIver
- # (david@drmaciver.com), but it contains contributions by others. See
- # CONTRIBUTING.rst for a full list of people who may hold copyright, and
- # consult the git log if you need to determine who owns an individual
- # contribution.
- #
- # This Source Code Form is subject to the terms of the Mozilla Public License,
- # v. 2.0. If a copy of the MPL was not distributed with this file, You can
- # obtain one at http://mozilla.org/MPL/2.0/.
- #
- # END HEADER
- from __future__ import division, print_function, absolute_import
- import random as globalrandom
- from random import Random
- import faker
- from faker.factory import AVAILABLE_LOCALES
- from hypothesis._settings import note_deprecation
- from hypothesis.internal.compat import text_type
- from hypothesis.internal.reflection import check_valid_identifier
- from hypothesis.searchstrategy.strategies import SearchStrategy
- def fake_factory(source, locale=None, locales=None, providers=()):
- note_deprecation(
- 'hypothesis.extra.fakefactory has been deprecated, because it does '
- 'not support example discovery or shrinking. Consider using a lower-'
- 'level strategy (such as st.text()) instead.'
- )
- check_valid_identifier(source)
- if source[0] == u'_':
- raise ValueError(u'Bad source name %s' % (source,))
- if locale is not None and locales is not None:
- raise ValueError(u'Cannot specify both single and multiple locales')
- if locale:
- locales = (locale,)
- elif locales:
- locales = tuple(locales)
- else:
- locales = None
- for l in (locales or ()):
- if l not in AVAILABLE_LOCALES:
- raise ValueError(u'Unsupported locale %r' % (l,))
- def supports_source(locale):
- test_faker = faker.Faker(locale)
- for provider in providers:
- test_faker.add_provider(provider)
- return hasattr(test_faker, source)
- if locales is None:
- locales = list(filter(supports_source, AVAILABLE_LOCALES))
- if not locales:
- raise ValueError(u'No such source %r' % (source,))
- else:
- for l in locales:
- if not supports_source(locale):
- raise ValueError(u'Unsupported source %s for locale %s' % (
- source, l
- ))
- return FakeFactoryStrategy(source, providers, locales)
- class FakeFactoryStrategy(SearchStrategy):
- def __init__(self, source, providers, locales):
- self.source = source
- self.providers = tuple(providers)
- self.locales = tuple(locales)
- self.factories = {}
- def do_draw(self, data):
- seed = data.draw_bytes(4)
- random = Random(bytes(seed))
- return self.gen_example(random)
- def factory_for(self, locale):
- try:
- return self.factories[locale]
- except KeyError:
- pass
- factory = faker.Faker(locale=locale)
- self.factories[locale] = factory
- for p in self.providers:
- factory.add_provider(p)
- return factory
- def gen_example(self, random):
- factory = self.factory_for(random.choice(self.locales))
- original = globalrandom.getstate()
- seed = random.getrandbits(128)
- try:
- factory.seed(seed)
- return text_type(getattr(factory, self.source)())
- finally:
- globalrandom.setstate(original)
|