steventwheeler/clli

View on GitHub
Rakefile

Summary

Maintainability
Test Coverage
require 'bundler/gem_tasks'
require 'rake/testtask'
require 'yaml/store'
require 'csv'
require 'clli'

Rake::TestTask.new(:test) do |t|
  t.libs << 'test'
  t.libs << 'lib'
  t.test_files = FileList['test/**/*_test.rb']
end

task default: :test

namespace :generate do
  task :city_cache do
    data = {}
    CSV.foreach(input_file) do |row|
      prefix, city, state = row
      prefix = prefix.strip
      city = normalize_city(city)
      state = state.strip
      next if city.nil? || city.empty?
      next if city == 'Not Available'
      next unless /[A-Z]{2}/ =~ state
      next unless /(?<place>[A-Z\s]{4})(?<region>[A-Z]{2})/ =~ prefix
      place = place.strip
      region = region.strip
      data[region] ||= {}
      data[region][place] = {
        'city' => city,
        'state' => state
      }
    end

    output_file = CLLI::YAMLData.real_path(%w(clli data cities.yml))
    File.truncate(output_file, 0) if File.exist?(output_file)

    store = YAML::Store.new(output_file)
    store.transaction do
      data.each do |region, place_data|
        store[region] = place_data
      end
    end
  end
end

def input_file
  file = ENV['file']

  if file.nil?
    puts 'Please specify the file to import.'
    exit 1
  end
  unless File.exist?(file)
    puts "File #{file} does not exist."
    exit 1
  end
  file
end

def normalize_city(city)
  city.strip!
  city.downcase!
  city.gsub!('so.', 'south ')
  city.gsub!(/\s*(\(.*?\))/, ' \1')
  city.gsub!(/\(\s*(.*?)\s*\)/, '(\1)')
  city.gsub!(/\s+/, ' ')
  city.gsub!(/(\w+(?:'s)?)/, &:capitalize)
  city
end