summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--infos.yaml104
-rw-r--r--infos2.yaml28
-rwxr-xr-xmain.py307
-rwxr-xr-xmain2.py146
4 files changed, 162 insertions, 423 deletions
diff --git a/infos.yaml b/infos.yaml
index 678e543..a7994c2 100644
--- a/infos.yaml
+++ b/infos.yaml
@@ -3,84 +3,45 @@ course: "Parallel Programming"
semester:
start: "11/08/2025"
end: "15/12/2025"
- lectures:
- slots:
+ slots:
+ lecture:
friday:
start: "12:15"
end: "14:00"
-# room: "A20"
wednesday:
start: "09:15"
end: "10:00"
- colloquiums:
- slots:
- monday:
- start: "09:10"
- end: "10:08"
- wednesday:
- start: "09:15"
- end: "10:00"
-
-output:
- date_format: "%b %d"
- time_format: "%H:%M"
- format: "text" # Or html/json/csv/latex/mediawiki
- week_drift: 0 # Add constant offset to week numbers
- tables:
- calendar:
- hidden: no
- show_events: yes
- show_time: yes
- show_room: no
- show_lecturers: yes
- show_assignments: yes
- show_dates: yes
- show_weeks: yes
- semester_dates_as_events: no # Display semester start/end in events
- defrag: yes # Skip empty rows
- text_wrap: 15 # Adjust to your needs
- min_col_width: 12 # Adjust as your needs
- week_line_skip: 1 # Number of line to skip between weeks
- labels:
- events: "Others"
- lectures: "Lectures"
- assignments: "Assignments"
- dates: "Dates"
- weeks: "Week {}"
- rooms: "Room: {}"
- deadlines:
- hidden: no
- msg_handout: "Mandatory assignment {} handout"
- msg_deadline: "Mandatory assignment {} deadline"
- lectures:
- hidden: no
- show_rooms: no
colloquiums:
- hidden: no
- show_rooms: yes
-
+ monday:
+ start: "14:15"
+ end: "16:00"
+ friday:
+ start: "14:15"
+ end: "16:00"
events:
- 1:
- name: "Deadline student list"
- date: "19/11/2025"
- hidden: yes
- 2:
+ # test:
+ # type: "lecture"
+ # name: "My event name"
+ # date: "19/11/2025"
+ # hidden: no
+ # repeat:
+ # every: 7
+ # until: "26/11/2025"
+ # who: "loic"
+ # start: "10:00"
+ # end: "11:00"
+ # room: "A232"
+ exam:
+ type: "none"
name: "Exam"
date: "03/12/2025"
+ student_list:
+ type: "none"
+ name: "Deadline student list"
+ date: "19/11/2025"
-assignments:
- 1:
- start: "01/09/2025"
- end: "17/09/2025"
- 2:
- start: "15/09/2025"
- end: "08/10/2025"
- 3:
- start: "06/10/2025"
- end: "29/10/2025"
-
-lectures:
1:
+ type: "lecture"
name: "Introduction"
date: "13/08/2025"
who: "Loïc"
@@ -88,48 +49,59 @@ lectures:
# start: "09:00"
# end: "09:00"
2:
+ type: "lecture"
name: "Parallel software and hardware"
date: "22/08/2025"
who: "Loïc"
slot:
room: "BB"
3:
+ type: "lecture"
name: "MPI"
date: "29/08/2025"
who: "Loïc"
4:
+ type: "lecture"
name: "PThread"
date: "05/09/2025"
who: "Loïc"
5:
+ type: "lecture"
name: "OpenMP"
date: "12/09/2025"
who: "Loïc"
6:
+ type: "lecture"
name: "Concurrency"
date: "19/09/2025"
who: "Loïc"
7:
+ type: "lecture"
name: "CUDA Intro"
date: "26/09/2025"
who: "Loïc"
8:
+ type: "lecture"
name: "CUDA Optim"
date: "03/10/2025"
who: "Loïc"
9:
+ type: "lecture"
name: "CPU vs GPU"
date: "10/10/2025"
who: "Loïc"
10:
+ type: "lecture"
name: "Simplify Parallelism"
date: "17/10/2025"
who: "Loïc"
11:
+ type: "lecture"
name: "Exam Wrap-up"
date: "12/11/2025"
who: "Loïc"
12:
+ type: "lecture"
name: "Guest Lecture"
date: "07/11/2025"
who: "Loïc"
diff --git a/infos2.yaml b/infos2.yaml
deleted file mode 100644
index 3e0dc3d..0000000
--- a/infos2.yaml
+++ /dev/null
@@ -1,28 +0,0 @@
-course: "Parallel Programming"
-
-semester:
- start: "11/08/2025"
- end: "15/12/2025"
- slots:
- lecture:
- friday:
- start: "12:15"
- end: "14:00"
- # room: "A20"
- wednesday:
- start: "09:15"
- end: "10:00"
- room: "A67"
-events:
- test:
- type: "lecture"
- name: "My event name"
- date: "19/11/2025"
- hidden: no
- repeat:
- every: 7
- until: "26/11/2025"
- who: "loic"
- start: "10:00"
- end: "11:00"
-# room: "A232"
diff --git a/main.py b/main.py
index 460b174..5287a45 100755
--- a/main.py
+++ b/main.py
@@ -5,203 +5,144 @@ from prettytable import PrettyTable
from datetime import datetime, timedelta
with open("infos.yaml", "r") as f:
- i=yaml.safe_load(f)
+ _i=yaml.safe_load(f)
-def parse_date(d):
- return datetime.strptime(d, "%d/%m/%Y")
+#### Parsing
+def parse_date(s):
+ return datetime.strptime(s, "%d/%m/%Y")
+def parse_time(s):
+ return datetime.strptime(s, "%H:%M")
+#### Dates
def getmonday(d):
return d - timedelta(days=d.weekday())
def getnextmonday(d):
return getmonday(d)+timedelta(days=7)
def getnextdayn(d,n):
return (d+timedelta(days=n))
-def formatday(d):
- return d.strftime(i["output"]["date_format"])
def getweek(d):
- return d.isocalendar().week + i["output"]["week_drift"]
-def getgloballectureslot(d):
- dname=d.strftime("%A").lower()
- slots=i["semester"]["lectures"]["slots"]
- if dname in slots.keys():
- start,end, room=(None,None,None)
- if "start" in slots[dname].keys():
- start=datetime.strptime(i["semester"]["lectures"]["slots"][dname]["start"], "%H:%M")
- end=datetime.strptime(i["semester"]["lectures"]["slots"][dname]["end"], "%H:%M")
- room=slots[dname]["room"] if "room" in slots[dname].keys() else None
- return (start,end, room)
- return None
-def getglobalcolloquiumsslot(d):
- dname=d.strftime("%A").lower()
- slots=i["semester"]["colloquiums"]["slots"]
- if dname in slots.keys():
- start,end, room=(None,None,None)
- if "start" in slots[dname].keys():
- start=datetime.strptime(i["semester"]["colloquiums"]["slots"][dname]["start"], "%H:%M")
- end=datetime.strptime(i["semester"]["colloquiums"]["slots"][dname]["end"], "%H:%M")
- room=slots[dname]["room"] if "room" in slots[dname].keys() else None
- return (start,end, room)
- return None
-def getassign(d):
- val=""
- for a in i["assignments"]:
- start=parse_date(i["assignments"][a]["start"])
- end=parse_date(i["assignments"][a]["end"])
- if d>=start and d<=end:
- if len(val)>0:
- val+="/"
- val+=str(a)
- return val
-def getlecture(d):
- slot=getgloballectureslot(d)
- for l in i["lectures"]:
- date=parse_date(i["lectures"][l]["date"])
- if d==date:
- # Time
- startT, endT, room = (None, None, None)
- if slot is not None:
- startT, endT, room=slot
- if "slot" in i["lectures"][l]:
- if "start" in i["lectures"][l]["slot"].keys():
- startT=datetime.strptime(i["lectures"][l]["slot"]["start"], "%H:%M")
- endT=datetime.strptime(i["lectures"][l]["slot"]["end"], "%H:%M")
- room=i["lectures"][l]["slot"]["room"] if "room" in i["lectures"][l]["slot"].keys() else None
- # Content
- text=textwrap.fill(i["lectures"][l]["name"],o["text_wrap"])
- if o["show_lecturers"]:
- text+="\n"+textwrap.fill("("+i["lectures"][l]["who"]+")",o["text_wrap"])
- if o["show_room"] and room is not None:
- text=textwrap.fill(o["labels"]["rooms"].format(room),o["text_wrap"])+"\n"+text
- if o["show_time"] and (startT,endT) != (None, None):
- timeT=textwrap.fill(startT.strftime(i["output"]["time_format"])+"-"+endT.strftime(i["output"]["time_format"]),o["text_wrap"])
- text=timeT+"\n"+text
- return text
- return ""
-def getevents(d):
- val=""
- for e in i["events"]:
- date=parse_date(i["events"][e]["date"])
- if "hidden" in i["events"][e] and i["events"][e]["hidden"]:
- continue
- if d==date:
- if len(val)>0:
- val+=","
- val+=str(i["events"][e]["name"])
- return textwrap.fill(val,o["text_wrap"])
-def add_row(t,row):
- if not o["defrag"] or any(len(x) > 0 for x in row[1:]):
- t.add_row(row,divider=True)
- return 1
- return 0
-
-if not i["output"]["tables"]["calendar"]["hidden"]:
- sstart=parse_date(i["semester"]["start"])
- send=parse_date(i["semester"]["end"])
- d=sstart
- w=getweek(d)
- o=i["output"]["tables"]["calendar"]
- if o["semester_dates_as_events"]:
- i["events"]["sstart_098888986"]={} # Add random numbers to avoid clash with users entries
- i["events"]["sstart_098888986"]["name"]="Semester starts"
- i["events"]["sstart_098888986"]["date"]=i["semester"]["start"]
- i["events"]["send_098888986"]={}
- i["events"]["send_098888986"]["name"]="Semester ends"
- i["events"]["send_098888986"]["date"]=i["semester"]["end"]
- while d <= send:
- t = PrettyTable(min_width=o["min_col_width"])
- week=o["labels"]["weeks"].format(w) if o["show_weeks"] else ""
- t.field_names = [week, "Monday", "Tuesday", "Wednesday", "Thursday", "Friday"]
- t.align[week]="l"
- rcount=0
- if o["show_dates"]:
- add_row(t,[o["labels"]["dates"],
- formatday(getnextdayn(d, 0)),
- formatday(getnextdayn(d, 1)),
- formatday(getnextdayn(d, 2)),
- formatday(getnextdayn(d, 3)),
- formatday(getnextdayn(d, 4))])
- if o["show_assignments"]:
- rcount+=add_row(t,[o["labels"]["assignments"],
- getassign(getnextdayn(d, 0)),
- getassign(getnextdayn(d, 1)),
- getassign(getnextdayn(d, 2)),
- getassign(getnextdayn(d, 3)),
- getassign(getnextdayn(d, 4))])
- rcount+=add_row(t,[o["labels"]["lectures"],
- getlecture(getnextdayn(d, 0)),
- getlecture(getnextdayn(d, 1)),
- getlecture(getnextdayn(d, 2)),
- getlecture(getnextdayn(d, 3)),
- getlecture(getnextdayn(d, 4))])
- if o["show_events"]:
- rcount+=add_row(t,[o["labels"]["events"],
- getevents(getnextdayn(d, 0)),
- getevents(getnextdayn(d, 1)),
- getevents(getnextdayn(d, 2)),
- getevents(getnextdayn(d, 3)),
- getevents(getnextdayn(d, 4))])
- print(t.get_formatted_string(i["output"]["format"]))
- for j in range(0,o["week_line_skip"]):
- print("")
- d=getnextmonday(d)
- w+=1
+ return d.isocalendar().week
+def getdayname(d):
+ return d.strftime("%A").lower()
+#### Formatting
+def gettime(d):
+ return d.strftime("%H:%M")
+def matchrepeat(d,e):
+ _r=events[e]["repeat"]
+ if _r["every"] <= 0:
+ return False
+ delta=timedelta(days=_r["every"])
+ current=events[e]["date"]
+ while current.date() <= sem["end"].date():
+ if _r["until"] is not None and _r["until"].date()<current.date():
+ break
+ if current.date() == d.date():
+ return True
+ current+=delta
+ continue
+ return False
+def formatevents(d):
+ output=""
+ for e in events:
+ _e=events[e]
+ if (not _e["hidden"]) and (_e["date"].date() == d.date() or matchrepeat(d, e)):
+ if _e["start"] is not None:
+ output+=gettime(_e["start"])+"-"+gettime(_e["end"])+"\n"
+ if _e["room"] is not None:
+ output+="Room: "+_e["room"]+"\n"
+ output+=_e["name"]
+ if _e["who"] is not None:
+ output+="\n("+_e["who"]+")"
+ return output
+def formatday(d):
+ return d.strftime("%b %d")
-if not i["output"]["tables"]["deadlines"]["hidden"]:
- # Count weeks
- days={}
- for a in i["assignments"]:
- start=parse_date(i["assignments"][a]["start"])
- end=parse_date(i["assignments"][a]["end"])
- if start not in days.keys():
- days[start]=list()
- if end not in days.keys():
- days[end]=list()
- days[start].append((a,"start"))
- days[end].append((a,"end"))
- # Build table
- t = PrettyTable()
- t.field_names = ["Week", "Date", "Assignment"]
- for d in sorted(days.keys()):
- for (a,b) in days[d]:
- if b=="start":
- msg=i["output"]["tables"]["deadlines"]["msg_handout"].format(a)
- else:
- msg=i["output"]["tables"]["deadlines"]["msg_deadline"].format(a)
- t.add_row([getweek(d),formatday(d),msg])
- t.align["Assignment"] = "l"
- print(t.get_formatted_string(i["output"]["format"]))
+#### Load semester
+sem={
+ "start": parse_date(_i["semester"]["start"]),
+ "end": parse_date(_i["semester"]["end"]),
+ "slots": {}
+}
+for e in _i["semester"]["slots"]:
+ _e=_i["semester"]["slots"][e]
+ sem["slots"][e]={}
+ for dayname in ["monday","tuesday","wednesday","thursday","friday"]:
+ sem["slots"][e][dayname]={
+ "start": None,
+ "end": None,
+ "room": None
+ }
+ if dayname in _e.keys():
+ if "start" in _e[dayname].keys():
+ sem["slots"][e][dayname]["start"]=parse_time(_e[dayname]["start"])
+ sem["slots"][e][dayname]["end"]=parse_time(_e[dayname]["end"])
+ if "room" in _e[dayname].keys():
+ sem["slots"][e][dayname]["room"]=_e[dayname]["room"]
+#### Load events
+events={}
+for e in _i["events"]:
+ _e=_i["events"][e]
+ events[e]={
+ "type": _e["type"],
+ "name": _e["name"],
+ "date": parse_date(_e["date"]),
+ "repeat": {
+ "every": 0,
+ "until": None
+ }
+ }
+ events[e]["hidden"]=_e["hidden"] if "hidden" in _e.keys() else False
+ events[e]["who"]=_e["who"] if "who" in _e.keys() else None
+ events[e]["start"]=parse_time(_e["start"]) if "start" in _e.keys() else None
+ events[e]["end"]=parse_time(_e["end"]) if "end" in _e.keys() else None
+ events[e]["room"]=_e["room"] if "room" in _e.keys() else None
+ if "repeat" in _e.keys():
+ events[e]["repeat"]["every"]=_e["repeat"]["every"]
+ events[e]["repeat"]["until"]=parse_date(_e["repeat"]["until"]) if "until" in _e["repeat"].keys() else None
+ if _e["type"] in sem["slots"].keys():
+ dayname=getdayname(events[e]["date"])
+ if events[e]["start"] is None:
+ events[e]["start"] = sem["slots"][_e["type"]][dayname]["start"]
+ if events[e]["end"] is None:
+ events[e]["end"] = sem["slots"][_e["type"]][dayname]["end"]
+ if events[e]["room"] is None:
+ events[e]["room"] = sem["slots"][_e["type"]][dayname]["room"]
-if not i["output"]["tables"]["lectures"]["hidden"]:
- sstart=parse_date(i["semester"]["start"])
- monday=getmonday(sstart)
+#### Gen semester calendar
+d=getmonday(sem["start"])
+w=getweek(d)
+while d<=sem["end"]:
t = PrettyTable()
- t.field_names = ["Day", "Time", "Room"]
- t.align["Day"] = "l"
- for offset in range(0,5):
- d=getnextdayn(monday, offset)
- s=getgloballectureslot(d)
- if s is not None:
- (startT,endT,room)=s
- room=room if room is not None else ""
- t.add_row([d.strftime("%A"),startT.strftime(i["output"]["time_format"])+"-"+endT.strftime(i["output"]["time_format"]),room])
- if not i["output"]["tables"]["lectures"]["show_rooms"]:
- t.del_column("Room")
+ t.field_names = ["Week "+str(w), "Monday", "Tuesday", "Wednesday", "Thursday", "Friday"]
+ t.align[t.field_names[0]]="l"
+ t.add_row(["",
+ formatday(getnextdayn(d, 0)),
+ formatday(getnextdayn(d, 1)),
+ formatday(getnextdayn(d, 2)),
+ formatday(getnextdayn(d, 3)),
+ formatday(getnextdayn(d, 4))],divider=True)
+ t.add_row(["",
+ formatevents(getnextdayn(d, 0)),
+ formatevents(getnextdayn(d, 1)),
+ formatevents(getnextdayn(d, 2)),
+ formatevents(getnextdayn(d, 3)),
+ formatevents(getnextdayn(d, 4))])
print(t)
+ d=getnextmonday(d)
+ w+=1
+ if d<sem["end"]:
+ print("")
-
-if not i["output"]["tables"]["colloquiums"]["hidden"]:
- sstart=parse_date(i["semester"]["start"])
- monday=getmonday(sstart)
+#### Gen slots tables
+for s in sem["slots"]:
t = PrettyTable()
t.field_names = ["Day", "Time", "Room"]
- t.align["Day"] = "l"
- for offset in range(0,5):
- d=getnextdayn(monday, offset)
- s=getglobalcolloquiumsslot(d)
- if s is not None:
- (startT,endT,room)=s
- room=room if room is not None else ""
- t.add_row([d.strftime("%A"),startT.strftime(i["output"]["time_format"])+"-"+endT.strftime(i["output"]["time_format"]),room])
- if not i["output"]["tables"]["colloquiums"]["show_rooms"]:
- t.del_column("Room")
+ t.align["Day"]="l"
+ for dayname in ["monday","tuesday","wednesday","thursday", "friday"]:
+ p=sem["slots"][s][dayname]
+ timeStr=gettime(p["start"])+"-"+gettime(p["end"]) if p["start"] is not None else ""
+ room=p["room"] if p["room"] is not None else ""
+ if timeStr != "" or room != "":
+ t.add_row([dayname.capitalize(),timeStr,room])
+ print(s+":")
print(t)
diff --git a/main2.py b/main2.py
deleted file mode 100755
index 5c39d9d..0000000
--- a/main2.py
+++ /dev/null
@@ -1,146 +0,0 @@
-#!./env/bin/python
-
-import yaml, textwrap
-from prettytable import PrettyTable
-from datetime import datetime, timedelta
-
-with open("infos2.yaml", "r") as f:
- _i=yaml.safe_load(f)
-
-#### Parsing
-def parse_date(s):
- return datetime.strptime(s, "%d/%m/%Y")
-def parse_time(s):
- return datetime.strptime(s, "%H:%M")
-#### Dates
-def getmonday(d):
- return d - timedelta(days=d.weekday())
-def getnextmonday(d):
- return getmonday(d)+timedelta(days=7)
-def getnextdayn(d,n):
- return (d+timedelta(days=n))
-def getweek(d):
- return d.isocalendar().week
-def getdayname(d):
- return d.strftime("%A").lower()
-#### Formatting
-def gettime(d):
- return d.strftime("%H:%M")
-def matchrepeat(d,e):
- _r=events[e]["repeat"]
- if _r["every"] <= 0:
- return False
- delta=timedelta(days=_r["every"])
- current=events[e]["date"]
- while current.date() <= sem["end"].date():
- if _r["until"] is not None and _r["until"].date()<current.date():
- break
- if current.date() == d.date():
- return True
- current+=delta
- continue
- return False
-def formatevents(d):
- output=""
- for e in events:
- _e=events[e]
- if (not _e["hidden"]) and (_e["date"].date() == d.date() or matchrepeat(d, e)):
- if _e["start"] is not None:
- output+=gettime(_e["start"])+"-"+gettime(_e["end"])+"\n"
- if _e["room"] is not None:
- output+="Room: "+_e["room"]+"\n"
- output+=_e["name"]
- return output
-def formatday(d):
- return d.strftime("%b %d")
-
-#### Load semester
-sem={
- "start": parse_date(_i["semester"]["start"]),
- "end": parse_date(_i["semester"]["end"]),
- "slots": {}
-}
-for e in _i["semester"]["slots"]:
- _e=_i["semester"]["slots"][e]
- sem["slots"][e]={}
- for dayname in ["monday","tuesday","wednesday","thursday","friday"]:
- sem["slots"][e][dayname]={
- "start": None,
- "end": None,
- "room": None
- }
- if dayname in _e.keys():
- if "start" in _e[dayname].keys():
- sem["slots"][e][dayname]["start"]=parse_time(_e[dayname]["start"])
- sem["slots"][e][dayname]["end"]=parse_time(_e[dayname]["end"])
- if "room" in _e[dayname].keys():
- sem["slots"][e][dayname]["room"]=_e[dayname]["room"]
-
-#### Load events
-events={}
-for e in _i["events"]:
- _e=_i["events"][e]
- events[e]={
- "type": _e["type"],
- "name": _e["name"],
- "date": parse_date(_e["date"]),
- "repeat": {
- "every": 0,
- "until": None
- }
- }
- events[e]["hidden"]=_e["hidden"] if "hidden" in _e.keys() else False
- events[e]["who"]=_e["who"] if "who" in _e.keys() else None
- events[e]["start"]=parse_time(_e["start"]) if "start" in _e.keys() else None
- events[e]["end"]=parse_time(_e["end"]) if "end" in _e.keys() else None
- events[e]["room"]=_e["room"] if "room" in _e.keys() else None
- if "repeat" in _e.keys():
- events[e]["repeat"]["every"]=_e["repeat"]["every"]
- events[e]["repeat"]["until"]=parse_date(_e["repeat"]["until"]) if "until" in _e["repeat"].keys() else None
- if _e["type"] in sem["slots"].keys():
- dayname=getdayname(events[e]["date"])
- if events[e]["start"] is None:
- events[e]["start"] = sem["slots"][_e["type"]][dayname]["start"]
- if events[e]["end"] is None:
- events[e]["end"] = sem["slots"][_e["type"]][dayname]["end"]
- if events[e]["room"] is None:
- events[e]["room"] = sem["slots"][_e["type"]][dayname]["room"]
-
-#### Gen semester calendar
-d=getmonday(sem["start"])
-w=getweek(d)
-while d<=sem["end"]:
- t = PrettyTable()
- t.field_names = ["Week "+str(w), "Monday", "Tuesday", "Wednesday", "Thursday", "Friday"]
- t.align[t.field_names[0]]="l"
- t.add_row(["",
- formatday(getnextdayn(d, 0)),
- formatday(getnextdayn(d, 1)),
- formatday(getnextdayn(d, 2)),
- formatday(getnextdayn(d, 3)),
- formatday(getnextdayn(d, 4))],divider=True)
- t.add_row(["",
- formatevents(getnextdayn(d, 0)),
- formatevents(getnextdayn(d, 1)),
- formatevents(getnextdayn(d, 2)),
- formatevents(getnextdayn(d, 3)),
- formatevents(getnextdayn(d, 4))])
- print(t)
- d=getnextmonday(d)
- w+=1
- if d<sem["end"]:
- print("")
-
-#### Gen slots tables
-for s in sem["slots"]:
- t = PrettyTable()
- t.field_names = ["Day", "Time", "Room"]
- t.align["Day"]="l"
- for dayname in ["monday","tuesday","wednesday","thursday", "friday"]:
- p=sem["slots"][s][dayname]
- timeStr=gettime(p["start"])+"-"+gettime(p["end"]) if p["start"] is not None else ""
- room=p["room"] if p["room"] is not None else ""
- if timeStr != "" or room != "":
- t.add_row([dayname.capitalize(),timeStr,room])
- print(s+":")
- print(t)