timezone 0.99.2 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (61) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGES.markdown +6 -0
  3. data/README.markdown +1 -11
  4. data/Rakefile +3 -1
  5. data/data/America/Caracas +2 -1
  6. data/data/Asia/Almaty +51 -48
  7. data/data/Asia/Anadyr +3 -3
  8. data/data/Asia/Aqtau +50 -50
  9. data/data/Asia/Aqtobe +51 -49
  10. data/data/Asia/Baku +2 -2
  11. data/data/Asia/Barnaul +3 -3
  12. data/data/Asia/Chita +3 -3
  13. data/data/Asia/Irkutsk +3 -3
  14. data/data/Asia/Kamchatka +3 -3
  15. data/data/Asia/Khandyga +3 -3
  16. data/data/Asia/Krasnoyarsk +3 -3
  17. data/data/Asia/Magadan +5 -4
  18. data/data/Asia/Novokuznetsk +3 -3
  19. data/data/Asia/Novosibirsk +3 -3
  20. data/data/Asia/Omsk +3 -3
  21. data/data/Asia/Oral +51 -50
  22. data/data/Asia/Qyzylorda +51 -50
  23. data/data/Asia/Sakhalin +3 -3
  24. data/data/Asia/Srednekolymsk +3 -3
  25. data/data/Asia/Tomsk +68 -0
  26. data/data/Asia/Ust-Nera +3 -3
  27. data/data/Asia/Vladivostok +3 -3
  28. data/data/Asia/Yakutsk +3 -3
  29. data/data/Asia/Yekaterinburg +3 -3
  30. data/data/Asia/Yerevan +3 -3
  31. data/data/Europe/Astrakhan +2 -2
  32. data/data/Europe/Kaliningrad +3 -3
  33. data/data/Europe/Kirov +64 -0
  34. data/data/Europe/Minsk +2 -2
  35. data/data/Europe/Moscow +3 -3
  36. data/data/Europe/Samara +3 -3
  37. data/data/Europe/Ulyanovsk +3 -3
  38. data/data/Europe/Volgograd +2 -2
  39. data/data/W-SU +3 -3
  40. data/lib/timezone/error.rb +0 -4
  41. data/lib/timezone/lookup/basic.rb +1 -7
  42. data/lib/timezone/lookup/geonames.rb +7 -6
  43. data/lib/timezone/lookup/google.rb +2 -1
  44. data/lib/timezone/net_http_client.rb +1 -10
  45. data/lib/timezone/version.rb +1 -1
  46. data/lib/timezone/zone.rb +1 -122
  47. data/test/http_test_client.rb +1 -2
  48. data/test/mocks/{api_limit_reached.txt → api_limit_reached.json} +0 -0
  49. data/test/mocks/invalid_latlong.json +1 -0
  50. data/test/mocks/invalid_parameter.json +1 -0
  51. data/test/{basic_lookup_test.rb → timezone/lookup/test_basic.rb} +3 -1
  52. data/test/timezone/lookup/test_geonames.rb +33 -4
  53. data/test/timezone/test_zone.rb +211 -3
  54. data/timezone.gemspec +14 -13
  55. metadata +22 -26
  56. data/lib/timezone/active_support.rb +0 -156
  57. data/lib/timezone/configure.rb +0 -258
  58. data/test/geonames_lookup_test.rb +0 -56
  59. data/test/google_lookup_test.rb +0 -81
  60. data/test/test_lookup_test.rb +0 -41
  61. data/test/timezone_test.rb +0 -297
@@ -1,81 +0,0 @@
1
- require 'timezone/configure'
2
- require 'timezone/lookup/google'
3
- require 'minitest/autorun'
4
- require 'timecop'
5
- require_relative 'http_test_client'
6
-
7
- class GoogleLookupTest < ::Minitest::Unit::TestCase
8
- def setup
9
- config { |c| c.google_api_key = 'MTIzYWJj' }
10
- end
11
-
12
- def coordinates
13
- [-34.92771808058, 138.477041423321]
14
- end
15
-
16
- def lookup
17
- ::Timezone::Configure.lookup
18
- end
19
-
20
- def config
21
- Timezone::Configure.instance_variable_set(:@lookup, nil)
22
- Timezone::Configure.instance_variable_set(:@geonames_lookup, nil)
23
- Timezone::Configure.instance_variable_set(:@google_lookup, nil)
24
-
25
- Timezone::Configure.begin do |c|
26
- c.http_client = HTTPTestClient
27
- yield(c)
28
- end
29
- end
30
-
31
- def test_google_using_lat_lon_coordinates
32
- lookup.client.body =
33
- File.open(mock_path + '/google_lat_lon_coords.txt').read
34
-
35
- assert_equal 'Australia/Adelaide', lookup.lookup(*coordinates)
36
- end
37
-
38
- def test_google_request_denied_read_lat_lon_coordinates
39
- lookup.client.body = nil
40
- assert_raises Timezone::Error::Google do
41
- lookup.lookup(*coordinates)
42
- end
43
- end
44
-
45
- def test_url_non_enterprise
46
- Timecop.freeze(Time.at(1_433_347_661)) do
47
- result = lookup.send(:url, '123', '123')
48
- params = {
49
- 'location' => '123%2C123',
50
- 'timestamp' => '1433347661',
51
- 'key' => 'MTIzYWJj'
52
- }.map { |k, v| "#{k}=#{v}" }
53
-
54
- assert_equal "/maps/api/timezone/json?#{params.join('&')}", result
55
- end
56
- end
57
-
58
- def test_url_enterprise
59
- config { |c| c.google_client_id = '123&asdf' }
60
-
61
- Timecop.freeze(Time.at(1_433_347_661)) do
62
- result = lookup.send(:url, '123', '123')
63
- params = {
64
- 'location' => '123%2C123',
65
- 'timestamp' => '1433347661',
66
- 'client' => '123%26asdf',
67
- 'signature' => 'B1TNSSvIw9Wvf_ZjjW5uRzGm4F4='
68
- }.map { |k, v| "#{k}=#{v}" }
69
-
70
- assert_equal "/maps/api/timezone/json?#{params.join('&')}", result
71
- end
72
- ensure
73
- config { |c| c.google_client_id = nil }
74
- end
75
-
76
- private
77
-
78
- def mock_path
79
- File.expand_path(File.join(File.dirname(__FILE__), 'mocks'))
80
- end
81
- end
@@ -1,41 +0,0 @@
1
- require 'timezone/configure'
2
- require 'timezone/lookup/test'
3
- require 'timezone/zone'
4
- require 'minitest/autorun'
5
-
6
- class TestLookupTest < ::Minitest::Unit::TestCase
7
- def setup
8
- Timezone::Configure.begin do |c|
9
- c.lookup = ::Timezone::Lookup::Test
10
- end
11
- end
12
-
13
- def test_simple_stub
14
- ::Timezone::Configure.lookup.stub(-10, 10, 'America/Los_Angeles')
15
-
16
- assert_equal(
17
- 'America/Los_Angeles',
18
- ::Timezone::Zone.new(lat: -10, lon: 10).zone)
19
- end
20
-
21
- def test_missing_stub
22
- assert_raises(::Timezone::Error::Test) do
23
- ::Timezone::Zone.new(lat: 100, lon: 100)
24
- end
25
- end
26
-
27
- def test_clear_lookup
28
- ::Timezone::Configure.begin do |c|
29
- c.username = 'foo'
30
- c.lookup = nil
31
- end
32
-
33
- assert ::Timezone::Lookup::Geonames, ::Timezone::Configure.lookup.class
34
- end
35
-
36
- def teardown
37
- Timezone::Configure.instance_variable_set(:@lookup, nil)
38
- Timezone::Configure.instance_variable_set(:@google_lookup, nil)
39
- Timezone::Configure.instance_variable_set(:@geonames_lookup, nil)
40
- end
41
- end
@@ -1,297 +0,0 @@
1
- require 'timezone'
2
- require 'timezone/zone'
3
- require 'minitest/autorun'
4
- require 'timecop'
5
-
6
- class TimezoneTest < ::Minitest::Unit::TestCase
7
- def test_valid_timezone
8
- refute_nil(Timezone::Zone.new(zone: 'Australia/Sydney'))
9
- end
10
-
11
- def test_nil_timezone
12
- assert_raises Timezone::Error::NilZone do
13
- Timezone::Zone.new zone: nil
14
- end
15
- end
16
-
17
- def test_invalid_timezone
18
- assert_raises Timezone::Error::InvalidZone do
19
- Timezone::Zone.new zone: 'Foo/Bar'
20
- end
21
- end
22
-
23
- def test_timezone_list
24
- list = Timezone::Zone.list 'Australia/Sydney', 'America/Chicago'
25
- assert list.is_a?(Array)
26
- assert list.count == 2
27
- assert list.first.is_a?(Hash)
28
- assert(list.any? { |l| l[:zone] == 'Australia/Sydney' })
29
- end
30
-
31
- def test_timezone_list_current_time
32
- Timecop.freeze(Time.new(2012, 2, 2, 0, 0, 0)) do
33
- assert !Timezone::Zone.list('EST5EDT').first[:dst]
34
- end
35
- Timecop.freeze(Time.new(2013, 6, 6, 0, 0, 0)) do
36
- assert Timezone::Zone.list('EST5EDT').first[:dst]
37
- end
38
- end
39
-
40
- def test_timezone_custom_list_order
41
- Timezone::Configure.order_list_by = :title
42
- Timezone::Configure.replace 'America/Chicago', with: 'Chicago'
43
- list = Timezone::Zone.list 'Australia/Sydney', 'America/Chicago'
44
- assert list.first[:title] == 'Australia/Sydney'
45
- assert list.last[:title] == 'Chicago'
46
- assert list.last[:zone] == 'America/Chicago'
47
- end
48
-
49
- def test_timezone_default_list
50
- Timezone::Configure.default_for_list = 'America/Chicago', 'Australia/Sydney'
51
- list = Timezone::Zone.list
52
- assert list.count == 2
53
- assert(list.any? { |l| l.value?('Australia/Sydney') })
54
- end
55
-
56
- def test_timezone_names
57
- zones = Timezone::Zone.names
58
- assert zones.is_a?(Array)
59
- assert zones.count > 0
60
- assert zones.include? 'Australia/Sydney'
61
- end
62
-
63
- def time_timezone_equivalence
64
- gmt = Timezone::Zone.new zone: 'GMT'
65
- australia = Timezone::Zone.new zone: 'Australia/Sydney'
66
-
67
- assert_equal(gmt, Timezone::Zone.new(zone: 'GMT'))
68
- assert gmt <= australia
69
- assert gmt < australia
70
- end
71
-
72
- def utc_offset(zone, year, month, day)
73
- Timezone::Zone.new(zone: zone).utc_offset(Time.new(year, month, day))
74
- end
75
-
76
- def test_getting_utc_offset
77
- assert_equal(36_000, utc_offset('Australia/Sydney', 2011, 06, 05))
78
- assert_equal(-25_200, utc_offset('America/Los_Angeles', 2011, 06, 05))
79
- assert_equal(20_700, utc_offset('Asia/Kathmandu', 2011, 06, 05))
80
- assert_equal(-18_000, utc_offset('America/New_York', 2011, 01, 11))
81
- assert_equal(-14_400, utc_offset('America/New_York', 2011, 06, 11))
82
- end
83
-
84
- def dst?(zone, year, month, day)
85
- Timezone::Zone.new(zone: zone).dst?(Time.new(year, month, day))
86
- end
87
-
88
- def test_getting_dst
89
- refute dst?('Australia/Sydney', 2011, 06, 05)
90
- assert dst?('America/Los_Angeles', 2011, 06, 05)
91
- refute dst?('Asia/Kathmandu', 2011, 06, 05)
92
-
93
- refute dst?('America/New_York', 2011, 01, 11)
94
- assert dst?('America/New_York', 2011, 06, 11)
95
- end
96
-
97
- def test_loading_gmt_timezone
98
- timezone = Timezone::Zone.new zone: 'GMT'
99
- assert_equal Time.now.utc.to_i, timezone.time(Time.now).to_i
100
- end
101
-
102
- def test_loading_historical_time
103
- timezone = Timezone::Zone.new zone: 'America/Los_Angeles'
104
- local = Time.strptime('2011-02-11T13:20:00Z', '%Y-%m-%dT%H:%M:%SZ')
105
- utc = Time.strptime('2011-02-11T21:20:00Z', '%Y-%m-%dT%H:%M:%SZ')
106
- assert_equal local.to_i, timezone.time(utc).to_i
107
- end
108
-
109
- # http://www.timeanddate.com/worldclock/clockchange.html?n=137&year=2011
110
- def test_historical_time_change_in_la_forward
111
- timezone = Timezone::Zone.new zone: 'America/Los_Angeles'
112
- local = Time.strptime('2011-03-13T01:59:59 UTC', '%Y-%m-%dT%H:%M:%S %Z')
113
- utc = Time.strptime('2011-03-13T09:59:59 UTC', '%Y-%m-%dT%H:%M:%S %Z')
114
- assert_equal local.to_i, timezone.time(utc).to_i
115
-
116
- timezone = Timezone::Zone.new zone: 'America/Los_Angeles'
117
- local = Time.strptime('2011-03-13T03:00:00 UTC', '%Y-%m-%dT%H:%M:%S %Z')
118
- utc = Time.strptime('2011-03-13T10:00:00 UTC', '%Y-%m-%dT%H:%M:%S %Z')
119
- assert_equal local.to_i, timezone.time(utc).to_i
120
- end
121
-
122
- # http://www.timeanddate.com/worldclock/clockchange.html?n=137&year=2011
123
- def test_historical_time_change_in_la_backward
124
- timezone = Timezone::Zone.new zone: 'America/Los_Angeles'
125
- local = Time.strptime('2011-11-06T01:59:59 UTC', '%Y-%m-%dT%H:%M:%S %Z')
126
- utc = Time.strptime('2011-11-06T08:59:59 UTC', '%Y-%m-%dT%H:%M:%S %Z')
127
- assert_equal local.to_i, timezone.time(utc).to_i
128
-
129
- timezone = Timezone::Zone.new zone: 'America/Los_Angeles'
130
- local = Time.strptime('2011-11-06T01:00:00 UTC', '%Y-%m-%dT%H:%M:%S %Z')
131
- utc = Time.strptime('2011-11-06T09:00:00 UTC', '%Y-%m-%dT%H:%M:%S %Z')
132
- assert_equal local.to_i, timezone.time(utc).to_i
133
- end
134
-
135
- # http://www.timeanddate.com/worldclock/clockchange.html?n=2364&year=1940
136
- def test_historical_time_change_in_hebron
137
- timezone = Timezone::Zone.new zone: 'Asia/Hebron'
138
- local = Time.strptime('1940-05-31T23:59:59 UTC', '%Y-%m-%dT%H:%M:%S %Z')
139
- utc = Time.strptime('1940-05-31T21:59:59 UTC', '%Y-%m-%dT%H:%M:%S %Z')
140
- assert_equal local.to_i, timezone.time(utc).to_i
141
-
142
- timezone = Timezone::Zone.new zone: 'Asia/Hebron'
143
- local = Time.strptime('1940-06-01T01:00:00 UTC', '%Y-%m-%dT%H:%M:%S %Z')
144
- utc = Time.strptime('1940-05-31T22:00:00 UTC', '%Y-%m-%dT%H:%M:%S %Z')
145
- assert_equal local.to_i, timezone.time(utc).to_i
146
- end
147
-
148
- def test_loading_half_hour_timezone
149
- timezone = Timezone::Zone.new zone: 'Asia/Kathmandu'
150
- utc = Time.utc(2011, 1, 4, 3, 51, 29)
151
- local = Time.utc(2011, 1, 4, 9, 36, 29)
152
- assert_equal local.to_i, timezone.time(utc).to_i
153
- end
154
-
155
- # Testing is done with strings since two times can be equivalent even if
156
- # their offsets do not match, and we want to test that the time and offsets
157
- # are equivalent.
158
- def test_time_with_offset
159
- timezone = Timezone::Zone.new zone: 'Asia/Kathmandu'
160
- utc = Time.utc(2011, 1, 4, 3, 51, 29)
161
- local = Time.new(2011, 1, 4, 9, 36, 29, 20_700)
162
- assert_equal local.to_s, timezone.time_with_offset(utc).to_s
163
-
164
- zone = Timezone::Zone.new(zone: 'America/Los_Angeles')
165
- utc = Time.utc(2014, 12, 15, 22, 00, 00)
166
- local = Time.new(2014, 12, 15, 14, 00, 00, '-08:00')
167
- assert_equal local.to_s, zone.time_with_offset(utc).to_s
168
-
169
- utc = Time.utc(2014, 4, 5, 22, 00, 00)
170
- local = Time.new(2014, 4, 5, 15, 00, 00, '-07:00')
171
- assert_equal local.to_s, zone.time_with_offset(utc).to_s
172
- end
173
-
174
- def test_australian_timezone_with_dst
175
- timezone = Timezone::Zone.new zone: 'Australia/Adelaide'
176
- utc = Time.utc(2010, 12, 23, 19, 37, 15)
177
- local = Time.utc(2010, 12, 24, 6, 7, 15)
178
- assert_equal local.to_i, timezone.time(utc).to_i
179
- end
180
-
181
- def test_local_to_utc
182
- timezone = Timezone::Zone.new(zone: 'America/Los_Angeles')
183
-
184
- # Time maps to two rules - we pick the first
185
- local = Time.utc(2015, 11, 1, 1, 50, 0)
186
- utc = Time.utc(2015, 11, 1, 8, 50, 0)
187
- assert_equal(utc.to_s, timezone.local_to_utc(local).to_s)
188
-
189
- # Time is above the maximum - we pick the last rule
190
- local = Time.utc(3000, 1, 1, 0, 0, 0)
191
- utc = Time.utc(3000, 1, 1, 8, 0, 0)
192
- assert_equal(utc.to_s, timezone.local_to_utc(local).to_s)
193
-
194
- # Time maps to a single rule - we pick that rule
195
- local = Time.utc(2015, 11, 1, 0, 1, 0)
196
- utc = Time.utc(2015, 11, 1, 7, 1, 0)
197
- assert_equal(utc.to_s, timezone.local_to_utc(local).to_s)
198
-
199
- # Time is missing - we pick the first closest rule
200
- local = Time.utc(2015, 3, 8, 2, 50, 0)
201
- utc = Time.utc(2015, 3, 8, 9, 50, 0)
202
- assert_equal(utc.to_s, timezone.local_to_utc(local).to_s)
203
- end
204
-
205
- def test_configure_url_default
206
- Timezone::Configure.begin { |c| c.google_api_key = nil }
207
- assert_equal 'api.geonames.org', Timezone::Configure.url
208
- end
209
-
210
- def test_configure_url_custom
211
- Timezone::Configure.begin { |c| c.google_api_key = nil }
212
- Timezone::Configure.begin do |c|
213
- c.geonames_url = 'www.newtimezoneserver.com'
214
- end
215
- assert_equal 'www.newtimezoneserver.com', Timezone::Configure.url
216
- # clean up url after test
217
- Timezone::Configure.begin { |c| c.geonames_url = nil }
218
- end
219
-
220
- def test_utc_offset_without_dst
221
- timezone = Timezone::Zone.new zone: 'Europe/Helsinki'
222
- # just before DST starts
223
- utc = Time.utc(2012, 3, 25, 0, 59, 59)
224
- assert_equal timezone.utc_offset(utc), 7200
225
- # on the second DST ends
226
- utc = Time.utc(2012, 10, 28, 1, 0, 0)
227
- assert_equal timezone.utc_offset(utc), 7200
228
- end
229
-
230
- def test_utc_offset_with_dst
231
- timezone = Timezone::Zone.new zone: 'Europe/Helsinki'
232
- # on the second DST starts
233
- utc = Time.utc(2012, 3, 25, 1, 0, 0)
234
- assert_equal timezone.utc_offset(utc), 10_800
235
- # right before DST end
236
- utc = Time.utc(2012, 10, 28, 0, 59, 59)
237
- assert_equal timezone.utc_offset(utc), 10_800
238
- end
239
-
240
- def test_active_support_timezone
241
- timezone = Timezone::Zone.new(zone: 'Australia/Adelaide')
242
- assert_equal 'Australia/Adelaide', timezone.zone
243
- assert_equal 'Adelaide', timezone.active_support_time_zone
244
-
245
- timezone = Timezone::Zone.new(zone: 'America/Phoenix')
246
- assert_equal 'America/Phoenix', timezone.zone
247
- assert_equal 'Arizona', timezone.active_support_time_zone
248
-
249
- timezone = Timezone::Zone.new(zone: 'America/Anchorage')
250
- assert_equal 'America/Anchorage', timezone.zone
251
- assert_equal 'America/Anchorage', timezone.active_support_time_zone
252
- end
253
-
254
- EQUIVALENCE_METHODS = [
255
- :time,
256
- :local_to_utc,
257
- :time_with_offset,
258
- :dst?,
259
- :utc_offset
260
- ].freeze
261
-
262
- def check_equivalence(zone, time, other)
263
- tz = Timezone::Zone.new(zone: zone)
264
-
265
- EQUIVALENCE_METHODS.each do |m|
266
- assert_equal(tz.public_send(m, time), tz.public_send(m, other))
267
- end
268
- end
269
-
270
- def test_date_equivalence
271
- time = Time.new(2011, 2, 3, 0, 0, 0)
272
- date = Date.new(2011, 2, 3)
273
-
274
- check_equivalence('America/Los_Angeles', time, date)
275
-
276
- time = Time.new(2011, 6, 3, 0, 0, 0)
277
- date = Date.new(2011, 6, 3)
278
-
279
- check_equivalence('America/Los_Angeles', time, date)
280
- end
281
-
282
- def test_datetime_equivalence
283
- zone = ENV['TZ']
284
- ENV['TZ'] = 'UTC'
285
- time = Time.new(2011, 2, 3, 13, 5, 0)
286
- datetime = DateTime.new(2011, 2, 3, 13, 5, 0, 0)
287
-
288
- check_equivalence('America/Los_Angeles', time, datetime)
289
-
290
- time = Time.new(2011, 6, 3, 13, 5, 0)
291
- datetime = DateTime.new(2011, 6, 3, 13, 5, 0, 0)
292
-
293
- check_equivalence('America/Los_Angeles', time, datetime)
294
- ensure
295
- ENV['TZ'] = zone
296
- end
297
- end