11import json
2+ import re
23
34class USFGenerator :
45 def __init__ (self , version = 1 ):
@@ -23,6 +24,9 @@ def add_subject(self, name, simplified_name=None, teacher=None, room=None):
2324 teacher (str, optional): Teacher's name.
2425 room (str, optional): Classroom.
2526 """
27+ if name in self .subjects :
28+ raise ValueError (f"Subject '{ name } ' already exists." )
29+
2630 self .subjects [name ] = {
2731 "simplified_name" : simplified_name or name ,
2832 "teacher" : teacher or "" ,
@@ -40,6 +44,10 @@ def add_period(self, start_time, end_time):
4044 Returns:
4145 int: Index of the added period (1-based).
4246 """
47+ time_pattern = "^(?:[01]\\ d|2[0-3]):[0-5]\\ d:[0-5]\\ d$"
48+ if not re .match (time_pattern , start_time ) or not re .match (time_pattern , end_time ):
49+ raise ValueError (f"Invalid time format. Must be 'HH:MM:SS'." )
50+
4351 self .periods .append ([start_time , end_time ])
4452 return len (self .periods ) # Return 1-based index
4553
@@ -57,6 +65,9 @@ def add_schedule(self, day, week_type, subject, period_index):
5765 raise ValueError (f"Subject '{ subject } ' is not defined." )
5866 if period_index < 1 or period_index > len (self .periods ):
5967 raise ValueError (f"Invalid period index { period_index } ." )
68+ if week_type not in ["all" , "even" , "odd" ]:
69+ raise ValueError (f"Invalid week type '{ week_type } '. Must be 'all', 'even', or 'odd'." )
70+
6071 self .timetable .append ([day , week_type , subject , period_index ])
6172
6273 def generate (self ):
@@ -80,5 +91,8 @@ def save_to_file(self, filename):
8091 Args:
8192 filename (str): Output filename.
8293 """
83- with open (filename , "w" , encoding = "utf-8" ) as f :
84- json .dump (self .generate (), f , indent = 2 , ensure_ascii = False )
94+ try :
95+ with open (filename , "w" , encoding = "utf-8" ) as f :
96+ json .dump (self .generate (), f , indent = 2 , ensure_ascii = False )
97+ except Exception as e :
98+ raise IOError (f"Failed to save USF data to { filename } : { e } " )
0 commit comments