aboutsummaryrefslogtreecommitdiffstats
path: root/contrib/python
diff options
context:
space:
mode:
authorrobot-piglet <robot-piglet@yandex-team.com>2024-09-21 11:11:03 +0300
committerrobot-piglet <robot-piglet@yandex-team.com>2024-09-21 11:20:19 +0300
commit9180a474dc5980e6f950c239117a7c897c13cac0 (patch)
tree23818c7deed9ff873014cac97893260b2dd9f3d8 /contrib/python
parent6dd46a1a1ab9e77f64a1c00f62b0bed943261152 (diff)
downloadydb-9180a474dc5980e6f950c239117a7c897c13cac0.tar.gz
Intermediate changes
commit_hash:eed9ab338cab60f205ce140295c0393eaee72cfe
Diffstat (limited to 'contrib/python')
-rw-r--r--contrib/python/hypothesis/py3/.dist-info/METADATA2
-rw-r--r--contrib/python/hypothesis/py3/hypothesis/internal/conjecture/data.py86
-rw-r--r--contrib/python/hypothesis/py3/hypothesis/internal/conjecture/datatree.py71
-rw-r--r--contrib/python/hypothesis/py3/hypothesis/internal/conjecture/shrinker.py5
-rw-r--r--contrib/python/hypothesis/py3/hypothesis/internal/conjecture/shrinking/bytes.py13
-rw-r--r--contrib/python/hypothesis/py3/hypothesis/strategies/_internal/strings.py35
-rw-r--r--contrib/python/hypothesis/py3/hypothesis/version.py2
-rw-r--r--contrib/python/hypothesis/py3/ya.make2
-rw-r--r--contrib/python/ydb/py3/.dist-info/METADATA2
-rw-r--r--contrib/python/ydb/py3/ya.make2
-rw-r--r--contrib/python/ydb/py3/ydb/table.py7
-rw-r--r--contrib/python/ydb/py3/ydb/ydb_version.py2
12 files changed, 137 insertions, 92 deletions
diff --git a/contrib/python/hypothesis/py3/.dist-info/METADATA b/contrib/python/hypothesis/py3/.dist-info/METADATA
index d1e09fb0ef..b78a2eeab3 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.111.2
+Version: 6.112.0
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/internal/conjecture/data.py b/contrib/python/hypothesis/py3/hypothesis/internal/conjecture/data.py
index 18f3bd9b8a..0f4f1138f3 100644
--- a/contrib/python/hypothesis/py3/hypothesis/internal/conjecture/data.py
+++ b/contrib/python/hypothesis/py3/hypothesis/internal/conjecture/data.py
@@ -111,11 +111,12 @@ class FloatKWargs(TypedDict):
class StringKWargs(TypedDict):
intervals: IntervalSet
min_size: int
- max_size: Optional[int]
+ max_size: int
class BytesKWargs(TypedDict):
- size: int
+ min_size: int
+ max_size: int
class BooleanKWargs(TypedDict):
@@ -206,7 +207,7 @@ NASTY_FLOATS.extend([-x for x in NASTY_FLOATS])
FLOAT_INIT_LOGIC_CACHE = LRUCache(4096)
POOLED_KWARGS_CACHE = LRUCache(4096)
-DRAW_STRING_DEFAULT_MAX_SIZE = 10**10 # "arbitrarily large"
+COLLECTION_DEFAULT_MAX_SIZE = 10**10 # "arbitrarily large"
class Example:
@@ -1036,7 +1037,7 @@ class IRNode:
return self.value == (minimal_char * self.kwargs["min_size"])
if self.ir_type == "bytes":
# smallest size and all-zero value.
- return len(self.value) == self.kwargs["size"] and not any(self.value)
+ return len(self.value) == self.kwargs["min_size"] and not any(self.value)
raise NotImplementedError(f"unhandled ir_type {self.ir_type}")
@@ -1095,7 +1096,9 @@ def ir_value_permitted(value, ir_type, kwargs):
return False
return all(ord(c) in kwargs["intervals"] for c in value)
elif ir_type == "bytes":
- return len(value) == kwargs["size"]
+ if len(value) < kwargs["min_size"]:
+ return False
+ return kwargs["max_size"] is None or len(value) <= kwargs["max_size"]
elif ir_type == "boolean":
if kwargs["p"] <= 2 ** (-64):
return value is False
@@ -1314,7 +1317,7 @@ class PrimitiveProvider(abc.ABC):
intervals: IntervalSet,
*,
min_size: int = 0,
- max_size: Optional[int] = None,
+ max_size: int = COLLECTION_DEFAULT_MAX_SIZE,
forced: Optional[str] = None,
fake_forced: bool = False,
) -> str:
@@ -1322,7 +1325,12 @@ class PrimitiveProvider(abc.ABC):
@abc.abstractmethod
def draw_bytes(
- self, size: int, *, forced: Optional[bytes] = None, fake_forced: bool = False
+ self,
+ min_size: int = 0,
+ max_size: int = COLLECTION_DEFAULT_MAX_SIZE,
+ *,
+ forced: Optional[bytes] = None,
+ fake_forced: bool = False,
) -> bytes:
raise NotImplementedError
@@ -1606,14 +1614,10 @@ class HypothesisProvider(PrimitiveProvider):
intervals: IntervalSet,
*,
min_size: int = 0,
- max_size: Optional[int] = None,
+ max_size: int = COLLECTION_DEFAULT_MAX_SIZE,
forced: Optional[str] = None,
fake_forced: bool = False,
) -> str:
- if max_size is None:
- max_size = DRAW_STRING_DEFAULT_MAX_SIZE
-
- assert forced is None or min_size <= len(forced) <= max_size
assert self._cd is not None
average_size = min(
@@ -1663,17 +1667,40 @@ class HypothesisProvider(PrimitiveProvider):
return "".join(chars)
def draw_bytes(
- self, size: int, *, forced: Optional[bytes] = None, fake_forced: bool = False
+ self,
+ min_size: int = 0,
+ max_size: int = COLLECTION_DEFAULT_MAX_SIZE,
+ *,
+ forced: Optional[bytes] = None,
+ fake_forced: bool = False,
) -> bytes:
- forced_i = None
- if forced is not None:
- forced_i = int_from_bytes(forced)
- size = len(forced)
-
assert self._cd is not None
- return self._cd.draw_bits(
- 8 * size, forced=forced_i, fake_forced=fake_forced
- ).to_bytes(size, "big")
+
+ buf = bytearray()
+ average_size = min(
+ max(min_size * 2, min_size + 5),
+ 0.5 * (min_size + max_size),
+ )
+ elements = many(
+ self._cd,
+ min_size=min_size,
+ max_size=max_size,
+ average_size=average_size,
+ forced=None if forced is None else len(forced),
+ fake_forced=fake_forced,
+ observe=False,
+ )
+ while elements.more():
+ forced_i: Optional[int] = None
+ if forced is not None:
+ # implicit conversion from bytes to int by indexing here
+ forced_i = forced[elements.count - 1]
+
+ buf += self._cd.draw_bits(
+ 8, forced=forced_i, fake_forced=fake_forced
+ ).to_bytes(1, "big")
+
+ return bytes(buf)
def _draw_float(
self,
@@ -2216,12 +2243,13 @@ class ConjectureData:
intervals: IntervalSet,
*,
min_size: int = 0,
- max_size: Optional[int] = None,
+ max_size: int = COLLECTION_DEFAULT_MAX_SIZE,
forced: Optional[str] = None,
fake_forced: bool = False,
observe: bool = True,
) -> str:
- assert forced is None or min_size <= len(forced)
+ assert forced is None or min_size <= len(forced) <= max_size
+ assert min_size >= 0
kwargs: StringKWargs = self._pooled_kwargs(
"string",
@@ -2255,17 +2283,19 @@ class ConjectureData:
def draw_bytes(
self,
- # TODO move to min_size and max_size here.
- size: int,
+ min_size: int = 0,
+ max_size: int = COLLECTION_DEFAULT_MAX_SIZE,
*,
forced: Optional[bytes] = None,
fake_forced: bool = False,
observe: bool = True,
) -> bytes:
- assert forced is None or len(forced) == size
- assert size >= 0
+ assert forced is None or min_size <= len(forced) <= max_size
+ assert min_size >= 0
- kwargs: BytesKWargs = self._pooled_kwargs("bytes", {"size": size})
+ kwargs: BytesKWargs = self._pooled_kwargs(
+ "bytes", {"min_size": min_size, "max_size": max_size}
+ )
if self.ir_tree_nodes is not None and observe:
node_value = self._pop_ir_tree_node("bytes", kwargs, forced=forced)
diff --git a/contrib/python/hypothesis/py3/hypothesis/internal/conjecture/datatree.py b/contrib/python/hypothesis/py3/hypothesis/internal/conjecture/datatree.py
index 60c1610bc3..87a0c988c8 100644
--- a/contrib/python/hypothesis/py3/hypothesis/internal/conjecture/datatree.py
+++ b/contrib/python/hypothesis/py3/hypothesis/internal/conjecture/datatree.py
@@ -146,9 +146,31 @@ class Conclusion:
MAX_CHILDREN_EFFECTIVELY_INFINITE = 100_000
-def compute_max_children(ir_type, kwargs):
- from hypothesis.internal.conjecture.data import DRAW_STRING_DEFAULT_MAX_SIZE
+def _count_distinct_strings(*, alphabet_size, min_size, max_size):
+ # We want to estimate if we're going to have more children than
+ # MAX_CHILDREN_EFFECTIVELY_INFINITE, without computing a potentially
+ # extremely expensive pow. We'll check if the number of strings in
+ # the largest string size alone is enough to put us over this limit.
+ # We'll also employ a trick of estimating against log, which is cheaper
+ # than computing a pow.
+ #
+ # x = max_size
+ # y = alphabet_size
+ # n = MAX_CHILDREN_EFFECTIVELY_INFINITE
+ #
+ # x**y > n
+ # <=> log(x**y) > log(n)
+ # <=> y * log(x) > log(n)
+ definitely_too_large = max_size * math.log(alphabet_size) > math.log(
+ MAX_CHILDREN_EFFECTIVELY_INFINITE
+ )
+ if definitely_too_large:
+ return MAX_CHILDREN_EFFECTIVELY_INFINITE
+ return sum(alphabet_size**k for k in range(min_size, max_size + 1))
+
+
+def compute_max_children(ir_type, kwargs):
if ir_type == "integer":
min_value = kwargs["min_value"]
max_value = kwargs["max_value"]
@@ -178,50 +200,27 @@ def compute_max_children(ir_type, kwargs):
return 1
return 2
elif ir_type == "bytes":
- return 2 ** (8 * kwargs["size"])
+ return _count_distinct_strings(
+ alphabet_size=2**8, min_size=kwargs["min_size"], max_size=kwargs["max_size"]
+ )
elif ir_type == "string":
min_size = kwargs["min_size"]
max_size = kwargs["max_size"]
intervals = kwargs["intervals"]
- if max_size is None:
- max_size = DRAW_STRING_DEFAULT_MAX_SIZE
-
if len(intervals) == 0:
# Special-case the empty alphabet to avoid an error in math.log(0).
# Only possibility is the empty string.
return 1
- # We want to estimate if we're going to have more children than
- # MAX_CHILDREN_EFFECTIVELY_INFINITE, without computing a potentially
- # extremely expensive pow. We'll check if the number of strings in
- # the largest string size alone is enough to put us over this limit.
- # We'll also employ a trick of estimating against log, which is cheaper
- # than computing a pow.
- #
- # x = max_size
- # y = len(intervals)
- # n = MAX_CHILDREN_EFFECTIVELY_INFINITE
- #
- # x**y > n
- # <=> log(x**y) > log(n)
- # <=> y * log(x) > log(n)
-
- # avoid math.log(1) == 0 and incorrectly failing the below estimate,
- # even when we definitely are too large.
- if len(intervals) == 1:
- definitely_too_large = max_size > MAX_CHILDREN_EFFECTIVELY_INFINITE
- else:
- definitely_too_large = max_size * math.log(len(intervals)) > math.log(
- MAX_CHILDREN_EFFECTIVELY_INFINITE
- )
-
- if definitely_too_large:
+ # avoid math.log(1) == 0 and incorrectly failing our effectively_infinite
+ # estimate, even when we definitely are too large.
+ if len(intervals) == 1 and max_size > MAX_CHILDREN_EFFECTIVELY_INFINITE:
return MAX_CHILDREN_EFFECTIVELY_INFINITE
- # number of strings of length k, for each k in [min_size, max_size].
- return sum(len(intervals) ** k for k in range(min_size, max_size + 1))
-
+ return _count_distinct_strings(
+ alphabet_size=len(intervals), min_size=min_size, max_size=max_size
+ )
elif ir_type == "float":
min_value = kwargs["min_value"]
max_value = kwargs["max_value"]
@@ -306,8 +305,8 @@ def all_children(ir_type, kwargs):
else:
yield from [False, True]
if ir_type == "bytes":
- size = kwargs["size"]
- yield from (int_to_bytes(i, size) for i in range(2 ** (8 * size)))
+ for size in range(kwargs["min_size"], kwargs["max_size"] + 1):
+ yield from (int_to_bytes(i, size) for i in range(2 ** (8 * size)))
if ir_type == "string":
min_size = kwargs["min_size"]
max_size = kwargs["max_size"]
diff --git a/contrib/python/hypothesis/py3/hypothesis/internal/conjecture/shrinker.py b/contrib/python/hypothesis/py3/hypothesis/internal/conjecture/shrinker.py
index 3be703a18e..d1084e4cdd 100644
--- a/contrib/python/hypothesis/py3/hypothesis/internal/conjecture/shrinker.py
+++ b/contrib/python/hypothesis/py3/hypothesis/internal/conjecture/shrinker.py
@@ -1075,10 +1075,9 @@ class Shrinker:
return False # pragma: no cover
if node.ir_type in {"string", "bytes"}:
- size_kwarg = "min_size" if node.ir_type == "string" else "size"
# if the size *increased*, we would have to guess what to pad with
# in order to try fixing up this attempt. Just give up.
- if node.kwargs[size_kwarg] <= attempt_kwargs[size_kwarg]:
+ if node.kwargs["min_size"] <= attempt_kwargs["min_size"]:
return False
# the size decreased in our attempt. Try again, but replace with
# the min_size that we would have gotten, and truncate the value
@@ -1089,7 +1088,7 @@ class Shrinker:
initial_attempt[node.index].copy(
with_kwargs=attempt_kwargs,
with_value=initial_attempt[node.index].value[
- : attempt_kwargs[size_kwarg]
+ : attempt_kwargs["min_size"]
],
)
]
diff --git a/contrib/python/hypothesis/py3/hypothesis/internal/conjecture/shrinking/bytes.py b/contrib/python/hypothesis/py3/hypothesis/internal/conjecture/shrinking/bytes.py
index 3ba75a2719..7fbc26fd24 100644
--- a/contrib/python/hypothesis/py3/hypothesis/internal/conjecture/shrinking/bytes.py
+++ b/contrib/python/hypothesis/py3/hypothesis/internal/conjecture/shrinking/bytes.py
@@ -8,17 +8,16 @@
# 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/.
-from hypothesis.internal.compat import int_from_bytes, int_to_bytes
+from hypothesis.internal.conjecture.shrinking.collection import Collection
from hypothesis.internal.conjecture.shrinking.integer import Integer
-class Bytes(Integer):
+class Bytes(Collection):
def __init__(self, initial, predicate, **kwargs):
- # shrink by interpreting the bytes as an integer.
- # move to Collection.shrink when we support variable-size bytes,
- # because b'\x00\x02' could shrink to either b'\x00\x01' or b'\x02'.
super().__init__(
- int_from_bytes(initial),
- lambda n: predicate(int_to_bytes(n, len(initial))),
+ # implicit conversion from bytes to list of integers here
+ list(initial),
+ lambda val: predicate(bytes(val)),
+ ElementShrinker=Integer,
**kwargs,
)
diff --git a/contrib/python/hypothesis/py3/hypothesis/strategies/_internal/strings.py b/contrib/python/hypothesis/py3/hypothesis/strategies/_internal/strings.py
index b6e6dd8deb..53d81b7394 100644
--- a/contrib/python/hypothesis/py3/hypothesis/strategies/_internal/strings.py
+++ b/contrib/python/hypothesis/py3/hypothesis/strategies/_internal/strings.py
@@ -12,15 +12,16 @@ import copy
import re
import warnings
from functools import lru_cache, partial
+from typing import Optional
from hypothesis.errors import HypothesisWarning, InvalidArgument
from hypothesis.internal import charmap
+from hypothesis.internal.conjecture.data import COLLECTION_DEFAULT_MAX_SIZE
from hypothesis.internal.filtering import max_len, min_len
from hypothesis.internal.intervalsets import IntervalSet
from hypothesis.internal.reflection import get_pretty_function_description
from hypothesis.strategies._internal.collections import ListStrategy
from hypothesis.strategies._internal.lazy import unwrap_strategies
-from hypothesis.strategies._internal.numbers import IntegersStrategy
from hypothesis.strategies._internal.strategies import (
OneOfStrategy,
SampledFromStrategy,
@@ -158,7 +159,13 @@ class TextStrategy(ListStrategy):
elems = unwrap_strategies(self.element_strategy)
if isinstance(elems, OneCharStringStrategy):
return data.draw_string(
- elems.intervals, min_size=self.min_size, max_size=self.max_size
+ elems.intervals,
+ min_size=self.min_size,
+ max_size=(
+ COLLECTION_DEFAULT_MAX_SIZE
+ if self.max_size == float("inf")
+ else self.max_size
+ ),
)
return "".join(super().do_draw(data))
@@ -224,9 +231,13 @@ def _string_filter_rewrite(self, kind, condition):
stacklevel=2,
)
- elems = unwrap_strategies(self.element_strategy)
if (
- (kind is bytes or isinstance(elems, OneCharStringStrategy))
+ (
+ kind is bytes
+ or isinstance(
+ unwrap_strategies(self.element_strategy), OneCharStringStrategy
+ )
+ )
and isinstance(pattern := getattr(condition, "__self__", None), re.Pattern)
and isinstance(pattern.pattern, kind)
):
@@ -331,15 +342,15 @@ def _identifier_characters():
return id_start, id_continue
-class BytesStrategy(ListStrategy):
- def __init__(self, min_size, max_size):
- super().__init__(IntegersStrategy(0, 255), min_size=min_size, max_size=max_size)
+class BytesStrategy(SearchStrategy):
+ def __init__(self, min_size: int, max_size: Optional[int]):
+ self.min_size = min_size
+ self.max_size = (
+ max_size if max_size is not None else COLLECTION_DEFAULT_MAX_SIZE
+ )
def do_draw(self, data):
- # TODO: refactor the underlying provider to support variable-length bytes
- if self.min_size == self.max_size:
- return bytes(data.draw_bytes(self.min_size))
- return bytes(super().do_draw(data))
+ return data.draw_bytes(self.min_size, self.max_size)
_nonempty_filters = (
*ListStrategy._nonempty_filters,
@@ -353,4 +364,4 @@ class BytesStrategy(ListStrategy):
def filter(self, condition):
if (new := _string_filter_rewrite(self, bytes, condition)) is not None:
return new
- return super().filter(condition)
+ return ListStrategy.filter(self, condition)
diff --git a/contrib/python/hypothesis/py3/hypothesis/version.py b/contrib/python/hypothesis/py3/hypothesis/version.py
index af1b866e64..2c69dd8977 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, 111, 2)
+__version_info__ = (6, 112, 0)
__version__ = ".".join(map(str, __version_info__))
diff --git a/contrib/python/hypothesis/py3/ya.make b/contrib/python/hypothesis/py3/ya.make
index f7183e57f1..ce520eaa5f 100644
--- a/contrib/python/hypothesis/py3/ya.make
+++ b/contrib/python/hypothesis/py3/ya.make
@@ -2,7 +2,7 @@
PY3_LIBRARY()
-VERSION(6.111.2)
+VERSION(6.112.0)
LICENSE(MPL-2.0)
diff --git a/contrib/python/ydb/py3/.dist-info/METADATA b/contrib/python/ydb/py3/.dist-info/METADATA
index db2f0036b3..7c7c7cdbaf 100644
--- a/contrib/python/ydb/py3/.dist-info/METADATA
+++ b/contrib/python/ydb/py3/.dist-info/METADATA
@@ -1,6 +1,6 @@
Metadata-Version: 2.1
Name: ydb
-Version: 3.17.1
+Version: 3.17.2
Summary: YDB Python SDK
Home-page: http://github.com/ydb-platform/ydb-python-sdk
Author: Yandex LLC
diff --git a/contrib/python/ydb/py3/ya.make b/contrib/python/ydb/py3/ya.make
index c1ab6d4472..b3e9929330 100644
--- a/contrib/python/ydb/py3/ya.make
+++ b/contrib/python/ydb/py3/ya.make
@@ -2,7 +2,7 @@
PY3_LIBRARY()
-VERSION(3.17.1)
+VERSION(3.17.2)
LICENSE(Apache-2.0)
diff --git a/contrib/python/ydb/py3/ydb/table.py b/contrib/python/ydb/py3/ydb/table.py
index cfcffb17af..01f5e52b6a 100644
--- a/contrib/python/ydb/py3/ydb/table.py
+++ b/contrib/python/ydb/py3/ydb/table.py
@@ -290,6 +290,7 @@ class TableIndex(object):
self._pb.name = name
self.name = name
self.index_columns = []
+ self.data_columns = []
# output only.
self.status = None
@@ -307,6 +308,12 @@ class TableIndex(object):
self.index_columns.append(column)
return self
+ def with_data_columns(self, *columns):
+ for column in columns:
+ self._pb.data_columns.append(column)
+ self.data_columns.append(column)
+ return self
+
def to_pb(self):
return self._pb
diff --git a/contrib/python/ydb/py3/ydb/ydb_version.py b/contrib/python/ydb/py3/ydb/ydb_version.py
index b0ef9f368d..1115cbbcb9 100644
--- a/contrib/python/ydb/py3/ydb/ydb_version.py
+++ b/contrib/python/ydb/py3/ydb/ydb_version.py
@@ -1 +1 @@
-VERSION = "3.17.1"
+VERSION = "3.17.2"