Skip to content

Commit

Permalink
Return unmapped timezones from country_zones
Browse files Browse the repository at this point in the history
If a country doesn't exist in the MAPPINGS hash then create a new
`ActiveSupport::Timezone` instance using the supplied timezone id.

Fixes #28431.
  • Loading branch information
pixeltrix committed Mar 28, 2017
1 parent ac18637 commit 67689e3
Show file tree
Hide file tree
Showing 3 changed files with 25 additions and 5 deletions.
9 changes: 9 additions & 0 deletions activesupport/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,12 @@
* 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.

*Andrew White*

* Add ActiveSupport::Deprecation::DeprecatedConstantAccessor

Provides transparent deprecation of constants, compatible with exceptions.
Expand Down
17 changes: 12 additions & 5 deletions activesupport/lib/active_support/values/time_zone.rb
Original file line number Diff line number Diff line change
Expand Up @@ -250,14 +250,21 @@ def us_zones
# 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
Expand Down
4 changes: 4 additions & 0 deletions activesupport/test/time_zone_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -714,6 +714,10 @@ def test_country_zones
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)
Expand Down

0 comments on commit 67689e3

Please sign in to comment.