lib/mainstreet.rb in mainstreet-0.1.0 vs lib/mainstreet.rb in mainstreet-0.2.0

- old
+ new

@@ -1,95 +1,22 @@ -require "mainstreet/version" +# dependencies require "geocoder" -module Mainstreet - class << self - attr_writer :lookup +# modules +require "mainstreet/address_verifier" +require "mainstreet/version" - def lookup - @lookup ||= begin - if ENV["SMARTY_STREETS_AUTH_ID"] && ENV["SMARTY_STREETS_AUTH_TOKEN"] - Geocoder.config[:smarty_streets] ||= {api_key: [ENV["SMARTY_STREETS_AUTH_ID"], ENV["SMARTY_STREETS_AUTH_TOKEN"]]} - end - Geocoder.config[:smarty_streets] ? :smarty_streets : nil - end - end - end +if ENV["SMARTY_STREETS_AUTH_ID"] + Geocoder.config[:smarty_streets] ||= { + api_key: [ + ENV["SMARTY_STREETS_AUTH_ID"], + ENV["SMARTY_STREETS_AUTH_TOKEN"] + ] + } +end - module Model - def acts_as_address(_options = {}) - class_eval do - serialize :original_attributes - serialize :verification_info - - validates :street, presence: true - validate :verify_address, if: -> { address_fields_changed? } - before_save :standardize_address, if: -> { address_fields_changed? } - - def verify_address - if zip_code.blank? && (city.blank? || state.blank?) - errors.add(:base, "Address can't be confirmed") - end - if errors.empty? - @verification_result = fetch_verification_info - if @verification_result - if @verification_result.respond_to?(:analysis) - case @verification_result.analysis["dpv_match_code"] - when "N" - errors.add(:base, "Address can't be confirmed") - when "S" - errors.add(:base, "Apartment or suite can't be confirmed") - when "D" - errors.add(:base, "Apartment or suite is missing") - end - end - - correct_zip_code = @verification_result.postal_code - if zip_code != correct_zip_code - errors.add(:base, "Did you mean #{correct_zip_code}?") - end - else - errors.add(:base, "Address can't be confirmed") - end - end - errors.full_messages - end - - def standardize_address - result = @verification_result - if result - info = result.data - self.original_attributes = attributes.slice(*address_fields) - self.verification_info = result.data.to_hash - self.street = - if result.respond_to?(:delivery_line_1) - result.delivery_line_1 - else - result.formatted_address.split(",").first - end - self.street2 = nil - self.city = result.city - self.state = result.state_code - self.zip_code = result.postal_code - self.latitude = result.latitude - self.longitude = result.longitude - end - true - end - - def fetch_verification_info - Geocoder.search("#{street} #{street2} #{city}, #{state} #{zip_code}", lookup: Mainstreet.lookup).first - end - - def address_fields_changed? - address_fields.any? { |f| send("#{f}_changed?") } - end - - def address_fields - attributes.keys & %w(street street2 city state zip_code) - end - end - end +if defined?(ActiveSupport.on_load) + ActiveSupport.on_load(:active_record) do + require "mainstreet/model" + extend MainStreet::Model end end - -ActiveRecord::Base.send(:extend, Mainstreet::Model) if defined?(ActiveRecord)