@@ -34,18 +34,21 @@ def check_unknown_keys(yaml_data: dict[str, Any], sub_key: Optional[str] = None)
34
34
35
35
36
36
class Person :
37
- def __init__ (self , name : str ):
38
- match = re .match ("(.*)<(.*)>" , name )
39
- self .name : str = (match [1 ] if match else name ).strip ()
40
- self .email : Optional [str ] = match [2 ].strip () if match else None
37
+ def __init__ (self , yaml_data : str | dict [str , Any ]):
38
+ if isinstance (yaml_data , dict ):
39
+ self .name : str = parse_setting (yaml_data , "name" , "" )
40
+ self .email : Optional [str ] = parse_optional_setting (yaml_data , "email" , str )
41
+ self .kattis : Optional [str ] = parse_optional_setting (yaml_data , "kattis" , str )
42
+ self .orcid : Optional [str ] = parse_optional_setting (yaml_data , "orcid" , str )
43
+ else :
44
+ match = re .match ("(.*)<(.*)>" , yaml_data )
45
+ self .name = (match [1 ] if match else yaml_data ).strip ()
46
+ self .email = match [2 ].strip () if match else None
47
+ self .kattis = self .orcid = None
41
48
42
49
43
50
class ProblemCredits :
44
- def __init__ (
45
- self ,
46
- yaml_data : dict [str , Any ],
47
- problem_settings : "ProblemSettings" ,
48
- ):
51
+ def __init__ (self , yaml_data : dict [str , Any ]):
49
52
self .authors : list [Person ] = []
50
53
self .contributors : list [Person ] = []
51
54
self .testers : list [Person ] = []
@@ -61,23 +64,36 @@ def __init__(
61
64
return
62
65
63
66
credits = parse_setting (yaml_data , "credits" , dict [str , Any ]())
64
- self .authors = [Person (s ) for s in parse_optional_list_setting (credits , "authors" , str )]
65
- self .contributors = [
66
- Person (s ) for s in parse_optional_list_setting (credits , "contributors" , str )
67
- ]
67
+ self .authors = self .parse_optional_list_persons (credits , "authors" )
68
+ self .contributors = self .parse_optional_list_persons (credits , "contributors" )
68
69
self .translators = parse_setting (credits , "translators" , {})
69
70
for lang in list (self .translators .keys ()):
70
- self .translators [lang ] = [
71
- Person (s ) for s in parse_optional_list_setting (self .translators , lang , str )
72
- ]
73
- self .testers = [Person (s ) for s in parse_optional_list_setting (credits , "testers" , str )]
74
- self .packagers = [Person (s ) for s in parse_optional_list_setting (credits , "packagers" , str )]
75
- self .acknowledgements = [
76
- Person (s ) for s in parse_optional_list_setting (credits , "acknowledgements" , str )
77
- ]
71
+ self .translators [lang ] = self .parse_optional_list_persons (self .translators , lang )
72
+ self .testers = self .parse_optional_list_persons (credits , "testers" )
73
+ self .packagers = self .parse_optional_list_persons (credits , "packagers" )
74
+ self .acknowledgements = self .parse_optional_list_persons (credits , "acknowledgements" )
78
75
79
76
check_unknown_keys (credits , "credits" )
80
77
78
+ # Based on parse_optional_list_setting: the type checker does not like type unions like `str | dict`.
79
+ @staticmethod
80
+ def parse_optional_list_persons (yaml_data : dict [str , Any ], key : str ) -> list [Person ]:
81
+ if key in yaml_data :
82
+ value = yaml_data .pop (key )
83
+ if isinstance (value , str | dict ):
84
+ return [Person (value )]
85
+ if isinstance (value , list ):
86
+ if not all (isinstance (v , str | dict ) for v in value ):
87
+ warn (
88
+ f"some values for key '{ key } ' in problem.yaml do not have type str or dict. SKIPPED."
89
+ )
90
+ return []
91
+ if not value :
92
+ warn (f"value for '{ key } ' in problem.yaml should not be an empty list." )
93
+ return list (map (Person , value ))
94
+ warn (f"incompatible value for key '{ key } ' in problem.yaml. SKIPPED." )
95
+ return []
96
+
81
97
82
98
class ProblemSource :
83
99
def __init__ (self , name : str , url : Optional [str ] = None ):
@@ -253,7 +269,7 @@ def __init__(
253
269
self .name [lang ] = parse_setting (self .name , lang , "" )
254
270
self .uuid : str = parse_setting (yaml_data , "uuid" , "" )
255
271
self .version : str = parse_setting (yaml_data , "version" , "" )
256
- self .credits : ProblemCredits = ProblemCredits (yaml_data , self )
272
+ self .credits : ProblemCredits = ProblemCredits (yaml_data )
257
273
self .source : ProblemSources = ProblemSources (yaml_data )
258
274
self .license : str = parse_setting (yaml_data , "license" , "unknown" )
259
275
self .rights_owner : Optional [str ] = parse_optional_setting (yaml_data , "rights_owner" , str )
@@ -271,7 +287,7 @@ def __init__(
271
287
)
272
288
273
289
self .keywords : list [str ] = parse_optional_list_setting (yaml_data , "keywords" , str )
274
- # Not implemented in BAPCtools. We always test all languges in langauges .yaml.
290
+ # Not implemented in BAPCtools. We always test all languages in languages .yaml.
275
291
self .languages : list [str ] = parse_optional_list_setting (yaml_data , "languages" , str )
276
292
# Not implemented in BAPCtools
277
293
self .allow_file_writing : bool = parse_setting (yaml_data , "allow_file_writing" , False )
0 commit comments