Coverage for sbe2/schema/primitive_type.py: 100%
30 statements
« prev ^ index » next coverage.py v7.9.1, created at 2025-06-21 19:48 +0200
« prev ^ index » next coverage.py v7.9.1, created at 2025-06-21 19:48 +0200
1from dataclasses import dataclass
2from functools import cached_property
3from typing import ClassVar
5@dataclass
6class PrimitiveType:
7 """
8 Represents a primitive type built into SBE.
9 """
10 name: str # Name of the primitive type
11 length: int # Length of the primitive type in bytes
12 max_value: int | float | str # Maximum value for the primitive type
13 min_value: int | float | str # Minimum value for the primitive type
14 default_null_value: int | float | str # Default null value for the primitive type
15 base_type: type # Python type equivalent
17 by_name: ClassVar[dict[str, "PrimitiveType"]] = {}
19 @cached_property
20 def is_byte(self) -> bool:
21 """
22 Returns True if this primitive type is a byte.
23 """
24 return self.length == 1
28 def __post_init__(self):
29 """
30 Post-initialization to register the primitive type by its name.
31 """
32 if self.name in PrimitiveType.by_name:
33 raise ValueError(f"Primitive type '{self.name}' is already registered.") # pragma: no cover
34 PrimitiveType.by_name[self.name] = self
37char = PrimitiveType(name='char', length=1, max_value=126, min_value=26, default_null_value=0, base_type=str)
38int_ = PrimitiveType(name='int', length=4, max_value=2**31-1, min_value=-(2**31-1), default_null_value=-(2**31), base_type=int)
39int8 = PrimitiveType(name='int8', length=1, max_value=127, min_value=-127, default_null_value=-128, base_type=int)
40int16 = PrimitiveType(name='int16', length=2, max_value=(2**15-1), min_value=-(2**15-1), default_null_value=-(2**15), base_type=int)
41int32 = PrimitiveType(name='int32', length=4, max_value=(2**31-1), min_value=-(2**31-1), default_null_value=-(2**31), base_type=int)
42int64 = PrimitiveType(name='int64', length=8, max_value=(2**63-1), min_value=-(2**63-1), default_null_value=-(2**63), base_type=int)
43uint8 = PrimitiveType(name='uint8', length=1, max_value=2**8-2, min_value=0, default_null_value=2**8-1, base_type=int)
44uint16 = PrimitiveType(name='uint16', length=2, max_value=2**16-2, min_value=0, default_null_value=2**16-1, base_type=int)
45uint32 = PrimitiveType(name='uint32', length=4, max_value=2**32-2, min_value=0, default_null_value=2**32-1, base_type=int)
46uint64 = PrimitiveType(name='uint64', length=8, max_value=2**64-2, min_value=0, default_null_value=2**64-1, base_type=int)
47float_ = PrimitiveType(name='float', length=4, max_value=float('inf'), min_value=-float('inf'), default_null_value=float('nan'), base_type=float)
48double = PrimitiveType(name='double', length=8, max_value=float('inf'), min_value=-float('inf'), default_null_value=float('nan'), base_type=float)