Skip to content

Commit 7cf2a42

Browse files
author
Andrei Neagu
committed
fixed models library
1 parent 95efd47 commit 7cf2a42

File tree

11 files changed

+113
-83
lines changed

11 files changed

+113
-83
lines changed

packages/models-library/src/models_library/api_schemas_directorv2/clusters.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ class ClusterDetailsGet(ClusterDetails):
113113

114114

115115
class ClusterCreate(BaseCluster):
116-
owner: GroupID | None # type: ignore[assignment]
116+
owner: GroupID | None = None # type: ignore[assignment]
117117
authentication: ExternalClusterAuthentication
118118
access_rights: dict[GroupID, ClusterAccessRights] = Field(
119119
alias="accessRights", default_factory=dict

packages/models-library/src/models_library/api_schemas_directorv2/comp_tasks.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
from typing import Any, TypeAlias
22

33
from models_library.basic_types import IDStr
4-
from pydantic import AnyHttpUrl, AnyUrl, BaseModel, Field, field_validator
4+
from pydantic import AnyHttpUrl, AnyUrl, BaseModel, ConfigDict, Field, field_validator
55

66
from ..clusters import ClusterID
77
from ..projects import ProjectID
@@ -18,6 +18,7 @@ class ComputationGet(ComputationTask):
1818
stop_url: AnyHttpUrl | None = Field(
1919
None, description="the link where to stop the task"
2020
)
21+
model_config = ConfigDict(json_schema_extra={"examples": []})
2122

2223

2324
class ComputationCreate(BaseModel):

packages/models-library/src/models_library/api_schemas_webserver/projects.py

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -83,11 +83,11 @@ class ProjectGet(OutputSchema):
8383
quality: dict[str, Any] = Field(
8484
default_factory=dict, json_schema_extra={"default": {}}
8585
)
86-
dev: dict | None
86+
dev: dict | None = None
8787
permalink: ProjectPermalink | None = None
88-
workspace_id: WorkspaceID | None
89-
folder_id: FolderID | None
90-
trashed_at: datetime | None
88+
workspace_id: WorkspaceID | None = None
89+
folder_id: FolderID | None = None
90+
trashed_at: datetime | None = None
9191

9292
_empty_description = field_validator("description", mode="before")(
9393
none_to_empty_str_pre_validator
@@ -107,7 +107,9 @@ class ProjectReplace(InputSchema):
107107
uuid: ProjectID
108108
name: ShortTruncatedStr
109109
description: LongTruncatedStr
110-
thumbnail: Annotated[HttpUrl | None, BeforeValidator(empty_str_to_none_pre_validator)] = Field(default=None)
110+
thumbnail: Annotated[
111+
HttpUrl | None, BeforeValidator(empty_str_to_none_pre_validator)
112+
] = Field(default=None)
111113
creation_date: DateTimeStr
112114
last_change_date: DateTimeStr
113115
workbench: NodesDict
@@ -127,13 +129,15 @@ class ProjectReplace(InputSchema):
127129
class ProjectPatch(InputSchema):
128130
name: ShortTruncatedStr | None = Field(default=None)
129131
description: LongTruncatedStr | None = Field(default=None)
130-
thumbnail: Annotated[HttpUrl | None, BeforeValidator(empty_str_to_none_pre_validator)] = Field(default=None)
132+
thumbnail: Annotated[
133+
HttpUrl | None, BeforeValidator(empty_str_to_none_pre_validator)
134+
] = Field(default=None)
131135
access_rights: dict[GroupIDStr, AccessRights] | None = Field(default=None)
132136
classifiers: list[ClassifierID] | None = Field(default=None)
133137
dev: dict | None = Field(default=None)
134138
ui: StudyUI | None = Field(default=None)
135139
quality: dict[str, Any] | None = Field(default=None)
136-
140+
137141

138142
__all__: tuple[str, ...] = (
139143
"EmptyModel",

packages/models-library/src/models_library/progress_bar.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@ class ProgressStructuredMessage(BaseModel):
1212
description: IDStr
1313
current: float
1414
total: int
15-
unit: str | None
16-
sub: "ProgressStructuredMessage | None"
15+
unit: str | None = None
16+
sub: "ProgressStructuredMessage | None" = None
1717

1818
model_config = ConfigDict(
1919
json_schema_extra={

packages/models-library/src/models_library/rest_pagination.py

Lines changed: 1 addition & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -136,34 +136,4 @@ def _check_data_compatible_with_meta(cls, v, info: ValidationInfo):
136136
raise ValueError(msg)
137137
return v
138138

139-
model_config = ConfigDict(
140-
extra="forbid",
141-
json_schema_extra={
142-
"examples": [
143-
# first page Page[str]
144-
{
145-
"_meta": {"total": 7, "count": 4, "limit": 4, "offset": 0},
146-
"_links": {
147-
"self": "https://osparc.io/v2/listing?offset=0&limit=4",
148-
"first": "https://osparc.io/v2/listing?offset=0&limit=4",
149-
"prev": None,
150-
"next": "https://osparc.io/v2/listing?offset=1&limit=4",
151-
"last": "https://osparc.io/v2/listing?offset=1&limit=4",
152-
},
153-
"data": ["data 1", "data 2", "data 3", "data 4"],
154-
},
155-
# second and last page
156-
{
157-
"_meta": {"total": 7, "count": 3, "limit": 4, "offset": 1},
158-
"_links": {
159-
"self": "https://osparc.io/v2/listing?offset=1&limit=4",
160-
"first": "https://osparc.io/v2/listing?offset=0&limit=4",
161-
"prev": "https://osparc.io/v2/listing?offset=0&limit=4",
162-
"next": None,
163-
"last": "https://osparc.io/v2/listing?offset=1&limit=4",
164-
},
165-
"data": ["data 5", "data 6", "data 7"],
166-
},
167-
]
168-
},
169-
)
139+
model_config = ConfigDict(extra="forbid")

packages/models-library/src/models_library/rpc_pagination.py

Lines changed: 1 addition & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -74,34 +74,4 @@ def create(
7474
data=chunk,
7575
)
7676

77-
model_config = ConfigDict(
78-
extra="forbid",
79-
json_schema_extra={
80-
"examples": [
81-
# first page Page[str]
82-
{
83-
"_meta": {"total": 7, "count": 4, "limit": 4, "offset": 0},
84-
"_links": {
85-
"self": {"offset": 0, "limit": 4},
86-
"first": {"offset": 0, "limit": 4},
87-
"prev": None,
88-
"next": {"offset": 1, "limit": 4},
89-
"last": {"offset": 1, "limit": 4},
90-
},
91-
"data": ["data 1", "data 2", "data 3", "data 4"],
92-
},
93-
# second and last page
94-
{
95-
"_meta": {"total": 7, "count": 3, "limit": 4, "offset": 1},
96-
"_links": {
97-
"self": {"offset": 1, "limit": 4},
98-
"first": {"offset": 0, "limit": 4},
99-
"prev": {"offset": 0, "limit": 4},
100-
"next": None,
101-
"last": {"offset": 1, "limit": 4},
102-
},
103-
"data": ["data 5", "data 6", "data 7"],
104-
},
105-
]
106-
},
107-
)
77+
model_config = ConfigDict(extra="forbid")
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
from typing import Final
2+
3+
PAGE_EXAMPLES: Final[list[dict]] = [
4+
# first page Page[str]
5+
{
6+
"_meta": {"total": 7, "count": 4, "limit": 4, "offset": 0},
7+
"_links": {
8+
"self": "https://osparc.io/v2/listing?offset=0&limit=4",
9+
"first": "https://osparc.io/v2/listing?offset=0&limit=4",
10+
"prev": None,
11+
"next": "https://osparc.io/v2/listing?offset=1&limit=4",
12+
"last": "https://osparc.io/v2/listing?offset=1&limit=4",
13+
},
14+
"data": ["data 1", "data 2", "data 3", "data 4"],
15+
},
16+
# second and last page
17+
{
18+
"_meta": {"total": 7, "count": 3, "limit": 4, "offset": 1},
19+
"_links": {
20+
"self": "https://osparc.io/v2/listing?offset=1&limit=4",
21+
"first": "https://osparc.io/v2/listing?offset=0&limit=4",
22+
"prev": "https://osparc.io/v2/listing?offset=0&limit=4",
23+
"next": None,
24+
"last": "https://osparc.io/v2/listing?offset=1&limit=4",
25+
},
26+
"data": ["data 5", "data 6", "data 7"],
27+
},
28+
]
29+
30+
RPC_PAGE_EXAMPLES: Final[list[dict]] = [
31+
# first page Page[str]
32+
{
33+
"_meta": {"total": 7, "count": 4, "limit": 4, "offset": 0},
34+
"_links": {
35+
"self": {"offset": 0, "limit": 4},
36+
"first": {"offset": 0, "limit": 4},
37+
"prev": None,
38+
"next": {"offset": 1, "limit": 4},
39+
"last": {"offset": 1, "limit": 4},
40+
},
41+
"data": ["data 1", "data 2", "data 3", "data 4"],
42+
},
43+
# second and last page
44+
{
45+
"_meta": {"total": 7, "count": 3, "limit": 4, "offset": 1},
46+
"_links": {
47+
"self": {"offset": 1, "limit": 4},
48+
"first": {"offset": 0, "limit": 4},
49+
"prev": {"offset": 0, "limit": 4},
50+
"next": None,
51+
"last": {"offset": 1, "limit": 4},
52+
},
53+
"data": ["data 5", "data 6", "data 7"],
54+
},
55+
]

packages/models-library/tests/test__models_examples.py

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,28 @@
11
import json
2+
from itertools import chain
23
from typing import Any
34

45
import models_library
56
import pytest
7+
from models_library.rest_pagination import Page
8+
from models_library.rpc_pagination import PageRpc
69
from pydantic import BaseModel
7-
from pytest_simcore.pydantic_models import walk_model_examples_in_package
10+
from pytest_simcore.pydantic_models import (
11+
ModelExample,
12+
iter_examples,
13+
walk_model_examples_in_package,
14+
)
15+
from shared_examples import PAGE_EXAMPLES, RPC_PAGE_EXAMPLES
16+
17+
GENERIC_EXAMPLES: list[ModelExample] = [
18+
*iter_examples(model_cls=Page[str], examples=PAGE_EXAMPLES),
19+
*iter_examples(model_cls=PageRpc[str], examples=RPC_PAGE_EXAMPLES),
20+
]
821

922

1023
@pytest.mark.parametrize(
1124
"model_cls, example_name, example_data",
12-
walk_model_examples_in_package(models_library),
25+
chain(GENERIC_EXAMPLES, walk_model_examples_in_package(models_library)),
1326
)
1427
def test_all_models_library_models_config_examples(
1528
model_cls: type[BaseModel], example_name: int, example_data: Any

packages/models-library/tests/test_rest_pagination.py

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,20 @@
33
import pytest
44
from models_library.rest_pagination import Page, PageMetaInfoLimitOffset
55
from pydantic.main import BaseModel
6+
from shared_examples import PAGE_EXAMPLES
67

78

8-
@pytest.mark.parametrize("cls_model", [Page[str], PageMetaInfoLimitOffset])
9-
def test_page_response_limit_offset_models(cls_model: BaseModel):
10-
examples = cls_model.model_config["json_schema_extra"]["examples"]
9+
@pytest.mark.parametrize(
10+
"cls_model, examples",
11+
[
12+
(Page[str], PAGE_EXAMPLES),
13+
(
14+
PageMetaInfoLimitOffset,
15+
PageMetaInfoLimitOffset.model_config["json_schema_extra"]["examples"],
16+
),
17+
],
18+
)
19+
def test_page_response_limit_offset_models(cls_model: BaseModel, examples: list[dict]):
1120

1221
for index, example in enumerate(examples):
1322
print(f"{index:-^10}:\n", example)
@@ -35,14 +44,14 @@ def test_invalid_count(count: int, offset: int):
3544

3645

3746
def test_data_size_does_not_fit_count():
38-
example = deepcopy(Page[str].model_config["json_schema_extra"]["examples"][0])
47+
example = deepcopy(PAGE_EXAMPLES[0])
3948
example["_meta"]["count"] = len(example["data"]) - 1
4049
with pytest.raises(ValueError):
4150
Page[str](**example)
4251

4352

4453
def test_empty_data_is_converted_to_list():
45-
example = deepcopy(Page[str].model_config["json_schema_extra"]["examples"][0])
54+
example = deepcopy(PAGE_EXAMPLES[0])
4655
example["data"] = None
4756
example["_meta"]["count"] = 0
4857
model_instance = Page[str](**example)

packages/models-library/tests/test_rpc_pagination.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,10 @@
22

33
import pytest
44
from models_library.rpc_pagination import PageRpc
5+
from shared_examples import RPC_PAGE_EXAMPLES
56

67

7-
@pytest.mark.parametrize(
8-
"example", PageRpc.model_config["json_schema_extra"]["examples"]
9-
)
8+
@pytest.mark.parametrize("example", RPC_PAGE_EXAMPLES)
109
def test_create_page_rpc(example: dict[str, Any]):
1110

1211
expected = PageRpc.model_validate(example)

0 commit comments

Comments
 (0)