diff --git a/redis-with-ruby/Gemfile b/redis-with-ruby/Gemfile index 6fa949b..4d64c99 100644 --- a/redis-with-ruby/Gemfile +++ b/redis-with-ruby/Gemfile @@ -3,3 +3,4 @@ source :rubygems gem 'fastercsv' gem 'hiredis' gem 'redis' +gem 'slop' diff --git a/redis-with-ruby/Gemfile.lock b/redis-with-ruby/Gemfile.lock index 1f16c74..b7847a9 100644 --- a/redis-with-ruby/Gemfile.lock +++ b/redis-with-ruby/Gemfile.lock @@ -4,6 +4,7 @@ GEM fastercsv (1.5.4) hiredis (0.4.4) redis (2.2.2) + slop (3.0.4) PLATFORMS ruby @@ -12,3 +13,4 @@ DEPENDENCIES fastercsv hiredis redis + slop diff --git a/redis-with-ruby/earthquakes.rb b/redis-with-ruby/earthquakes.rb index a02ff70..ab05852 100644 --- a/redis-with-ruby/earthquakes.rb +++ b/redis-with-ruby/earthquakes.rb @@ -9,46 +9,73 @@ require 'open-uri' class Earthquakes DATA_URL = 'http://earthquake.usgs.gov/earthquakes/catalogs/eqs7day-M1.txt' + attr_accessor :id_set, :region_set + def initialize @redis = Redis.new + @id_set = 'earthquakes' + @region_set = 'earthquake-regions' + @logger = Logger.new(STDOUT) @logger.formatter = proc do |severity, datetime, progname, msg| "#{datetime}: #{msg}\n" end end - def load_data - open(DATA_URL) do |f| - CSV.parse(f.read, :headers => true) do |row| - @redis.multi do |r| - @logger.info("Adding earthquake #{row['Eqid']}") - r.sadd('earthquakes', row['Eqid']) - row.headers.each do |header| - r.hset("eqid:#{row['Eqid']}", header, row[header]) - end - end - end + def get_info(earthquake_id) + if not /^eqid:/.match(earthquake_id) + earthquake_id = "eqid:#{earthquake_id}" end + + @redis.hgetall(earthquake_id) + end + + def all_ids + @redis.smembers(@id_set).map { |i| i.gsub(/^eqid:/, '') } + end + + def all_regions + @redis.smembers(@region_set).map { |r| r.gsub(/^eqregion:/, '') } end - def dump_data - @redis.smembers('earthquakes').each do |eqid| - @logger.info( - "Earthquake #{eqid} 'Src': #{ - @redis.hget("eqid:#{eqid}", 'Src')}" - ) + def drop_all + @logger.info('Removing data for each earthquake') + all_ids.each do |i| + @logger.info("Removing data for earthquake #{i.gsub(/^eqid:/, '')}") + @redis.del(i) end + + @logger.info('Removing earthquake id set') + @redis.del(@id_set) + + @logger.info('Removing earthquake region set') + @redis.del(@region_set) end -end + def load_data + data = CSV.parse( + open(DATA_URL).read, :headers => true, :header_converters => [:symbol] + ) + + data.each do |row| + @redis.multi do |r| + @logger.info("Adding earthquake #{row[:eqid]}") + key = "eqid:#{row[:eqid].downcase}" + r.sadd(@id_set, key) + row.headers.each do |header| + r.hset(key, header.downcase, row[header]) + end + + region_key = "eqregion:#{row[:region].downcase}" -def main - eq = Earthquakes.new - eq.load_data - eq.dump_data + r.sadd(region_key, key) + r.sadd(@region_set, region_key) + end + end + end end if $0 == __FILE__ - main + Earthquakes.new.send(ARGV.first) end diff --git a/redis-with-ruby/eq-info b/redis-with-ruby/eq-info new file mode 100755 index 0000000..a60c211 --- /dev/null +++ b/redis-with-ruby/eq-info @@ -0,0 +1,43 @@ +#!/usr/bin/env ruby + +require 'slop' + +require File.expand_path('../earthquakes', __FILE__) + + +def main + opts = Slop.parse(:help => true, :strict => true) do + banner "#{File.basename(__FILE__)} [options]" + on :l, :listall, 'List all available earthquake ids.' + on :r, :listall_by_region, 'List available earthquakes by region' + #on :l, :'list-by-region', 'List available earthquakes by region' + #on :L, :'list-by-magnitude', 'List available earthquakes by magnitude' + #on :r, :region=, 'Show earthquakes for region' + #on :m, :magnitude=, 'Show earthquakes of magnitude' + on :i, :eqid=, 'Show all available info for earthquake with id.' + end + + earthquakes = Earthquakes.new + + if opts.listall? + earthquakes.all_ids.each { |i| puts i } + return 0 + end + + if opts.listall_by_region? + earthquakes.all_regions.each { |r| puts r } + return 0 + end + + puts "Earthquake with id of #{opts[:eqid]}" + earthquakes.get_info(opts[:eqid]).each do |key, value| + puts " #{key}: #{value}" + end + + return 0 +end + + +if $0 == __FILE__ + exit(main) +end