class Amtrak::TrainParser

Will take in an JSON document as a hash and parse out the train schedule

Attributes

json[R]

Public Class Methods

new(json) click to toggle source
# File lib/amtrak/train_parser.rb, line 13
def initialize(json)
  @json = json
end
parse(json) click to toggle source
# File lib/amtrak/train_parser.rb, line 7
def self.parse(json)
  new(json).parse
end

Public Instance Methods

find_arrival_times(segment) click to toggle source
# File lib/amtrak/train_parser.rb, line 47
def find_arrival_times(segment)
  date, scheduled_time = segment['destinationScheduledArrivalDateTime'].split('T')
  estimated_arrival = segment['destinationEstimatedArrivalDateTime']
  _, estimated_time = estimated_arrival.split('T') if estimated_arrival
  status = segment['destinationStatusComment']

  {
    date: date,
    scheduled_time: format_time(scheduled_time),
    estimated_time: or_cancelled(format_time(estimated_time), status)
  }
end
find_departure_times(segment) click to toggle source
# File lib/amtrak/train_parser.rb, line 34
def find_departure_times(segment)
  date, scheduled_time = segment['originScheduledDepartureDateTime'].split('T')
  estimated_depart = segment['originEstimatedDepartureDateTime']
  _, estimated_time = estimated_depart.split('T') if estimated_depart
  status = segment['originStatusComment']

  {
    date: date,
    scheduled_time: format_time(scheduled_time),
    estimated_time: or_cancelled(format_time(estimated_time), status)
  }
end
parse() click to toggle source
# File lib/amtrak/train_parser.rb, line 17
def parse
  (json['journeys'] || [])
    .map(&method(:parse_journey))
    .compact
end
parse_journey(journey) click to toggle source
# File lib/amtrak/train_parser.rb, line 23
def parse_journey(journey)
  segment = journey['segments'].first
  return unless segment

  {
    number: segment['trainNumber'].to_i,
    departure: find_departure_times(segment),
    arrival: find_arrival_times(segment)
  }
end

Private Instance Methods

format_time(time) click to toggle source
# File lib/amtrak/train_parser.rb, line 70
def format_time(time)
  return unless time

  Time.parse(time).strftime('%l:%M %P')
end
or_cancelled(time, status) click to toggle source
# File lib/amtrak/train_parser.rb, line 62
def or_cancelled(time, status)
  if status == 'Canceled'
    'Canceled'
  else
    time
  end
end