feat: initialize data-layer project skeleton

This commit is contained in:
2026-09-11 09:09:26 +08:00
parent 9a9804d6d8
commit 3ebc097410
10 changed files with 620 additions and 0 deletions
+59
View File
@@ -0,0 +1,59 @@
from datetime import UTC, datetime
import pytest
from pydantic import ValidationError
from lmpm.domain.experiment import ExperimentRecord, ProcessingParams, QualityMetrics
from lmpm.domain.material import MaterialProperty
def material_property():
return MaterialProperty(
material_id="acrylic-001",
name="Clear Acrylic",
category="polymer",
reflectivity=0.08,
absorptivity=0.92,
melting_point_c=160.0,
thermal_conductivity_w_m_k=0.19,
density_g_cm3=1.18,
roughness_um=1.2,
)
def test_material_property_accepts_valid_values():
material = material_property()
assert material.material_id == "acrylic-001"
assert material.absorptivity == pytest.approx(0.92)
@pytest.mark.parametrize(
("field", "value"),
[("reflectivity", -0.1), ("absorptivity", 1.1), ("density_g_cm3", 0)],
)
def test_material_property_rejects_out_of_range_values(field, value):
data = material_property().model_dump()
data[field] = value
with pytest.raises(ValidationError):
MaterialProperty.model_validate(data)
def test_experiment_record_round_trips_nested_models():
experiment = ExperimentRecord(
experiment_id=1,
material_id="acrylic-001",
params=ProcessingParams(
power_percent=45,
scan_speed_mm_s=80,
pulse_frequency_hz=20,
),
metrics=QualityMetrics(kerf_width_mm=0.18),
recorded_at=datetime.now(UTC),
)
dumped = experiment.model_dump()
restored = ExperimentRecord.model_validate(dumped)
assert restored == experiment
+57
View File
@@ -0,0 +1,57 @@
from datetime import UTC, datetime
from lmpm.data.store import add_experiment, add_material, init_db, list_experiments
from lmpm.domain.experiment import ExperimentRecord, ProcessingParams, QualityMetrics
from lmpm.domain.material import MaterialProperty
def material_property():
return MaterialProperty(
material_id="acrylic-001",
name="Clear Acrylic",
category="polymer",
reflectivity=0.08,
absorptivity=0.92,
melting_point_c=160.0,
thermal_conductivity_w_m_k=0.19,
density_g_cm3=1.18,
roughness_um=1.2,
)
def prepare_database(tmp_path):
database_path = tmp_path / "lemdb.db"
material = material_property()
init_db(database_path)
add_material(database_path, material)
return database_path, material
def test_init_db_creates_readable_tables(tmp_path):
database_path, _ = prepare_database(tmp_path)
assert database_path.exists()
def test_experiment_round_trip_through_sqlite(tmp_path):
database_path, _ = prepare_database(tmp_path)
experiment = ExperimentRecord(
experiment_id=None,
material_id="acrylic-001",
params=ProcessingParams(
power_percent=45,
scan_speed_mm_s=80,
pulse_frequency_hz=20,
),
metrics=QualityMetrics(kerf_width_mm=0.18),
recorded_at=datetime.now(UTC),
)
experiment_id = add_experiment(database_path, experiment)
stored = list_experiments(database_path)
assert experiment_id == 1
assert len(stored) == 1
assert stored[0].material_id == "acrylic-001"
assert stored[0].params == experiment.params
assert stored[0].metrics == experiment.metrics