Skip to content

Commit 227d72e

Browse files
authored
♻️ Maintenance/function services (cont.) (ITISFoundation#2989)
1 parent d01a263 commit 227d72e

File tree

12 files changed

+57
-51
lines changed

12 files changed

+57
-51
lines changed
Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,15 @@
11
from typing import Final
22

3+
from ..services import ServiceKey
4+
35
# NOTE: due to legacy reasons, the name remains with 'frontend' in it but
46
# it now refers to a more general group: function sections that contains front-end services as well
57
FUNCTION_SERVICE_KEY_PREFIX: Final[str] = "simcore/services/frontend"
68

79

8-
def is_function_service(service_key: str) -> bool:
10+
def is_function_service(service_key: ServiceKey) -> bool:
911
return service_key.startswith(f"{FUNCTION_SERVICE_KEY_PREFIX}/")
1012

1113

12-
def is_parameter_service(service_key: str) -> bool:
13-
return service_key.startswith(f"{FUNCTION_SERVICE_KEY_PREFIX}/parameter/")
14-
15-
16-
def is_iterator_service(service_key: str) -> bool:
14+
def is_iterator_service(service_key: ServiceKey) -> bool:
1715
return service_key.startswith(f"{FUNCTION_SERVICE_KEY_PREFIX}/data-iterator/")
18-
19-
20-
def is_iterator_consumer_service(service_key: str) -> bool:
21-
return service_key.startswith(f"{FUNCTION_SERVICE_KEY_PREFIX}/iterator-consumer/")

packages/models-library/src/models_library/function_services_catalog/_registry.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,7 @@
88

99
import logging
1010

11-
from models_library.function_services_catalog.services import nodes_group
12-
11+
from ..function_services_catalog.services import nodes_group
1312
from ._settings import FunctionServiceSettings
1413
from ._utils import FunctionServices
1514
from .services import (

packages/models-library/src/models_library/function_services_catalog/_utils.py

Lines changed: 30 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,9 @@
11
import logging
22
from dataclasses import dataclass
3-
from typing import Callable, Dict, Iterable, Optional, Tuple
3+
from typing import Callable, Dict, Iterator, Optional, Tuple
44
from urllib.parse import quote
55

6-
from models_library.basic_regex import VERSION_RE
7-
from models_library.services import SERVICE_KEY_RE
8-
from pydantic import constr
9-
10-
from ..services import Author, ServiceDockerData
6+
from ..services import Author, ServiceDockerData, ServiceKey, ServiceVersion
117
from ._settings import AUTHORS, FunctionServiceSettings
128

139
log = logging.getLogger(__name__)
@@ -27,8 +23,8 @@ def create_fake_thumbnail_url(label: str) -> str:
2723
return f"https://fakeimg.pl/100x100/ff0000%2C128/000%2C255/?text={quote(label)}"
2824

2925

30-
ServiceKey = constr(regex=SERVICE_KEY_RE)
31-
ServiceVersion = constr(regex=VERSION_RE)
26+
class ServiceNotFound(KeyError):
27+
pass
3228

3329

3430
@dataclass
@@ -45,13 +41,15 @@ def __init__(self, settings: Optional[FunctionServiceSettings] = None):
4541
self._functions: Dict[Tuple[ServiceKey, ServiceVersion], _Record] = {}
4642
self.settings = settings
4743

48-
def add_function_service(
44+
def add(
4945
self,
5046
meta: ServiceDockerData,
5147
implementation: Optional[Callable] = None,
5248
is_under_development: bool = False,
5349
):
54-
50+
"""
51+
raises ValueError
52+
"""
5553
if not isinstance(meta, ServiceDockerData):
5654
raise ValueError(f"Expected ServiceDockerData, got {type(meta)}")
5755

@@ -71,42 +69,52 @@ def add_function_service(
7169
def extend(self, other: "FunctionServices"):
7270
# pylint: disable=protected-access
7371
for f in other._functions.values():
74-
self.add_function_service(f.meta, f.implementation, f.is_under_development)
72+
self.add(f.meta, f.implementation, f.is_under_development)
7573

76-
def skip_dev(self):
74+
def _skip_dev(self):
7775
skip = True
7876
if self.settings:
7977
skip = not self.settings.is_dev_feature_enabled()
8078
return skip
8179

82-
def iter_items(self):
83-
skip_dev = self.skip_dev()
80+
def _items(self) -> Iterator[Tuple[Tuple[ServiceKey, ServiceVersion], _Record]]:
81+
skip_dev = self._skip_dev()
8482
for key, value in self._functions.items():
8583
if value.is_under_development and skip_dev:
8684
continue
8785
yield key, value
8886

89-
def iter_metadata(self) -> Iterable[ServiceDockerData]:
90-
for _, f in self.iter_items():
87+
def iter_metadata(self) -> Iterator[ServiceDockerData]:
88+
for _, f in self._items():
9189
yield f.meta
9290

93-
def iter_services_key_version(self) -> Iterable[Tuple[ServiceKey, ServiceVersion]]:
94-
for kv, f in self.iter_items():
91+
def iter_services_key_version(self) -> Iterator[Tuple[ServiceKey, ServiceVersion]]:
92+
for kv, f in self._items():
9593
assert kv == (f.meta.key, f.meta.version) # nosec
9694
yield kv
9795

9896
def get_implementation(
9997
self, service_key: ServiceKey, service_version: ServiceVersion
10098
) -> Optional[Callable]:
101-
# raises KeyError if not found
102-
func = self._functions[(service_key, service_version)]
99+
"""raises ServiceNotFound"""
100+
try:
101+
func = self._functions[(service_key, service_version)]
102+
except KeyError as err:
103+
raise ServiceNotFound(
104+
f"{service_key}:{service_version} not found in registry"
105+
) from err
103106
return func.implementation
104107

105108
def get_metadata(
106109
self, service_key: ServiceKey, service_version: ServiceVersion
107110
) -> ServiceDockerData:
108-
# raises KeyError if not found
109-
func = self._functions[(service_key, service_version)]
111+
"""raises ServiceNotFound"""
112+
try:
113+
func = self._functions[(service_key, service_version)]
114+
except KeyError as err:
115+
raise ServiceNotFound(
116+
f"{service_key}:{service_version} not found in registry"
117+
) from err
110118
return func.meta
111119

112120
def __len__(self):

packages/models-library/src/models_library/function_services_catalog/services/demo_units.py

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,11 @@ def build_input(schema):
1515

1616

1717
# SEE https://github.com/hgrecco/pint/blob/master/pint/default_en.txt
18+
#
19+
# NOTE: this service is also used as fixture in test_catalog_utils.py::test_can_connect_with_units
20+
# and assumes for convenience that matching 'Titles' correspond to compatible units.
21+
# If this assumption cannot be guaranteed anymore the test must be updated.
22+
#
1823

1924
META = ServiceDockerData.parse_obj(
2025
{
@@ -25,7 +30,8 @@ def build_input(schema):
2530
# - 0.2.0: reverted order of first 5 outputs
2631
"type": ServiceType.BACKEND,
2732
"name": "Demo Units",
28-
"description": "Demo that takes base units as inputs and transform them in the outputs",
33+
"description": "This service is for demo purposes."
34+
"It takes base units as inputs and transform them in the outputs.",
2935
"authors": [PC, OM],
3036
"contact": PC.email,
3137
"thumbnail": create_fake_thumbnail_url("demo-units"),
@@ -111,7 +117,7 @@ def build_input(schema):
111117
"radiation": build_input(
112118
{
113119
"title": "Radiation",
114-
"x_unit": "roentgen",
120+
"x_unit": "rutherford",
115121
"type": "number",
116122
}
117123
),
@@ -187,7 +193,7 @@ def build_input(schema):
187193
),
188194
"radiation": build_input(
189195
{
190-
"title": "Radiati0n", # it's not a typo
196+
"title": "Radiation",
191197
"x_unit": "curie",
192198
"type": "number",
193199
}
@@ -198,7 +204,7 @@ def build_input(schema):
198204

199205

200206
services = FunctionServices()
201-
services.add_function_service(
207+
services.add(
202208
meta=META,
203209
is_under_development=True,
204210
)

packages/models-library/src/models_library/function_services_catalog/services/file_picker.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,6 @@
3030

3131

3232
services = FunctionServices()
33-
services.add_function_service(
33+
services.add(
3434
meta=META,
3535
)

packages/models-library/src/models_library/function_services_catalog/services/iter_range.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
from typing import Iterator, Optional
22

3-
from models_library.projects_nodes import Outputs
4-
3+
from ...projects_nodes import Outputs
54
from ...services import LATEST_INTEGRATION_VERSION, ServiceDockerData, ServiceType
65
from .._key_labels import FUNCTION_SERVICE_KEY_PREFIX
76
from .._utils import OM, FunctionServices, create_fake_thumbnail_url
@@ -69,7 +68,7 @@ def _linspace_generator(**kwargs) -> Iterator[Outputs]:
6968

7069

7170
services = FunctionServices()
72-
services.add_function_service(
71+
services.add(
7372
meta=create_metadata("integer", prefix="int"),
7473
implementation=_linspace_generator,
7574
is_under_development=True,

packages/models-library/src/models_library/function_services_catalog/services/iter_sensitivity.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
from copy import deepcopy
22
from typing import Any, Dict, Iterator, List, Tuple
33

4-
from models_library.projects_nodes import Outputs
54
from pydantic import schema_of
65

6+
from ...projects_nodes import Outputs
77
from ...services import LATEST_INTEGRATION_VERSION, ServiceDockerData, ServiceType
88
from .._key_labels import FUNCTION_SERVICE_KEY_PREFIX
99
from .._utils import EN, OM, FunctionServices, create_fake_thumbnail_url
@@ -104,7 +104,7 @@ def _sensitivity_generator(
104104

105105

106106
services = FunctionServices()
107-
services.add_function_service(
107+
services.add(
108108
meta=META,
109109
implementation=_sensitivity_generator,
110110
is_under_development=True,

packages/models-library/src/models_library/function_services_catalog/services/nodes_group.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,4 +36,4 @@
3636

3737

3838
services = FunctionServices()
39-
services.add_function_service(meta=META, is_under_development=True)
39+
services.add(meta=META, is_under_development=True)

packages/models-library/src/models_library/function_services_catalog/services/parameters.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,4 +82,4 @@ def create_metadata(
8282

8383
services = FunctionServices()
8484
for m in (META_NUMBER, META_BOOL, META_INT, META_STR, META_ARRAY):
85-
services.add_function_service(meta=m)
85+
services.add(meta=m)

packages/models-library/src/models_library/function_services_catalog/services/probes.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,4 +71,4 @@ def create_metadata(type_name: str, prefix: Optional[str] = None) -> ServiceDock
7171

7272
services = FunctionServices()
7373
for m in (META_NUMBER, META_BOOL, META_INT, META_STR, META_ARRAY):
74-
services.add_function_service(meta=m)
74+
services.add(meta=m)

0 commit comments

Comments
 (0)