blackopsrepl/portfolio-optimization-python
1
1"""
2JSON serialization utilities for the Portfolio Optimization quickstart.
3
4Provides Pydantic configuration for REST API models with camelCase support.
5"""
6from solverforge_legacy.solver.score import HardSoftScore
7from typing import Any
8from pydantic import BaseModel, ConfigDict, PlainSerializer, BeforeValidator
9from pydantic.alias_generators import to_camel
10
11
12ScoreSerializer = PlainSerializer(
13 lambda score: str(score) if score is not None else None, return_type=str | None
14)
15
16
17def validate_score(v: Any) -> Any:
18 """Validate and parse score from string or HardSoftScore."""
19 if isinstance(v, HardSoftScore) or v is None:
20 return v
21 if isinstance(v, str):
22 return HardSoftScore.parse(v)
23 raise ValueError('"score" should be a string')
24
25
26ScoreValidator = BeforeValidator(validate_score)
27
28
29class JsonDomainBase(BaseModel):
30 """
31 Base class for Pydantic REST models.
32
33 Provides:
34 - Automatic camelCase conversion for JSON keys
35 - Support for both camelCase and snake_case in input
36 - Attribute access from dataclass instances
37 """
38 model_config = ConfigDict(
39 alias_generator=to_camel,
40 populate_by_name=True,
41 from_attributes=True,
42 )
43 