@@ -704,10 +704,10 @@ class DataCluster:
704704 # include directory and repository.
705705 #
706706 # For instance for a purls.yml file stored for each package:
707- # {namespace}/{name}/purls.yml
707+ # {/ namespace}/{name}/purls.yml
708708 #
709709 # For a scancode.json file stored for each package version:
710- # {namespace}/{name}/{version}/scancode.json
710+ # {/ namespace}/{name}/{version}/scancode.json
711711 datafile_path_template : str
712712
713713 # list of unique PurlTypeConfig for types stored in this data cluster.
@@ -858,8 +858,9 @@ def get_datafile_relative_path(self, purl: Union[str, PackageURL]) -> str:
858858 f"DataCluster '{ self .data_kind } ' needs PackageURL with version to generate path."
859859 )
860860
861- return self .datafile_path_template .format (
862- namespace = f"/{ purl .namespace } " if purl .namespace else "" ,
861+ template = uritemplate .URITemplate (self .datafile_path_template )
862+ return template .expand (
863+ namespace = purl .namespace ,
863864 name = purl .name ,
864865 version = purl .version ,
865866 )
@@ -1126,7 +1127,7 @@ def cluster_preset():
11261127 DataCluster (
11271128 data_kind = "purls" ,
11281129 description = "List of fully qualified PURL strings for a package, sorted by version." ,
1129- datafile_path_template = "{namespace}/{name}/purls.yml" ,
1130+ datafile_path_template = "{/ namespace}/{name}/purls.yml" ,
11301131 purl_type_configs = PurlTypeConfig .small_size_configs (),
11311132 data_schema_url = "" ,
11321133 documentation_url = "https://github.com/package-url/purl-spec/" ,
@@ -1160,7 +1161,7 @@ def cluster_preset():
11601161 data_kind = "purldb" ,
11611162 description = "PurlDB normalized metadata datafiles for each package "
11621163 "versions. Does not include fingerprints and symbols." ,
1163- datafile_path_template = "{namespace}/{name}/{version}/purldb.json" ,
1164+ datafile_path_template = "{/ namespace}/{name}/{version}/purldb.json" ,
11641165 purl_type_configs = PurlTypeConfig .large_size_configs (),
11651166 data_schema_url = "" ,
11661167 documentation_url = "" ,
@@ -1171,7 +1172,7 @@ def cluster_preset():
11711172 data_kind = "vulnerabilities" ,
11721173 description = "VulnerableCode vulnerabilities for each package. "
11731174 "Also includes a separate vulnerabilities directory/" ,
1174- datafile_path_template = "{namespace}/{name}/vulnerabilities.json" ,
1175+ datafile_path_template = "{/ namespace}/{name}/vulnerabilities.json" ,
11751176 purl_type_configs = [PurlTypeConfig .default_config ()],
11761177 data_schema_url = "" ,
11771178 documentation_url = "" ,
@@ -1180,7 +1181,7 @@ def cluster_preset():
11801181 DataCluster (
11811182 data_kind = "security_advisories" ,
11821183 description = "VulnerableCode security advisories for each package version." ,
1183- datafile_path_template = "{namespace}/{name}/{version}/advisories.json" ,
1184+ datafile_path_template = "{/ namespace}/{name}/{version}/advisories.json" ,
11841185 purl_type_configs = [PurlTypeConfig .default_config ()],
11851186 data_schema_url = "" ,
11861187 documentation_url = "" ,
@@ -1189,7 +1190,7 @@ def cluster_preset():
11891190 DataCluster (
11901191 data_kind = "scancode_toolkit_scans" ,
11911192 description = "scancode toolkit scans for each package version." ,
1192- datafile_path_template = "{namespace}/{name}/{version}/scancode-toolkit.json" ,
1193+ datafile_path_template = "{/ namespace}/{name}/{version}/scancode-toolkit.json" ,
11931194 purl_type_configs = PurlTypeConfig .large_size_configs (),
11941195 data_schema_url = "" ,
11951196 documentation_url = "" ,
@@ -1198,7 +1199,7 @@ def cluster_preset():
11981199 DataCluster (
11991200 data_kind = "scancode_fingerprints" ,
12001201 description = "scancode_fingerprints for each package version." ,
1201- datafile_path_template = "{namespace}/{name}/{version}/scancode-fingerprints.json" ,
1202+ datafile_path_template = "{/ namespace}/{name}/{version}/scancode-fingerprints.json" ,
12021203 purl_type_configs = PurlTypeConfig .large_size_configs (),
12031204 data_schema_url = "" ,
12041205 documentation_url = "" ,
@@ -1207,7 +1208,7 @@ def cluster_preset():
12071208 DataCluster (
12081209 data_kind = "cyclonedx14_sboms" ,
12091210 description = "CycloneDX v1.4 sboms for each package version" ,
1210- datafile_path_template = "{namespace}/{name}/{version}/cyclonedx-14.json" ,
1211+ datafile_path_template = "{/ namespace}/{name}/{version}/cyclonedx-14.json" ,
12111212 purl_type_configs = PurlTypeConfig .large_size_configs (),
12121213 data_schema_url = "" ,
12131214 documentation_url = "" ,
@@ -1216,7 +1217,7 @@ def cluster_preset():
12161217 DataCluster (
12171218 data_kind = "cyclonedx15_sboms" ,
12181219 description = "CycloneDX v1.5 sboms for each package version" ,
1219- datafile_path_template = "{namespace}/{name}/{version}/cyclonedx-15.json" ,
1220+ datafile_path_template = "{/ namespace}/{name}/{version}/cyclonedx-15.json" ,
12201221 purl_type_configs = PurlTypeConfig .large_size_configs (),
12211222 data_schema_url = "" ,
12221223 documentation_url = "" ,
@@ -1225,7 +1226,7 @@ def cluster_preset():
12251226 DataCluster (
12261227 data_kind = "cyclonedx16_sboms" ,
12271228 description = "CycloneDX v1.6 sboms for each package version" ,
1228- datafile_path_template = "{namespace}/{name}/{version}/cyclonedx-16.json" ,
1229+ datafile_path_template = "{/ namespace}/{name}/{version}/cyclonedx-16.json" ,
12291230 purl_type_configs = PurlTypeConfig .large_size_configs (),
12301231 data_schema_url = "" ,
12311232 documentation_url = "" ,
@@ -1234,7 +1235,7 @@ def cluster_preset():
12341235 DataCluster (
12351236 data_kind = "spdx2_sboms" ,
12361237 description = "SPDX version 2.x sboms for each package version" ,
1237- datafile_path_template = "{namespace}/{name}/{version}/spdx-2.json" ,
1238+ datafile_path_template = "{/ namespace}/{name}/{version}/spdx-2.json" ,
12381239 purl_type_configs = PurlTypeConfig .large_size_configs (),
12391240 data_schema_url = "" ,
12401241 documentation_url = "" ,
@@ -1243,7 +1244,7 @@ def cluster_preset():
12431244 DataCluster (
12441245 data_kind = "atom_slices" ,
12451246 description = "Atom slices for each package version" ,
1246- datafile_path_template = "{namespace}/{name}/{version}/atom.json" ,
1247+ datafile_path_template = "{/ namespace}/{name}/{version}/atom.json" ,
12471248 purl_type_configs = PurlTypeConfig .large_size_configs (),
12481249 data_schema_url = "" ,
12491250 documentation_url = "" ,
@@ -1253,7 +1254,7 @@ def cluster_preset():
12531254 data_kind = "atom_vulnerable_slices" ,
12541255 description = "Atom vulnerable_slices for each vulnerable package version" ,
12551256 # FIXME: need to qualify these with an advisory / CVE?
1256- datafile_path_template = "{namespace}/{name}/{version}/atom-vulnerable.json" ,
1257+ datafile_path_template = "{/ namespace}/{name}/{version}/atom-vulnerable.json" ,
12571258 purl_type_configs = PurlTypeConfig .large_size_configs (),
12581259 data_schema_url = "" ,
12591260 documentation_url = "" ,
@@ -1263,7 +1264,7 @@ def cluster_preset():
12631264 data_kind = "openssf_security_scorecards" ,
12641265 description = "OpenSSf security_scorecards for package" ,
12651266 # FIXME: need to qualify these with an advisory / CVE?
1266- datafile_path_template = "{namespace}/{name}/security_scorecard.json" ,
1267+ datafile_path_template = "{/ namespace}/{name}/security_scorecard.json" ,
12671268 purl_type_configs = PurlTypeConfig .medium_size_configs (),
12681269 data_schema_url = "" ,
12691270 documentation_url = "" ,
0 commit comments