Skip to content

Commit 289f936

Browse files
🎨 Ensure consistent app names across simcore stack (ITISFoundation#8119)
1 parent 666dd44 commit 289f936

File tree

17 files changed

+83
-42
lines changed

17 files changed

+83
-42
lines changed

packages/service-library/src/servicelib/utils_meta.py

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,16 @@
1-
""" Utilities to implement _meta.py
2-
3-
"""
1+
"""Utilities to implement _meta.py"""
42

3+
import re
54
from importlib.metadata import distribution
65

76
from models_library.basic_types import VersionStr
87
from packaging.version import Version
98
from pydantic import TypeAdapter
109

10+
_APP_NAME_PATTERN = re.compile(
11+
r"^[a-z0-9]+(-[a-z0-9]+)*$"
12+
) # matches lowercase string with words and non-negative integers separated by dashes (no whitespace)
13+
1114

1215
class PackageInfo:
1316
"""Thin wrapper around pgk_resources.Distribution to access package distribution metadata
@@ -29,11 +32,31 @@ def __init__(self, package_name: str):
2932
package_name: as defined in 'setup.name'
3033
"""
3134
self._distribution = distribution(package_name)
35+
# property checks
36+
if re.match(_APP_NAME_PATTERN, self.app_name) is None:
37+
raise ValueError(
38+
f"Invalid package name {self.app_name}. "
39+
"It must be all lowercase and words separated by dashes ('-')."
40+
)
3241

3342
@property
3443
def project_name(self) -> str:
3544
return self._distribution.metadata["Name"]
3645

46+
@property
47+
def app_name(self) -> str:
48+
"""
49+
Returns the application name as a lowercase string with words separated by dashes ('-').
50+
"""
51+
return self._distribution.metadata["Name"]
52+
53+
@property
54+
def prometheus_friendly_app_name(self) -> str:
55+
"""
56+
Returns a version of the app name which is compatible with Prometheus metrics naming conventions (no dashes).
57+
"""
58+
return self.app_name.replace("-", "_")
59+
3760
@property
3861
def version(self) -> Version:
3962
return Version(self._distribution.version)

packages/service-library/tests/test_utils_meta.py

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
from typing import Final
22

3+
import pytest
34
from models_library.basic_types import VersionStr
45
from packaging.version import Version
6+
from pytest_mock import MockerFixture
57
from servicelib.utils_meta import PackageInfo
68

79

@@ -32,3 +34,33 @@ def test_meta_module_implementation():
3234

3335
assert __version__ in APP_FINISHED_BANNER_MSG
3436
assert PROJECT_NAME in APP_FINISHED_BANNER_MSG
37+
38+
39+
@pytest.mark.parametrize(
40+
"package_name, app_name, is_valid_app_name, is_correct_app_name",
41+
[
42+
("simcore-service-library", "simcore-service-library", True, True),
43+
("simcore-service-lib", "simcore-service-library", True, False),
44+
("simcore_service_library", "simcore_service_library", False, True),
45+
],
46+
)
47+
def test_app_name(
48+
mocker: MockerFixture,
49+
package_name: str,
50+
app_name: str,
51+
is_valid_app_name: bool,
52+
is_correct_app_name: bool,
53+
):
54+
55+
def mock_distribution(name):
56+
return mocker.Mock(metadata={"Name": name, "Version": "1.0.0"})
57+
58+
mocker.patch("servicelib.utils_meta.distribution", side_effect=mock_distribution)
59+
if is_valid_app_name:
60+
info = PackageInfo(package_name=package_name)
61+
if is_correct_app_name:
62+
assert info.app_name == app_name
63+
assert info.prometheus_friendly_app_name == app_name.replace("-", "_")
64+
else:
65+
with pytest.raises(ValueError):
66+
_ = PackageInfo(package_name=package_name)

services/api-server/src/simcore_service_api_server/_meta.py

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,4 @@
1-
""" Application's metadata
2-
3-
"""
4-
1+
"""Application's metadata"""
52

63
from typing import Final
74

@@ -17,7 +14,7 @@
1714
VERSION: Final[Version] = info.version
1815
API_VERSION: Final[VersionStr] = info.__version__
1916
API_VTAG: Final[str] = info.api_prefix_path_tag
20-
APP_NAME: Final[str] = PROJECT_NAME
17+
APP_NAME: Final[str] = info.app_name
2118
SUMMARY: Final[str] = info.get_summary()
2219

2320

services/autoscaling/src/simcore_service_autoscaling/_meta.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
info: Final = PackageInfo(package_name="simcore-service-autoscaling")
99
__version__: Final[VersionStr] = info.__version__
1010

11-
APP_NAME: Final[str] = info.project_name
11+
APP_NAME: Final[str] = info.app_name
1212
API_VERSION: Final[VersionStr] = info.__version__
1313
VERSION: Final[Version] = info.version
1414
API_VTAG: Final[VersionTag] = TypeAdapter(VersionTag).validate_python(

services/catalog/src/simcore_service_catalog/_meta.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
VERSION: Final[Version] = info.version
1313
API_VERSION: Final[VersionStr] = info.__version__
1414
API_VTAG: Final[str] = info.api_prefix_path_tag
15-
APP_NAME: Final[str] = info.project_name
15+
APP_NAME: Final[str] = info.app_name
1616
SUMMARY: Final[str] = info.get_summary()
1717

1818

services/dask-sidecar/src/simcore_service_dask_sidecar/_meta.py

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,12 @@
1-
""" Application's metadata
2-
3-
"""
4-
1+
"""Application's metadata"""
52

63
from typing import Final
74

85
import dask
96
from models_library.basic_types import VersionStr
107
from servicelib.utils_meta import PackageInfo
118

12-
info: Final = PackageInfo(package_name="simcore_service_dask_sidecar")
9+
info: Final = PackageInfo(package_name="simcore-service-dask-sidecar")
1310
__version__: Final[VersionStr] = info.__version__
1411

1512

services/director-v2/src/simcore_service_director_v2/_meta.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,5 +14,5 @@
1414
VERSION: Final[Version] = info.version
1515
API_VERSION: Final[VersionStr] = info.__version__
1616
API_VTAG: Final[str] = info.api_prefix_path_tag
17-
APP_NAME: Final[str] = PROJECT_NAME
17+
APP_NAME: Final[str] = info.app_name
1818
SUMMARY: Final[str] = info.get_summary()

services/director/src/simcore_service_director/_meta.py

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,4 @@
1-
""" Application's metadata
2-
3-
"""
1+
"""Application's metadata"""
42

53
from typing import Final
64

@@ -15,7 +13,7 @@
1513
PROJECT_NAME: Final[str] = info.project_name
1614
VERSION: Final[Version] = info.version
1715
API_VERSION: Final[VersionStr] = info.__version__
18-
APP_NAME: Final[str] = PROJECT_NAME
16+
APP_NAME: Final[str] = info.app_name
1917
API_VTAG: Final[VersionTag] = VersionTag(info.api_prefix_path_tag)
2018
SUMMARY: Final[str] = info.get_summary()
2119

services/dynamic-scheduler/src/simcore_service_dynamic_scheduler/_meta.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
1-
""" Application's metadata
1+
"""Application's metadata"""
22

3-
"""
43
from typing import Final
54

65
from models_library.basic_types import VersionStr
@@ -14,7 +13,7 @@
1413
PROJECT_NAME: Final[str] = info.project_name
1514
VERSION: Final[Version] = info.version
1615
API_VERSION: Final[VersionStr] = info.__version__
17-
APP_NAME = PROJECT_NAME
16+
APP_NAME: Final[str] = info.app_name
1817
API_VTAG: Final[str] = info.api_prefix_path_tag
1918
SUMMARY: Final[str] = info.get_summary()
2019

services/invitations/src/simcore_service_invitations/_meta.py

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,4 @@
1-
""" Application's metadata
2-
3-
"""
1+
"""Application's metadata"""
42

53
from typing import Final
64

@@ -16,7 +14,7 @@
1614
PROJECT_NAME: Final[str] = info.project_name
1715
VERSION: Final[Version] = info.version
1816
API_VERSION: Final[VersionStr] = info.__version__
19-
APP_NAME = PROJECT_NAME
17+
APP_NAME: Final[str] = info.app_name
2018
API_VTAG: Final[VersionTag] = VersionTag(info.api_prefix_path_tag)
2119
SUMMARY: Final[str] = info.get_summary()
2220

0 commit comments

Comments
 (0)