From ef14cc7b64c1ce02c2955018759005854e2ffc2f Mon Sep 17 00:00:00 2001 From: Edem Topuzov Date: Tue, 14 May 2024 04:47:22 +0300 Subject: [PATCH] Add conversion methods for country codes --- README.md | 8 +++++ lib/countries/country.rb | 1 + lib/countries/country/conversion_methods.rb | 17 +++++++++++ lib/countries/iso3166.rb | 1 + spec/country_spec.rb | 34 +++++++++++++++++++++ 5 files changed, 61 insertions(+) create mode 100644 lib/countries/country/conversion_methods.rb diff --git a/README.md b/README.md index 4ca54005..6a8f56c0 100644 --- a/README.md +++ b/README.md @@ -264,6 +264,14 @@ ISO3166::Country.collect_likely_countries_by_subdivision_name("San José",:commo => ["Costa Rica", "Uruguay"] ``` +### Conversions + +```ruby +ISO3166::Country.from_alpha3_to_alpha2('USA') # => "US" +ISO3166::Country.from_alpha2_to_alpha3('US') # => "USA" + +ISO3166::Country.from_alpha2_to_alpha3('--') # => nil +``` ## Currencies diff --git a/lib/countries/country.rb b/lib/countries/country.rb index 9f0afa22..7ed411b1 100644 --- a/lib/countries/country.rb +++ b/lib/countries/country.rb @@ -3,6 +3,7 @@ module ISO3166 class Country extend CountryClassMethods + extend ConversionMethods extend CountryFinderMethods include Emoji include CountrySubdivisionMethods diff --git a/lib/countries/country/conversion_methods.rb b/lib/countries/country/conversion_methods.rb new file mode 100644 index 00000000..f29569d8 --- /dev/null +++ b/lib/countries/country/conversion_methods.rb @@ -0,0 +1,17 @@ +# frozen_string_literal: true + +module ISO3166 + module ConversionMethods + # @param alpha2 [String] ISO 3166 alpha-2 country code. + # @return [String] ISO 3166 alpha-3 country code. + def from_alpha2_to_alpha3(alpha2) + find_country_by_alpha2(alpha2)&.alpha3 + end + + # @param alpha3 [String] ISO 3166 alpha-3 country code. + # @return [String] ISO 3166 alpha-2 country code. + def from_alpha3_to_alpha2(alpha3) + find_country_by_alpha3(alpha3)&.alpha2 + end + end +end diff --git a/lib/countries/iso3166.rb b/lib/countries/iso3166.rb index 925501f3..8b538fee 100644 --- a/lib/countries/iso3166.rb +++ b/lib/countries/iso3166.rb @@ -11,6 +11,7 @@ require 'countries/translations' require 'countries/country/country_subdivision_methods' require 'countries/country/class_methods' +require 'countries/country/conversion_methods' require 'countries/country/finder_methods' require 'countries/country/emoji' require 'countries/country' diff --git a/spec/country_spec.rb b/spec/country_spec.rb index 2b81837a..7cb7c7ff 100644 --- a/spec/country_spec.rb +++ b/spec/country_spec.rb @@ -664,6 +664,40 @@ end end + describe 'conversion methods' do + describe 'from_alpha2_to_alpha3' do + subject { ISO3166::Country.from_alpha2_to_alpha3(alpha2) } + + context 'when country exists' do + let(:alpha2) { 'US' } + + it { is_expected.to eq('USA') } + end + + context 'when country does not exist' do + let(:alpha2) { '..' } + + it { is_expected.to be_nil } + end + end + + describe 'from_alpha3_to_alpha2' do + subject { ISO3166::Country.from_alpha3_to_alpha2(alpha3) } + + context 'when country exists' do + let(:alpha3) { 'USA' } + + it { is_expected.to eq('US') } + end + + context 'when country does not exist' do + let(:alpha3) { '...' } + + it { is_expected.to be_nil } + end + end + end + describe 'hash finder methods' do context "when search name in 'iso_short_name'" do subject { ISO3166::Country.find_by_iso_short_name('Poland') }