Class: Snail

Inherits:
Object
  • Object
show all
Includes:
Initializable
Defined in:
lib/snail/constants.rb,
lib/snail.rb,
lib/snail/helpers.rb,
lib/snail/version.rb,
lib/snail/initializable.rb

Overview

TODO: carmen

Defined Under Namespace

Modules: Helpers, Initializable, Iso3166 Classes: UnknownAttribute, UnknownCountryError

Constant Summary collapse

REGIONS =
{
    # see http://en.wikipedia.org/wiki/Postcodes_in_Australia#Australia_States_and_territories
    :au => {
        'Australian Capital Territory' => 'ACT',
        'New South Wales' => 'NSW',
        'Victoria' => 'VIC',
        'Queensland' => 'QLD',
        'South Australia' => 'SA',
        'Western Australia' => 'WA',
        'Tasmania' => 'TAS',
        'Northern Territory' => 'NT'
    },
    # see http://en.wikipedia.org/wiki/Canadian_subnational_postal_abbreviations
    :ca => {
        'Alberta' => 'AB',
        'British Columbia' => 'BC',
        'Manitoba' => 'MB',
        'New Brunswick' => 'NB',
        'Newfoundland and Labrador' => 'NL',
        'Nova Scotia' => 'NS',
        'Northwest Territories' => 'NT',
        'Nunavut' => 'NU',
        'Ontario' => 'ON',
        'Prince Edward Island' => 'PE',
        'Quebec' => 'QC',
        'Saskatchewan' => 'SK',
        'Yukon' => 'YT'
    },
    # see http://www.columbia.edu/kermit/postal.html#usa
    # and http://www.usps.com/ncsc/lookups/usps_abbreviations.html
    :us => {
        'Alabama' => 'AL',
        'Alaska' => 'AK',
        'Arizona' => 'AZ',
        'Arkansas' => 'AR',
        'California' => 'CA',
        'Colorado' => 'CO',
        'Connecticut' => 'CT',
        'Delaware' => 'DE',
        'District Of Columbia' => 'DC',
        'Florida' => 'FL',
        'Georgia' => 'GA',
        'Hawaii' => 'HI',
        'Idaho' => 'ID',
        'Illinois' => 'IL',
        'Indiana' => 'IN',
        'Iowa' => 'IA',
        'Kansas' => 'KS',
        'Kentucky' => 'KY',
        'Louisiana' => 'LA',
        'Maine' => 'ME',
        'Maryland' => 'MD',
        'Massachusetts' => 'MA',
        'Michigan' => 'MI',
        'Minnesota' => 'MN',
        'Mississippi' => 'MS',
        'Missouri' => 'MO',
        'Montana' => 'MT',
        'Nebraska' => 'NE',
        'Nevada' => 'NV',
        'New Hampshire' => 'NH',
        'New Jersey' => 'NJ',
        'New Mexico' => 'NM',
        'New York' => 'NY',
        'North Carolina' => 'NC',
        'North Dakota' => 'ND',
        'Ohio' => 'OH',
        'Oklahoma' => 'OK',
        'Oregon' => 'OR',
        'Pennsylvania' => 'PA',
        'Rhode Island' => 'RI',
        'South Carolina' => 'SC',
        'South Dakota' => 'SD',
        'Tennessee' => 'TN',
        'Texas' => 'TX',
        'Utah' => 'UT',
        'Vermont' => 'VT',
        'Virginia' => 'VA',
        'Washington' => 'WA',
        'West Virginia' => 'WV',
        'Wisconsin' => 'WI',
        'Wyoming' => 'WY',

        # These are not states exactly, but they are addressed as states through USA
        'American Samoa' => 'AS',
        'Federated States Of Micronesia' => 'FM',
        'Guam' => 'GU',
        'Marshall Islands' => 'MH',
        'Northern Mariana Islands' => 'MP',
        'Palau' => 'PW',
        'Puerto Rico' => 'PR',
        'Virgin Islands' => 'VI',
        'Armed Forces Africa' => 'AE',
        'Armed Forces Americas (Except Canada)' => 'AA',
        'Armed Forces Canada' => 'AE',
        'Armed Forces Europe' => 'AE',
        'Armed Forces Middle East' => 'AE',
        'Armed Forces Pacific' => 'AP',
    },
    # http://en.wikipedia.org/wiki/Counties_of_Ireland
    # NB: only includes Replublic of Ireland, also no abbreviations
    :ie => {
        'Carlow' => 'Carlow',
        "Cavan" => 'Cavan',
        'Clare' => 'Clare',
        'Cork' => 'Cork',
        'Donegal' => 'Donegal',
        'Dublin' => 'Dublin',
        'Dún Laoghaire–Rathdown' => 'Dún Laoghaire–Rathdown',
        'Fingal' => 'Fingal',
        'Galway' => 'Galway',
        'Kerry' => 'Kerry',
        'Kildare' => 'Kildare',
        'Kilkenny' => 'Kilkenny',
        'Laois' => 'Laois',
        'Leitrim' => 'Leitrim',
        'Limerick' => 'Limerick',
        'Longford' => 'Longford',
        'Louth' => 'Louth',
        'Mayo' => 'Mayo',
        'Meath' => 'Meath',
        'Monaghan' => 'Monaghan',
        'Offaly' => 'Offaly',
        'Roscommon' => 'Roscommon',
        'Sligo' => 'Sligo',
        'South Dublin' => 'South Dublin',
        'Tipperary' => 'Tipperary',
        'Waterford' => 'Waterford',
        'Westmeath' => 'Westmeath',
        'Wexford' => 'Wexford',
        'Wicklow' => 'Wicklow',
    }
}
VERSION =
'2.0.0'

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Initializable

#initialize

Instance Attribute Details

#cityObject

Returns the value of attribute city.



22
23
24
# File 'lib/snail.rb', line 22

def city
  @city
end

#countryObject

Returns the value of attribute country.



25
26
27
# File 'lib/snail.rb', line 25

def country
  @country
end

#line_1Object

Returns the value of attribute line_1.



20
21
22
# File 'lib/snail.rb', line 20

def line_1
  @line_1
end

#line_2Object

Returns the value of attribute line_2.



21
22
23
# File 'lib/snail.rb', line 21

def line_2
  @line_2
end

#nameObject

My made-up standard fields.



19
20
21
# File 'lib/snail.rb', line 19

def name
  @name
end

#postal_codeObject

Returns the value of attribute postal_code.



24
25
26
# File 'lib/snail.rb', line 24

def postal_code
  @postal_code
end

#regionObject

Returns the value of attribute region.



23
24
25
# File 'lib/snail.rb', line 23

def region
  @region
end

Class Method Details

.home_countryObject



61
62
63
# File 'lib/snail.rb', line 61

def self.home_country
  @home_country ||= "US"
end

.home_country=(val) ⇒ Object



65
66
67
# File 'lib/snail.rb', line 65

def self.home_country=(val)
  @home_country = lookup_country_iso(val)
end

.load_helpersObject

Load the SnailHelpers module into ActionView::Base. Previously this was done automatically, but going forward it must be included explicitly by calling Snail.load_helpers.



54
55
56
57
58
59
# File 'lib/snail.rb', line 54

def self.load_helpers
  if defined? ActionView
    warn '[DEPRECATION] Snail::Helpers will be removed in a future release.'
    ActionView::Base.class_eval { include Snail::Helpers }
  end
end

.lookup_country_iso(val) ⇒ Object



69
70
71
72
73
74
75
76
77
78
79
80
81
# File 'lib/snail.rb', line 69

def self.lookup_country_iso(val)
  return nil if val.nil? || val.empty?
  val = val.upcase
  if ::Snail::Iso3166::ALPHA2[val]
    val
  elsif iso = ::Snail::Iso3166::ALPHA2_EXCEPTIONS[val]
    iso
  elsif iso = ::Snail::Iso3166::ALPHA3_TO_ALPHA2[val]
    iso
  else
    nil
  end
end

Instance Method Details

#city_lineObject

this method will get much larger. completeness is out of my scope at this time. currently it’s based on the sampling of city line formats from frank’s compulsive guide.



103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
# File 'lib/snail.rb', line 103

def city_line
  case country
  when 'CN', 'IN'
    "#{city}, #{region}  #{postal_code}"
  when 'BR'
    "#{postal_code} #{city}-#{region}"
  when 'MX', 'SK'
    "#{postal_code} #{city}, #{region}"
  when 'IT'
    "#{postal_code} #{city} (#{region})"
  when 'BY'
    "#{postal_code} #{city}-(#{region})"
  when 'US', 'CA', 'AU', nil, ""
    "#{city} #{region}  #{postal_code}"
  when 'IL', 'DK', 'FI', 'FR', 'DE', 'GR', 'NO', 'ES', 'SE', 'TR', 'CY', 'PT', 'MK', 'BA'
    "#{postal_code} #{city}"
  when 'KW', 'SY', 'OM', 'EE', 'LU', 'BE', 'IS', 'CH', 'AT', 'MD', 'ME', 'RS', 'BG', 'GE', 'PL', 'AM', 'HR', 'RO', 'AZ'
    "#{postal_code} #{city}"
  when 'NL'
    "#{postal_code}  #{city}"
  when 'IE'
    "#{city}, #{region}"
  when 'GB', 'RU', 'UA', 'JO', 'LB', 'IR', 'SA', 'NZ'
    "#{city}  #{postal_code}" # Locally these may be on separate lines. The USPS prefers the city line above the country line, though.
  when 'EC'
    "#{postal_code} #{city}"
  when 'HK', 'IQ', 'YE', 'QA', 'AL'
    "#{city}"
  when 'AE'
    "#{postal_code}\n#{city}"
  when 'JP'
    "#{city}, #{region}\n#{postal_code}"
  when 'EG', 'ZA', 'IM', 'KZ', 'HU'
    "#{city}\n#{postal_code}"
  when 'LV'
    "#{city}, LV-#{postal_code}"
  when 'LT'
    "LT-#{postal_code} #{city}"
  when 'SI'
    "SI-#{postal_code} #{city}"
  when 'CZ'
    "#{postal_code} #{region}\n#{city}"
  else
    if Kernel.const_defined?("Rails")
      Rails.logger.error "[Snail] Unknown Country: #{country}"
    end
    "#{city} #{region}  #{postal_code}"
  end
end

#country_lineObject



153
154
155
156
157
# File 'lib/snail.rb', line 153

def country_line
  if country and self.origin != country
    (translated_country(self.origin, country) || translated_country("US", country))
  end
end

#originObject

Where the mail is coming from. Defaults to the global ‘home_country`.



89
90
91
# File 'lib/snail.rb', line 89

def origin
  @origin ||= Snail.home_country
end

#origin=(val) ⇒ Object

Where the mail is coming from.



84
85
86
# File 'lib/snail.rb', line 84

def origin=(val)
  @origin = Snail.lookup_country_iso(val)
end

#to_htmlObject



97
98
99
# File 'lib/snail.rb', line 97

def to_html
  CGI.escapeHTML(to_s).gsub("\n", '<br />').html_safe
end

#to_sObject



93
94
95
# File 'lib/snail.rb', line 93

def to_s
  [name, line_1, line_2, city_line, country_line].select{|line| !(line.nil? or line.empty?)}.join("\n")
end

#translated_country(origin, country) ⇒ Object



159
160
161
162
# File 'lib/snail.rb', line 159

def translated_country(origin, country)
  path = File.join(File.dirname(File.expand_path(__FILE__)), "../assets/#{origin}.yml")
  File.read(path).match(/^#{country}: (.*)$/)[1]
end