|
15 | 15 | class Doctype(BaseModel): |
16 | 16 | """A "doctype" that comprises of a product, docset, lifecycle, and language. |
17 | 17 |
|
18 | | - >>> Doctype.from_str("sles/15-SP6@supported/en-us,de-de") |
19 | | - Doctype(product=<Product.SLES: 'sles'>, docset=['15-SP6'], \ |
20 | | - lifecycle=<LifecycleFlag.SUPPORTED: 'supported'>, \ |
21 | | - langs=[LanguageCode(language='en-us'), LanguageCode(language='de-de')]) |
| 18 | + >>> doctype = Doctype.from_str("sles/15-SP6@supported/en-us,de-de") |
| 19 | + >>> doctype.product |
| 20 | + <Product.sles: 'sles'> |
| 21 | + >>> doctype.docset |
| 22 | + ['15-SP6'] |
| 23 | + >>> doctype.lifecycle.name |
| 24 | + 'supported' |
| 25 | + >>> doctype.langs |
| 26 | + [LanguageCode(language='de-de'), LanguageCode(language='en-us')] |
22 | 27 | """ |
23 | 28 |
|
24 | 29 | # __init__.__doc__ = """Create a new Doctype instance. |
@@ -222,3 +227,46 @@ def from_str(cls, doctype_str: str) -> Self: |
222 | 227 | lifecycle=lifecycle, |
223 | 228 | langs=langs, |
224 | 229 | ) |
| 230 | + |
| 231 | + def xpath(self) -> str: |
| 232 | + """Return an XPath expression for this Doctype to find all deliverables. |
| 233 | +
|
| 234 | + >>> result = Doctype.from_str("sles/15-SP6@supported/en-us,de-de").xpath() |
| 235 | + >>> expected = ( |
| 236 | + ... "product[@productid='sles']/docset[@setid='15-SP6']" |
| 237 | + ... "[@lifecycle='supported']" |
| 238 | + ... "/builddocs/language[@lang='de-de' or @lang='en-us']" |
| 239 | + ... ) |
| 240 | + >>> result == expected |
| 241 | + True |
| 242 | +
|
| 243 | + :return: A relative XPath expression that can be used to find all |
| 244 | + deliverables that match this Doctype. |
| 245 | + """ |
| 246 | + # Example: /sles/15-SP6@supported/en-us,de-de |
| 247 | + product = f"product[@productid={self.product.value!r}]" |
| 248 | + setids = [f'@setid={d!r}' for d in self.docset if d != '*'] |
| 249 | + |
| 250 | + setids_str = ' or '.join(setids) |
| 251 | + if setids_str: |
| 252 | + docset = f"docset[{setids_str}]" |
| 253 | + else: |
| 254 | + docset = 'docset' |
| 255 | + |
| 256 | + lifecycle = ' or '.join( |
| 257 | + [f'@lifecycle={lc.name!r}' |
| 258 | + for lc in self.lifecycle |
| 259 | + if lc != LifecycleFlag.UNKNOWN ] |
| 260 | + ) |
| 261 | + if lifecycle: |
| 262 | + docset += f"[{lifecycle}]" |
| 263 | + |
| 264 | + if '*' in self.langs: |
| 265 | + language = 'language' |
| 266 | + else: |
| 267 | + language = ' or '.join( |
| 268 | + [f"@lang={lang.language!r}" for lang in self.langs] |
| 269 | + ) |
| 270 | + language = f"language[{language}]" |
| 271 | + |
| 272 | + return f'{product}/{docset}/builddocs/{language}' |
0 commit comments