Skip to content

Commit 1c732b6

Browse files
authored
Merge branch 'master' into enh/filter-types
2 parents 7fbff79 + e888734 commit 1c732b6

File tree

6 files changed

+150
-148
lines changed

6 files changed

+150
-148
lines changed

services/api-server/VERSION

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
0.7.0
1+
0.7.1

services/api-server/openapi.json

Lines changed: 23 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
"info": {
44
"title": "osparc.io public API",
55
"description": "osparc-simcore public API specifications",
6-
"version": "0.7.0"
6+
"version": "0.7.1"
77
},
88
"paths": {
99
"/v0/meta": {
@@ -1423,7 +1423,7 @@
14231423
"solvers"
14241424
],
14251425
"summary": "List Solvers",
1426-
"description": "\ud83d\udea8 **Deprecated**: This endpoint is deprecated and will be removed in a future release.\nPlease use `GET /v0/solvers/page` instead.\n\n\n\nLists all available solvers (latest version)\n\nNew in *version 0.5.0*\n\nRemoved in *version 0.7*: This endpoint is deprecated and will be removed in a future version",
1426+
"description": "\ud83d\udea8 **Deprecated**: This endpoint is deprecated and will be removed in a future release.\nPlease use `GET /v0/solvers/page` instead.\n\n\n\nLists all available solvers (latest version)\n\nNew in *version 0.5.0*",
14271427
"operationId": "list_solvers",
14281428
"responses": {
14291429
"200": {
@@ -1514,7 +1514,7 @@
15141514
"solvers"
15151515
],
15161516
"summary": "Lists All Releases",
1517-
"description": "\ud83d\udea8 **Deprecated**: This endpoint is deprecated and will be removed in a future release.\nPlease use `GET /v0/solvers/{solver_key}/releases/page` instead.\n\n\n\nLists all released solvers (not just latest version)\n\nNew in *version 0.5.0*\n\nRemoved in *version 0.7*: This endpoint is deprecated and will be removed in a future version",
1517+
"description": "\ud83d\udea8 **Deprecated**: This endpoint is deprecated and will be removed in a future release.\nPlease use `GET /v0/solvers/{solver_key}/releases/page` instead.\n\n\n\nLists all released solvers (not just latest version)\n\nNew in *version 0.5.0*",
15181518
"operationId": "list_solvers_releases",
15191519
"responses": {
15201520
"200": {
@@ -1604,8 +1604,8 @@
16041604
"tags": [
16051605
"solvers"
16061606
],
1607-
"summary": "Get Latest Release of a Solver",
1608-
"description": "Gets latest release of a solver",
1607+
"summary": "Get Solver",
1608+
"description": "Gets latest release of a solver\n\nAdded in *version 0.7.1*: `version_display` field in the response",
16091609
"operationId": "get_solver",
16101610
"security": [
16111611
{
@@ -1714,7 +1714,7 @@
17141714
"solvers"
17151715
],
17161716
"summary": "List Solver Releases",
1717-
"description": "Lists all releases of a given (one) solver\n\nSEE get_solver_releases_page for a paginated version of this function",
1717+
"description": "Lists all releases of a given (one) solver\n\nAdded in *version 0.7.1*: `version_display` field in the response",
17181718
"operationId": "list_solver_releases",
17191719
"security": [
17201720
{
@@ -1827,7 +1827,7 @@
18271827
"solvers"
18281828
],
18291829
"summary": "Get Solver Release",
1830-
"description": "Gets a specific release of a solver",
1830+
"description": "Gets a specific release of a solver\n\nAdded in *version 0.7.1*: `version_display` field in the response",
18311831
"operationId": "get_solver_release",
18321832
"security": [
18331833
{
@@ -1946,7 +1946,7 @@
19461946
"solvers"
19471947
],
19481948
"summary": "List Solver Ports",
1949-
"description": "Lists inputs and outputs of a given solver\n\nNew in *version 0.5.0*",
1949+
"description": "Lists inputs and outputs of a given solver\n\nNew in *version 0.5.0*\n\nAdded in *version 0.7.1*: `version_display` field in the response",
19501950
"operationId": "list_solver_ports",
19511951
"security": [
19521952
{
@@ -2065,7 +2065,7 @@
20652065
"solvers"
20662066
],
20672067
"summary": "Get Solver Pricing Plan",
2068-
"description": "Gets solver pricing plan\n\nNew in *version 0.7*",
2068+
"description": "Gets solver pricing plan\n\nNew in *version 0.7*\n\nAdded in *version 0.7.1*: `version_display` field in the response",
20692069
"operationId": "get_solver_pricing_plan",
20702070
"security": [
20712071
{
@@ -10465,6 +10465,18 @@
1046510465
"type": "string",
1046610466
"title": "Maintainer",
1046710467
"description": "Maintainer of the solver"
10468+
},
10469+
"version_display": {
10470+
"anyOf": [
10471+
{
10472+
"type": "string"
10473+
},
10474+
{
10475+
"type": "null"
10476+
}
10477+
],
10478+
"title": "Version Display",
10479+
"description": "A user-friendly or marketing name for the release."
1046810480
}
1046910481
},
1047010482
"type": "object",
@@ -10483,7 +10495,8 @@
1048310495
"maintainer": "[email protected]",
1048410496
"title": "iSolve",
1048510497
"url": "https://api.osparc.io/v0/solvers/simcore%2Fservices%2Fcomp%2Fisolve/releases/2.1.1",
10486-
"version": "2.1.1"
10498+
"version": "2.1.1",
10499+
"version_display": "2.1.1-2023-10-01"
1048710500
}
1048810501
},
1048910502
"SolverFunction": {

services/api-server/setup.cfg

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
[bumpversion]
2-
current_version = 0.7.0
2+
current_version = 0.7.1
33
commit = True
44
message = services/api-server version: {current_version} → {new_version}
55
tag = False

services/api-server/src/simcore_service_api_server/api/routes/solvers.py

Lines changed: 44 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,8 @@
2525
from ..dependencies.services import get_catalog_service, get_solver_service
2626
from ..dependencies.webserver_http import AuthSession, get_webserver_session
2727
from ._constants import (
28+
FMSG_CHANGELOG_ADDED_IN_VERSION,
2829
FMSG_CHANGELOG_NEW_IN_VERSION,
29-
FMSG_CHANGELOG_REMOVED_IN_VERSION_FORMAT,
3030
create_route_description,
3131
)
3232

@@ -56,19 +56,13 @@
5656
alternative="GET /v0/solvers/page",
5757
changelog=[
5858
FMSG_CHANGELOG_NEW_IN_VERSION.format("0.5.0", ""),
59-
FMSG_CHANGELOG_REMOVED_IN_VERSION_FORMAT.format(
60-
"0.7",
61-
"This endpoint is deprecated and will be removed in a future version",
62-
),
6359
],
6460
),
6561
)
6662
async def list_solvers(
6763
catalog_service: Annotated[CatalogService, Depends(get_catalog_service)],
6864
url_for: Annotated[Callable, Depends(get_reverse_url_mapper)],
6965
):
70-
"""Lists all available solvers (latest version)"""
71-
7266
services, _ = await catalog_service.list_latest_releases(
7367
filters=ServiceListFilters(service_type=ServiceType.COMPUTATIONAL),
7468
)
@@ -124,10 +118,6 @@ async def get_solvers_page(
124118
alternative="GET /v0/solvers/{solver_key}/releases/page",
125119
changelog=[
126120
FMSG_CHANGELOG_NEW_IN_VERSION.format("0.5.0", ""),
127-
FMSG_CHANGELOG_REMOVED_IN_VERSION_FORMAT.format(
128-
"0.7",
129-
"This endpoint is deprecated and will be removed in a future version",
130-
),
131121
],
132122
),
133123
)
@@ -167,21 +157,25 @@ async def list_solvers_releases(
167157
@router.get(
168158
"/{solver_key:path}/latest",
169159
response_model=Solver,
170-
summary="Get Latest Release of a Solver",
171160
responses=_SOLVER_STATUS_CODES,
161+
description=create_route_description(
162+
base="Gets latest release of a solver",
163+
changelog=[
164+
FMSG_CHANGELOG_ADDED_IN_VERSION.format(
165+
"0.7.1", "`version_display` field in the response"
166+
),
167+
],
168+
),
172169
)
173170
async def get_solver(
174171
solver_key: SolverKeyId,
175172
solver_service: Annotated[SolverService, Depends(get_solver_service)],
176173
url_for: Annotated[Callable, Depends(get_reverse_url_mapper)],
177174
):
178-
"""Gets latest release of a solver"""
179175
# IMPORTANT: by adding /latest, we avoid changing the order of this entry in the router list
180176
# otherwise, {solver_key:path} will override and consume any of the paths that follow.
181177
try:
182-
solver = await solver_service.get_latest_release(
183-
solver_key=solver_key,
184-
)
178+
solver = await solver_service.get_latest_release(solver_key=solver_key)
185179
solver.url = url_for(
186180
"get_solver_release", solver_key=solver.id, version=solver.version
187181
)
@@ -199,16 +193,20 @@ async def get_solver(
199193
"/{solver_key:path}/releases",
200194
response_model=list[Solver],
201195
responses=_SOLVER_STATUS_CODES,
196+
description=create_route_description(
197+
base="Lists all releases of a given (one) solver",
198+
changelog=[
199+
FMSG_CHANGELOG_ADDED_IN_VERSION.format(
200+
"0.7.1", "`version_display` field in the response"
201+
),
202+
],
203+
),
202204
)
203205
async def list_solver_releases(
204206
solver_key: SolverKeyId,
205207
solver_service: Annotated[SolverService, Depends(get_solver_service)],
206208
url_for: Annotated[Callable, Depends(get_reverse_url_mapper)],
207209
):
208-
"""Lists all releases of a given (one) solver
209-
210-
SEE get_solver_releases_page for a paginated version of this function
211-
"""
212210
all_releases: list[Solver] = []
213211
for page_params in iter_pagination_params(limit=DEFAULT_PAGINATION_LIMIT):
214212
solvers, page_meta = await solver_service.solver_release_history(
@@ -267,14 +265,21 @@ async def get_solver_releases_page(
267265
"/{solver_key:path}/releases/{version}",
268266
response_model=Solver,
269267
responses=_SOLVER_STATUS_CODES,
268+
description=create_route_description(
269+
base="Gets a specific release of a solver",
270+
changelog=[
271+
FMSG_CHANGELOG_ADDED_IN_VERSION.format(
272+
"0.7.1", "`version_display` field in the response"
273+
),
274+
],
275+
),
270276
)
271277
async def get_solver_release(
272278
solver_key: SolverKeyId,
273279
version: VersionStr,
274280
solver_service: Annotated[SolverService, Depends(get_solver_service)],
275281
url_for: Annotated[Callable, Depends(get_reverse_url_mapper)],
276282
):
277-
"""Gets a specific release of a solver"""
278283
try:
279284
solver: Solver = await solver_service.get_solver(
280285
solver_key=solver_key,
@@ -302,8 +307,15 @@ async def get_solver_release(
302307
"/{solver_key:path}/releases/{version}/ports",
303308
response_model=OnePage[SolverPort],
304309
responses=_SOLVER_STATUS_CODES,
305-
description="Lists inputs and outputs of a given solver\n\n"
306-
+ FMSG_CHANGELOG_NEW_IN_VERSION.format("0.5.0"),
310+
description=create_route_description(
311+
base="Lists inputs and outputs of a given solver",
312+
changelog=[
313+
FMSG_CHANGELOG_NEW_IN_VERSION.format("0.5.0"),
314+
FMSG_CHANGELOG_ADDED_IN_VERSION.format(
315+
"0.7.1", "`version_display` field in the response"
316+
),
317+
],
318+
),
307319
)
308320
async def list_solver_ports(
309321
solver_key: SolverKeyId,
@@ -322,9 +334,16 @@ async def list_solver_ports(
322334
@router.get(
323335
"/{solver_key:path}/releases/{version}/pricing_plan",
324336
response_model=ServicePricingPlanGetLegacy,
325-
description="Gets solver pricing plan\n\n"
326-
+ FMSG_CHANGELOG_NEW_IN_VERSION.format("0.7"),
327337
responses=_SOLVER_STATUS_CODES,
338+
description=create_route_description(
339+
base="Gets solver pricing plan",
340+
changelog=[
341+
FMSG_CHANGELOG_NEW_IN_VERSION.format("0.7"),
342+
FMSG_CHANGELOG_ADDED_IN_VERSION.format(
343+
"0.7.1", "`version_display` field in the response"
344+
),
345+
],
346+
),
328347
)
329348
async def get_solver_pricing_plan(
330349
solver_key: SolverKeyId,

services/api-server/src/simcore_service_api_server/models/schemas/solvers.py

Lines changed: 22 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from typing import Annotated, Any, Literal
1+
from typing import Annotated, Any, Literal, Self
22

33
from models_library.api_schemas_catalog.services import LatestServiceGet, ServiceGetV2
44
from models_library.basic_regex import PUBLIC_VARIABLE_NAME_RE
@@ -39,14 +39,20 @@
3939
class Solver(BaseService):
4040
"""A released solver with a specific version"""
4141

42-
maintainer: str = Field(..., description="Maintainer of the solver")
42+
maintainer: Annotated[str, Field(description="Maintainer of the solver")]
43+
44+
version_display: Annotated[
45+
str | None,
46+
Field(description="A user-friendly or marketing name for the release."),
47+
] = None
4348

4449
model_config = ConfigDict(
4550
extra="ignore",
4651
json_schema_extra={
4752
"example": {
4853
"id": "simcore/services/comp/isolve",
4954
"version": "2.1.1",
55+
"version_display": "2.1.1-2023-10-01",
5056
"title": "iSolve",
5157
"description": "EM solver",
5258
"maintainer": "[email protected]",
@@ -56,31 +62,27 @@ class Solver(BaseService):
5662
)
5763

5864
@classmethod
59-
def create_from_image(cls, image_meta: ServiceMetaDataPublished) -> "Solver":
60-
data = image_meta.model_dump(
61-
include={"name", "key", "version", "description", "contact"},
62-
)
65+
def create_from_image(cls, image_meta: ServiceMetaDataPublished) -> Self:
6366
return cls(
64-
id=data.pop("key"),
65-
version=data.pop("version"),
66-
title=data.pop("name"),
67-
maintainer=data.pop("contact"),
67+
id=image_meta.key,
68+
version=image_meta.version,
69+
title=image_meta.name,
70+
description=image_meta.description,
71+
maintainer=image_meta.contact,
72+
version_display=image_meta.version_display,
6873
url=None,
69-
**data,
7074
)
7175

7276
@classmethod
73-
def create_from_service(cls, service: ServiceGetV2 | LatestServiceGet) -> "Solver":
74-
data = service.model_dump(
75-
include={"name", "key", "version", "description", "contact"},
76-
)
77+
def create_from_service(cls, service: ServiceGetV2 | LatestServiceGet) -> Self:
7778
return cls(
78-
id=data.pop("key"),
79-
version=data.pop("version"),
80-
title=data.pop("name"),
79+
id=service.key,
80+
version=service.version,
81+
title=service.name,
82+
description=service.description,
83+
maintainer=service.contact or "UNDEFINED",
84+
version_display=service.version_display,
8185
url=None,
82-
maintainer=data.pop("contact"),
83-
**data,
8486
)
8587

8688
@classmethod

0 commit comments

Comments
 (0)