barometer 0.5.0 → 0.6.1
Sign up to get free protection for your applications and to get access to all the features.
- data/README.rdoc +51 -9
- data/VERSION.yml +2 -2
- data/bin/barometer +57 -7
- data/lib/barometer.rb +11 -0
- data/lib/barometer/base.rb +3 -0
- data/lib/barometer/data.rb +11 -6
- data/lib/barometer/data/sun.rb +10 -0
- data/lib/barometer/data/zone.rb +79 -188
- data/lib/barometer/formats/coordinates.rb +4 -1
- data/lib/barometer/formats/geocode.rb +9 -7
- data/lib/barometer/formats/icao.rb +2 -2
- data/lib/barometer/formats/weather_id.rb +2 -2
- data/lib/barometer/measurements/common.rb +113 -0
- data/lib/barometer/{data → measurements}/current.rb +17 -42
- data/lib/barometer/measurements/forecast.rb +62 -0
- data/lib/barometer/measurements/forecast_array.rb +72 -0
- data/lib/barometer/{data → measurements}/measurement.rb +57 -45
- data/lib/barometer/measurements/night.rb +27 -0
- data/lib/barometer/query.rb +55 -5
- data/lib/barometer/services.rb +3 -1
- data/lib/barometer/translations/icao_country_codes.yml +274 -1
- data/lib/barometer/translations/weather_country_codes.yml +189 -6
- data/lib/barometer/translations/zone_codes.yml +360 -0
- data/lib/barometer/weather.rb +5 -4
- data/lib/barometer/weather_services/google.rb +19 -35
- data/lib/barometer/weather_services/service.rb +113 -255
- data/lib/barometer/weather_services/weather_bug.rb +291 -2
- data/lib/barometer/weather_services/weather_dot_com.rb +45 -54
- data/lib/barometer/weather_services/wunderground.rb +83 -89
- data/lib/barometer/weather_services/yahoo.rb +44 -91
- data/lib/barometer/web_services/geocode.rb +1 -0
- data/lib/barometer/web_services/timezone.rb +40 -0
- data/lib/barometer/web_services/weather_id.rb +17 -2
- data/lib/demometer/demometer.rb +28 -0
- data/lib/demometer/public/css/master.css +259 -1
- data/lib/demometer/public/css/print.css +94 -0
- data/lib/demometer/public/css/syntax.css +64 -0
- data/lib/demometer/public/images/link-out.gif +0 -0
- data/lib/demometer/views/about.erb +10 -0
- data/lib/demometer/views/index.erb +2 -0
- data/lib/demometer/views/layout.erb +3 -2
- data/lib/demometer/views/measurement.erb +4 -1
- data/lib/demometer/views/readme.erb +116 -88
- data/spec/data/sun_spec.rb +53 -0
- data/spec/data/zone_spec.rb +330 -100
- data/spec/fixtures/formats/weather_id/ksfo.xml +1 -0
- data/spec/fixtures/services/weather_bug/90210_current.xml +1 -0
- data/spec/fixtures/services/weather_bug/90210_forecast.xml +1 -0
- data/spec/formats/weather_id_spec.rb +10 -5
- data/spec/measurements/common_spec.rb +352 -0
- data/spec/{data → measurements}/current_spec.rb +40 -103
- data/spec/measurements/forecast_array_spec.rb +165 -0
- data/spec/measurements/forecast_spec.rb +135 -0
- data/spec/{data → measurements}/measurement_spec.rb +86 -107
- data/spec/measurements/night_measurement_spec.rb +49 -0
- data/spec/query_spec.rb +12 -2
- data/spec/spec_helper.rb +28 -1
- data/spec/weather_services/google_spec.rb +27 -117
- data/spec/weather_services/services_spec.rb +49 -1024
- data/spec/weather_services/weather_bug_spec.rb +274 -0
- data/spec/weather_services/weather_dot_com_spec.rb +45 -125
- data/spec/weather_services/wunderground_spec.rb +42 -136
- data/spec/weather_services/yahoo_spec.rb +26 -116
- data/spec/weather_spec.rb +45 -45
- metadata +27 -11
- data/lib/barometer/data/forecast.rb +0 -84
- data/lib/barometer/data/night.rb +0 -69
- data/lib/barometer/extensions/graticule.rb +0 -51
- data/spec/data/forecast_spec.rb +0 -192
- data/spec/data/night_measurement_spec.rb +0 -136
@@ -1,51 +0,0 @@
|
|
1
|
-
module Graticule
|
2
|
-
class Location
|
3
|
-
|
4
|
-
attr_accessor :country_code, :address_line
|
5
|
-
|
6
|
-
def attributes
|
7
|
-
[:latitude, :longitude, :street, :locality, :region, :postal_code, :country, :precision, :cuntry_code, :address_line].inject({}) do |result,attr|
|
8
|
-
result[attr] = self.send(attr) unless self.send(attr).blank?
|
9
|
-
result
|
10
|
-
end
|
11
|
-
end
|
12
|
-
|
13
|
-
end
|
14
|
-
|
15
|
-
module Geocoder
|
16
|
-
|
17
|
-
class Google < Rest
|
18
|
-
|
19
|
-
# Locates +address+ returning a Location
|
20
|
-
# add ability to bias towards a country
|
21
|
-
def locate(address, country_bias=nil)
|
22
|
-
get :q => (address.is_a?(String) ? address : location_from_params(address).to_s),
|
23
|
-
:gl => country_bias
|
24
|
-
end
|
25
|
-
|
26
|
-
private
|
27
|
-
|
28
|
-
# Extracts a Location from +xml+.
|
29
|
-
def parse_response(xml) #:nodoc:
|
30
|
-
longitude, latitude, = xml.elements['/kml/Response/Placemark/Point/coordinates'].text.split(',').map { |v| v.to_f }
|
31
|
-
returning Location.new(:latitude => latitude, :longitude => longitude) do |l|
|
32
|
-
address = REXML::XPath.first(xml, '//xal:AddressDetails',
|
33
|
-
'xal' => "urn:oasis:names:tc:ciq:xsdschema:xAL:2.0")
|
34
|
-
|
35
|
-
if address
|
36
|
-
l.street = value(address.elements['.//ThoroughfareName/text()'])
|
37
|
-
l.locality = value(address.elements['.//LocalityName/text()'])
|
38
|
-
l.region = value(address.elements['.//AdministrativeAreaName/text()'])
|
39
|
-
l.postal_code = value(address.elements['.//PostalCodeNumber/text()'])
|
40
|
-
l.country = value(address.elements['.//CountryName/text()'])
|
41
|
-
l.country_code = value(address.elements['.//CountryNameCode/text()'])
|
42
|
-
l.address_line = value(address.elements['.//AddressLine/text()'])
|
43
|
-
l.precision = PRECISION[address.attribute('Accuracy').value.to_i] || :unknown
|
44
|
-
end
|
45
|
-
end
|
46
|
-
end
|
47
|
-
|
48
|
-
end
|
49
|
-
|
50
|
-
end
|
51
|
-
end
|
data/spec/data/forecast_spec.rb
DELETED
@@ -1,192 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe "Forecast Measurement" do
|
4
|
-
|
5
|
-
describe "when initialized" do
|
6
|
-
|
7
|
-
before(:each) do
|
8
|
-
@forecast = Data::ForecastMeasurement.new
|
9
|
-
end
|
10
|
-
|
11
|
-
it "responds to date" do
|
12
|
-
@forecast.date.should be_nil
|
13
|
-
end
|
14
|
-
|
15
|
-
it "responds to icon" do
|
16
|
-
@forecast.icon.should be_nil
|
17
|
-
end
|
18
|
-
|
19
|
-
it "responds to condition" do
|
20
|
-
@forecast.condition.should be_nil
|
21
|
-
end
|
22
|
-
|
23
|
-
it "responds to low" do
|
24
|
-
@forecast.low.should be_nil
|
25
|
-
end
|
26
|
-
|
27
|
-
it "responds to high" do
|
28
|
-
@forecast.high.should be_nil
|
29
|
-
end
|
30
|
-
|
31
|
-
it "responds to pop" do
|
32
|
-
@forecast.pop.should be_nil
|
33
|
-
end
|
34
|
-
|
35
|
-
it "responds to humidity" do
|
36
|
-
@forecast.humidity.should be_nil
|
37
|
-
end
|
38
|
-
|
39
|
-
it "responds to wind" do
|
40
|
-
@forecast.wind.should be_nil
|
41
|
-
end
|
42
|
-
|
43
|
-
it "responds to sun" do
|
44
|
-
@forecast.sun.should be_nil
|
45
|
-
end
|
46
|
-
|
47
|
-
it "responds to night" do
|
48
|
-
@forecast.night.should be_nil
|
49
|
-
end
|
50
|
-
|
51
|
-
end
|
52
|
-
|
53
|
-
describe "when writing data" do
|
54
|
-
|
55
|
-
before(:each) do
|
56
|
-
@forecast = Data::ForecastMeasurement.new
|
57
|
-
end
|
58
|
-
|
59
|
-
it "only accepts Date for date" do
|
60
|
-
invalid_data = 1
|
61
|
-
invalid_data.class.should_not == Date
|
62
|
-
lambda { @forecast.date = invalid_data }.should raise_error(ArgumentError)
|
63
|
-
|
64
|
-
valid_data = Date.new
|
65
|
-
valid_data.class.should == Date
|
66
|
-
lambda { @forecast.date = valid_data }.should_not raise_error(ArgumentError)
|
67
|
-
end
|
68
|
-
|
69
|
-
it "only accepts String for icon" do
|
70
|
-
invalid_data = 1
|
71
|
-
invalid_data.class.should_not == String
|
72
|
-
lambda { @forecast.icon = invalid_data }.should raise_error(ArgumentError)
|
73
|
-
|
74
|
-
valid_data = "valid"
|
75
|
-
valid_data.class.should == String
|
76
|
-
lambda { @forecast.icon = valid_data }.should_not raise_error(ArgumentError)
|
77
|
-
end
|
78
|
-
|
79
|
-
it "only accepts String for condition" do
|
80
|
-
invalid_data = 1
|
81
|
-
invalid_data.class.should_not == String
|
82
|
-
lambda { @forecast.condition = invalid_data }.should raise_error(ArgumentError)
|
83
|
-
|
84
|
-
valid_data = "valid"
|
85
|
-
valid_data.class.should == String
|
86
|
-
lambda { @forecast.condition = valid_data }.should_not raise_error(ArgumentError)
|
87
|
-
end
|
88
|
-
|
89
|
-
it "only accepts Data::Temperature for high" do
|
90
|
-
invalid_data = 1
|
91
|
-
invalid_data.class.should_not == Data::Temperature
|
92
|
-
lambda { @forecast.high = invalid_data }.should raise_error(ArgumentError)
|
93
|
-
|
94
|
-
valid_data = Data::Temperature.new
|
95
|
-
valid_data.class.should == Data::Temperature
|
96
|
-
lambda { @forecast.high = valid_data }.should_not raise_error(ArgumentError)
|
97
|
-
end
|
98
|
-
|
99
|
-
it "only accepts Data::Temperature for low" do
|
100
|
-
invalid_data = 1
|
101
|
-
invalid_data.class.should_not == Data::Temperature
|
102
|
-
lambda { @forecast.low = invalid_data }.should raise_error(ArgumentError)
|
103
|
-
|
104
|
-
valid_data = Data::Temperature.new
|
105
|
-
valid_data.class.should == Data::Temperature
|
106
|
-
lambda { @forecast.low = valid_data }.should_not raise_error(ArgumentError)
|
107
|
-
end
|
108
|
-
|
109
|
-
it "only accepts Fixnum for pop" do
|
110
|
-
invalid_data = "test"
|
111
|
-
invalid_data.class.should_not == Fixnum
|
112
|
-
lambda { @forecast.pop = invalid_data }.should raise_error(ArgumentError)
|
113
|
-
|
114
|
-
valid_data = 50
|
115
|
-
valid_data.class.should == Fixnum
|
116
|
-
lambda { @forecast.pop = valid_data }.should_not raise_error(ArgumentError)
|
117
|
-
end
|
118
|
-
|
119
|
-
it "only accepts Data::Speed for wind" do
|
120
|
-
invalid_data = "test"
|
121
|
-
invalid_data.class.should_not == Data::Speed
|
122
|
-
lambda { @forecast.wind = invalid_data }.should raise_error(ArgumentError)
|
123
|
-
|
124
|
-
valid_data = Data::Speed.new
|
125
|
-
valid_data.class.should == Data::Speed
|
126
|
-
lambda { @forecast.wind = valid_data }.should_not raise_error(ArgumentError)
|
127
|
-
end
|
128
|
-
|
129
|
-
it "only accepts Fixnum for humidity" do
|
130
|
-
invalid_data = "test"
|
131
|
-
invalid_data.class.should_not == Fixnum
|
132
|
-
lambda { @forecast.humidity = invalid_data }.should raise_error(ArgumentError)
|
133
|
-
|
134
|
-
valid_data = 50
|
135
|
-
valid_data.class.should == Fixnum
|
136
|
-
lambda { @forecast.humidity = valid_data }.should_not raise_error(ArgumentError)
|
137
|
-
end
|
138
|
-
|
139
|
-
it "only accepts Data::Sun for sun" do
|
140
|
-
invalid_data = 1
|
141
|
-
invalid_data.class.should_not == Data::Sun
|
142
|
-
lambda { @forecast.sun = invalid_data }.should raise_error(ArgumentError)
|
143
|
-
|
144
|
-
valid_data = Data::Sun.new
|
145
|
-
valid_data.class.should == Data::Sun
|
146
|
-
lambda { @forecast.sun = valid_data }.should_not raise_error(ArgumentError)
|
147
|
-
end
|
148
|
-
|
149
|
-
it "only accepts Data::NightMeasurement for sun" do
|
150
|
-
invalid_data = 1
|
151
|
-
invalid_data.class.should_not == Data::NightMeasurement
|
152
|
-
lambda { @forecast.night = invalid_data }.should raise_error(ArgumentError)
|
153
|
-
|
154
|
-
valid_data = Data::NightMeasurement.new
|
155
|
-
valid_data.class.should == Data::NightMeasurement
|
156
|
-
lambda { @forecast.night = valid_data }.should_not raise_error(ArgumentError)
|
157
|
-
end
|
158
|
-
|
159
|
-
end
|
160
|
-
|
161
|
-
describe "method missing" do
|
162
|
-
|
163
|
-
before(:each) do
|
164
|
-
@forecast = Data::ForecastMeasurement.new
|
165
|
-
end
|
166
|
-
|
167
|
-
it "responds to method + ?" do
|
168
|
-
valid_method = "pop"
|
169
|
-
@forecast.respond_to?(valid_method).should be_true
|
170
|
-
lambda { @forecast.send(valid_method + "?") }.should_not raise_error(NoMethodError)
|
171
|
-
end
|
172
|
-
|
173
|
-
it "ignores non_method + ?" do
|
174
|
-
invalid_method = "humid"
|
175
|
-
@forecast.respond_to?(invalid_method).should be_false
|
176
|
-
lambda { @forecast.send(invalid_method + "?") }.should raise_error(NoMethodError)
|
177
|
-
end
|
178
|
-
|
179
|
-
it "returns true if set" do
|
180
|
-
@forecast.pop = 10
|
181
|
-
@forecast.pop.should_not be_nil
|
182
|
-
@forecast.pop?.should be_true
|
183
|
-
end
|
184
|
-
|
185
|
-
it "returns false if not set" do
|
186
|
-
@forecast.pop.should be_nil
|
187
|
-
@forecast.pop?.should be_false
|
188
|
-
end
|
189
|
-
|
190
|
-
end
|
191
|
-
|
192
|
-
end
|
@@ -1,136 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe "Forecasted Night Measurement" do
|
4
|
-
|
5
|
-
describe "when initialized" do
|
6
|
-
|
7
|
-
before(:each) do
|
8
|
-
@night = Data::NightMeasurement.new
|
9
|
-
end
|
10
|
-
|
11
|
-
it "responds to date" do
|
12
|
-
@night.date.should be_nil
|
13
|
-
end
|
14
|
-
|
15
|
-
it "responds to icon" do
|
16
|
-
@night.icon.should be_nil
|
17
|
-
end
|
18
|
-
|
19
|
-
it "responds to condition" do
|
20
|
-
@night.condition.should be_nil
|
21
|
-
end
|
22
|
-
|
23
|
-
it "responds to pop" do
|
24
|
-
@night.pop.should be_nil
|
25
|
-
end
|
26
|
-
|
27
|
-
it "responds to humidity" do
|
28
|
-
@night.humidity.should be_nil
|
29
|
-
end
|
30
|
-
|
31
|
-
it "responds to wind" do
|
32
|
-
@night.wind.should be_nil
|
33
|
-
end
|
34
|
-
|
35
|
-
end
|
36
|
-
|
37
|
-
describe "when writing data" do
|
38
|
-
|
39
|
-
before(:each) do
|
40
|
-
@night = Data::NightMeasurement.new
|
41
|
-
end
|
42
|
-
|
43
|
-
it "only accepts Date for date" do
|
44
|
-
invalid_data = 1
|
45
|
-
invalid_data.class.should_not == Date
|
46
|
-
lambda { @night.date = invalid_data }.should raise_error(ArgumentError)
|
47
|
-
|
48
|
-
valid_data = Date.new
|
49
|
-
valid_data.class.should == Date
|
50
|
-
lambda { @night.date = valid_data }.should_not raise_error(ArgumentError)
|
51
|
-
end
|
52
|
-
|
53
|
-
it "only accepts String for icon" do
|
54
|
-
invalid_data = 1
|
55
|
-
invalid_data.class.should_not == String
|
56
|
-
lambda { @night.icon = invalid_data }.should raise_error(ArgumentError)
|
57
|
-
|
58
|
-
valid_data = "valid"
|
59
|
-
valid_data.class.should == String
|
60
|
-
lambda { @night.icon = valid_data }.should_not raise_error(ArgumentError)
|
61
|
-
end
|
62
|
-
|
63
|
-
it "only accepts String for condition" do
|
64
|
-
invalid_data = 1
|
65
|
-
invalid_data.class.should_not == String
|
66
|
-
lambda { @night.condition = invalid_data }.should raise_error(ArgumentError)
|
67
|
-
|
68
|
-
valid_data = "valid"
|
69
|
-
valid_data.class.should == String
|
70
|
-
lambda { @night.condition = valid_data }.should_not raise_error(ArgumentError)
|
71
|
-
end
|
72
|
-
|
73
|
-
it "only accepts Fixnum for pop" do
|
74
|
-
invalid_data = "test"
|
75
|
-
invalid_data.class.should_not == Fixnum
|
76
|
-
lambda { @night.pop = invalid_data }.should raise_error(ArgumentError)
|
77
|
-
|
78
|
-
valid_data = 50
|
79
|
-
valid_data.class.should == Fixnum
|
80
|
-
lambda { @night.pop = valid_data }.should_not raise_error(ArgumentError)
|
81
|
-
end
|
82
|
-
|
83
|
-
it "only accepts Data::Speed for wind" do
|
84
|
-
invalid_data = "test"
|
85
|
-
invalid_data.class.should_not == Data::Speed
|
86
|
-
lambda { @night.wind = invalid_data }.should raise_error(ArgumentError)
|
87
|
-
|
88
|
-
valid_data = Data::Speed.new
|
89
|
-
valid_data.class.should == Data::Speed
|
90
|
-
lambda { @night.wind = valid_data }.should_not raise_error(ArgumentError)
|
91
|
-
end
|
92
|
-
|
93
|
-
it "only accepts Fixnum for humidity" do
|
94
|
-
invalid_data = "test"
|
95
|
-
invalid_data.class.should_not == Fixnum
|
96
|
-
lambda { @night.humidity = invalid_data }.should raise_error(ArgumentError)
|
97
|
-
|
98
|
-
valid_data = 50
|
99
|
-
valid_data.class.should == Fixnum
|
100
|
-
lambda { @night.humidity = valid_data }.should_not raise_error(ArgumentError)
|
101
|
-
end
|
102
|
-
|
103
|
-
end
|
104
|
-
|
105
|
-
describe "method missing" do
|
106
|
-
|
107
|
-
before(:each) do
|
108
|
-
@night = Data::NightMeasurement.new
|
109
|
-
end
|
110
|
-
|
111
|
-
it "responds to method + ?" do
|
112
|
-
valid_method = "pop"
|
113
|
-
@night.respond_to?(valid_method).should be_true
|
114
|
-
lambda { @night.send(valid_method + "?") }.should_not raise_error(NoMethodError)
|
115
|
-
end
|
116
|
-
|
117
|
-
it "ignores non_method + ?" do
|
118
|
-
invalid_method = "humid"
|
119
|
-
@night.respond_to?(invalid_method).should be_false
|
120
|
-
lambda { @night.send(invalid_method + "?") }.should raise_error(NoMethodError)
|
121
|
-
end
|
122
|
-
|
123
|
-
it "returns true if set" do
|
124
|
-
@night.pop = 10
|
125
|
-
@night.pop.should_not be_nil
|
126
|
-
@night.pop?.should be_true
|
127
|
-
end
|
128
|
-
|
129
|
-
it "returns false if not set" do
|
130
|
-
@night.pop.should be_nil
|
131
|
-
@night.pop?.should be_false
|
132
|
-
end
|
133
|
-
|
134
|
-
end
|
135
|
-
|
136
|
-
end
|