Skip to content

Commit 19bfadc

Browse files
authored
fix: added a StrEnum for Entrypoints to avoid spelling mistakes (#744)
1 parent 2fad976 commit 19bfadc

14 files changed

Lines changed: 79 additions & 48 deletions

File tree

diracx-cli/src/diracx/cli/__init__.py

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
from __future__ import annotations
22

3-
from diracx.core.extensions import select_from_extension
3+
from diracx.core.extensions import DiracEntryPoint, select_from_extension
44

55
from .auth import app
66

@@ -9,21 +9,26 @@
99

1010
# Load all the sub commands
1111
cli_names = set(
12-
[entry_point.name for entry_point in select_from_extension(group="diracx.cli")]
12+
[
13+
entry_point.name
14+
for entry_point in select_from_extension(group=DiracEntryPoint.CLI)
15+
]
1316
)
1417
for cli_name in cli_names:
15-
entry_point = select_from_extension(group="diracx.cli", name=cli_name)[0]
18+
entry_point = select_from_extension(group=DiracEntryPoint.CLI, name=cli_name)[0]
1619
app.add_typer(entry_point.load(), name=entry_point.name)
1720

1821

1922
cli_hidden_names = set(
2023
[
2124
entry_point.name
22-
for entry_point in select_from_extension(group="diracx.cli.hidden")
25+
for entry_point in select_from_extension(group=DiracEntryPoint.HIDDEN_CLI)
2326
]
2427
)
2528
for cli_name in cli_hidden_names:
26-
entry_point = select_from_extension(group="diracx.cli.hidden", name=cli_name)[0]
29+
entry_point = select_from_extension(
30+
group=DiracEntryPoint.HIDDEN_CLI, name=cli_name
31+
)[0]
2732
app.add_typer(entry_point.load(), name=entry_point.name, hidden=True)
2833

2934

diracx-cli/src/diracx/cli/internal/legacy.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121

2222
from diracx.core.config import Config
2323
from diracx.core.config.schema import Field, SupportInfo
24-
from diracx.core.extensions import select_from_extension
24+
from diracx.core.extensions import DiracEntryPoint, select_from_extension
2525

2626
from ..utils import AsyncTyper
2727

@@ -77,9 +77,9 @@ def cs_sync(old_file: Path, new_file: Path):
7777
)
7878

7979
_apply_fixes(raw)
80-
config_class: Config = select_from_extension(group="diracx", name="config")[
81-
0
82-
].load()
80+
config_class: Config = select_from_extension(
81+
group=DiracEntryPoint.CORE, name="config"
82+
)[0].load()
8383
config = config_class.model_validate(raw)
8484
new_file.write_text(
8585
yaml.safe_dump(config.model_dump(exclude_unset=True, mode="json"))
@@ -264,7 +264,7 @@ def generate_helm_values(
264264

265265
from diracx.core.extensions import select_from_extension
266266

267-
for entry_point in select_from_extension(group="diracx.dbs.sql"):
267+
for entry_point in select_from_extension(group=DiracEntryPoint.SQL_DB):
268268
db_name = entry_point.name
269269
db_config = all_db_configs.get(db_name, {})
270270

@@ -310,7 +310,7 @@ def generate_helm_values(
310310
},
311311
}
312312

313-
for entry_point in select_from_extension(group="diracx.dbs.os"):
313+
for entry_point in select_from_extension(group=DiracEntryPoint.OS_DB):
314314
db_name = entry_point.name
315315
db_config = all_db_configs.get(db_name, {})
316316

diracx-core/src/diracx/core/config/sources.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
from pydantic import AnyUrl, BeforeValidator, TypeAdapter, UrlConstraints
2222

2323
from ..exceptions import BadConfigurationVersionError
24-
from ..extensions import select_from_extension
24+
from ..extensions import DiracEntryPoint, select_from_extension
2525
from ..utils import TwoLevelCache
2626
from .schema import Config
2727

@@ -214,9 +214,9 @@ def read_raw(self, hexsha: str, modified: datetime) -> Config:
214214
f"Error reading configuration: {e}"
215215
) from e
216216

217-
config_class: Config = select_from_extension(group="diracx", name="config")[
218-
0
219-
].load()
217+
config_class: Config = select_from_extension(
218+
group=DiracEntryPoint.CORE, name="config"
219+
)[0].load()
220220
config = config_class.model_validate(raw_obj)
221221
config._hexsha = hexsha
222222
config._modified = modified

diracx-core/src/diracx/core/extensions.py

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,11 @@
44
"extensions_by_priority",
55
"select_from_extension",
66
"supports_extending",
7+
"DiracEntryPoint",
78
]
89

910
from collections import defaultdict
11+
from enum import StrEnum
1012
from importlib.metadata import EntryPoint, entry_points
1113
from typing import Callable, ParamSpec, TypeVar, cast
1214

@@ -16,6 +18,20 @@
1618
P = ParamSpec("P")
1719

1820

21+
class DiracEntryPoint(StrEnum):
22+
"""Available entrypoint group values."""
23+
24+
CORE = "diracx"
25+
ACCESS_POLICY = "diracx.access_policies"
26+
CLI = "diracx.cli"
27+
HIDDEN_CLI = "diracx.cli.hidden"
28+
OS_DB = "diracx.dbs.os"
29+
SQL_DB = "diracx.dbs.sql"
30+
MIN_CLIENT_VERSION = "diracx.min_client_version"
31+
RESOURCES = "diracx.resources"
32+
SERVICES = "diracx.services"
33+
34+
1935
@cached(cache=LRUCache(maxsize=1))
2036
def extensions_by_priority() -> list[str]:
2137
"""Yield extension module names in order of priority.
@@ -24,10 +40,10 @@ def extensions_by_priority() -> list[str]:
2440
importing diracx in the MetaPathFinder as part of unrelated imports
2541
(e.g. http.client).
2642
"""
27-
selected = entry_points().select(group="diracx")
43+
selected = entry_points().select(group=DiracEntryPoint.CORE)
2844
if selected is None:
2945
raise NotImplementedError(
30-
"No entry points found for group 'diracx'. Do you have it installed?"
46+
f"No entry points found for group {DiracEntryPoint.CORE}. Do you have it installed?"
3147
)
3248
extensions = set()
3349
for entry_point in selected.select(name="extension"):
@@ -73,7 +89,7 @@ def supports_extending(
7389
name: The entry point name to search for
7490
7591
Example:
76-
@supports_extending("diracx.resources", "find_compatible_platforms")
92+
@supports_extending(DiracEntryPoint.RESOURCES, "find_compatible_platforms")
7793
def my_function():
7894
return "default implementation"
7995

diracx-core/src/diracx/core/resources.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,10 @@
77
from DIRACCommon.Core.Utilities.ReturnValues import returnValueOrRaise
88

99
from diracx.core.config import Config
10-
from diracx.core.extensions import supports_extending
10+
from diracx.core.extensions import DiracEntryPoint, supports_extending
1111

1212

13-
@supports_extending("diracx.resources", "find_compatible_platforms")
13+
@supports_extending(DiracEntryPoint.RESOURCES, "find_compatible_platforms")
1414
def find_compatible_platforms(job_platforms: list[str], config: Config) -> list[str]:
1515
"""Find compatible platforms for the given job platforms.
1616

diracx-core/tests/test_entry_points.py

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

33
from importlib.metadata import entry_points
44

5+
from diracx.core.extensions import DiracEntryPoint
6+
57

68
def test_diracx_resources_entry_point():
79
"""Test that the diracx.resources entry point is properly configured."""
810
# Get all entry points for the diracx.resources group
9-
resources_eps = entry_points().select(group="diracx.resources")
11+
resources_eps = entry_points().select(group=DiracEntryPoint.RESOURCES)
1012

1113
# Check that find_compatible_platforms entry point exists
1214
find_platforms_ep = None
@@ -29,7 +31,7 @@ def test_diracx_resources_entry_point():
2931
def test_entry_point_functionality():
3032
"""Test that the entry point points to the correct function."""
3133
# Get the entry point
32-
resources_eps = entry_points().select(group="diracx.resources")
34+
resources_eps = entry_points().select(group=DiracEntryPoint.RESOURCES)
3335
find_platforms_ep = None
3436
for ep in resources_eps:
3537
if ep.name == "find_compatible_platforms":

diracx-core/tests/test_extensions.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import pytest
44

55
from diracx.core.extensions import (
6+
DiracEntryPoint,
67
extensions_by_priority,
78
select_from_extension,
89
supports_extending,
@@ -26,9 +27,9 @@ def test_extensions_by_priority():
2627
def test_select_from_extension():
2728
"""Test the select_from_extension function."""
2829
# Test with existing group
29-
result = select_from_extension(group="diracx", name="extension")
30+
result = select_from_extension(group=DiracEntryPoint.CORE, name="extension")
3031
assert len(result) >= 1
31-
assert all(ep.group == "diracx" for ep in result)
32+
assert all(ep.group == DiracEntryPoint.CORE for ep in result)
3233
assert all(ep.name == "extension" for ep in result)
3334

3435
# Test with non-existent group

diracx-db/src/diracx/db/os/utils.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
from opensearchpy import AsyncOpenSearch
1616

1717
from diracx.core.exceptions import InvalidQueryError
18-
from diracx.core.extensions import select_from_extension
18+
from diracx.core.extensions import DiracEntryPoint, select_from_extension
1919
from diracx.db.exceptions import DBUnavailableError
2020

2121
logger = logging.getLogger(__name__)
@@ -93,7 +93,7 @@ def available_implementations(cls, db_name: str) -> list[type[BaseOSDB]]:
9393
db_classes: list[type[BaseOSDB]] = [
9494
entry_point.load()
9595
for entry_point in select_from_extension(
96-
group="diracx.dbs.os", name=db_name
96+
group=DiracEntryPoint.OS_DB, name=db_name
9797
)
9898
]
9999
if not db_classes:
@@ -108,7 +108,7 @@ def available_urls(cls) -> dict[str, dict[str, Any]]:
108108
prefixed with ``DIRACX_OS_DB_{DB_NAME}``.
109109
"""
110110
conn_kwargs: dict[str, dict[str, Any]] = {}
111-
for entry_point in select_from_extension(group="diracx.dbs.os"):
111+
for entry_point in select_from_extension(group=DiracEntryPoint.OS_DB):
112112
db_name = entry_point.name
113113
var_name = f"DIRACX_OS_DB_{entry_point.name.upper()}"
114114
if var_name in os.environ:

diracx-db/src/diracx/db/sql/utils/base.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
from uuid_utils import UUID, uuid7
1919

2020
from diracx.core.exceptions import InvalidQueryError
21-
from diracx.core.extensions import select_from_extension
21+
from diracx.core.extensions import DiracEntryPoint, select_from_extension
2222
from diracx.core.models import (
2323
SearchSpec,
2424
SortDirection,
@@ -111,7 +111,7 @@ def available_implementations(cls, db_name: str) -> list[type["BaseSQLDB"]]:
111111
db_classes: list[type[BaseSQLDB]] = [
112112
entry_point.load()
113113
for entry_point in select_from_extension(
114-
group="diracx.dbs.sql", name=db_name
114+
group=DiracEntryPoint.SQL_DB, name=db_name
115115
)
116116
]
117117
if not db_classes:
@@ -126,7 +126,7 @@ def available_urls(cls) -> dict[str, str]:
126126
prefixed with ``DIRACX_DB_URL_{DB_NAME}``.
127127
"""
128128
db_urls: dict[str, str] = {}
129-
for entry_point in select_from_extension(group="diracx.dbs.sql"):
129+
for entry_point in select_from_extension(group=DiracEntryPoint.SQL_DB):
130130
db_name = entry_point.name
131131
var_name = f"DIRACX_DB_URL_{entry_point.name.upper()}"
132132
if var_name in os.environ:

diracx-routers/src/diracx/routers/access_policies.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626

2727
from fastapi import Depends
2828

29-
from diracx.core.extensions import select_from_extension
29+
from diracx.core.extensions import DiracEntryPoint, select_from_extension
3030
from diracx.core.models import (
3131
AccessTokenPayload,
3232
RefreshTokenPayload,
@@ -68,7 +68,7 @@ def available_implementations(cls, access_policy_name: str):
6868
policy_classes: list[type["BaseAccessPolicy"]] = [
6969
entry_point.load()
7070
for entry_point in select_from_extension(
71-
group="diracx.access_policies", name=access_policy_name
71+
group=DiracEntryPoint.ACCESS_POLICY, name=access_policy_name
7272
)
7373
]
7474
if not policy_classes:

0 commit comments

Comments
 (0)