iso_country_codes 0.2.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,36 @@
1
+ class IsoCountryCodes # :nodoc:
2
+ class UnknownCodeError < StandardError; end
3
+
4
+ class << self
5
+ def all
6
+ Code.all
7
+ end
8
+
9
+ def find(code, opts={})
10
+ code = code.to_s.upcase
11
+ instance = nil
12
+
13
+ if code.match(/^\d{2}$/)
14
+ code = "0#{code}" # Make numeric codes three digits
15
+ end
16
+
17
+ if code.match(/^\d{3}$/)
18
+ instance = all.select { |c| c.numeric == code }.first
19
+ elsif code.match(/^[A-Z]{2}$/)
20
+ instance = all.select { |c| c.alpha2 == code }.first
21
+ elsif code.match(/^[A-Z]{3}$/)
22
+ instance = all.select { |c| c.alpha3 == code }.first
23
+ else
24
+ instance = all.select { |c| c.name.upcase == code }.first
25
+ if opts[:fuzzy]
26
+ instance = all.select { |c| c.name.match(/^#{code}/i) }.first if instance.nil?
27
+ instance = all.select { |c| c.name.match(/#{code}/i) }.first if instance.nil?
28
+ end
29
+ end
30
+
31
+ raise UnknownCodeError, "ISO 3166-1 code '#{code}' does not exist." if instance.nil?
32
+
33
+ instance
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,7 @@
1
+ dir = File.dirname(__FILE__)
2
+ $LOAD_PATH << dir unless $LOAD_PATH.include?(dir)
3
+
4
+ require 'iso_country_codes/code'
5
+ require 'iso_country_codes/iso_3166_1'
6
+ require 'iso_country_codes/iso_4217'
7
+ require 'iso_country_codes/iso_country_codes'
@@ -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 :codes do
2
+ desc 'Create ISO 3166-1 code classes from Wikipedia ISO 3166-1 tables.'
3
+ task :update 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,51 @@
1
+ require 'nokogiri'
2
+ require 'open-uri'
3
+ require 'erubis'
4
+
5
+ class IsoCountryCodes
6
+ module Task
7
+ module UpdateCodes
8
+ def self.get
9
+ doc = Nokogiri::HTML.parse(open('http://en.wikipedia.org/wiki/ISO_3166-1'))
10
+ codes = {}
11
+ td_map = {
12
+ :name => 1,
13
+ :alpha2 => 2,
14
+ :alpha3 => 3,
15
+ :numeric => 4
16
+ }
17
+
18
+ code_labels = td_map.keys
19
+
20
+ doc.search('table.wikitable.sortable tr').each do |row|
21
+ value_hash = {}
22
+
23
+ code_labels.each do |key|
24
+ selector = "td:nth-of-type(#{td_map[key]})"
25
+ selector << ' a' if key == :name
26
+
27
+ value = row.search(selector).text.strip
28
+
29
+ next if value == ''
30
+
31
+ value_hash[key] = value
32
+
33
+ if value_hash.length == code_labels.length - 1
34
+ value_hash.keys.each do |value_hash_key|
35
+ codes[value_hash[value_hash_key]] = value_hash if value_hash_key == :alpha3
36
+ end
37
+ end
38
+ end
39
+ end
40
+
41
+ to_ruby(codes) if codes
42
+ end
43
+
44
+ def self.to_ruby(codes)
45
+ tmpl = File.read(File.join(File.dirname(__FILE__), 'iso_3166_1.rb.erb'))
46
+ eruby = Erubis::Eruby.new(tmpl)
47
+ eruby.result(:codes => codes)
48
+ end
49
+ end # UpdateCodes
50
+ end # Task
51
+ end # IsoCountryCodes
@@ -0,0 +1,15 @@
1
+ # encoding: utf-8
2
+
3
+ class IsoCountryCodes
4
+ class Code
5
+ <% codes.keys.each do |code| -%>
6
+ class <%= code.upcase %> < Code #:nodoc:
7
+ self.numeric = %q{<%= codes[code][:numeric] %>}
8
+ self.name = %q{<%= codes[code][:name] %>}
9
+ self.alpha2 = %q{<%= codes[code][:alpha2] %>}
10
+ self.alpha3 = %q{<%= codes[code][:alpha3] %>}
11
+ end
12
+ <% end -%>
13
+ end # end Code
14
+ end # IsoCountryCodes
15
+
@@ -0,0 +1,91 @@
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_fuzzy_find
46
+ assert_equal IsoCountryCodes::Code::GBR.instance, IsoCountryCodes.find('united', :fuzzy => true)
47
+ assert_raises IsoCountryCodes::UnknownCodeError do
48
+ IsoCountryCodes.find('united')
49
+ end
50
+ end
51
+
52
+ def test_get_main_currency
53
+ assert_equal 'AUD', IsoCountryCodes.find('AUS').main_currency
54
+ end
55
+
56
+ def test_currency_alias_method
57
+ code = IsoCountryCodes.find('AUS')
58
+ assert_equal code.main_currency, code.currency
59
+ end
60
+
61
+ def test_get_multiple_currencies
62
+ assert_equal IsoCountryCodes.find('ATA').currencies, %w{AUD GBP}
63
+ assert_equal IsoCountryCodes.find('AUS').currencies, %w{AUD}
64
+ end
65
+
66
+ def test_get_numeric
67
+ assert_equal '036', IsoCountryCodes::Code::AUS.numeric
68
+ assert_equal '036', IsoCountryCodes::Code::AUS.instance.numeric
69
+ end
70
+
71
+ def test_get_alpha2
72
+ assert_equal 'AU', IsoCountryCodes::Code::AUS.alpha2
73
+ assert_equal 'AU', IsoCountryCodes::Code::AUS.instance.alpha2
74
+ end
75
+
76
+ def test_get_alpha3
77
+ assert_equal 'AUS', IsoCountryCodes::Code::AUS.alpha3
78
+ assert_equal 'AUS', IsoCountryCodes::Code::AUS.instance.alpha3
79
+ end
80
+
81
+ def test_get_name
82
+ assert_equal 'Australia', IsoCountryCodes::Code::AUS.name
83
+ assert_equal 'Australia', IsoCountryCodes::Code::AUS.instance.name
84
+ end
85
+
86
+ def test_unknown_iso_code
87
+ assert_raises IsoCountryCodes::UnknownCodeError do
88
+ IsoCountryCodes.find('FOO')
89
+ end
90
+ end
91
+ end
metadata ADDED
@@ -0,0 +1,83 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: iso_country_codes
3
+ version: !ruby/object:Gem::Version
4
+ hash: 19
5
+ prerelease: false
6
+ segments:
7
+ - 0
8
+ - 2
9
+ - 2
10
+ version: 0.2.2
11
+ platform: ruby
12
+ authors:
13
+ - alex
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2009-08-07 00:00:00 +01:00
19
+ default_executable:
20
+ dependencies: []
21
+
22
+ description: ISO country code and currency library
23
+ email: alexrabarts@gmail.com
24
+ executables: []
25
+
26
+ extensions: []
27
+
28
+ extra_rdoc_files:
29
+ - README.rdoc
30
+ files:
31
+ - .gitignore
32
+ - History.txt
33
+ - Manifest.txt
34
+ - README.rdoc
35
+ - Rakefile
36
+ - VERSION.yml
37
+ - iso_country_codes.gemspec
38
+ - lib/iso_country_codes.rb
39
+ - lib/iso_country_codes/code.rb
40
+ - lib/iso_country_codes/iso_3166_1.rb
41
+ - lib/iso_country_codes/iso_4217.rb
42
+ - lib/iso_country_codes/iso_country_codes.rb
43
+ - rakelib/cultivate.rake
44
+ - rakelib/iso_3166_1.rake
45
+ - rakelib/iso_3166_1.rb
46
+ - rakelib/iso_3166_1.rb.erb
47
+ - test/iso_country_codes_test.rb
48
+ has_rdoc: true
49
+ homepage: http://github.com/alexrabarts/iso_country_codes
50
+ licenses: []
51
+
52
+ post_install_message:
53
+ rdoc_options:
54
+ - --charset=UTF-8
55
+ require_paths:
56
+ - lib
57
+ required_ruby_version: !ruby/object:Gem::Requirement
58
+ none: false
59
+ requirements:
60
+ - - ">="
61
+ - !ruby/object:Gem::Version
62
+ hash: 3
63
+ segments:
64
+ - 0
65
+ version: "0"
66
+ required_rubygems_version: !ruby/object:Gem::Requirement
67
+ none: false
68
+ requirements:
69
+ - - ">="
70
+ - !ruby/object:Gem::Version
71
+ hash: 3
72
+ segments:
73
+ - 0
74
+ version: "0"
75
+ requirements: []
76
+
77
+ rubyforge_project:
78
+ rubygems_version: 1.3.7
79
+ signing_key:
80
+ specification_version: 3
81
+ summary: Provides ISO 3166-1 country codes/names and ISO 4217 currencies.
82
+ test_files:
83
+ - test/iso_country_codes_test.rb