summaryrefslogtreecommitdiffstats
path: root/contrib/python
diff options
context:
space:
mode:
authorYDBot <[email protected]>2026-06-21 01:39:12 +0000
committerYDBot <[email protected]>2026-06-21 01:39:12 +0000
commita092ef090f65bb495a846c2f00af14508becd0c2 (patch)
treec802ad236b28d438b0eb1054db75ac3b687eacfe /contrib/python
parent84f51d19457d15b671fad2edfaac96ecd9686c4f (diff)
parentc013015d7d1832b26ec39a320f36729137c3e16d (diff)
Sync branches 260621-0136
Diffstat (limited to 'contrib/python')
-rw-r--r--contrib/python/hypothesis/py3/.dist-info/METADATA6
-rw-r--r--contrib/python/hypothesis/py3/hypothesis/strategies/_internal/datetime.py43
-rw-r--r--contrib/python/hypothesis/py3/hypothesis/version.py2
-rw-r--r--contrib/python/hypothesis/py3/ya.make2
-rw-r--r--contrib/python/traitlets/py3/.dist-info/METADATA5
-rw-r--r--contrib/python/traitlets/py3/tests/test_typing.py66
-rw-r--r--contrib/python/traitlets/py3/traitlets/_version.py2
-rw-r--r--contrib/python/traitlets/py3/traitlets/config/application.py2
-rw-r--r--contrib/python/traitlets/py3/ya.make2
9 files changed, 78 insertions, 52 deletions
diff --git a/contrib/python/hypothesis/py3/.dist-info/METADATA b/contrib/python/hypothesis/py3/.dist-info/METADATA
index da12b2f59f0..087eb11eaaa 100644
--- a/contrib/python/hypothesis/py3/.dist-info/METADATA
+++ b/contrib/python/hypothesis/py3/.dist-info/METADATA
@@ -1,6 +1,6 @@
Metadata-Version: 2.4
Name: hypothesis
-Version: 6.155.1
+Version: 6.155.2
Summary: The property-based testing library for Python
Author-email: "David R. MacIver and Zac Hatfield-Dodds" <[email protected]>
License-Expression: MPL-2.0
@@ -61,7 +61,7 @@ Provides-Extra: redis
Requires-Dist: redis>=3.0.0; extra == "redis"
Provides-Extra: crosshair
Requires-Dist: hypothesis-crosshair>=0.0.28; extra == "crosshair"
-Requires-Dist: crosshair-tool>=0.0.104; extra == "crosshair"
+Requires-Dist: crosshair-tool>=0.0.106; extra == "crosshair"
Provides-Extra: zoneinfo
Requires-Dist: tzdata>=2026.2; (sys_platform == "win32" or sys_platform == "emscripten") and extra == "zoneinfo"
Provides-Extra: django
@@ -71,7 +71,7 @@ Requires-Dist: watchdog>=4.0.0; extra == "watchdog"
Provides-Extra: all
Requires-Dist: black>=20.8b0; extra == "all"
Requires-Dist: click>=7.0; extra == "all"
-Requires-Dist: crosshair-tool>=0.0.104; extra == "all"
+Requires-Dist: crosshair-tool>=0.0.106; extra == "all"
Requires-Dist: django>=5.2; extra == "all"
Requires-Dist: dpcontracts>=0.4; extra == "all"
Requires-Dist: hypothesis-crosshair>=0.0.28; extra == "all"
diff --git a/contrib/python/hypothesis/py3/hypothesis/strategies/_internal/datetime.py b/contrib/python/hypothesis/py3/hypothesis/strategies/_internal/datetime.py
index 62d97b91fee..c5e8bfaaf5c 100644
--- a/contrib/python/hypothesis/py3/hypothesis/strategies/_internal/datetime.py
+++ b/contrib/python/hypothesis/py3/hypothesis/strategies/_internal/datetime.py
@@ -12,7 +12,6 @@ import datetime as dt
import operator as op
import warnings
import zoneinfo
-from calendar import monthrange
from functools import cache, partial
from importlib import resources
from pathlib import Path
@@ -88,26 +87,54 @@ def datetime_does_not_exist(value):
return value != roundtrip
+def _num_days_in_month(year, month):
+ """Branchless equivalent of ``monthrange(year, month)[1]`` for valid inputs.
+
+ Written using only arithmetic and (in)equality, with no branching or indexing.
+ This avoids concretizing the input or adding more path constraints than necessary.
+ """
+ leap = (year % 4 == 0) * (1 - (year % 100 == 0) * (year % 400 != 0))
+ is_feb = month == 2
+ is_30_day = 1 - (month != 4) * (month != 6) * (month != 9) * (month != 11)
+ return 31 - is_30_day - is_feb * (3 - leap)
+
+
def draw_capped_multipart(
data, min_value, max_value, duration_names=DATENAMES + TIMENAMES
):
assert isinstance(min_value, (dt.date, dt.time, dt.datetime))
assert type(min_value) == type(max_value)
assert min_value <= max_value
+
+ # cap_{low, high} records whether every field drawn so far has equalled
+ # ``min_value``'s / ``max_value``'s, i.e. whether that bound is still "active" and
+ # constrains the next field.
+ #
+ # cap_{low, high} are conceptually booleans. We define them as integers and interpret
+ # boolean operations on them as multiplication, so that we don't concretize or
+ # branch under symbolic backends. See
+ # https://github.com/HypothesisWorks/hypothesis/issues/4759.
+ cap_low = 1
+ cap_high = 1
result = {}
- cap_low, cap_high = True, True
for name in duration_names:
- low = getattr(min_value if cap_low else dt.datetime.min, name)
- high = getattr(max_value if cap_high else dt.datetime.max, name)
- if name == "day" and not cap_high:
- _, high = monthrange(**result)
+ natural_low = getattr(dt.datetime.min, name)
+ if name == "day":
+ natural_high = _num_days_in_month(result["year"], result["month"])
+ else:
+ natural_high = getattr(dt.datetime.max, name)
+ # equivalent to:
+ # low = min_value.<name> if cap_low else natural_low
+ # high = max_value.<name> if cap_high else natural_high
+ low = natural_low + cap_low * (getattr(min_value, name) - natural_low)
+ high = natural_high + cap_high * (getattr(max_value, name) - natural_high)
if name == "year":
val = data.draw_integer(low, high, shrink_towards=2000)
else:
val = data.draw_integer(low, high)
result[name] = val
- cap_low = cap_low and val == low
- cap_high = cap_high and val == high
+ cap_low = cap_low * (val == low)
+ cap_high = cap_high * (val == high)
if hasattr(min_value, "fold"):
# The `fold` attribute is ignored in comparison of naive datetimes.
# In tz-aware datetimes it would require *very* invasive changes to
diff --git a/contrib/python/hypothesis/py3/hypothesis/version.py b/contrib/python/hypothesis/py3/hypothesis/version.py
index c513f1ef801..b71a3693b09 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, 155, 1)
+__version_info__ = (6, 155, 2)
__version__ = ".".join(map(str, __version_info__))
diff --git a/contrib/python/hypothesis/py3/ya.make b/contrib/python/hypothesis/py3/ya.make
index 30dca82125f..59ebb1c2ba5 100644
--- a/contrib/python/hypothesis/py3/ya.make
+++ b/contrib/python/hypothesis/py3/ya.make
@@ -2,7 +2,7 @@
PY3_LIBRARY()
-VERSION(6.155.1)
+VERSION(6.155.2)
LICENSE(MPL-2.0)
diff --git a/contrib/python/traitlets/py3/.dist-info/METADATA b/contrib/python/traitlets/py3/.dist-info/METADATA
index 379f2d9c97b..1867e373948 100644
--- a/contrib/python/traitlets/py3/.dist-info/METADATA
+++ b/contrib/python/traitlets/py3/.dist-info/METADATA
@@ -1,6 +1,6 @@
Metadata-Version: 2.4
Name: traitlets
-Version: 5.15.0
+Version: 5.15.1
Summary: Traitlets Python configuration system
Project-URL: Homepage, https://github.com/ipython/traitlets
Project-URL: Documentation, https://traitlets.readthedocs.io
@@ -56,8 +56,7 @@ Requires-Dist: pydata-sphinx-theme; extra == 'docs'
Requires-Dist: sphinx; extra == 'docs'
Provides-Extra: test
Requires-Dist: argcomplete>=3.0.3; extra == 'test'
-Requires-Dist: mypy<1.19,>=1.7.0; (platform_python_implementation == 'PyPy') and extra == 'test'
-Requires-Dist: mypy>=1.7.0; extra == 'test'
+Requires-Dist: mypy<1.19,>=1.17.0; extra == 'test'
Requires-Dist: pre-commit; extra == 'test'
Requires-Dist: pytest-mock; extra == 'test'
Requires-Dist: pytest-mypy-testing; extra == 'test'
diff --git a/contrib/python/traitlets/py3/tests/test_typing.py b/contrib/python/traitlets/py3/tests/test_typing.py
index 940447478dc..b1090928a30 100644
--- a/contrib/python/traitlets/py3/tests/test_typing.py
+++ b/contrib/python/traitlets/py3/tests/test_typing.py
@@ -185,27 +185,27 @@ def mypy_unicode_typing() -> None:
t = T()
reveal_type(
- Unicode( # R: traitlets.traitlets.Unicode[builtins.str, Union[builtins.str, builtins.bytes]]
+ Unicode( # R: traitlets.traitlets.Unicode[builtins.str, builtins.str | builtins.bytes]
"foo"
)
)
reveal_type(
- Unicode( # R: traitlets.traitlets.Unicode[builtins.str, Union[builtins.str, builtins.bytes]]
+ Unicode( # R: traitlets.traitlets.Unicode[builtins.str, builtins.str | builtins.bytes]
""
).tag(sync=True)
)
reveal_type(
- Unicode( # R: traitlets.traitlets.Unicode[Union[builtins.str, None], Union[builtins.str, builtins.bytes, None]]
+ Unicode( # R: traitlets.traitlets.Unicode[builtins.str | None, builtins.str | builtins.bytes | None]
None, allow_none=True
)
)
reveal_type(
- Unicode( # R: traitlets.traitlets.Unicode[Union[builtins.str, None], Union[builtins.str, builtins.bytes, None]]
+ Unicode( # R: traitlets.traitlets.Unicode[builtins.str | None, builtins.str | builtins.bytes | None]
None, allow_none=True
).tag(sync=True)
)
reveal_type(
- T.export_format # R: traitlets.traitlets.Unicode[builtins.str, Union[builtins.str, builtins.bytes]]
+ T.export_format # R: traitlets.traitlets.Unicode[builtins.str, builtins.str | builtins.bytes]
)
reveal_type(t.export_format) # R: builtins.str
@@ -312,37 +312,37 @@ def mypy_bool_typing() -> None:
t = T()
reveal_type(
- Bool(True) # R: traitlets.traitlets.Bool[builtins.bool, Union[builtins.bool, builtins.int]]
+ Bool(True) # R: traitlets.traitlets.Bool[builtins.bool, builtins.bool | builtins.int]
)
reveal_type(
- Bool( # R: traitlets.traitlets.Bool[builtins.bool, Union[builtins.bool, builtins.int]]
+ Bool( # R: traitlets.traitlets.Bool[builtins.bool, builtins.bool | builtins.int]
True
).tag(sync=True)
)
reveal_type(
- Bool( # R: traitlets.traitlets.Bool[Union[builtins.bool, None], Union[builtins.bool, builtins.int, None]]
+ Bool( # R: traitlets.traitlets.Bool[builtins.bool | None, builtins.bool | builtins.int | None]
None, allow_none=True
)
)
reveal_type(
- Bool( # R: traitlets.traitlets.Bool[Union[builtins.bool, None], Union[builtins.bool, builtins.int, None]]
+ Bool( # R: traitlets.traitlets.Bool[builtins.bool | None, builtins.bool | builtins.int | None]
None, allow_none=True
).tag(sync=True)
)
reveal_type(
- T.b # R: traitlets.traitlets.Bool[builtins.bool, Union[builtins.bool, builtins.int]]
+ T.b # R: traitlets.traitlets.Bool[builtins.bool, builtins.bool | builtins.int]
)
reveal_type(t.b) # R: builtins.bool
- reveal_type(t.ob) # R: Union[builtins.bool, None]
+ reveal_type(t.ob) # R: builtins.bool | None
reveal_type(
- T.b # R: traitlets.traitlets.Bool[builtins.bool, Union[builtins.bool, builtins.int]]
+ T.b # R: traitlets.traitlets.Bool[builtins.bool, builtins.bool | builtins.int]
)
reveal_type(
- T.ob # R: traitlets.traitlets.Bool[Union[builtins.bool, None], Union[builtins.bool, builtins.int, None]]
+ T.ob # R: traitlets.traitlets.Bool[builtins.bool | None, builtins.bool | builtins.int | None]
)
- # we would expect this to be Optional[Union[bool, int]], but...
- t.b = "foo" # E: Incompatible types in assignment (expression has type "str", variable has type "Union[bool, int]") [assignment]
- t.b = None # E: Incompatible types in assignment (expression has type "None", variable has type "Union[bool, int]") [assignment]
+ # we would expect this to be Optional[bool | int], but...
+ t.b = "foo" # E: Incompatible types in assignment (expression has type "str", variable has type "bool | int") [assignment]
+ t.b = None # E: Incompatible types in assignment (expression has type "None", variable has type "bool | int") [assignment]
@pytest.mark.mypy_testing
@@ -355,21 +355,21 @@ def mypy_int_typing() -> None:
reveal_type(Int(True)) # R: traitlets.traitlets.Int[builtins.int, builtins.int]
reveal_type(Int(True).tag(sync=True)) # R: traitlets.traitlets.Int[builtins.int, builtins.int]
reveal_type(
- Int( # R: traitlets.traitlets.Int[Union[builtins.int, None], Union[builtins.int, None]]
+ Int( # R: traitlets.traitlets.Int[builtins.int | None, builtins.int | None]
None, allow_none=True
)
)
reveal_type(
- Int( # R: traitlets.traitlets.Int[Union[builtins.int, None], Union[builtins.int, None]]
+ Int( # R: traitlets.traitlets.Int[builtins.int | None, builtins.int | None]
None, allow_none=True
).tag(sync=True)
)
reveal_type(T.i) # R: traitlets.traitlets.Int[builtins.int, builtins.int]
reveal_type(t.i) # R: builtins.int
- reveal_type(t.oi) # R: Union[builtins.int, None]
+ reveal_type(t.oi) # R: builtins.int | None
reveal_type(T.i) # R: traitlets.traitlets.Int[builtins.int, builtins.int]
reveal_type(
- T.oi # R: traitlets.traitlets.Int[Union[builtins.int, None], Union[builtins.int, None]]
+ T.oi # R: traitlets.traitlets.Int[builtins.int | None, builtins.int | None]
)
t.i = "foo" # E: Incompatible types in assignment (expression has type "str", variable has type "int") [assignment]
t.i = None # E: Incompatible types in assignment (expression has type "None", variable has type "int") [assignment]
@@ -386,18 +386,18 @@ def mypy_cint_typing() -> None:
reveal_type(CInt(42)) # R: traitlets.traitlets.CInt[builtins.int, Any]
reveal_type(CInt(42).tag(sync=True)) # R: traitlets.traitlets.CInt[builtins.int, Any]
reveal_type(
- CInt(None, allow_none=True) # R: traitlets.traitlets.CInt[Union[builtins.int, None], Any]
+ CInt(None, allow_none=True) # R: traitlets.traitlets.CInt[builtins.int | None, Any]
)
reveal_type(
- CInt( # R: traitlets.traitlets.CInt[Union[builtins.int, None], Any]
+ CInt( # R: traitlets.traitlets.CInt[builtins.int | None, Any]
None, allow_none=True
).tag(sync=True)
)
reveal_type(T.i) # R: traitlets.traitlets.CInt[builtins.int, Any]
reveal_type(t.i) # R: builtins.int
- reveal_type(t.oi) # R: Union[builtins.int, None]
+ reveal_type(t.oi) # R: builtins.int | None
reveal_type(T.i) # R: traitlets.traitlets.CInt[builtins.int, Any]
- reveal_type(T.oi) # R: traitlets.traitlets.CInt[Union[builtins.int, None], Any]
+ reveal_type(T.oi) # R: traitlets.traitlets.CInt[builtins.int | None, Any]
@pytest.mark.mypy_testing
@@ -416,17 +416,17 @@ def mypy_tcp_typing() -> None:
sync=True
)
)
- reveal_type(t.otcp) # R: Union[tuple[builtins.str, builtins.int], None]
+ reveal_type(t.otcp) # R: tuple[builtins.str, builtins.int] | None
reveal_type(
- T.otcp # R: traitlets.traitlets.TCPAddress[Union[tuple[builtins.str, builtins.int], None], Union[tuple[builtins.str, builtins.int], None]]
+ T.otcp # R: traitlets.traitlets.TCPAddress[tuple[builtins.str, builtins.int] | None, tuple[builtins.str, builtins.int] | None]
)
reveal_type(
- T.otcp.tag( # R: traitlets.traitlets.TCPAddress[Union[tuple[builtins.str, builtins.int], None], Union[tuple[builtins.str, builtins.int], None]]
+ T.otcp.tag( # R: traitlets.traitlets.TCPAddress[tuple[builtins.str, builtins.int] | None, tuple[builtins.str, builtins.int] | None]
sync=True
)
)
t.tcp = "foo" # E: Incompatible types in assignment (expression has type "str", variable has type "tuple[str, int]") [assignment]
- t.otcp = "foo" # E: Incompatible types in assignment (expression has type "str", variable has type "Optional[tuple[str, int]]") [assignment]
+ t.otcp = "foo" # E: Incompatible types in assignment (expression has type "str", variable has type "tuple[str, int] | None") [assignment]
t.tcp = None # E: Incompatible types in assignment (expression has type "None", variable has type "tuple[str, int]") [assignment]
@@ -441,14 +441,14 @@ def mypy_instance_typing() -> None:
reveal_type(t.inst) # R: tests.test_typing.Foo
reveal_type(T.inst) # R: traitlets.traitlets.Instance[tests.test_typing.Foo]
reveal_type(T.inst.tag(sync=True)) # R: traitlets.traitlets.Instance[tests.test_typing.Foo]
- reveal_type(t.oinst) # R: Union[tests.test_typing.Foo, None]
- reveal_type(t.oinst_string) # R: Union[Any, None]
- reveal_type(T.oinst) # R: traitlets.traitlets.Instance[Union[tests.test_typing.Foo, None]]
+ reveal_type(t.oinst) # R: tests.test_typing.Foo | None
+ reveal_type(t.oinst_string) # R: Any | None
+ reveal_type(T.oinst) # R: traitlets.traitlets.Instance[tests.test_typing.Foo | None]
reveal_type(
- T.oinst.tag( # R: traitlets.traitlets.Instance[Union[tests.test_typing.Foo, None]]
+ T.oinst.tag( # R: traitlets.traitlets.Instance[tests.test_typing.Foo | None]
sync=True
)
)
t.inst = "foo" # E: Incompatible types in assignment (expression has type "str", variable has type "Foo") [assignment]
- t.oinst = "foo" # E: Incompatible types in assignment (expression has type "str", variable has type "Optional[Foo]") [assignment]
+ t.oinst = "foo" # E: Incompatible types in assignment (expression has type "str", variable has type "Foo | None") [assignment]
t.inst = None # E: Incompatible types in assignment (expression has type "None", variable has type "Foo") [assignment]
diff --git a/contrib/python/traitlets/py3/traitlets/_version.py b/contrib/python/traitlets/py3/traitlets/_version.py
index fb2dbc36d16..ae4eaf842c4 100644
--- a/contrib/python/traitlets/py3/traitlets/_version.py
+++ b/contrib/python/traitlets/py3/traitlets/_version.py
@@ -6,7 +6,7 @@ from __future__ import annotations
import re
# Version string must appear intact for hatch versioning
-__version__ = "5.15.0"
+__version__ = "5.15.1"
# Build up version_info tuple for backwards compatibility
pattern = r"(?P<major>\d+).(?P<minor>\d+).(?P<patch>\d+)(?P<rest>.*)"
diff --git a/contrib/python/traitlets/py3/traitlets/config/application.py b/contrib/python/traitlets/py3/traitlets/config/application.py
index b07ca818fc8..1d475c583c8 100644
--- a/contrib/python/traitlets/py3/traitlets/config/application.py
+++ b/contrib/python/traitlets/py3/traitlets/config/application.py
@@ -216,7 +216,7 @@ class Application(SingletonConfigurable):
log_datefmt = Unicode(
"%Y-%m-%d %H:%M:%S",
- help="The date format used by logging formatters for `asctime`",
+ help="The date format used by logging formatters for `logging.Formatter` ``datefmt`` parameter",
).tag(config=True)
log_format = Unicode(
diff --git a/contrib/python/traitlets/py3/ya.make b/contrib/python/traitlets/py3/ya.make
index 545b7dcfca3..7e0b5c22b88 100644
--- a/contrib/python/traitlets/py3/ya.make
+++ b/contrib/python/traitlets/py3/ya.make
@@ -4,7 +4,7 @@ PY3_LIBRARY()
PROVIDES(python_traitlets)
-VERSION(5.15.0)
+VERSION(5.15.1)
LICENSE(BSD-3-Clause)