This is an automated email from the ASF dual-hosted git repository.
sebb pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/whimsy.git
The following commit(s) were added to refs/heads/master by this push:
new a32f3e89 parse memapps as hash; calculate application time left
a32f3e89 is described below
commit a32f3e89fb1815cbf36c6428b7030c3c6f9f8149
Author: Sebb <[email protected]>
AuthorDate: Tue Mar 12 14:51:06 2024 +0000
parse memapps as hash; calculate application time left
---
lib/whimsy/asf/meeting-util.rb | 27 +++++++++++++++++++++++++++
1 file changed, 27 insertions(+)
diff --git a/lib/whimsy/asf/meeting-util.rb b/lib/whimsy/asf/meeting-util.rb
index 5435877b..6e56e496 100644
--- a/lib/whimsy/asf/meeting-util.rb
+++ b/lib/whimsy/asf/meeting-util.rb
@@ -10,9 +10,17 @@ module ASF
class MeetingUtil
RECORDS = ASF::SVN.svnurl!('Meetings') # in SVN
MEETINGS_DIR = ASF::SVN['Meetings'] # local checkout
+ # This ICS file contains 3 events: the meeting itself, nominations close,
and polls close
VCAL_EVENTS_FILENAME = 'ASF-members-meeting.ics'
PROXIES_FILENAME = 'proxies'
+ # https://www.apache.org/foundation/bylaws.html#article-iv
+ # application must be received by the Secretary no later than 30 days
following the vote.
+ # Current thinking is that the vote is considered to have occurred when
the results are announced.
+ # TBC
+ APPLICATION_EXPIRY_POST_VOTE_DAYS = 30
+ APPLICATION_EXPIRY_POST_VOTE_SECS =
APPLICATION_EXPIRY_POST_VOTE_DAYS*24*60*60
+
# The URL is generated using emit_link() in meeting.cgi
# if the name includes '/' then use as is unless it starts with 'runbook/'
MEETING_FILES = { # Filename in meeting dir, pathname to another deployed
tool, or URL
@@ -190,6 +198,15 @@ module ASF
list.each {|a| a.last.strip!} # trim the user name
end
+ # parse a memapp file; if omitted, pick the latest found
+ # Does not support files before 2010
+ # Return: array of hash entries with the symbolic keys:
+ # :invite :apply :mail :karma :id :name
+ def self.parse_memapp_to_h(path=nil)
+ keys = %i(invite apply mail karma id name)
+ self.parse_memapp(path).map {|entry| keys.zip(entry).to_h}
+ end
+
# Parse all memapp-received.txt files to get better set of names
# @see whimsy/www/members/attendance-xcheck.cgi
def self.read_memapps(dir)
@@ -344,6 +361,16 @@ module ASF
end
return [times['asf-members-nominations-close'],
times['asf-members-polls-close'], times['asf-members']]
end
+
+ # How long remains before applications close?
+ # Returned as hash, e.g. {:hoursremain=>605, :days=>25, :hours=>5}
+ def self.application_time_remaining
+ _, _, meeting = self.get_invite_times # this is in seconds
+ now = DateTime.now.to_time.to_i
+ remain = (meeting + APPLICATION_EXPIRY_POST_VOTE_SECS - now) / 3600
+ {hoursremain: remain, days: remain/24, hours: remain%24}
+ end
+
end
end