Source code for ds_provider_mock_py_lib.dataset.settings
"""
**File:** ``settings.py``
**Region:** ``ds_provider_mock_py_lib/dataset``
Dataset settings for the mock provider.
Example:
>>> from ds_provider_mock_py_lib.dataset.settings import MockColumn, MockDatasetSettings
>>> from ds_provider_mock_py_lib.enums import ColumnKind
>>> settings = MockDatasetSettings(
... columns=[
... MockColumn(name="id", kind=ColumnKind.SEQUENCE),
... MockColumn(name="status", kind=ColumnKind.ENUM, value=["active", "deactive"]),
... ],
... row_count=10,
... )
>>> settings.row_count
10
"""
from __future__ import annotations
from dataclasses import dataclass, field
from typing import Any
from ds_common_serde_py_lib import Serializable
from ds_resource_plugin_py_lib.common.resource.dataset import DatasetSettings
from ..enums import ColumnKind, RaiseAs
from ..models import MockError
[docs]
@dataclass(kw_only=True)
class MockColumn(Serializable):
"""One synthetic column in a mock dataset."""
name: str
"""Column name emitted in ``self.output``."""
kind: ColumnKind = ColumnKind.TEXT
"""Value generator used for this column."""
value: Any = None
"""
Payload for ``constant`` and ``enum``.
A scalar is emitted on every row when ``kind`` is ``constant``. A
non-empty list is sampled when ``kind`` is ``enum``.
"""
prefix: str = ""
"""Prefix used when ``kind`` is ``text``."""
low: int = 0
"""Inclusive lower bound for random numeric kinds."""
high: int = 1000
"""Exclusive upper bound for random numeric kinds."""
null_every: int | None = None
"""When set, every Nth id is ``None`` (stable across batches)."""
[docs]
def default_columns() -> list[MockColumn]:
"""
Return the default mock column set.
Returns:
A sequence column named ``id`` and a text column named ``name``.
"""
return [
MockColumn(name="id", kind=ColumnKind.SEQUENCE),
MockColumn(name="name", kind=ColumnKind.TEXT, prefix="row_"),
]
[docs]
@dataclass(kw_only=True)
class MockDatasetSettings(DatasetSettings):
"""Settings that define mock read scope and injected failure behaviour."""
columns: list[MockColumn] = field(default_factory=default_columns)
"""Synthetic columns included in every emitted row."""
row_count: int = 100
"""Rows in the full load (batch 0, all inserts)."""
incremental_insert_count: int = 0
"""New unique primary keys delivered in each incremental batch."""
incremental_update_count: int = 0
"""Existing primary keys re-delivered with changed column values (row hash changes)."""
incremental_noop_count: int = 0
"""Existing primary keys re-delivered with an identical row (same hash)."""
page_size: int | None = None
"""Page size. ``None`` emits the whole batch in one page."""
seed: int = 42
"""Determinism seed for id selection and random cell values."""
page_delay_ms: int = 0
"""Artificial delay applied after each successful page."""
op_column: str | None = None
"""
Optional label column for intended row kind.
Gold merge uses primary key plus row hash, not this column. Leave unset
so the label cannot change the hash of a noop row. Counts are always in
``operation.metadata["ops"]``.
"""
modified_at_column: str = "_modified_at"
"""Column that stores the deterministic modified-at timestamp."""
raise_on_page: int | None = None
"""1-based page number within the current batch that should fail. ``None`` disables."""
raise_as: RaiseAs = RaiseAs.READ_ERROR
"""Contract exception class used when ``raise_on_page`` matches."""
raise_error: MockError = field(
default_factory=lambda: MockError(
message="mock read failure",
code="DS_DATASET_READ_ERROR",
status_code=500,
)
)
"""Error spec used when ``raise_on_page`` matches."""