microecs.component

component.py - submodule holind the base class for all components, which is just a dataclass wrapper

 1"""component.py - submodule holind the base class for all components, which is just a dataclass wrapper"""
 2from dataclasses import dataclass, field, Field
 3from typing import Any
 4import numpy as np
 5
 6class Component:
 7    """Base for ECS components: subclassing auto-applies @dataclass(kw_only=True)."""
 8    def __init_subclass__(cls, **kwargs):
 9        super().__init_subclass__(**kwargs)
10        dataclass(kw_only=True)(cls)
11
12ComponentType = type[Component]
13
14# helper functions to build components and fields
15
16class zeros: # pylint: disable=all
17    """special object so we can instantiate with e.g. f32(..., default=zeros)"""
18
19def _make_field(dtype: str, shape: tuple[int, ...], default: Any = None, **extra) -> Field:
20    if default is zeros:
21        if dtype == "object":
22            default = np.full(shape, fill_value=None, dtype="object")
23        else:
24            default = np.zeros(shape, dtype=dtype)
25    # pylint: disable=invalid-field-call  # builder pattern: Field is consumed by @dataclass on the Component subclass
26    return field(metadata={**extra, "shape": shape, "dtype": dtype, "default": default})
27
28def f32(shape: tuple[int, ...], default: Any = None, **extra) -> Field:
29    """Builds a float32 field; kwargs (e.g. serializable/comment) go into the field's metadata."""
30    return _make_field("float32", shape, default, **extra)
31
32def i32(shape: tuple[int, ...], default: Any = None, **extra) -> Field:
33    """Builds a int32 field; kwargs (e.g. serializable/comment) go into the field's metadata."""
34    return _make_field("int32", shape, default, **extra)
35
36def obj(shape: tuple[int, ...], default: Any = None, **extra) -> Field:
37    """Builds a object field; kwargs (e.g. serializable/comment) go into the field's metadata."""
38    return _make_field("object", shape, default, **extra)
39
40def boolf(shape: tuple[int, ...], default: Any = None, **extra) -> Field:
41    """Builds a bool field; kwargs (e.g. serializable/comment) go into the field's metadata."""
42    return _make_field("bool", shape, default, **extra)
class Component:
 7class Component:
 8    """Base for ECS components: subclassing auto-applies @dataclass(kw_only=True)."""
 9    def __init_subclass__(cls, **kwargs):
10        super().__init_subclass__(**kwargs)
11        dataclass(kw_only=True)(cls)

Base for ECS components: subclassing auto-applies @dataclass(kw_only=True).

ComponentType = type[Component]
class zeros:
17class zeros: # pylint: disable=all
18    """special object so we can instantiate with e.g. f32(..., default=zeros)"""

special object so we can instantiate with e.g. f32(..., default=zeros)

def f32( shape: tuple[int, ...], default: Any = None, **extra) -> dataclasses.Field:
29def f32(shape: tuple[int, ...], default: Any = None, **extra) -> Field:
30    """Builds a float32 field; kwargs (e.g. serializable/comment) go into the field's metadata."""
31    return _make_field("float32", shape, default, **extra)

Builds a float32 field; kwargs (e.g. serializable/comment) go into the field's metadata.

def i32( shape: tuple[int, ...], default: Any = None, **extra) -> dataclasses.Field:
33def i32(shape: tuple[int, ...], default: Any = None, **extra) -> Field:
34    """Builds a int32 field; kwargs (e.g. serializable/comment) go into the field's metadata."""
35    return _make_field("int32", shape, default, **extra)

Builds a int32 field; kwargs (e.g. serializable/comment) go into the field's metadata.

def obj( shape: tuple[int, ...], default: Any = None, **extra) -> dataclasses.Field:
37def obj(shape: tuple[int, ...], default: Any = None, **extra) -> Field:
38    """Builds a object field; kwargs (e.g. serializable/comment) go into the field's metadata."""
39    return _make_field("object", shape, default, **extra)

Builds a object field; kwargs (e.g. serializable/comment) go into the field's metadata.

def boolf( shape: tuple[int, ...], default: Any = None, **extra) -> dataclasses.Field:
41def boolf(shape: tuple[int, ...], default: Any = None, **extra) -> Field:
42    """Builds a bool field; kwargs (e.g. serializable/comment) go into the field's metadata."""
43    return _make_field("bool", shape, default, **extra)

Builds a bool field; kwargs (e.g. serializable/comment) go into the field's metadata.