Return unmapped timezones from `country_zones`

If a country doesn't exist in the MAPPINGS hash then create a new
`ActiveSupport::Timezone` instance using the supplied timezone id.

Fixes #28431.
This commit is contained in:
Andrew White 2017-03-28 13:11:55 +01:00
parent 5561412ac2
commit d28c482435
2 changed files with 16 additions and 5 deletions

View File

@ -250,14 +250,21 @@ module ActiveSupport
# for time zones in the country specified by its ISO 3166-1 Alpha2 code.
def country_zones(country_code)
code = country_code.to_s.upcase
@country_zones[code] ||=
TZInfo::Country.get(code).zone_identifiers.map do |tz_id|
name = MAPPING.key(tz_id)
name && self[name]
end.compact.sort!
@country_zones[code] ||= load_country_zones(code)
end
private
def load_country_zones(code)
country = TZInfo::Country.get(code)
country.zone_identifiers.map do |tz_id|
if MAPPING.value?(tz_id)
self[MAPPING.key(tz_id)]
else
create(tz_id, nil, TZInfo::Timezone.new(tz_id))
end
end.sort!
end
def zones_map
@zones_map ||= begin
MAPPING.each_key { |place| self[place] } # load all the zones

View File

@ -714,6 +714,10 @@ class TimeZoneTest < ActiveSupport::TestCase
assert_not_includes ActiveSupport::TimeZone.country_zones(:ru), ActiveSupport::TimeZone["Kuala Lumpur"]
end
def test_country_zones_without_mappings
assert_includes ActiveSupport::TimeZone.country_zones(:sv), ActiveSupport::TimeZone["America/El_Salvador"]
end
def test_to_yaml
assert_equal("--- !ruby/object:ActiveSupport::TimeZone\nname: Pacific/Honolulu\n", ActiveSupport::TimeZone["Hawaii"].to_yaml)
assert_equal("--- !ruby/object:ActiveSupport::TimeZone\nname: Europe/London\n", ActiveSupport::TimeZone["Europe/London"].to_yaml)