mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 10:26:02 +00:00 
			
		
		
		
	 d50c37d8ad
			
		
	
	
		d50c37d8ad
		
			
		
	
	
	
	
		
			
			These are stubs to be used for adding hypothesis (https://hypothesis.readthedocs.io/en/latest/) tests to the standard library. When the tests are run in an environment where `hypothesis` and its various dependencies are not installed, the stubs will turn any tests with examples into simple parameterized tests and any tests without examples are skipped. It also adds hypothesis tests for the `zoneinfo` module, and a Github Actions workflow to run the hypothesis tests as a non-required CI job. The full hypothesis interface is not stubbed out — missing stubs can be added as necessary. Co-authored-by: Zac Hatfield-Dodds <zac.hatfield.dodds@gmail.com>
		
			
				
	
	
		
			91 lines
		
	
	
	
		
			1.8 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			91 lines
		
	
	
	
		
			1.8 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| import functools
 | |
| 
 | |
| from ._helpers import StubClass, stub_factory
 | |
| 
 | |
| 
 | |
| class StubStrategy(StubClass):
 | |
|     def __make_trailing_repr(self, transformation_name, func):
 | |
|         func_name = func.__name__ or repr(func)
 | |
|         return f"{self!r}.{transformation_name}({func_name})"
 | |
| 
 | |
|     def map(self, pack):
 | |
|         return self._with_repr(self.__make_trailing_repr("map", pack))
 | |
| 
 | |
|     def flatmap(self, expand):
 | |
|         return self._with_repr(self.__make_trailing_repr("flatmap", expand))
 | |
| 
 | |
|     def filter(self, condition):
 | |
|         return self._with_repr(self.__make_trailing_repr("filter", condition))
 | |
| 
 | |
|     def __or__(self, other):
 | |
|         new_repr = f"one_of({self!r}, {other!r})"
 | |
|         return self._with_repr(new_repr)
 | |
| 
 | |
| 
 | |
| _STRATEGIES = {
 | |
|     "binary",
 | |
|     "booleans",
 | |
|     "builds",
 | |
|     "characters",
 | |
|     "complex_numbers",
 | |
|     "composite",
 | |
|     "data",
 | |
|     "dates",
 | |
|     "datetimes",
 | |
|     "decimals",
 | |
|     "deferred",
 | |
|     "dictionaries",
 | |
|     "emails",
 | |
|     "fixed_dictionaries",
 | |
|     "floats",
 | |
|     "fractions",
 | |
|     "from_regex",
 | |
|     "from_type",
 | |
|     "frozensets",
 | |
|     "functions",
 | |
|     "integers",
 | |
|     "iterables",
 | |
|     "just",
 | |
|     "lists",
 | |
|     "none",
 | |
|     "nothing",
 | |
|     "one_of",
 | |
|     "permutations",
 | |
|     "random_module",
 | |
|     "randoms",
 | |
|     "recursive",
 | |
|     "register_type_strategy",
 | |
|     "runner",
 | |
|     "sampled_from",
 | |
|     "sets",
 | |
|     "shared",
 | |
|     "slices",
 | |
|     "timedeltas",
 | |
|     "times",
 | |
|     "text",
 | |
|     "tuples",
 | |
|     "uuids",
 | |
| }
 | |
| 
 | |
| __all__ = sorted(_STRATEGIES)
 | |
| 
 | |
| 
 | |
| def composite(f):
 | |
|     strategy = stub_factory(StubStrategy, f.__name__)
 | |
| 
 | |
|     @functools.wraps(f)
 | |
|     def inner(*args, **kwargs):
 | |
|         return strategy(*args, **kwargs)
 | |
| 
 | |
|     return inner
 | |
| 
 | |
| 
 | |
| def __getattr__(name):
 | |
|     if name not in _STRATEGIES:
 | |
|         raise AttributeError(f"Unknown attribute {name}")
 | |
| 
 | |
|     return stub_factory(StubStrategy, f"hypothesis.strategies.{name}")
 | |
| 
 | |
| 
 | |
| def __dir__():
 | |
|     return __all__
 |