class Trippyplan::Trippyplan

Public Class Methods

new(days, tsv: nil, advisor: nil) click to toggle source
# File lib/trippyplan.rb, line 10
def initialize(days, tsv: nil, advisor: nil)
  @days = days
  if tsv
    @addresses = File.read(tsv).split("\n").map{|x| x.split("\t")}.map{|x| {x[0] => x[1]}}.reduce(:merge)
    @addresses = addresses_to_coords(@addresses)
  end
  if advisor && advisor[:list]
    headers = YAML.load_file(advisor[:headers])
    abort "Your cookie file does not contain the necessary info. See README for example" unless (['cookie', 'js_security_token'] - headers.keys).empty?
    body = RestClient.get("https://www.tripadvisor.com/data/1.0/trips/list/#{advisor[:list]}",
                   {
                    :Cookie => headers['cookie'],
                    'X-Requested-By' => headers['js_security_token'],
                    }
                  )
    @addresses = advisor_to_coords(body)
  end
end

Public Instance Methods

clusterize() click to toggle source
# File lib/trippyplan.rb, line 29
def clusterize
  kmeans = KMeansClusterer.run @days, @addresses.values, labels: @addresses.keys, runs: 10
  kmeans.clusters
end

Private Instance Methods

addresses_to_coords(addresses) click to toggle source
# File lib/trippyplan.rb, line 44
def addresses_to_coords(addresses)
  addresses.map do |label, address|
    if coord = Geocoder.search(address).first
      { label => coord.data['geometry']['location'].values.map(&:to_f) }
    else
      abort "can't find coordinates of #{address}"
    end
  end.reduce(:merge)
end
advisor_to_coords(body) click to toggle source
# File lib/trippyplan.rb, line 36
def advisor_to_coords(body)
  json = JSON.parse(body)
  json['nodes'].map do |n|
    content = n['content']
    { content['name'] => [content['latitude'], content['longitude']].map(&:to_f) }
  end.reduce(:merge)
end