lib/dialable.rb in dialable-0.1.1 vs lib/dialable.rb in dialable-0.5.0

- old
+ new

@@ -1,11 +1,11 @@ -# Copyright (c) 2008-2010 Chris Horn http://chorn.com/ +# Copyright (c) 2008-2011 Chris Horn http://chorn.com/ # See MIT-LICENSE.txt -# TODO: Make this less sucky. - require "yaml" +require "tzinfo" +require 'rubygems' module Dialable class NANP ## @@ -27,11 +27,11 @@ 911 => "Emergency" } end ## - # Regex's to match valid phone numbers + # Regexs to match valid phone numbers module Patterns VALID = [ /^\D*1?\D*([2-9]\d\d)\D*(\d{3})\D*(\d{4})\D*[ex]+\D*(\d{1,5})\D*$/i, /^\D*1?\D*([2-9]\d\d)[ $\\\.-]*(\d{3})[ $\\\.-]*(\d{4})[ $\\\.\*-]*(\d{1,5})\D*$/i, /^\D*1?\D*([2-9]\d\d)\D*(\d{3})\D*(\d{4})\D*$/, @@ -42,14 +42,16 @@ end ## # Valid area codes per nanpa.com module AreaCodes - NANP = YAML.load_file(File.dirname(__FILE__) + "/../support/nanpa.yaml") + data_path = Gem::datadir('dialable') + data_path ||= File.join(File.dirname(__FILE__), '..', 'data') + NANP = YAML.load_file(data_path + "/nanpa.yaml") end - attr_accessor :areacode, :prefix, :line, :extension, :location, :country, :timezones, :relative_timezones + attr_accessor :areacode, :prefix, :line, :extension, :location, :country, :timezones, :relative_timezones, :raw_timezone def initialize(parts={}) self.areacode = parts[:areacode] ? parts[:areacode] : nil self.prefix = parts[:prefix] ? parts[:prefix] : nil self.line = parts[:line] ? parts[:line] : nil @@ -60,27 +62,28 @@ code = raw_code.to_i if AreaCodes::NANP[code] @areacode = raw_code self.location = AreaCodes::NANP[code][:location] if AreaCodes::NANP[code][:location] self.country = AreaCodes::NANP[code][:country] if AreaCodes::NANP[code][:country] + self.raw_timezone = AreaCodes::NANP[code][:timezone] if AreaCodes::NANP[code][:timezone] if AreaCodes::NANP[code][:timezone] self.timezones = [] self.relative_timezones = [] tz = AreaCodes::NANP[code][:timezone] - t = Time.now - local_utc_offset = t.utc_offset/3600 + now = Time.now + local_utc_offset = now.utc_offset/3600 if tz =~ /UTC(-\d+)/ self.timezones << tz utc_offset = $1.to_i self.relative_timezones << (utc_offset) - local_utc_offset else tz.split(//).each do |zone| # http://www.timeanddate.com/library/abbreviations/timezones/na/ zone = "HA" if zone == "H" zone = "AK" if zone == "K" - tz = zone + (t.dst? ? "D" : "S") + "T" # This is cludgey + tz = zone + (now.dst? ? "D" : "S") + "T" # This is cludgey self.timezones << tz delta = nil if Time.zone_offset(tz) delta = Time.zone_offset(tz)/3600 - local_utc_offset else @@ -92,11 +95,11 @@ when /A?K[SD]T/ delta = -9 - local_utc_offset when /HA?[SD]T/ delta = -10 - local_utc_offset end - delta = delta - 1 if t.dst? + delta = delta - 1 if delta and now.dst? end # puts "#{delta} // #{Time.zone_offset(tz)} // #{tz} // #{local_utc_offset}" self.relative_timezones << delta if delta end end @@ -119,10 +122,9 @@ # @timezones.each do |tz| # rt << # end # rt # end - def self.parse(number) Patterns::VALID.each do |pattern| return Dialable::NANP.new(:areacode => $1, :prefix => $2, :line => $3, :extension => $4) if number =~ pattern end