summaryrefslogtreecommitdiffstats
path: root/Lib/test/support/_hypothesis_stubs/_helpers.py
diff options
context:
space:
mode:
Diffstat (limited to 'Lib/test/support/_hypothesis_stubs/_helpers.py')
-rw-r--r--Lib/test/support/_hypothesis_stubs/_helpers.py43
1 files changed, 43 insertions, 0 deletions
diff --git a/Lib/test/support/_hypothesis_stubs/_helpers.py b/Lib/test/support/_hypothesis_stubs/_helpers.py
new file mode 100644
index 0000000..3f6244e
--- /dev/null
+++ b/Lib/test/support/_hypothesis_stubs/_helpers.py
@@ -0,0 +1,43 @@
+# 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)]