fix(community): use __post_init__ coercion, source_product store arg, add package-data for SQL files
This commit is contained in:
parent
0598801aaa
commit
56fb6be4b1
3 changed files with 17 additions and 16 deletions
|
|
@ -66,25 +66,22 @@ class CommunityPost:
|
||||||
protein_pct: float | None
|
protein_pct: float | None
|
||||||
moisture_pct: float | None
|
moisture_pct: float | None
|
||||||
|
|
||||||
def __init__(self, **kwargs):
|
def __post_init__(self) -> None:
|
||||||
# 1. Coerce list fields to tuples
|
# Coerce list fields to tuples (frozen dataclass: use object.__setattr__)
|
||||||
for key in ("slots", "dietary_tags", "allergen_flags", "flavor_molecules"):
|
for key in ("slots", "dietary_tags", "allergen_flags", "flavor_molecules"):
|
||||||
if key in kwargs and isinstance(kwargs[key], list):
|
val = getattr(self, key)
|
||||||
kwargs[key] = tuple(kwargs[key])
|
if isinstance(val, list):
|
||||||
|
object.__setattr__(self, key, tuple(val))
|
||||||
|
|
||||||
# 2. Validate BEFORE assignment
|
# Validate post_type
|
||||||
post_type = kwargs.get("post_type")
|
if self.post_type not in _VALID_POST_TYPES:
|
||||||
if post_type not in _VALID_POST_TYPES:
|
|
||||||
raise ValueError(
|
raise ValueError(
|
||||||
f"post_type must be one of {sorted(_VALID_POST_TYPES)}, got {post_type!r}"
|
f"post_type must be one of {sorted(_VALID_POST_TYPES)}, got {self.post_type!r}"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# Validate scores
|
||||||
for score_name in (
|
for score_name in (
|
||||||
"seasoning_score", "richness_score", "brightness_score",
|
"seasoning_score", "richness_score", "brightness_score",
|
||||||
"depth_score", "aroma_score", "structure_score",
|
"depth_score", "aroma_score", "structure_score",
|
||||||
):
|
):
|
||||||
if score_name in kwargs:
|
_validate_score(score_name, getattr(self, score_name))
|
||||||
_validate_score(score_name, kwargs[score_name])
|
|
||||||
|
|
||||||
# 3. Assign all fields
|
|
||||||
for f in self.__dataclass_fields__:
|
|
||||||
object.__setattr__(self, f, kwargs[f])
|
|
||||||
|
|
|
||||||
|
|
@ -66,8 +66,9 @@ class SharedStore:
|
||||||
All methods return new objects (immutable pattern). Never mutate rows in-place.
|
All methods return new objects (immutable pattern). Never mutate rows in-place.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def __init__(self, db: "CommunityDB") -> None:
|
def __init__(self, db: "CommunityDB", source_product: str = "kiwi") -> None:
|
||||||
self._db = db
|
self._db = db
|
||||||
|
self._source_product = source_product
|
||||||
|
|
||||||
# ------------------------------------------------------------------
|
# ------------------------------------------------------------------
|
||||||
# Reads
|
# Reads
|
||||||
|
|
@ -176,7 +177,7 @@ class SharedStore:
|
||||||
json.dumps(list(post.allergen_flags)),
|
json.dumps(list(post.allergen_flags)),
|
||||||
json.dumps(list(post.flavor_molecules)),
|
json.dumps(list(post.flavor_molecules)),
|
||||||
post.fat_pct, post.protein_pct, post.moisture_pct,
|
post.fat_pct, post.protein_pct, post.moisture_pct,
|
||||||
"kiwi",
|
self._source_product,
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
conn.commit()
|
conn.commit()
|
||||||
|
|
|
||||||
|
|
@ -84,6 +84,9 @@ cf-manage = "circuitforge_core.manage.cli:app"
|
||||||
where = ["."]
|
where = ["."]
|
||||||
include = ["circuitforge_core*"]
|
include = ["circuitforge_core*"]
|
||||||
|
|
||||||
|
[tool.setuptools.package-data]
|
||||||
|
"circuitforge_core.community.migrations" = ["*.sql"]
|
||||||
|
|
||||||
[tool.pytest.ini_options]
|
[tool.pytest.ini_options]
|
||||||
testpaths = ["tests"]
|
testpaths = ["tests"]
|
||||||
asyncio_mode = "auto"
|
asyncio_mode = "auto"
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue