attack-barometer 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/LICENSE +20 -0
- data/README.rdoc +266 -0
- data/VERSION.yml +4 -0
- data/bin/barometer +63 -0
- data/lib/barometer/base.rb +52 -0
- data/lib/barometer/data/current.rb +93 -0
- data/lib/barometer/data/distance.rb +131 -0
- data/lib/barometer/data/forecast.rb +66 -0
- data/lib/barometer/data/geo.rb +98 -0
- data/lib/barometer/data/location.rb +20 -0
- data/lib/barometer/data/measurement.rb +161 -0
- data/lib/barometer/data/pressure.rb +133 -0
- data/lib/barometer/data/speed.rb +147 -0
- data/lib/barometer/data/sun.rb +35 -0
- data/lib/barometer/data/temperature.rb +164 -0
- data/lib/barometer/data/units.rb +55 -0
- data/lib/barometer/data/zone.rb +124 -0
- data/lib/barometer/data.rb +15 -0
- data/lib/barometer/extensions/graticule.rb +50 -0
- data/lib/barometer/extensions/httparty.rb +21 -0
- data/lib/barometer/query.rb +228 -0
- data/lib/barometer/services/google.rb +146 -0
- data/lib/barometer/services/noaa.rb +6 -0
- data/lib/barometer/services/service.rb +324 -0
- data/lib/barometer/services/weather_bug.rb +6 -0
- data/lib/barometer/services/weather_dot_com.rb +6 -0
- data/lib/barometer/services/wunderground.rb +285 -0
- data/lib/barometer/services/yahoo.rb +274 -0
- data/lib/barometer/services.rb +6 -0
- data/lib/barometer/weather.rb +187 -0
- data/lib/barometer.rb +52 -0
- data/spec/barometer_spec.rb +162 -0
- data/spec/data_current_spec.rb +225 -0
- data/spec/data_distance_spec.rb +336 -0
- data/spec/data_forecast_spec.rb +150 -0
- data/spec/data_geo_spec.rb +90 -0
- data/spec/data_location_spec.rb +59 -0
- data/spec/data_measurement_spec.rb +411 -0
- data/spec/data_pressure_spec.rb +336 -0
- data/spec/data_speed_spec.rb +374 -0
- data/spec/data_sun_spec.rb +76 -0
- data/spec/data_temperature_spec.rb +396 -0
- data/spec/data_zone_spec.rb +133 -0
- data/spec/fixtures/current_calgary_ab.xml +1 -0
- data/spec/fixtures/forecast_calgary_ab.xml +1 -0
- data/spec/fixtures/geocode_40_73.xml +1 -0
- data/spec/fixtures/geocode_90210.xml +1 -0
- data/spec/fixtures/geocode_T5B4M9.xml +1 -0
- data/spec/fixtures/geocode_calgary_ab.xml +1 -0
- data/spec/fixtures/geocode_newyork_ny.xml +1 -0
- data/spec/fixtures/google_calgary_ab.xml +1 -0
- data/spec/fixtures/yahoo_90210.xml +1 -0
- data/spec/query_spec.rb +469 -0
- data/spec/service_google_spec.rb +144 -0
- data/spec/service_wunderground_spec.rb +330 -0
- data/spec/service_yahoo_spec.rb +299 -0
- data/spec/services_spec.rb +1106 -0
- data/spec/spec_helper.rb +14 -0
- data/spec/units_spec.rb +101 -0
- data/spec/weather_spec.rb +265 -0
- metadata +119 -0
@@ -0,0 +1,187 @@
|
|
1
|
+
module Barometer
|
2
|
+
|
3
|
+
class Weather
|
4
|
+
|
5
|
+
# hash of measurements indexed by :source
|
6
|
+
attr_accessor :measurements
|
7
|
+
|
8
|
+
def initialize
|
9
|
+
@measurements = []
|
10
|
+
end
|
11
|
+
|
12
|
+
# the default source is the first source/measurement that we
|
13
|
+
# have successful results for
|
14
|
+
def default
|
15
|
+
return nil unless self.sources
|
16
|
+
self.source(self.sources.first)
|
17
|
+
end
|
18
|
+
|
19
|
+
# find the measurement for the given source, if it exists
|
20
|
+
def source(source)
|
21
|
+
raise ArgumentError unless (source.is_a?(String) || source.is_a?(Symbol))
|
22
|
+
@measurements.each do |measurement|
|
23
|
+
return measurement if measurement.source == source.to_sym
|
24
|
+
end
|
25
|
+
nil
|
26
|
+
end
|
27
|
+
|
28
|
+
# list successful sources
|
29
|
+
def sources
|
30
|
+
@measurements.collect {|m| m.source.to_sym if m.success?}.compact
|
31
|
+
end
|
32
|
+
|
33
|
+
#
|
34
|
+
# Quick access methods
|
35
|
+
#
|
36
|
+
|
37
|
+
def current
|
38
|
+
(default = self.default) ? default.current : nil
|
39
|
+
end
|
40
|
+
|
41
|
+
def forecast
|
42
|
+
(default = self.default) ? default.forecast : nil
|
43
|
+
end
|
44
|
+
|
45
|
+
def now
|
46
|
+
self.current
|
47
|
+
end
|
48
|
+
|
49
|
+
def today
|
50
|
+
default = self.default
|
51
|
+
default && default.forecast ? default.forecast[0] : nil
|
52
|
+
end
|
53
|
+
|
54
|
+
def tomorrow
|
55
|
+
default = self.default
|
56
|
+
default && default.forecast ? default.forecast[1] : nil
|
57
|
+
end
|
58
|
+
|
59
|
+
def for(query)
|
60
|
+
default = self.default
|
61
|
+
default && default.forecast ? default.for(query) : nil
|
62
|
+
end
|
63
|
+
|
64
|
+
#
|
65
|
+
# helper methods
|
66
|
+
#
|
67
|
+
# these are handy methods that can average values for successful weather
|
68
|
+
# sources, or answer a simple question (ie: weather.windy?)
|
69
|
+
#
|
70
|
+
|
71
|
+
#
|
72
|
+
# averages
|
73
|
+
#
|
74
|
+
|
75
|
+
# average of all humidity values
|
76
|
+
# def humidity
|
77
|
+
# end
|
78
|
+
#
|
79
|
+
# # average of all temperature values
|
80
|
+
# def temperature
|
81
|
+
# end
|
82
|
+
#
|
83
|
+
# # average of all wind speed values
|
84
|
+
# def wind
|
85
|
+
# end
|
86
|
+
#
|
87
|
+
# # average of all pressure values
|
88
|
+
# def pressure
|
89
|
+
# end
|
90
|
+
#
|
91
|
+
# # average of all dew_point values
|
92
|
+
# def dew_point
|
93
|
+
# end
|
94
|
+
#
|
95
|
+
# # average of all heat_index values
|
96
|
+
# def heat_index
|
97
|
+
# end
|
98
|
+
#
|
99
|
+
# # average of all wind_chill values
|
100
|
+
# def wind_chill
|
101
|
+
# end
|
102
|
+
#
|
103
|
+
# # average of all visibility values
|
104
|
+
# def visibility
|
105
|
+
# end
|
106
|
+
|
107
|
+
#
|
108
|
+
# quick access methods
|
109
|
+
#
|
110
|
+
|
111
|
+
# what is the current local time and date?
|
112
|
+
# def time
|
113
|
+
# end
|
114
|
+
|
115
|
+
# def icon
|
116
|
+
# self.current.icon
|
117
|
+
# end
|
118
|
+
|
119
|
+
#
|
120
|
+
# simple questions
|
121
|
+
# pass the question on to each successful measurement until we get an answer
|
122
|
+
#
|
123
|
+
|
124
|
+
def windy?(threshold=10, utc_time=Time.now.utc)
|
125
|
+
raise ArgumentError unless (threshold.is_a?(Fixnum) || threshold.is_a?(Float))
|
126
|
+
raise ArgumentError unless utc_time.is_a?(Time)
|
127
|
+
|
128
|
+
is_windy = nil
|
129
|
+
@measurements.each do |measurement|
|
130
|
+
if measurement.success?
|
131
|
+
is_windy = measurement.windy?(threshold, utc_time)
|
132
|
+
return is_windy if !is_windy.nil?
|
133
|
+
end
|
134
|
+
end
|
135
|
+
is_windy
|
136
|
+
end
|
137
|
+
|
138
|
+
def wet?(threshold=50, utc_time=Time.now.utc)
|
139
|
+
raise ArgumentError unless (threshold.is_a?(Fixnum) || threshold.is_a?(Float))
|
140
|
+
raise ArgumentError unless utc_time.is_a?(Time)
|
141
|
+
|
142
|
+
is_wet = nil
|
143
|
+
@measurements.each do |measurement|
|
144
|
+
if measurement.success?
|
145
|
+
is_wet = measurement.wet?(threshold, utc_time)
|
146
|
+
return is_wet if !is_wet.nil?
|
147
|
+
end
|
148
|
+
end
|
149
|
+
is_wet
|
150
|
+
end
|
151
|
+
|
152
|
+
def day?(utc_time=Time.now.utc)
|
153
|
+
raise ArgumentError unless utc_time.is_a?(Time)
|
154
|
+
|
155
|
+
is_day = nil
|
156
|
+
@measurements.each do |measurement|
|
157
|
+
if measurement.success?
|
158
|
+
is_day = measurement.day?(utc_time)
|
159
|
+
return is_day if !is_day.nil?
|
160
|
+
end
|
161
|
+
end
|
162
|
+
is_day
|
163
|
+
end
|
164
|
+
|
165
|
+
def night?(utc_time=Time.now.utc)
|
166
|
+
raise ArgumentError unless utc_time.is_a?(Time)
|
167
|
+
is_day = self.day?(utc_time)
|
168
|
+
is_day.nil? ? nil : !is_day
|
169
|
+
end
|
170
|
+
|
171
|
+
def sunny?(utc_time=Time.now.utc)
|
172
|
+
raise ArgumentError unless utc_time.is_a?(Time)
|
173
|
+
|
174
|
+
is_sunny = nil
|
175
|
+
@measurements.each do |measurement|
|
176
|
+
if measurement.success?
|
177
|
+
return false if self.day?(utc_time) == false
|
178
|
+
is_sunny = measurement.sunny?(utc_time)
|
179
|
+
return is_sunny if !is_sunny.nil?
|
180
|
+
end
|
181
|
+
end
|
182
|
+
is_sunny
|
183
|
+
end
|
184
|
+
|
185
|
+
end
|
186
|
+
|
187
|
+
end
|
data/lib/barometer.rb
ADDED
@@ -0,0 +1,52 @@
|
|
1
|
+
$:.unshift(File.dirname(__FILE__))
|
2
|
+
|
3
|
+
require 'barometer/base'
|
4
|
+
require 'barometer/query'
|
5
|
+
require 'barometer/weather'
|
6
|
+
require 'barometer/services'
|
7
|
+
require 'barometer/data'
|
8
|
+
|
9
|
+
module Barometer
|
10
|
+
|
11
|
+
@@google_geocode_key = nil
|
12
|
+
def self.google_geocode_key; @@google_geocode_key; end;
|
13
|
+
def self.google_geocode_key=(key); @@google_geocode_key = key; end;
|
14
|
+
|
15
|
+
@@skip_graticule = false
|
16
|
+
def self.skip_graticule; @@skip_graticule; end;
|
17
|
+
def self.skip_graticule=(value); @@skip_graticule = value; end;
|
18
|
+
|
19
|
+
# sometimes a query is used as is and never gets geocoded (ie zipcode)
|
20
|
+
# often, it is useful have queries geocoded to know where in the
|
21
|
+
# world that query points to. you can force the geocoding of
|
22
|
+
# queries (even when not required) so that you have the geocoded
|
23
|
+
# data. the reason this isn't the default is that it will use an
|
24
|
+
# extra web service query when not normally required
|
25
|
+
@@force_geocode = false
|
26
|
+
def self.force_geocode; @@force_geocode; end;
|
27
|
+
def self.force_geocode=(value); @@force_geocode = value; end;
|
28
|
+
def self.force_geocode!; @@force_geocode = true; end;
|
29
|
+
|
30
|
+
@@timeout = 15
|
31
|
+
def self.timeout; @@timeout; end;
|
32
|
+
def self.timeout=(value); @@timeout = value; end;
|
33
|
+
|
34
|
+
def self.new(query=nil)
|
35
|
+
Barometer::Base.new(query)
|
36
|
+
end
|
37
|
+
|
38
|
+
def self.selection=(selection=nil)
|
39
|
+
Barometer::Base.selection = selection
|
40
|
+
end
|
41
|
+
|
42
|
+
# shortcut to Barometer::Service.source method
|
43
|
+
# allows Barometer.source(:wunderground)
|
44
|
+
def self.source(source)
|
45
|
+
Barometer::Service.source(source)
|
46
|
+
end
|
47
|
+
|
48
|
+
# custom errors
|
49
|
+
class OutOfSources < StandardError; end
|
50
|
+
|
51
|
+
end
|
52
|
+
|
@@ -0,0 +1,162 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe "Barometer" do
|
4
|
+
|
5
|
+
before(:each) do
|
6
|
+
@preference_hash = { 1 => [:wunderground] }
|
7
|
+
@key = "ABQIAAAAq8TH4offRcGrok8JVY_MyxRi_j0U6kJrkFvY4-OX2XYmEAa76BSFwMlSow1YgX8BOPUeve_shMG7xw"
|
8
|
+
end
|
9
|
+
|
10
|
+
describe "and class methods" do
|
11
|
+
|
12
|
+
it "defines selection" do
|
13
|
+
Barometer::Base.respond_to?("selection").should be_true
|
14
|
+
Barometer::Base.selection.should == { 1 => [:wunderground] }
|
15
|
+
Barometer::Base.selection = { 1 => [:yahoo] }
|
16
|
+
Barometer::Base.selection.should == { 1 => [:yahoo] }
|
17
|
+
Barometer.selection = @preference_hash
|
18
|
+
end
|
19
|
+
|
20
|
+
it "returns a Weather Service driver" do
|
21
|
+
Barometer.source(:wunderground).should == Barometer::Wunderground
|
22
|
+
end
|
23
|
+
|
24
|
+
it "sets the Graticule Google geocoding API key" do
|
25
|
+
Barometer.respond_to?("google_geocode_key").should be_true
|
26
|
+
Barometer.google_geocode_key.should be_nil
|
27
|
+
Barometer.google_geocode_key = @key
|
28
|
+
Barometer.google_geocode_key.should == @key
|
29
|
+
end
|
30
|
+
|
31
|
+
it "skips the use of Graticule" do
|
32
|
+
Barometer.respond_to?("skip_graticule").should be_true
|
33
|
+
Barometer.skip_graticule.should be_false
|
34
|
+
Barometer.skip_graticule = true
|
35
|
+
Barometer.skip_graticule.should be_true
|
36
|
+
end
|
37
|
+
|
38
|
+
it "forces the geocoding of queries" do
|
39
|
+
Barometer.respond_to?("force_geocode").should be_true
|
40
|
+
Barometer.force_geocode.should be_false
|
41
|
+
Barometer.force_geocode = true
|
42
|
+
Barometer.force_geocode.should be_true
|
43
|
+
end
|
44
|
+
|
45
|
+
it "forces the geocoding of queries" do
|
46
|
+
Barometer.respond_to?("force_geocode!").should be_true
|
47
|
+
Barometer.force_geocode = false
|
48
|
+
Barometer.force_geocode.should be_false
|
49
|
+
Barometer.force_geocode!
|
50
|
+
Barometer.force_geocode.should be_true
|
51
|
+
end
|
52
|
+
|
53
|
+
it "set the global service timeout" do
|
54
|
+
Barometer.respond_to?("timeout").should be_true
|
55
|
+
Barometer.timeout.should == 15
|
56
|
+
Barometer.timeout = 5
|
57
|
+
Barometer.timeout.should == 5
|
58
|
+
end
|
59
|
+
|
60
|
+
end
|
61
|
+
|
62
|
+
describe "when initialized" do
|
63
|
+
|
64
|
+
before(:each) do
|
65
|
+
@barometer_direct = Barometer.new
|
66
|
+
@barometer = Barometer::Base.new
|
67
|
+
end
|
68
|
+
|
69
|
+
it "responds to query" do
|
70
|
+
@barometer_direct.respond_to?("query").should be_true
|
71
|
+
@barometer.respond_to?("query").should be_true
|
72
|
+
end
|
73
|
+
|
74
|
+
it "sets the query" do
|
75
|
+
query = "query"
|
76
|
+
barometer = Barometer.new(query)
|
77
|
+
barometer.query.is_a?(Barometer::Query)
|
78
|
+
barometer.query.q.should == query
|
79
|
+
|
80
|
+
barometer = Barometer::Base.new(query)
|
81
|
+
barometer.query.is_a?(Barometer::Query)
|
82
|
+
barometer.query.q.should == query
|
83
|
+
end
|
84
|
+
|
85
|
+
it "responds to weather" do
|
86
|
+
@barometer.weather.is_a?(Barometer::Weather).should be_true
|
87
|
+
@barometer_direct.weather.is_a?(Barometer::Weather).should be_true
|
88
|
+
end
|
89
|
+
|
90
|
+
it "responds to success" do
|
91
|
+
@barometer.success.should be_false
|
92
|
+
@barometer_direct.success.should be_false
|
93
|
+
@barometer_direct.success?.should be_false
|
94
|
+
@barometer_direct.success = true
|
95
|
+
@barometer_direct.success?.should be_true
|
96
|
+
end
|
97
|
+
|
98
|
+
end
|
99
|
+
|
100
|
+
describe "when measuring" do
|
101
|
+
|
102
|
+
before(:each) do
|
103
|
+
Barometer.google_geocode_key = @key
|
104
|
+
query_term = "Calgary,AB"
|
105
|
+
@barometer = Barometer::Base.new(query_term)
|
106
|
+
@time = Time.now
|
107
|
+
FakeWeb.register_uri(:get,
|
108
|
+
"http://api.wunderground.com/auto/wui/geo/WXCurrentObXML/index.xml?query=#{CGI.escape(query_term)}",
|
109
|
+
:string => File.read(File.join(File.dirname(__FILE__),
|
110
|
+
'fixtures',
|
111
|
+
'current_calgary_ab.xml')
|
112
|
+
)
|
113
|
+
)
|
114
|
+
FakeWeb.register_uri(:get,
|
115
|
+
"http://api.wunderground.com/auto/wui/geo/ForecastXML/index.xml?query=#{CGI.escape(query_term)}",
|
116
|
+
:string => File.read(File.join(File.dirname(__FILE__),
|
117
|
+
'fixtures',
|
118
|
+
'forecast_calgary_ab.xml')
|
119
|
+
)
|
120
|
+
)
|
121
|
+
FakeWeb.register_uri(:get,
|
122
|
+
"http://maps.google.com:80/maps/geo?gl=&q=Calgary%2CAB&output=xml&key=#{@key}",
|
123
|
+
:string => File.read(File.join(File.dirname(__FILE__),
|
124
|
+
'fixtures',
|
125
|
+
'geocode_calgary_ab.xml')
|
126
|
+
)
|
127
|
+
)
|
128
|
+
|
129
|
+
|
130
|
+
FakeWeb.register_uri(:get,
|
131
|
+
"http://api.wunderground.com/auto/wui/geo/WXCurrentObXML/index.xml?query=51.055149%2C-114.062438",
|
132
|
+
:string => File.read(File.join(File.dirname(__FILE__),
|
133
|
+
'fixtures',
|
134
|
+
'current_calgary_ab.xml')
|
135
|
+
)
|
136
|
+
)
|
137
|
+
FakeWeb.register_uri(:get,
|
138
|
+
"http://api.wunderground.com/auto/wui/geo/ForecastXML/index.xml?query=51.055149%2C-114.062438",
|
139
|
+
:string => File.read(File.join(File.dirname(__FILE__),
|
140
|
+
'fixtures',
|
141
|
+
'forecast_calgary_ab.xml')
|
142
|
+
)
|
143
|
+
)
|
144
|
+
|
145
|
+
end
|
146
|
+
|
147
|
+
it "responds to measure" do
|
148
|
+
@barometer.respond_to?("measure").should be_true
|
149
|
+
end
|
150
|
+
|
151
|
+
it "returns a Barometer::Weather object" do
|
152
|
+
@barometer.measure.is_a?(Barometer::Weather).should be_true
|
153
|
+
end
|
154
|
+
|
155
|
+
it "raises OutOfSources if no services successful" do
|
156
|
+
Barometer::Base.selection = { 1 => [] }
|
157
|
+
lambda { @barometer.measure }.should raise_error(Barometer::OutOfSources)
|
158
|
+
end
|
159
|
+
|
160
|
+
end
|
161
|
+
|
162
|
+
end
|
@@ -0,0 +1,225 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe "Current Measurement" do
|
4
|
+
|
5
|
+
describe "when initialized" do
|
6
|
+
|
7
|
+
before(:each) do
|
8
|
+
@current = Barometer::CurrentMeasurement.new
|
9
|
+
end
|
10
|
+
|
11
|
+
it "responds to time" do
|
12
|
+
@current.time.should be_nil
|
13
|
+
end
|
14
|
+
|
15
|
+
it "responds to humidity" do
|
16
|
+
@current.humidity.should be_nil
|
17
|
+
end
|
18
|
+
|
19
|
+
it "responds to icon" do
|
20
|
+
@current.icon.should be_nil
|
21
|
+
end
|
22
|
+
|
23
|
+
it "responds to condition" do
|
24
|
+
@current.condition.should be_nil
|
25
|
+
end
|
26
|
+
|
27
|
+
it "responds to temperature" do
|
28
|
+
@current.temperature.should be_nil
|
29
|
+
end
|
30
|
+
|
31
|
+
it "responds to dew_point" do
|
32
|
+
@current.dew_point.should be_nil
|
33
|
+
end
|
34
|
+
|
35
|
+
it "responds to heat_index" do
|
36
|
+
@current.heat_index.should be_nil
|
37
|
+
end
|
38
|
+
|
39
|
+
it "responds to wind_chill" do
|
40
|
+
@current.wind_chill.should be_nil
|
41
|
+
end
|
42
|
+
|
43
|
+
it "responds to wind" do
|
44
|
+
@current.wind.should be_nil
|
45
|
+
end
|
46
|
+
|
47
|
+
it "responds to pressure" do
|
48
|
+
@current.pressure.should be_nil
|
49
|
+
end
|
50
|
+
|
51
|
+
it "responds to visibility" do
|
52
|
+
@current.pressure.should be_nil
|
53
|
+
end
|
54
|
+
|
55
|
+
it "responds to sun" do
|
56
|
+
@current.sun.should be_nil
|
57
|
+
end
|
58
|
+
|
59
|
+
end
|
60
|
+
|
61
|
+
describe "when writing data" do
|
62
|
+
|
63
|
+
before(:each) do
|
64
|
+
@current = Barometer::CurrentMeasurement.new
|
65
|
+
end
|
66
|
+
|
67
|
+
# it "only accepts Time for time" do
|
68
|
+
# invalid_data = 1
|
69
|
+
# invalid_data.class.should_not == Time
|
70
|
+
# lambda { @current.time = invalid_data }.should raise_error(ArgumentError)
|
71
|
+
#
|
72
|
+
# valid_data = Time.new
|
73
|
+
# valid_data.class.should == Time
|
74
|
+
# lambda { @current.time = valid_data }.should_not raise_error(ArgumentError)
|
75
|
+
# end
|
76
|
+
|
77
|
+
it "only accepts Fixnum or Float for humidity" do
|
78
|
+
invalid_data = "invalid"
|
79
|
+
invalid_data.class.should_not == Fixnum
|
80
|
+
invalid_data.class.should_not == Float
|
81
|
+
lambda { @current.humidity = invalid_data }.should raise_error(ArgumentError)
|
82
|
+
|
83
|
+
valid_data = 1.to_i
|
84
|
+
valid_data.class.should == Fixnum
|
85
|
+
lambda { @current.humidity = valid_data }.should_not raise_error(ArgumentError)
|
86
|
+
|
87
|
+
valid_data = 1.0.to_f
|
88
|
+
valid_data.class.should == Float
|
89
|
+
lambda { @current.humidity = valid_data }.should_not raise_error(ArgumentError)
|
90
|
+
end
|
91
|
+
|
92
|
+
it "only accepts String for icon" do
|
93
|
+
invalid_data = 1
|
94
|
+
invalid_data.class.should_not == String
|
95
|
+
lambda { @current.icon = invalid_data }.should raise_error(ArgumentError)
|
96
|
+
|
97
|
+
valid_data = "valid"
|
98
|
+
valid_data.class.should == String
|
99
|
+
lambda { @current.icon = valid_data }.should_not raise_error(ArgumentError)
|
100
|
+
end
|
101
|
+
|
102
|
+
it "only accepts String for condition" do
|
103
|
+
invalid_data = 1
|
104
|
+
invalid_data.class.should_not == String
|
105
|
+
lambda { @current.condition = invalid_data }.should raise_error(ArgumentError)
|
106
|
+
|
107
|
+
valid_data = "valid"
|
108
|
+
valid_data.class.should == String
|
109
|
+
lambda { @current.condition = valid_data }.should_not raise_error(ArgumentError)
|
110
|
+
end
|
111
|
+
|
112
|
+
it "only accepts Barometer::Temperature for temperature" do
|
113
|
+
invalid_data = 1
|
114
|
+
invalid_data.class.should_not == Barometer::Temperature
|
115
|
+
lambda { @current.temperature = invalid_data }.should raise_error(ArgumentError)
|
116
|
+
|
117
|
+
valid_data = Barometer::Temperature.new
|
118
|
+
valid_data.class.should == Barometer::Temperature
|
119
|
+
lambda { @current.temperature = valid_data }.should_not raise_error(ArgumentError)
|
120
|
+
end
|
121
|
+
|
122
|
+
it "only accepts Barometer::Temperature for dew_point" do
|
123
|
+
invalid_data = 1
|
124
|
+
invalid_data.class.should_not == Barometer::Temperature
|
125
|
+
lambda { @current.dew_point = invalid_data }.should raise_error(ArgumentError)
|
126
|
+
|
127
|
+
valid_data = Barometer::Temperature.new
|
128
|
+
valid_data.class.should == Barometer::Temperature
|
129
|
+
lambda { @current.dew_point = valid_data }.should_not raise_error(ArgumentError)
|
130
|
+
end
|
131
|
+
|
132
|
+
it "only accepts Barometer::Temperature for heat_index" do
|
133
|
+
invalid_data = 1
|
134
|
+
invalid_data.class.should_not == Barometer::Temperature
|
135
|
+
lambda { @current.heat_index = invalid_data }.should raise_error(ArgumentError)
|
136
|
+
|
137
|
+
valid_data = Barometer::Temperature.new
|
138
|
+
valid_data.class.should == Barometer::Temperature
|
139
|
+
lambda { @current.heat_index = valid_data }.should_not raise_error(ArgumentError)
|
140
|
+
end
|
141
|
+
|
142
|
+
it "only accepts Barometer::Temperature for wind_chill" do
|
143
|
+
invalid_data = 1
|
144
|
+
invalid_data.class.should_not == Barometer::Temperature
|
145
|
+
lambda { @current.wind_chill = invalid_data }.should raise_error(ArgumentError)
|
146
|
+
|
147
|
+
valid_data = Barometer::Temperature.new
|
148
|
+
valid_data.class.should == Barometer::Temperature
|
149
|
+
lambda { @current.wind_chill = valid_data }.should_not raise_error(ArgumentError)
|
150
|
+
end
|
151
|
+
|
152
|
+
it "only accepts Barometer::Speed for wind" do
|
153
|
+
invalid_data = 1
|
154
|
+
invalid_data.class.should_not == Barometer::Speed
|
155
|
+
lambda { @current.wind = invalid_data }.should raise_error(ArgumentError)
|
156
|
+
|
157
|
+
valid_data = Barometer::Speed.new
|
158
|
+
valid_data.class.should == Barometer::Speed
|
159
|
+
lambda { @current.wind = valid_data }.should_not raise_error(ArgumentError)
|
160
|
+
end
|
161
|
+
|
162
|
+
it "only accepts Barometer::Pressure for pressure" do
|
163
|
+
invalid_data = 1
|
164
|
+
invalid_data.class.should_not == Barometer::Pressure
|
165
|
+
lambda { @current.pressure = invalid_data }.should raise_error(ArgumentError)
|
166
|
+
|
167
|
+
valid_data = Barometer::Pressure.new
|
168
|
+
valid_data.class.should == Barometer::Pressure
|
169
|
+
lambda { @current.pressure = valid_data }.should_not raise_error(ArgumentError)
|
170
|
+
end
|
171
|
+
|
172
|
+
it "only accepts Barometer::Distance for visibility" do
|
173
|
+
invalid_data = 1
|
174
|
+
invalid_data.class.should_not == Barometer::Distance
|
175
|
+
lambda { @current.visibility = invalid_data }.should raise_error(ArgumentError)
|
176
|
+
|
177
|
+
valid_data = Barometer::Distance.new
|
178
|
+
valid_data.class.should == Barometer::Distance
|
179
|
+
lambda { @current.visibility = valid_data }.should_not raise_error(ArgumentError)
|
180
|
+
end
|
181
|
+
|
182
|
+
it "only accepts Barometer::Sun for sun" do
|
183
|
+
invalid_data = 1
|
184
|
+
invalid_data.class.should_not == Barometer::Sun
|
185
|
+
lambda { @current.sun = invalid_data }.should raise_error(ArgumentError)
|
186
|
+
|
187
|
+
valid_data = Barometer::Sun.new
|
188
|
+
valid_data.class.should == Barometer::Sun
|
189
|
+
lambda { @current.sun = valid_data }.should_not raise_error(ArgumentError)
|
190
|
+
end
|
191
|
+
|
192
|
+
end
|
193
|
+
|
194
|
+
describe "method missing" do
|
195
|
+
|
196
|
+
before(:each) do
|
197
|
+
@current = Barometer::CurrentMeasurement.new
|
198
|
+
end
|
199
|
+
|
200
|
+
it "responds to method + ?" do
|
201
|
+
valid_method = "humidity"
|
202
|
+
@current.respond_to?(valid_method).should be_true
|
203
|
+
lambda { @current.send(valid_method + "?") }.should_not raise_error(NoMethodError)
|
204
|
+
end
|
205
|
+
|
206
|
+
it "ignores non_method + ?" do
|
207
|
+
invalid_method = "humid"
|
208
|
+
@current.respond_to?(invalid_method).should be_false
|
209
|
+
lambda { @current.send(invalid_method + "?") }.should raise_error(NoMethodError)
|
210
|
+
end
|
211
|
+
|
212
|
+
it "returns true if set" do
|
213
|
+
@current.humidity = 10
|
214
|
+
@current.humidity.should_not be_nil
|
215
|
+
@current.humidity?.should be_true
|
216
|
+
end
|
217
|
+
|
218
|
+
it "returns false if not set" do
|
219
|
+
@current.humidity.should be_nil
|
220
|
+
@current.humidity?.should be_false
|
221
|
+
end
|
222
|
+
|
223
|
+
end
|
224
|
+
|
225
|
+
end
|