class Object

Public Class Methods

error(message) click to toggle source
# File lib/slurpy/slurpy.rb, line 94
def self.error(message)
  puts "ERROR: #{message}"
  exit 1
end
extract_date(date) click to toggle source
# File lib/slurpy/slurpy.rb, line 174
def self.extract_date(date)
  epoch_time_in_seconds = date
      .to_s
      .scan(%r(/Date\((\d+)\)/))
      .flatten.first.to_i / 1000

  Slurpy.error 'Failed to retrieve date from #{date}' unless epoch_time_in_seconds

  timezone = Timezone::Zone.new :zone => TIMEZONE

  timezone.time(Time.at(epoch_time_in_seconds)).strftime('%R')
end
from_cache(resource, lambda) click to toggle source
# File lib/slurpy/slurpy.rb, line 118
def self.from_cache(resource, lambda)
  APICache.get(resource, period: 1, cache: 10) do
    lambda.call
  end
end
get_route(route_num) click to toggle source
# File lib/slurpy/slurpy.rb, line 140
def self.get_route(route_num)
  Slurpy.from_cache "route::#{route_num}", lambda {
    infos = request(:routes)
      .select {|route| route['Description'].include? "(R#{route_num})" }

    Slurpy.error "No route 'R#{route_num}', sorry." unless infos.size == 1

    infos
  }
end
get_route_by_id(route_id) click to toggle source
# File lib/slurpy/slurpy.rb, line 169
def self.get_route_by_id(route_id)
  request(:routes)
    .select { |route| route['RouteID'] == route_id.to_i }.first
end
get_stop(query) click to toggle source
# File lib/slurpy/slurpy.rb, line 151
def self.get_stop(query)
  Slurpy.from_cache "stop::#{query}", lambda {
    infos = request(:stops)
      .select { |stop| stop['Description'].downcase.include? query.downcase }

    stops = infos.map{ |stop| stop['Description']}.to_set.to_a

    error = "No stop matches '#{query}', sorry." if stops.empty?

    #error = "Your request for stop '#{query}' is not specific enough. " \
    #        "Pick one: #{stops.inspect}" if stops.size > 1

    Slurpy.error error if error

    return infos, stops
  }
end
get_times() click to toggle source
# File lib/slurpy/slurpy.rb, line 136
def self.get_times
  request(:times)
end
invalidate_cache() click to toggle source
# File lib/slurpy/slurpy.rb, line 124
def self.invalidate_cache
  Moneta.new(:File, dir: CACHE_FOLDER).clear
end
request(resource) click to toggle source
# File lib/slurpy/slurpy.rb, line 128
def self.request(resource)
  Slurpy.from_cache "res::#{resource}", lambda {
    JSON.parse(
      Typhoeus.get("#{BASE_URL}#{RESOURCES[resource]}")
        .response_body)
  }
end
shuttles_for_stop(stop) click to toggle source
# File lib/slurpy/slurpy.rb, line 99
def self.shuttles_for_stop(stop)
  stops_info, stop_name = get_stop(stop)

  stop_ids = stops_info.map { |stop_info| stop_info['RouteStopID'] }

  shuttles = get_times
    .select do |time|
      stop_ids.include? time['RouteStopID']
    end
    .inject({}) do |route_to_stop_times, times|
      route_to_stop_times.update(
        times['RouteID'] => extract_date(times['StopTimes']
                                          .first['DepartureTime'])
      )
    end

  return shuttles, stop_name
end