Coverage for bioimageio/spec/_internal/root_url.py: 82%
34 statements
« prev ^ index » next coverage.py v7.8.0, created at 2025-04-02 14:21 +0000
« prev ^ index » next coverage.py v7.8.0, created at 2025-04-02 14:21 +0000
1from __future__ import annotations
3from typing import Any, ClassVar, Iterable, Optional, Type
4from urllib.parse import urlsplit, urlunsplit
6import pydantic
7from pydantic import RootModel
9from .validated_string import ValidatedString
12class RootHttpUrl(ValidatedString):
13 """A 'URL folder', possibly an invalid HTTP URL"""
15 root_model: ClassVar[Type[RootModel[Any]]] = RootModel[pydantic.HttpUrl]
16 _validated: pydantic.HttpUrl
18 def absolute(self):
19 """analog to `absolute` method of pathlib."""
20 return self
22 @property
23 def scheme(self) -> str:
24 return self._validated.scheme
26 @property
27 def host(self) -> Optional[str]:
28 return self._validated.host
30 @property
31 def path(self) -> Optional[str]:
32 return self._validated.path
34 @property
35 def parent(self) -> RootHttpUrl:
36 parsed = urlsplit(str(self))
37 path = list(parsed.path.split("/"))
38 if (
39 parsed.netloc == "zenodo.org"
40 and parsed.path.startswith("/api/records/")
41 and parsed.path.endswith("/content")
42 ):
43 path[-2:-1] = []
44 else:
45 path = path[:-1]
47 return RootHttpUrl(
48 urlunsplit(
49 (
50 parsed.scheme,
51 parsed.netloc,
52 "/".join(path),
53 parsed.query,
54 parsed.fragment,
55 )
56 )
57 )
59 @property
60 def parents(self) -> Iterable[RootHttpUrl]:
61 """iterate over all URL parents (max 100)"""
62 current = self
63 for _ in range(100):
64 current = current.parent
65 yield current