2
2
import json
3
3
import os
4
4
import sys
5
+ import shutil
5
6
from collections import defaultdict , namedtuple
6
7
from datetime import date , datetime
7
8
@@ -19,10 +20,11 @@ def years_from_school_year(school_year):
19
20
start_year = int (school_year .split ("_" )[0 ])
20
21
return (start_year , start_year + 1 )
21
22
22
-
23
+ logos = [ "icon" , "icon-darkmode" , "small-icon" , "small-icon-darkmode" ]
23
24
ErrorData = namedtuple ("ErrorData" , ["file" , "message" ])
24
25
ERRORS = []
25
26
OUTPUT = defaultdict (lambda : [])
27
+ OUTPUT_ORGANIZERS = {}
26
28
ROOT = os .path .dirname (os .path .abspath (__file__ ))
27
29
28
30
parser = argparse .ArgumentParser ()
@@ -35,8 +37,32 @@ def years_from_school_year(school_year):
35
37
with open (os .path .join (ROOT , "schemas" , "event.schema.json" )) as f :
36
38
validate_event = fastjsonschema .compile (json .load (f ))
37
39
38
- with open (os .path .join (ROOT , "build" , "organizers.json" )) as f :
39
- organizers = json .load (f )
40
+ with open (os .path .join (ROOT , "schemas" , "organizer.schema.json" )) as f :
41
+ validate_organizer = fastjsonschema .compile (json .load (f ))
42
+
43
+ print ("validating orgnanizers" )
44
+
45
+ for directory in os .walk (os .path .join (ROOT , "organizers" )):
46
+ for file in directory [2 ]:
47
+ name , ext = os .path .splitext (file )
48
+ if ext .lower () not in [".yaml" , ".yml" ]:
49
+ continue
50
+ path = os .path .join (directory [0 ], file )
51
+
52
+ with open (path ) as f :
53
+ organizer_data = yaml .safe_load (f )
54
+ try :
55
+ organizer_data = validate_organizer (organizer_data )
56
+ for logo in logos :
57
+ if logo in organizer_data and not os .path .exists (os .path .join (ROOT , "organizers" , organizer_data [logo ])):
58
+ raise JsonSchemaValueException ("Invalid path to %s, %s" % (logo , organizer_data [logo ]))
59
+ OUTPUT_ORGANIZERS [name ] = organizer_data
60
+ print ("." , end = "" , flush = True )
61
+ except JsonSchemaException as e :
62
+ ERRORS .append (ErrorData (path , e .message ))
63
+ print ("F" , end = "" , flush = True )
64
+
65
+ print ("\n Validating events" )
40
66
41
67
for directory in os .walk (os .path .join (ROOT , "data" )):
42
68
for file in directory [2 ]:
@@ -50,7 +76,7 @@ def years_from_school_year(school_year):
50
76
try :
51
77
event_data = validate_event (event_data )
52
78
for organizer in event_data ["organizers" ]:
53
- if organizer not in organizers :
79
+ if organizer not in OUTPUT_ORGANIZERS :
54
80
raise JsonSchemaValueException ("Organizer %s is not in organizers." % (organizer ))
55
81
if not args .dry :
56
82
event_date = datetime .strptime (
@@ -71,6 +97,17 @@ def years_from_school_year(school_year):
71
97
72
98
if not args .dry :
73
99
os .makedirs (os .path .join (ROOT , "build" ), exist_ok = True )
100
+ print ("Writing output for organizers." )
101
+
102
+ for reference , organizer in OUTPUT .items ():
103
+ for logo in logos :
104
+ if logo in organizer_data :
105
+ os .makedirs (os .path .dirname (os .path .join (ROOT , "build" , organizer_data [logo ])), exist_ok = True )
106
+ shutil .copy (os .path .join (ROOT , "organizers" , organizer_data [logo ]), os .path .join (ROOT , "build" , organizer_data [logo ]))
107
+
108
+ with open (os .path .join (ROOT , "build/organizers.json" ), "w" ) as f :
109
+ json .dump (OUTPUT , f )
110
+
74
111
for year , events in OUTPUT .items ():
75
112
print ("Writing output for year %s." % (year ))
76
113
0 commit comments