Skip to content

Commit 269bdcd

Browse files
authored
Merge pull request #21 from Geode-solutions/fix/data-literal
fix(Data): using Literals
2 parents 64f82c0 + 7c0662e commit 269bdcd

2 files changed

Lines changed: 81 additions & 6 deletions

File tree

src/opengeodeweb_microservice/database/data.py

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
from sqlalchemy.orm import Mapped, mapped_column
33
from .connection import get_session
44
from .base import Base
5+
from .data_types import GeodeObjectType, ViewerType, ViewerElementsType
56
import uuid
67

78

@@ -11,18 +12,20 @@ class Data(Base):
1112
id: Mapped[str] = mapped_column(
1213
String, primary_key=True, default=lambda: str(uuid.uuid4()).replace("-", "")
1314
)
14-
geode_object: Mapped[str] = mapped_column(String, nullable=False)
15-
viewer_object: Mapped[str] = mapped_column(String, nullable=False)
16-
viewer_elements_type: Mapped[str] = mapped_column(String, nullable=False)
15+
geode_object: Mapped[GeodeObjectType] = mapped_column(String, nullable=False)
16+
viewer_object: Mapped[ViewerType] = mapped_column(String, nullable=False)
17+
viewer_elements_type: Mapped[ViewerElementsType] = mapped_column(
18+
String, nullable=False
19+
)
1720
native_file: Mapped[str | None] = mapped_column(String, nullable=True)
1821
viewable_file: Mapped[str | None] = mapped_column(String, nullable=True)
1922
light_viewable_file: Mapped[str | None] = mapped_column(String, nullable=True)
2023

2124
@staticmethod
2225
def create(
23-
geode_object: str,
24-
viewer_object: str,
25-
viewer_elements_type: str,
26+
geode_object: GeodeObjectType,
27+
viewer_object: ViewerType,
28+
viewer_elements_type: ViewerElementsType,
2629
) -> "Data":
2730
data_entry = Data(
2831
geode_object=geode_object,
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
from typing import Literal, get_args, cast
2+
3+
GeodePointMeshType = Literal[
4+
"PointSet2D",
5+
"PointSet3D",
6+
]
7+
GeodeEdgeMeshType = Literal[
8+
"EdgedCurve2D",
9+
"EdgedCurve3D",
10+
]
11+
GeodePolygonMeshType = Literal[
12+
"RasterImage2D",
13+
"PolygonalSurface2D",
14+
"PolygonalSurface3D",
15+
"TriangulatedSurface2D",
16+
"TriangulatedSurface3D",
17+
"RegularGrid2D",
18+
"LightRegularGrid2D",
19+
]
20+
GeodePolyhedronMeshType = Literal[
21+
"RasterImage3D",
22+
"PolyhedralSolid3D",
23+
"TetrahedralSolid3D",
24+
"HybridSolid3D",
25+
"RegularGrid3D",
26+
"LightRegularGrid3D",
27+
]
28+
GeodeMeshType = (
29+
Literal[
30+
"VertexSet",
31+
"Graph",
32+
]
33+
| GeodePointMeshType
34+
| GeodeEdgeMeshType
35+
| GeodePolygonMeshType
36+
| GeodePolyhedronMeshType
37+
)
38+
GeodeModelType = Literal[
39+
"BRep",
40+
"Section",
41+
"StructuralModel",
42+
"CrossSection",
43+
"ImplicitStructuralModel",
44+
"ImplicitCrossSection",
45+
]
46+
GeodeObjectType = GeodeMeshType | GeodeModelType
47+
48+
49+
def _flatten_literal_args(literal: object) -> tuple[str, ...]:
50+
flattened: list[str] = []
51+
for arg in get_args(literal):
52+
if isinstance(arg, str):
53+
flattened.append(arg)
54+
else:
55+
flattened.extend(_flatten_literal_args(arg))
56+
return tuple(flattened)
57+
58+
59+
GeodeObjectType_values = _flatten_literal_args(GeodeObjectType)
60+
61+
62+
def geode_object_type(value: str) -> GeodeObjectType:
63+
if value not in GeodeObjectType_values:
64+
raise ValueError(
65+
f"Invalid GeodeObjectType: {value!r}. Must be one of {GeodeObjectType_values}"
66+
)
67+
return cast(GeodeObjectType, value)
68+
69+
70+
ViewerType = Literal["mesh", "model"]
71+
72+
ViewerElementsType = Literal["points", "edges", "polygons", "polyhedra", "default"]

0 commit comments

Comments
 (0)