Coverage for gws-app/gws/lib/metadata/core.py: 0%

56 statements  

« prev     ^ index     » next       coverage.py v7.8.0, created at 2025-04-17 01:37 +0200

1import gws 

2import gws.lib.intl 

3 

4from . import inspire 

5 

6 

7class Props(gws.Props): 

8 abstract: str 

9 attribution: str 

10 dateCreated: str 

11 dateUpdated: str 

12 keywords: list[str] 

13 language: str 

14 title: str 

15 

16 

17def from_dict(d: dict) -> gws.Metadata: 

18 return check(gws.Metadata(d)) 

19 

20 

21def from_args(**kwargs) -> gws.Metadata: 

22 return from_dict(kwargs) 

23 

24 

25def from_config(c: gws.Config) -> gws.Metadata: 

26 return check(gws.Metadata(gws.u.to_dict(c))) 

27 

28 

29def from_props(p: gws.Props) -> gws.Metadata: 

30 return check(gws.Metadata(gws.u.to_dict(p))) 

31 

32 

33def props(md: gws.Metadata) -> gws.Props: 

34 return gws.Props( 

35 abstract=md.abstract or '', 

36 attribution=md.attribution.title if md.attribution else '', 

37 dateCreated=md.dateCreated, 

38 dateUpdated=md.dateUpdated, 

39 keywords=md.keywords or [], 

40 language=md.language or '', 

41 title=md.title or '', 

42 ) 

43 

44 

45_LIST_KEYS = [ 

46 p 

47 for p, typ in gws.Metadata.__annotations__.items() 

48 if 'list' in repr(typ).lower() 

49] 

50 

51 

52def set_value(md: gws.Metadata, key: str, val) -> gws.Metadata: 

53 setattr(md, key, val) 

54 return check(md) 

55 

56 

57def set_default(md: gws.Metadata, key: str, val) -> gws.Metadata: 

58 if hasattr(md, key): 

59 return md 

60 setattr(md, key, val) 

61 return check(md) 

62 

63 

64def check(md: gws.Metadata) -> gws.Metadata: 

65 for key in _LIST_KEYS: 

66 val = md.get(key) or [] 

67 if not isinstance(val, list): 

68 val = [val] 

69 setattr(md, key, val) 

70 

71 p = md.language 

72 if p: 

73 md.language3 = gws.lib.intl.locale(p).language3 

74 

75 p = md.inspireTheme 

76 if p: 

77 md.inspireThemeName = inspire.theme_name(p, md.language) 

78 md.inspireThemeNameEn = inspire.theme_name(p, 'en') 

79 

80 return md 

81 

82 

83def merge(*mds, extend_lists=False) -> gws.Metadata: 

84 d = {} 

85 

86 for md in mds: 

87 if not md: 

88 continue 

89 for key, val in gws.u.to_dict(md).items(): 

90 if gws.u.is_empty(val): 

91 continue 

92 if extend_lists and key in _LIST_KEYS: 

93 val = d.get(key, []) + val 

94 d[key] = val 

95 

96 return from_dict(d)