Skip to content

Commit 98b53e5

Browse files
committed
improve wrapper models
1 parent 7a6ca5f commit 98b53e5

File tree

3 files changed

+45
-50
lines changed

3 files changed

+45
-50
lines changed

clients/python/src/osparc/_api_solvers_api.py

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@
44

55
import httpx
66
from osparc_client.api.solvers_api import SolversApi as _SolversApi
7-
from .models import JobInputs, OnePageSolverPort, SolverPort, JobOutputs
7+
from .models import JobInputs, OnePageSolverPort, SolverPort, JobOutputs, JobMetadata
8+
from osparc_client import JobInputs as _JobInputs
89

910
from ._api_client import ApiClient
1011
from ._settings import ParentProjectInfo
@@ -101,8 +102,9 @@ def jobs(self, solver_key: str, version: str, **kwargs) -> PaginationGenerator:
101102
def create_job(
102103
self, solver_key: str, version: str, job_inputs: JobInputs, **kwargs
103104
):
105+
_job_inputs = _JobInputs.from_json(job_inputs.model_dump_json())
104106
kwargs = {**kwargs, **ParentProjectInfo().model_dump(exclude_none=True)}
105-
return super().create_job(solver_key, version, job_inputs, **kwargs)
107+
return super().create_job(solver_key, version, _job_inputs, **kwargs)
106108

107109
def get_job_output_logfile(self, *args, **kwargs):
108110
data = super().get_job_output_logfile(*args, **kwargs)
@@ -113,6 +115,8 @@ def get_job_output_logfile(self, *args, **kwargs):
113115

114116
def get_job_outputs(self, *args, **kwargs) -> JobOutputs:
115117
_osparc_client_outputs = super().get_job_outputs(*args, **kwargs)
116-
_outputs = JobOutputs.from_osparc_client_job_outputs(_osparc_client_outputs)
117-
assert _outputs is not None
118-
return _outputs
118+
return JobOutputs.model_validate_json(_osparc_client_outputs.to_json())
119+
120+
def get_job_custom_metadata(self, *args, **kwargs) -> JobMetadata:
121+
metadata = super().get_job_custom_metadata(*args, **kwargs)
122+
return JobMetadata.model_validate_json(metadata.to_json())

clients/python/src/osparc/_models.py

Lines changed: 28 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1,48 +1,37 @@
1-
from osparc_client import ValuesValue
21
from osparc_client import JobInputs as _JobInputs
32
from osparc_client import JobOutputs as _JobOutputs
4-
from typing import Dict, Any
3+
from osparc_client import JobMetadata as _JobMetadata
4+
from .models import File
5+
from typing import Dict, Union, List
56
from pydantic import BaseModel, StrictStr, Field
67

78

8-
def _values_dict(v: Dict[str, Any]) -> Dict[str, ValuesValue | None]:
9-
result = {}
10-
for k, v in v.items():
11-
if v is not None:
12-
result[k] = ValuesValue(v)
13-
else:
14-
result[k] = v
15-
return result
16-
17-
18-
class JobInputs(_JobInputs):
19-
def __init__(self, *args, **kwargs):
20-
if len(args) == 1 and len(kwargs) == 0:
21-
input = args[0]
22-
assert isinstance(input, dict)
23-
super().__init__(values=_values_dict(input))
24-
return
25-
if len(args) == 0 and len(kwargs) == 1:
26-
values = kwargs.get("values")
27-
if values is None:
28-
raise RuntimeError("When passing a single kwarg it must be 'values'")
29-
super().__init__(values=_values_dict(values))
30-
return
31-
else:
32-
super().__init__(*args, **kwargs)
9+
class JobInputs(BaseModel):
10+
values: Dict[str, Union[File, List[object], bool, float, int, str, None]] = Field(
11+
kw_only=False
12+
)
13+
14+
def __init__(
15+
self, values: Dict[str, Union[File, List[object], bool, float, int, str, None]]
16+
):
17+
super().__init__(values=values)
18+
19+
20+
assert set(_JobInputs.model_fields.keys()) == set(JobInputs.model_fields.keys())
3321

3422

3523
class JobOutputs(BaseModel):
3624
job_id: StrictStr = Field(description="Job that produced this output")
37-
results: Dict[str, Any]
38-
39-
@classmethod
40-
def from_osparc_client_job_outputs(cls, outputs: _JobOutputs) -> "JobOutputs":
41-
_results = {}
42-
for k, v in outputs.results.items():
43-
if isinstance(v, ValuesValue):
44-
_results[k] = v.actual_instance
45-
else:
46-
_results[k] = v
47-
48-
return cls(job_id=outputs.job_id, results=_results)
25+
results: Dict[str, Union[File, List[object], bool, float, int, str, None]]
26+
27+
28+
assert set(_JobOutputs.model_fields.keys()) == set(JobOutputs.model_fields.keys())
29+
30+
31+
class JobMetadata(BaseModel):
32+
job_id: StrictStr
33+
metadata: Dict[str, Union[bool, float, int, str, None]]
34+
url: str | None
35+
36+
37+
assert set(_JobMetadata.model_fields.keys()) == set(JobMetadata.model_fields.keys())

clients/python/test/test_osparc/test_solvers_api.py

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import pytest
22
from pytest_mock import MockerFixture
3-
from osparc import JobMetadata, MetadataValue, ApiClient, SolversApi
3+
from osparc import JobMetadata, ApiClient, SolversApi
44
from faker import Faker
55
from urllib3 import HTTPResponse
66

@@ -11,9 +11,9 @@ def job_metadata(faker: Faker) -> JobMetadata:
1111
return JobMetadata(
1212
job_id=f"{_job_id}",
1313
metadata={
14-
"job_id": MetadataValue(_job_id),
15-
"job_name": MetadataValue(faker.text()),
16-
"node_id": MetadataValue(faker.uuid4()),
14+
"job_id": _job_id,
15+
"job_name": faker.text(),
16+
"node_id": faker.uuid4(),
1717
},
1818
url=faker.url(),
1919
)
@@ -34,7 +34,9 @@ def _get_job_sideeffect(
3434
json=None,
3535
**urlopen_kw,
3636
) -> HTTPResponse:
37-
response = HTTPResponse(status=200, body=job_metadata.to_json().encode())
37+
response = HTTPResponse(
38+
status=200, body=job_metadata.model_dump_json().encode()
39+
)
3840
return response
3941

4042
mocker.patch("urllib3.PoolManager.request", side_effect=_get_job_sideeffect)
@@ -43,4 +45,4 @@ def _get_job_sideeffect(
4345
metadata = _solvers_api.get_job_custom_metadata(
4446
solver_key="mysolver", version="1.2.3", job_id=f"{faker.uuid4()}"
4547
)
46-
print(metadata)
48+
assert metadata == job_metadata

0 commit comments

Comments
 (0)