barometer 0.3.2 → 0.5.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/README.rdoc +78 -70
- data/VERSION.yml +2 -2
- data/bin/barometer +100 -37
- data/lib/barometer.rb +12 -8
- data/lib/barometer/base.rb +48 -20
- data/lib/barometer/data.rb +5 -1
- data/lib/barometer/data/current.rb +23 -15
- data/lib/barometer/data/distance.rb +15 -5
- data/lib/barometer/data/forecast.rb +23 -5
- data/lib/barometer/data/geo.rb +16 -54
- data/lib/barometer/data/local_datetime.rb +137 -0
- data/lib/barometer/data/local_time.rb +134 -0
- data/lib/barometer/data/location.rb +6 -1
- data/lib/barometer/data/measurement.rb +71 -42
- data/lib/barometer/data/night.rb +69 -0
- data/lib/barometer/data/pressure.rb +15 -5
- data/lib/barometer/data/speed.rb +16 -5
- data/lib/barometer/data/sun.rb +8 -20
- data/lib/barometer/data/temperature.rb +22 -9
- data/lib/barometer/data/units.rb +10 -19
- data/lib/barometer/data/zone.rb +135 -9
- data/lib/barometer/formats.rb +12 -0
- data/lib/barometer/formats/coordinates.rb +42 -0
- data/lib/barometer/formats/format.rb +46 -0
- data/lib/barometer/formats/geocode.rb +51 -0
- data/lib/barometer/formats/icao.rb +37 -0
- data/lib/barometer/formats/postalcode.rb +22 -0
- data/lib/barometer/formats/short_zipcode.rb +17 -0
- data/lib/barometer/formats/weather_id.rb +107 -0
- data/lib/barometer/formats/zipcode.rb +31 -0
- data/lib/barometer/query.rb +61 -232
- data/lib/barometer/services.rb +14 -4
- data/lib/barometer/translations/icao_country_codes.yml +9 -0
- data/lib/barometer/translations/weather_country_codes.yml +17 -0
- data/lib/barometer/weather.rb +51 -30
- data/lib/barometer/{services → weather_services}/google.rb +23 -26
- data/lib/barometer/weather_services/noaa.rb +6 -0
- data/lib/barometer/{services → weather_services}/service.rb +101 -92
- data/lib/barometer/weather_services/weather_bug.rb +6 -0
- data/lib/barometer/weather_services/weather_dot_com.rb +261 -0
- data/lib/barometer/{services → weather_services}/wunderground.rb +58 -76
- data/lib/barometer/{services → weather_services}/yahoo.rb +91 -121
- data/lib/barometer/web_services/geocode.rb +33 -0
- data/lib/barometer/web_services/weather_id.rb +37 -0
- data/lib/barometer/web_services/web_service.rb +32 -0
- data/lib/demometer/demometer.rb +31 -4
- data/lib/demometer/views/forecast.erb +20 -0
- data/lib/demometer/views/index.erb +10 -3
- data/lib/demometer/views/measurement.erb +8 -3
- data/lib/demometer/views/readme.erb +63 -24
- data/spec/barometer_spec.rb +18 -36
- data/spec/{data_current_spec.rb → data/current_spec.rb} +73 -49
- data/spec/{data_distance_spec.rb → data/distance_spec.rb} +30 -30
- data/spec/{data_forecast_spec.rb → data/forecast_spec.rb} +57 -15
- data/spec/data/geo_spec.rb +91 -0
- data/spec/data/local_datetime_spec.rb +269 -0
- data/spec/data/local_time_spec.rb +239 -0
- data/spec/{data_location_spec.rb → data/location_spec.rb} +12 -1
- data/spec/{data_measurement_spec.rb → data/measurement_spec.rb} +135 -66
- data/spec/data/night_measurement_spec.rb +136 -0
- data/spec/{data_pressure_spec.rb → data/pressure_spec.rb} +29 -29
- data/spec/{data_speed_spec.rb → data/speed_spec.rb} +30 -30
- data/spec/data/sun_spec.rb +49 -0
- data/spec/{data_temperature_spec.rb → data/temperature_spec.rb} +44 -44
- data/spec/{units_spec.rb → data/units_spec.rb} +6 -6
- data/spec/{data_zone_spec.rb → data/zone_spec.rb} +15 -15
- data/spec/fixtures/formats/weather_id/90210.xml +1 -0
- data/spec/fixtures/formats/weather_id/atlanta.xml +1 -0
- data/spec/fixtures/formats/weather_id/from_USGA0028.xml +1 -0
- data/spec/fixtures/formats/weather_id/new_york.xml +1 -0
- data/spec/fixtures/{geocode_40_73.xml → geocode/40_73.xml} +0 -0
- data/spec/fixtures/{geocode_90210.xml → geocode/90210.xml} +0 -0
- data/spec/fixtures/{geocode_T5B4M9.xml → geocode/T5B4M9.xml} +0 -0
- data/spec/fixtures/geocode/atlanta.xml +1 -0
- data/spec/fixtures/{geocode_calgary_ab.xml → geocode/calgary_ab.xml} +0 -0
- data/spec/fixtures/{geocode_ksfo.xml → geocode/ksfo.xml} +0 -0
- data/spec/fixtures/{geocode_newyork_ny.xml → geocode/newyork_ny.xml} +0 -0
- data/spec/fixtures/{google_calgary_ab.xml → services/google/calgary_ab.xml} +0 -0
- data/spec/fixtures/services/weather_dot_com/90210.xml +1 -0
- data/spec/fixtures/{current_calgary_ab.xml → services/wunderground/current_calgary_ab.xml} +0 -0
- data/spec/fixtures/{forecast_calgary_ab.xml → services/wunderground/forecast_calgary_ab.xml} +0 -0
- data/spec/fixtures/{yahoo_90210.xml → services/yahoo/90210.xml} +0 -0
- data/spec/formats/coordinates_spec.rb +158 -0
- data/spec/formats/format_spec.rb +73 -0
- data/spec/formats/geocode_spec.rb +179 -0
- data/spec/formats/icao_spec.rb +61 -0
- data/spec/formats/postalcode_spec.rb +59 -0
- data/spec/formats/short_zipcode_spec.rb +53 -0
- data/spec/formats/weather_id_spec.rb +191 -0
- data/spec/formats/zipcode_spec.rb +111 -0
- data/spec/query_spec.rb +261 -288
- data/spec/spec_helper.rb +128 -4
- data/spec/{service_google_spec.rb → weather_services/google_spec.rb} +46 -46
- data/spec/weather_services/services_spec.rb +1118 -0
- data/spec/weather_services/weather_dot_com_spec.rb +327 -0
- data/spec/weather_services/wunderground_spec.rb +332 -0
- data/spec/{service_yahoo_spec.rb → weather_services/yahoo_spec.rb} +65 -81
- data/spec/weather_spec.rb +73 -61
- data/spec/web_services/geocode_spec.rb +45 -0
- data/spec/web_services/web_services_spec.rb +26 -0
- metadata +88 -36
- data/lib/barometer/services/noaa.rb +0 -6
- data/lib/barometer/services/weather_bug.rb +0 -6
- data/lib/barometer/services/weather_dot_com.rb +0 -6
- data/spec/data_geo_spec.rb +0 -94
- data/spec/data_sun_spec.rb +0 -76
- data/spec/service_wunderground_spec.rb +0 -330
- data/spec/services_spec.rb +0 -1106
@@ -0,0 +1,69 @@
|
|
1
|
+
require 'date'
|
2
|
+
module Barometer
|
3
|
+
#
|
4
|
+
# Night Measurement
|
5
|
+
# a data class for forecasted night weather conditions
|
6
|
+
#
|
7
|
+
# This is basically a data holding class for the forecasted night
|
8
|
+
# weather conditions.
|
9
|
+
#
|
10
|
+
class Data::NightMeasurement
|
11
|
+
|
12
|
+
attr_reader :date, :icon, :condition
|
13
|
+
attr_reader :pop, :wind, :humidity
|
14
|
+
|
15
|
+
# accessors (with input checking)
|
16
|
+
#
|
17
|
+
def date=(date)
|
18
|
+
raise ArgumentError unless date.is_a?(Date)
|
19
|
+
@date = date
|
20
|
+
end
|
21
|
+
|
22
|
+
def icon=(icon)
|
23
|
+
raise ArgumentError unless icon.is_a?(String)
|
24
|
+
@icon = icon
|
25
|
+
end
|
26
|
+
|
27
|
+
def condition=(condition)
|
28
|
+
raise ArgumentError unless condition.is_a?(String)
|
29
|
+
@condition = condition
|
30
|
+
end
|
31
|
+
|
32
|
+
def pop=(pop)
|
33
|
+
raise ArgumentError unless pop.is_a?(Fixnum)
|
34
|
+
@pop = pop
|
35
|
+
end
|
36
|
+
|
37
|
+
def wind=(wind)
|
38
|
+
raise ArgumentError unless wind.is_a?(Data::Speed)
|
39
|
+
@wind = wind
|
40
|
+
end
|
41
|
+
|
42
|
+
def humidity=(humidity)
|
43
|
+
raise ArgumentError unless humidity.is_a?(Fixnum)
|
44
|
+
@humidity = humidity
|
45
|
+
end
|
46
|
+
|
47
|
+
def sun=(sun)
|
48
|
+
raise ArgumentError unless sun.is_a?(Data::Sun)
|
49
|
+
@sun = sun
|
50
|
+
end
|
51
|
+
|
52
|
+
#
|
53
|
+
# helpers
|
54
|
+
#
|
55
|
+
|
56
|
+
# creates "?" helpers for all attributes (which maps to nil?)
|
57
|
+
#
|
58
|
+
def method_missing(method,*args)
|
59
|
+
# if the method ends in ?, then strip it off and see if we
|
60
|
+
# respond to the method without the ?
|
61
|
+
if (call_method = method.to_s.chomp!("?")) && respond_to?(call_method)
|
62
|
+
return send(call_method).nil? ? false : true
|
63
|
+
else
|
64
|
+
super(method,*args)
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
end
|
69
|
+
end
|
@@ -12,7 +12,7 @@ module Barometer
|
|
12
12
|
# that this class was designed for storing weather data,
|
13
13
|
# and it seems that it is more common in this case
|
14
14
|
#
|
15
|
-
class Pressure <
|
15
|
+
class Data::Pressure < Data::Units
|
16
16
|
|
17
17
|
METRIC_UNITS = "mb"
|
18
18
|
IMPERIAL_UNITS = "in"
|
@@ -48,6 +48,7 @@ module Barometer
|
|
48
48
|
#
|
49
49
|
|
50
50
|
# store millibars
|
51
|
+
#
|
51
52
|
def mb=(mb)
|
52
53
|
return if !mb || !(mb.is_a?(Integer) || mb.is_a?(Float))
|
53
54
|
@millibars = mb.to_f
|
@@ -55,6 +56,7 @@ module Barometer
|
|
55
56
|
end
|
56
57
|
|
57
58
|
# store inches
|
59
|
+
#
|
58
60
|
def in=(inches)
|
59
61
|
return if !inches || !(inches.is_a?(Integer) || inches.is_a?(Float))
|
60
62
|
@inches = inches.to_f
|
@@ -62,14 +64,16 @@ module Barometer
|
|
62
64
|
end
|
63
65
|
|
64
66
|
# return the stored millibars or convert from inches
|
67
|
+
#
|
65
68
|
def mb(as_integer=true)
|
66
|
-
mb = (@millibars || Pressure.in_to_mb(@inches))
|
69
|
+
mb = (@millibars || Data::Pressure.in_to_mb(@inches))
|
67
70
|
mb ? (as_integer ? mb.to_i : (100*mb).round/100.0) : nil
|
68
71
|
end
|
69
72
|
|
70
73
|
# return the stored inches or convert from millibars
|
74
|
+
#
|
71
75
|
def in(as_integer=true)
|
72
|
-
inches = (@inches || Pressure.mb_to_in(@millibars))
|
76
|
+
inches = (@inches || Data::Pressure.mb_to_in(@millibars))
|
73
77
|
inches ? (as_integer ? inches.to_i : (100*inches).round/100.0) : nil
|
74
78
|
end
|
75
79
|
|
@@ -86,30 +90,35 @@ module Barometer
|
|
86
90
|
#
|
87
91
|
|
88
92
|
# will just return the value (no units)
|
93
|
+
#
|
89
94
|
def to_i(metric=nil)
|
90
95
|
(metric || (metric.nil? && self.metric?)) ? self.mb : self.in
|
91
96
|
end
|
92
97
|
|
93
98
|
# will just return the value (no units) with more precision
|
99
|
+
#
|
94
100
|
def to_f(metric=nil)
|
95
101
|
(metric || (metric.nil? && self.metric?)) ? self.mb(false) : self.in(false)
|
96
102
|
end
|
97
103
|
|
98
104
|
# will return the value with units
|
105
|
+
#
|
99
106
|
def to_s(metric=nil)
|
100
107
|
(metric || (metric.nil? && self.metric?)) ? "#{self.mb} #{METRIC_UNITS}" : "#{self.in} #{IMPERIAL_UNITS}"
|
101
108
|
end
|
102
109
|
|
103
110
|
# will just return the units (no value)
|
111
|
+
#
|
104
112
|
def units(metric=nil)
|
105
113
|
(metric || (metric.nil? && self.metric?)) ? METRIC_UNITS : IMPERIAL_UNITS
|
106
114
|
end
|
107
115
|
|
108
116
|
# when we set inches, it is possible the a non-equivalent value of
|
109
117
|
# millibars remains. if so, clear it.
|
118
|
+
#
|
110
119
|
def update_millibars(inches)
|
111
120
|
return unless @millibars
|
112
|
-
difference = Pressure.in_to_mb(inches.to_f) - @millibars
|
121
|
+
difference = Data::Pressure.in_to_mb(inches.to_f) - @millibars
|
113
122
|
# only clear millibars if the stored millibars is off be more then 1 unit
|
114
123
|
# then the conversion of inches
|
115
124
|
@millibars = nil unless difference.abs <= 1.0
|
@@ -117,9 +126,10 @@ module Barometer
|
|
117
126
|
|
118
127
|
# when we set millibars, it is possible the a non-equivalent value of
|
119
128
|
# inches remains. if so, clear it.
|
129
|
+
#
|
120
130
|
def update_inches(mb)
|
121
131
|
return unless @inches
|
122
|
-
difference = Pressure.mb_to_in(mb.to_f) - @inches
|
132
|
+
difference = Data::Pressure.mb_to_in(mb.to_f) - @inches
|
123
133
|
# only clear inches if the stored inches is off be more then 1 unit
|
124
134
|
# then the conversion of millibars
|
125
135
|
@inches = nil unless difference.abs <= 1.0
|
data/lib/barometer/data/speed.rb
CHANGED
@@ -14,7 +14,8 @@ module Barometer
|
|
14
14
|
# NOTE: this currently only supports the scale of
|
15
15
|
# kilometers (km) and miles (m) per hour. There is currently
|
16
16
|
# no way to scale to smaller units (eg km -> m -> mm)
|
17
|
-
|
17
|
+
#
|
18
|
+
class Data::Speed < Data::Units
|
18
19
|
|
19
20
|
METRIC_UNITS = "kph"
|
20
21
|
IMPERIAL_UNITS = "mph"
|
@@ -52,6 +53,7 @@ module Barometer
|
|
52
53
|
#
|
53
54
|
|
54
55
|
# store kilometers per hour
|
56
|
+
#
|
55
57
|
def kph=(kph)
|
56
58
|
return if !kph || !(kph.is_a?(Integer) || kph.is_a?(Float))
|
57
59
|
@kilometers = kph.to_f
|
@@ -59,6 +61,7 @@ module Barometer
|
|
59
61
|
end
|
60
62
|
|
61
63
|
# store miles per hour
|
64
|
+
#
|
62
65
|
def mph=(mph)
|
63
66
|
return if !mph || !(mph.is_a?(Integer) || mph.is_a?(Float))
|
64
67
|
@miles = mph.to_f
|
@@ -76,14 +79,16 @@ module Barometer
|
|
76
79
|
end
|
77
80
|
|
78
81
|
# return the stored kilometers or convert from miles
|
82
|
+
#
|
79
83
|
def kph(as_integer=true)
|
80
|
-
km = (@kilometers || Speed.m_to_km(@miles))
|
84
|
+
km = (@kilometers || Data::Speed.m_to_km(@miles))
|
81
85
|
km ? (as_integer ? km.to_i : (100*km).round/100.0) : nil
|
82
86
|
end
|
83
87
|
|
84
88
|
# return the stored miles or convert from kilometers
|
89
|
+
#
|
85
90
|
def mph(as_integer=true)
|
86
|
-
m = (@miles || Speed.km_to_m(@kilometers))
|
91
|
+
m = (@miles || Data::Speed.km_to_m(@kilometers))
|
87
92
|
m ? (as_integer ? m.to_i : (100*m).round/100.0) : nil
|
88
93
|
end
|
89
94
|
|
@@ -100,30 +105,35 @@ module Barometer
|
|
100
105
|
#
|
101
106
|
|
102
107
|
# will just return the value (no units)
|
108
|
+
#
|
103
109
|
def to_i(metric=nil)
|
104
110
|
(metric || (metric.nil? && self.metric?)) ? self.kph : self.mph
|
105
111
|
end
|
106
112
|
|
107
113
|
# will just return the value (no units) with more precision
|
114
|
+
#
|
108
115
|
def to_f(metric=nil)
|
109
116
|
(metric || (metric.nil? && self.metric?)) ? self.kph(false) : self.mph(false)
|
110
117
|
end
|
111
118
|
|
112
119
|
# will return the value with units
|
120
|
+
#
|
113
121
|
def to_s(metric=nil)
|
114
122
|
(metric || (metric.nil? && self.metric?)) ? "#{self.kph} #{METRIC_UNITS}" : "#{self.mph} #{IMPERIAL_UNITS}"
|
115
123
|
end
|
116
124
|
|
117
125
|
# will just return the units (no value)
|
126
|
+
#
|
118
127
|
def units(metric=nil)
|
119
128
|
(metric || (metric.nil? && self.metric?)) ? METRIC_UNITS : IMPERIAL_UNITS
|
120
129
|
end
|
121
130
|
|
122
131
|
# when we set miles, it is possible the a non-equivalent value of
|
123
132
|
# kilometers remains. if so, clear it.
|
133
|
+
#
|
124
134
|
def update_kilometers(m)
|
125
135
|
return unless @kilometers
|
126
|
-
difference = Speed.m_to_km(m.to_f) - @kilometers
|
136
|
+
difference = Data::Speed.m_to_km(m.to_f) - @kilometers
|
127
137
|
# only clear kilometers if the stored kilometers is off be more then 1 unit
|
128
138
|
# then the conversion of miles
|
129
139
|
@kilometers = nil unless difference.abs <= 1.0
|
@@ -131,9 +141,10 @@ module Barometer
|
|
131
141
|
|
132
142
|
# when we set kilometers, it is possible the a non-equivalent value of
|
133
143
|
# miles remains. if so, clear it.
|
144
|
+
#
|
134
145
|
def update_miles(km)
|
135
146
|
return unless @miles
|
136
|
-
difference = Speed.km_to_m(km.to_f) - @miles
|
147
|
+
difference = Data::Speed.km_to_m(km.to_f) - @miles
|
137
148
|
# only clear miles if the stored miles is off be more then 1 unit
|
138
149
|
# then the conversion of kilometers
|
139
150
|
@miles = nil unless difference.abs <= 1.0
|
data/lib/barometer/data/sun.rb
CHANGED
@@ -4,31 +4,19 @@ module Barometer
|
|
4
4
|
#
|
5
5
|
# Used to store sunrise and sunset information
|
6
6
|
#
|
7
|
-
class Sun
|
7
|
+
class Data::Sun
|
8
|
+
|
9
|
+
attr_reader :rise, :set
|
8
10
|
|
9
11
|
def initialize(rise=nil, set=nil)
|
10
|
-
raise ArgumentError unless (rise.is_a?(
|
11
|
-
raise ArgumentError unless (set.is_a?(
|
12
|
-
@
|
13
|
-
@
|
12
|
+
raise ArgumentError unless (rise.is_a?(Data::LocalTime) || rise.nil?)
|
13
|
+
raise ArgumentError unless (set.is_a?(Data::LocalTime) || set.nil?)
|
14
|
+
@rise = rise
|
15
|
+
@set = set
|
14
16
|
end
|
15
17
|
|
16
|
-
def rise; @rise_utc; end
|
17
|
-
def set; @set_utc; end
|
18
|
-
|
19
|
-
# useful for incrementing the sunrise and sunset times by exactly
|
20
|
-
# N days ... used when using the same sun data for other days
|
21
|
-
def self.add_days!(sun, n=1)
|
22
|
-
raise ArgumentError unless sun.is_a?(Barometer::Sun)
|
23
|
-
raise ArgumentError unless n.is_a?(Fixnum)
|
24
|
-
seconds_to_add = 60*60*24*n
|
25
|
-
rise_utc = sun.rise + seconds_to_add
|
26
|
-
set_utc = sun.set + seconds_to_add
|
27
|
-
self.new(rise_utc, set_utc)
|
28
|
-
end
|
29
|
-
|
30
18
|
def nil?
|
31
|
-
(@
|
19
|
+
(@rise || @set) ? false : true
|
32
20
|
end
|
33
21
|
|
34
22
|
end
|
@@ -9,7 +9,7 @@ module Barometer
|
|
9
9
|
# All comparison operations will be done in the absolute
|
10
10
|
# scale of Kelvin (K)
|
11
11
|
#
|
12
|
-
class Temperature <
|
12
|
+
class Data::Temperature < Data::Units
|
13
13
|
|
14
14
|
METRIC_UNITS = "C"
|
15
15
|
IMPERIAL_UNITS = "F"
|
@@ -36,12 +36,14 @@ module Barometer
|
|
36
36
|
end
|
37
37
|
|
38
38
|
# Tf = (9/5)*Tc+32
|
39
|
+
#
|
39
40
|
def self.c_to_f(c)
|
40
41
|
return nil unless c && (c.is_a?(Integer) || c.is_a?(Float))
|
41
42
|
((9.0/5.0)*c.to_f)+32.0
|
42
43
|
end
|
43
44
|
|
44
45
|
# Tc = (5/9)*(Tf-32)
|
46
|
+
#
|
45
47
|
def self.f_to_c(f)
|
46
48
|
return nil unless f && (f.is_a?(Integer) || f.is_a?(Float))
|
47
49
|
(5.0/9.0)*(f.to_f-32.0)
|
@@ -69,38 +71,43 @@ module Barometer
|
|
69
71
|
#
|
70
72
|
|
71
73
|
# store celsius and kelvin
|
74
|
+
#
|
72
75
|
def c=(c)
|
73
76
|
return if !c || !(c.is_a?(Integer) || c.is_a?(Float))
|
74
77
|
@celsius = c.to_f
|
75
|
-
@kelvin = Temperature.c_to_k(c.to_f)
|
78
|
+
@kelvin = Data::Temperature.c_to_k(c.to_f)
|
76
79
|
self.update_fahrenheit(c.to_f)
|
77
80
|
end
|
78
81
|
|
79
82
|
# store fahrenheit and kelvin
|
83
|
+
#
|
80
84
|
def f=(f)
|
81
85
|
return if !f || !(f.is_a?(Integer) || f.is_a?(Float))
|
82
86
|
@fahrenheit = f.to_f
|
83
|
-
@kelvin = Temperature.f_to_k(f.to_f)
|
87
|
+
@kelvin = Data::Temperature.f_to_k(f.to_f)
|
84
88
|
self.update_celsius(f.to_f)
|
85
89
|
end
|
86
90
|
|
87
91
|
# store kelvin, convert to all
|
92
|
+
#
|
88
93
|
def k=(k)
|
89
94
|
return if !k || !(k.is_a?(Integer) || k.is_a?(Float))
|
90
95
|
@kelvin = k.to_f
|
91
|
-
@celsius = Temperature.k_to_c(k.to_f)
|
92
|
-
@fahrenheit = Temperature.k_to_f(k.to_f)
|
96
|
+
@celsius = Data::Temperature.k_to_c(k.to_f)
|
97
|
+
@fahrenheit = Data::Temperature.k_to_f(k.to_f)
|
93
98
|
end
|
94
99
|
|
95
100
|
# return the stored celsius or convert from Kelvin
|
101
|
+
#
|
96
102
|
def c(as_integer=true)
|
97
|
-
c = (@celsius || Temperature.k_to_c(@kelvin))
|
103
|
+
c = (@celsius || Data::Temperature.k_to_c(@kelvin))
|
98
104
|
c ? (as_integer ? c.to_i : (100*c).round/100.0) : nil
|
99
105
|
end
|
100
106
|
|
101
107
|
# return the stored fahrenheit or convert from Kelvin
|
108
|
+
#
|
102
109
|
def f(as_integer=true)
|
103
|
-
f = (@fahrenheit || Temperature.k_to_f(@kelvin))
|
110
|
+
f = (@fahrenheit || Data::Temperature.k_to_f(@kelvin))
|
104
111
|
f ? (as_integer ? f.to_i : (100*f).round/100.0) : nil
|
105
112
|
end
|
106
113
|
|
@@ -117,30 +124,35 @@ module Barometer
|
|
117
124
|
#
|
118
125
|
|
119
126
|
# will just return the value (no units)
|
127
|
+
#
|
120
128
|
def to_i(metric=nil)
|
121
129
|
(metric || (metric.nil? && self.metric?)) ? self.c : self.f
|
122
130
|
end
|
123
131
|
|
124
132
|
# will just return the value (no units) with more precision
|
133
|
+
#
|
125
134
|
def to_f(metric=nil)
|
126
135
|
(metric || (metric.nil? && self.metric?)) ? self.c(false) : self.f(false)
|
127
136
|
end
|
128
137
|
|
129
138
|
# will return the value with units
|
139
|
+
#
|
130
140
|
def to_s(metric=nil)
|
131
141
|
(metric || (metric.nil? && self.metric?)) ? "#{self.c} #{METRIC_UNITS}" : "#{self.f} #{IMPERIAL_UNITS}"
|
132
142
|
end
|
133
143
|
|
134
144
|
# will just return the units (no value)
|
145
|
+
#
|
135
146
|
def units(metric=nil)
|
136
147
|
(metric || (metric.nil? && self.metric?)) ? METRIC_UNITS : IMPERIAL_UNITS
|
137
148
|
end
|
138
149
|
|
139
150
|
# when we set fahrenheit, it is possible the a non-equivalent value of
|
140
151
|
# celsius remains. if so, clear it.
|
152
|
+
#
|
141
153
|
def update_celsius(f)
|
142
154
|
return unless @celsius
|
143
|
-
difference = Temperature.f_to_c(f.to_f) - @celsius
|
155
|
+
difference = Data::Temperature.f_to_c(f.to_f) - @celsius
|
144
156
|
# only clear celsius if the stored celsius is off be more then 1 degree
|
145
157
|
# then the conversion of fahrenheit
|
146
158
|
@celsius = nil unless difference.abs <= 1.0
|
@@ -148,9 +160,10 @@ module Barometer
|
|
148
160
|
|
149
161
|
# when we set celsius, it is possible the a non-equivalent value of
|
150
162
|
# fahrenheit remains. if so, clear it.
|
163
|
+
#
|
151
164
|
def update_fahrenheit(c)
|
152
165
|
return unless @fahrenheit
|
153
|
-
difference = Temperature.c_to_f(c.to_f) - @fahrenheit
|
166
|
+
difference = Data::Temperature.c_to_f(c.to_f) - @fahrenheit
|
154
167
|
# only clear fahrenheit if the stored fahrenheit is off be more then 1 degree
|
155
168
|
# then the conversion of celsius
|
156
169
|
@fahrenheit = nil unless difference.abs <= 1.0
|
data/lib/barometer/data/units.rb
CHANGED
@@ -1,12 +1,10 @@
|
|
1
1
|
module Barometer
|
2
|
-
class Units
|
2
|
+
class Data::Units
|
3
3
|
include Comparable
|
4
4
|
|
5
5
|
attr_accessor :metric
|
6
6
|
|
7
|
-
def initialize(metric=true)
|
8
|
-
@metric = metric
|
9
|
-
end
|
7
|
+
def initialize(metric=true); @metric = metric; end
|
10
8
|
|
11
9
|
#
|
12
10
|
# HELPERS
|
@@ -16,12 +14,13 @@ module Barometer
|
|
16
14
|
def metric!; @metric=true; end
|
17
15
|
def imperial!; @metric=false; end
|
18
16
|
|
19
|
-
# assigns a value to the right attribute based on metric setting
|
17
|
+
# assigns a value to the right attribute based on metric setting
|
18
|
+
#
|
20
19
|
def <<(value)
|
21
20
|
return unless value
|
22
21
|
|
23
22
|
# these values can be treated like 'nil'
|
24
|
-
nil_values = ["NA"]
|
23
|
+
nil_values = ["NA", "N/A", ""]
|
25
24
|
|
26
25
|
begin
|
27
26
|
if value.is_a?(Array)
|
@@ -37,22 +36,14 @@ module Barometer
|
|
37
36
|
# do nothing
|
38
37
|
end
|
39
38
|
|
40
|
-
|
41
|
-
self.metric_default = value_m || value_b
|
42
|
-
else
|
39
|
+
self.metric? ? self.metric_default = value_m || value_b :
|
43
40
|
self.imperial_default = value_i || value_b
|
44
|
-
end
|
45
41
|
end
|
46
42
|
|
47
|
-
#
|
48
|
-
|
49
|
-
|
50
|
-
end
|
51
|
-
|
52
|
-
# STUB: define this method to actually retireve the imperial_default
|
53
|
-
def imperial_default=(value)
|
54
|
-
raise NotImplementedError
|
55
|
-
end
|
43
|
+
# stubs
|
44
|
+
#
|
45
|
+
def metric_default=(value); raise NotImplementedError; end
|
46
|
+
def imperial_default=(value); raise NotImplementedError; end
|
56
47
|
|
57
48
|
end
|
58
49
|
end
|