barometer 0.1.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/LICENSE +20 -0
 - data/README.rdoc +266 -0
 - data/VERSION.yml +4 -0
 - data/bin/barometer +63 -0
 - data/lib/barometer.rb +52 -0
 - data/lib/barometer/base.rb +52 -0
 - data/lib/barometer/data.rb +15 -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/extensions/graticule.rb +50 -0
 - data/lib/barometer/extensions/httparty.rb +21 -0
 - data/lib/barometer/query.rb +228 -0
 - data/lib/barometer/services.rb +6 -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/weather.rb +187 -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,133 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            module Barometer
         
     | 
| 
      
 2 
     | 
    
         
            +
              #
         
     | 
| 
      
 3 
     | 
    
         
            +
              # A simple Pressure class
         
     | 
| 
      
 4 
     | 
    
         
            +
              # 
         
     | 
| 
      
 5 
     | 
    
         
            +
              # Think of this like the Integer class. Enhancement
         
     | 
| 
      
 6 
     | 
    
         
            +
              # is that you can create a number (in a certain unit), then
         
     | 
| 
      
 7 
     | 
    
         
            +
              # get that number back already converted to another unit.
         
     | 
| 
      
 8 
     | 
    
         
            +
              #
         
     | 
| 
      
 9 
     | 
    
         
            +
              # All comparison operations will be done in metric
         
     | 
| 
      
 10 
     | 
    
         
            +
              #
         
     | 
| 
      
 11 
     | 
    
         
            +
              # NOTE: the metric units for pressure aren't commonly used, except
         
     | 
| 
      
 12 
     | 
    
         
            +
              #       that this class was designed for storing weather data,
         
     | 
| 
      
 13 
     | 
    
         
            +
              #       and it seems that it is more common in this case
         
     | 
| 
      
 14 
     | 
    
         
            +
              #
         
     | 
| 
      
 15 
     | 
    
         
            +
              class Pressure < Barometer::Units
         
     | 
| 
      
 16 
     | 
    
         
            +
                
         
     | 
| 
      
 17 
     | 
    
         
            +
                METRIC_UNITS = "mb"
         
     | 
| 
      
 18 
     | 
    
         
            +
                IMPERIAL_UNITS = "in"
         
     | 
| 
      
 19 
     | 
    
         
            +
                
         
     | 
| 
      
 20 
     | 
    
         
            +
                attr_accessor :millibars, :inches
         
     | 
| 
      
 21 
     | 
    
         
            +
                
         
     | 
| 
      
 22 
     | 
    
         
            +
                def initialize(metric=true)
         
     | 
| 
      
 23 
     | 
    
         
            +
                  @millibars = nil
         
     | 
| 
      
 24 
     | 
    
         
            +
                  @inches = nil
         
     | 
| 
      
 25 
     | 
    
         
            +
                  super(metric)
         
     | 
| 
      
 26 
     | 
    
         
            +
                end
         
     | 
| 
      
 27 
     | 
    
         
            +
                
         
     | 
| 
      
 28 
     | 
    
         
            +
                def metric_default=(value); self.mb = value; end
         
     | 
| 
      
 29 
     | 
    
         
            +
                def imperial_default=(value); self.in = value; end
         
     | 
| 
      
 30 
     | 
    
         
            +
             
     | 
| 
      
 31 
     | 
    
         
            +
                #
         
     | 
| 
      
 32 
     | 
    
         
            +
                # CONVERTERS
         
     | 
| 
      
 33 
     | 
    
         
            +
                #
         
     | 
| 
      
 34 
     | 
    
         
            +
                
         
     | 
| 
      
 35 
     | 
    
         
            +
                def self.mb_to_in(mb)
         
     | 
| 
      
 36 
     | 
    
         
            +
                  return nil unless mb && (mb.is_a?(Integer) || mb.is_a?(Float))
         
     | 
| 
      
 37 
     | 
    
         
            +
                  mb.to_f * 0.02953
         
     | 
| 
      
 38 
     | 
    
         
            +
                end
         
     | 
| 
      
 39 
     | 
    
         
            +
                
         
     | 
| 
      
 40 
     | 
    
         
            +
                def self.in_to_mb(inches)
         
     | 
| 
      
 41 
     | 
    
         
            +
                  return nil unless inches &&
         
     | 
| 
      
 42 
     | 
    
         
            +
                    (inches.is_a?(Integer) || inches.is_a?(Float))
         
     | 
| 
      
 43 
     | 
    
         
            +
                  inches.to_f * 33.8639
         
     | 
| 
      
 44 
     | 
    
         
            +
                end
         
     | 
| 
      
 45 
     | 
    
         
            +
                
         
     | 
| 
      
 46 
     | 
    
         
            +
                #
         
     | 
| 
      
 47 
     | 
    
         
            +
                # ACCESSORS
         
     | 
| 
      
 48 
     | 
    
         
            +
                #
         
     | 
| 
      
 49 
     | 
    
         
            +
                
         
     | 
| 
      
 50 
     | 
    
         
            +
                # store millibars
         
     | 
| 
      
 51 
     | 
    
         
            +
                def mb=(mb)
         
     | 
| 
      
 52 
     | 
    
         
            +
                  return if !mb || !(mb.is_a?(Integer) || mb.is_a?(Float))
         
     | 
| 
      
 53 
     | 
    
         
            +
                  @millibars = mb.to_f
         
     | 
| 
      
 54 
     | 
    
         
            +
                  self.update_inches(mb.to_f)
         
     | 
| 
      
 55 
     | 
    
         
            +
                end
         
     | 
| 
      
 56 
     | 
    
         
            +
                
         
     | 
| 
      
 57 
     | 
    
         
            +
                # store inches
         
     | 
| 
      
 58 
     | 
    
         
            +
                def in=(inches)
         
     | 
| 
      
 59 
     | 
    
         
            +
                  return if !inches || !(inches.is_a?(Integer) || inches.is_a?(Float))
         
     | 
| 
      
 60 
     | 
    
         
            +
                  @inches = inches.to_f
         
     | 
| 
      
 61 
     | 
    
         
            +
                  self.update_millibars(inches.to_f)
         
     | 
| 
      
 62 
     | 
    
         
            +
                end
         
     | 
| 
      
 63 
     | 
    
         
            +
                
         
     | 
| 
      
 64 
     | 
    
         
            +
                # return the stored millibars or convert from inches
         
     | 
| 
      
 65 
     | 
    
         
            +
                def mb(as_integer=true)
         
     | 
| 
      
 66 
     | 
    
         
            +
                  mb = (@millibars || Pressure.in_to_mb(@inches))
         
     | 
| 
      
 67 
     | 
    
         
            +
                  mb ? (as_integer ? mb.to_i : (100*mb).round/100.0) : nil
         
     | 
| 
      
 68 
     | 
    
         
            +
                end
         
     | 
| 
      
 69 
     | 
    
         
            +
                
         
     | 
| 
      
 70 
     | 
    
         
            +
                # return the stored inches or convert from millibars
         
     | 
| 
      
 71 
     | 
    
         
            +
                def in(as_integer=true)
         
     | 
| 
      
 72 
     | 
    
         
            +
                  inches = (@inches || Pressure.mb_to_in(@millibars))
         
     | 
| 
      
 73 
     | 
    
         
            +
                  inches ? (as_integer ? inches.to_i : (100*inches).round/100.0) : nil
         
     | 
| 
      
 74 
     | 
    
         
            +
                end
         
     | 
| 
      
 75 
     | 
    
         
            +
                
         
     | 
| 
      
 76 
     | 
    
         
            +
                #
         
     | 
| 
      
 77 
     | 
    
         
            +
                # OPERATORS
         
     | 
| 
      
 78 
     | 
    
         
            +
                #
         
     | 
| 
      
 79 
     | 
    
         
            +
                
         
     | 
| 
      
 80 
     | 
    
         
            +
                def <=>(other)
         
     | 
| 
      
 81 
     | 
    
         
            +
                  self.mb <=> other.mb
         
     | 
| 
      
 82 
     | 
    
         
            +
                end
         
     | 
| 
      
 83 
     | 
    
         
            +
                
         
     | 
| 
      
 84 
     | 
    
         
            +
                #
         
     | 
| 
      
 85 
     | 
    
         
            +
                # HELPERS
         
     | 
| 
      
 86 
     | 
    
         
            +
                #
         
     | 
| 
      
 87 
     | 
    
         
            +
                
         
     | 
| 
      
 88 
     | 
    
         
            +
                # will just return the value (no units)
         
     | 
| 
      
 89 
     | 
    
         
            +
                def to_i(metric=nil)
         
     | 
| 
      
 90 
     | 
    
         
            +
                  (metric || (metric.nil? && self.metric?)) ? self.mb : self.in
         
     | 
| 
      
 91 
     | 
    
         
            +
                end
         
     | 
| 
      
 92 
     | 
    
         
            +
                
         
     | 
| 
      
 93 
     | 
    
         
            +
                # will just return the value (no units) with more precision
         
     | 
| 
      
 94 
     | 
    
         
            +
                def to_f(metric=nil)
         
     | 
| 
      
 95 
     | 
    
         
            +
                  (metric || (metric.nil? && self.metric?)) ? self.mb(false) : self.in(false)
         
     | 
| 
      
 96 
     | 
    
         
            +
                end
         
     | 
| 
      
 97 
     | 
    
         
            +
                
         
     | 
| 
      
 98 
     | 
    
         
            +
                # will return the value with units
         
     | 
| 
      
 99 
     | 
    
         
            +
                def to_s(metric=nil)
         
     | 
| 
      
 100 
     | 
    
         
            +
                  (metric || (metric.nil? && self.metric?)) ? "#{self.mb} #{METRIC_UNITS}" : "#{self.in} #{IMPERIAL_UNITS}"
         
     | 
| 
      
 101 
     | 
    
         
            +
                end
         
     | 
| 
      
 102 
     | 
    
         
            +
                
         
     | 
| 
      
 103 
     | 
    
         
            +
                # will just return the units (no value)
         
     | 
| 
      
 104 
     | 
    
         
            +
                def units(metric=nil)
         
     | 
| 
      
 105 
     | 
    
         
            +
                  (metric || (metric.nil? && self.metric?)) ? METRIC_UNITS : IMPERIAL_UNITS
         
     | 
| 
      
 106 
     | 
    
         
            +
                end
         
     | 
| 
      
 107 
     | 
    
         
            +
                
         
     | 
| 
      
 108 
     | 
    
         
            +
                # when we set inches, it is possible the a non-equivalent value of
         
     | 
| 
      
 109 
     | 
    
         
            +
                # millibars remains.  if so, clear it.
         
     | 
| 
      
 110 
     | 
    
         
            +
                def update_millibars(inches)
         
     | 
| 
      
 111 
     | 
    
         
            +
                  return unless @millibars
         
     | 
| 
      
 112 
     | 
    
         
            +
                  difference = Pressure.in_to_mb(inches.to_f) - @millibars
         
     | 
| 
      
 113 
     | 
    
         
            +
                  # only clear millibars if the stored millibars is off be more then 1 unit
         
     | 
| 
      
 114 
     | 
    
         
            +
                  # then the conversion of inches
         
     | 
| 
      
 115 
     | 
    
         
            +
                  @millibars = nil unless difference.abs <= 1.0
         
     | 
| 
      
 116 
     | 
    
         
            +
                end
         
     | 
| 
      
 117 
     | 
    
         
            +
                
         
     | 
| 
      
 118 
     | 
    
         
            +
                # when we set millibars, it is possible the a non-equivalent value of
         
     | 
| 
      
 119 
     | 
    
         
            +
                # inches remains.  if so, clear it.
         
     | 
| 
      
 120 
     | 
    
         
            +
                def update_inches(mb)
         
     | 
| 
      
 121 
     | 
    
         
            +
                  return unless @inches
         
     | 
| 
      
 122 
     | 
    
         
            +
                  difference = Pressure.mb_to_in(mb.to_f) - @inches
         
     | 
| 
      
 123 
     | 
    
         
            +
                  # only clear inches if the stored inches is off be more then 1 unit
         
     | 
| 
      
 124 
     | 
    
         
            +
                  # then the conversion of millibars
         
     | 
| 
      
 125 
     | 
    
         
            +
                  @inches = nil unless difference.abs <= 1.0
         
     | 
| 
      
 126 
     | 
    
         
            +
                end
         
     | 
| 
      
 127 
     | 
    
         
            +
                
         
     | 
| 
      
 128 
     | 
    
         
            +
                def nil?
         
     | 
| 
      
 129 
     | 
    
         
            +
                  (@millibars || @inches) ? false : true
         
     | 
| 
      
 130 
     | 
    
         
            +
                end
         
     | 
| 
      
 131 
     | 
    
         
            +
                
         
     | 
| 
      
 132 
     | 
    
         
            +
              end
         
     | 
| 
      
 133 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,147 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            module Barometer
         
     | 
| 
      
 2 
     | 
    
         
            +
              #
         
     | 
| 
      
 3 
     | 
    
         
            +
              # A simple Speed class
         
     | 
| 
      
 4 
     | 
    
         
            +
              # 
         
     | 
| 
      
 5 
     | 
    
         
            +
              # Think of this like the Integer class. Enhancement
         
     | 
| 
      
 6 
     | 
    
         
            +
              # is that you can create a number (in a certain unit), then
         
     | 
| 
      
 7 
     | 
    
         
            +
              # get that number back already converted to another unit.
         
     | 
| 
      
 8 
     | 
    
         
            +
              #
         
     | 
| 
      
 9 
     | 
    
         
            +
              # Speed is a vector, thus it has a perticular direction, although
         
     | 
| 
      
 10 
     | 
    
         
            +
              # the direction is independent of the units
         
     | 
| 
      
 11 
     | 
    
         
            +
              #
         
     | 
| 
      
 12 
     | 
    
         
            +
              # All comparison operations will be done in metric
         
     | 
| 
      
 13 
     | 
    
         
            +
              # 
         
     | 
| 
      
 14 
     | 
    
         
            +
              # NOTE: this currently only supports the scale of
         
     | 
| 
      
 15 
     | 
    
         
            +
              #       kilometers (km) and miles (m) per hour.  There is currently
         
     | 
| 
      
 16 
     | 
    
         
            +
              #       no way to scale to smaller units (eg km -> m -> mm)
         
     | 
| 
      
 17 
     | 
    
         
            +
              class Speed < Barometer::Units
         
     | 
| 
      
 18 
     | 
    
         
            +
                
         
     | 
| 
      
 19 
     | 
    
         
            +
                METRIC_UNITS = "kph"
         
     | 
| 
      
 20 
     | 
    
         
            +
                IMPERIAL_UNITS = "mph"
         
     | 
| 
      
 21 
     | 
    
         
            +
                
         
     | 
| 
      
 22 
     | 
    
         
            +
                attr_accessor :kilometers, :miles
         
     | 
| 
      
 23 
     | 
    
         
            +
                attr_accessor :degrees, :direction
         
     | 
| 
      
 24 
     | 
    
         
            +
                
         
     | 
| 
      
 25 
     | 
    
         
            +
                def initialize(metric=true)
         
     | 
| 
      
 26 
     | 
    
         
            +
                  @kilometers = nil
         
     | 
| 
      
 27 
     | 
    
         
            +
                  @miles = nil
         
     | 
| 
      
 28 
     | 
    
         
            +
                  @degrees = nil
         
     | 
| 
      
 29 
     | 
    
         
            +
                  @direction = nil
         
     | 
| 
      
 30 
     | 
    
         
            +
                  super(metric)
         
     | 
| 
      
 31 
     | 
    
         
            +
                end
         
     | 
| 
      
 32 
     | 
    
         
            +
                
         
     | 
| 
      
 33 
     | 
    
         
            +
                def metric_default=(value); self.kph = value; end
         
     | 
| 
      
 34 
     | 
    
         
            +
                def imperial_default=(value); self.mph = value; end
         
     | 
| 
      
 35 
     | 
    
         
            +
                
         
     | 
| 
      
 36 
     | 
    
         
            +
                #
         
     | 
| 
      
 37 
     | 
    
         
            +
                # CONVERTERS
         
     | 
| 
      
 38 
     | 
    
         
            +
                #
         
     | 
| 
      
 39 
     | 
    
         
            +
                
         
     | 
| 
      
 40 
     | 
    
         
            +
                def self.km_to_m(km)
         
     | 
| 
      
 41 
     | 
    
         
            +
                  return nil unless km && (km.is_a?(Integer) || km.is_a?(Float))
         
     | 
| 
      
 42 
     | 
    
         
            +
                  km.to_f * 0.622
         
     | 
| 
      
 43 
     | 
    
         
            +
                end
         
     | 
| 
      
 44 
     | 
    
         
            +
                
         
     | 
| 
      
 45 
     | 
    
         
            +
                def self.m_to_km(m)
         
     | 
| 
      
 46 
     | 
    
         
            +
                  return nil unless m && (m.is_a?(Integer) || m.is_a?(Float))
         
     | 
| 
      
 47 
     | 
    
         
            +
                  m.to_f * 1.609
         
     | 
| 
      
 48 
     | 
    
         
            +
                end
         
     | 
| 
      
 49 
     | 
    
         
            +
                
         
     | 
| 
      
 50 
     | 
    
         
            +
                #
         
     | 
| 
      
 51 
     | 
    
         
            +
                # ACCESSORS
         
     | 
| 
      
 52 
     | 
    
         
            +
                #
         
     | 
| 
      
 53 
     | 
    
         
            +
                
         
     | 
| 
      
 54 
     | 
    
         
            +
                # store kilometers per hour
         
     | 
| 
      
 55 
     | 
    
         
            +
                def kph=(kph)
         
     | 
| 
      
 56 
     | 
    
         
            +
                  return if !kph || !(kph.is_a?(Integer) || kph.is_a?(Float))
         
     | 
| 
      
 57 
     | 
    
         
            +
                  @kilometers = kph.to_f
         
     | 
| 
      
 58 
     | 
    
         
            +
                  self.update_miles(kph.to_f)
         
     | 
| 
      
 59 
     | 
    
         
            +
                end
         
     | 
| 
      
 60 
     | 
    
         
            +
                
         
     | 
| 
      
 61 
     | 
    
         
            +
                # store miles per hour
         
     | 
| 
      
 62 
     | 
    
         
            +
                def mph=(mph)
         
     | 
| 
      
 63 
     | 
    
         
            +
                  return if !mph || !(mph.is_a?(Integer) || mph.is_a?(Float))
         
     | 
| 
      
 64 
     | 
    
         
            +
                  @miles = mph.to_f
         
     | 
| 
      
 65 
     | 
    
         
            +
                  self.update_kilometers(mph.to_f)
         
     | 
| 
      
 66 
     | 
    
         
            +
                end
         
     | 
| 
      
 67 
     | 
    
         
            +
                
         
     | 
| 
      
 68 
     | 
    
         
            +
                def direction=(direction)
         
     | 
| 
      
 69 
     | 
    
         
            +
                  return if !direction || !direction.is_a?(String)
         
     | 
| 
      
 70 
     | 
    
         
            +
                  @direction = direction
         
     | 
| 
      
 71 
     | 
    
         
            +
                end
         
     | 
| 
      
 72 
     | 
    
         
            +
                
         
     | 
| 
      
 73 
     | 
    
         
            +
                def degrees=(degrees)
         
     | 
| 
      
 74 
     | 
    
         
            +
                  return if !degrees || !(degrees.is_a?(Integer) || degrees.is_a?(Float))
         
     | 
| 
      
 75 
     | 
    
         
            +
                  @degrees = degrees
         
     | 
| 
      
 76 
     | 
    
         
            +
                end
         
     | 
| 
      
 77 
     | 
    
         
            +
                
         
     | 
| 
      
 78 
     | 
    
         
            +
                # return the stored kilometers or convert from miles
         
     | 
| 
      
 79 
     | 
    
         
            +
                def kph(as_integer=true)
         
     | 
| 
      
 80 
     | 
    
         
            +
                  km = (@kilometers || Speed.m_to_km(@miles))
         
     | 
| 
      
 81 
     | 
    
         
            +
                  km ? (as_integer ? km.to_i : (100*km).round/100.0) : nil
         
     | 
| 
      
 82 
     | 
    
         
            +
                end
         
     | 
| 
      
 83 
     | 
    
         
            +
                
         
     | 
| 
      
 84 
     | 
    
         
            +
                # return the stored miles or convert from kilometers
         
     | 
| 
      
 85 
     | 
    
         
            +
                def mph(as_integer=true)
         
     | 
| 
      
 86 
     | 
    
         
            +
                  m = (@miles || Speed.km_to_m(@kilometers))
         
     | 
| 
      
 87 
     | 
    
         
            +
                  m ? (as_integer ? m.to_i : (100*m).round/100.0) : nil
         
     | 
| 
      
 88 
     | 
    
         
            +
                end
         
     | 
| 
      
 89 
     | 
    
         
            +
                
         
     | 
| 
      
 90 
     | 
    
         
            +
                #
         
     | 
| 
      
 91 
     | 
    
         
            +
                # OPERATORS
         
     | 
| 
      
 92 
     | 
    
         
            +
                #
         
     | 
| 
      
 93 
     | 
    
         
            +
                
         
     | 
| 
      
 94 
     | 
    
         
            +
                def <=>(other)
         
     | 
| 
      
 95 
     | 
    
         
            +
                  self.kph <=> other.kph
         
     | 
| 
      
 96 
     | 
    
         
            +
                end
         
     | 
| 
      
 97 
     | 
    
         
            +
                
         
     | 
| 
      
 98 
     | 
    
         
            +
                #
         
     | 
| 
      
 99 
     | 
    
         
            +
                # HELPERS
         
     | 
| 
      
 100 
     | 
    
         
            +
                #
         
     | 
| 
      
 101 
     | 
    
         
            +
                
         
     | 
| 
      
 102 
     | 
    
         
            +
                # will just return the value (no units)
         
     | 
| 
      
 103 
     | 
    
         
            +
                def to_i(metric=nil)
         
     | 
| 
      
 104 
     | 
    
         
            +
                  (metric || (metric.nil? && self.metric?)) ? self.kph : self.mph
         
     | 
| 
      
 105 
     | 
    
         
            +
                end
         
     | 
| 
      
 106 
     | 
    
         
            +
                
         
     | 
| 
      
 107 
     | 
    
         
            +
                # will just return the value (no units) with more precision
         
     | 
| 
      
 108 
     | 
    
         
            +
                def to_f(metric=nil)
         
     | 
| 
      
 109 
     | 
    
         
            +
                  (metric || (metric.nil? && self.metric?)) ? self.kph(false) : self.mph(false)
         
     | 
| 
      
 110 
     | 
    
         
            +
                end
         
     | 
| 
      
 111 
     | 
    
         
            +
                
         
     | 
| 
      
 112 
     | 
    
         
            +
                # will return the value with units
         
     | 
| 
      
 113 
     | 
    
         
            +
                def to_s(metric=nil)
         
     | 
| 
      
 114 
     | 
    
         
            +
                  (metric || (metric.nil? && self.metric?)) ? "#{self.kph} #{METRIC_UNITS}" : "#{self.mph} #{IMPERIAL_UNITS}"
         
     | 
| 
      
 115 
     | 
    
         
            +
                end
         
     | 
| 
      
 116 
     | 
    
         
            +
                
         
     | 
| 
      
 117 
     | 
    
         
            +
                # will just return the units (no value)
         
     | 
| 
      
 118 
     | 
    
         
            +
                def units(metric=nil)
         
     | 
| 
      
 119 
     | 
    
         
            +
                  (metric || (metric.nil? && self.metric?)) ? METRIC_UNITS : IMPERIAL_UNITS
         
     | 
| 
      
 120 
     | 
    
         
            +
                end
         
     | 
| 
      
 121 
     | 
    
         
            +
                
         
     | 
| 
      
 122 
     | 
    
         
            +
                # when we set miles, it is possible the a non-equivalent value of
         
     | 
| 
      
 123 
     | 
    
         
            +
                # kilometers remains.  if so, clear it.
         
     | 
| 
      
 124 
     | 
    
         
            +
                def update_kilometers(m)
         
     | 
| 
      
 125 
     | 
    
         
            +
                  return unless @kilometers
         
     | 
| 
      
 126 
     | 
    
         
            +
                  difference = Speed.m_to_km(m.to_f) - @kilometers
         
     | 
| 
      
 127 
     | 
    
         
            +
                  # only clear kilometers if the stored kilometers is off be more then 1 unit
         
     | 
| 
      
 128 
     | 
    
         
            +
                  # then the conversion of miles
         
     | 
| 
      
 129 
     | 
    
         
            +
                  @kilometers = nil unless difference.abs <= 1.0
         
     | 
| 
      
 130 
     | 
    
         
            +
                end
         
     | 
| 
      
 131 
     | 
    
         
            +
                
         
     | 
| 
      
 132 
     | 
    
         
            +
                # when we set kilometers, it is possible the a non-equivalent value of
         
     | 
| 
      
 133 
     | 
    
         
            +
                # miles remains.  if so, clear it.
         
     | 
| 
      
 134 
     | 
    
         
            +
                def update_miles(km)
         
     | 
| 
      
 135 
     | 
    
         
            +
                  return unless @miles
         
     | 
| 
      
 136 
     | 
    
         
            +
                  difference = Speed.km_to_m(km.to_f) - @miles
         
     | 
| 
      
 137 
     | 
    
         
            +
                  # only clear miles if the stored miles is off be more then 1 unit
         
     | 
| 
      
 138 
     | 
    
         
            +
                  # then the conversion of kilometers
         
     | 
| 
      
 139 
     | 
    
         
            +
                  @miles = nil unless difference.abs <= 1.0
         
     | 
| 
      
 140 
     | 
    
         
            +
                end
         
     | 
| 
      
 141 
     | 
    
         
            +
                
         
     | 
| 
      
 142 
     | 
    
         
            +
                def nil?
         
     | 
| 
      
 143 
     | 
    
         
            +
                  (@kilometers || @miles) ? false : true
         
     | 
| 
      
 144 
     | 
    
         
            +
                end
         
     | 
| 
      
 145 
     | 
    
         
            +
                
         
     | 
| 
      
 146 
     | 
    
         
            +
              end
         
     | 
| 
      
 147 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,35 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            module Barometer
         
     | 
| 
      
 2 
     | 
    
         
            +
              #
         
     | 
| 
      
 3 
     | 
    
         
            +
              # A simple Sun class
         
     | 
| 
      
 4 
     | 
    
         
            +
              # 
         
     | 
| 
      
 5 
     | 
    
         
            +
              # Used to store sunrise and sunset information
         
     | 
| 
      
 6 
     | 
    
         
            +
              #
         
     | 
| 
      
 7 
     | 
    
         
            +
              class Sun
         
     | 
| 
      
 8 
     | 
    
         
            +
                
         
     | 
| 
      
 9 
     | 
    
         
            +
                def initialize(rise=nil, set=nil)
         
     | 
| 
      
 10 
     | 
    
         
            +
                  raise ArgumentError unless (rise.is_a?(Time) || rise.nil?)
         
     | 
| 
      
 11 
     | 
    
         
            +
                  raise ArgumentError unless (set.is_a?(Time) || set.nil?)
         
     | 
| 
      
 12 
     | 
    
         
            +
                  @rise_utc = rise
         
     | 
| 
      
 13 
     | 
    
         
            +
                  @set_utc = set
         
     | 
| 
      
 14 
     | 
    
         
            +
                end
         
     | 
| 
      
 15 
     | 
    
         
            +
             
     | 
| 
      
 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 
     | 
    
         
            +
                def nil?
         
     | 
| 
      
 31 
     | 
    
         
            +
                  (@rise_utc || @set_utc) ? false : true
         
     | 
| 
      
 32 
     | 
    
         
            +
                end
         
     | 
| 
      
 33 
     | 
    
         
            +
                
         
     | 
| 
      
 34 
     | 
    
         
            +
              end
         
     | 
| 
      
 35 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,164 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            module Barometer
         
     | 
| 
      
 2 
     | 
    
         
            +
              #
         
     | 
| 
      
 3 
     | 
    
         
            +
              # A simple Temperature class
         
     | 
| 
      
 4 
     | 
    
         
            +
              # 
         
     | 
| 
      
 5 
     | 
    
         
            +
              # Think of this like the Integer class. Enhancement
         
     | 
| 
      
 6 
     | 
    
         
            +
              # is that you can create a number (in a certain unit), then
         
     | 
| 
      
 7 
     | 
    
         
            +
              # get that number back already converted to another unit.
         
     | 
| 
      
 8 
     | 
    
         
            +
              #
         
     | 
| 
      
 9 
     | 
    
         
            +
              # All comparison operations will be done in the absolute
         
     | 
| 
      
 10 
     | 
    
         
            +
              # scale of Kelvin (K)
         
     | 
| 
      
 11 
     | 
    
         
            +
              #
         
     | 
| 
      
 12 
     | 
    
         
            +
              class Temperature < Barometer::Units
         
     | 
| 
      
 13 
     | 
    
         
            +
                
         
     | 
| 
      
 14 
     | 
    
         
            +
                METRIC_UNITS = "C"
         
     | 
| 
      
 15 
     | 
    
         
            +
                IMPERIAL_UNITS = "F"
         
     | 
| 
      
 16 
     | 
    
         
            +
                
         
     | 
| 
      
 17 
     | 
    
         
            +
                attr_accessor :celsius, :fahrenheit, :kelvin
         
     | 
| 
      
 18 
     | 
    
         
            +
                
         
     | 
| 
      
 19 
     | 
    
         
            +
                def initialize(metric=true)
         
     | 
| 
      
 20 
     | 
    
         
            +
                  @celsius = nil
         
     | 
| 
      
 21 
     | 
    
         
            +
                  @fahrenheit = nil
         
     | 
| 
      
 22 
     | 
    
         
            +
                  @kelvin = nil
         
     | 
| 
      
 23 
     | 
    
         
            +
                  super(metric)
         
     | 
| 
      
 24 
     | 
    
         
            +
                end
         
     | 
| 
      
 25 
     | 
    
         
            +
                
         
     | 
| 
      
 26 
     | 
    
         
            +
                def metric_default=(value); self.c = value; end
         
     | 
| 
      
 27 
     | 
    
         
            +
                def imperial_default=(value); self.f = value; end
         
     | 
| 
      
 28 
     | 
    
         
            +
             
     | 
| 
      
 29 
     | 
    
         
            +
                #
         
     | 
| 
      
 30 
     | 
    
         
            +
                # CONVERTERS
         
     | 
| 
      
 31 
     | 
    
         
            +
                #
         
     | 
| 
      
 32 
     | 
    
         
            +
                
         
     | 
| 
      
 33 
     | 
    
         
            +
                def self.c_to_k(c)
         
     | 
| 
      
 34 
     | 
    
         
            +
                  return nil unless c && (c.is_a?(Integer) || c.is_a?(Float))
         
     | 
| 
      
 35 
     | 
    
         
            +
                  273.15 + c.to_f
         
     | 
| 
      
 36 
     | 
    
         
            +
                end
         
     | 
| 
      
 37 
     | 
    
         
            +
                
         
     | 
| 
      
 38 
     | 
    
         
            +
                # Tf = (9/5)*Tc+32
         
     | 
| 
      
 39 
     | 
    
         
            +
                def self.c_to_f(c)
         
     | 
| 
      
 40 
     | 
    
         
            +
                  return nil unless c && (c.is_a?(Integer) || c.is_a?(Float))
         
     | 
| 
      
 41 
     | 
    
         
            +
                   ((9.0/5.0)*c.to_f)+32.0
         
     | 
| 
      
 42 
     | 
    
         
            +
                end
         
     | 
| 
      
 43 
     | 
    
         
            +
                
         
     | 
| 
      
 44 
     | 
    
         
            +
                # Tc = (5/9)*(Tf-32)
         
     | 
| 
      
 45 
     | 
    
         
            +
                def self.f_to_c(f)
         
     | 
| 
      
 46 
     | 
    
         
            +
                  return nil unless f && (f.is_a?(Integer) || f.is_a?(Float))
         
     | 
| 
      
 47 
     | 
    
         
            +
                  (5.0/9.0)*(f.to_f-32.0)
         
     | 
| 
      
 48 
     | 
    
         
            +
                end
         
     | 
| 
      
 49 
     | 
    
         
            +
                
         
     | 
| 
      
 50 
     | 
    
         
            +
                def self.f_to_k(f)
         
     | 
| 
      
 51 
     | 
    
         
            +
                  return nil unless f && (f.is_a?(Integer) || f.is_a?(Float))
         
     | 
| 
      
 52 
     | 
    
         
            +
                  c = self.f_to_c(f.to_f)
         
     | 
| 
      
 53 
     | 
    
         
            +
                  self.c_to_k(c)
         
     | 
| 
      
 54 
     | 
    
         
            +
                end
         
     | 
| 
      
 55 
     | 
    
         
            +
                
         
     | 
| 
      
 56 
     | 
    
         
            +
                def self.k_to_c(k)
         
     | 
| 
      
 57 
     | 
    
         
            +
                  return nil unless k && (k.is_a?(Integer) || k.is_a?(Float))
         
     | 
| 
      
 58 
     | 
    
         
            +
                  k.to_f - 273.15
         
     | 
| 
      
 59 
     | 
    
         
            +
                end
         
     | 
| 
      
 60 
     | 
    
         
            +
                
         
     | 
| 
      
 61 
     | 
    
         
            +
                def self.k_to_f(k)
         
     | 
| 
      
 62 
     | 
    
         
            +
                  return nil unless k && (k.is_a?(Integer) || k.is_a?(Float))
         
     | 
| 
      
 63 
     | 
    
         
            +
                  c = self.k_to_c(k.to_f)
         
     | 
| 
      
 64 
     | 
    
         
            +
                  self.c_to_f(c)
         
     | 
| 
      
 65 
     | 
    
         
            +
                end
         
     | 
| 
      
 66 
     | 
    
         
            +
                
         
     | 
| 
      
 67 
     | 
    
         
            +
                #
         
     | 
| 
      
 68 
     | 
    
         
            +
                # ACCESSORS
         
     | 
| 
      
 69 
     | 
    
         
            +
                #
         
     | 
| 
      
 70 
     | 
    
         
            +
                
         
     | 
| 
      
 71 
     | 
    
         
            +
                # store celsius and kelvin
         
     | 
| 
      
 72 
     | 
    
         
            +
                def c=(c)
         
     | 
| 
      
 73 
     | 
    
         
            +
                  return if !c || !(c.is_a?(Integer) || c.is_a?(Float))
         
     | 
| 
      
 74 
     | 
    
         
            +
                  @celsius = c.to_f
         
     | 
| 
      
 75 
     | 
    
         
            +
                  @kelvin = Temperature.c_to_k(c.to_f)
         
     | 
| 
      
 76 
     | 
    
         
            +
                  self.update_fahrenheit(c.to_f)
         
     | 
| 
      
 77 
     | 
    
         
            +
                end
         
     | 
| 
      
 78 
     | 
    
         
            +
                
         
     | 
| 
      
 79 
     | 
    
         
            +
                # store fahrenheit and kelvin
         
     | 
| 
      
 80 
     | 
    
         
            +
                def f=(f)
         
     | 
| 
      
 81 
     | 
    
         
            +
                  return if !f || !(f.is_a?(Integer) || f.is_a?(Float))
         
     | 
| 
      
 82 
     | 
    
         
            +
                  @fahrenheit = f.to_f
         
     | 
| 
      
 83 
     | 
    
         
            +
                  @kelvin = Temperature.f_to_k(f.to_f)
         
     | 
| 
      
 84 
     | 
    
         
            +
                  self.update_celsius(f.to_f)
         
     | 
| 
      
 85 
     | 
    
         
            +
                end
         
     | 
| 
      
 86 
     | 
    
         
            +
                
         
     | 
| 
      
 87 
     | 
    
         
            +
                # store kelvin, convert to all
         
     | 
| 
      
 88 
     | 
    
         
            +
                def k=(k)
         
     | 
| 
      
 89 
     | 
    
         
            +
                  return if !k || !(k.is_a?(Integer) || k.is_a?(Float))
         
     | 
| 
      
 90 
     | 
    
         
            +
                  @kelvin = k.to_f
         
     | 
| 
      
 91 
     | 
    
         
            +
                  @celsius = Temperature.k_to_c(k.to_f)
         
     | 
| 
      
 92 
     | 
    
         
            +
                  @fahrenheit = Temperature.k_to_f(k.to_f)
         
     | 
| 
      
 93 
     | 
    
         
            +
                end
         
     | 
| 
      
 94 
     | 
    
         
            +
                
         
     | 
| 
      
 95 
     | 
    
         
            +
                # return the stored celsius or convert from Kelvin
         
     | 
| 
      
 96 
     | 
    
         
            +
                def c(as_integer=true)
         
     | 
| 
      
 97 
     | 
    
         
            +
                  c = (@celsius || Temperature.k_to_c(@kelvin))
         
     | 
| 
      
 98 
     | 
    
         
            +
                  c ? (as_integer ? c.to_i : (100*c).round/100.0) : nil
         
     | 
| 
      
 99 
     | 
    
         
            +
                end
         
     | 
| 
      
 100 
     | 
    
         
            +
                
         
     | 
| 
      
 101 
     | 
    
         
            +
                # return the stored fahrenheit or convert from Kelvin
         
     | 
| 
      
 102 
     | 
    
         
            +
                def f(as_integer=true)
         
     | 
| 
      
 103 
     | 
    
         
            +
                  f = (@fahrenheit || Temperature.k_to_f(@kelvin))
         
     | 
| 
      
 104 
     | 
    
         
            +
                  f ? (as_integer ? f.to_i : (100*f).round/100.0) : nil
         
     | 
| 
      
 105 
     | 
    
         
            +
                end
         
     | 
| 
      
 106 
     | 
    
         
            +
                
         
     | 
| 
      
 107 
     | 
    
         
            +
                #
         
     | 
| 
      
 108 
     | 
    
         
            +
                # OPERATORS
         
     | 
| 
      
 109 
     | 
    
         
            +
                #
         
     | 
| 
      
 110 
     | 
    
         
            +
                
         
     | 
| 
      
 111 
     | 
    
         
            +
                def <=>(other)
         
     | 
| 
      
 112 
     | 
    
         
            +
                  @kelvin <=> other.kelvin
         
     | 
| 
      
 113 
     | 
    
         
            +
                end
         
     | 
| 
      
 114 
     | 
    
         
            +
                
         
     | 
| 
      
 115 
     | 
    
         
            +
                #
         
     | 
| 
      
 116 
     | 
    
         
            +
                # HELPERS
         
     | 
| 
      
 117 
     | 
    
         
            +
                #
         
     | 
| 
      
 118 
     | 
    
         
            +
                
         
     | 
| 
      
 119 
     | 
    
         
            +
                # will just return the value (no units)
         
     | 
| 
      
 120 
     | 
    
         
            +
                def to_i(metric=nil)
         
     | 
| 
      
 121 
     | 
    
         
            +
                  (metric || (metric.nil? && self.metric?)) ? self.c : self.f
         
     | 
| 
      
 122 
     | 
    
         
            +
                end
         
     | 
| 
      
 123 
     | 
    
         
            +
                
         
     | 
| 
      
 124 
     | 
    
         
            +
                # will just return the value (no units) with more precision
         
     | 
| 
      
 125 
     | 
    
         
            +
                def to_f(metric=nil)
         
     | 
| 
      
 126 
     | 
    
         
            +
                  (metric || (metric.nil? && self.metric?)) ? self.c(false) : self.f(false)
         
     | 
| 
      
 127 
     | 
    
         
            +
                end
         
     | 
| 
      
 128 
     | 
    
         
            +
                
         
     | 
| 
      
 129 
     | 
    
         
            +
                # will return the value with units
         
     | 
| 
      
 130 
     | 
    
         
            +
                def to_s(metric=nil)
         
     | 
| 
      
 131 
     | 
    
         
            +
                  (metric || (metric.nil? && self.metric?)) ? "#{self.c} #{METRIC_UNITS}" : "#{self.f} #{IMPERIAL_UNITS}"
         
     | 
| 
      
 132 
     | 
    
         
            +
                end
         
     | 
| 
      
 133 
     | 
    
         
            +
                
         
     | 
| 
      
 134 
     | 
    
         
            +
                # will just return the units (no value)
         
     | 
| 
      
 135 
     | 
    
         
            +
                def units(metric=nil)
         
     | 
| 
      
 136 
     | 
    
         
            +
                  (metric || (metric.nil? && self.metric?)) ? METRIC_UNITS : IMPERIAL_UNITS
         
     | 
| 
      
 137 
     | 
    
         
            +
                end
         
     | 
| 
      
 138 
     | 
    
         
            +
                
         
     | 
| 
      
 139 
     | 
    
         
            +
                # when we set fahrenheit, it is possible the a non-equivalent value of
         
     | 
| 
      
 140 
     | 
    
         
            +
                # celsius remains.  if so, clear it.
         
     | 
| 
      
 141 
     | 
    
         
            +
                def update_celsius(f)
         
     | 
| 
      
 142 
     | 
    
         
            +
                  return unless @celsius
         
     | 
| 
      
 143 
     | 
    
         
            +
                  difference = Temperature.f_to_c(f.to_f) - @celsius
         
     | 
| 
      
 144 
     | 
    
         
            +
                  # only clear celsius if the stored celsius is off be more then 1 degree
         
     | 
| 
      
 145 
     | 
    
         
            +
                  # then the conversion of fahrenheit
         
     | 
| 
      
 146 
     | 
    
         
            +
                  @celsius = nil unless difference.abs <= 1.0
         
     | 
| 
      
 147 
     | 
    
         
            +
                end
         
     | 
| 
      
 148 
     | 
    
         
            +
                
         
     | 
| 
      
 149 
     | 
    
         
            +
                # when we set celsius, it is possible the a non-equivalent value of
         
     | 
| 
      
 150 
     | 
    
         
            +
                # fahrenheit remains.  if so, clear it.
         
     | 
| 
      
 151 
     | 
    
         
            +
                def update_fahrenheit(c)
         
     | 
| 
      
 152 
     | 
    
         
            +
                  return unless @fahrenheit
         
     | 
| 
      
 153 
     | 
    
         
            +
                  difference = Temperature.c_to_f(c.to_f) - @fahrenheit
         
     | 
| 
      
 154 
     | 
    
         
            +
                  # only clear fahrenheit if the stored fahrenheit is off be more then 1 degree
         
     | 
| 
      
 155 
     | 
    
         
            +
                  # then the conversion of celsius
         
     | 
| 
      
 156 
     | 
    
         
            +
                  @fahrenheit = nil unless difference.abs <= 1.0
         
     | 
| 
      
 157 
     | 
    
         
            +
                end
         
     | 
| 
      
 158 
     | 
    
         
            +
                
         
     | 
| 
      
 159 
     | 
    
         
            +
                def nil?
         
     | 
| 
      
 160 
     | 
    
         
            +
                  (@celsius || @fahrenheit || @kelvin) ? false : true
         
     | 
| 
      
 161 
     | 
    
         
            +
                end
         
     | 
| 
      
 162 
     | 
    
         
            +
                
         
     | 
| 
      
 163 
     | 
    
         
            +
              end
         
     | 
| 
      
 164 
     | 
    
         
            +
            end
         
     |