timezone 0.2.1 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,20 @@
1
+ require 'timezone/parser/rule/on_rules'
2
+ require 'minitest/autorun'
3
+
4
+ describe Timezone::Parser::Rule::On do
5
+ def parse(*args)
6
+ Timezone::Parser::Rule::On.parse(*args)
7
+ end
8
+
9
+ it 'parses lastDAY' do
10
+ assert_equal ['Oct', '29'], parse('lastSun', 'Oct', 1995)
11
+ assert_equal ['Oct', '27'], parse('lastSun', 'Oct', 1996)
12
+ assert_equal ['Oct', '26'], parse('lastSun', 'Oct', 1997)
13
+ end
14
+
15
+ it 'parses DAY>=NUM' do
16
+ assert_equal ['Apr', '01'], parse('Fri>=26', 'Mar', 2005)
17
+ assert_equal ['Mar', '31'], parse('Fri>=26', 'Mar', 2006)
18
+ assert_equal ['Mar', '30'], parse('Fri>=26', 'Mar', 2007)
19
+ end
20
+ end
@@ -0,0 +1,52 @@
1
+ require 'timezone/parser/rule'
2
+ require 'minitest/autorun'
3
+
4
+ describe Timezone::Parser::Rule do
5
+ before do
6
+ Timezone::Parser.rules.clear
7
+ Timezone::Parser.rule("Rule Zion 1940 only - Jun 1 0:00 1:00 D")
8
+ @rule = Timezone::Parser.rules['Zion'].first
9
+ Timezone::Parser.rule("Rule Zion 1948 1950 - May 23 0:00 2:20 S")
10
+ @oddity = Timezone::Parser.rules['Zion'].last
11
+ end
12
+
13
+ it 'adds multiple rules with the same name' do
14
+ assert_equal 4, Timezone::Parser.rules['Zion'].count
15
+ end
16
+
17
+ describe '#offset' do
18
+ it 'properly calculates hours' do
19
+ assert_equal 3_600, @rule.offset
20
+ end
21
+
22
+ it 'properly calculates minutes' do
23
+ assert_equal 8_400, @oddity.offset
24
+ end
25
+ end
26
+
27
+ it 'selects rules given an end date' do
28
+ end_date = Time.new(1947, 1, 1).to_i * 1_000
29
+ assert_equal [@rule], Timezone::Parser.select_rules('Zion', end_date)
30
+ end
31
+
32
+ it 'knows daylight savings time' do
33
+ assert @rule.dst?
34
+ end
35
+
36
+ it 'properly calculates start_date' do
37
+ assert_equal Time.utc(1940, 6, 1, 0, 0, 0).to_i*1_000, @rule.start_date
38
+ end
39
+
40
+ it 'understands lastDAY rules' do
41
+ Timezone::Parser.rule("Rule EUAsia 1996 max - Oct lastSun 1:00u 0 -")
42
+ rule = Timezone::Parser.rules['EUAsia'].first
43
+
44
+ assert_equal Time.utc(1996, 10, 27, 1, 0, 0).to_i*1_000, rule.start_date
45
+ end
46
+
47
+ it 'understands DAY>=NUM rules' do
48
+ Timezone::Parser.rule("Rule Zion 2005 only - Mar Fri>=26 2:00 1:00 D")
49
+ rule = Timezone::Parser.rules['Zion'].last
50
+ assert_equal Time.utc(2005, 4, 1, 2, 0, 0).to_i*1_000, rule.start_date
51
+ end
52
+ end
@@ -0,0 +1,101 @@
1
+ require 'timezone/parser/zone/data_generator'
2
+ require 'minitest/autorun'
3
+
4
+ describe Timezone::Parser::Zone::DataGenerator do
5
+ it 'properly parses Asia/Hebron Zion rules' do
6
+ Timezone::Parser.zones.clear
7
+ Timezone::Parser.rules.clear
8
+
9
+ Timezone::Parser.rule("Rule Zion 1940 only - Jun 1 0:00 1:00 D")
10
+ Timezone::Parser.rule("Rule Zion 1942 1944 - Nov 1 0:00 0 S")
11
+ Timezone::Parser.rule("Rule Zion 1943 only - Apr 1 2:00 1:00 D")
12
+ Timezone::Parser.rule("Rule Zion 1944 only - Apr 1 0:00 1:00 D")
13
+ Timezone::Parser.rule("Rule Zion 1945 only - Apr 16 0:00 1:00 D")
14
+ Timezone::Parser.rule("Rule Zion 1945 only - Nov 1 2:00 0 S")
15
+ Timezone::Parser.rule("Rule Zion 1946 only - Apr 16 2:00 1:00 D")
16
+ Timezone::Parser.rule("Rule Zion 1946 only - Nov 1 0:00 0 S")
17
+ Timezone::Parser.rule("Rule Zion 1948 only - May 23 0:00 2:00 DD")
18
+ Timezone::Parser.rule("Rule Zion 1948 only - Sep 1 0:00 1:00 D")
19
+ Timezone::Parser.rule("Rule Zion 1948 1949 - Nov 1 2:00 0 S")
20
+ Timezone::Parser.rule("Rule Zion 1949 only - May 1 0:00 1:00 D")
21
+
22
+ Timezone::Parser.zone('Zone Asia/Hebron 2:20:23 - LMT 1900 Oct')
23
+ Timezone::Parser.zone('2:00 Zion EET 1948 May 15')
24
+
25
+ zones = Timezone::Parser::Zone.generate('Asia/Hebron')
26
+
27
+ assert_equal 12, zones.count
28
+
29
+ assert_equal -377705116800000, zones[0].start_date
30
+ assert_equal -2185410023000, zones[0].end_date
31
+ assert !zones[0].dst
32
+ assert_equal 8423, zones[0].offset
33
+ assert_equal 'LMT', zones[0].name
34
+
35
+ assert_equal "-9999-01-01T00:00:00Z", JSON.parse(zones[0].to_json)['_from']
36
+ assert_equal "1900-09-30T21:39:37Z", JSON.parse(zones[0].to_json)['_to']
37
+
38
+ assert_equal -2185410023000, zones[1].start_date
39
+ assert_equal -933645600000, zones[1].end_date
40
+ assert !zones[1].dst
41
+ assert_equal 7_200, zones[1].offset
42
+ assert_equal 'EET', zones[1].name
43
+
44
+ assert_equal -933645600000, zones[2].start_date
45
+ assert_equal -857358000000, zones[2].end_date
46
+ assert zones[2].dst
47
+ assert_equal 10_800, zones[2].offset
48
+ assert_equal 'EET', zones[2].name
49
+
50
+ assert_equal -857358000000, zones[3].start_date
51
+ assert_equal -844300800000, zones[3].end_date
52
+ assert !zones[3].dst
53
+ assert_equal 7_200, zones[3].offset
54
+ assert_equal 'EET', zones[3].name
55
+
56
+ assert_equal -844300800000, zones[4].start_date
57
+ assert_equal -825822000000, zones[4].end_date
58
+ assert zones[4].dst
59
+ assert_equal 10_800, zones[4].offset
60
+ assert_equal 'EET', zones[4].name
61
+ end
62
+
63
+ it 'properly parses Asia/Nicosia' do
64
+ Timezone::Parser.zones.clear
65
+ Timezone::Parser.rules.clear
66
+
67
+ Timezone::Parser.rule("Rule Cyprus 1975 only - Apr 13 0:00 1:00 S")
68
+ Timezone::Parser.rule("Rule Cyprus 1975 only - Oct 12 0:00 0 -")
69
+ Timezone::Parser.rule("Rule Cyprus 1976 only - May 15 0:00 1:00 S")
70
+ Timezone::Parser.rule("Rule Cyprus 1976 only - Oct 11 0:00 0 -")
71
+ Timezone::Parser.rule("Rule Cyprus 1977 1980 - Apr Sun>=1 0:00 1:00 S")
72
+ Timezone::Parser.rule("Rule Cyprus 1977 only - Sep 25 0:00 0 -")
73
+ Timezone::Parser.rule("Rule Cyprus 1978 only - Oct 2 0:00 0 -")
74
+ Timezone::Parser.rule("Rule Cyprus 1979 1997 - Sep lastSun 0:00 0 -")
75
+ Timezone::Parser.rule("Rule Cyprus 1981 1998 - Mar lastSun 0:00 1:00 S")
76
+ Timezone::Parser.rule("Rule EUAsia 1981 max - Mar lastSun 1:00u 1:00 S")
77
+ Timezone::Parser.rule("Rule EUAsia 1979 1995 - Sep lastSun 1:00u 0 -")
78
+ Timezone::Parser.rule("Rule EUAsia 1996 max - Oct lastSun 1:00u 0 -")
79
+
80
+ Timezone::Parser.zone('Zone Asia/Nicosia 2:13:28 - LMT 1921 Nov 14')
81
+ Timezone::Parser.zone(' 2:00 Cyprus EE%sT 1998 Sep')
82
+ Timezone::Parser.zone(' 2:00 EUAsia EE%sT')
83
+
84
+
85
+ zones = Timezone::Parser::Zone.generate('Asia/Nicosia')
86
+
87
+ assert zones[-2].dst
88
+ assert_equal 10_800, zones[-2].offset
89
+ assert_equal 2531955600000, zones[-2].start_date
90
+ assert_equal 2550704400000, zones[-2].end_date
91
+ assert_equal 'EEST', zones[-2].name
92
+
93
+ assert !zones.last.dst
94
+ assert_equal 7_200, zones.last.offset
95
+ assert_equal 2550704400000, zones.last.start_date
96
+ assert_equal 253402300799000, zones.last.end_date
97
+ assert_equal 'EET', zones.last.name
98
+
99
+ assert_equal 154, zones.count
100
+ end
101
+ end
@@ -0,0 +1,13 @@
1
+ require 'timezone/parser/zone/until'
2
+ require 'minitest/autorun'
3
+
4
+ describe Timezone::Parser::Zone::Until do
5
+ def parse(*args)
6
+ Timezone::Parser::Zone::Until.parse(*args)
7
+ end
8
+
9
+ it 'parses dates' do
10
+ assert_equal -2185401600000, parse('1900 Oct')
11
+ assert_equal -682646400000, parse('1948 May 15')
12
+ end
13
+ end
@@ -0,0 +1,42 @@
1
+ require 'timezone/parser/zone'
2
+ require 'minitest/autorun'
3
+
4
+ describe Timezone::Parser::Zone do
5
+ def setup
6
+ Timezone::Parser.rules.clear
7
+ Timezone::Parser.zones.clear
8
+ # This first rule is before the end date.
9
+ Timezone::Parser.rule("Rule Zion 1948 only - Jan 13 0:00 0:00 D")
10
+ # This second rule is after the end date.
11
+ Timezone::Parser.rule("Rule Zion 1949 only - Oct 12 0:00 0:00 D")
12
+
13
+ Timezone::Parser.zone('Zone Asia/Hebron 2:20:23 - LMT 1900 Oct')
14
+ Timezone::Parser.zone('2:00 Zion EET 1948 May 15')
15
+ Timezone::Parser.zone('2:00 EgyptAsia EE%sT 1967 Jun 5')
16
+
17
+ @zones = Timezone::Parser.zones['Asia/Hebron']
18
+ end
19
+
20
+ it 'properly parses all zone names' do
21
+ assert_equal 3, Timezone::Parser.zones['Asia/Hebron'].count
22
+ assert Timezone::Parser.zones['Asia/Hebron'].all?{ |z| z.name == 'Asia/Hebron' }
23
+ end
24
+
25
+ it 'parses offset' do
26
+ assert_equal [8423, 7_200, 7_200], @zones.map(&:offset)
27
+ end
28
+
29
+ it 'only selects rules within the entry timeline' do
30
+ assert_equal 1, @zones[1].rules.count
31
+ end
32
+
33
+ it 'parses format' do
34
+ assert_equal ['LMT', 'EET', 'EE%sT'], @zones.map(&:format)
35
+ end
36
+
37
+ it 'parses end_date' do
38
+ assert_equal Time.utc(1900, 10, 1).to_i * 1_000, @zones[0].end_date
39
+ assert_equal Time.utc(1948, 5, 15).to_i * 1_000, @zones[1].end_date
40
+ assert_equal Time.utc(1967, 6, 5).to_i * 1_000, @zones[2].end_date
41
+ end
42
+ end
@@ -0,0 +1,12 @@
1
+ require 'timezone/parser'
2
+ require 'minitest/autorun'
3
+
4
+ describe Timezone::Parser do
5
+ it 'parses files with no errors' do
6
+ Timezone::Parser.parse('test/data/asia')
7
+ # File.open('data/Asia/Hebron.json', 'w') do |f|
8
+ # hash = { '_zone' => 'Asia/Hebron', 'zone' => Timezone::Parser::Zone.data['Asia/Hebron'].map(&:to_hash) }
9
+ # f.puts(JSON.pretty_generate(hash))
10
+ # end
11
+ end
12
+ end
@@ -81,6 +81,45 @@ class TimezoneTest < Test::Unit::TestCase
81
81
  assert_equal local.to_i, timezone.time(utc).to_i
82
82
  end
83
83
 
84
+ # http://www.timeanddate.com/worldclock/clockchange.html?n=137&year=2011
85
+ def test_historical_time_change_in_la_forward
86
+ timezone = Timezone::Zone.new :zone => 'America/Los_Angeles'
87
+ local = Time.strptime('2011-03-13T01:59:59 UTC', '%Y-%m-%dT%H:%M:%S %Z')
88
+ utc = Time.strptime('2011-03-13T09:59:59 UTC', '%Y-%m-%dT%H:%M:%S %Z')
89
+ assert_equal local.to_i, timezone.time(utc).to_i
90
+
91
+ timezone = Timezone::Zone.new :zone => 'America/Los_Angeles'
92
+ local = Time.strptime('2011-03-13T03:00:00 UTC', '%Y-%m-%dT%H:%M:%S %Z')
93
+ utc = Time.strptime('2011-03-13T10:00:00 UTC', '%Y-%m-%dT%H:%M:%S %Z')
94
+ assert_equal local.to_i, timezone.time(utc).to_i
95
+ end
96
+
97
+ # http://www.timeanddate.com/worldclock/clockchange.html?n=137&year=2011
98
+ def test_historical_time_change_in_la_backward
99
+ timezone = Timezone::Zone.new :zone => 'America/Los_Angeles'
100
+ local = Time.strptime('2011-11-06T01:59:59 UTC', '%Y-%m-%dT%H:%M:%S %Z')
101
+ utc = Time.strptime('2011-11-06T08:59:59 UTC', '%Y-%m-%dT%H:%M:%S %Z')
102
+ assert_equal local.to_i, timezone.time(utc).to_i
103
+
104
+ timezone = Timezone::Zone.new :zone => 'America/Los_Angeles'
105
+ local = Time.strptime('2011-11-06T01:00:00 UTC', '%Y-%m-%dT%H:%M:%S %Z')
106
+ utc = Time.strptime('2011-11-06T09:00:00 UTC', '%Y-%m-%dT%H:%M:%S %Z')
107
+ assert_equal local.to_i, timezone.time(utc).to_i
108
+ end
109
+
110
+ # http://www.timeanddate.com/worldclock/clockchange.html?n=2364&year=1940
111
+ def test_historical_time_change_in_hebron
112
+ timezone = Timezone::Zone.new :zone => 'Asia/Hebron'
113
+ local = Time.strptime('1940-05-31T23:59:59 UTC', '%Y-%m-%dT%H:%M:%S %Z')
114
+ utc = Time.strptime('1940-05-31T21:59:59 UTC', '%Y-%m-%dT%H:%M:%S %Z')
115
+ assert_equal local.to_i, timezone.time(utc).to_i
116
+
117
+ timezone = Timezone::Zone.new :zone => 'Asia/Hebron'
118
+ local = Time.strptime('1940-06-01T01:00:00 UTC', '%Y-%m-%dT%H:%M:%S %Z')
119
+ utc = Time.strptime('1940-05-31T22:00:00 UTC', '%Y-%m-%dT%H:%M:%S %Z')
120
+ assert_equal local.to_i, timezone.time(utc).to_i
121
+ end
122
+
84
123
  def test_loading_half_hour_timezone
85
124
  timezone = Timezone::Zone.new :zone => 'Asia/Kathmandu'
86
125
  utc = Time.utc(2011, 1, 4, 3, 51, 29)
@@ -136,11 +175,18 @@ class TimezoneTest < Test::Unit::TestCase
136
175
  File.open(File.join(File.dirname(__FILE__),"data/Helsinki_rules_without_timestamps.json")) do |f|
137
176
  rules = JSON.parse(f.read)
138
177
  timezone = Timezone::Zone.new :zone => 'Europe/Helsinki'
139
- timezone.rules = rules
178
+ # TODO [panthomakos] Resolve this using a stub.
179
+ timezone.instance_variable_set(:@rules, rules)
140
180
  utc = Time.utc(2012, 3, 25, 0, 59, 59)
141
181
  assert_equal timezone.utc_offset(utc), 7200
142
182
  utc = Time.utc(2012, 3, 25, 1, 0, 0)
143
183
  assert_equal timezone.utc_offset(utc), 10800
144
184
  end
145
185
  end
186
+
187
+ def test_active_support_timezone
188
+ timezone = Timezone::Zone.new(:zone => 'Australia/Adelaide')
189
+ assert_equal 'Australia/Adelaide', timezone.zone
190
+ assert_equal 'Adelaide', timezone.active_support_time_zone
191
+ end
146
192
  end
data/timezone.gemspec CHANGED
@@ -22,5 +22,5 @@ Gem::Specification.new do |s|
22
22
  s.require_paths = ["lib"]
23
23
 
24
24
  s.add_development_dependency('rake')
25
- s.add_development_dependency('minitest')
25
+ s.add_development_dependency('minitest', '~> 4.0')
26
26
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: timezone
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.1
4
+ version: 0.3.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-01-14 00:00:00.000000000 Z
12
+ date: 2013-10-11 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rake
@@ -32,17 +32,17 @@ dependencies:
32
32
  requirement: !ruby/object:Gem::Requirement
33
33
  none: false
34
34
  requirements:
35
- - - ! '>='
35
+ - - ~>
36
36
  - !ruby/object:Gem::Version
37
- version: '0'
37
+ version: '4.0'
38
38
  type: :development
39
39
  prerelease: false
40
40
  version_requirements: !ruby/object:Gem::Requirement
41
41
  none: false
42
42
  requirements:
43
- - - ! '>='
43
+ - - ~>
44
44
  - !ruby/object:Gem::Version
45
- version: '0'
45
+ version: '4.0'
46
46
  description: A simple way to get accurate current and historical timezone information
47
47
  based on zone or latitude and longitude coordinates. This gem uses the tz database
48
48
  (http://www.twinsun.com/tz/tz-link.htm) for historical timezone information. It
@@ -531,13 +531,30 @@ files:
531
531
  - data/Pacific/Wallis.json
532
532
  - data/WET.json
533
533
  - lib/timezone.rb
534
+ - lib/timezone/active_support.rb
534
535
  - lib/timezone/configure.rb
535
536
  - lib/timezone/error.rb
536
- - lib/timezone/rule.rb
537
+ - lib/timezone/parser.rb
538
+ - lib/timezone/parser/data.rb
539
+ - lib/timezone/parser/link.rb
540
+ - lib/timezone/parser/rule.rb
541
+ - lib/timezone/parser/rule/entry.rb
542
+ - lib/timezone/parser/rule/on.rb
543
+ - lib/timezone/parser/rule/on_rules.rb
544
+ - lib/timezone/parser/zone.rb
545
+ - lib/timezone/parser/zone/data_generator.rb
546
+ - lib/timezone/parser/zone/entry.rb
547
+ - lib/timezone/parser/zone/until.rb
537
548
  - lib/timezone/version.rb
538
549
  - lib/timezone/zone.rb
539
550
  - test/data/Helsinki_rules_without_timestamps.json
540
- - test/rule_test.rb
551
+ - test/data/asia
552
+ - test/timezone/parser/rule/on_rules_test.rb
553
+ - test/timezone/parser/rule_test.rb
554
+ - test/timezone/parser/zone/data_generator_test.rb
555
+ - test/timezone/parser/zone/until_test.rb
556
+ - test/timezone/parser/zone_test.rb
557
+ - test/timezone/parser_test.rb
541
558
  - test/timezone_test.rb
542
559
  - timezone.gemspec
543
560
  homepage: http://github.com/panthomakos/timezone
@@ -564,9 +581,15 @@ rubyforge_project: timezone
564
581
  rubygems_version: 1.8.23
565
582
  signing_key:
566
583
  specification_version: 3
567
- summary: timezone-0.2.1
584
+ summary: timezone-0.3.0
568
585
  test_files:
569
586
  - test/data/Helsinki_rules_without_timestamps.json
570
- - test/rule_test.rb
587
+ - test/data/asia
588
+ - test/timezone/parser/rule/on_rules_test.rb
589
+ - test/timezone/parser/rule_test.rb
590
+ - test/timezone/parser/zone/data_generator_test.rb
591
+ - test/timezone/parser/zone/until_test.rb
592
+ - test/timezone/parser/zone_test.rb
593
+ - test/timezone/parser_test.rb
571
594
  - test/timezone_test.rb
572
595
  has_rdoc:
data/lib/timezone/rule.rb DELETED
@@ -1,30 +0,0 @@
1
- module Timezone
2
- @@rules = {}
3
- def self.rules ; @@rules ; end
4
-
5
- Rule = Struct.new(:name, :from, :to, :type, :month, :day, :time, :save, :letter) do
6
- def initialize(name, *args)
7
- super.tap do |rule|
8
- Timezone.rules[name] ||= []
9
- Timezone.rules[name] << self
10
- end
11
- end
12
-
13
- # Converts hours and minutes to seconds.
14
- #
15
- # Example: 1:00 # => 3600
16
- def offset
17
- @offset ||= save
18
- .split(':')
19
- .reverse
20
- .each_with_index
21
- .map{ |number,index| number.to_i*(60**(index+1)) }
22
- .reduce(&:+)
23
- end
24
-
25
- # Does this rule have daylight savings time?
26
- def dst?
27
- letter == 'D'
28
- end
29
- end
30
- end
data/test/rule_test.rb DELETED
@@ -1,42 +0,0 @@
1
- require 'timezone/rule'
2
- require 'minitest/autorun'
3
-
4
- describe Timezone::Rule do
5
- before do
6
- Timezone.rules.clear
7
- @rule = Timezone::Rule.new('Zion')
8
- end
9
-
10
- it 'adds itself to the rules' do
11
- assert_equal ['Zion'], Timezone.rules.keys
12
- end
13
-
14
- it 'adds multiple rules with the same name' do
15
- Timezone::Rule.new('Zion')
16
- assert_equal 2, Timezone.rules['Zion'].count
17
- end
18
-
19
- describe '#offset' do
20
- it 'properly calculates hours' do
21
- @rule.save = '1:00'
22
- assert_equal 3_600, @rule.offset
23
- end
24
-
25
- it 'properly calculates minutes' do
26
- @rule.save = '2:20'
27
- assert_equal 8_400, @rule.offset
28
- end
29
- end
30
-
31
- describe '#dst?' do
32
- it 'knows standard time' do
33
- @rule.letter = 'S'
34
- assert !@rule.dst?
35
- end
36
-
37
- it 'knows daylight savings time' do
38
- @rule.letter = 'D'
39
- assert @rule.dst?
40
- end
41
- end
42
- end