Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
38 changes: 18 additions & 20 deletions bson/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -90,9 +90,7 @@
BinaryIO,
Callable,
NoReturn,
Optional,
TypeVar,
Union,
cast,
overload,
)
Expand Down Expand Up @@ -248,7 +246,7 @@ def get_data_and_view(data: Any) -> tuple[Any, memoryview]:
return data, memoryview(data)


def _raw_as_bytes(raw: Union[bytes, bytearray, memoryview]) -> bytes:
def _raw_as_bytes(raw: bytes | bytearray | memoryview) -> bytes:
"""Convert a raw BSON buffer (bytes, bytearray, or memoryview) to bytes."""
return raw if isinstance(raw, bytes) else bytes(raw)

Expand Down Expand Up @@ -391,7 +389,7 @@ def _get_array(

def _get_binary(
data: Any, _view: Any, position: int, obj_end: int, opts: CodecOptions[Any], dummy1: Any
) -> tuple[Union[Binary, uuid.UUID], int]:
) -> tuple[Binary | uuid.UUID, int]:
"""Decode a BSON binary to bson.binary.Binary or python UUID."""
length, subtype = _UNPACK_LENGTH_SUBTYPE_FROM(data, position)
position += 5
Expand Down Expand Up @@ -449,7 +447,7 @@ def _get_boolean(

def _get_date(
data: Any, _view: Any, position: int, dummy0: int, opts: CodecOptions[Any], dummy1: Any
) -> tuple[Union[datetime.datetime, DatetimeMS], int]:
) -> tuple[datetime.datetime | DatetimeMS, int]:
"""Decode a BSON datetime to python datetime.datetime."""
return _millis_to_datetime(_UNPACK_LONG_FROM(data, position)[0], opts), position + 8

Expand Down Expand Up @@ -691,7 +689,7 @@ def gen_list_name() -> Generator[bytes, None, None]:
yield (str(next(counter)) + "\x00").encode("utf8")


def _make_c_string_check(string: Union[str, bytes]) -> bytes:
def _make_c_string_check(string: str | bytes) -> bytes:
"""Make a 'C' string, checking for embedded NUL characters."""
if isinstance(string, bytes):
if b"\x00" in string:
Expand All @@ -709,7 +707,7 @@ def _make_c_string_check(string: Union[str, bytes]) -> bytes:
return _utf_8_encode(string)[0] + b"\x00"


def _make_c_string(string: Union[str, bytes]) -> bytes:
def _make_c_string(string: str | bytes) -> bytes:
"""Make a 'C' string."""
if isinstance(string, bytes):
try:
Expand Down Expand Up @@ -1094,8 +1092,8 @@ def decode(data: _ReadableBuffer, codec_options: CodecOptions[_DocumentType]) ->


def decode(
data: _ReadableBuffer, codec_options: Optional[CodecOptions[_DocumentType]] = None
) -> Union[dict[str, Any], _DocumentType]:
data: _ReadableBuffer, codec_options: CodecOptions[_DocumentType] | None = None
) -> dict[str, Any] | _DocumentType:
"""Decode BSON to a document.

By default, returns a BSON document represented as a Python
Expand Down Expand Up @@ -1124,7 +1122,7 @@ def decode(
if not isinstance(opts, CodecOptions):
raise _CODEC_OPTIONS_TYPE_ERROR

return cast("Union[dict[str, Any], _DocumentType]", _bson_to_dict(data, opts))
return cast("dict[str, Any] | _DocumentType", _bson_to_dict(data, opts))


def _decode_all(data: _ReadableBuffer, opts: CodecOptions[_DocumentType]) -> list[_DocumentType]:
Expand Down Expand Up @@ -1177,8 +1175,8 @@ def decode_all(


def decode_all(
data: _ReadableBuffer, codec_options: Optional[CodecOptions[_DocumentType]] = None
) -> Union[list[dict[str, Any]], list[_DocumentType]]:
data: _ReadableBuffer, codec_options: CodecOptions[_DocumentType] | None = None
) -> list[dict[str, Any]] | list[_DocumentType]:
"""Decode BSON data to multiple documents.

`data` must be a bytes-like object implementing the buffer protocol that
Expand Down Expand Up @@ -1232,7 +1230,7 @@ def _decode_selective(
return doc


def _array_of_documents_to_buffer(data: Union[memoryview, bytes]) -> bytes:
def _array_of_documents_to_buffer(data: memoryview | bytes) -> bytes:
# Extract the raw bytes of each document.
position = 0
view = memoryview(data)
Expand Down Expand Up @@ -1329,8 +1327,8 @@ def decode_iter(


def decode_iter(
data: bytes, codec_options: Optional[CodecOptions[_DocumentType]] = None
) -> Union[Iterator[dict[str, Any]], Iterator[_DocumentType]]:
data: bytes, codec_options: CodecOptions[_DocumentType] | None = None
) -> Iterator[dict[str, Any]] | Iterator[_DocumentType]:
"""Decode BSON data to multiple documents as a generator.

Works similarly to the decode_all function, but yields one document at a
Expand Down Expand Up @@ -1365,20 +1363,20 @@ def decode_iter(

@overload
def decode_file_iter(
file_obj: Union[BinaryIO, IO[bytes]], codec_options: None = None
file_obj: BinaryIO | IO[bytes], codec_options: None = None
) -> Iterator[dict[str, Any]]: ...


@overload
def decode_file_iter(
file_obj: Union[BinaryIO, IO[bytes]], codec_options: CodecOptions[_DocumentType]
file_obj: BinaryIO | IO[bytes], codec_options: CodecOptions[_DocumentType]
) -> Iterator[_DocumentType]: ...


def decode_file_iter(
file_obj: Union[BinaryIO, IO[bytes]],
codec_options: Optional[CodecOptions[_DocumentType]] = None,
) -> Union[Iterator[dict[str, Any]], Iterator[_DocumentType]]:
file_obj: BinaryIO | IO[bytes],
codec_options: CodecOptions[_DocumentType] | None = None,
) -> Iterator[dict[str, Any]] | Iterator[_DocumentType]:
"""Decode bson data from a file to multiple documents as a generator.

Works similarly to the decode_all function, but reads from the file object
Expand Down
14 changes: 7 additions & 7 deletions bson/binary.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
import warnings
from collections.abc import Sequence
from enum import Enum
from typing import TYPE_CHECKING, Any, Optional, Union, overload
from typing import TYPE_CHECKING, Any, overload
from uuid import UUID

"""Tools for representing BSON binary data.
Expand Down Expand Up @@ -240,7 +240,7 @@ class BinaryVector:

def __init__(
self,
data: Union[Sequence[float | int], npt.NDArray[np.number]],
data: Sequence[float | int] | npt.NDArray[np.number],
dtype: BinaryVectorDtype,
padding: int = 0,
):
Expand Down Expand Up @@ -311,7 +311,7 @@ class Binary(bytes):

def __new__(
cls: type[Binary],
data: Union[memoryview, bytes, bytearray, _mmap, _array[Any]],
data: memoryview | bytes | bytearray | _mmap | _array[Any],
subtype: int = BINARY_SUBTYPE,
) -> Binary:
if not isinstance(subtype, int):
Expand Down Expand Up @@ -434,7 +434,7 @@ def from_vector(cls: type[Binary], vector: BinaryVector) -> Binary: ...
@overload
def from_vector(
cls: type[Binary],
vector: Union[list[int], list[float]],
vector: list[int] | list[float],
dtype: BinaryVectorDtype,
padding: int = 0,
) -> Binary: ...
Expand All @@ -451,9 +451,9 @@ def from_vector(
@classmethod
def from_vector(
cls: type[Binary],
vector: Union[BinaryVector, list[int], list[float], npt.NDArray[np.number]],
dtype: Optional[BinaryVectorDtype] = None,
padding: Optional[int] = None,
vector: BinaryVector | list[int] | list[float] | npt.NDArray[np.number],
dtype: BinaryVectorDtype | None = None,
padding: int | None = None,
) -> Binary:
"""Create a BSON :class:`~bson.binary.Binary` of Vector subtype.

Expand Down
10 changes: 5 additions & 5 deletions bson/code.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@

from collections.abc import Mapping
from collections.abc import Mapping as _Mapping
from typing import Any, Optional, Union
from typing import Any


class Code(str):
Expand Down Expand Up @@ -49,12 +49,12 @@ class Code(str):
"""

_type_marker = 13
__scope: Union[Mapping[str, Any], None]
__scope: Mapping[str, Any] | None

def __new__(
cls: type[Code],
code: Union[str, Code],
scope: Optional[Mapping[str, Any]] = None,
code: str | Code,
scope: Mapping[str, Any] | None = None,
**kwargs: Any,
) -> Code:
if not isinstance(code, str):
Expand Down Expand Up @@ -84,7 +84,7 @@ def __new__(
return self

@property
def scope(self) -> Optional[Mapping[str, Any]]:
def scope(self) -> Mapping[str, Any] | None:
"""Scope dictionary for this instance or ``None``."""
return self.__scope

Expand Down
42 changes: 20 additions & 22 deletions bson/codec_options.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,6 @@
Callable,
Generic,
NamedTuple,
Optional,
Union,
cast,
)

Expand Down Expand Up @@ -104,7 +102,7 @@ class TypeCodec(TypeEncoder, TypeDecoder):
"""


_Codec = Union[TypeEncoder, TypeDecoder, TypeCodec]
_Codec = TypeEncoder | TypeDecoder | TypeCodec
_Fallback = Callable[[Any], Any]


Expand Down Expand Up @@ -136,8 +134,8 @@ class TypeRegistry:

def __init__(
self,
type_codecs: Optional[Iterable[_Codec]] = None,
fallback_encoder: Optional[_Fallback] = None,
type_codecs: Iterable[_Codec] | None = None,
fallback_encoder: _Fallback | None = None,
) -> None:
self.__type_codecs = list(type_codecs or [])
self._fallback_encoder = fallback_encoder
Expand Down Expand Up @@ -168,7 +166,7 @@ def codecs(self) -> list[TypeEncoder | TypeDecoder | TypeCodec]:
return self.__type_codecs

@property
def fallback_encoder(self) -> Optional[_Fallback]:
def fallback_encoder(self) -> _Fallback | None:
"""The fallback encoder in this registry."""
return self._fallback_encoder

Expand Down Expand Up @@ -238,9 +236,9 @@ class _BaseCodecOptions(NamedTuple):
tz_aware: bool
uuid_representation: int
unicode_decode_error_handler: str
tzinfo: Optional[datetime.tzinfo]
tzinfo: datetime.tzinfo | None
type_registry: TypeRegistry
datetime_conversion: Optional[DatetimeConversion]
datetime_conversion: DatetimeConversion | None


if TYPE_CHECKING:
Expand All @@ -249,20 +247,20 @@ class CodecOptions(tuple[_DocumentType], Generic[_DocumentType]):
document_class: type[_DocumentType]
tz_aware: bool
uuid_representation: int
unicode_decode_error_handler: Optional[str]
tzinfo: Optional[datetime.tzinfo]
unicode_decode_error_handler: str | None
tzinfo: datetime.tzinfo | None
type_registry: TypeRegistry
datetime_conversion: Optional[int]
datetime_conversion: int | None

def __new__(
cls: type[CodecOptions[_DocumentType]],
document_class: Optional[type[_DocumentType]] = ...,
document_class: type[_DocumentType] | None = ...,
tz_aware: bool = ...,
uuid_representation: Optional[int] = ...,
unicode_decode_error_handler: Optional[str] = ...,
tzinfo: Optional[datetime.tzinfo] = ...,
type_registry: Optional[TypeRegistry] = ...,
datetime_conversion: Optional[int] = ...,
uuid_representation: int | None = ...,
unicode_decode_error_handler: str | None = ...,
tzinfo: datetime.tzinfo | None = ...,
type_registry: TypeRegistry | None = ...,
datetime_conversion: int | None = ...,
) -> CodecOptions[_DocumentType]: ...

# CodecOptions API
Expand Down Expand Up @@ -372,13 +370,13 @@ def __init__(self, *args, **kwargs):

def __new__(
cls: type[CodecOptions],
document_class: Optional[type[Mapping[str, Any]]] = None,
document_class: type[Mapping[str, Any]] | None = None,
tz_aware: bool = False,
uuid_representation: Optional[int] = UuidRepresentation.UNSPECIFIED,
uuid_representation: int | None = UuidRepresentation.UNSPECIFIED,
unicode_decode_error_handler: str = "strict",
tzinfo: Optional[datetime.tzinfo] = None,
type_registry: Optional[TypeRegistry] = None,
datetime_conversion: Optional[DatetimeConversion] = DatetimeConversion.DATETIME,
tzinfo: datetime.tzinfo | None = None,
type_registry: TypeRegistry | None = None,
datetime_conversion: DatetimeConversion | None = DatetimeConversion.DATETIME,
) -> CodecOptions:
doc_class = document_class or dict
# Generic aliases like SON[str, Any] or dict[str, Any] aren't classes, so
Expand Down
16 changes: 7 additions & 9 deletions bson/datetime_ms.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@

import calendar
import datetime
from typing import Any, Union, cast
from typing import Any, cast

from bson.codec_options import DEFAULT_CODEC_OPTIONS, CodecOptions, DatetimeConversion
from bson.errors import InvalidBSON
Expand All @@ -41,7 +41,7 @@ class DatetimeMS:

__slots__ = ("_value",)

def __init__(self, value: Union[int, datetime.datetime]):
def __init__(self, value: int | datetime.datetime):
"""Represents a BSON UTC datetime.

BSON UTC datetimes are defined as an int64 of milliseconds since the
Expand Down Expand Up @@ -74,10 +74,10 @@ def __hash__(self) -> int:
def __repr__(self) -> str:
return type(self).__name__ + "(" + str(self._value) + ")"

def __lt__(self, other: Union[DatetimeMS, int]) -> bool:
def __lt__(self, other: DatetimeMS | int) -> bool:
return self._value < other

def __le__(self, other: Union[DatetimeMS, int]) -> bool:
def __le__(self, other: DatetimeMS | int) -> bool:
return self._value <= other

def __eq__(self, other: Any) -> bool:
Expand All @@ -90,10 +90,10 @@ def __ne__(self, other: Any) -> bool:
return self._value != other._value
return True

def __gt__(self, other: Union[DatetimeMS, int]) -> bool:
def __gt__(self, other: DatetimeMS | int) -> bool:
return self._value > other

def __ge__(self, other: Union[DatetimeMS, int]) -> bool:
def __ge__(self, other: DatetimeMS | int) -> bool:
return self._value >= other

_type_marker = 9
Expand Down Expand Up @@ -146,9 +146,7 @@ def _max_datetime_ms(tz: datetime.tzinfo = utc) -> int:
return min(_MAX_UTC_MS, _MAX_UTC_MS - offset_millis)


def _millis_to_datetime(
millis: int, opts: CodecOptions[Any]
) -> Union[datetime.datetime, DatetimeMS]:
def _millis_to_datetime(millis: int, opts: CodecOptions[Any]) -> datetime.datetime | DatetimeMS:
"""Convert milliseconds since epoch UTC to datetime."""
if (
opts.datetime_conversion == DatetimeConversion.DATETIME
Expand Down
8 changes: 4 additions & 4 deletions bson/dbref.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@

from collections.abc import Mapping
from copy import deepcopy
from typing import Any, Optional
from typing import Any

from bson._helpers import _getstate_slots, _setstate_slots
from bson.son import SON
Expand All @@ -37,8 +37,8 @@ def __init__(
self,
collection: str,
id: Any,
database: Optional[str] = None,
_extra: Optional[Mapping[str, Any]] = None,
database: str | None = None,
_extra: Mapping[str, Any] | None = None,
**kwargs: Any,
) -> None:
"""Initialize a new :class:`DBRef`.
Expand Down Expand Up @@ -79,7 +79,7 @@ def id(self) -> Any:
return self.__id

@property
def database(self) -> Optional[str]:
def database(self) -> str | None:
"""Get the name of this DBRef's database.

Returns None if this DBRef doesn't specify a database.
Expand Down
Loading
Loading