Skip to content

Commit 2ef9e0d

Browse files
authored
🐛 vip-syncer: fixed parsing items in Features string (#7247)
1 parent cb26eab commit 2ef9e0d

File tree

6 files changed

+70
-31
lines changed

6 files changed

+70
-31
lines changed

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

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ class LicensedResourceType(StrAutoEnum):
2929
VIP_FEATURES_EXAMPLE = {
3030
"name": "Duke",
3131
"version": "V2.0",
32-
"sex": "Male",
32+
"sex": "Mas bien poco",
3333
"age": "34 years",
3434
"weight": "70.2 Kg",
3535
"height": "1.77 m",
@@ -41,15 +41,17 @@ class LicensedResourceType(StrAutoEnum):
4141

4242

4343
class FeaturesDict(TypedDict):
44-
name: NotRequired[str]
45-
version: NotRequired[str]
46-
sex: NotRequired[str]
44+
# keep alphabetical
4745
age: NotRequired[str]
48-
weight: NotRequired[str]
49-
height: NotRequired[str]
5046
date: date
5147
ethnicity: NotRequired[str]
5248
functionality: NotRequired[str]
49+
height: NotRequired[str]
50+
name: NotRequired[str]
51+
sex: NotRequired[str]
52+
species: NotRequired[str]
53+
version: NotRequired[str]
54+
weight: NotRequired[str]
5355

5456

5557
VIP_DETAILS_EXAMPLE = {

services/web/server/VERSION

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
0.58.0
1+
0.58.1

services/web/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.58.0
2+
current_version = 0.58.1
33
commit = True
44
message = services/webserver api version: {current_version} → {new_version}
55
tag = False

services/web/server/src/simcore_service_webserver/api/v0/openapi.yaml

Lines changed: 19 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ openapi: 3.1.0
22
info:
33
title: simcore-service-webserver
44
description: Main service with an interface (http-API & websockets) to the web front-end
5-
version: 0.58.0
5+
version: 0.58.1
66
servers:
77
- url: ''
88
description: webserver
@@ -9868,24 +9868,9 @@ components:
98689868
title: ErrorItemType
98699869
FeaturesDict:
98709870
properties:
9871-
name:
9872-
type: string
9873-
title: Name
9874-
version:
9875-
type: string
9876-
title: Version
9877-
sex:
9878-
type: string
9879-
title: Sex
98809871
age:
98819872
type: string
98829873
title: Age
9883-
weight:
9884-
type: string
9885-
title: Weight
9886-
height:
9887-
type: string
9888-
title: Height
98899874
date:
98909875
type: string
98919876
format: date
@@ -9896,6 +9881,24 @@ components:
98969881
functionality:
98979882
type: string
98989883
title: Functionality
9884+
height:
9885+
type: string
9886+
title: Height
9887+
name:
9888+
type: string
9889+
title: Name
9890+
sex:
9891+
type: string
9892+
title: Sex
9893+
species:
9894+
type: string
9895+
title: Species
9896+
version:
9897+
type: string
9898+
title: Version
9899+
weight:
9900+
type: string
9901+
title: Weight
98999902
type: object
99009903
required:
99019904
- date

services/web/server/src/simcore_service_webserver/licenses/_itis_vip_models.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ def _clean_dict_data(data_dict):
4141
def _feature_descriptor_to_dict(descriptor: str) -> dict[str, Any]:
4242
# NOTE: this is manually added in the server side so be more robust to errors
4343
descriptor = _max_str_adapter.validate_python(descriptor.strip("{}"))
44-
pattern = r"(\w{1,100}): ([^,]{1,100})"
44+
pattern = r"(\w{1,100}):\s*([^,]{1,100})"
4545
matches = re.findall(pattern, descriptor)
4646
return dict(matches)
4747

services/web/server/tests/unit/with_dbs/04/licenses/test_itis_vip_models.py

Lines changed: 40 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,9 @@
55
# pylint: disable=unused-variable
66

77

8+
import datetime
9+
from typing import Any
10+
811
import pytest
912
from faker import Faker
1013
from pydantic import ValidationError
@@ -25,23 +28,54 @@ def test_pre_validator_feature_descriptor_to_dict():
2528
assert err_info.value.errors()[0]["type"] == "string_too_long"
2629

2730

28-
def test_validation_of_itis_vip_response_model(faker: Faker):
31+
@pytest.mark.parametrize(
32+
"features_str,expected",
33+
[
34+
(
35+
# checks fix: regex expected at least one space after `:`
36+
"{species:Mouse, functionality:Static, height:95 mm, date: 2012-01-01, name:Male OF1 Mouse, sex:Male, version:1.0, weight:35.5 g}",
37+
{
38+
"version": "1.0",
39+
"weight": "35.5 g",
40+
"species": "Mouse",
41+
"functionality": "Static",
42+
},
43+
),
44+
(
45+
# Checks spaces before `,` are removed
46+
"{date: 2012-01-01, name: Male OF1 Mouse , sex:Male}",
47+
{
48+
"date": datetime.date(2012, 1, 1),
49+
"name": "Male OF1 Mouse",
50+
"sex": "Male",
51+
},
52+
),
53+
],
54+
)
55+
def test_validation_of_itis_vip_response_model(
56+
faker: Faker, features_str: str, expected: dict[str, Any]
57+
):
2958

3059
available_download = random_itis_vip_available_download_item(
3160
identifier=0,
32-
features_functionality="Posable",
3361
fake=faker,
62+
Features=features_str,
3463
)
3564

3665
vip_data = ItisVipData.model_validate(available_download)
3766

67+
# Checks how features BeforeValidator and parser
68+
assert {k: vip_data.features[k] for k in expected} == expected
69+
3870
# Dumped as in the source
3971
assert vip_data.model_dump(by_alias=True)["Features"] == vip_data.features
4072

41-
license_resource_data = ItisVipResourceData(
42-
category_id="123",
43-
category_display="This is a resource",
44-
source=vip_data,
73+
license_resource_data = ItisVipResourceData.model_validate(
74+
{
75+
"category_id": "SomeCategoryID",
76+
"category_display": "This is a resource",
77+
"source": vip_data,
78+
}
4579
)
4680

4781
assert license_resource_data.source.features == vip_data.features

0 commit comments

Comments
 (0)