77from typing import Literal
88from typing import NewType
99from typing import Tuple
10+ from typing import List
1011from uuid import UUID
1112
1213import dateutil .parser
1314
1415from kleinkram .errors import ParsingError
15- from kleinkram .models import File
16+ from kleinkram .models import File , MetadataValue
1617from kleinkram .models import FileState
1718from kleinkram .models import Mission
1819from kleinkram .models import Project
@@ -51,6 +52,7 @@ class MissionObjectKeys(str, Enum):
5152 DESCRIPTION = "description"
5253 CREATED_AT = "createdAt"
5354 UPDATED_AT = "updatedAt"
55+ TAGS = "tags"
5456
5557
5658class ProjectObjectKeys (str , Enum ):
@@ -59,6 +61,7 @@ class ProjectObjectKeys(str, Enum):
5961 DESCRIPTION = "description"
6062 CREATED_AT = "createdAt"
6163 UPDATED_AT = "updatedAt"
64+ REQUIRED_TAGS = "requiredTags"
6265
6366
6467def _get_nested_info (data , key : Literal ["mission" , "project" ]) -> Tuple [UUID , str ]:
@@ -82,6 +85,19 @@ def _parse_file_state(state: str) -> FileState:
8285 except ValueError as e :
8386 raise ParsingError (f"error parsing file state: { state } " ) from e
8487
88+ def _parse_metadata (tags : List [Dict ]) -> Dict [str , MetadataValue ]:
89+ result = {}
90+ try :
91+ for tag in tags :
92+ entry = {tag .get ("name" ): MetadataValue (tag .get ("valueAsString" ), tag .get ("datatype" ))}
93+ result .update (entry )
94+ return result
95+ except ValueError as e :
96+ raise ParsingError (f"error parsing metadata: { e } " ) from e
97+
98+ def _parse_required_tags (tags : List [Dict ]) -> list [str ]:
99+ return list (_parse_metadata (tags ).keys ())
100+
85101
86102def _parse_project (project_object : ProjectObject ) -> Project :
87103 try :
@@ -90,6 +106,7 @@ def _parse_project(project_object: ProjectObject) -> Project:
90106 description = project_object [ProjectObjectKeys .DESCRIPTION ]
91107 created_at = _parse_datetime (project_object [ProjectObjectKeys .CREATED_AT ])
92108 updated_at = _parse_datetime (project_object [ProjectObjectKeys .UPDATED_AT ])
109+ required_tags = _parse_required_tags (project_object [ProjectObjectKeys .REQUIRED_TAGS ])
93110 except Exception as e :
94111 raise ParsingError (f"error parsing project: { project_object } " ) from e
95112 return Project (
@@ -98,6 +115,7 @@ def _parse_project(project_object: ProjectObject) -> Project:
98115 description = description ,
99116 created_at = created_at ,
100117 updated_at = updated_at ,
118+ required_tags = required_tags ,
101119 )
102120
103121
@@ -107,7 +125,7 @@ def _parse_mission(mission: MissionObject) -> Mission:
107125 name = mission [MissionObjectKeys .NAME ]
108126 created_at = _parse_datetime (mission [MissionObjectKeys .CREATED_AT ])
109127 updated_at = _parse_datetime (mission [MissionObjectKeys .UPDATED_AT ])
110- metadata = {} # TODO: this crap is really bad to parse
128+ metadata = _parse_metadata ( mission [ MissionObjectKeys . TAGS ])
111129
112130 project_id , project_name = _get_nested_info (mission , PROJECT )
113131
0 commit comments