@@ -92,7 +92,7 @@ def process_conference_deadlines(
9292) -> list [dict ]:
9393 """Process conferences and extract upcoming deadlines."""
9494 results = []
95-
95+
9696 for conf in conferences :
9797 base_info = {
9898 "title" : conf .title ,
@@ -101,15 +101,15 @@ def process_conference_deadlines(
101101 "rank" : conf .rank .ccf ,
102102 "dblp" : conf .dblp ,
103103 }
104-
104+
105105 for conf_year in conf .confs :
106106 time_obj = None
107-
107+
108108 for timeline in conf_year .timeline :
109109 deadline_str = timeline .deadline
110110 if not deadline_str or deadline_str == "TBD" :
111111 continue
112-
112+
113113 try :
114114 cur_d = parse_datetime_with_tz (deadline_str , conf_year .timezone )
115115 if cur_d < now :
@@ -118,7 +118,7 @@ def process_conference_deadlines(
118118 time_obj = cur_d
119119 except ValueError :
120120 continue
121-
121+
122122 if time_obj is not None and time_obj > now :
123123 category = get_category_by_sub (conf .sub )
124124 result = {
@@ -135,7 +135,7 @@ def process_conference_deadlines(
135135 "subname_en" : category .name_en if category else conf .sub ,
136136 }
137137 results .append (result )
138-
138+
139139 results .sort (key = lambda x : x ["deadline" ])
140140 return results
141141
@@ -148,11 +148,11 @@ def filter_results(
148148) -> list [dict ]:
149149 """Apply filters to results."""
150150 filtered = []
151-
151+
152152 conf_filter_lower = [f .lower () for f in conf_filter ] if conf_filter else None
153153 sub_filter_lower = [f .lower () for f in sub_filter ] if sub_filter else None
154154 rank_filter_lower = [f .lower () for f in rank_filter ] if rank_filter else None
155-
155+
156156 for item in results :
157157 if conf_filter_lower :
158158 id_alpha = extract_alpha_id (item ["id" ])
@@ -164,15 +164,15 @@ def filter_results(
164164 if rank_filter_lower and item ["rank" ].lower () not in rank_filter_lower :
165165 continue
166166 filtered .append (item )
167-
167+
168168 return filtered
169169
170170
171171def format_colored_duration (ddl_time : datetime , now : datetime ) -> str :
172172 """Format duration with color coding."""
173173 duration_str = format_duration (ddl_time , now )
174174 days = (ddl_time - now ).days
175-
175+
176176 if days < 1 :
177177 return colored (duration_str , "red" )
178178 elif days < 30 :
@@ -186,7 +186,7 @@ def format_colored_duration(ddl_time: datetime, now: datetime) -> str:
186186def output_table (results : list [dict ], now : datetime ) -> None :
187187 """Output results as a formatted table."""
188188 table = [["Title" , "Sub" , "Rank" , "DDL" , "Link" ]]
189-
189+
190190 for item in results :
191191 table .append ([
192192 f"{ item ['title' ]} { item ['year' ]} " ,
@@ -195,7 +195,7 @@ def output_table(results: list[dict], now: datetime) -> None:
195195 format_colored_duration (item ["deadline" ], now ),
196196 item ["link" ],
197197 ])
198-
198+
199199 print (tabulate (table , headers = "firstrow" , tablefmt = "fancy_grid" ))
200200
201201
@@ -234,27 +234,27 @@ def list_categories() -> None:
234234def main () -> None :
235235 """Main entry point."""
236236 args = parse_args ()
237-
237+
238238 if args .list_categories :
239239 list_categories ()
240240 return
241-
241+
242242 now = datetime .now (tz = timezone .utc )
243243 conferences = fetch_conferences (args .url )
244244 results = process_conference_deadlines (conferences , now )
245-
245+
246246 filtered = filter_results (
247247 results ,
248248 args .conf ,
249249 args .sub ,
250250 args .rank ,
251251 )
252-
252+
253253 if args .json :
254254 output_json (filtered )
255255 else :
256256 output_table (filtered , now )
257257
258258
259259if __name__ == "__main__" :
260- main ()
260+ main ()
0 commit comments