alexrabarts-iso_country_codes 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,34 @@
1
+ class IsoCountryCodes # :nodoc:
2
+ VERSION = '0.1.1'
3
+
4
+ class UnknownCodeError < StandardError; end
5
+
6
+ class << self
7
+ def all
8
+ Code.all
9
+ end
10
+
11
+ def find(code)
12
+ code = code.to_s.upcase
13
+ instance = nil
14
+
15
+ if code.match(/^\d{2}$/)
16
+ code = "0#{code}" # Make numeric codes three digits
17
+ end
18
+
19
+ if code.match(/^\d{3}$/)
20
+ instance = all.select { |c| c.numeric == code }.first
21
+ elsif code.match(/^[A-Z]{2}$/)
22
+ instance = all.select { |c| c.alpha2 == code }.first
23
+ elsif code.match(/^[A-Z]{3}$/)
24
+ instance = all.select { |c| c.alpha3 == code }.first
25
+ else
26
+ instance = all.select { |c| c.name.upcase == code }.first
27
+ end
28
+
29
+ raise UnknownCodeError, "ISO 3166-1 code '#{code}' does not exist." if instance.nil?
30
+
31
+ instance
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,7 @@
1
+ # Only works on unixy type systems.
2
+ # http://blog.behindlogic.com/2008/10/auto-generate-your-manifest-and-gemspec.html
3
+ desc 'Rebuild manifest and gemspec.'
4
+ task :cultivate do
5
+ system %q{touch Manifest.txt; rake check_manifest | grep -v "(in " | patch}
6
+ system %q{rake debug_gem | grep -v "(in " > `basename \`pwd\``.gemspec}
7
+ end
@@ -0,0 +1,13 @@
1
+ namespace :update do
2
+ desc 'Create ISO 3166-1 code classes from Wikipedia ISO 3166-1 tables.'
3
+ task :codes do
4
+ dirname = File.dirname(__FILE__)
5
+ gen = File.join(dirname, %w{iso_3166_1.rb})
6
+ lib = File.expand_path(File.join(dirname, %w{.. lib iso_country_codes iso_3166_1.rb}))
7
+ require gen
8
+ modules = IsoCountryCodes::Task::UpdateCodes.get
9
+ File.open(lib, File::CREAT | File::TRUNC | File::WRONLY) do |f|
10
+ f.write modules
11
+ end
12
+ end
13
+ end # :currency
@@ -0,0 +1,44 @@
1
+ require 'hpricot'
2
+ require 'open-uri'
3
+ require 'erubis'
4
+
5
+ class IsoCountryCodes
6
+ module Task
7
+ module UpdateCodes
8
+ def self.get
9
+ doc = Hpricot(open('http://en.wikipedia.org/wiki/ISO_3166-1').read)
10
+ codes = {}
11
+ td_map = {
12
+ :name => 0,
13
+ :numeric => 1,
14
+ :alpha3 => 2,
15
+ :alpha2 => 3
16
+ }
17
+ code_labels = td_map.keys
18
+ doc.search('.wikitable.sortable:first tr').each do |row|
19
+ value_hash = {}
20
+ code_labels.each do |key|
21
+ selector = "td:nth-of-type(#{td_map[key]})"
22
+ selector << ' a' if key == :name
23
+ value = row.search(selector).inner_text.strip
24
+ next if value == ''
25
+ value_hash[key] = value
26
+ if value_hash.length == code_labels.length
27
+ value_hash.keys.each do |value_hash_key|
28
+ codes[value_hash[value_hash_key]] = value_hash if value_hash_key == :alpha3
29
+ end
30
+ end
31
+ end
32
+ end
33
+
34
+ to_ruby(codes) if codes
35
+ end
36
+
37
+ def self.to_ruby(codes)
38
+ tmpl = File.read(File.join(File.dirname(__FILE__), 'iso_3166_1.rb.erb'))
39
+ eruby = Erubis::Eruby.new(tmpl)
40
+ eruby.result(:codes => codes)
41
+ end
42
+ end # UpdateCodes
43
+ end # Task
44
+ end # IsoCountryCodes
@@ -0,0 +1,13 @@
1
+ class IsoCountryCodes
2
+ class Code
3
+ <% codes.keys.each do |code| -%>
4
+ class <%= code.upcase %> < Code #:nodoc:
5
+ self.numeric = %q{<%= codes[code][:numeric] %>}
6
+ self.name = %q{<%= codes[code][:name] %>}
7
+ self.alpha2 = %q{<%= codes[code][:alpha2] %>}
8
+ self.alpha3 = %q{<%= codes[code][:alpha3] %>}
9
+ end
10
+ <% end -%>
11
+ end # end Code
12
+ end # IsoCountryCodes
13
+
@@ -0,0 +1,70 @@
1
+ require 'test/unit'
2
+ require 'iso_country_codes'
3
+
4
+ class TestIsoCountryCodes < Test::Unit::TestCase
5
+ def test_find_with_numeric_as_two_digit_string
6
+ assert_equal IsoCountryCodes::Code::AUS.instance, IsoCountryCodes.find('36')
7
+ end
8
+
9
+ def test_find_with_numeric_as_three_digit_string
10
+ assert_equal IsoCountryCodes::Code::AUS.instance, IsoCountryCodes.find('036')
11
+ end
12
+
13
+ def test_find_with_numeric_as_integer
14
+ assert_equal IsoCountryCodes::Code::AUS.instance, IsoCountryCodes.find(36)
15
+ end
16
+
17
+ def test_find_with_lowercase_alpha2
18
+ assert_equal IsoCountryCodes::Code::AUS.instance, IsoCountryCodes.find('au')
19
+ end
20
+
21
+ def test_find_with_uppercase_alpha2
22
+ assert_equal IsoCountryCodes::Code::AUS.instance, IsoCountryCodes.find('AU')
23
+ end
24
+
25
+ def test_find_with_lowercase_alpha3
26
+ assert_equal IsoCountryCodes::Code::AUS.instance, IsoCountryCodes.find('aus')
27
+ end
28
+
29
+ def test_find_with_uppercase_alpha3
30
+ assert_equal IsoCountryCodes::Code::AUS.instance, IsoCountryCodes.find('AUS')
31
+ end
32
+
33
+ def test_find_with_lowercase_name
34
+ assert_equal IsoCountryCodes::Code::AUS.instance, IsoCountryCodes.find('australia')
35
+ end
36
+
37
+ def test_find_with_uppercase_name
38
+ assert_equal IsoCountryCodes::Code::AUS.instance, IsoCountryCodes.find('AUSTRALIA')
39
+ end
40
+
41
+ def test_find_with_mixed_case_name
42
+ assert_equal IsoCountryCodes::Code::AUS.instance, IsoCountryCodes.find('Australia')
43
+ end
44
+
45
+ def test_get_numeric
46
+ assert_equal '036', IsoCountryCodes::Code::AUS.numeric
47
+ assert_equal '036', IsoCountryCodes::Code::AUS.instance.numeric
48
+ end
49
+
50
+ def test_get_alpha2
51
+ assert_equal 'AU', IsoCountryCodes::Code::AUS.alpha2
52
+ assert_equal 'AU', IsoCountryCodes::Code::AUS.instance.alpha2
53
+ end
54
+
55
+ def test_get_alpha3
56
+ assert_equal 'AUS', IsoCountryCodes::Code::AUS.alpha3
57
+ assert_equal 'AUS', IsoCountryCodes::Code::AUS.instance.alpha3
58
+ end
59
+
60
+ def test_get_name
61
+ assert_equal 'Australia', IsoCountryCodes::Code::AUS.name
62
+ assert_equal 'Australia', IsoCountryCodes::Code::AUS.instance.name
63
+ end
64
+
65
+ def test_unknown_iso_code
66
+ assert_raises IsoCountryCodes::UnknownCodeError do
67
+ IsoCountryCodes.find('FOO')
68
+ end
69
+ end
70
+ end
metadata ADDED
@@ -0,0 +1,78 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: alexrabarts-iso_country_codes
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.1
5
+ platform: ruby
6
+ authors:
7
+ - Alex Rabarts
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2008-11-24 00:00:00 -08:00
13
+ default_executable:
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: hoe
17
+ version_requirement:
18
+ version_requirements: !ruby/object:Gem::Requirement
19
+ requirements:
20
+ - - ">="
21
+ - !ruby/object:Gem::Version
22
+ version: 1.8.2
23
+ version:
24
+ description: Provides ISO codes and names for countries.
25
+ email:
26
+ - alexrabarts@gmail.com
27
+ executables: []
28
+
29
+ extensions: []
30
+
31
+ extra_rdoc_files:
32
+ - History.txt
33
+ - Manifest.txt
34
+ - README.txt
35
+ files:
36
+ - History.txt
37
+ - Manifest.txt
38
+ - README.txt
39
+ - Rakefile
40
+ - iso_country_codes.gemspec
41
+ - lib/iso_country_codes.rb
42
+ - lib/iso_country_codes/code.rb
43
+ - lib/iso_country_codes/iso_3166_1.rb
44
+ - lib/iso_country_codes/iso_country_codes.rb
45
+ - rakelib/cultivate.rake
46
+ - rakelib/iso_3116_1.rake
47
+ - rakelib/iso_3166_1.rb
48
+ - rakelib/iso_3166_1.rb.erb
49
+ - test/test_iso_country_codes.rb
50
+ has_rdoc: true
51
+ homepage:
52
+ post_install_message:
53
+ rdoc_options:
54
+ - --main
55
+ - README.txt
56
+ require_paths:
57
+ - lib
58
+ required_ruby_version: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - ">="
61
+ - !ruby/object:Gem::Version
62
+ version: "0"
63
+ version:
64
+ required_rubygems_version: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: "0"
69
+ version:
70
+ requirements: []
71
+
72
+ rubyforge_project: iso_country_codes
73
+ rubygems_version: 1.2.0
74
+ signing_key:
75
+ specification_version: 2
76
+ summary: Provides ISO codes and names for countries.
77
+ test_files:
78
+ - test/test_iso_country_codes.rb