(whimsy) branch master updated: docs: remove unneeded duplicate words (#203)
This is an automated email from the ASF dual-hosted git repository. clr 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 8494c83b docs: remove unneeded duplicate words (#203) 8494c83b is described below commit 8494c83b098d1c7a1138a463a685f51f5c99d021 Author: John Bampton AuthorDate: Thu Feb 22 12:57:26 2024 +1000 docs: remove unneeded duplicate words (#203) --- MACOS.md | 4 ++-- www/board/agenda/README.md | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/MACOS.md b/MACOS.md index 88e7dd43..f4ce64da 100644 --- a/MACOS.md +++ b/MACOS.md @@ -233,7 +233,7 @@ Configure whimsy.local, Complete Apache configuration, Make whimsy.local an alias for your machine, and Optional: forward whimsy.local traffic to port 8080 steps. -Running Whimsy tools locally depends on httpd. Apple provides a copy of httpd that that you can configure and start. +Running Whimsy tools locally depends on httpd. Apple provides a copy of httpd that you can configure and start. Install: @@ -338,7 +338,7 @@ $ brew info passenger For the second step (`brew info passenger`), you will need to follow the instructions -- which essentially is to copy a few lines to -to a specified location, typically `/etc/apache2/other/passenger.conf`. +a specified location, typically `/etc/apache2/other/passenger.conf`. If your ruby is installed in `/usr/local/bin`, change the last line to diff --git a/www/board/agenda/README.md b/www/board/agenda/README.md index c40fb646..bf0aabed 100644 --- a/www/board/agenda/README.md +++ b/www/board/agenda/README.md @@ -240,7 +240,7 @@ Viewing Source (this time, Actual Code) [views/app.js.rb](views/app.js.rb) lists all of the files that make up the client side of the application. - * This brings us back to to the `app.js` script mentioned much earlier. + * This brings us back to the `app.js` script mentioned much earlier. If you visit [http://localhost:9292/app.js](http://localhost:9292/app.js) you will see the full script. Every bit of this JavaScript was generated from the js.rb files mentioned above. Undoubtedly you have seen small @@ -351,7 +351,7 @@ in your home directory. The file format is YAML, and here is mine: Adapt as necessary. You don't need to have all those entries in the `svn` -value to run the board agenda tool. The `lib` value is is an array of +value to run the board agenda tool. The `lib` value is an array of libraries that are to be used instead of gems you may have installed. This is useful if you are making changes to the agenda parsing logic, ruby2js or wunderbar. You can remove this too. If you drop the `ldap` entry, one will
(whimsy) branch master updated: Remove unneeded trailing whitespace from Ruby files (#200)
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 fcda943a Remove unneeded trailing whitespace from Ruby files (#200) fcda943a is described below commit fcda943af5ed24732deee8d7028a1205d0d2c881 Author: John Bampton AuthorDate: Thu Feb 22 10:49:00 2024 +1000 Remove unneeded trailing whitespace from Ruby files (#200) --- lib/whimsy/asf/board.rb| 2 +- lib/whimsy/asf/config.rb | 2 +- lib/whimsy/asf/petri.rb| 2 +- lib/whimsy/asf/status.rb | 4 ++-- tools/collate_minutes.rb | 2 +- tools/fixroster.rb | 2 +- tools/site-scan.rb | 2 +- tools/site_member_check.rb | 2 +- www/board/agenda/routes.rb | 4 ++-- www/roster/models/committee.rb | 2 +- www/status/monitors/public_json.rb | 2 +- 11 files changed, 13 insertions(+), 13 deletions(-) diff --git a/lib/whimsy/asf/board.rb b/lib/whimsy/asf/board.rb index 58d902d6..0d9f02a6 100644 --- a/lib/whimsy/asf/board.rb +++ b/lib/whimsy/asf/board.rb @@ -1,6 +1,6 @@ require_relative '../asf' require 'active_support' -require 'active_support/time' +require 'active_support/time' module ASF module Board diff --git a/lib/whimsy/asf/config.rb b/lib/whimsy/asf/config.rb index 8c5babbd..5d96739f 100644 --- a/lib/whimsy/asf/config.rb +++ b/lib/whimsy/asf/config.rb @@ -139,7 +139,7 @@ module ASF end # Get an executable path override -# e.g. +# e.g. # :exepaths: # gpg: /usr/local/bin/gpg3 # returns its input if no override is found diff --git a/lib/whimsy/asf/petri.rb b/lib/whimsy/asf/petri.rb index 39cb2d24..7d6d412c 100644 --- a/lib/whimsy/asf/petri.rb +++ b/lib/whimsy/asf/petri.rb @@ -39,7 +39,7 @@ module ASF # @mentors = yaml['mentors'] yaml['cultures'].each do |proj| prj = new(proj) -if yaml['projects'].include? proj +if yaml['projects'].include? proj prj.error = 'Listed as a current project' unless prj.status == 'current' else prj.error = 'Not listed as a current project' if prj.status == 'current' diff --git a/lib/whimsy/asf/status.rb b/lib/whimsy/asf/status.rb index 50c2e9e7..ae04bf5f 100644 --- a/lib/whimsy/asf/status.rb +++ b/lib/whimsy/asf/status.rb @@ -68,11 +68,11 @@ module Status end end end - + def self.activeIP # intended for CLI testing Resolv::DNS.open.getaddress(ACTIVE_HOSTNAME) end - + end # for debugging purposes diff --git a/tools/collate_minutes.rb b/tools/collate_minutes.rb index 582062c9..0ba6cb52 100755 --- a/tools/collate_minutes.rb +++ b/tools/collate_minutes.rb @@ -740,7 +740,7 @@ seen={} puts '' end end - + # Add to the running tally pending.each_value do |report| next if not report.title or report.title.empty? diff --git a/tools/fixroster.rb b/tools/fixroster.rb index 15181607..bb7b7148 100644 --- a/tools/fixroster.rb +++ b/tools/fixroster.rb @@ -10,7 +10,7 @@ Encoding.default_internal = Encoding::UTF_8 if __FILE__ == $0 CIN = ARGV.shift || '/srv/svn/board/committee-info.txt' OUT = ARGV.shift || '/srv/svn/board/committee-info.tmp' - + File.open(OUT, 'w') do |out| File.open(CIN, 'r').slice_before{|l| l.start_with? '* '}.each do |lines| head = lines.shift diff --git a/tools/site-scan.rb b/tools/site-scan.rb index e45a1aa0..e3007c1b 100755 --- a/tools/site-scan.rb +++ b/tools/site-scan.rb @@ -45,7 +45,7 @@ end # TODO should we show them all? def save_events(data, value) prev = data[:events] - if prev and prev != value + if prev and prev != value puts "Events: already have '#{prev}', not storing '#{value}'" else data[:events] = value diff --git a/tools/site_member_check.rb b/tools/site_member_check.rb index 30e81fd7..c4bfa621 100755 --- a/tools/site_member_check.rb +++ b/tools/site_member_check.rb @@ -56,7 +56,7 @@ loop do s.scan(/\| (\S+) \|.*?$/) id = s[1] unless current.include? id -puts "#{id}: #{status[id] || 'unknown status'}" +puts "#{id}: #{status[id] || 'unknown status'}" puts "Previous id: #{prev}" unless id end prev = id diff --git a/www/board/agenda/routes.rb b/www/board/agenda/routes.rb index d43ce3eb..aecb9990 100755 --- a/www/board/agenda/routes.rb +++ b/www/board/agenda/routes.rb @@ -549,7 +549,7 @@ get '/new' do Wunderbar.warn "#{e}, could not access previous actions, continuing" actions = nil end - + # Get directors, list of pmcs due to report, and shepherds @directors = ASF::Board.directors @pmcs = ASF::Board.reporting(@meeting) @@ -605,7 +605,7 @@ post %r{/(\d\d\d\d-\d\d-\d\d)/} do |date| ASF::SVN.svn!('update', currentpath, {env: env}) if File.symlink? currentpath # Does the symlink exist? - File.unlink currentpath +
(whimsy) branch master updated: Add `alt` attributes to `img` tags in `www/public/HEADER.html` (#199)
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 5f38b701 Add `alt` attributes to `img` tags in `www/public/HEADER.html` (#199) 5f38b701 is described below commit 5f38b70178ac036da060345f7b89897bb3630177 Author: John Bampton AuthorDate: Thu Feb 22 10:48:08 2024 +1000 Add `alt` attributes to `img` tags in `www/public/HEADER.html` (#199) Order the attributes --- www/public/HEADER.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/www/public/HEADER.html b/www/public/HEADER.html index 9f48cd61..4a58e74f 100644 --- a/www/public/HEADER.html +++ b/www/public/HEADER.html @@ -1,2 +1,2 @@ -http://www.apache.org/;>https://www.apache.org/foundation/press/kit/asf_logo_small.png"/> - +http://www.apache.org/;>https://www.apache.org/foundation/press/kit/asf_logo_small.png; title="ASF Logo"/> +
(whimsy) branch master updated: Remove unneeded duplicate word in `DEVELOPMENT.md` (#201)
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 b72d4672 Remove unneeded duplicate word in `DEVELOPMENT.md` (#201) b72d4672 is described below commit b72d46720ed1878043f40effb9a0b52dbac6a131 Author: John Bampton AuthorDate: Thu Feb 22 10:46:23 2024 +1000 Remove unneeded duplicate word in `DEVELOPMENT.md` (#201) --- DEVELOPMENT.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DEVELOPMENT.md b/DEVELOPMENT.md index 22119456..d7bd0f55 100644 --- a/DEVELOPMENT.md +++ b/DEVELOPMENT.md @@ -333,7 +333,7 @@ different set of gem versions from the local directory. ### How To: Authenticate/Authorize Your Scripts User authentication for any CGI script is provided by the http server's -LDAP module, and can be done by by adding the path to the CGI in the +LDAP module, and can be done by adding the path to the CGI in the deployment descriptor for the server under the appropriate `authldap` realm: https://github.com/apache/infrastructure-puppet/blob/deployment/data/nodes/whimsy-vm4.apache.org.yaml#L127
(whimsy) branch master updated: Fix Markdown backtick markup in `README.md` (#202)
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 e651114f Fix Markdown backtick markup in `README.md` (#202) e651114f is described below commit e651114f5c7f65b9bc8f207c577d53f00c40e72a Author: John Bampton AuthorDate: Thu Feb 22 10:45:10 2024 +1000 Fix Markdown backtick markup in `README.md` (#202) --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index faaa3af0..ade2da4e 100644 --- a/README.md +++ b/README.md @@ -98,7 +98,7 @@ Details for each type of deployed tool or script: [Phusion Passenger](https://www.phusionpassenger.com/) under Apache httpd. Again, `Gemfile`s are used to specify dependencies. In addition to simply checking the application, one line per passenger application needs to be - added to the puppet file under 'passenger:` as seen in [DEPLOYMENT.md](./DEPLOYMENT.md#puppetnode). + added to the puppet file under `passenger:` as seen in [DEPLOYMENT.md](./DEPLOYMENT.md#puppetnode). A sample rack application (two empty directories, and a one line file):
(whimsy) branch master updated: Improve explanation of who needs to attend
This is an automated email from the ASF dual-hosted git repository. curcuru 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 044c3c43 Improve explanation of who needs to attend 044c3c43 is described below commit 044c3c435b1b4c18832b9f0e39e4fd0df0cb0643 Author: Shane Curcuru AuthorDate: Wed Feb 21 16:15:09 2024 -0500 Improve explanation of who needs to attend --- www/members/meeting.cgi | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/www/members/meeting.cgi b/www/members/meeting.cgi index b114541c..14b4168f 100755 --- a/www/members/meeting.cgi +++ b/www/members/meeting.cgi @@ -142,9 +142,9 @@ _html do _ 'Nominations for the board or new members close 10 days before the meeting starts; no new names may be added after that date.' end _p do -_ 'Currently, we will need ' +_ 'Currently, we need ' _span.text_primary attend_irc -_ " Members to attend the meeting on #{ics_date.strftime(WDAYFORMAT)} and respond to Roll Call to reach quorum and continue the meeting." +_ " Members who have NOT submitted a proxy, to attend the meeting on #{ics_date.strftime(WDAYFORMAT)} and respond to Roll Call to reach quorum and continue the meeting, so that between Members actually attending, and Members who have assigned a proxy are counted as attending." _ " Calculation: Total voting members: #{num_members}, with one third for quorum: #{quorum_need}, minus previously submitted proxies: #{num_proxies}" end _p do
(whimsy) branch master updated: matt.apache.org went AWOL
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 9c19a310 matt.apache.org went AWOL 9c19a310 is described below commit 9c19a310cf28b8130ef1dcbfadb486fb91efdd63 Author: Sebb AuthorDate: Wed Feb 21 21:06:01 2024 + matt.apache.org went AWOL --- www/technology.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/www/technology.html b/www/technology.html index 880336f0..751d000c 100644 --- a/www/technology.html +++ b/www/technology.html @@ -58,10 +58,10 @@ About Whimsy Code Get the source: -https://gitbox.apache.org/repos/asf/whimsy.git;>Apache +https://gitbox.apache.org/repos/asf/whimsy.git;>Apache (GitBox) +or https://github.com/apache/whimsy;>GitHub - https://matt.apache.org/pushlogs.html?repo=whimsy;>Push logs https://issues.apache.org/jira/browse/WHIMSY/;>Issue Tracker https://github.com/apache/whimsy/blob/master/README.md;>README API documentation
(whimsy) branch master updated: Fix HTML syntax in `www/technology.html` (#198)
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 8d9919da Fix HTML syntax in `www/technology.html` (#198) 8d9919da is described below commit 8d9919dad338e2b4ea99bc798223c96ff3a8ca05 Author: John Bampton AuthorDate: Thu Feb 22 06:57:01 2024 +1000 Fix HTML syntax in `www/technology.html` (#198) --- www/technology.html | 6 ++ 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/www/technology.html b/www/technology.html index f18e71dc..880336f0 100644 --- a/www/technology.html +++ b/www/technology.html @@ -1,4 +1,3 @@ - http://www.w3.org/1999/xhtml;> @@ -60,10 +59,9 @@ Get the source: https://gitbox.apache.org/repos/asf/whimsy.git;>Apache -https://github.com/apache/whimsy;>GitHub -- -https://matt.apache.org/pushlogs.html?repo=whimsy;>Push logs +https://github.com/apache/whimsy;>GitHub + https://matt.apache.org/pushlogs.html?repo=whimsy;>Push logs https://issues.apache.org/jira/browse/WHIMSY/;>Issue Tracker https://github.com/apache/whimsy/blob/master/README.md;>README API documentation
(whimsy) branch master updated: Ignore misspelt name
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 cf4c0fe3 Ignore misspelt name cf4c0fe3 is described below commit cf4c0fe3eb132afa5ddbc9d2755cee15b8ba2617 Author: Sebb AuthorDate: Wed Feb 21 20:34:38 2024 + Ignore misspelt name --- www/members/nominations.cgi | 1 + 1 file changed, 1 insertion(+) diff --git a/www/members/nominations.cgi b/www/members/nominations.cgi index ab0a5d39..2df48bfc 100755 --- a/www/members/nominations.cgi +++ b/www/members/nominations.cgi @@ -83,6 +83,7 @@ def create_match(nominee) names << pname.delete('.') names << pname.sub(%r{ [A-Z] }, ' ') # drop initial names << pname.sub(/\bChristo(ph|f)er\b/, 'Chris') # Special + names << 'Lukasz Dywick' if pname == 'Lukasz Dywicki' # special personname = ASF::Person.find(nominee[:id]).public_name names << ASF::Person.asciize(personname, nil) if personname list = names.uniq.map {|name| Regexp.escape(name)}.join('|')
(whimsy) branch master updated: Warning re proxy fails
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 96062ce9 Warning re proxy fails 96062ce9 is described below commit 96062ce97647f951a2824b5f179eb3c24c753a03 Author: Sebb AuthorDate: Wed Feb 21 19:54:39 2024 + Warning re proxy fails --- www/members/proxy.cgi | 13 +++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/www/members/proxy.cgi b/www/members/proxy.cgi index faa1565c..4c98b744 100755 --- a/www/members/proxy.cgi +++ b/www/members/proxy.cgi @@ -26,7 +26,7 @@ def emit_instructions(today, cur_mtg_dir, meeting) This form allows you to assign a proxy for the upcoming Member's Meeting on #{meeting_display}. If there is any chance you might not be able to attend the first part of the Member's Meeting on Tuesday in IRC, then -please assign a proxy, because that helps the meeting reach +please assign an attendance proxy, because that helps the meeting reach quorum more quickly - the meeting can't formally continue without quorum at the start. You can still attend the meeting if you want, and you can revoke a proxy at any time. @@ -106,6 +106,15 @@ def emit_form(cur_mtg_dir, meeting, volunteers, disabled) _form method: 'POST' do _div.form_group do _label 'Select proxy' +_b do + _p %{ +WARNING: If you select someone other than the Chair or Secretary (*), please note +that your proxy will not be counted if the person is unable to attend. } +end +_p %{ + (* The meeting will be postponed if the Chair and/or Secretary cannot attend) +} + # Fetch LDAP ldap_members = ASF.members @@ -139,7 +148,7 @@ def emit_form(cur_mtg_dir, meeting, volunteers, disabled) _ "IMPORTANT! Be sure to tell the person that you select as proxy above that you've assigned them to mark your attendance! They simply need to mark your proxy attendance when the meeting starts." _a 'Read full procedures for Member Meeting', href: 'https://www.apache.org/foundation/governance/members.html#meetings' end -_p 'Note that you cannot select a member who has provided a proxy' +_p 'Note that you cannot select a member who has nominated a proxy' _div.button_group.text_center do _button.btn.btn_primary 'Submit' end
(whimsy) branch master updated: Rework parsing to behave like steve-tools/seed-issues.py
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 1a9e3b00 Rework parsing to behave like steve-tools/seed-issues.py 1a9e3b00 is described below commit 1a9e3b00a1a1cae42db018e4bf7ef3956c2afd24 Author: Sebb AuthorDate: Wed Feb 21 19:30:10 2024 + Rework parsing to behave like steve-tools/seed-issues.py --- lib/whimsy/asf/member-files.rb | 87 +- 1 file changed, 52 insertions(+), 35 deletions(-) diff --git a/lib/whimsy/asf/member-files.rb b/lib/whimsy/asf/member-files.rb index 1f113e50..0c1a3b8e 100644 --- a/lib/whimsy/asf/member-files.rb +++ b/lib/whimsy/asf/member-files.rb @@ -12,9 +12,31 @@ module ASF NOMINATED_MEMBERS = 'nominated-members.txt' NOMINATED_BOARD = 'board_nominations.txt' -# N.B. Board does not include email -VALID_KEYS = ['Nominated by','Nomination Statement', 'Nominee email', 'Seconded by'] - +NAME2OUTPUTKEY = { # names (from Regex) and corresponding output keys + 'email' => 'Nominee email', + 'nomby' => 'Nominated by', + 'seconds' => 'Seconded by', + 'statement' => 'Nomination Statement', +} + +# Same as MEMBER_REGEX, but no and no +BOARD_REGEX = %r{ +\A(?(?[^:]+?):?)\r?\n +\s*Nominated\ by:\s*(?.*)\r?\n +\s*Seconded\ by:\s*(?.*?)\r?\n+ +\s*Nomination\ [sS]tatement:\s*?\r?\n+(?.*)\z +}mx + +# This Regex is very similar to the one in the script used to create ballots: +# https://svn.apache.org/repos/private/foundation/Meetings/steve-tools/seed-issues.py +MEMBER_REGEX = %r{ + \A(?(?:(?[-_.a-z0-9]+)\s+)?(?[^:]+?):?)\r?\n + \s*Nominee\ email:\s*(?.*)\r?\n + \s*Nominated\ by:\s*(?.*)\r?\n + \s*Seconded\ by:\s*(?.*?)\r?\n+ + \s*Nomination\ [sS]tatement:\s*?\r?\n+(?.*)\z + }mx + # get the latest meeting directory or nomination file def self.latest_meeting(name=nil) if name.nil? # we want the parent directory @@ -35,11 +57,19 @@ module ASF # Seconded by => array of seconders # Nomination Statement => array of text lines def self.parse_file(name) + case name + when NOMINATED_BOARD +regex = BOARD_REGEX + when NOMINATED_MEMBERS +regex = MEMBER_REGEX + else +raise ArgumentError.new "Unexpected name: #{name}" + end # N.B. The format has changed over the years. This is the syntax as of 2021. # - # # header line - #Nominee email: + #Nominee email: (not present in board file) #Nominated by: #Seconded by: @@ -54,45 +84,32 @@ module ASF # This is necessary to avoid issues with matching Regexes. File.open(nomfile, mode: 'rb:UTF-8') .map(&:scrub) -.slice_before(/^\s*---+--\s*/) +.slice_before(/^\s*-{35,60}\s*/) .drop(2) # instructions and sample block .each do |block| block.shift(1) # divider -block.shift(1) if block[0]&.strip == '' # Allow for missing blank line (last block is empty) nominee = {} header = nil -block -.slice_before(/^ +(\w+ \w+):\s*/) # split on the header names -.each_with_index do |para, idx| - if idx == 0 # id and name (or just name for board) -header = para.first.strip -raise ArgumentError.new "Unexpected start to entry after #{lastheader}: #{para}" unless header.size > 3 -lastheader = header +data = block.join.strip +next if data == '' +md = regex.match(data) +raise ArgumentError.new "Cannot parse #{data}" unless md +md.named_captures.each do |k, v| + case k + when 'header' +header = v + when 'header' +header = v + when 'uid', 'name' +# not currently used else -key, value = para.shift.strip.split(':', 2) -unless VALID_KEYS.include? key - raise ArgumentError.new "Invalid key name '#{key}' at '#{header}' in #{nomfile}" -end -if para.size == 0 # no more data to follow - nominee[key] = value -else - tmp = [value, para.map(&:chomp)].flatten.compact - tmp.pop if tmp[-1].empty? # drop trailing empty line only - nominee[key] = tmp -end - end -end - -unless header.nil? || header.empty? - keys = nominee.keys - case name - when NOMINATED_BOARD -raise ArgumentError.new "Expected 3 keys, found #{keys} at '#{header}' in #{name}" unless keys.size == 3 - when NOMINATED_MEMBERS -raise ArgumentError.new "Expected 4