From 5d454f37ab95df42bf0e4ba2ffb420648497634b Mon Sep 17 00:00:00 2001 From: David Paluy Date: Wed, 2 Sep 2020 22:53:52 -0500 Subject: [PATCH] continents added to carmen --- .travis.yml | 3 +- README.md | 34 ++ iso_data/base/territories.yml | 459 +++++++++++++++++ lib/carmen.rb | 9 + lib/carmen/continent.rb | 77 +++ lib/carmen/country.rb | 4 + lib/carmen/world.rb | 9 +- locale/base/en/world.yml | 699 ++++++++++++++------------ spec/carmen/continent_spec.rb | 77 +++ spec/carmen/country_spec.rb | 5 + spec/carmen/region_spec.rb | 67 ++- spec/carmen/world_spec.rb | 8 +- spec/spec_helper.rb | 2 +- spec_data/locale/en/world.yml | 17 +- spec_data/territories/territories.yml | 32 ++ 15 files changed, 1142 insertions(+), 360 deletions(-) create mode 100644 iso_data/base/territories.yml create mode 100644 lib/carmen/continent.rb create mode 100644 spec/carmen/continent_spec.rb create mode 100644 spec_data/territories/territories.yml diff --git a/.travis.yml b/.travis.yml index 6d3c2a9b..1c0e2a92 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,7 +1,6 @@ rvm: - - 2.4.0 - - 2.5.0 - 2.6.0 + - 2.7.0 - ruby-head before_install: - gem install bundler diff --git a/README.md b/README.md index a2b97e70..21578f0e 100644 --- a/README.md +++ b/README.md @@ -104,6 +104,40 @@ Some subregions may contain additional subregions. An example of this is Spain: andalucia.subregions.first => <#Carmen::Region name="Almería" type="province"> +If you need structural data about the continents. You can start here: + + Carmen::World.continents + +This will return a `Carmen::Continent` that you can use like this: + + continent = Carmen::World.continents.first + sub_continents = continent.sub_continents + +To get the sub-continents of a given continent. Might be empty. + + countries = continent.countries + +This will give you **all countries** contained in a given continent. This will also give you countries that might be contained in sub_continents. Meaning `world.countries` will give you all countries of the world. + +Here are some examples: + + Carmen::Continent.coded('150') + => # + + Carmen::Continent.coded('150').name + => "Europe" + + Carmen::Continent.coded('150').sub_continents.map { |c| c.name } + => ["Northern Europe", "Western Europe", "Eastern Europe", "Southern Europe"] + +Of course you can also get the continent of a country be trying: + + Carmen::Country.coded('DE') + => <#Carmen::Country name="Germany"> + + Carmen::Country.coded('DE').continent.name + => "Western Europe" + ## How Carmen organizes data In order to facilitate support for I18n, Carmen stores the structure of regions diff --git a/iso_data/base/territories.yml b/iso_data/base/territories.yml new file mode 100644 index 00000000..c9064ee4 --- /dev/null +++ b/iso_data/base/territories.yml @@ -0,0 +1,459 @@ +--- + territoryContainment: + - + territory: "001" + contains: + - "019" + - "002" + - "150" + - "142" + - "009" + - + territory: "011" + contains: + - "BF" + - "BJ" + - "CI" + - "CV" + - "GH" + - "GM" + - "GN" + - "GW" + - "LR" + - "ML" + - "MR" + - "NE" + - "NG" + - "SH" + - "SL" + - "SN" + - "TG" + - + territory: "013" + contains: + - "BZ" + - "CR" + - "GT" + - "HN" + - "MX" + - "NI" + - "PA" + - "SV" + - + territory: "014" + contains: + - "BI" + - "DJ" + - "ER" + - "ET" + - "KE" + - "KM" + - "MG" + - "MU" + - "MW" + - "MZ" + - "RE" + - "RW" + - "SC" + - "SO" + - "TZ" + - "UG" + - "YT" + - "ZM" + - "ZW" + - + territory: "142" + contains: + - "145" + - "143" + - "030" + - "034" + - "035" + - + territory: "143" + contains: + - "TM" + - "TJ" + - "KG" + - "KZ" + - "UZ" + - + territory: "145" + contains: + - "AE" + - "AM" + - "AZ" + - "BH" + - "CY" + - "GE" + - "IL" + - "IQ" + - "JO" + - "KW" + - "LB" + - "OM" + - "PS" + - "QA" + - "SA" + - "SY" + - "TR" + - "YE" + - + territory: "145" + contains: + - "NT" + - "YD" + status: "deprecated" + - + territory: "015" + contains: + - "DZ" + - "EG" + - "EH" + - "LY" + - "MA" + - "SD" + - "SS" + - "TN" + - "EA" + - "IC" + - + territory: "150" + contains: + - "154" + - "155" + - "151" + - "039" + - + territory: "151" + contains: + - "BG" + - "BY" + - "CZ" + - "HU" + - "MD" + - "PL" + - "RO" + - "RU" + - "SK" + - "UA" + - + territory: "154" + contains: + - "GG" + - "IM" + - "JE" + - "AX" + - "DK" + - "EE" + - "FI" + - "FO" + - "GB" + - "IE" + - "IS" + - "LT" + - "LV" + - "NO" + - "SE" + - "SJ" + - + territory: "155" + contains: + - "AT" + - "BE" + - "CH" + - "DE" + - "FR" + - "LI" + - "LU" + - "MC" + - "NL" + - + territory: "155" + contains: + - "DD" + - "FX" + status: "deprecated" + - + territory: "017" + contains: + - "AO" + - "CD" + - "CF" + - "CG" + - "CM" + - "GA" + - "GQ" + - "ST" + - "TD" + - + territory: "017" + contains: + - "ZR" + status: "deprecated" + - + territory: "018" + contains: + - "BW" + - "LS" + - "NA" + - "SZ" + - "ZA" + - + territory: "019" + contains: + - "021" + - "013" + - "029" + - "005" + - + territory: "019" + contains: + - "003" + - "419" + status: "grouping" + - + territory: "002" + contains: + - "015" + - "011" + - "017" + - "014" + - "018" + - + territory: "021" + contains: + - "BM" + - "CA" + - "GL" + - "PM" + - "US" + - + territory: "029" + contains: + - "AG" + - "AI" + - "AW" + - "BB" + - "BL" + - "BQ" + - "BS" + - "CU" + - "CW" + - "DM" + - "DO" + - "GD" + - "GP" + - "HT" + - "JM" + - "KN" + - "KY" + - "LC" + - "MF" + - "MQ" + - "MS" + - "PR" + - "SX" + - "TC" + - "TT" + - "VC" + - "VG" + - "VI" + - + territory: "029" + contains: + - "AN" + status: "deprecated" + - + territory: "003" + contains: + - "021" + - "013" + - "029" + grouping: "true" + - + territory: "030" + contains: + - "CN" + - "HK" + - "JP" + - "KP" + - "KR" + - "MN" + - "MO" + - "TW" + - + territory: "035" + contains: + - "BN" + - "ID" + - "KH" + - "LA" + - "MM" + - "MY" + - "PH" + - "SG" + - "TH" + - "TL" + - "VN" + - + territory: "035" + contains: + - "BU" + - "TP" + status: "deprecated" + - + territory: "039" + contains: + - "AD" + - "AL" + - "BA" + - "ES" + - "GI" + - "GR" + - "HR" + - "IT" + - "ME" + - "MK" + - "MT" + - "RS" + - "PT" + - "SI" + - "SM" + - "VA" + - "XK" + - + territory: "039" + contains: + - "CS" + - "YU" + status: "deprecated" + - + territory: "419" + contains: + - "013" + - "029" + - "005" + grouping: "true" + - + territory: "005" + contains: + - "AR" + - "BO" + - "BR" + - "CL" + - "CO" + - "EC" + - "FK" + - "GF" + - "GY" + - "PE" + - "PY" + - "SR" + - "UY" + - "VE" + - + territory: "053" + contains: + - "AU" + - "NF" + - "NZ" + - + territory: "054" + contains: + - "FJ" + - "NC" + - "PG" + - "SB" + - "VU" + - + territory: "057" + contains: + - "FM" + - "GU" + - "KI" + - "MH" + - "MP" + - "NR" + - "PW" + - + territory: "061" + contains: + - "AS" + - "CK" + - "NU" + - "PF" + - "PN" + - "TK" + - "TO" + - "TV" + - "WF" + - "WS" + - + territory: "034" + contains: + - "AF" + - "BD" + - "BT" + - "IN" + - "IR" + - "LK" + - "MV" + - "NP" + - "PK" + - + territory: "009" + contains: + - "053" + - "054" + - "057" + - "061" + - "QO" + - + territory: "QO" + contains: + - "AQ" + - "BV" + - "CC" + - "CX" + - "GS" + - "HM" + - "IO" + - "TF" + - "UM" + - "AC" + - "CP" + - "DG" + - "TA" + - + territory: "EU" + contains: + - "AT" + - "BE" + - "CY" + - "CZ" + - "DE" + - "DK" + - "EE" + - "ES" + - "FI" + - "FR" + - "GB" + - "GR" + - "HR" + - "HU" + - "IE" + - "IT" + - "LT" + - "LU" + - "LV" + - "MT" + - "NL" + - "PL" + - "PT" + - "SE" + - "SI" + - "SK" + - "BG" + - "RO" + grouping: "true" diff --git a/lib/carmen.rb b/lib/carmen.rb index 64ba142f..e177ec9c 100644 --- a/lib/carmen.rb +++ b/lib/carmen.rb @@ -4,6 +4,7 @@ lib_path = File.expand_path('../../lib', __FILE__) $LOAD_PATH.unshift(lib_path) +require 'carmen/continent' require 'carmen/country' require 'carmen/i18n' require 'carmen/version' @@ -39,6 +40,14 @@ def i18n_backend @i18n_backend end + def territories_path=(path) + @territories_path = path + end + + def territories_path + @territories_path || (Carmen.root_path + 'iso_data/base/territories.yml') + end + # Public: set an object to use as the I18n backend. # # Ths suppiled object must respond to t(key). diff --git a/lib/carmen/continent.rb b/lib/carmen/continent.rb new file mode 100644 index 00000000..1dac2993 --- /dev/null +++ b/lib/carmen/continent.rb @@ -0,0 +1,77 @@ +require 'yaml' +require 'carmen/country' + +module Carmen + class Continent + attr_reader :code + + def initialize(data={}) + @code = data['territory'] + @contains = data['contains'] + end + + def name + Carmen.i18n_backend.translate("continents.#{code}.name") + end + + def sub_continents + contained_continents_or_countries.select { |continent_or_country| continent_or_country.is_a? Continent } + end + + def countries + if sub_continents.any? + sub_continents.map(&:countries).flatten + else + contained_continents_or_countries.select { |continent_or_country| continent_or_country.is_a? Country } + end + end + + def continent + Carmen::Continent.all.detect { |c| c.sub_continents.include?(self) } + end + + def self.coded(code) + Continent.all.detect { |c| c.code == code } + end + + def self.all + continents.reject(&:world?) + end + + def self.world + continents.select(&:world?).first + end + + def world? + code == '001' + end + + private + + def contained_continents_or_countries + if @contains.present? + @contains.map { |c| code_to_object(c) } + else + [] + end + end + + def code_to_object(code) + if /\d\d\d/.match(code) + Continent.coded(code) + elsif /[A-Z][A-Z]/.match(code) + Country.coded(code) + end + end + + class << self + def continents + @continents ||= load_territory_containment['territoryContainment'].map { |tc| Continent.new(tc) } + end + + def load_territory_containment + YAML.load_file(Carmen.territories_path) + end + end + end +end diff --git a/lib/carmen/country.rb b/lib/carmen/country.rb index a878e3bf..48d1117f 100644 --- a/lib/carmen/country.rb +++ b/lib/carmen/country.rb @@ -20,6 +20,10 @@ def initialize(data={}, parent=nil) super end + def continent + Carmen::Continent.all.detect { |c| c.sub_continents.empty? && c.countries.include?(self) } + end + def common_name Carmen.i18n_backend.translate(path('common_name')) end diff --git a/lib/carmen/world.rb b/lib/carmen/world.rb index 3287cd11..ac563878 100644 --- a/lib/carmen/world.rb +++ b/lib/carmen/world.rb @@ -17,6 +17,14 @@ def subregion_class Country end + def continents + Continent.world.sub_continents + end + + def countries + Continent.world.countries + end + def path 'world' end @@ -24,6 +32,5 @@ def path def inspect "<##{self.class}>" end - end end diff --git a/locale/base/en/world.yml b/locale/base/en/world.yml index 2c86478c..97d44672 100644 --- a/locale/base/en/world.yml +++ b/locale/base/en/world.yml @@ -2,555 +2,555 @@ en: world: ad: - common_name: + common_name: name: Andorra official_name: Principality of Andorra ae: - common_name: + common_name: name: United Arab Emirates - official_name: + official_name: af: - common_name: + common_name: name: Afghanistan official_name: Islamic Republic of Afghanistan ag: - common_name: + common_name: name: Antigua and Barbuda - official_name: + official_name: ai: - common_name: + common_name: name: Anguilla - official_name: + official_name: al: - common_name: + common_name: name: Albania official_name: Republic of Albania am: - common_name: + common_name: name: Armenia official_name: Republic of Armenia ao: - common_name: + common_name: name: Angola official_name: Republic of Angola aq: - common_name: + common_name: name: Antarctica - official_name: + official_name: ar: - common_name: + common_name: name: Argentina official_name: Argentine Republic as: - common_name: + common_name: name: American Samoa - official_name: + official_name: at: - common_name: + common_name: name: Austria official_name: Republic of Austria au: - common_name: + common_name: name: Australia - official_name: + official_name: aw: - common_name: + common_name: name: Aruba - official_name: + official_name: ax: - common_name: + common_name: name: Åland Islands - official_name: + official_name: az: - common_name: + common_name: name: Azerbaijan official_name: Republic of Azerbaijan ba: - common_name: + common_name: name: Bosnia and Herzegovina official_name: Republic of Bosnia and Herzegovina bb: - common_name: + common_name: name: Barbados - official_name: + official_name: bd: - common_name: + common_name: name: Bangladesh official_name: People's Republic of Bangladesh be: - common_name: + common_name: name: Belgium official_name: Kingdom of Belgium bf: - common_name: + common_name: name: Burkina Faso - official_name: + official_name: bg: - common_name: + common_name: name: Bulgaria official_name: Republic of Bulgaria bh: - common_name: + common_name: name: Bahrain official_name: Kingdom of Bahrain bi: - common_name: + common_name: name: Burundi official_name: Republic of Burundi bj: - common_name: + common_name: name: Benin official_name: Republic of Benin bl: - common_name: + common_name: name: Saint Barthélemy - official_name: + official_name: bm: - common_name: + common_name: name: Bermuda - official_name: + official_name: bn: - common_name: + common_name: name: Brunei Darussalam - official_name: + official_name: bo: common_name: Bolivia name: Bolivia, Plurinational State of official_name: Plurinational State of Bolivia bq: - common_name: + common_name: name: Bonaire, Sint Eustatius and Saba official_name: Bonaire, Sint Eustatius and Saba br: - common_name: + common_name: name: Brazil official_name: Federative Republic of Brazil bs: - common_name: + common_name: name: Bahamas official_name: Commonwealth of the Bahamas bt: - common_name: + common_name: name: Bhutan official_name: Kingdom of Bhutan bv: - common_name: + common_name: name: Bouvet Island - official_name: + official_name: bw: - common_name: + common_name: name: Botswana official_name: Republic of Botswana by: - common_name: + common_name: name: Belarus official_name: Republic of Belarus bz: - common_name: + common_name: name: Belize - official_name: + official_name: ca: - common_name: + common_name: name: Canada - official_name: + official_name: cc: - common_name: + common_name: name: Cocos (Keeling) Islands - official_name: + official_name: cd: - common_name: + common_name: name: Congo, The Democratic Republic of the - official_name: + official_name: cf: - common_name: + common_name: name: Central African Republic - official_name: + official_name: cg: - common_name: + common_name: name: Congo official_name: Republic of the Congo ch: - common_name: + common_name: name: Switzerland official_name: Swiss Confederation ci: - common_name: + common_name: name: Côte d'Ivoire official_name: Republic of Côte d'Ivoire ck: - common_name: + common_name: name: Cook Islands - official_name: + official_name: cl: - common_name: + common_name: name: Chile official_name: Republic of Chile cm: - common_name: + common_name: name: Cameroon official_name: Republic of Cameroon cn: - common_name: + common_name: name: China official_name: People's Republic of China co: - common_name: + common_name: name: Colombia official_name: Republic of Colombia cr: - common_name: + common_name: name: Costa Rica official_name: Republic of Costa Rica cu: - common_name: + common_name: name: Cuba official_name: Republic of Cuba cv: - common_name: + common_name: name: Cabo Verde official_name: Republic of Cabo Verde cw: - common_name: + common_name: name: Curaçao official_name: Curaçao cx: - common_name: + common_name: name: Christmas Island - official_name: + official_name: cy: - common_name: + common_name: name: Cyprus official_name: Republic of Cyprus cz: - common_name: + common_name: name: Czechia official_name: Czech Republic de: - common_name: + common_name: name: Germany official_name: Federal Republic of Germany dj: - common_name: + common_name: name: Djibouti official_name: Republic of Djibouti dk: - common_name: + common_name: name: Denmark official_name: Kingdom of Denmark dm: - common_name: + common_name: name: Dominica official_name: Commonwealth of Dominica do: - common_name: + common_name: name: Dominican Republic - official_name: + official_name: dz: - common_name: + common_name: name: Algeria official_name: People's Democratic Republic of Algeria ec: - common_name: + common_name: name: Ecuador official_name: Republic of Ecuador ee: - common_name: + common_name: name: Estonia official_name: Republic of Estonia eg: - common_name: + common_name: name: Egypt official_name: Arab Republic of Egypt eh: - common_name: + common_name: name: Western Sahara - official_name: + official_name: er: - common_name: + common_name: name: Eritrea official_name: the State of Eritrea es: - common_name: + common_name: name: Spain official_name: Kingdom of Spain et: - common_name: + common_name: name: Ethiopia official_name: Federal Democratic Republic of Ethiopia fi: - common_name: + common_name: name: Finland official_name: Republic of Finland fj: - common_name: + common_name: name: Fiji official_name: Republic of Fiji fk: - common_name: + common_name: name: Falkland Islands (Malvinas) - official_name: + official_name: fm: - common_name: + common_name: name: Micronesia, Federated States of official_name: Federated States of Micronesia fo: - common_name: + common_name: name: Faroe Islands - official_name: + official_name: fr: - common_name: + common_name: name: France official_name: French Republic ga: - common_name: + common_name: name: Gabon official_name: Gabonese Republic gb: - common_name: + common_name: name: United Kingdom official_name: United Kingdom of Great Britain and Northern Ireland gd: - common_name: + common_name: name: Grenada - official_name: + official_name: ge: - common_name: + common_name: name: Georgia - official_name: + official_name: gf: - common_name: + common_name: name: French Guiana - official_name: + official_name: gg: - common_name: + common_name: name: Guernsey - official_name: + official_name: gh: - common_name: + common_name: name: Ghana official_name: Republic of Ghana gi: - common_name: + common_name: name: Gibraltar - official_name: + official_name: gl: - common_name: + common_name: name: Greenland - official_name: + official_name: gm: - common_name: + common_name: name: Gambia official_name: Republic of the Gambia gn: - common_name: + common_name: name: Guinea official_name: Republic of Guinea gp: - common_name: + common_name: name: Guadeloupe - official_name: + official_name: gq: - common_name: + common_name: name: Equatorial Guinea official_name: Republic of Equatorial Guinea gr: - common_name: + common_name: name: Greece official_name: Hellenic Republic gs: - common_name: + common_name: name: South Georgia and the South Sandwich Islands - official_name: + official_name: gt: - common_name: + common_name: name: Guatemala official_name: Republic of Guatemala gu: - common_name: + common_name: name: Guam - official_name: + official_name: gw: - common_name: + common_name: name: Guinea-Bissau official_name: Republic of Guinea-Bissau gy: - common_name: + common_name: name: Guyana official_name: Republic of Guyana hk: - common_name: + common_name: name: Hong Kong official_name: Hong Kong Special Administrative Region of China hm: - common_name: + common_name: name: Heard Island and McDonald Islands - official_name: + official_name: hn: - common_name: + common_name: name: Honduras official_name: Republic of Honduras hr: - common_name: + common_name: name: Croatia official_name: Republic of Croatia ht: - common_name: + common_name: name: Haiti official_name: Republic of Haiti hu: - common_name: + common_name: name: Hungary official_name: Hungary id: - common_name: + common_name: name: Indonesia official_name: Republic of Indonesia ie: - common_name: + common_name: name: Ireland - official_name: + official_name: il: - common_name: + common_name: name: Israel official_name: State of Israel im: - common_name: + common_name: name: Isle of Man - official_name: + official_name: in: - common_name: + common_name: name: India official_name: Republic of India io: - common_name: + common_name: name: British Indian Ocean Territory - official_name: + official_name: iq: - common_name: + common_name: name: Iraq official_name: Republic of Iraq ir: - common_name: + common_name: name: Iran, Islamic Republic of official_name: Islamic Republic of Iran is: - common_name: + common_name: name: Iceland official_name: Republic of Iceland it: - common_name: + common_name: name: Italy official_name: Italian Republic je: - common_name: + common_name: name: Jersey - official_name: + official_name: jm: - common_name: + common_name: name: Jamaica - official_name: + official_name: jo: - common_name: + common_name: name: Jordan official_name: Hashemite Kingdom of Jordan jp: - common_name: + common_name: name: Japan - official_name: + official_name: ke: - common_name: + common_name: name: Kenya official_name: Republic of Kenya kg: - common_name: + common_name: name: Kyrgyzstan official_name: Kyrgyz Republic kh: - common_name: + common_name: name: Cambodia official_name: Kingdom of Cambodia ki: - common_name: + common_name: name: Kiribati official_name: Republic of Kiribati km: - common_name: + common_name: name: Comoros official_name: Union of the Comoros kn: - common_name: + common_name: name: Saint Kitts and Nevis - official_name: + official_name: kp: - common_name: + common_name: name: Korea, Democratic People's Republic of official_name: Democratic People's Republic of Korea kr: - common_name: + common_name: name: Korea, Republic of - official_name: + official_name: kw: - common_name: + common_name: name: Kuwait official_name: State of Kuwait ky: - common_name: + common_name: name: Cayman Islands - official_name: + official_name: kz: - common_name: + common_name: name: Kazakhstan official_name: Republic of Kazakhstan la: - common_name: + common_name: name: Lao People's Democratic Republic - official_name: + official_name: lb: - common_name: + common_name: name: Lebanon official_name: Lebanese Republic lc: - common_name: + common_name: name: Saint Lucia - official_name: + official_name: li: - common_name: + common_name: name: Liechtenstein official_name: Principality of Liechtenstein lk: - common_name: + common_name: name: Sri Lanka official_name: Democratic Socialist Republic of Sri Lanka lr: - common_name: + common_name: name: Liberia official_name: Republic of Liberia ls: - common_name: + common_name: name: Lesotho official_name: Kingdom of Lesotho lt: - common_name: + common_name: name: Lithuania official_name: Republic of Lithuania lu: - common_name: + common_name: name: Luxembourg official_name: Grand Duchy of Luxembourg lv: - common_name: + common_name: name: Latvia official_name: Republic of Latvia ly: - common_name: + common_name: name: Libya official_name: Libya ma: - common_name: + common_name: name: Morocco official_name: Kingdom of Morocco mc: - common_name: + common_name: name: Monaco official_name: Principality of Monaco md: @@ -558,357 +558,357 @@ en: name: Moldova, Republic of official_name: Republic of Moldova me: - common_name: + common_name: name: Montenegro official_name: Montenegro mf: - common_name: + common_name: name: Saint Martin (French part) - official_name: + official_name: mg: - common_name: + common_name: name: Madagascar official_name: Republic of Madagascar mh: - common_name: + common_name: name: Marshall Islands official_name: Republic of the Marshall Islands mk: - common_name: + common_name: name: North Macedonia official_name: Republic of North Macedonia ml: - common_name: + common_name: name: Mali official_name: Republic of Mali mm: - common_name: + common_name: name: Myanmar official_name: Republic of Myanmar mn: - common_name: + common_name: name: Mongolia - official_name: + official_name: mo: - common_name: + common_name: name: Macao official_name: Macao Special Administrative Region of China mp: - common_name: + common_name: name: Northern Mariana Islands official_name: Commonwealth of the Northern Mariana Islands mq: - common_name: + common_name: name: Martinique - official_name: + official_name: mr: - common_name: + common_name: name: Mauritania official_name: Islamic Republic of Mauritania ms: - common_name: + common_name: name: Montserrat - official_name: + official_name: mt: - common_name: + common_name: name: Malta official_name: Republic of Malta mu: - common_name: + common_name: name: Mauritius official_name: Republic of Mauritius mv: - common_name: + common_name: name: Maldives official_name: Republic of Maldives mw: - common_name: + common_name: name: Malawi official_name: Republic of Malawi mx: - common_name: + common_name: name: Mexico official_name: United Mexican States my: - common_name: + common_name: name: Malaysia - official_name: + official_name: mz: - common_name: + common_name: name: Mozambique official_name: Republic of Mozambique na: - common_name: + common_name: name: Namibia official_name: Republic of Namibia nc: - common_name: + common_name: name: New Caledonia - official_name: + official_name: ne: - common_name: + common_name: name: Niger official_name: Republic of the Niger nf: - common_name: + common_name: name: Norfolk Island - official_name: + official_name: ng: - common_name: + common_name: name: Nigeria official_name: Federal Republic of Nigeria ni: - common_name: + common_name: name: Nicaragua official_name: Republic of Nicaragua nl: - common_name: + common_name: name: Netherlands official_name: Kingdom of the Netherlands 'no': - common_name: + common_name: name: Norway official_name: Kingdom of Norway np: - common_name: + common_name: name: Nepal official_name: Federal Democratic Republic of Nepal nr: - common_name: + common_name: name: Nauru official_name: Republic of Nauru nu: - common_name: + common_name: name: Niue official_name: Niue nz: - common_name: + common_name: name: New Zealand - official_name: + official_name: om: - common_name: + common_name: name: Oman official_name: Sultanate of Oman pa: - common_name: + common_name: name: Panama official_name: Republic of Panama pe: - common_name: + common_name: name: Peru official_name: Republic of Peru pf: - common_name: + common_name: name: French Polynesia - official_name: + official_name: pg: - common_name: + common_name: name: Papua New Guinea official_name: Independent State of Papua New Guinea ph: - common_name: + common_name: name: Philippines official_name: Republic of the Philippines pk: - common_name: + common_name: name: Pakistan official_name: Islamic Republic of Pakistan pl: - common_name: + common_name: name: Poland official_name: Republic of Poland pm: - common_name: + common_name: name: Saint Pierre and Miquelon - official_name: + official_name: pn: - common_name: + common_name: name: Pitcairn - official_name: + official_name: pr: - common_name: + common_name: name: Puerto Rico - official_name: + official_name: ps: - common_name: + common_name: name: Palestine, State of official_name: the State of Palestine pt: - common_name: + common_name: name: Portugal official_name: Portuguese Republic pw: - common_name: + common_name: name: Palau official_name: Republic of Palau py: - common_name: + common_name: name: Paraguay official_name: Republic of Paraguay qa: - common_name: + common_name: name: Qatar official_name: State of Qatar re: - common_name: + common_name: name: Réunion - official_name: + official_name: ro: - common_name: + common_name: name: Romania - official_name: + official_name: rs: - common_name: + common_name: name: Serbia official_name: Republic of Serbia ru: - common_name: + common_name: name: Russian Federation - official_name: + official_name: rw: - common_name: + common_name: name: Rwanda official_name: Rwandese Republic sa: - common_name: + common_name: name: Saudi Arabia official_name: Kingdom of Saudi Arabia sb: - common_name: + common_name: name: Solomon Islands - official_name: + official_name: sc: - common_name: + common_name: name: Seychelles official_name: Republic of Seychelles sd: - common_name: + common_name: name: Sudan official_name: Republic of the Sudan se: - common_name: + common_name: name: Sweden official_name: Kingdom of Sweden sg: - common_name: + common_name: name: Singapore official_name: Republic of Singapore sh: - common_name: + common_name: name: Saint Helena, Ascension and Tristan da Cunha - official_name: + official_name: si: - common_name: + common_name: name: Slovenia official_name: Republic of Slovenia sj: - common_name: + common_name: name: Svalbard and Jan Mayen - official_name: + official_name: sk: - common_name: + common_name: name: Slovakia official_name: Slovak Republic sl: - common_name: + common_name: name: Sierra Leone official_name: Republic of Sierra Leone sm: - common_name: + common_name: name: San Marino official_name: Republic of San Marino sn: - common_name: + common_name: name: Senegal official_name: Republic of Senegal so: - common_name: + common_name: name: Somalia official_name: Federal Republic of Somalia sr: - common_name: + common_name: name: Suriname official_name: Republic of Suriname ss: - common_name: + common_name: name: South Sudan official_name: Republic of South Sudan st: - common_name: + common_name: name: Sao Tome and Principe official_name: Democratic Republic of Sao Tome and Principe sv: - common_name: + common_name: name: El Salvador official_name: Republic of El Salvador sx: - common_name: + common_name: name: Sint Maarten (Dutch part) official_name: Sint Maarten (Dutch part) sy: - common_name: + common_name: name: Syrian Arab Republic - official_name: + official_name: sz: - common_name: + common_name: name: Eswatini official_name: Kingdom of Eswatini tc: - common_name: + common_name: name: Turks and Caicos Islands - official_name: + official_name: td: - common_name: + common_name: name: Chad official_name: Republic of Chad tf: - common_name: + common_name: name: French Southern Territories - official_name: + official_name: tg: - common_name: + common_name: name: Togo official_name: Togolese Republic th: - common_name: + common_name: name: Thailand official_name: Kingdom of Thailand tj: - common_name: + common_name: name: Tajikistan official_name: Republic of Tajikistan tk: - common_name: + common_name: name: Tokelau - official_name: + official_name: tl: - common_name: + common_name: name: Timor-Leste official_name: Democratic Republic of Timor-Leste tm: - common_name: + common_name: name: Turkmenistan - official_name: + official_name: tn: - common_name: + common_name: name: Tunisia official_name: Republic of Tunisia to: - common_name: + common_name: name: Tonga official_name: Kingdom of Tonga tr: - common_name: + common_name: name: Turkey official_name: Republic of Turkey tt: - common_name: + common_name: name: Trinidad and Tobago official_name: Republic of Trinidad and Tobago tv: - common_name: + common_name: name: Tuvalu - official_name: + official_name: tw: common_name: Taiwan name: Taiwan, Province of China @@ -918,47 +918,47 @@ en: name: Tanzania, United Republic of official_name: United Republic of Tanzania ua: - common_name: + common_name: name: Ukraine - official_name: + official_name: ug: - common_name: + common_name: name: Uganda official_name: Republic of Uganda um: - common_name: + common_name: name: United States Minor Outlying Islands - official_name: + official_name: us: - common_name: + common_name: name: United States official_name: United States of America uy: - common_name: + common_name: name: Uruguay official_name: Eastern Republic of Uruguay uz: - common_name: + common_name: name: Uzbekistan official_name: Republic of Uzbekistan va: - common_name: + common_name: name: Holy See (Vatican City State) - official_name: + official_name: vc: - common_name: + common_name: name: Saint Vincent and the Grenadines - official_name: + official_name: ve: common_name: Venezuela name: Venezuela, Bolivarian Republic of official_name: Bolivarian Republic of Venezuela vg: - common_name: + common_name: name: Virgin Islands, British official_name: British Virgin Islands vi: - common_name: + common_name: name: Virgin Islands, U.S. official_name: Virgin Islands of the United States vn: @@ -966,34 +966,95 @@ en: name: Viet Nam official_name: Socialist Republic of Viet Nam vu: - common_name: + common_name: name: Vanuatu official_name: Republic of Vanuatu wf: - common_name: + common_name: name: Wallis and Futuna - official_name: + official_name: ws: - common_name: + common_name: name: Samoa official_name: Independent State of Samoa ye: - common_name: + common_name: name: Yemen official_name: Republic of Yemen yt: - common_name: + common_name: name: Mayotte - official_name: + official_name: za: - common_name: + common_name: name: South Africa official_name: Republic of South Africa zm: - common_name: + common_name: name: Zambia official_name: Republic of Zambia zw: - common_name: + common_name: name: Zimbabwe official_name: Republic of Zimbabwe + continents: + "001": + name: 'World' + "002": + name: 'Africa' + "003": + name: 'North America' + "005": + name: 'South America' + "009": + name: 'Oceania' + "011": + name: 'Western Africa' + "013": + name: 'Central America' + "014": + name: 'Eastern Africa' + "015": + name: 'Northern Africa' + "017": + name: 'Middle Africa' + "018": + name: 'Southern Africa' + "019": + name: 'Americas' + "021": + name: 'Northern America' + "029": + name: 'Caribbean' + "030": + name: 'Eastern Asia' + "034": + name: 'Southern Asia' + "035": + name: 'South-Eastern Asia' + "039": + name: 'Southern Europe' + "053": + name: 'Australia and New Zealand' + "054": + name: 'Melanesia' + "057": + name: 'Micronesia' + "061": + name: 'Polynesia' + "419": + name: 'Latin America and the Caribbean' + "142": + name: 'Asia' + "143": + name: 'Central Asia' + "145": + name: 'Western Asia' + "150": + name: 'Europe' + "151": + name: 'Eastern Europe' + "154": + name: 'Northern Europe' + "155": + name: 'Western Europe' diff --git a/spec/carmen/continent_spec.rb b/spec/carmen/continent_spec.rb new file mode 100644 index 00000000..f723d99a --- /dev/null +++ b/spec/carmen/continent_spec.rb @@ -0,0 +1,77 @@ +require 'spec_helper' + +describe Carmen::Continent do + + describe "#initialize when given a string of contained-country-codes" do + + it "will interpret them as carmen-countries and set them as contained_continents_or_countries" do + continent = Carmen::Continent.new({'territory' => '001', 'contains' => ['002', '003', '004']}) + + continent.sub_continents.count.must_equal 3 + continent.sub_continents[0].class.must_equal Carmen::Continent + continent.sub_continents[1].class.must_equal Carmen::Continent + continent.sub_continents[2].class.must_equal Carmen::Continent + end + end + + describe "#initialize when given a string of contained-continent-codes" do + it "will interpret them as carmen-continents and set them as contained_continents_or_countries" do + continent = Carmen::Continent.new({'territory' => '011', 'contains' => ['OC','EU']}) + + continent.countries.count.must_equal 2 + continent.countries[0].class.must_equal Carmen::Country + continent.countries[1].class.must_equal Carmen::Country + end + end + + describe '#coded' do + it 'gets the continent with the given code' do + continent = Carmen::Continent.coded('003') + continent.name.must_equal 'Waterworld' + continent.code.must_equal '003' + + continent.sub_continents.count.must_equal 2 + continent.countries.count.must_equal 0 + end + end + + describe '#name' do + it 'uses the i18n-backend to fetch the correct name' do + continent = Carmen::Continent.coded('002') + continent.name.must_equal 'Junglolia' + + continent = Carmen::Continent.coded('003') + continent.name.must_equal 'Waterworld' + end + end + + describe '#sub_continents' do + it 'returns the sub_continents of the given continent' do + Carmen::Continent.coded('002').sub_continents.count.must_equal 2 + Carmen::Continent.coded('002').sub_continents[0].code.must_equal "004" + Carmen::Continent.coded('002').sub_continents[1].code.must_equal "005" + end + end + + describe '#countries' do + it 'returns the countries of the given continent if NO sub_continents are present' do + Carmen::Continent.coded('004').countries.count.must_equal 3 + end + + it 'finds all countries of all sub_continents if some are present' do + Carmen::Continent.coded('002').countries.count.must_equal 3 + end + end + + describe '#continent' do + it 'returns the parent-continent for this continent' do + Carmen::Continent.coded('004').continent.code.must_equal '002' + end + end + + describe '#all' do + it 'returns all existing continents of all hierachies without world' do + Carmen::Continent.all.count.must_equal 6 + end + end +end diff --git a/spec/carmen/country_spec.rb b/spec/carmen/country_spec.rb index 03281ee4..c22acd1c 100644 --- a/spec/carmen/country_spec.rb +++ b/spec/carmen/country_spec.rb @@ -43,7 +43,12 @@ eastasia.instance_of?(Carmen::Country).must_equal true eastasia.name.must_equal 'Eastasia' end + end + describe '#continent' do + it 'provides access to the continent it belongs to' do + Carmen::Country.coded('OC').continent.must_equal Carmen::Continent.coded('004') + end end describe 'API for finding countries by code' do diff --git a/spec/carmen/region_spec.rb b/spec/carmen/region_spec.rb index 9ecf32f3..eb38ed23 100644 --- a/spec/carmen/region_spec.rb +++ b/spec/carmen/region_spec.rb @@ -3,7 +3,6 @@ require 'spec_helper' describe Carmen::Region do - describe 'basic methods' do before do @airstrip_one = Carmen::Country.coded('OC').subregions.first @@ -12,25 +11,25 @@ it 'has a reasonable inspect value' do @airstrip_one.inspect.must_equal '<#Carmen::Region name="Airstrip One" type="province">' end - + it 'has a reasonable explicit string conversion' do - "#{@airstrip_one}".must_equal 'Airstrip One' + @airstrip_one.to_s.must_equal 'Airstrip One' end - it "has the correct subregion path" do - @airstrip_one.subregion_data_path.must_equal "world/oc/ao.yml" + it 'has the correct subregion path' do + @airstrip_one.subregion_data_path.must_equal 'world/oc/ao.yml' end - it "knows if it has subregions" do + it 'knows if it has subregions' do @airstrip_one.subregions?.must_equal true end - it "has a path" do + it 'has a path' do @airstrip_one.path.must_equal 'world.oc.ao' end - describe "subregions" do - it "is frozen" do + describe 'subregions' do + it 'is frozen' do subregions = Carmen::Country.coded('OC').subregions assert_raises RuntimeError do @@ -39,30 +38,30 @@ end end - describe "subregion" do + describe 'subregion' do before do @london = @airstrip_one.subregions.first end - it "has a name" do - @london.name.must_equal "London" + it 'has a name' do + @london.name.must_equal 'London' end - it "has a code" do + it 'has a code' do @london.code.must_equal 'LO' end - it "has a type" do + it 'has a type' do @london.type.must_equal 'city' end - it "has a parent" do + it 'has a parent' do @london.parent.must_equal @airstrip_one end end end - describe "querying" do + describe 'querying' do before do @world = Carmen::World.instance end @@ -72,33 +71,33 @@ eastasia.name.must_equal('Eastasia') end - it "can find subregions by case-insensitive search by default" do + it 'can find subregions by case-insensitive search by default' do eurasia = @world.subregions.named('eUrAsIa') eurasia.instance_of?(Carmen::Country).must_equal true eurasia.name.must_equal 'Eurasia' end - it "can find subregions optionally case-sensitively" do - oceania = @world.subregions.named('oCeAnIa', :case => true) + it 'can find subregions optionally case-sensitively' do + oceania = @world.subregions.named('oCeAnIa', case: true) assert_nil(oceania) - oceania = @world.subregions.named('Oceania', :case => true) + oceania = @world.subregions.named('Oceania', case: true) oceania.instance_of?(Carmen::Country).must_equal true oceania.name.must_equal 'Oceania' end - it "can find subregions with fuzzy (substring) matching optionally" do - eastasia = @world.subregions.named('East', :fuzzy => true) + it 'can find subregions with fuzzy (substring) matching optionally' do + eastasia = @world.subregions.named('East', fuzzy: true) eastasia.instance_of?(Carmen::Country).must_equal true eastasia.name.must_equal 'Eastasia' end it 'can find subregions with dash or hyphen in name ' do - @airstrip_one = Carmen::Country.coded('OC').subregions.named('Airstrip-One', :fuzzy => true) - "#{@airstrip_one}".must_equal 'Airstrip One' - @airstrip_two_without_dash = Carmen::Country.coded('OC').subregions.named('Airstrip Two', :fuzzy => true) - "#{@airstrip_two_without_dash}".must_equal 'Airstrip-Two' - @airstrip_two = Carmen::Country.coded('OC').subregions.named('Airstrip-Two', :fuzzy => true) - "#{@airstrip_two}".must_equal 'Airstrip-Two' + @airstrip_one = Carmen::Country.coded('OC').subregions.named('Airstrip-One', fuzzy: true) + @airstrip_one.to_s.must_equal 'Airstrip One' + @airstrip_two_without_dash = Carmen::Country.coded('OC').subregions.named('Airstrip Two', fuzzy: true) + @airstrip_two_without_dash.to_s.must_equal 'Airstrip-Two' + @airstrip_two = Carmen::Country.coded('OC').subregions.named('Airstrip-Two', fuzzy: true) + @airstrip_two.to_s.must_equal 'Airstrip-Two' end it 'can find subregions by name using a regex' do @@ -135,25 +134,23 @@ end it 'can find a country using unicode characters' do - large = @world.subregions.named('gross', :fuzzy => true) + large = @world.subregions.named('gross', fuzzy: true) large.instance_of?(Carmen::Country).must_equal true large.name.must_equal('Das großartige Staat von Eurasia') end - end end class SortTestRegion < Carmen::Region - def initialize(data={}, parent=nil) + attr_reader :name + + def initialize(data = {}, parent = nil) super @name = data['name'] end - def name - @name - end end - describe "Sorting" do + describe 'Sorting' do it 'does a comparison' do germany = SortTestRegion.new('name' => 'Germany') guatemala = SortTestRegion.new('name' => 'Guatemala') diff --git a/spec/carmen/world_spec.rb b/spec/carmen/world_spec.rb index 48b3a419..1fe6e80c 100644 --- a/spec/carmen/world_spec.rb +++ b/spec/carmen/world_spec.rb @@ -1,7 +1,6 @@ require 'spec_helper' describe Carmen::World do - it 'is the World' do Carmen::World.instance.is_a?(Carmen::World).must_equal(true) end @@ -10,4 +9,11 @@ Carmen::World.instance.subregions.size.must_equal(3) end + it 'has 2 continents' do + Carmen::World.instance.continents.size.must_equal(2) + end + + it 'has 3 countries' do + Carmen::World.instance.countries.size.must_equal(3) + end end diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index d78a8fcb..749e1e9b 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -6,6 +6,7 @@ def setup_carmen_test_data_path Carmen.clear_data_paths Carmen.append_data_path(carmen_spec_data_path) + Carmen.territories_path = Carmen.root_path + 'spec_data/territories/territories.yml' end def setup_carmen_test_i18n_backend @@ -30,4 +31,3 @@ def carmen_spec_overlay_data_path setup_carmen_test_data_path setup_carmen_test_i18n_backend - diff --git a/spec_data/locale/en/world.yml b/spec_data/locale/en/world.yml index b47e88c6..1ee5474a 100644 --- a/spec_data/locale/en/world.yml +++ b/spec_data/locale/en/world.yml @@ -1,4 +1,4 @@ ---- +--- en: world: oc: @@ -13,3 +13,18 @@ en: common_name: Eastasia name: Eastasia official_name: The Superstate of Eastasia + continents: + '001': + name: 'World' + '002': + name: 'Junglolia' + '003': + name: 'Waterworld' + '004': + name: 'Takatukaland' + '005': + name: 'Disneyland' + '006': + name: 'Middle Earth' + '007': + name: 'Skyrim' diff --git a/spec_data/territories/territories.yml b/spec_data/territories/territories.yml new file mode 100644 index 00000000..26b794e8 --- /dev/null +++ b/spec_data/territories/territories.yml @@ -0,0 +1,32 @@ +--- + territoryContainment: + - + territory: "001" + contains: + - "002" + - "003" + - + territory: "002" + contains: + - "004" + - "005" + - + territory: "003" + contains: + - "006" + - "007" + - + territory: "004" + contains: + - "OC" + - "EU" + - "ES" + - + territory: "005" + contains: + - + territory: "006" + contains: + - + territory: "007" + contains: