ruby-sun-times 0.1.2 → 0.1.3
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.
- checksums.yaml +7 -0
- data/.gitignore +3 -0
- data/.rspec +2 -0
- data/Gemfile +3 -0
- data/Rakefile +5 -44
- data/lib/sun_times.rb +18 -36
- data/lib/sun_times/version.rb +9 -0
- data/ruby-sun-times.gemspec +22 -0
- data/spec/spec_helper.rb +10 -0
- data/spec/unit/ruby_sun_times_spec.rb +86 -0
- data/test/calculate_test.rb +3 -38
- metadata +63 -43
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 7ff22355b53b8e849bdb6620d1e51552a72840e0
|
4
|
+
data.tar.gz: ce1cccf30fa5f6461918853588010f534a2f3ffc
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 6c9c521a94cf297ab45fd32ba1f87dfe64b0beac36b1ad89c6d870e477fbb3c7a3d7248070b04d23f4abce20d188a6d61baa873d10dceb5d9c44b97fe2fe42b9
|
7
|
+
data.tar.gz: 96b2cec093ae213b771179cdc9939b03d151a7c0d0e3b2093be39dbb90c4d58c3100b876014970acdd8b67be000de2d66fce9947986d21177da47ee0505d1cd0
|
data/.gitignore
ADDED
data/.rspec
ADDED
data/Gemfile
ADDED
data/Rakefile
CHANGED
@@ -1,48 +1,9 @@
|
|
1
1
|
require 'rubygems'
|
2
|
-
require '
|
3
|
-
require '
|
4
|
-
require 'rake/testtask'
|
5
|
-
require 'rake/clean'
|
2
|
+
require 'bundler/gem_tasks'
|
3
|
+
require 'rspec/core/rake_task'
|
6
4
|
|
7
|
-
|
8
|
-
require 'sun_times'
|
5
|
+
task :default => :spec
|
9
6
|
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
task :default => :test
|
14
|
-
|
15
|
-
spec = Gem::Specification.new do |s|
|
16
|
-
s.name = 'ruby-sun-times'
|
17
|
-
s.summary = 'Module which calculates sunrise and sunset times'
|
18
|
-
s.version = SunTimes::VERSION::STRING
|
19
|
-
|
20
|
-
s.homepage = 'http://github.com/joeyates/ruby-sun-times'
|
21
|
-
s.author = 'Joe Yates'
|
22
|
-
s.email = 'joe.g.yates@gmail.com'
|
23
|
-
|
24
|
-
s.files = ['README', 'COPYING', 'Rakefile'] + FileList['{lib,test}/**/*.rb']
|
25
|
-
s.require_paths = ['lib']
|
26
|
-
|
27
|
-
s.has_rdoc = true
|
28
|
-
s.rdoc_options += RDOC_OPTS
|
29
|
-
s.extra_rdoc_files = ['README', 'COPYING']
|
30
|
-
|
31
|
-
s.test_file = 'test/test_all.rb'
|
32
|
-
end
|
33
|
-
|
34
|
-
Rake::TestTask.new do |t|
|
35
|
-
t.libs << 'test'
|
36
|
-
t.test_files = FileList['test/*_test.rb']
|
37
|
-
t.verbose = true
|
38
|
-
end
|
39
|
-
|
40
|
-
Rake::RDocTask.new do |rdoc|
|
41
|
-
rdoc.rdoc_dir = 'doc/rdoc'
|
42
|
-
rdoc.options += RDOC_OPTS
|
43
|
-
rdoc.main = "README"
|
44
|
-
rdoc.rdoc_files.add ['README', 'COPYING', 'lib/**/*.rb']
|
45
|
-
end
|
46
|
-
|
47
|
-
Rake::GemPackageTask.new(spec) do |pkg|
|
7
|
+
RSpec::Core::RakeTask.new do |t|
|
8
|
+
t.pattern = 'spec/**/*_spec.rb'
|
48
9
|
end
|
data/lib/sun_times.rb
CHANGED
@@ -26,26 +26,17 @@
|
|
26
26
|
require 'date'
|
27
27
|
|
28
28
|
module SunTimes
|
29
|
-
|
30
|
-
module VERSION #:nodoc:
|
31
|
-
MAJOR = 0
|
32
|
-
MINOR = 1
|
33
|
-
TINY = 2
|
34
|
-
|
35
|
-
STRING = [MAJOR, MINOR, TINY].join('.')
|
36
|
-
end
|
37
|
-
|
38
29
|
DEFAULT_ZENITH = 90.83333
|
39
30
|
KNOWN_EVENTS = [:rise, :set]
|
40
31
|
DEGREES_PER_HOUR = 360.0 / 24.0
|
41
32
|
|
42
33
|
# Helper method: calculates sunrise, with the same parameters as calculate
|
43
|
-
def
|
34
|
+
def self.rise(date, latitude, longitude, options = {})
|
44
35
|
calculate(:rise, date, latitude, longitude, options)
|
45
36
|
end
|
46
37
|
|
47
38
|
# Helper method: calculates sunset, with the same parameters as calculate
|
48
|
-
def
|
39
|
+
def self.set(date, latitude, longitude, options = {})
|
49
40
|
calculate(:set, date, latitude, longitude, options)
|
50
41
|
end
|
51
42
|
|
@@ -53,7 +44,7 @@ module SunTimes
|
|
53
44
|
#
|
54
45
|
# ==== Parameters
|
55
46
|
# * +event+ - One of :rise, :set.
|
56
|
-
# * +date+ - An object that responds to
|
47
|
+
# * +date+ - An object that responds to :to_datetime.
|
57
48
|
# * +latitude+ - The latitude of the location in degrees.
|
58
49
|
# * +longitude+ - The longitude of the location in degrees.
|
59
50
|
# * +options+ - Additional option is <tt>:zenith</tt>.
|
@@ -61,7 +52,8 @@ module SunTimes
|
|
61
52
|
# ==== Example
|
62
53
|
# SunTimes.calculate(:rise, Date.new(2010, 3, 8), 43.779, 11.432)
|
63
54
|
# > Mon Mar 08 05:39:53 UTC 2010
|
64
|
-
def
|
55
|
+
def self.calculate(event, date, latitude, longitude, options = {})
|
56
|
+
datetime = date.to_datetime
|
65
57
|
raise "Unknown event '#{ event }'" if KNOWN_EVENTS.find_index(event).nil?
|
66
58
|
zenith = options.delete(:zenith) || DEFAULT_ZENITH
|
67
59
|
|
@@ -70,7 +62,7 @@ module SunTimes
|
|
70
62
|
|
71
63
|
# t
|
72
64
|
base_time = event == :rise ? 6.0 : 18.0
|
73
|
-
approximate_time =
|
65
|
+
approximate_time = datetime.yday + (base_time - longitude_hour) / 24.0
|
74
66
|
|
75
67
|
# M
|
76
68
|
mean_sun_anomaly = (0.9856 * approximate_time) - 3.289
|
@@ -126,24 +118,15 @@ module SunTimes
|
|
126
118
|
gmt_hours -= 24.0 if gmt_hours > 24
|
127
119
|
gmt_hours += 24.0 if gmt_hours < 0
|
128
120
|
|
129
|
-
|
130
|
-
when date.respond_to?( :offset )
|
131
|
-
offset_hours = date.offset * 24
|
132
|
-
when date.respond_to?( :gmt_offset )
|
133
|
-
offset_hours = date.gmt_offset / 3600
|
134
|
-
else
|
135
|
-
offset_hours = nil
|
136
|
-
end
|
121
|
+
offset_hours = datetime.offset * 24.0
|
137
122
|
|
138
|
-
if
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
return calculate(event, previous_day, latitude, longitude, options = {})
|
146
|
-
end
|
123
|
+
if gmt_hours + offset_hours < 0
|
124
|
+
next_day = datetime.next_day
|
125
|
+
return calculate(event, next_day.new_offset, latitude, longitude, options = {})
|
126
|
+
end
|
127
|
+
if gmt_hours + offset_hours > 24
|
128
|
+
previous_day = datetime.prev_day
|
129
|
+
return calculate(event, previous_day.new_offset, latitude, longitude, options = {})
|
147
130
|
end
|
148
131
|
|
149
132
|
hour = gmt_hours.floor
|
@@ -151,20 +134,20 @@ module SunTimes
|
|
151
134
|
minute = hour_remainder.floor
|
152
135
|
seconds = (hour_remainder - minute) * 60.0
|
153
136
|
|
154
|
-
Time.gm(
|
137
|
+
Time.gm(datetime.year, datetime.month, datetime.day, hour, minute, seconds)
|
155
138
|
end
|
156
139
|
|
157
140
|
private
|
158
141
|
|
159
|
-
def
|
142
|
+
def self.degrees_to_radians(d)
|
160
143
|
d.to_f / 360.0 * 2.0 * Math::PI
|
161
144
|
end
|
162
145
|
|
163
|
-
def
|
146
|
+
def self.radians_to_degrees(r)
|
164
147
|
r.to_f * 360.0 / (2.0 * Math::PI)
|
165
148
|
end
|
166
149
|
|
167
|
-
def
|
150
|
+
def self.coerce_degrees(d)
|
168
151
|
if d < 0
|
169
152
|
d += 360
|
170
153
|
return coerce_degrees(d)
|
@@ -175,5 +158,4 @@ module SunTimes
|
|
175
158
|
end
|
176
159
|
d
|
177
160
|
end
|
178
|
-
|
179
161
|
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.unshift(File.expand_path('../lib/', __FILE__))
|
3
|
+
|
4
|
+
require 'sun_times/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |s|
|
7
|
+
s.name = 'ruby-sun-times'
|
8
|
+
s.summary = 'Module which calculates sunrise and sunset times'
|
9
|
+
s.version = SunTimes::VERSION::STRING
|
10
|
+
|
11
|
+
s.homepage = 'https://github.com/joeyates/ruby-sun-times'
|
12
|
+
s.author = 'Joe Yates'
|
13
|
+
s.email = 'joe.g.yates@gmail.com'
|
14
|
+
|
15
|
+
s.files = `git ls-files`.split($\)
|
16
|
+
s.executables = s.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
17
|
+
s.test_files = s.files.grep(%r{^spec/})
|
18
|
+
s.require_paths = ['lib']
|
19
|
+
|
20
|
+
s.add_development_dependency 'pry'
|
21
|
+
s.add_development_dependency 'rspec'
|
22
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,10 @@
|
|
1
|
+
$:.unshift(File.expand_path('../lib', File.dirname(__FILE__)))
|
2
|
+
|
3
|
+
require 'sun_times'
|
4
|
+
|
5
|
+
RSpec.configure do |config|
|
6
|
+
config.treat_symbols_as_metadata_keys_with_true_values = true
|
7
|
+
config.run_all_when_everything_filtered = true
|
8
|
+
config.filter_run :focus
|
9
|
+
config.order = 'random'
|
10
|
+
end
|
@@ -0,0 +1,86 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe SunTimes do
|
4
|
+
let(:day) { Date.new(2010, 3, 8) }
|
5
|
+
let(:latitude) { 43.779 }
|
6
|
+
let(:longitude) { 11.432 }
|
7
|
+
let(:rise) { Time.gm(2010, 3, 8, 5, 39, 53) }
|
8
|
+
let(:set) { Time.gm(2010, 3, 8, 17, 11, 16) }
|
9
|
+
|
10
|
+
describe '#calculate' do
|
11
|
+
context ':rise' do
|
12
|
+
it 'returns the sunrise time' do
|
13
|
+
result = SunTimes.calculate(:rise, day, latitude, longitude)
|
14
|
+
expect(result).to be_within(1).of(rise)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
context ':set' do
|
19
|
+
it 'returns the sunset time' do
|
20
|
+
result = SunTimes.calculate(:set, day, latitude, longitude)
|
21
|
+
expect(result).to be_within(1).of(set)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
context 'unknown event' do
|
26
|
+
it 'fails' do
|
27
|
+
expect {
|
28
|
+
SunTimes.calculate(:foo, day, latitude, longitude)
|
29
|
+
}.to raise_error(RuntimeError, /unknown event/i)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
context 'with timezone' do
|
34
|
+
let(:zone) { Rational(-8, 24) }
|
35
|
+
let(:day_with_zone) { DateTime.new(2011, 12, 13, 0, 0, 0, zone) }
|
36
|
+
|
37
|
+
it 'calculates according to the supplied value' do
|
38
|
+
set = SunTimes.calculate(:set, day_with_zone, 45.52, -122.681944)
|
39
|
+
result_datetime = DateTime.new(set.year, set.month, set.day, set.hour, set.min, set.sec, 0)
|
40
|
+
|
41
|
+
expect(result_datetime).to be > day_with_zone
|
42
|
+
expect(result_datetime).to be <= day_with_zone + 1
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
context 'midnight sun' do
|
47
|
+
# North Cape
|
48
|
+
let(:midsummer) { Date.new(2010, 6, 21) }
|
49
|
+
let(:latitude) { 71.170219 }
|
50
|
+
let(:longitude) { 25.785556 }
|
51
|
+
|
52
|
+
it 'rise is nil' do
|
53
|
+
result = SunTimes.calculate(:rise, midsummer, latitude, longitude)
|
54
|
+
expect(result).to be_nil
|
55
|
+
end
|
56
|
+
|
57
|
+
it 'set is nil' do
|
58
|
+
result = SunTimes.calculate(:set, midsummer, latitude, longitude)
|
59
|
+
expect(result).to be_nil
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
context 'last day of the year' do
|
64
|
+
let(:zone) { Rational(-8, 24) }
|
65
|
+
let(:day) { DateTime.new(2013, 12, 31, 8, 59, 5, zone) }
|
66
|
+
|
67
|
+
it 'calculates correctly' do
|
68
|
+
SunTimes.calculate(:set, day, 47.5, -122)
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
describe '#rise' do
|
74
|
+
it 'returns the sunrise time' do
|
75
|
+
result = SunTimes.rise(day, latitude, longitude)
|
76
|
+
expect(result).to be_within(1).of(rise)
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
describe '#set' do
|
81
|
+
it 'returns the sunset time' do
|
82
|
+
result = SunTimes.set(day, latitude, longitude)
|
83
|
+
expect(result).to be_within(1).of(set)
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
data/test/calculate_test.rb
CHANGED
@@ -6,37 +6,7 @@ require 'date'
|
|
6
6
|
|
7
7
|
class SunTimesTest < Test::Unit::TestCase
|
8
8
|
|
9
|
-
|
10
|
-
rise = SunTimes.calculate(:rise, Date.new(2010, 3, 8), 43.779, 11.432)
|
11
|
-
assert_equal(Time.gm(2010, 3, 8, 5, 39, 53), rise)
|
12
|
-
end
|
13
|
-
|
14
|
-
def test_set_20100308_pontassieve
|
15
|
-
set = SunTimes.calculate(:set, Date.new(2010, 3, 8), 43.779, 11.432)
|
16
|
-
assert_equal(Time.gm(2010, 3, 8, 17, 11, 16), set)
|
17
|
-
end
|
18
|
-
|
19
|
-
def test_rise_helper
|
20
|
-
rise = SunTimes.rise(Date.new(2010, 3, 8), 43.779, 11.432)
|
21
|
-
assert_equal(Time.gm(2010, 3, 8, 5, 39, 53), rise)
|
22
|
-
end
|
23
|
-
|
24
|
-
def test_set_helper
|
25
|
-
set = SunTimes.set(Date.new(2010, 3, 8), 43.779, 11.432)
|
26
|
-
assert_equal(Time.gm(2010, 3, 8, 17, 11, 16), set)
|
27
|
-
end
|
28
|
-
|
29
|
-
def test_midnight_sun_on_20100621_north_cape
|
30
|
-
rise = SunTimes.calculate(:rise, Date.new(2010, 6, 21), 71.170219, 25.785556)
|
31
|
-
assert_nil(rise)
|
32
|
-
set = SunTimes.calculate(:set, Date.new(2010, 6, 21), 71.170219, 25.785556)
|
33
|
-
assert_nil(set)
|
34
|
-
end
|
35
|
-
|
36
|
-
def test_unknown_event
|
37
|
-
assert_raise(RuntimeError) { SunTimes.calculate(:foo, Date.new(2010, 3, 8), 43.779, 11.432) }
|
38
|
-
end
|
39
|
-
|
9
|
+
=begin
|
40
10
|
def test_time
|
41
11
|
datetime = Time.gm(2010, 6, 13, 0, 0, 0)
|
42
12
|
set = SunTimes.calculate(:set, datetime, 43.779, 11.432)
|
@@ -49,12 +19,7 @@ class SunTimesTest < Test::Unit::TestCase
|
|
49
19
|
assert_equal(Time.gm(2010, 6, 13, 18, 56, 55), set)
|
50
20
|
end
|
51
21
|
|
52
|
-
def
|
53
|
-
pst = DateTime.new(2011, 12, 13, 0, 0, 0, Rational(-8, 24))
|
54
|
-
set = SunTimes.calculate(:set, pst, 45.52, -122.681944)
|
55
|
-
result_datetime = DateTime.new(set.year, set.month, set.day, set.hour, set.min, set.sec, 0)
|
56
|
-
assert(pst < result_datetime)
|
57
|
-
assert(pst + 1 > result_datetime)
|
22
|
+
def test_31st_december
|
58
23
|
end
|
59
|
-
|
24
|
+
=end
|
60
25
|
end
|
metadata
CHANGED
@@ -1,66 +1,86 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: ruby-sun-times
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.3
|
5
5
|
platform: ruby
|
6
|
-
authors:
|
6
|
+
authors:
|
7
7
|
- Joe Yates
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
11
|
+
date: 2014-01-01 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: pry
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - '>='
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - '>='
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rspec
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - '>='
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - '>='
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
16
41
|
description:
|
17
42
|
email: joe.g.yates@gmail.com
|
18
43
|
executables: []
|
19
|
-
|
20
44
|
extensions: []
|
21
|
-
|
22
|
-
|
23
|
-
-
|
45
|
+
extra_rdoc_files: []
|
46
|
+
files:
|
47
|
+
- .gitignore
|
48
|
+
- .rspec
|
24
49
|
- COPYING
|
25
|
-
|
50
|
+
- Gemfile
|
26
51
|
- README
|
27
|
-
- COPYING
|
28
52
|
- Rakefile
|
29
53
|
- lib/sun_times.rb
|
54
|
+
- lib/sun_times/version.rb
|
55
|
+
- ruby-sun-times.gemspec
|
56
|
+
- spec/spec_helper.rb
|
57
|
+
- spec/unit/ruby_sun_times_spec.rb
|
30
58
|
- test/calculate_test.rb
|
31
59
|
- test/test_all.rb
|
32
|
-
|
33
|
-
homepage: http://github.com/joeyates/ruby-sun-times
|
60
|
+
homepage: https://github.com/joeyates/ruby-sun-times
|
34
61
|
licenses: []
|
35
|
-
|
62
|
+
metadata: {}
|
36
63
|
post_install_message:
|
37
|
-
rdoc_options:
|
38
|
-
|
39
|
-
- --title
|
40
|
-
- Sun Times Calculator
|
41
|
-
- --main
|
42
|
-
- README
|
43
|
-
- --inline-source
|
44
|
-
require_paths:
|
64
|
+
rdoc_options: []
|
65
|
+
require_paths:
|
45
66
|
- lib
|
46
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
47
|
-
requirements:
|
48
|
-
- -
|
49
|
-
- !ruby/object:Gem::Version
|
50
|
-
version:
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
version: "0"
|
57
|
-
version:
|
67
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
68
|
+
requirements:
|
69
|
+
- - '>='
|
70
|
+
- !ruby/object:Gem::Version
|
71
|
+
version: '0'
|
72
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
73
|
+
requirements:
|
74
|
+
- - '>='
|
75
|
+
- !ruby/object:Gem::Version
|
76
|
+
version: '0'
|
58
77
|
requirements: []
|
59
|
-
|
60
78
|
rubyforge_project:
|
61
|
-
rubygems_version:
|
79
|
+
rubygems_version: 2.0.3
|
62
80
|
signing_key:
|
63
|
-
specification_version:
|
81
|
+
specification_version: 4
|
64
82
|
summary: Module which calculates sunrise and sunset times
|
65
|
-
test_files:
|
66
|
-
-
|
83
|
+
test_files:
|
84
|
+
- spec/spec_helper.rb
|
85
|
+
- spec/unit/ruby_sun_times_spec.rb
|
86
|
+
has_rdoc:
|