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

1from __future__ import annotations 

2 

3from typing import Any, ClassVar, Iterable, Optional, Type 

4from urllib.parse import urlsplit, urlunsplit 

5 

6import pydantic 

7from pydantic import RootModel 

8 

9from .validated_string import ValidatedString 

10 

11 

12class RootHttpUrl(ValidatedString): 

13 """A 'URL folder', possibly an invalid HTTP URL""" 

14 

15 root_model: ClassVar[Type[RootModel[Any]]] = RootModel[pydantic.HttpUrl] 

16 _validated: pydantic.HttpUrl 

17 

18 def absolute(self): 

19 """analog to `absolute` method of pathlib.""" 

20 return self 

21 

22 @property 

23 def scheme(self) -> str: 

24 return self._validated.scheme 

25 

26 @property 

27 def host(self) -> Optional[str]: 

28 return self._validated.host 

29 

30 @property 

31 def path(self) -> Optional[str]: 

32 return self._validated.path 

33 

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] 

46 

47 return RootHttpUrl( 

48 urlunsplit( 

49 ( 

50 parsed.scheme, 

51 parsed.netloc, 

52 "/".join(path), 

53 parsed.query, 

54 parsed.fragment, 

55 ) 

56 ) 

57 ) 

58 

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