aboutsummaryrefslogtreecommitdiffstats
path: root/contrib
diff options
context:
space:
mode:
authorrobot-piglet <robot-piglet@yandex-team.com>2024-03-04 17:59:16 +0300
committerrobot-piglet <robot-piglet@yandex-team.com>2024-03-04 18:11:15 +0300
commitd0dca30a5b0275bcdcc2c26f672558bc5113e479 (patch)
tree1a0bb48cce2148980ffa292a5c8077fcbd0f5f01 /contrib
parentf335173a2a8205efd065307fb6bea616b473f5bd (diff)
downloadydb-d0dca30a5b0275bcdcc2c26f672558bc5113e479.tar.gz
Intermediate changes
Diffstat (limited to 'contrib')
-rw-r--r--contrib/python/hypothesis/py3/.dist-info/METADATA2
-rw-r--r--contrib/python/hypothesis/py3/hypothesis/extra/ghostwriter.py150
-rw-r--r--contrib/python/hypothesis/py3/hypothesis/internal/conjecture/engine.py23
-rw-r--r--contrib/python/hypothesis/py3/hypothesis/version.py2
-rw-r--r--contrib/python/hypothesis/py3/ya.make2
5 files changed, 106 insertions, 73 deletions
diff --git a/contrib/python/hypothesis/py3/.dist-info/METADATA b/contrib/python/hypothesis/py3/.dist-info/METADATA
index 9780b83140..26ae8b8481 100644
--- a/contrib/python/hypothesis/py3/.dist-info/METADATA
+++ b/contrib/python/hypothesis/py3/.dist-info/METADATA
@@ -1,6 +1,6 @@
Metadata-Version: 2.1
Name: hypothesis
-Version: 6.98.6
+Version: 6.98.8
Summary: A library for property-based testing
Home-page: https://hypothesis.works
Author: David R. MacIver and Zac Hatfield-Dodds
diff --git a/contrib/python/hypothesis/py3/hypothesis/extra/ghostwriter.py b/contrib/python/hypothesis/py3/hypothesis/extra/ghostwriter.py
index 3404088ed0..8917d5bd87 100644
--- a/contrib/python/hypothesis/py3/hypothesis/extra/ghostwriter.py
+++ b/contrib/python/hypothesis/py3/hypothesis/extra/ghostwriter.py
@@ -482,7 +482,6 @@ def _get_params(func: Callable) -> Dict[str, inspect.Parameter]:
kind = inspect.Parameter.KEYWORD_ONLY
continue # we omit *varargs, if there are any
if _iskeyword(arg.lstrip("*")) or not arg.lstrip("*").isidentifier():
- print(repr(args))
break # skip all subsequent params if this name is invalid
params.append(inspect.Parameter(name=arg, kind=kind))
@@ -588,6 +587,8 @@ def _imports_for_object(obj):
"""Return the imports for `obj`, which may be empty for e.g. lambdas"""
if isinstance(obj, (re.Pattern, re.Match)):
return {"re"}
+ if isinstance(obj, st.SearchStrategy):
+ return _imports_for_strategy(obj)
try:
if is_generic_type(obj):
if isinstance(obj, TypeVar):
@@ -606,19 +607,19 @@ def _imports_for_strategy(strategy):
# If we have a lazy from_type strategy, because unwrapping it gives us an
# error or invalid syntax, import that type and we're done.
if isinstance(strategy, LazyStrategy):
- if strategy.function.__name__ in (
- st.from_type.__name__,
- st.from_regex.__name__,
- ):
- return {
- imp
- for arg in set(strategy._LazyStrategy__args)
- | set(strategy._LazyStrategy__kwargs.values())
- for imp in _imports_for_object(arg)
- }
+ imports = {
+ imp
+ for arg in set(strategy._LazyStrategy__args)
+ | set(strategy._LazyStrategy__kwargs.values())
+ for imp in _imports_for_object(_strip_typevars(arg))
+ }
+ if re.match(r"from_(type|regex)\(", repr(strategy)):
+ if repr(strategy).startswith("from_type("):
+ return {module for module, _ in imports}
+ return imports
elif _get_module(strategy.function).startswith("hypothesis.extra."):
module = _get_module(strategy.function).replace("._array_helpers", ".numpy")
- return {(module, strategy.function.__name__)}
+ return {(module, strategy.function.__name__)} | imports
imports = set()
with warnings.catch_warnings():
@@ -672,6 +673,9 @@ def _valid_syntax_repr(strategy):
if isinstance(strategy, OneOfStrategy):
seen = set()
elems = []
+ with warnings.catch_warnings():
+ warnings.simplefilter("ignore", SmallSearchSpaceWarning)
+ strategy.element_strategies # might warn on first access
for s in strategy.element_strategies:
if isinstance(s, SampledFromStrategy) and s.elements == (os.environ,):
continue
@@ -694,7 +698,11 @@ def _valid_syntax_repr(strategy):
# Return a syntactically-valid strategy repr, including fixing some
# strategy reprs and replacing invalid syntax reprs with `"nothing()"`.
# String-replace to hide the special case in from_type() for Decimal('snan')
- r = repr(strategy).replace(".filter(_can_hash)", "")
+ r = (
+ repr(strategy)
+ .replace(".filter(_can_hash)", "")
+ .replace("hypothesis.strategies.", "")
+ )
# Replace <unknown> with ... in confusing lambdas
r = re.sub(r"(lambda.*?: )(<unknown>)([,)])", r"\1...\3", r)
compile(r, "<string>", "eval")
@@ -724,9 +732,10 @@ def _get_module_helper(obj):
dots = [i for i, c in enumerate(module_name) if c == "."] + [None]
for idx in dots:
- if getattr(sys.modules.get(module_name[:idx]), obj.__name__, None) is obj:
- KNOWN_FUNCTION_LOCATIONS[obj] = module_name[:idx]
- return module_name[:idx]
+ for candidate in (module_name[:idx].lstrip("_"), module_name[:idx]):
+ if getattr(sys.modules.get(candidate), obj.__name__, None) is obj:
+ KNOWN_FUNCTION_LOCATIONS[obj] = candidate
+ return candidate
return module_name
@@ -755,7 +764,7 @@ def _get_qualname(obj, *, include_module=False):
def _write_call(
- func: Callable, *pass_variables: str, except_: Except, assign: str = ""
+ func: Callable, *pass_variables: str, except_: Except = Exception, assign: str = ""
) -> str:
"""Write a call to `func` with explicit and implicit arguments.
@@ -1000,6 +1009,9 @@ def _parameter_to_annotation(parameter: Any) -> Optional[_AnnotationData]:
else:
type_name = str(parameter)
+ if type_name.startswith("hypothesis.strategies."):
+ return _AnnotationData(type_name.replace("hypothesis.strategies", "st"), set())
+
origin_type = get_origin(parameter)
# if not generic or no generic arguments
@@ -1045,9 +1057,6 @@ def _make_test(imports: ImportSet, body: str) -> str:
# Discarding "builtins." and "__main__" probably isn't particularly useful
# for user code, but important for making a good impression in demos.
body = body.replace("builtins.", "").replace("__main__.", "")
- body = body.replace("hypothesis.strategies.", "st.")
- if "st.from_type(typing." in body:
- imports.add("typing")
imports |= {("hypothesis", "given"), ("hypothesis", "strategies as st")}
if " reject()\n" in body:
imports.add(("hypothesis", "reject"))
@@ -1260,11 +1269,29 @@ def magic(
hints = get_type_hints(func)
hints.pop("return", None)
params = _get_params(func)
- if len(hints) == len(params) == 2:
- a, b = hints.values()
+ if (len(hints) == len(params) == 2) or (
+ _get_module(func) == "operator"
+ and "item" not in func.__name__
+ and tuple(params) in [("a", "b"), ("x", "y")]
+ ):
+ a, b = hints.values() or [Any, Any]
arg1, arg2 = params
if a == b and len(arg1) == len(arg2) <= 3:
- make_(_make_binop_body, func, annotate=annotate)
+ # https://en.wikipedia.org/wiki/Distributive_property#Other_examples
+ known = {
+ "mul": "add",
+ "matmul": "add",
+ "or_": "and_",
+ "and_": "or_",
+ }.get(func.__name__, "")
+ distributes_over = getattr(sys.modules[_get_module(func)], known, None)
+ make_(
+ _make_binop_body,
+ func,
+ commutative=func.__name__ != "matmul",
+ distributes_over=distributes_over,
+ annotate=annotate,
+ )
del by_name[name]
# Look for Numpy ufuncs or gufuncs, and write array-oriented tests for them.
@@ -1469,10 +1496,17 @@ def roundtrip(
return _make_test(*_make_roundtrip_body(funcs, except_, style, annotate))
-def _make_equiv_body(funcs, except_, style, annotate):
+def _get_varnames(funcs):
var_names = [f"result_{f.__name__}" for f in funcs]
if len(set(var_names)) < len(var_names):
- var_names = [f"result_{i}_{ f.__name__}" for i, f in enumerate(funcs)]
+ var_names = [f"result_{f.__name__}_{_get_module(f)}" for f in funcs]
+ if len(set(var_names)) < len(var_names):
+ var_names = [f"result_{i}_{f.__name__}" for i, f in enumerate(funcs)]
+ return var_names
+
+
+def _make_equiv_body(funcs, except_, style, annotate):
+ var_names = _get_varnames(funcs)
test_lines = [
_write_call(f, assign=vname, except_=except_)
for vname, f in zip(var_names, funcs)
@@ -1512,10 +1546,7 @@ else:
def _make_equiv_errors_body(funcs, except_, style, annotate):
- var_names = [f"result_{f.__name__}" for f in funcs]
- if len(set(var_names)) < len(var_names):
- var_names = [f"result_{i}_{ f.__name__}" for i, f in enumerate(funcs)]
-
+ var_names = _get_varnames(funcs)
first, *rest = funcs
first_call = _write_call(first, assign=var_names[0], except_=except_)
extra_imports, suppress = _exception_string(except_)
@@ -1715,18 +1746,11 @@ def _make_binop_body(
maker(
"associative",
"abc",
+ _write_call(func, "a", _write_call(func, "b", "c"), assign="left"),
_write_call(
func,
- "a",
- _write_call(func, "b", "c", except_=Exception),
- except_=Exception,
- assign="left",
- ),
- _write_call(
- func,
- _write_call(func, "a", "b", except_=Exception),
+ _write_call(func, "a", "b"),
"c",
- except_=Exception,
assign="right",
),
)
@@ -1734,8 +1758,8 @@ def _make_binop_body(
maker(
"commutative",
"ab",
- _write_call(func, "a", "b", except_=Exception, assign="left"),
- _write_call(func, "b", "a", except_=Exception, assign="right"),
+ _write_call(func, "a", "b", assign="left"),
+ _write_call(func, "b", "a", assign="right"),
)
if identity is not None:
# Guess that the identity element is the minimal example from our operands
@@ -1757,34 +1781,42 @@ def _make_binop_body(
compile(repr(identity), "<string>", "exec")
except SyntaxError:
identity = repr(identity) # type: ignore
- maker(
- "identity",
- "a",
+ identity_parts = [
+ f"{identity = }",
_assert_eq(
style,
"a",
- _write_call(func, "a", repr(identity), except_=Exception),
+ _write_call(func, "a", "identity"),
),
- )
+ _assert_eq(
+ style,
+ "a",
+ _write_call(func, "identity", "a"),
+ ),
+ ]
+ maker("identity", "a", "\n".join(identity_parts))
if distributes_over:
- maker(
- distributes_over.__name__ + "_distributes_over",
- "abc",
+ do = distributes_over
+ dist_parts = [
+ _write_call(func, "a", _write_call(do, "b", "c"), assign="left"),
_write_call(
- distributes_over,
- _write_call(func, "a", "b", except_=Exception),
- _write_call(func, "a", "c", except_=Exception),
- except_=Exception,
- assign="left",
+ do,
+ _write_call(func, "a", "b"),
+ _write_call(func, "a", "c"),
+ assign="ldist",
),
+ _assert_eq(style, "ldist", "left"),
+ "\n",
+ _write_call(func, _write_call(do, "a", "b"), "c", assign="right"),
_write_call(
- func,
- "a",
- _write_call(distributes_over, "b", "c", except_=Exception),
- except_=Exception,
- assign="right",
+ do,
+ _write_call(func, "a", "c"),
+ _write_call(func, "b", "c"),
+ assign="rdist",
),
- )
+ _assert_eq(style, "rdist", "right"),
+ ]
+ maker(do.__name__ + "_distributes_over", "abc", "\n".join(dist_parts))
_, operands_repr = _valid_syntax_repr(operands)
operands_repr = _st_strategy_names(operands_repr)
diff --git a/contrib/python/hypothesis/py3/hypothesis/internal/conjecture/engine.py b/contrib/python/hypothesis/py3/hypothesis/internal/conjecture/engine.py
index 99a170ca64..2a011a8b11 100644
--- a/contrib/python/hypothesis/py3/hypothesis/internal/conjecture/engine.py
+++ b/contrib/python/hypothesis/py3/hypothesis/internal/conjecture/engine.py
@@ -47,6 +47,13 @@ MUTATION_POOL_SIZE = 100
MIN_TEST_CALLS = 10
BUFFER_SIZE = 8 * 1024
+# If the shrinking phase takes more than five minutes, abort it early and print
+# a warning. Many CI systems will kill a build after around ten minutes with
+# no output, and appearing to hang isn't great for interactive use either -
+# showing partially-shrunk examples is better than quitting with no examples!
+# (but make it monkeypatchable, for the rare users who need to keep on shrinking)
+MAX_SHRINKING_SECONDS = 300
+
@attr.s
class HealthCheckState:
@@ -811,9 +818,8 @@ class ConjectureRunner:
)
assert ex1.end <= ex2.start
- replacements = [data.buffer[e.start : e.end] for e in [ex1, ex2]]
-
- replacement = self.random.choice(replacements)
+ e = self.random.choice([ex1, ex2])
+ replacement = data.buffer[e.start : e.end]
try:
# We attempt to replace both the the examples with
@@ -822,7 +828,7 @@ class ConjectureRunner:
# wrong - labels matching are only a best guess as to
# whether the two are equivalent - but it doesn't
# really matter. It may not achieve the desired result
- # but it's still a perfectly acceptable choice sequence.
+ # but it's still a perfectly acceptable choice sequence
# to try.
new_data = self.cached_test_function(
data.buffer[: ex1.start]
@@ -922,7 +928,7 @@ class ConjectureRunner:
)
def new_conjecture_data_for_buffer(self, buffer):
- return ConjectureData.for_buffer(buffer, observer=self.tree.new_observer())
+ return self.new_conjecture_data(buffer, max_length=len(buffer))
def shrink_interesting_examples(self):
"""If we've found interesting examples, try to replace each of them
@@ -935,12 +941,7 @@ class ConjectureRunner:
return
self.debug("Shrinking interesting examples")
-
- # If the shrinking phase takes more than five minutes, abort it early and print
- # a warning. Many CI systems will kill a build after around ten minutes with
- # no output, and appearing to hang isn't great for interactive use either -
- # showing partially-shrunk examples is better than quitting with no examples!
- self.finish_shrinking_deadline = time.perf_counter() + 300
+ self.finish_shrinking_deadline = time.perf_counter() + MAX_SHRINKING_SECONDS
for prev_data in sorted(
self.interesting_examples.values(), key=lambda d: sort_key(d.buffer)
diff --git a/contrib/python/hypothesis/py3/hypothesis/version.py b/contrib/python/hypothesis/py3/hypothesis/version.py
index 43ec273cc1..6aafd5421c 100644
--- a/contrib/python/hypothesis/py3/hypothesis/version.py
+++ b/contrib/python/hypothesis/py3/hypothesis/version.py
@@ -8,5 +8,5 @@
# v. 2.0. If a copy of the MPL was not distributed with this file, You can
# obtain one at https://mozilla.org/MPL/2.0/.
-__version_info__ = (6, 98, 6)
+__version_info__ = (6, 98, 8)
__version__ = ".".join(map(str, __version_info__))
diff --git a/contrib/python/hypothesis/py3/ya.make b/contrib/python/hypothesis/py3/ya.make
index 5da3870659..1678e159c9 100644
--- a/contrib/python/hypothesis/py3/ya.make
+++ b/contrib/python/hypothesis/py3/ya.make
@@ -2,7 +2,7 @@
PY3_LIBRARY()
-VERSION(6.98.6)
+VERSION(6.98.8)
LICENSE(MPL-2.0)