barometer 0.7.3 → 0.8.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.
- data/.gitignore +1 -0
- data/.travis.yml +7 -0
- data/LICENSE +1 -1
- data/{README.rdoc → README.md} +124 -110
- data/Rakefile +1 -21
- data/TODO +8 -9
- data/barometer.gemspec +20 -19
- data/bin/barometer +36 -83
- data/lib/barometer.rb +13 -11
- data/lib/barometer/base.rb +10 -10
- data/lib/barometer/data.rb +1 -1
- data/lib/barometer/data/distance.rb +25 -25
- data/lib/barometer/data/geo.rb +9 -9
- data/lib/barometer/data/local_datetime.rb +24 -20
- data/lib/barometer/data/local_time.rb +13 -13
- data/lib/barometer/data/location.rb +6 -6
- data/lib/barometer/data/pressure.rb +24 -24
- data/lib/barometer/data/speed.rb +28 -28
- data/lib/barometer/data/sun.rb +7 -7
- data/lib/barometer/data/temperature.rb +29 -29
- data/lib/barometer/data/units.rb +9 -9
- data/lib/barometer/data/zone.rb +19 -19
- data/lib/barometer/formats.rb +1 -1
- data/lib/barometer/formats/coordinates.rb +7 -7
- data/lib/barometer/formats/format.rb +6 -6
- data/lib/barometer/formats/geocode.rb +5 -5
- data/lib/barometer/formats/icao.rb +6 -6
- data/lib/barometer/formats/postalcode.rb +3 -3
- data/lib/barometer/formats/short_zipcode.rb +2 -2
- data/lib/barometer/formats/weather_id.rb +10 -10
- data/lib/barometer/formats/woe_id.rb +20 -20
- data/lib/barometer/formats/zipcode.rb +3 -3
- data/lib/barometer/key_file_parser.rb +20 -0
- data/lib/barometer/measurements/measurement.rb +32 -32
- data/lib/barometer/measurements/result.rb +39 -39
- data/lib/barometer/measurements/result_array.rb +12 -12
- data/lib/barometer/query.rb +15 -15
- data/lib/barometer/services.rb +3 -3
- data/lib/barometer/translations/icao_country_codes.yml +20 -20
- data/lib/barometer/translations/weather_country_codes.yml +1 -1
- data/lib/barometer/translations/zone_codes.yml +2 -2
- data/lib/barometer/version.rb +3 -0
- data/lib/barometer/weather.rb +27 -27
- data/lib/barometer/weather_services/noaa.rb +314 -3
- data/lib/barometer/weather_services/service.rb +32 -30
- data/lib/barometer/weather_services/weather_bug.rb +35 -33
- data/lib/barometer/weather_services/wunderground.rb +31 -29
- data/lib/barometer/weather_services/yahoo.rb +36 -35
- data/lib/barometer/web_services/geocode.rb +5 -7
- data/lib/barometer/web_services/noaa_station_id.rb +53 -0
- data/lib/barometer/web_services/placemaker.rb +11 -13
- data/lib/barometer/web_services/timezone.rb +5 -7
- data/lib/barometer/web_services/weather_id.rb +4 -6
- data/lib/barometer/web_services/web_service.rb +4 -4
- data/spec/barometer_spec.rb +25 -27
- data/spec/cassettes/Barometer.json +1 -0
- data/spec/cassettes/Query.json +1 -0
- data/spec/cassettes/Query_Format_Coordinates.json +1 -0
- data/spec/cassettes/Query_Format_Geocode.json +1 -0
- data/spec/cassettes/Query_Format_WeatherID.json +1 -0
- data/spec/cassettes/Query_Format_WoeID.json +1 -0
- data/spec/cassettes/WeatherService.json +1 -0
- data/spec/cassettes/WeatherService_Noaa.json +1 -0
- data/spec/cassettes/WeatherService_WeatherBug.json +1 -0
- data/spec/cassettes/WeatherService_Wunderground.json +1 -0
- data/spec/cassettes/WeatherService_Yahoo.json +1 -0
- data/spec/cassettes/WebService_Geocode.json +1 -0
- data/spec/cassettes/WebService_NoaaStation.json +1 -0
- data/spec/data/distance_spec.rb +60 -60
- data/spec/data/geo_spec.rb +23 -23
- data/spec/data/local_datetime_spec.rb +44 -44
- data/spec/data/local_time_spec.rb +47 -47
- data/spec/data/location_spec.rb +16 -16
- data/spec/data/pressure_spec.rb +61 -61
- data/spec/data/speed_spec.rb +69 -69
- data/spec/data/sun_spec.rb +25 -25
- data/spec/data/temperature_spec.rb +68 -68
- data/spec/data/units_spec.rb +21 -21
- data/spec/data/zone_spec.rb +35 -35
- data/spec/formats/coordinates_spec.rb +27 -27
- data/spec/formats/format_spec.rb +17 -25
- data/spec/formats/geocode_spec.rb +23 -31
- data/spec/formats/icao_spec.rb +26 -32
- data/spec/formats/postalcode_spec.rb +22 -28
- data/spec/formats/short_zipcode_spec.rb +20 -26
- data/spec/formats/weather_id_spec.rb +57 -67
- data/spec/formats/woe_id_spec.rb +59 -59
- data/spec/formats/zipcode_spec.rb +39 -47
- data/spec/key_file_parser_spec.rb +28 -0
- data/spec/measurements/measurement_spec.rb +79 -133
- data/spec/measurements/result_array_spec.rb +23 -38
- data/spec/measurements/result_spec.rb +100 -128
- data/spec/query_spec.rb +83 -100
- data/spec/spec_helper.rb +24 -6
- data/spec/weather_services/noaa_spec.rb +179 -0
- data/spec/weather_services/services_spec.rb +28 -36
- data/spec/weather_services/weather_bug_spec.rb +57 -77
- data/spec/weather_services/wunderground_spec.rb +36 -65
- data/spec/weather_services/yahoo_spec.rb +38 -60
- data/spec/weather_spec.rb +79 -79
- data/spec/web_services/geocode_spec.rb +7 -11
- data/spec/web_services/noaa_station_id_spec.rb +33 -0
- data/spec/web_services/placemaker_spec.rb +7 -12
- data/spec/web_services/web_services_spec.rb +3 -9
- metadata +214 -163
- data/VERSION.yml +0 -5
- data/lib/barometer/weather_services/google.rb +0 -142
- data/lib/barometer/weather_services/weather_dot_com.rb +0 -279
- data/spec/fakeweb_helper.rb +0 -179
- data/spec/fixtures/formats/weather_id/90210.xml +0 -7
- data/spec/fixtures/formats/weather_id/from_USGA0028.xml +0 -3
- data/spec/fixtures/formats/weather_id/ksfo.xml +0 -1
- data/spec/fixtures/formats/weather_id/manhattan.xml +0 -7
- data/spec/fixtures/formats/weather_id/new_york.xml +0 -1
- data/spec/fixtures/formats/weather_id/the_hills.xml +0 -1
- data/spec/fixtures/geocode/40_73_v3.json +0 -497
- data/spec/fixtures/geocode/90210_v3.json +0 -63
- data/spec/fixtures/geocode/T5B4M9_v3.json +0 -68
- data/spec/fixtures/geocode/atlanta_v3.json +0 -58
- data/spec/fixtures/geocode/calgary_ab_v3.json +0 -58
- data/spec/fixtures/geocode/ksfo_v3.json +0 -73
- data/spec/fixtures/geocode/newyork_ny_v3.json +0 -58
- data/spec/fixtures/services/google/calgary_ab.xml +0 -1
- data/spec/fixtures/services/placemaker/T5B4M9.xml +0 -65
- data/spec/fixtures/services/placemaker/atlanta.xml +0 -65
- data/spec/fixtures/services/placemaker/coords.xml +0 -65
- data/spec/fixtures/services/placemaker/ksfo.xml +0 -65
- data/spec/fixtures/services/placemaker/new_york.xml +0 -65
- data/spec/fixtures/services/placemaker/the_hills.xml +0 -65
- data/spec/fixtures/services/placemaker/w615702.xml +0 -47
- data/spec/fixtures/services/weather_bug/90210_current.xml +0 -93
- data/spec/fixtures/services/weather_bug/90210_forecast.xml +0 -76
- data/spec/fixtures/services/weather_dot_com/90210.xml +0 -1
- data/spec/fixtures/services/wunderground/current_calgary_ab.xml +0 -9
- data/spec/fixtures/services/wunderground/forecast_calgary_ab.xml +0 -13
- data/spec/fixtures/services/yahoo/90210.xml +0 -3
- data/spec/weather_services/google_spec.rb +0 -181
- data/spec/weather_services/weather_dot_com_spec.rb +0 -224
@@ -7,16 +7,16 @@ module Barometer
|
|
7
7
|
# with methods for insertion and searching
|
8
8
|
#
|
9
9
|
class Measurement::ResultArray < Array
|
10
|
-
|
10
|
+
|
11
11
|
def <<(forecast)
|
12
12
|
raise ArgumentError unless forecast.is_a?(Measurement::Result)
|
13
13
|
super(forecast)
|
14
14
|
end
|
15
|
-
|
15
|
+
|
16
16
|
def [](index)
|
17
17
|
index.is_a?(Fixnum) ? super(index) : self.for(index)
|
18
18
|
end
|
19
|
-
|
19
|
+
|
20
20
|
#
|
21
21
|
# Returns a forecast for a day given by a Date, DateTime,
|
22
22
|
# Time, or a string that can be parsed to a Data::LocalDateTime
|
@@ -24,9 +24,9 @@ module Barometer
|
|
24
24
|
# credit: http://github.com/jdpace/weatherman/
|
25
25
|
#
|
26
26
|
def for(datetime)
|
27
|
-
|
27
|
+
|
28
28
|
return nil unless self.size > 0
|
29
|
-
|
29
|
+
|
30
30
|
# Format date into a Date class
|
31
31
|
datetime = case datetime.class.name
|
32
32
|
when 'Date'
|
@@ -41,35 +41,35 @@ module Barometer
|
|
41
41
|
when 'DateTime'
|
42
42
|
Data::LocalDateTime.parse(datetime)
|
43
43
|
end
|
44
|
-
|
44
|
+
|
45
45
|
day = nil
|
46
46
|
self.each do |f|
|
47
47
|
day = f if f.for_datetime?(datetime)
|
48
48
|
end
|
49
49
|
return day
|
50
50
|
end
|
51
|
-
|
51
|
+
|
52
52
|
#
|
53
53
|
# answer simple questions
|
54
54
|
#
|
55
|
-
|
55
|
+
|
56
56
|
def windy?(datetime, threshold=10)
|
57
57
|
(forecast = self[datetime]) ? forecast.windy?(threshold) : nil
|
58
58
|
end
|
59
|
-
|
59
|
+
|
60
60
|
def day?(datetime)
|
61
61
|
local_time = Data::LocalTime.parse(datetime)
|
62
62
|
(forecast = self[datetime]) ? forecast.day?(local_time) : nil
|
63
63
|
end
|
64
|
-
|
64
|
+
|
65
65
|
def sunny?(datetime, sunny_icons=nil)
|
66
66
|
local_time = Data::LocalTime.parse(datetime)
|
67
67
|
(forecast = self[datetime]) ? forecast.sunny?(local_time, sunny_icons) : nil
|
68
68
|
end
|
69
|
-
|
69
|
+
|
70
70
|
def wet?(datetime, wet_icons=nil, pop_threshold=50, humidity_threshold=99)
|
71
71
|
(forecast = self[datetime]) ? forecast.wet?(wet_icons,pop_threshold,humidity_threshold) : nil
|
72
72
|
end
|
73
|
-
|
73
|
+
|
74
74
|
end
|
75
75
|
end
|
data/lib/barometer/query.rb
CHANGED
@@ -17,7 +17,7 @@ module Barometer
|
|
17
17
|
# not accept the query string.
|
18
18
|
#
|
19
19
|
class Query
|
20
|
-
|
20
|
+
|
21
21
|
# This array defines the order to check a query for the format
|
22
22
|
#
|
23
23
|
FORMATS = %w(
|
@@ -29,18 +29,18 @@ module Barometer
|
|
29
29
|
:coordinates => "Coordinates", :icao => "Icao",
|
30
30
|
:woe_id => "WoeID", :geocode => "Geocode"
|
31
31
|
}
|
32
|
-
|
32
|
+
|
33
33
|
attr_writer :q
|
34
34
|
attr_accessor :format, :country_code
|
35
35
|
attr_accessor :geo, :timezone, :conversions
|
36
|
-
|
36
|
+
|
37
37
|
def initialize(query=nil)
|
38
38
|
return unless query
|
39
39
|
@q = query
|
40
40
|
self.analyze!
|
41
41
|
@conversions = {}
|
42
42
|
end
|
43
|
-
|
43
|
+
|
44
44
|
def q
|
45
45
|
format ? Barometer::Query::Format.const_get(FORMAT_MAP[format.to_sym].to_s).convert_query(@q) : @q
|
46
46
|
end
|
@@ -59,14 +59,14 @@ module Barometer
|
|
59
59
|
end
|
60
60
|
end
|
61
61
|
end
|
62
|
-
|
62
|
+
|
63
63
|
# take a list of acceptable (and ordered by preference) formats and convert
|
64
64
|
# the current query (q) into the most preferred and acceptable format. a
|
65
65
|
# side effect of the conversions may reveal the country_code, if so save it
|
66
66
|
#
|
67
67
|
def convert!(preferred_formats=nil)
|
68
68
|
raise ArgumentError unless (preferred_formats && preferred_formats.size > 0)
|
69
|
-
|
69
|
+
|
70
70
|
# why convert if we are already there?
|
71
71
|
# (except in the case that the serivce excepts coordinates and we have a
|
72
72
|
# a geocode ... the google geocode results are superior)
|
@@ -79,7 +79,7 @@ module Barometer
|
|
79
79
|
converted_query = self.dup
|
80
80
|
end
|
81
81
|
end
|
82
|
-
|
82
|
+
|
83
83
|
unless skip_conversion
|
84
84
|
# go through each acceptable format and try to convert to that
|
85
85
|
converted = false
|
@@ -94,7 +94,7 @@ module Barometer
|
|
94
94
|
unless converted
|
95
95
|
unless converted_query = get_conversion(preferred_format)
|
96
96
|
converted_query = Query::Format.const_get(klass.to_s).to(self)
|
97
|
-
end
|
97
|
+
end
|
98
98
|
converted = true if converted_query
|
99
99
|
end
|
100
100
|
if converted
|
@@ -104,7 +104,7 @@ module Barometer
|
|
104
104
|
end
|
105
105
|
end
|
106
106
|
end
|
107
|
-
|
107
|
+
|
108
108
|
# force geocode?, unless we already did
|
109
109
|
#
|
110
110
|
if Barometer.force_geocode && !@geo
|
@@ -117,7 +117,7 @@ module Barometer
|
|
117
117
|
converted_query.geo = @geo.dup
|
118
118
|
end
|
119
119
|
end
|
120
|
-
|
120
|
+
|
121
121
|
# enhance timezone?, unless we already did
|
122
122
|
#
|
123
123
|
if Barometer.enhance_timezone && !@timezone
|
@@ -129,10 +129,10 @@ module Barometer
|
|
129
129
|
converted_query.timezone = @timezone.dup
|
130
130
|
end
|
131
131
|
end
|
132
|
-
|
132
|
+
|
133
133
|
converted_query
|
134
134
|
end
|
135
|
-
|
135
|
+
|
136
136
|
# save the important parts of the conversion ... by saving conversion we
|
137
137
|
# can avoid doing the same conversion multiple times
|
138
138
|
#
|
@@ -162,11 +162,11 @@ end
|
|
162
162
|
return nil unless self.format == Query::Format::Coordinates.format
|
163
163
|
Query::Format::Coordinates.parse_latitude(self.q)
|
164
164
|
end
|
165
|
-
|
165
|
+
|
166
166
|
def longitude
|
167
167
|
return nil unless self.format == Query::Format::Coordinates.format
|
168
168
|
Query::Format::Coordinates.parse_longitude(self.q)
|
169
169
|
end
|
170
|
-
|
170
|
+
|
171
171
|
end
|
172
|
-
end
|
172
|
+
end
|
data/lib/barometer/services.rb
CHANGED
@@ -4,10 +4,9 @@ $:.unshift(File.dirname(__FILE__))
|
|
4
4
|
#
|
5
5
|
require 'weather_services/service'
|
6
6
|
require 'weather_services/wunderground'
|
7
|
-
require 'weather_services/google'
|
8
7
|
require 'weather_services/yahoo'
|
9
|
-
require 'weather_services/weather_dot_com'
|
10
8
|
require 'weather_services/weather_bug'
|
9
|
+
require 'weather_services/noaa'
|
11
10
|
|
12
11
|
#
|
13
12
|
# web services (non weather)
|
@@ -16,4 +15,5 @@ require 'web_services/web_service'
|
|
16
15
|
require 'web_services/geocode'
|
17
16
|
require 'web_services/weather_id'
|
18
17
|
require 'web_services/timezone'
|
19
|
-
require 'web_services/placemaker'
|
18
|
+
require 'web_services/placemaker'
|
19
|
+
require 'web_services/noaa_station_id'
|
@@ -11,18 +11,18 @@ one_letter:
|
|
11
11
|
U : RU
|
12
12
|
Y : AU
|
13
13
|
Z : CN
|
14
|
-
|
14
|
+
|
15
15
|
two_letter:
|
16
16
|
# A - Western South Pacific
|
17
17
|
AG : SB
|
18
18
|
AN : NR
|
19
19
|
AY : PG
|
20
|
-
|
20
|
+
|
21
21
|
# B - Iceland/Greenland and Kosovo
|
22
22
|
BG : GL
|
23
23
|
BI : IS
|
24
24
|
#BK : Kosovo (also LY Serbia (RS) because of disputes)
|
25
|
-
|
25
|
+
|
26
26
|
# D - West Africa
|
27
27
|
DA : DZ
|
28
28
|
DB : BJ
|
@@ -33,7 +33,7 @@ two_letter:
|
|
33
33
|
DR : NE
|
34
34
|
DT : TN
|
35
35
|
# DX : Togolese Republic
|
36
|
-
|
36
|
+
|
37
37
|
# E - Northern Europe
|
38
38
|
EB : BE
|
39
39
|
ED : DE
|
@@ -50,7 +50,7 @@ two_letter:
|
|
50
50
|
ET : DE
|
51
51
|
EV : LV
|
52
52
|
EY : LT
|
53
|
-
|
53
|
+
|
54
54
|
# F - Southern Africa
|
55
55
|
FA : ZA
|
56
56
|
FB : BW
|
@@ -75,7 +75,7 @@ two_letter:
|
|
75
75
|
FX : LS
|
76
76
|
FY : NA
|
77
77
|
FZ : CD
|
78
|
-
|
78
|
+
|
79
79
|
# G - Northwestern Africa
|
80
80
|
GA : ML
|
81
81
|
GB : GM
|
@@ -90,7 +90,7 @@ two_letter:
|
|
90
90
|
GS : EH
|
91
91
|
GU : GN
|
92
92
|
GV : CV
|
93
|
-
|
93
|
+
|
94
94
|
# H - Northeastern Africa
|
95
95
|
HA : ET
|
96
96
|
HB : BI
|
@@ -105,7 +105,7 @@ two_letter:
|
|
105
105
|
HS : SD
|
106
106
|
HT : TZ
|
107
107
|
HU : UG
|
108
|
-
|
108
|
+
|
109
109
|
# L - Southern Europe,Israel and Turkey
|
110
110
|
LA : AL
|
111
111
|
LB : BG
|
@@ -133,7 +133,7 @@ two_letter:
|
|
133
133
|
LX : GI
|
134
134
|
#LY : Serbia (RS) and Montenegro (ME)
|
135
135
|
LZ : SK
|
136
|
-
|
136
|
+
|
137
137
|
# M - Central America and Mexico
|
138
138
|
MB : TC
|
139
139
|
MD : DO
|
@@ -150,7 +150,7 @@ two_letter:
|
|
150
150
|
MW : KY
|
151
151
|
MY : BS
|
152
152
|
MZ : BZ
|
153
|
-
|
153
|
+
|
154
154
|
# N - South Pacific
|
155
155
|
NC : CK
|
156
156
|
# NF : Fiji (FJ), Tonga (TO)
|
@@ -162,7 +162,7 @@ two_letter:
|
|
162
162
|
NV : VU
|
163
163
|
NW : NC
|
164
164
|
# NZ : New Zealand (NZ), Antarctica (AQ)
|
165
|
-
|
165
|
+
|
166
166
|
# O - Southwest Asia (excluding Israel and Turkey), Afghanistan and Pakistan
|
167
167
|
OA : AF
|
168
168
|
OB : BH
|
@@ -178,7 +178,7 @@ two_letter:
|
|
178
178
|
OS : SY
|
179
179
|
OT : QA
|
180
180
|
OY : YE
|
181
|
-
|
181
|
+
|
182
182
|
# P - Eastern North Pacific
|
183
183
|
PA : US
|
184
184
|
# PB : Baker Island
|
@@ -194,14 +194,14 @@ two_letter:
|
|
194
194
|
PP : US
|
195
195
|
# PT : Federated States of Micronesia (FM), Palau (PW)
|
196
196
|
# PW : Wake Island
|
197
|
-
|
197
|
+
|
198
198
|
# R - Western North Pacific
|
199
199
|
RC : TW
|
200
200
|
RJ : JP
|
201
201
|
RK : KR
|
202
202
|
RO : JP
|
203
203
|
RP : PH
|
204
|
-
|
204
|
+
|
205
205
|
# S - South America
|
206
206
|
SA : AR
|
207
207
|
SB : BR
|
@@ -221,7 +221,7 @@ two_letter:
|
|
221
221
|
SV : VE
|
222
222
|
SW : BR
|
223
223
|
SY : GY
|
224
|
-
|
224
|
+
|
225
225
|
# T - Caribbean
|
226
226
|
TA : AG
|
227
227
|
TB : BB
|
@@ -239,7 +239,7 @@ two_letter:
|
|
239
239
|
TU : VG
|
240
240
|
TV : VC
|
241
241
|
TX : BM
|
242
|
-
|
242
|
+
|
243
243
|
# U - Russia and former Soviet States
|
244
244
|
UA : KZ
|
245
245
|
UB : AZ
|
@@ -248,7 +248,7 @@ two_letter:
|
|
248
248
|
UK : UA
|
249
249
|
UM : BY
|
250
250
|
#UT Tajikistan (TJ), Turkmenistan (TM), Uzbekistan (UZ)
|
251
|
-
|
251
|
+
|
252
252
|
# V - South Asia (except Afghanistan and Pakistan) and mainland Southeast Asia
|
253
253
|
VA : IN
|
254
254
|
VC : LK
|
@@ -266,7 +266,7 @@ two_letter:
|
|
266
266
|
VT : TH
|
267
267
|
VV : VN
|
268
268
|
VY : MM
|
269
|
-
|
269
|
+
|
270
270
|
# W - Maritime Southeast Asia (except the Philippines)
|
271
271
|
WA : ID
|
272
272
|
# WB : Malaysia (MY), Brunei (BN)
|
@@ -276,7 +276,7 @@ two_letter:
|
|
276
276
|
WQ : ID
|
277
277
|
WR : ID
|
278
278
|
WS : SG
|
279
|
-
|
279
|
+
|
280
280
|
# Z - China, Mongolia and North Korea
|
281
281
|
ZK : KP
|
282
|
-
ZM : MN
|
282
|
+
ZM : MN
|
data/lib/barometer/weather.rb
CHANGED
@@ -6,19 +6,19 @@ module Barometer
|
|
6
6
|
# methods to interact with the data
|
7
7
|
#
|
8
8
|
class Weather
|
9
|
-
|
9
|
+
|
10
10
|
attr_accessor :measurements
|
11
11
|
attr_accessor :start_at, :end_at
|
12
|
-
|
12
|
+
|
13
13
|
def initialize; @measurements = []; end
|
14
|
-
|
14
|
+
|
15
15
|
# the default measurement is the first successful measurement
|
16
16
|
#
|
17
17
|
def default
|
18
18
|
return nil unless self.sources
|
19
19
|
self.source(self.sources.first)
|
20
20
|
end
|
21
|
-
|
21
|
+
|
22
22
|
# find the measurement for the given source, if it exists
|
23
23
|
#
|
24
24
|
def source(source)
|
@@ -28,32 +28,32 @@ module Barometer
|
|
28
28
|
end
|
29
29
|
nil
|
30
30
|
end
|
31
|
-
|
31
|
+
|
32
32
|
# list successful sources
|
33
33
|
#
|
34
34
|
def sources
|
35
35
|
@measurements.collect {|m| m.source.to_sym if m.success?}.compact
|
36
36
|
end
|
37
|
-
|
37
|
+
|
38
38
|
#
|
39
39
|
# Quick access methods
|
40
40
|
#
|
41
|
-
|
41
|
+
|
42
42
|
def metric?; self.default ? self.default.metric? : true; end
|
43
43
|
def current; (default = self.default) ? default.current : nil; end
|
44
44
|
def forecast; (default = self.default) ? default.forecast : nil; end
|
45
45
|
def now; self.current; end
|
46
|
-
|
46
|
+
|
47
47
|
def today
|
48
48
|
default = self.default
|
49
49
|
default && default.forecast ? default.forecast[0] : nil
|
50
50
|
end
|
51
|
-
|
51
|
+
|
52
52
|
def tomorrow
|
53
53
|
default = self.default
|
54
54
|
default && default.forecast ? default.forecast[1] : nil
|
55
55
|
end
|
56
|
-
|
56
|
+
|
57
57
|
# measurement search
|
58
58
|
# this will search the default measurements forecasts looking for
|
59
59
|
# the matching date
|
@@ -62,19 +62,19 @@ module Barometer
|
|
62
62
|
default = self.default
|
63
63
|
default && default.forecast ? default.for(query) : nil
|
64
64
|
end
|
65
|
-
|
66
|
-
|
65
|
+
|
66
|
+
|
67
67
|
#
|
68
68
|
# helper methods
|
69
69
|
#
|
70
70
|
# these are handy methods that can average values for successful weather
|
71
71
|
# sources, or answer a simple question (ie: weather.windy?)
|
72
72
|
#
|
73
|
-
|
73
|
+
|
74
74
|
#
|
75
75
|
# averages
|
76
76
|
#
|
77
|
-
|
77
|
+
|
78
78
|
# this assumes calculating for current, and that "to_f" for a value
|
79
79
|
# will return the value needed
|
80
80
|
# value_name = the name of the value we are averaging
|
@@ -97,7 +97,7 @@ module Barometer
|
|
97
97
|
return nil unless values && values.size > 0
|
98
98
|
values.inject(0.0) { |sum,v| sum += v if v } / values.size
|
99
99
|
end
|
100
|
-
|
100
|
+
|
101
101
|
def average(value_name, do_average=true, class_name=nil)
|
102
102
|
if class_name
|
103
103
|
if do_average
|
@@ -111,7 +111,7 @@ module Barometer
|
|
111
111
|
end
|
112
112
|
avg
|
113
113
|
end
|
114
|
-
|
114
|
+
|
115
115
|
# average of all values
|
116
116
|
#
|
117
117
|
def humidity(do_average=true); average("humidity",do_average); end
|
@@ -122,29 +122,29 @@ module Barometer
|
|
122
122
|
def heat_index(do_average=true); average("heat_index",do_average,"Temperature"); end
|
123
123
|
def wind_chill(do_average=true); average("wind_chill",do_average,"Temperature"); end
|
124
124
|
def visibility(do_average=true); average("visibility",do_average,"Distance"); end
|
125
|
-
|
125
|
+
|
126
126
|
#
|
127
127
|
# quick access methods
|
128
128
|
#
|
129
|
-
|
129
|
+
|
130
130
|
# what is the current local time and date?
|
131
131
|
# def time
|
132
132
|
# end
|
133
|
-
|
133
|
+
|
134
134
|
# def icon
|
135
135
|
# self.current.icon
|
136
136
|
# end
|
137
|
-
|
137
|
+
|
138
138
|
#
|
139
139
|
# simple questions
|
140
140
|
# pass the question on to each successful measurement until we get an answer
|
141
141
|
#
|
142
|
-
|
142
|
+
|
143
143
|
def windy?(time_string=nil, threshold=10)
|
144
144
|
local_datetime = Data::LocalDateTime.parse(time_string)
|
145
145
|
raise ArgumentError unless (threshold.is_a?(Fixnum) || threshold.is_a?(Float))
|
146
146
|
raise ArgumentError unless (local_datetime.nil? || local_datetime.is_a?(Data::LocalDateTime))
|
147
|
-
|
147
|
+
|
148
148
|
is_windy = nil
|
149
149
|
@measurements.each do |measurement|
|
150
150
|
if measurement.success?
|
@@ -159,7 +159,7 @@ module Barometer
|
|
159
159
|
local_datetime = Data::LocalDateTime.parse(time_string)
|
160
160
|
raise ArgumentError unless (threshold.is_a?(Fixnum) || threshold.is_a?(Float))
|
161
161
|
raise ArgumentError unless (local_datetime.nil? || local_datetime.is_a?(Data::LocalDateTime))
|
162
|
-
|
162
|
+
|
163
163
|
is_wet = nil
|
164
164
|
@measurements.each do |measurement|
|
165
165
|
if measurement.success?
|
@@ -173,7 +173,7 @@ module Barometer
|
|
173
173
|
def day?(time_string=nil)
|
174
174
|
local_datetime = Data::LocalDateTime.parse(time_string)
|
175
175
|
raise ArgumentError unless (local_datetime.nil? || local_datetime.is_a?(Data::LocalDateTime))
|
176
|
-
|
176
|
+
|
177
177
|
is_day = nil
|
178
178
|
@measurements.each do |measurement|
|
179
179
|
if measurement.success?
|
@@ -194,7 +194,7 @@ module Barometer
|
|
194
194
|
def sunny?(time_string=nil)
|
195
195
|
local_datetime = Data::LocalDateTime.parse(time_string)
|
196
196
|
raise ArgumentError unless (local_datetime.nil? || local_datetime.is_a?(Data::LocalDateTime))
|
197
|
-
|
197
|
+
|
198
198
|
is_sunny = nil
|
199
199
|
@measurements.each do |measurement|
|
200
200
|
if measurement.success?
|
@@ -207,5 +207,5 @@ module Barometer
|
|
207
207
|
end
|
208
208
|
|
209
209
|
end
|
210
|
-
|
211
|
-
end
|
210
|
+
|
211
|
+
end
|