blairand/event_reporter_final

View on GitHub
lib/event_reporter/save_to.rb

Summary

Maintainability
A
1 hr
Test Coverage
require 'json'
require 'csv'
require 'nokogiri'

module EventReporter
  class SaveTo
    def initialize(input,queue)
      @input = input
      @queue = queue
      @writer_contents = ""
      if @input == "event_attendees.csv" || @input == "save"
        puts "Saving to default_file.csv"
        @filename = 'default_file.csv'
        default_file = File.join(File.dirname(__FILE__),"../../files/default_filename.csv")
        write_csv(default_file)
      else
        default_file = File.join(File.dirname(__FILE__),"../../files/", @input)
        parse_user_input(default_file)
      end
    end

    def write_txt(filename)
      File.open(filename, "w") do |file|
        file.puts "id\tregdate\tfirst_name\tlast_name\temail_address\thomephone\tstreet\tcity\tstate\tzipcode"         
        @queue.each do |person|
          file.puts "#{person[:id]}\t#{person[:regdate]}\t#{person[:first_name].capitalize}\t#{person[:last_name].capitalize}\t#{person[:email]}\t#{person[:phone]}\t#{person[:street]}\t#{person[:city].capitalize}\t#{person[:state].upcase}\t#{person[:zipcode]}"
        end          
      end
      puts "Queue Saved to #{filename}"
    end

    def write_csv(filename)
      CSV.open(filename,'w') do |file|
        file << %w"id regdate first_name last_name email_address homephone street city state zipcode"         
        @queue.each do |person|
          file <<  [person[:id],person[:regdate],person[:first_name].capitalize,person[:last_name].capitalize,person[:email],person[:phone],person[:street],person[:city].capitalize,person[:state].upcase,person[:zipcode]]
        end
      end
      puts "Queue Saved to #{filename}"
    end

    def write_json(filename)
      begin
        puts @queue.to_json
        File.open(filename,"w") do |file|
          file.puts @queue.to_json
        end
        puts "Queue Saved to #{filename}"
      rescue
        puts "Cannot write to JSON"
      end
    end

    def write_xml(filename)    
      builder = Nokogiri::XML::Builder.new do |xml|
        xml.root {
          xml.event_attendees {
            @queue.each do |person|
              xml.attendee {
                xml.person_id person[:id]
                xml.registration_date person[:regdate]
                xml.first_name person[:first_name].capitalize
                xml.last_name person[:last_name].capitalize
                xml.email person[:email]
                xml.phone person[:phone]
                xml.address {
                  xml.street person[:street]
                  xml.city person[:city].capitalize
                  xml.state person[:state].upcase
                  xml.zipcode person[:zipcode]
                }
              }
            end
          }
        }
      end
      puts builder.to_xml  
      File.open(filename,"w") do |file|
        file.puts builder.to_xml
      end
      puts "Queue Saved to #{filename}"
    end
    
    def parse_user_input(input)
      filetype = input[-4..-1]
      if filetype == ".csv"
        write_csv(input)
      elsif filetype == "json"
        write_json(input)
      elsif filetype == ".txt"
        write_txt(input)
      elsif filetype == ".xml"
        write_xml(input)
      else
        puts "does not compute"
      end
    end     

  end
end