test_dataclass.py


Overview

The [test_dataclass.py](/projects/287/67751) file provides a comprehensive suite of data class definitions and their corresponding unit tests focused on JSON serialization using the `orjson` library. The primary goal of this file is to verify the correct serialization behavior of various Python `dataclasses`, including features like default values, inheritance, slots, recursive and circular references, and integration with abstract base classes.

This file serves both as a test harness to ensure robust serialization of complex data classes and as a demonstration of best practices and edge cases when working with Python data classes and JSON serialization.


Classes and Functions

Enumerations

AnEnum (Enum)

A simple enumeration with two members:

Member

Value

ONE

1

TWO

2


Data Classes

EmptyDataclass

EmptyDataclassSlots

Dataclass1

@dataclass
class Dataclass1:
    name: str
    number: int
    sub: Optional["Dataclass1"]

**Fields:**

Field

Type

Description

name

`str`

Name identifier

number

`int`

Numeric value

sub

`Optional[Dataclass1]`

Optional nested instance or None


Dataclass2

@dataclass
class Dataclass2:
    name: Optional[str] = field(default="?")

Dataclass3

@dataclass
class Dataclass3:
    a: str
    b: int
    c: dict
    d: bool
    e: float
    f: list
    g: tuple

Dataclass4

@dataclass
class Dataclass4:
    a: str = field()
    b: int = field(metadata={"unrelated": False})
    c: float = 1.1

Datasubclass

@dataclass
class Datasubclass(Dataclass1):
    additional: bool

Slotsdataclass

@dataclass
class Slotsdataclass:
    __slots__ = ("_c", "a", "b", "d")
    a: str
    b: int
    _c: str
    d: InitVar[str]
    cls_var: ClassVar[str] = "cls"

Defaultdataclass

@dataclass
class Defaultdataclass:
    a: uuid.UUID
    b: AnEnum

UnsortedDataclass

@dataclass
class UnsortedDataclass:
    c: int
    b: int
    a: int
    d: Optional[dict]

InitDataclass

@dataclass
class InitDataclass:
    a: InitVar[str]
    b: InitVar[str]
    cls_var: ClassVar[str] = "cls"
    ab: str = ""

    def __post_init__(self, a: str, b: str):
        self._other = 1
        self.ab = f"{a} {b}"

Abstract Base Class and Concrete Implementation

AbstractBase

class AbstractBase(abc.ABC):
    @abc.abstractmethod
    def key(self):
        raise NotImplementedError

ConcreteAbc

@dataclass(frozen=True)
class ConcreteAbc(AbstractBase):
    __slots__ = ("attr",)

    attr: float

    def key(self):
        return "dkjf"

Test Classes and Methods

TestDataclass

Contains multiple test methods validating serialization of the above dataclasses with `orjson.dumps`. Key tests include:

TestDataclassPassthrough

Tests behavior when the `OPT_PASSTHROUGH_DATACLASS` option is used:

TestAbstractDataclass


Important Implementation Details and Algorithms


Interaction with Other System Components


Usage Examples

Example: Serializing a recursive dataclass instance

obj = Dataclass1("root", 42, Dataclass1("child", 7, None))
json_bytes = orjson.dumps(obj)
print(json_bytes)
# Output: b'{"name":"root","number":42,"sub":{"name":"child","number":7,"sub":null}}'

Example: Custom serialization for UUID and Enum fields

def default(obj):
    if isinstance(obj, uuid.UUID):
        return str(obj)
    elif isinstance(obj, Enum):
        return obj.value
    raise TypeError

obj = Defaultdataclass(uuid.uuid4(), AnEnum.ONE)
json_bytes = orjson.dumps(obj, default=default)
print(json_bytes)

Mermaid Class Diagram

classDiagram
    class AnEnum {
        <<Enum>>
        +ONE = 1
        +TWO = 2
    }

    class EmptyDataclass {
    }

    class EmptyDataclassSlots {
        __slots__ = ()
    }

    class Dataclass1 {
        +name: str
        +number: int
        +sub: Optional[Dataclass1]
    }

    class Dataclass2 {
        +name: Optional[str] = "?"
    }

    class Dataclass3 {
        +a: str
        +b: int
        +c: dict
        +d: bool
        +e: float
        +f: list
        +g: tuple
    }

    class Dataclass4 {
        +a: str
        +b: int
        +c: float = 1.1
    }

    class Datasubclass {
        +additional: bool
    }

    Dataclass1 <|-- Datasubclass

    class Slotsdataclass {
        __slots__: tuple = ("_c", "a", "b", "d")
        +a: str
        +b: int
        -_c: str
        +d: InitVar[str]
        cls_var: ClassVar[str] = "cls"
    }

    class Defaultdataclass {
        +a: uuid.UUID
        +b: AnEnum
    }

    class UnsortedDataclass {
        +c: int
        +b: int
        +a: int
        +d: Optional[dict]
    }

    class InitDataclass {
        +a: InitVar[str]
        +b: InitVar[str]
        +ab: str
        cls_var: ClassVar[str] = "cls"
        +__post_init__(a: str, b: str)
    }

    class AbstractBase {
        <<abstract>>
        +key()
    }

    class ConcreteAbc {
        __slots__: tuple = ("attr",)
        +attr: float
        +key()
    }

    AbstractBase <|-- ConcreteAbc

Summary

The [test_dataclass.py](/projects/287/67751) file is a focused test module to ensure that Python dataclasses, under various configurations and complexities, are serialized correctly with `orjson`. It covers:

This file is critical for validating the robustness and correctness of JSON serialization for data models used throughout the application.