require 'time'
module Gares
# Represents a stop for a train from http://www.sncf.com/fr/horaires-info-trafic/train
class TrainStop
# @!attribute departure_date
# @return [Time] The scheduled departure date at this stop.
# @!attribute real_departure_date
# @return [Time] The live schedule departure date at this stop.
# @!attribute arrival_date
# @return [Time] The scheduled arrival date at this stop.
# @!attribute real_arrival_date
# @return [Time] The live schedule departure date at this stop.
# @!attribute station
# @return [Station] The station in which this train is stopping.
# @!attribute platform
# @return [String] The platform number/letter if available.
# @!attribute formatted_info
# @return [String] A formatted detailed information in HTML.
attr_accessor :departure_date, :real_departure_date, :arrival_date, :real_arrival_date,
:station, :platform, :formatted_info
# Given the HTML node from sncf.com/fr/horaires-info-trafic/train containing the stop
# and the +date+ for this train stop.
# The object gathers all useful information about the stop made by the train.
def initialize(nokogiri_node, date)
initialize_dates(nokogiri_node, date)
initialize_station(nokogiri_node)
@platform = nokogiri_node.at('td.track').inner_html.strip
@formatted_info = nokogiri_node.at('td.info').inner_html.strip
end
def delayed?
minutes_of_delay > 0
end
# @return [Integer] The amount of minutes of delay at this stop.
def minutes_of_delay
if @real_departure_date
(@real_departure_date - @departure_date) / 60
else
0
end
end
private
def initialize_dates(node, date)
raw_time = node.at('td.time').inner_html.strip
raw_real_time = node.at('td.new-schedule').inner_html.strip
raw_arrival_time = raw_time.split('
').first
raw_departure_time = raw_time.split('
').last
raw_real_arrival_time = raw_real_time.split('
').first
raw_real_departure_time = raw_real_time.split('
').last
@departure_date = Time.parse(raw_departure_time, date)
@arrival_date = Time.parse(raw_arrival_time, date)
if raw_real_departure_time
@real_departure_date = Time.parse(raw_real_departure_time, date)
end
if raw_real_arrival_time
@real_arrival_date = Time.parse(raw_real_arrival_time, date)
end
end
def initialize_station(node)
raw_name = node.at('td.stations div.station').inner_html.strip
stations = Station.search(raw_name)
@station = if stations.size > 1
stations.find do |station|
name = /(^#{raw_name}$|^#{raw_name} | #{raw_name}$| #{raw_name} )/i
station.name.match(name)
end
else
stations.first
end
end
end
end