File indexing completed on 2026-09-01 09:34:30
0001 from dataclasses import dataclass
0002
0003
0004 @dataclass(frozen=True)
0005 class DatasetDID:
0006 scope: str
0007 name: str
0008
0009 @classmethod
0010 def parse(cls, value: str) -> "DatasetDID":
0011 if ":" not in value:
0012 raise ValueError(f"dataset DID must be scope:name, got {value!r}")
0013 scope, name = value.split(":", 1)
0014 if not scope or not name:
0015 raise ValueError(f"invalid dataset DID {value!r}")
0016 return cls(scope=scope, name=name)
0017
0018 def site_dataset(self, site_name: str, template: str | None = None) -> "DatasetDID":
0019 if not template:
0020 return DatasetDID(scope=self.scope, name=f"{self.name}.{site_name}")
0021 return DatasetDID(
0022 scope=self.scope,
0023 name=template.format(
0024 run_dataset_name=self.name,
0025 run_number=self.run_number,
0026 site_name=site_name,
0027 site=site_name,
0028 ),
0029 )
0030
0031 @property
0032 def run_number(self) -> str:
0033 parts = self.name.split(".")
0034 if len(parts) >= 3 and parts[0] == "swf" and parts[-1] == "run":
0035 return parts[1]
0036 raise ValueError(f"cannot derive run number from dataset {self.name!r}")
0037
0038 def __str__(self) -> str:
0039 return f"{self.scope}:{self.name}"