blob: d7382cd38334a0058336d68e38ae3238e1d85922 [file] [log] [blame]
# Copyright 2023 The Pigweed Authors
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may not
# use this file except in compliance with the License. You may obtain a copy of
# the License at
#
# https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations under
# the License.
"""Docs widget that provides up-to-date info about the next Pigweed Live."""
import datetime
import sys
from typing import Dict, List
from docutils import nodes
from docutils.parsers.rst import Directive
from sphinx.application import Sphinx
try:
import pytz # type: ignore
PYTZ_AVAILABLE = True
except ImportError:
PYTZ_AVAILABLE = False
class PigweedLiveDirective(Directive):
"""Generates the up-to-date Pigweed Live info."""
datetime_format = '%Y-%m-%d %H:%M:%S'
# TODO: b/303859828 - Update this data sometime between 2024-09-23
# and 2024-10-07.
meetings = [
'2023-10-09 13:00:00',
'2023-10-23 13:00:00',
'2023-11-06 13:00:00',
# 2023-11-20 skipped since it's a holiday(ish)
'2023-12-04 13:00:00',
'2023-12-18 13:00:00',
# 2024-01-01 and 2024-01-15 are skipped because they're holidays.
'2024-01-29 13:00:00',
'2024-02-12 13:00:00',
'2024-02-26 13:00:00',
'2024-03-11 13:00:00',
'2024-03-25 13:00:00',
'2024-04-08 13:00:00',
'2024-04-22 13:00:00',
'2024-05-06 13:00:00',
'2024-05-20 13:00:00',
'2024-06-03 13:00:00',
'2024-06-17 13:00:00',
'2024-07-01 13:00:00',
'2024-07-15 13:00:00',
'2024-07-29 13:00:00',
'2024-08-12 13:00:00',
'2024-08-26 13:00:00',
'2024-09-09 13:00:00',
'2024-09-23 13:00:00',
'2024-10-07 13:00:00',
]
timezone = pytz.timezone('US/Pacific')
def run(self) -> List[nodes.Node]:
return [self._make_paragraph()]
def _make_paragraph(self) -> nodes.Node:
next_meeting = self._find_next_meeting()
paragraph = nodes.paragraph()
paragraph += nodes.Text('Our next Pigweed Live is ')
meeting_text = nodes.strong()
meeting_text += nodes.Text(next_meeting)
paragraph += meeting_text
paragraph += nodes.Text(
(
". Please join us to discuss what's new in Pigweed and "
"anything else Pigweed-related. Or stop in just to say hi and "
"meet the team! You'll find a link for the meeting in the "
"#pigweed-live channel of our "
)
)
link = nodes.reference(refuri='https://discord.gg/M9NSeTA')
link += nodes.Text('Discord')
paragraph += link
paragraph += nodes.Text(
(
'. We meet bi-weekly. The meeting is public. Everyone is '
'welcome to join.'
)
)
return paragraph
def _find_next_meeting(self) -> str:
current_datetime = self.timezone.localize(datetime.datetime.now())
next_meeting = None
for meeting in self.meetings:
unlocalized_datetime = datetime.datetime.strptime(
meeting, self.datetime_format
)
meeting_datetime = self.timezone.localize(unlocalized_datetime)
if current_datetime > meeting_datetime:
continue
next_meeting = meeting_datetime
break
if next_meeting is None:
sys.exit(
'ERROR: Pigweed Live meeting data needs to be updated. '
'Update the `meetings` list in `PigweedLiveDirective`. '
'See b/303859828.'
)
else:
date = next_meeting.strftime('%a %b %d, %Y')
hour = next_meeting.strftime('%I%p').lstrip('0')
timezone = 'PDT' if next_meeting.dst() else 'PST'
return f'{date} {hour} ({timezone})'
def setup(app: Sphinx) -> Dict[str, bool]:
"""Initialize the directive."""
if PYTZ_AVAILABLE:
app.add_directive('pigweed-live', PigweedLiveDirective)
return {
'parallel_read_safe': True,
'parallel_write_safe': True,
}