iso3166-countries 0.0.1 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -26,6 +26,5 @@ Gem::Specification.new do |spec|
26
26
  spec.executables = spec.files.grep(%r{\Aexe/}) { |f| File.basename(f) }
27
27
  spec.require_paths = ["lib"]
28
28
 
29
- # Uncomment to register a new dependency of your gem
30
- # spec.add_dependency "example-gem", "~> 1.0"
29
+ spec.add_dependency "nokogiri", "~> 1.11"
31
30
  end
@@ -1,10 +1,28 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "nokogiri"
4
+ require "yaml"
3
5
  require_relative "countries/version"
6
+ require_relative "xml_data"
7
+ require_relative "yml_data"
8
+ require_relative "country"
4
9
 
5
10
  module ISO3166
6
11
  module Countries
7
- class Error < StandardError; end
8
- # Your code goes here...
12
+ class << self
13
+ def data_path
14
+ @data_path ||
15
+ File.join(__dir__, "..", "..", "data", "sample.xml")
16
+ end
17
+
18
+ def yml_data_path
19
+ File.join(__dir__, "..", "..", "data", "extended.yml")
20
+ end
21
+
22
+ def data_path=(path)
23
+ ISO3166::XMLData.reset!
24
+ @data_path = path
25
+ end
26
+ end
9
27
  end
10
28
  end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module ISO3166
4
4
  module Countries
5
- VERSION = "0.0.1"
5
+ VERSION = "0.2.0"
6
6
  end
7
7
  end
@@ -0,0 +1,94 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ISO3166
4
+ class Country
5
+ class TooManyArguments < StandardError; end
6
+
7
+ def self.new(code, xml_node: nil)
8
+ return super(xml_node) if xml_node
9
+
10
+ if (xml_node = ISO3166::XMLData.find(code))
11
+ super(xml_node)
12
+ end
13
+ end
14
+
15
+ def self.find_by(alpha2: nil, alpha3: nil)
16
+ raise TooManyArguments, "submit either alpha2 or alpha3" if alpha2 && alpha3
17
+
18
+ if alpha2
19
+ new(alpha2)
20
+ elsif alpha3 && (xml_node = ISO3166::XMLData.find_by_alpha3(alpha3))
21
+ new(nil, xml_node: xml_node)
22
+ end
23
+ end
24
+
25
+ def self.all_names_with_codes
26
+ ISO3166::XMLData.all_names_with_codes
27
+ end
28
+
29
+ def self.[](code)
30
+ new(code)
31
+ end
32
+
33
+ def self.all
34
+ ISO3166::XMLData.all_names_with_codes.map do |name, alpha2|
35
+ new(alpha2)
36
+ end
37
+ end
38
+
39
+ attr_reader :xml_node
40
+
41
+ def initialize(xml_node)
42
+ @xml_node = xml_node
43
+ end
44
+
45
+ def alpha2
46
+ @_alpha2 ||= xml_node.at_xpath("./alpha-2-code").text
47
+ end
48
+
49
+ def alpha3
50
+ @_alpha3 ||= xml_node.at_xpath("./alpha-3-code").text
51
+ end
52
+
53
+ def name
54
+ @_name ||= xml_node.at_xpath("./short-name[@lang3code='eng']").text
55
+ end
56
+
57
+ def full_name
58
+ @_full_name ||= xml_node.at_xpath("./full-name[@lang3code='eng']").text
59
+ end
60
+
61
+ def translation
62
+ @_translation ||= name.sub(" (the)", "")
63
+ end
64
+
65
+ def number
66
+ @_number ||= xml_node.at_xpath("./numeric-code").text
67
+ end
68
+
69
+ def in_eu?
70
+ !!yml_data["eu_member"]
71
+ end
72
+
73
+ def postal_code_format
74
+ yml_data["postal_code_format"]
75
+ end
76
+
77
+ def postal_code_regexp
78
+ yml_data["postal_code_regexp"]
79
+ end
80
+
81
+ def yml_data
82
+ @_yml_data ||= ISO3166::YMLData.find(alpha2) || {}
83
+ end
84
+
85
+ def currency_code
86
+ @_currency_code ||= yml_data["currency_code"]
87
+ end
88
+
89
+ def ==(other)
90
+ other.respond_to?(:alpha2) && other.alpha2 == alpha2
91
+ end
92
+ alias_method :eql?, :==
93
+ end
94
+ end
@@ -0,0 +1,42 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ISO3166
4
+ class XMLData
5
+ @@semaphore = Mutex.new
6
+ @@data = nil
7
+
8
+ class << self
9
+ def reset!
10
+ @@data = nil
11
+ end
12
+
13
+ def reload!
14
+ return if @@data
15
+
16
+ @@semaphore.synchronize do
17
+ @@data = File.open(ISO3166::Countries.data_path) { |f| Nokogiri::XML(f) }
18
+ end
19
+ end
20
+
21
+ def find(code)
22
+ reload!
23
+ @@data.at_xpath("//country[@id='#{code}']")
24
+ end
25
+
26
+ def find_by_alpha3(code)
27
+ reload!
28
+ @@data.at_xpath("//country[alpha-3-code[text()='#{code}']]")
29
+ end
30
+
31
+ def all_names_with_codes
32
+ reload!
33
+ @@data.xpath("//country[status[text()='officially-assigned']]").map do |xml_node|
34
+ [
35
+ xml_node.at_xpath("./short-name[@lang3code='eng']").text,
36
+ xml_node.at_xpath("./alpha-2-code").text
37
+ ]
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ISO3166
4
+ class YMLData
5
+ @@semaphore = Mutex.new
6
+ @@data = nil
7
+
8
+ class << self
9
+ def reset!
10
+ @@data = nil
11
+ end
12
+
13
+ def reload!
14
+ return if @@data
15
+
16
+ @@semaphore.synchronize do
17
+ @@data = YAML.load_file(ISO3166::Countries.yml_data_path)
18
+ end
19
+ end
20
+
21
+ def find(code)
22
+ reload!
23
+ @@data[code.to_s]
24
+ end
25
+ end
26
+ end
27
+ end
metadata CHANGED
@@ -1,15 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: iso3166-countries
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ali Ismayilov
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2021-03-01 00:00:00.000000000 Z
12
- dependencies: []
11
+ date: 2021-04-06 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: nokogiri
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.11'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.11'
13
27
  description:
14
28
  email:
15
29
  - ali@ismailov.info
@@ -27,9 +41,15 @@ files:
27
41
  - Rakefile
28
42
  - bin/console
29
43
  - bin/setup
44
+ - data/README.md
45
+ - data/extended.yml
46
+ - data/sample.xml
30
47
  - iso3166-countries.gemspec
31
48
  - lib/iso3166/countries.rb
32
49
  - lib/iso3166/countries/version.rb
50
+ - lib/iso3166/country.rb
51
+ - lib/iso3166/xml_data.rb
52
+ - lib/iso3166/yml_data.rb
33
53
  homepage: https://github.com/viaeurope/iso3166-countries
34
54
  licenses:
35
55
  - MIT