Refactor meetings.py
Make better use of Meetings objects by refactoring functions applying to them as object methods. Clean up superfluous argument value copy in cli.py as well. Change-Id: Ib60597cec617ce296c4937c9bb3a086d4f61d48a
This commit is contained in:
parent
4ab55d5c77
commit
893c7cfa29
|
@ -63,7 +63,6 @@ def _check_if_location_exists(location):
|
|||
def main():
|
||||
args = parse_args()
|
||||
|
||||
force = args.force
|
||||
yaml_dir = os.path.abspath(args.yaml_dir)
|
||||
_check_if_location_exists(yaml_dir)
|
||||
if args.ical_dir:
|
||||
|
@ -71,7 +70,7 @@ def main():
|
|||
_check_if_location_exists(ical_dir)
|
||||
|
||||
if os.listdir(ical_dir) != []:
|
||||
if force:
|
||||
if args.force:
|
||||
for f in os.listdir(ical_dir):
|
||||
file_path = os.path.join(ical_dir, f)
|
||||
os.remove(file_path)
|
||||
|
@ -82,7 +81,7 @@ def main():
|
|||
else:
|
||||
icalfile = os.path.abspath(args.icalfile)
|
||||
if os.path.exists(icalfile):
|
||||
if force:
|
||||
if args.force:
|
||||
os.remove(icalfile)
|
||||
else:
|
||||
raise Exception("Output file already exists, suggest running "
|
||||
|
|
|
@ -125,7 +125,7 @@ def convert_yaml_to_ical(yaml_dir, outputdir=None, outputfile=None):
|
|||
for m in meetings:
|
||||
cal = Yaml2IcalCalendar()
|
||||
cal.add_meeting(m)
|
||||
filename = os.path.basename(m._filename).split('.')[0] + '.ics'
|
||||
filename = os.path.basename(m.filename).split('.')[0] + '.ics'
|
||||
cal.write_to_disk(os.path.join(outputdir, filename))
|
||||
|
||||
# convert meetings into a single ical
|
||||
|
|
|
@ -16,7 +16,7 @@ import os
|
|||
import yaml
|
||||
|
||||
|
||||
class Schedule:
|
||||
class Schedule(object):
|
||||
"""A meeting schedule."""
|
||||
|
||||
def __init__(self, sched_yaml):
|
||||
|
@ -28,12 +28,41 @@ class Schedule:
|
|||
self.freq = sched_yaml['frequency']
|
||||
|
||||
|
||||
class Meeting:
|
||||
class Meeting(object):
|
||||
"""An OpenStack meeting."""
|
||||
|
||||
def __init__(self):
|
||||
"""Initialize meeting from yaml file name 'filename'."""
|
||||
pass
|
||||
def __init__(self, meeting_yaml):
|
||||
"""Initialize meeting from meeting yaml description."""
|
||||
|
||||
yaml_obj = yaml.safe_load(meeting_yaml)
|
||||
self.chair = yaml_obj['chair']
|
||||
self.description = yaml_obj['description']
|
||||
self.project = yaml_obj['project']
|
||||
self.filename = "%s-%s" % (
|
||||
yaml_obj['project'],
|
||||
hashlib.md5(str(yaml_obj).encode('utf-8')).hexdigest()[:8])
|
||||
|
||||
self.schedules = []
|
||||
for sch in yaml_obj['schedule']:
|
||||
s = Schedule(sch)
|
||||
self.schedules.append(s)
|
||||
|
||||
def extract_meeting_info(self):
|
||||
"""Pull out meeting info of Meeting object.
|
||||
:returns: a dictionary of meeting info
|
||||
"""
|
||||
|
||||
meeting_info = []
|
||||
|
||||
for schedule in self.schedules:
|
||||
info = {'name': self.project,
|
||||
'filename': self.filename,
|
||||
'day': schedule.day,
|
||||
'time': schedule.time,
|
||||
'irc_room': schedule.irc}
|
||||
meeting_info.append(info)
|
||||
|
||||
return meeting_info
|
||||
|
||||
|
||||
def load_meetings(yaml_source):
|
||||
|
@ -53,7 +82,7 @@ def load_meetings(yaml_source):
|
|||
yaml_file = os.path.join(yaml_source, f)
|
||||
meetings_yaml.append(yaml_file)
|
||||
elif isinstance(yaml_source, str):
|
||||
return [_load_meeting(yaml_source)]
|
||||
return [Meeting(yaml_source)]
|
||||
else:
|
||||
# If we don't have a .yaml file, a directory of .yaml files, or any
|
||||
# YAML data fail out here.
|
||||
|
@ -63,55 +92,15 @@ def load_meetings(yaml_source):
|
|||
meetings = []
|
||||
for yaml_file in meetings_yaml:
|
||||
with open(yaml_file, 'r') as f:
|
||||
meetings.append(_load_meeting(f))
|
||||
meetings.append(Meeting(f))
|
||||
|
||||
return meetings
|
||||
|
||||
|
||||
def _load_meeting(meeting_yaml):
|
||||
yaml_obj = yaml.safe_load(meeting_yaml)
|
||||
m = Meeting()
|
||||
|
||||
# Build meeting attributes from yaml
|
||||
m.chair = yaml_obj['chair']
|
||||
m.description = yaml_obj['description']
|
||||
m.project = yaml_obj['project']
|
||||
m._filename = (yaml_obj['project'] + '-' +
|
||||
hashlib.md5(str(yaml_obj).encode('utf-8')).hexdigest()[:8])
|
||||
|
||||
# TODO(lbragstad): See if there is another way we can do this instead
|
||||
# of having every Meeting object build a list of Schedule objects.
|
||||
m.schedules = []
|
||||
for sch in yaml_obj['schedule']:
|
||||
s = Schedule(sch)
|
||||
m.schedules.append(s)
|
||||
|
||||
return m
|
||||
|
||||
|
||||
class MeetingConflictError(Exception):
|
||||
pass
|
||||
|
||||
|
||||
def _extract_meeting_info(meeting_obj):
|
||||
"""Pull out meeting info of Meeting object.
|
||||
|
||||
:param meeting_obj: Meeting object
|
||||
:returns: a dictionary of meeting info
|
||||
|
||||
"""
|
||||
meeting_info = []
|
||||
for schedule in meeting_obj.schedules:
|
||||
info = {'name': meeting_obj.project,
|
||||
'filename': meeting_obj._filename,
|
||||
'day': schedule.day,
|
||||
'time': schedule.time,
|
||||
'irc_room': schedule.irc}
|
||||
meeting_info.append(info)
|
||||
|
||||
return meeting_info
|
||||
|
||||
|
||||
def check_for_meeting_conflicts(meetings):
|
||||
"""Check if a list of meetings have conflicts.
|
||||
|
||||
|
@ -120,9 +109,9 @@ def check_for_meeting_conflicts(meetings):
|
|||
"""
|
||||
|
||||
for i in range(len(meetings)):
|
||||
meeting_info = _extract_meeting_info(meetings[i])
|
||||
meeting_info = meetings[i].extract_meeting_info()
|
||||
for j in range(i + 1, len(meetings)):
|
||||
next_meeting_info = _extract_meeting_info(meetings[j])
|
||||
next_meeting_info = meetings[j].extract_meeting_info()
|
||||
for current_meeting in meeting_info:
|
||||
for next_meeting in next_meeting_info:
|
||||
if current_meeting['day'] != next_meeting['day']:
|
||||
|
|
Loading…
Reference in New Issue