Skip to content

Commit bc2859e

Browse files
⬆️ Upgrade openapi generator (#202)
1 parent 0388ebb commit bc2859e

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

41 files changed

+1860
-2094
lines changed

api/openapi.json

Lines changed: 1314 additions & 867 deletions
Large diffs are not rendered by default.

clients/python/Makefile

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -116,8 +116,8 @@ _check_venv_active:
116116

117117
.PHONY: install-dev
118118
install-dev: _check_venv_active .install-dev-reqs python-client ## installs osparc_client and osparc in edit mode
119-
uv pip install -e artifacts/client
120-
uv pip install -e .
119+
# for some reason this command refuses to run with uv. Looks related to https://github.com/astral-sh/uv/issues/1661
120+
pip install --editable artifacts/client --editable .
121121
uv pip list
122122

123123
.PHONY: install-unit-test
@@ -129,6 +129,10 @@ install-e2e-test: _check_venv_active guard-OSPARC_VERSION ## install packages fo
129129
$(eval version := $(shell bash $(CLIENTS_PYTHON_DIR)/test/e2e/ci/bash/osparc_version.bash $(OSPARC_VERSION)))
130130
uv pip install -r $(CLIENTS_PYTHON_DIR)/requirements/e2e-test.txt osparc-client==$(version) osparc==$(version)
131131

132+
.PHONY: install-e2e-test-local
133+
install-e2e-test-local: _check_venv_active python-client ## install packages for e2e testing with local (repo) client [e2e]
134+
pip install -r $(CLIENTS_PYTHON_DIR)/requirements/e2e-test.txt --editable artifacts/client --editable .
135+
132136
.PHONY: install-doc
133137
install-doc: _check_venv_active .install-dev-reqs ## install packages for generating documentation
134138
uv pip install -r $(CLIENTS_PYTHON_DIR)/requirements/doc.txt

clients/python/requirements/dev.txt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
11
-r ../../../requirements.txt
22
-r unit-test.txt
3-
-r e2e-test.txt
43
pylint

clients/python/requirements/unit-test.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
11
-r ../../../requirements.txt
22
black
33
faker
4+
openapi-spec-validator #installed as backend for prance
5+
parse
46
pipdeptree
57
pipreqs
8+
prance
69
pytest
710
pytest-asyncio
811
pytest-mock

clients/python/setup.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
"tenacity",
3131
"tqdm>=4.48.0",
3232
f"osparc_client=={VERSION}",
33+
"urllib3",
3334
"aiofiles",
3435
]
3536

clients/python/src/osparc/_api_client.py

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,8 @@
33
from typing import Optional
44

55
from osparc_client.api_client import ApiClient as _ApiClient
6-
from osparc_client import Configuration
6+
from ._configuration import Configuration
77
from pydantic import ValidationError
8-
98
from ._settings import ConfigurationEnvVars
109

1110

@@ -16,7 +15,6 @@ def __init__(
1615
header_name=None,
1716
header_value=None,
1817
cookie=None,
19-
pool_threads=1,
2018
):
2119
if configuration is None:
2220
try:
@@ -36,4 +34,4 @@ def __init__(
3634
"osparc.Configuration object explicitly"
3735
) from exc
3836

39-
super().__init__(configuration, header_name, header_value, cookie, pool_threads)
37+
super().__init__(configuration, header_name, header_value, cookie)

clients/python/src/osparc/_api_files_api.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@
55
import logging
66
import math
77
from pathlib import Path
8-
from typing import Any, Iterator, List, Optional, Tuple, Union, Set, Final
8+
from typing import Any, Iterator, List, Optional, Tuple, Union, Final, Set
9+
from tempfile import NamedTemporaryFile
910

1011
import httpx
1112
from httpx import Response
@@ -27,7 +28,6 @@
2728
)
2829
from urllib.parse import urljoin
2930
import aiofiles
30-
from tempfile import NamedTemporaryFile
3131
import shutil
3232
from ._utils import (
3333
DEFAULT_TIMEOUT_SECONDS,

clients/python/src/osparc/_api_solvers_api.py

Lines changed: 68 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,17 @@
44

55
import httpx
66
from osparc_client.api.solvers_api import SolversApi as _SolversApi
7-
from .models import JobInputs, OnePageSolverPort, SolverPort
7+
from .models import (
8+
JobInputs,
9+
OnePageSolverPort,
10+
SolverPort,
11+
Job,
12+
JobOutputs,
13+
JobMetadata,
14+
JobMetadataUpdate,
15+
)
16+
from osparc_client import JobInputs as _JobInputs
17+
from osparc_client import JobMetadataUpdate as _JobMetadataUpdate
818

919
from ._api_client import ApiClient
1020
from ._settings import ParentProjectInfo
@@ -13,8 +23,11 @@
1323
_DEFAULT_PAGINATION_OFFSET,
1424
PaginationIterable,
1525
)
16-
1726
import warnings
27+
from tempfile import NamedTemporaryFile
28+
from pathlib import Path
29+
from pydantic import validate_call
30+
from pydantic import StrictStr
1831

1932

2033
class SolversApi(_SolversApi):
@@ -88,8 +101,59 @@ def jobs(self, solver_key: str, version: str, **kwargs) -> PaginationIterable:
88101
)
89102
return self.iter_jobs(solver_key, version, **kwargs)
90103

104+
@validate_call
91105
def create_job(
92106
self, solver_key: str, version: str, job_inputs: JobInputs, **kwargs
93-
):
107+
) -> Job:
108+
_job_inputs = _JobInputs.from_json(job_inputs.model_dump_json())
109+
assert _job_inputs is not None
94110
kwargs = {**kwargs, **ParentProjectInfo().model_dump(exclude_none=True)}
95-
return super().create_job(solver_key, version, job_inputs, **kwargs)
111+
return super().create_job(solver_key, version, _job_inputs, **kwargs)
112+
113+
def get_job_output_logfile(
114+
self,
115+
solver_key: str,
116+
version: str,
117+
job_id: StrictStr,
118+
**kwargs,
119+
):
120+
data = super().get_job_output_logfile(
121+
solver_key=solver_key, version=version, job_id=job_id, **kwargs
122+
)
123+
with NamedTemporaryFile(delete=False) as tmp_file:
124+
log_file = Path(tmp_file.name)
125+
log_file.write_bytes(data)
126+
return log_file
127+
128+
def get_job_outputs(
129+
self,
130+
solver_key: str,
131+
version: str,
132+
job_id: StrictStr,
133+
**kwargs,
134+
) -> JobOutputs:
135+
_osparc_client_outputs = super().get_job_outputs(
136+
solver_key=solver_key, version=version, job_id=job_id, **kwargs
137+
)
138+
return JobOutputs.model_validate_json(_osparc_client_outputs.to_json())
139+
140+
def get_job_custom_metadata(self, *args, **kwargs) -> JobMetadata:
141+
metadata = super().get_job_custom_metadata(*args, **kwargs)
142+
return JobMetadata.model_validate_json(metadata.to_json())
143+
144+
@validate_call
145+
def replace_job_custom_metadata(
146+
self,
147+
solver_key: str,
148+
version: str,
149+
job_id: str,
150+
job_metadata_update: JobMetadataUpdate,
151+
) -> JobMetadata:
152+
_job_metadata_update = _JobMetadataUpdate.from_json(
153+
job_metadata_update.model_dump_json()
154+
)
155+
assert _job_metadata_update is not None
156+
_job_custom_metadata = super().replace_job_custom_metadata(
157+
solver_key, version, job_id, _job_metadata_update
158+
)
159+
return JobMetadata.model_validate_json(_job_custom_metadata.to_json())

clients/python/src/osparc/_api_studies_api.py

Lines changed: 42 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,19 @@
77
from typing import Optional
88

99
import httpx
10-
from .models import JobInputs, JobLogsMap, PageStudy
10+
from pydantic import StrictStr
11+
12+
from .models import (
13+
JobInputs,
14+
JobLogsMap,
15+
PageStudy,
16+
JobOutputs,
17+
JobMetadata,
18+
JobMetadataUpdate,
19+
)
1120
from osparc_client.api.studies_api import StudiesApi as _StudiesApi
21+
from osparc_client import JobInputs as _JobInputs
22+
from osparc_client import JobMetadataUpdate as _JobMetadataUpdate
1223
from tqdm.asyncio import tqdm_asyncio
1324

1425
from ._api_client import ApiClient
@@ -58,8 +69,18 @@ def __init__(self, api_client: ApiClient):
5869
)
5970

6071
def create_study_job(self, study_id: str, job_inputs: JobInputs, **kwargs):
72+
_job_inputs = _JobInputs.from_json(job_inputs.model_dump_json())
73+
assert _job_inputs is not None
6174
kwargs = {**kwargs, **ParentProjectInfo().model_dump(exclude_none=True)}
62-
return super().create_study_job(study_id, job_inputs, **kwargs)
75+
return super().create_study_job(study_id, _job_inputs, **kwargs)
76+
77+
def get_study_job_outputs(
78+
self, study_id: StrictStr, job_id: StrictStr, **kwargs
79+
) -> JobOutputs:
80+
_job_outputs = super().get_study_job_outputs(
81+
study_id=study_id, job_id=job_id, **kwargs
82+
)
83+
return JobOutputs.model_validate_json(_job_outputs.to_json())
6384

6485
def clone_study(self, study_id: str, **kwargs):
6586
kwargs = {**kwargs, **ParentProjectInfo().model_dump(exclude_none=True)}
@@ -140,3 +161,22 @@ async def _download(unique_node_name: str, download_link: str) -> None:
140161
)
141162

142163
return folder
164+
165+
def get_study_job_custom_metadata(self, study_id: str, job_id: str) -> JobMetadata:
166+
_job_metadata = super().get_study_job_custom_metadata(study_id, job_id)
167+
return JobMetadata.model_validate_json(_job_metadata.to_json())
168+
169+
def replace_study_job_custom_metadata(
170+
self,
171+
study_id: StrictStr,
172+
job_id: StrictStr,
173+
job_metadata_update: JobMetadataUpdate,
174+
) -> JobMetadata:
175+
_job_metadata_update = _JobMetadataUpdate.from_json(
176+
job_metadata_update.model_dump_json()
177+
)
178+
assert _job_metadata_update is not None
179+
_job_metadata = super().replace_study_job_custom_metadata(
180+
study_id, job_id, _job_metadata_update
181+
)
182+
return JobMetadata.model_validate_json(_job_metadata.to_json())
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
from osparc_client import Configuration as _Configuration
2+
from typing import Set
3+
from urllib3 import Retry
4+
5+
6+
class Configuration(_Configuration):
7+
def __init__(
8+
self,
9+
host="https://api.osparc.io",
10+
api_key=None,
11+
api_key_prefix=None,
12+
username=None,
13+
password=None,
14+
*,
15+
retry_max_count: int = 4,
16+
retry_methods: Set[str] = {
17+
"DELETE",
18+
"GET",
19+
"HEAD",
20+
"OPTIONS",
21+
"PUT",
22+
"TRACE",
23+
"POST",
24+
"PATCH",
25+
"CONNECT",
26+
},
27+
retry_status_codes: Set[int] = {429, 503, 504},
28+
retry_backoff_factor=4.0,
29+
):
30+
retries = Retry(
31+
total=retry_max_count,
32+
backoff_factor=retry_backoff_factor,
33+
status_forcelist=retry_status_codes,
34+
allowed_methods=retry_methods,
35+
respect_retry_after_header=True,
36+
raise_on_status=True,
37+
)
38+
super().__init__(
39+
host=host,
40+
api_key=api_key,
41+
api_key_prefix=api_key_prefix,
42+
username=username,
43+
password=password,
44+
retries=retries,
45+
)

0 commit comments

Comments
 (0)