mirror of
				https://github.com/python/cpython.git
				synced 2025-10-30 21:21:22 +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>
		
			
				
	
	
		
			43 lines
		
	
	
	
		
			1.3 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			43 lines
		
	
	
	
		
			1.3 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| # Stub out only the subset of the interface that we actually use in our tests.
 | |
| class StubClass:
 | |
|     def __init__(self, *args, **kwargs):
 | |
|         self.__stub_args = args
 | |
|         self.__stub_kwargs = kwargs
 | |
|         self.__repr = None
 | |
| 
 | |
|     def _with_repr(self, new_repr):
 | |
|         new_obj = self.__class__(*self.__stub_args, **self.__stub_kwargs)
 | |
|         new_obj.__repr = new_repr
 | |
|         return new_obj
 | |
| 
 | |
|     def __repr__(self):
 | |
|         if self.__repr is not None:
 | |
|             return self.__repr
 | |
| 
 | |
|         argstr = ", ".join(self.__stub_args)
 | |
|         kwargstr = ", ".join(f"{kw}={val}" for kw, val in self.__stub_kwargs.items())
 | |
| 
 | |
|         in_parens = argstr
 | |
|         if kwargstr:
 | |
|             in_parens += ", " + kwargstr
 | |
| 
 | |
|         return f"{self.__class__.__qualname__}({in_parens})"
 | |
| 
 | |
| 
 | |
| def stub_factory(klass, name, *, with_repr=None, _seen={}):
 | |
|     if (klass, name) not in _seen:
 | |
| 
 | |
|         class Stub(klass):
 | |
|             def __init__(self, *args, **kwargs):
 | |
|                 super().__init__()
 | |
|                 self.__stub_args = args
 | |
|                 self.__stub_kwargs = kwargs
 | |
| 
 | |
|         Stub.__name__ = name
 | |
|         Stub.__qualname__ = name
 | |
|         if with_repr is not None:
 | |
|             Stub._repr = None
 | |
| 
 | |
|         _seen.setdefault((klass, name, with_repr), Stub)
 | |
| 
 | |
|     return _seen[(klass, name, with_repr)]
 |