Class: Iso3166::Coder

Inherits:
Object
  • Object
show all
Defined in:
lib/iso_3166.rb

Class Method Summary collapse

Class Method Details

.add_alias(code, name) ⇒ Object



99
100
101
102
103
104
105
# File 'lib/iso_3166.rb', line 99

def add_alias code, name
  if (data = for_code(code)) && data.name != name
    data.name_aliases ||= []
    data.name_aliases << name
    @countries[UnicodeUtils.upcase name] = data
  end
end

.for_code(code) ⇒ Object

Return ISO3166 data for a country code which could be of type 2 or 3, respectfully, 2 or 3 characters long, any case. For data format see Iso3166.for_name



56
57
58
# File 'lib/iso_3166.rb', line 56

def for_code code
  code.length == 2 ? @codes2[code.upcase] : @codes3[code.upcase]
end

.for_name(name) ⇒ OpenStruct

Return ISO3166 data for a given country name, which is case insensitive but should correspond to this standard’s names. There is no support for aliases or translations yet.

An OpenStruct instance with preset fields: data.name, data.code2, data.code3 and data.number which corresponds to the respective standard’s values e.g. Country, A 2, A 3, Number.

You can add more fields to this object (as it is an OpenStruct), it will be shared between all calls of for_name and for_code, unless import_iso3166 will be called, what will effectively reset all data objects to default state.

nil if there is no such country

Returns:

  • (OpenStruct)


50
51
52
# File 'lib/iso_3166.rb', line 50

def for_name name
  @countries[UnicodeUtils.upcase name]
end

.import_aliases(aliases) ⇒ Object

Just like import, same data, create aliases if need for the same codes



85
86
87
88
89
90
91
92
93
94
95
96
97
# File 'lib/iso_3166.rb', line 85

def import_aliases aliases
  aliases.each_line { |a|
    begin
      @@alias_rex ||= /(.*?)\s+([A-Z]{2})($|\s)/u
      name, code2 = a.match(@@alias_rex)[1..-1]
      name.strip!
      add_alias code2, name
    rescue
      puts "Can't process alias line: '#{a.chomp}'"
      raise
    end
  }
end

.import_iso3166(iso3166) ⇒ Object

Import country definitions file. The file format is as for Iso3166, see below. There is no need to call this method unless you want to override standard definitions in the file below.

Note that it will redefine all country data objects so all user-added fields would be lost.



66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
# File 'lib/iso_3166.rb', line 66

def import_iso3166 iso3166
 rex        = /(.*?)\s+([A-Z]{2})\s+([A-Z]{3})\s+(\d+)/
 @countries = { }
 @codes2    = { }
 @codes3    = { }
 @numbers   = { }

 iso3166.each_line { |s|
   name, code2, code3, number = s.match(rex)[1..-1]
    name.strip!
   data                       = OpenStruct.new name: name, code2: code2, code3: code3, number: number.to_i
   @countries[UnicodeUtils.upcase name]    = data
   @codes2[code2]             = data
   @codes3[code3]             = data
   @numbers[number]           = data
 }
end

.to_objcObject



107
108
109
110
111
112
113
114
# File 'lib/iso_3166.rb', line 107

def to_objc
  res = ["NSMutableDictionary* countries = @{"]
  @countries.values.each { |c|
    res << "    @\"#{c.code2}\" : @{ @\"name\" : @\"#{c.name}\", @\"code2\" : @\"#{c.code2}\", @\"code3\" : @\"#{c.code3}\" },"
  }
  res << "};"
  res.join "\n"
end