lib/barometer/measurements/measurement.rb in barometer-0.7.3 vs lib/barometer/measurements/measurement.rb in barometer-0.8.0

- old
+ new

@@ -11,39 +11,39 @@ # - forecasted weather data (an Array of instances of the ForecastMeasurement class) # - time_zone information (for the location in question) # - weather station information (for the station that gave collected the data) # class Measurement - + attr_reader :source, :weight attr_reader :measured_at, :utc_time_stamp attr_reader :current, :forecast attr_reader :timezone, :station, :location, :links attr_reader :success attr_accessor :metric, :query, :format attr_accessor :start_at, :end_at - + def initialize(source=nil, metric=true) @source = source @metric = metric @success = false @weight = 1 @links = {} end - + def success! current && current.temperature && !current.temperature.c.nil? && @success = true end - + def stamp!; @utc_time_stamp = Time.now.utc; end def success?; @success; end def metric?; @metric; end def metric!; @metric=true; end def imperial!; @metric=false; end def now; timezone ? timezone.now : nil; end - + # # this will tell us if the measurement is still current ... if it is still # current this means that the CurrentMeasurement can still used as now # # what it also means is that if you took a measurement right now (time = now) @@ -56,147 +56,147 @@ # is not current # def current?(local_time=nil) current_at = ((self.current && self.current.current_at) ? self.current.current_at : self.measured_at) - + local_time = (local_time.nil? ? current_at : Data::LocalTime.parse(local_time)) return true unless local_time raise ArgumentError unless local_time.is_a?(Data::LocalTime) - + hours_still_current = 4 difference = (local_time.diff(current_at)).to_i.abs difference <= (60*60*hours_still_current).to_i end - + # # Returns a forecast for a day given by a Date, DateTime, # Time, or a string that can be parsed to a date # def for(date=nil) date = @timezone.today unless date || !@timezone date ||= Date.today return nil unless (@forecast && @forecast.size > 0) - + @forecast.for(date) end - + # # accesors (with input checking) # - + def source=(source) raise ArgumentError unless source.is_a?(Symbol) @source = source end - + def utc_time_stamp=(time=Time.now.utc) raise ArgumentError unless time.is_a?(Time) @utc_time_stamp = time end - + def current=(current) raise ArgumentError unless current.is_a?(Measurement::Result) @current = current self.stamp! self.success! end - + def forecast=(forecast) raise ArgumentError unless forecast.is_a?(Measurement::ResultArray) @forecast = forecast end - + def timezone=(timezone) return unless timezone raise ArgumentError unless timezone.is_a?(Data::Zone) @timezone = timezone end - + def station=(station) raise ArgumentError unless station.is_a?(Data::Location) @station = station end - + def location=(location) raise ArgumentError unless location.is_a?(Data::Location) @location = location end - + def weight=(weight) raise ArgumentError unless weight.is_a?(Fixnum) @weight = weight end - + def links=(links) raise ArgumentError unless links.is_a?(Hash) @links = links end - + def measured_at=(measured_at) raise ArgumentError unless measured_at.is_a?(Data::LocalTime) @measured_at = measured_at end - + # # simple questions # - + def windy?(time_string=nil, threshold=10) time_string ||= (measured_at || now) local_time = Data::LocalTime.parse(time_string) - + if current?(local_time) return nil unless current current.windy?(threshold) else return nil unless forecast && (future = forecast[local_time]) future.windy?(threshold) end end - + def day?(time_string=nil) time_string ||= (measured_at || now) local_time = Data::LocalTime.parse(time_string) - + if current?(local_time) return nil unless current current.day?(local_time) else return nil unless forecast && (future = forecast[local_time]) future.day?(local_time) end end - + def sunny?(time_string=nil) time_string ||= (measured_at || now) local_time = Data::LocalTime.parse(time_string) sunny_icons = Barometer::WeatherService.source(@source)._sunny_icon_codes - + is_day = day?(local_time) return is_day unless is_day - + if current?(local_time) return nil unless current current.sunny?(local_time, sunny_icons) else return nil unless forecast && (future = forecast[local_time]) future.sunny?(local_time, sunny_icons) end end - + def wet?(time_string=nil, pop_threshold=50, humidity_threshold=99) time_string ||= (measured_at || now) local_time = Data::LocalTime.parse(time_string) wet_icons = Barometer::WeatherService.source(@source)._wet_icon_codes - + if current?(local_time) return nil unless current current.wet?(wet_icons, humidity_threshold) else return nil unless forecast && (future = forecast[local_time]) future.wet?(wet_icons, pop_threshold, humidity_threshold) end end - + end -end \ No newline at end of file +end