From 3162024b40f3f9fb303304d66878650a457c2caf Mon Sep 17 00:00:00 2001 From: jorenham Date: Tue, 14 Oct 2025 16:53:15 +0200 Subject: [PATCH 1/6] Remove redundant decorators on individual `@overload`s --- .../src/hypothesis/extra/numpy.py | 69 ------------------- 1 file changed, 69 deletions(-) diff --git a/hypothesis-python/src/hypothesis/extra/numpy.py b/hypothesis-python/src/hypothesis/extra/numpy.py index b2aa6bbc44..1bb24a3852 100644 --- a/hypothesis-python/src/hypothesis/extra/numpy.py +++ b/hypothesis-python/src/hypothesis/extra/numpy.py @@ -419,7 +419,6 @@ def fill_for(elements, unique, fill, name=""): @overload -@defines_strategy(force_reusable_values=True) def arrays( dtype: Union["np.dtype[G]", st.SearchStrategy["np.dtype[G]"]], shape: Union[int, st.SearchStrategy[int], Shape, st.SearchStrategy[Shape]], @@ -428,10 +427,7 @@ def arrays( fill: Optional[st.SearchStrategy[Any]] = None, unique: bool = False, ) -> "st.SearchStrategy[NDArray[G]]": ... - - @overload -@defines_strategy(force_reusable_values=True) def arrays( dtype: Union[D, st.SearchStrategy[D]], shape: Union[int, st.SearchStrategy[int], Shape, st.SearchStrategy[Shape]], @@ -440,8 +436,6 @@ def arrays( fill: Optional[st.SearchStrategy[Any]] = None, unique: bool = False, ) -> "st.SearchStrategy[NDArray[Any]]": ... - - @defines_strategy(force_reusable_values=True) def arrays( dtype: Union[D, st.SearchStrategy[D]], @@ -625,50 +619,35 @@ def dtype_factory(kind, sizes, valid_sizes, endianness): @overload -@defines_dtype_strategy def unsigned_integer_dtypes( *, endianness: str = "?", sizes: Literal[8], ) -> st.SearchStrategy["np.dtype[np.uint8]"]: ... - - @overload -@defines_dtype_strategy def unsigned_integer_dtypes( *, endianness: str = "?", sizes: Literal[16], ) -> st.SearchStrategy["np.dtype[np.uint16]"]: ... - - @overload -@defines_dtype_strategy def unsigned_integer_dtypes( *, endianness: str = "?", sizes: Literal[32], ) -> st.SearchStrategy["np.dtype[np.uint32]"]: ... - - @overload -@defines_dtype_strategy def unsigned_integer_dtypes( *, endianness: str = "?", sizes: Literal[64], ) -> st.SearchStrategy["np.dtype[np.uint64]"]: ... - - @overload -@defines_dtype_strategy def unsigned_integer_dtypes( *, endianness: str = "?", sizes: Sequence[Literal[8, 16, 32, 64]] = (8, 16, 32, 64), ) -> st.SearchStrategy["np.dtype[np.unsignedinteger[Any]]"]: ... - - @defines_dtype_strategy def unsigned_integer_dtypes( *, @@ -693,50 +672,35 @@ def unsigned_integer_dtypes( @overload -@defines_dtype_strategy def integer_dtypes( *, endianness: str = "?", sizes: Literal[8], ) -> st.SearchStrategy["np.dtype[np.int8]"]: ... - - @overload -@defines_dtype_strategy def integer_dtypes( *, endianness: str = "?", sizes: Literal[16], ) -> st.SearchStrategy["np.dtype[np.int16]"]: ... - - @overload -@defines_dtype_strategy def integer_dtypes( *, endianness: str = "?", sizes: Literal[32], ) -> st.SearchStrategy["np.dtype[np.int32]"]: ... - - @overload -@defines_dtype_strategy def integer_dtypes( *, endianness: str = "?", sizes: Literal[64], ) -> st.SearchStrategy["np.dtype[np.int64]"]: ... - - @overload -@defines_dtype_strategy def integer_dtypes( *, endianness: str = "?", sizes: Sequence[Literal[8, 16, 32, 64]] = (8, 16, 32, 64), ) -> st.SearchStrategy["np.dtype[np.signedinteger[Any]]"]: ... - - @defines_dtype_strategy def integer_dtypes( *, @@ -757,50 +721,35 @@ def integer_dtypes( @overload -@defines_dtype_strategy def floating_dtypes( *, endianness: str = "?", sizes: Literal[16], ) -> st.SearchStrategy["np.dtype[np.float16]"]: ... - - @overload -@defines_dtype_strategy def floating_dtypes( *, endianness: str = "?", sizes: Literal[32], ) -> st.SearchStrategy["np.dtype[np.float32]"]: ... - - @overload -@defines_dtype_strategy def floating_dtypes( *, endianness: str = "?", sizes: Literal[64], ) -> st.SearchStrategy["np.dtype[np.float64]"]: ... - - @overload -@defines_dtype_strategy def floating_dtypes( *, endianness: str = "?", sizes: Literal[128], ) -> st.SearchStrategy["np.dtype[np.float128]"]: ... - - @overload -@defines_dtype_strategy def floating_dtypes( *, endianness: str = "?", sizes: Sequence[Literal[16, 32, 64, 96, 128]] = (16, 32, 64), ) -> st.SearchStrategy["np.dtype[np.floating[Any]]"]: ... - - @defines_dtype_strategy def floating_dtypes( *, @@ -822,41 +771,29 @@ def floating_dtypes( @overload -@defines_dtype_strategy def complex_number_dtypes( *, endianness: str = "?", sizes: Literal[64], ) -> st.SearchStrategy["np.dtype[np.complex64]"]: ... - - @overload -@defines_dtype_strategy def complex_number_dtypes( *, endianness: str = "?", sizes: Literal[128], ) -> st.SearchStrategy["np.dtype[np.complex128]"]: ... - - @overload -@defines_dtype_strategy def complex_number_dtypes( *, endianness: str = "?", sizes: Literal[256], ) -> st.SearchStrategy["np.dtype[np.complex256]"]: ... - - @overload -@defines_dtype_strategy def complex_number_dtypes( *, endianness: str = "?", sizes: Sequence[Literal[64, 128, 192, 256]] = (64, 128), ) -> st.SearchStrategy["np.dtype[np.complexfloating[Any, Any]]"]: ... - - @defines_dtype_strategy def complex_number_dtypes( *, @@ -1175,24 +1112,18 @@ def basic_indices( @overload -@defines_strategy() def integer_array_indices( shape: Shape, *, result_shape: st.SearchStrategy[Shape] = array_shapes(), ) -> "st.SearchStrategy[tuple[NDArray[np.signedinteger[Any]], ...]]": ... - - @overload -@defines_strategy() def integer_array_indices( shape: Shape, *, result_shape: st.SearchStrategy[Shape] = array_shapes(), dtype: "np.dtype[I]", ) -> "st.SearchStrategy[tuple[NDArray[I], ...]]": ... - - @defines_strategy() def integer_array_indices( shape: Shape, From d03cdf3a49028f1f409ba570743daddb6263ab2a Mon Sep 17 00:00:00 2001 From: jorenham Date: Tue, 14 Oct 2025 17:02:14 +0200 Subject: [PATCH 2/6] Add release note for #4564 Co-authored-by: Liam DeVoe --- hypothesis-python/RELEASE.rst | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 hypothesis-python/RELEASE.rst diff --git a/hypothesis-python/RELEASE.rst b/hypothesis-python/RELEASE.rst new file mode 100644 index 0000000000..be0ca127cb --- /dev/null +++ b/hypothesis-python/RELEASE.rst @@ -0,0 +1,3 @@ +RELEASE_TYPE: patch + +clean up internal ``@overload`` type annotations From 2221eab2b2f39e5250c9a52cbccf6f90c73c01a3 Mon Sep 17 00:00:00 2001 From: Liam DeVoe Date: Tue, 14 Oct 2025 11:44:59 -0400 Subject: [PATCH 3/6] add debug note for format error --- tooling/src/hypothesistooling/__main__.py | 26 ++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/tooling/src/hypothesistooling/__main__.py b/tooling/src/hypothesistooling/__main__.py index 8a65915c6a..43375851e4 100644 --- a/tooling/src/hypothesistooling/__main__.py +++ b/tooling/src/hypothesistooling/__main__.py @@ -265,7 +265,31 @@ def check_format(): print(f"{f} has incorrect start {start!r}", file=sys.stderr) bad = True assert not bad - check_not_changed() + try: + check_not_changed() + except Exception: + box_width = 50 + inner_width = box_width - 2 + content_width = inner_width - 2 + msg1 = "Note: code differed after formatting." + msg2 = "To fix this, run:" + msg3 = " ./build.sh format" + + lines = [ + "", + " " + "*" * box_width, + " *" + " " * inner_width + "*", + " * " + msg1 + " " * (content_width - len(msg1)) + "*", + " *" + " " * inner_width + "*", + " * " + msg2 + " " * (content_width - len(msg2)) + "*", + " *" + " " * inner_width + "*", + " * " + msg3 + " " * (content_width - len(msg3)) + "*", + " *" + " " * inner_width + "*", + " " + "*" * box_width, + "", + ] + print("\n".join(lines), file=sys.stderr) + raise def check_not_changed(): From 8a417180057cf86be3dcb08496a03686b4bf7601 Mon Sep 17 00:00:00 2001 From: Liam DeVoe Date: Tue, 14 Oct 2025 11:49:32 -0400 Subject: [PATCH 4/6] spacing --- .../src/hypothesis/extra/numpy.py | 46 +++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/hypothesis-python/src/hypothesis/extra/numpy.py b/hypothesis-python/src/hypothesis/extra/numpy.py index 1bb24a3852..92d6b77472 100644 --- a/hypothesis-python/src/hypothesis/extra/numpy.py +++ b/hypothesis-python/src/hypothesis/extra/numpy.py @@ -427,6 +427,8 @@ def arrays( fill: Optional[st.SearchStrategy[Any]] = None, unique: bool = False, ) -> "st.SearchStrategy[NDArray[G]]": ... + + @overload def arrays( dtype: Union[D, st.SearchStrategy[D]], @@ -436,6 +438,8 @@ def arrays( fill: Optional[st.SearchStrategy[Any]] = None, unique: bool = False, ) -> "st.SearchStrategy[NDArray[Any]]": ... + + @defines_strategy(force_reusable_values=True) def arrays( dtype: Union[D, st.SearchStrategy[D]], @@ -624,30 +628,40 @@ def unsigned_integer_dtypes( endianness: str = "?", sizes: Literal[8], ) -> st.SearchStrategy["np.dtype[np.uint8]"]: ... + + @overload def unsigned_integer_dtypes( *, endianness: str = "?", sizes: Literal[16], ) -> st.SearchStrategy["np.dtype[np.uint16]"]: ... + + @overload def unsigned_integer_dtypes( *, endianness: str = "?", sizes: Literal[32], ) -> st.SearchStrategy["np.dtype[np.uint32]"]: ... + + @overload def unsigned_integer_dtypes( *, endianness: str = "?", sizes: Literal[64], ) -> st.SearchStrategy["np.dtype[np.uint64]"]: ... + + @overload def unsigned_integer_dtypes( *, endianness: str = "?", sizes: Sequence[Literal[8, 16, 32, 64]] = (8, 16, 32, 64), ) -> st.SearchStrategy["np.dtype[np.unsignedinteger[Any]]"]: ... + + @defines_dtype_strategy def unsigned_integer_dtypes( *, @@ -677,30 +691,40 @@ def integer_dtypes( endianness: str = "?", sizes: Literal[8], ) -> st.SearchStrategy["np.dtype[np.int8]"]: ... + + @overload def integer_dtypes( *, endianness: str = "?", sizes: Literal[16], ) -> st.SearchStrategy["np.dtype[np.int16]"]: ... + + @overload def integer_dtypes( *, endianness: str = "?", sizes: Literal[32], ) -> st.SearchStrategy["np.dtype[np.int32]"]: ... + + @overload def integer_dtypes( *, endianness: str = "?", sizes: Literal[64], ) -> st.SearchStrategy["np.dtype[np.int64]"]: ... + + @overload def integer_dtypes( *, endianness: str = "?", sizes: Sequence[Literal[8, 16, 32, 64]] = (8, 16, 32, 64), ) -> st.SearchStrategy["np.dtype[np.signedinteger[Any]]"]: ... + + @defines_dtype_strategy def integer_dtypes( *, @@ -726,30 +750,40 @@ def floating_dtypes( endianness: str = "?", sizes: Literal[16], ) -> st.SearchStrategy["np.dtype[np.float16]"]: ... + + @overload def floating_dtypes( *, endianness: str = "?", sizes: Literal[32], ) -> st.SearchStrategy["np.dtype[np.float32]"]: ... + + @overload def floating_dtypes( *, endianness: str = "?", sizes: Literal[64], ) -> st.SearchStrategy["np.dtype[np.float64]"]: ... + + @overload def floating_dtypes( *, endianness: str = "?", sizes: Literal[128], ) -> st.SearchStrategy["np.dtype[np.float128]"]: ... + + @overload def floating_dtypes( *, endianness: str = "?", sizes: Sequence[Literal[16, 32, 64, 96, 128]] = (16, 32, 64), ) -> st.SearchStrategy["np.dtype[np.floating[Any]]"]: ... + + @defines_dtype_strategy def floating_dtypes( *, @@ -776,24 +810,32 @@ def complex_number_dtypes( endianness: str = "?", sizes: Literal[64], ) -> st.SearchStrategy["np.dtype[np.complex64]"]: ... + + @overload def complex_number_dtypes( *, endianness: str = "?", sizes: Literal[128], ) -> st.SearchStrategy["np.dtype[np.complex128]"]: ... + + @overload def complex_number_dtypes( *, endianness: str = "?", sizes: Literal[256], ) -> st.SearchStrategy["np.dtype[np.complex256]"]: ... + + @overload def complex_number_dtypes( *, endianness: str = "?", sizes: Sequence[Literal[64, 128, 192, 256]] = (64, 128), ) -> st.SearchStrategy["np.dtype[np.complexfloating[Any, Any]]"]: ... + + @defines_dtype_strategy def complex_number_dtypes( *, @@ -1117,6 +1159,8 @@ def integer_array_indices( *, result_shape: st.SearchStrategy[Shape] = array_shapes(), ) -> "st.SearchStrategy[tuple[NDArray[np.signedinteger[Any]], ...]]": ... + + @overload def integer_array_indices( shape: Shape, @@ -1124,6 +1168,8 @@ def integer_array_indices( result_shape: st.SearchStrategy[Shape] = array_shapes(), dtype: "np.dtype[I]", ) -> "st.SearchStrategy[tuple[NDArray[I], ...]]": ... + + @defines_strategy() def integer_array_indices( shape: Shape, From 7745d71e38b10292c0c35f9891b7d50b5c993df2 Mon Sep 17 00:00:00 2001 From: Liam DeVoe Date: Tue, 14 Oct 2025 11:55:00 -0400 Subject: [PATCH 5/6] attempt to deflake --- hypothesis-python/tests/watchdog/test_database.py | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/hypothesis-python/tests/watchdog/test_database.py b/hypothesis-python/tests/watchdog/test_database.py index 44ec430ed0..1a50e33e23 100644 --- a/hypothesis-python/tests/watchdog/test_database.py +++ b/hypothesis-python/tests/watchdog/test_database.py @@ -119,17 +119,25 @@ def test_database_listener_directory_explicit(tmp_path): def listener(event): events.append(event) + time_sleep(0.1) db.add_listener(listener) + time_sleep(0.1) db.save(b"k1", b"v1") - wait_for(lambda: events == [("save", (b"k1", b"v1"))], timeout=60) + wait_for(lambda: events == [("save", (b"k1", b"v1"))], timeout=30) + time_sleep(0.1) db.remove_listener(listener) + time_sleep(0.1) + db.delete(b"k1", b"v1") db.save(b"k1", b"v2") - wait_for(lambda: events == [("save", (b"k1", b"v1"))], timeout=60) + wait_for(lambda: events == [("save", (b"k1", b"v1"))], timeout=30) + time_sleep(0.1) db.add_listener(listener) + time_sleep(0.1) + db.delete(b"k1", b"v2") db.save(b"k1", b"v3") wait_for( From bc8d15a3436d6ef25465a7149778554d1ad46c6e Mon Sep 17 00:00:00 2001 From: Liam DeVoe Date: Tue, 14 Oct 2025 11:55:47 -0400 Subject: [PATCH 6/6] style --- hypothesis-python/RELEASE.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hypothesis-python/RELEASE.rst b/hypothesis-python/RELEASE.rst index be0ca127cb..470f0b3b5f 100644 --- a/hypothesis-python/RELEASE.rst +++ b/hypothesis-python/RELEASE.rst @@ -1,3 +1,3 @@ RELEASE_TYPE: patch -clean up internal ``@overload`` type annotations +Clean up internal ``@overload`` type annotations.