timezone 0.2.1 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -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