| 
15 | 15 | FILENAME_RE = r".+"  | 
16 | 16 | 
 
  | 
17 | 17 | 
 
  | 
18 |  | -# Add key prefixes for dynamic and computational services  | 
19 |  | -DYNAMIC_SERVICE_KEY_PREFIX: Final[str] = "simcore/services/dynamic"  | 
20 |  | -COMPUTATIONAL_SERVICE_KEY_PREFIX: Final[str] = "simcore/services/comp"  | 
21 |  | -FRONTEND_SERVICE_KEY_PREFIX: Final[str] = "simcore/services/frontend"  | 
22 |  | - | 
 | 18 | +SERVICE_TYPE_TO_NAME_MAP = MappingProxyType(  | 
 | 19 | +    {  | 
 | 20 | +        ServiceType.COMPUTATIONAL: "comp",  | 
 | 21 | +        ServiceType.DYNAMIC: "dynamic",  | 
 | 22 | +        ServiceType.FRONTEND: "frontend",  | 
 | 23 | +    }  | 
 | 24 | +)  | 
23 | 25 | 
 
  | 
 | 26 | +# e.g. simcore/services/comp/opencor  | 
24 | 27 | SERVICE_KEY_RE: Final[re.Pattern[str]] = re.compile(  | 
25 |  | -    rf"^(?P<key_prefix>{COMPUTATIONAL_SERVICE_KEY_PREFIX}|{DYNAMIC_SERVICE_KEY_PREFIX}|{FRONTEND_SERVICE_KEY_PREFIX})"  | 
26 |  | -    r"/(?P<subdir>[a-z0-9][a-z0-9_.-]*/)*"  | 
 | 28 | +    r"^simcore/services/"  | 
 | 29 | +    rf"(?P<type>({ '|'.join(SERVICE_TYPE_TO_NAME_MAP.values()) }))/"  | 
 | 30 | +    r"(?P<subdir>[a-z0-9][a-z0-9_.-]*/)*"  | 
27 | 31 |     r"(?P<name>[a-z0-9-_]+[a-z0-9])$"  | 
28 | 32 | )  | 
 | 33 | + | 
 | 34 | +# e.g. simcore%2Fservices%2Fcomp%2Fopencor  | 
29 | 35 | SERVICE_ENCODED_KEY_RE: Final[re.Pattern[str]] = re.compile(  | 
30 |  | -    rf"^(?P<key_prefix>{COMPUTATIONAL_SERVICE_KEY_PREFIX.replace('/', '%2F')}|{DYNAMIC_SERVICE_KEY_PREFIX.replace('/', '%2F')}|{FRONTEND_SERVICE_KEY_PREFIX.replace('/', '%2F')})"  | 
31 |  | -    r"(?P<subdir>(%2F[a-z0-9][a-z0-9_.-]*)*%2F)?"  | 
 | 36 | +    r"^simcore%2Fservices%2F"  | 
 | 37 | +    rf"(?P<type>({'|'.join(SERVICE_TYPE_TO_NAME_MAP.values())}))%2F"  | 
 | 38 | +    r"(?P<subdir>[a-z0-9][a-z0-9_.-]*%2F)*"  | 
32 | 39 |     r"(?P<name>[a-z0-9-_]+[a-z0-9])$"  | 
33 | 40 | )  | 
34 | 41 | 
 
  | 
35 | 42 | 
 
  | 
36 |  | -DYNAMIC_SERVICE_KEY_RE: Final[re.Pattern[str]] = re.compile(  | 
37 |  | -    rf"^{DYNAMIC_SERVICE_KEY_PREFIX}/"  | 
38 |  | -    r"(?P<subdir>[a-z0-9][a-z0-9_.-]*/)*"  | 
39 |  | -    r"(?P<name>[a-z0-9-_]+[a-z0-9])$"  | 
40 |  | -)  | 
41 |  | -DYNAMIC_SERVICE_KEY_FORMAT: Final[str] = (  | 
42 |  | -    f"{DYNAMIC_SERVICE_KEY_PREFIX}/{{service_name}}"  | 
43 |  | -)  | 
 | 43 | +def create_key_prefix(service_type: ServiceType) -> str:  | 
 | 44 | +    return f"simcore/services/{SERVICE_TYPE_TO_NAME_MAP[service_type]}"  | 
44 | 45 | 
 
  | 
45 | 46 | 
 
  | 
46 |  | -COMPUTATIONAL_SERVICE_KEY_RE: Final[re.Pattern[str]] = re.compile(  | 
47 |  | -    rf"^{COMPUTATIONAL_SERVICE_KEY_PREFIX}/"  | 
48 |  | -    r"(?P<subdir>[a-z0-9][a-z0-9_.-]*/)*"  | 
49 |  | -    r"(?P<name>[a-z0-9-_]+[a-z0-9])$"  | 
50 |  | -)  | 
51 |  | -COMPUTATIONAL_SERVICE_KEY_FORMAT: Final[str] = (  | 
52 |  | -    f"{COMPUTATIONAL_SERVICE_KEY_PREFIX}/{{service_name}}"  | 
 | 47 | +COMPUTATIONAL_SERVICE_KEY_PREFIX: Final[str] = create_key_prefix(  | 
 | 48 | +    ServiceType.COMPUTATIONAL  | 
53 | 49 | )  | 
 | 50 | +DYNAMIC_SERVICE_KEY_PREFIX: Final[str] = create_key_prefix(ServiceType.DYNAMIC)  | 
 | 51 | +FRONTEND_SERVICE_KEY_PREFIX: Final[str] = create_key_prefix(ServiceType.FRONTEND)  | 
54 | 52 | 
 
  | 
55 | 53 | 
 
  | 
56 |  | -FRONTEND_SERVICE_KEY_RE: Final[re.Pattern[str]] = re.compile(  | 
57 |  | -    rf"^{FRONTEND_SERVICE_KEY_PREFIX}/"  | 
58 |  | -    r"(?P<subdir>[a-z0-9][a-z0-9_.-]*/)*"  | 
59 |  | -    r"(?P<name>[a-z0-9-_]+[a-z0-9])$"  | 
 | 54 | +def create_key_regex(service_type: ServiceType) -> re.Pattern[str]:  | 
 | 55 | +    return re.compile(  | 
 | 56 | +        rf"^simcore/services/{SERVICE_TYPE_TO_NAME_MAP[service_type]}/"  | 
 | 57 | +        r"(?P<subdir>[a-z0-9][a-z0-9_.-]*/)*"  | 
 | 58 | +        r"(?P<name>[a-z0-9-_]+[a-z0-9])$"  | 
 | 59 | +    )  | 
 | 60 | + | 
 | 61 | + | 
 | 62 | +def create_key_format(service_type: ServiceType) -> str:  | 
 | 63 | +    return f"simcore/services/{SERVICE_TYPE_TO_NAME_MAP[service_type]}/{{service_name}}"  | 
 | 64 | + | 
 | 65 | + | 
 | 66 | +COMPUTATIONAL_SERVICE_KEY_RE: Final[re.Pattern[str]] = create_key_regex(  | 
 | 67 | +    ServiceType.COMPUTATIONAL  | 
60 | 68 | )  | 
61 |  | -FRONTEND_SERVICE_KEY_FORMAT: Final[str] = (  | 
62 |  | -    f"{FRONTEND_SERVICE_KEY_PREFIX}/{{service_name}}"  | 
 | 69 | +COMPUTATIONAL_SERVICE_KEY_FORMAT: Final[str] = create_key_format(  | 
 | 70 | +    ServiceType.COMPUTATIONAL  | 
63 | 71 | )  | 
64 | 72 | 
 
  | 
 | 73 | +DYNAMIC_SERVICE_KEY_RE: Final[re.Pattern[str]] = create_key_regex(ServiceType.DYNAMIC)  | 
 | 74 | +DYNAMIC_SERVICE_KEY_FORMAT: Final[str] = create_key_format(ServiceType.DYNAMIC)  | 
 | 75 | + | 
 | 76 | +FRONTEND_SERVICE_KEY_RE: Final[re.Pattern[str]] = create_key_regex(ServiceType.FRONTEND)  | 
 | 77 | +FRONTEND_SERVICE_KEY_FORMAT: Final[str] = create_key_format(ServiceType.FRONTEND)  | 
 | 78 | + | 
65 | 79 | 
 
  | 
66 |  | -SERVICE_TYPE_PREFIXES = MappingProxyType(  | 
 | 80 | +SERVICE_TYPE_TO_PREFIX_MAP = MappingProxyType(  | 
67 | 81 |     {  | 
68 | 82 |         ServiceType.COMPUTATIONAL: COMPUTATIONAL_SERVICE_KEY_PREFIX,  | 
69 | 83 |         ServiceType.DYNAMIC: DYNAMIC_SERVICE_KEY_PREFIX,  | 
 | 
72 | 86 | )  | 
73 | 87 | 
 
  | 
74 | 88 | assert all(  # nosec  | 
75 |  | -    not prefix.endswith("/") for prefix in SERVICE_TYPE_PREFIXES.values()  | 
 | 89 | +    not prefix.endswith("/") for prefix in SERVICE_TYPE_TO_PREFIX_MAP.values()  | 
76 | 90 | ), "Service type prefixes must not end with '/'"  | 
0 commit comments