Class: IERail

Inherits:
Object
  • Object
show all
Defined in:
lib/ierail.rb

Defined Under Namespace

Classes: IERailGet

Constant Summary collapse

URL =
"http://api.irishrail.ie/realtime/realtime.asmx"

Instance Method Summary collapse

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

#method_missing(name, *args, &block) ⇒ Object

Get direction-specific train information for a particular station, by station name. This gives data on trains through that station Returns array of StationData objects, and each obj looks like the one for IERail#station Returns empty array if no data.



186
187
188
189
190
191
192
193
194
195
# File 'lib/ierail.rb', line 186

def method_missing(name, *args, &block)
  # Only handle *bound_from (e.g northbound_from / southbound_from)
  if name =~ /bound_from/
    direction = name.to_s.split('_').first.capitalize

    ier = IERailGet.new("getStationDataByNameXML?StationDesc=#{args.first}", "arrayofobjstationdata", "objstationdata")
   
    ier.response.select { |sd| sd['Direction'] == direction }.map { |sd| StationData.new(sd) }
  end
end

Instance Method Details

#find_station(partial) ⇒ Object

Find station codes and descriptions using a partial string to match the station name Returns an array of Structs that each respond to {

  struct#name => "Sandycove",
  struct#description => "Glasthule (Sandycove)",
  struct#code => "SCOVE"
}

or an empty array if no matches.



169
170
171
172
173
174
175
176
177
178
# File 'lib/ierail.rb', line 169

def find_station(partial)
  ier = IERailGet.new("getStationsFilterXML?StationText=#{partial}", "ArrayOfObjStationFilter", "objStationFilter")
  Struct.new("Station", :name, :description, :code)
  
  ier.response.map do |st|
     Struct::Station.new(st['StationDesc_sp'],
                         st['StationDesc'],
                         st['StationCode'])
  end
end

#station(name) ⇒ Object

Get train information for a particular station, by station name. This gives data on trains thru that station Returns array of StationData objects, and each object responds to

obj#server_time => 2012-01-20T10:03:33.777,
obj#train_code => "E909",
obj#name / obj#station_name => "Glenageary",
obj#code / obj#station_code => "GLGRY",
obj#query_time => 10:03:33,
obj#train_date => 20 Jan 2012,
obj#origin => {:name => "Bray", :time => 09:55
obj#destination => => "Howth", :time => 11:03
obj#status => "En Route",
obj#last_location => "Arrived Killiney",
obj#due_in => 6,
obj#minutes_early => 0,
obj#minutes_late => 0,
obj#on_time? => true / false,
obj#early? => true / false,
obj#late? => true / false,
obj#arrival => => 10:09, :expected => 10:09
obj#departure => => 10:09, :expected => 10:09
obj#direction => "Northbound",
obj#train_type => "DART",

} Returns empty array if no data.



123
124
125
126
127
# File 'lib/ierail.rb', line 123

def station(name)
  ier = IERailGet.new("getStationDataByNameXML?StationDesc=#{name}", "arrayofobjstationdata", "objstationdata")
  
  ier.response.map { |sd| StationData.new(sd) }
end

#station_times(name, mins) ⇒ Object

Get train information for a particular station, by station name, within the time period in minutes from now. This gives data on trains thru that station. Returns array of StationData objects, and each obj looks like the one for IERail#station Will return an empty array if no information.



134
135
136
137
138
# File 'lib/ierail.rb', line 134

def station_times(name, mins)
  ier = IERailGet.new("getStationDataByNameXML_withNumMins?StationDesc=#{name}&NumMins=#{mins}", "arrayofobjstationdata", "objstationdata")
  
  ier.response.map { |sd| StationData.new(sd) }
end

#stationsObject

Get ALL the stations! Returns array of Station objects, and each object responds to {

  obj#name => "Belfast Central",
  obj#location => [-5.91744, 54.6123]
  obj#code => "BFSTC",
  obj#id => 228
}

Returns empty array if no data, but that would be odd.



73
74
75
76
77
# File 'lib/ierail.rb', line 73

def stations
  ier = IERailGet.new("getAllStationsXML?", "arrayofobjstation", "objstation")
  
  ier.response.map { |s| Station.new(s) }
end

#train_movements(code, date = Time.now) ⇒ Object

Get the movements of a particular train, by train code, on a date.

If no date is supplied assume train has run/is running today.

This gives all the stations that the train has or will be stopped at. Returns an array of TrainMovement objects, and each object responds to

obj#location => {code: "GLGRY", name: "Glenageary", stop_number: 1 (Stop number on route), type: "O" (Origin) \ "S" (Stop) \ "D" (Destination)
obj#train => => "E909", :date => 20 Jan 2012, :origin => "Glenageary"
obj#arrival => => 10:09, :expected => 10:09, :actual => 10.09
obj#departure => => 10:09, :expected => 10:09, :actual => 10.09
obj#station => "Glenageary"

} Returns empty array if no data.



154
155
156
157
158
# File 'lib/ierail.rb', line 154

def train_movements(code, date=Time.now)
  ier = IERailGet.new("getTrainMovementsXML?TrainId=#{code}&TrainDate=#{date.strftime("%d/%m/%Y")}", "ArrayOfObjTrainMovements", "ObjTrainMovements")
  
  ier.response.map{ |tm| TrainMovement.new(tm) }
end

#trainsObject

Get ALL the trains! That are on the go at the moment. Returns array of Train objects, and each object responds to

{
  obj#status => "R",
  obj#location => [-6.23929, 53.3509]
  obj#code =>  "D303",
  obj#date => 20 Jan 2012,
  obj#message => "D303\\n09:30 - Docklands to M3 Parkway (1 mins late)\\nDeparted Docklands next stop Broombridge",
  obj#direction => "Northbound"
}

Returns empty array if no data



91
92
93
94
95
# File 'lib/ierail.rb', line 91

def trains
  ier = IERailGet.new("getCurrentTrainsXML?", "arrayofobjtrainpositions", "objtrainpositions")
  
  ier.response.map { |t| Train.new(t) }
end