Skip to content

Commit

Permalink
Merge pull request #238 from ocf/meeting-hours-fixes
Browse files Browse the repository at this point in the history
Meeting hours fixes + tests
  • Loading branch information
ben9583 authored Nov 22, 2021
2 parents fe6ea65 + b83f020 commit e4dddf8
Show file tree
Hide file tree
Showing 2 changed files with 227 additions and 22 deletions.
62 changes: 40 additions & 22 deletions ocflib/org/meeting_hours.py
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ def _time_to_range(hours):
if first_colon != 1 and first_colon != 2:
return

first_half = hours[first_colon + 2:first_colon + 4]
first_half = hours[first_colon + 3:first_colon + 5]
if first_half != 'AM' and first_half != 'PM':
return

Expand All @@ -86,27 +86,45 @@ def _time_to_range(hours):
if second_colon != hyphen + 3 and second_colon != hyphen + 4:
return

second_half = hours[second_colon + 2:second_colon + 4]
second_half = hours[second_colon + 3:second_colon + 5]
if second_half != 'AM' and second_half != 'PM':
return

start_hours = hours[0:first_colon]
start_minutes = hours[first_colon + 1:first_colon + 3]
end_hours = hours[hyphen + 2:second_colon]
end_minutes = hours[second_colon + 1:second_colon + 3]
start_hours = int(hours[0:first_colon])
start_minutes = int(hours[first_colon + 1:first_colon + 3])
end_hours = int(hours[hyphen + 2:second_colon])
end_minutes = int(hours[second_colon + 1:second_colon + 3])

start_pm_offset = 12 if first_half == 'PM' else 0
end_pm_offset = 12 if second_half == 'PM' else 0

start_time = start_hours + start_pm_offset * 60 + start_minutes
end_time = end_hours + end_pm_offset * 60 + end_minutes
start_time = start_hours * 60 + start_pm_offset * 60 + start_minutes
end_time = end_hours * 60 + end_pm_offset * 60 + end_minutes

return (start_time, end_time)


def _get_next_meeting():
today = date.today()
now = localtime().tm_hour * 60 + localtime().tm_min
def _iso_weekday_to_str(num):
if num == 1:
return 'Monday'
elif num == 2:
return 'Tuesday'
elif num == 3:
return 'Wednesday'
elif num == 4:
return 'Thursday'
elif num == 5:
return 'Friday'
elif num == 6:
return 'Saturday'
elif num == 7:
return 'Sunday'

return ''


def _get_next_meeting(today=date.today(), now=localtime()):
now = now.tm_hour * 60 + localtime().tm_min
days = [(today + timedelta(days=i)).strftime('%A') for i in range(7)]

meetings = sorted(
Expand All @@ -115,15 +133,15 @@ def _get_next_meeting():
)

for meeting in meetings:
if _time_to_range(meeting.time)[0] > now:
ranged_time = _time_to_range(meeting.time)
if ranged_time[0] > now or meeting.day != _iso_weekday_to_str(today.isoweekday()):
return meeting

return None


def _get_current_meeting():
today = date.today()
now = localtime().tm_hour * 60 + localtime().tm_min
def _get_current_meeting(today=date.today(), now=localtime()):
now = now.tm_hour * 60 + localtime().tm_min
days = [(today + timedelta(days=i)).strftime('%A') for i in range(7)]

meetings = sorted(
Expand All @@ -133,19 +151,19 @@ def _get_current_meeting():

for meeting in meetings:
ranged_time = _time_to_range(meeting.time)
if ranged_time[0] < now and ranged_time[1]:
if ranged_time[0] < now and ranged_time[1] > now and meeting.day == _iso_weekday_to_str(today.isoweekday()):
return meeting

return None


def read_meeting_list():
return _get_meeting_hours()
def read_meeting_list(**kwargs):
return _get_meeting_hours(**kwargs)


def read_next_meeting():
return _get_next_meeting()
def read_next_meeting(**kwargs):
return _get_next_meeting(**kwargs)


def read_current_meeting():
return _get_current_meeting()
def read_current_meeting(**kwargs):
return _get_current_meeting(**kwargs)
187 changes: 187 additions & 0 deletions tests/org/meeting_hours_test.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,187 @@
import time
from datetime import date

import mock
import pytest
import yaml

from ocflib.org.meeting_hours import _load_meeting_hours
from ocflib.org.meeting_hours import Meeting
from ocflib.org.meeting_hours import read_current_meeting
from ocflib.org.meeting_hours import read_meeting_list
from ocflib.org.meeting_hours import read_next_meeting

TEST_HOURS = """\
meeting-hours:
Monday:
- time: ['14:00', '15:00']
subject: "Internal Meeting"
short: "internal"
irl: true
virtual: false
Tuesday:
Wednesday:
- time: ['19:00', '20:00']
subject: "Board of Directors Meeting"
short: "bod"
irl: true
virtual: true
- time: ['20:00', '21:00']
subject: "Staff Meeting"
short: "staff"
irl: true
virtual: true
Thursday:
Friday:
- time: ['17:00', '18:00']
subject: "Web Team Meeting"
short: "web"
irl: true
virtual: false
Saturday:
- time: ['14:00', '15:00']
subject: "Kubernetes Interest Group Meeting"
short: "kubernetes"
irl: true
virtual: false
- time: ['15:00', '16:00']
subject: "Linux/Infra Meeting"
short: "linux/infra"
irl: true
virtual: false
Sunday:
"""

MEETING_LIST_TEST = [
Meeting(
day='Monday',
time='2:00PM - 3:00PM',
subject='Internal Meeting',
short='internal',
irl=True,
virtual=False
),
Meeting(
day='Wednesday',
time='7:00PM - 8:00PM',
subject='Board of Directors Meeting',
short='bod',
irl=True,
virtual=True
),
Meeting(
day='Wednesday',
time='8:00PM - 9:00PM',
subject='Staff Meeting',
short='staff',
irl=True,
virtual=True
),
Meeting(
day='Friday',
time='5:00PM - 6:00PM',
subject='Web Team Meeting',
short='web',
irl=True,
virtual=False
),
Meeting(
day='Saturday',
time='2:00PM - 3:00PM',
subject='Kubernetes Interest Group Meeting',
short='kubernetes',
irl=True,
virtual=False
),
Meeting(
day='Saturday',
time='3:00PM - 4:00PM',
subject='Linux/Infra Meeting',
short='linux/infra',
irl=True,
virtual=False
)
]

INTERNAL_MEETING_TEST = Meeting(
day='Monday',
time='2:00PM - 3:00PM',
subject='Internal Meeting',
short='internal',
irl=True,
virtual=False
)

BOD_MEETING_TEST = Meeting(
day='Wednesday',
time='7:00PM - 8:00PM',
subject='Board of Directors Meeting',
short='bod',
irl=True,
virtual=True
)


@pytest.yield_fixture
def mock_disk(tmpdir):
f = tmpdir.join('meeting_hours.yaml')
f.write(TEST_HOURS)
with mock.patch('ocflib.org.meeting_hours.MEETING_HOURS_FILE', f.strpath):
yield


class TestLoadMeetingHours:

def test_loads_from_file_if_exists(self, mock_disk):
assert _load_meeting_hours() == yaml.safe_load(TEST_HOURS)


@pytest.mark.parametrize('date,time,expected', [
# Sunday, October 31, 2021 8:30:00 PM GMT-7
(date(2021, 10, 31), time.localtime(1633318200), None),
# Monday, November 1, 2021 1:45:00 PM GMT-7
(date(2021, 11, 1), time.localtime(1635799500), None),
# Monday, November 1, 2021 2:00:01 PM GMT-7
(date(2021, 11, 1), time.localtime(1635800401), INTERNAL_MEETING_TEST),
# Monday, November 1, 2021 2:59:59 PM GMT-7
(date(2021, 11, 1), time.localtime(1635803999), INTERNAL_MEETING_TEST),
# Monday, November 1, 2021 3:00:01 PM GMT-7
(date(2021, 11, 1), time.localtime(1635804001), None),
])
def test_read_current_meeting(mock_disk, date, time, expected):
if expected is None:
assert read_current_meeting(today=date, now=time) is None
else:
assert read_current_meeting(today=date, now=time) == expected


@pytest.mark.parametrize('date,time,expected', [
# Sunday, October 31, 2021 8:30:00 PM GMT-7
(date(2021, 10, 31), time.localtime(1633318200), INTERNAL_MEETING_TEST),
# Monday, November 1, 2021 1:45:00 PM GMT-7
(date(2021, 11, 1), time.localtime(1635799500), INTERNAL_MEETING_TEST),
# Monday, November 1, 2021 2:00:01 PM GMT-7
(date(2021, 11, 1), time.localtime(1635800401), BOD_MEETING_TEST),
# Monday, November 1, 2021 2:59:59 PM GMT-7
(date(2021, 11, 1), time.localtime(1635803999), BOD_MEETING_TEST),
# Monday, November 1, 2021 3:00:01 PM GMT-7
(date(2021, 11, 1), time.localtime(1635804001), BOD_MEETING_TEST),
])
def test_read_next_meeting(mock_disk, date, time, expected):
if expected is None:
assert read_next_meeting(today=date, now=time) is None
else:
assert read_next_meeting(today=date, now=time) == expected


@pytest.mark.parametrize('date,expected', [
(None, MEETING_LIST_TEST),
])
def test_read_meeting_list(mock_disk, date, expected):
if not (date is None):
assert False

if expected is None:
assert read_meeting_list() is None
else:
assert read_meeting_list() == expected

0 comments on commit e4dddf8

Please sign in to comment.