lib/voteatx/loader.rb:
lib/voteatx/loader.rb:

* Refactored way import data is acquired, adding a
  VotingPlacesLoader#col_id_to_index property and a CSV_Row#field_by_id
  method.

* Allow indexes in EARLY_VOTING_FIXED_HOURS[] to be matched by
  "#{code}|#{sitename}" as well as just "#{code}". Before we had to
  go into the spreadsheet and edit the code "V" locations with a code
  specific for that location (say "V1"). Now, we don't have to edit the
  spreadsheet, and just use an index such as "V|Dan Ruiz Public Library".

* The DEFAULT_COL_IDS values are now all arrays.

* Renamed VotingPlacesLoader#col_name property to
VotingPlacesLoader#col_id_to_names.

* New private methods init_col_id_to_idx_table() and add_row_methods().

* The cleanup_row() method now invokes add_row_methods(), to monkeypatch
  field_by_id() onto the row and initialize the index table.

* Dropped ensure_not_empty() method, because new field_by_id() method
  checks for empty values (by default).

* Fixed bug in get_date() where it was failing to parse single-digit
  months.

* Improved warning displayed by make_location() when it encounters
  inconsistent data.

* Changed load_evfixed_places(), to locate EARLY_VOTING_FIXED_HOURS[]
  records by either "#{code}" or "#{code}|#{sitename}".

open-austin/voteatx-svc,open-austin/voteatx-svc