barometer 0.3.2 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (108) hide show
  1. data/README.rdoc +78 -70
  2. data/VERSION.yml +2 -2
  3. data/bin/barometer +100 -37
  4. data/lib/barometer.rb +12 -8
  5. data/lib/barometer/base.rb +48 -20
  6. data/lib/barometer/data.rb +5 -1
  7. data/lib/barometer/data/current.rb +23 -15
  8. data/lib/barometer/data/distance.rb +15 -5
  9. data/lib/barometer/data/forecast.rb +23 -5
  10. data/lib/barometer/data/geo.rb +16 -54
  11. data/lib/barometer/data/local_datetime.rb +137 -0
  12. data/lib/barometer/data/local_time.rb +134 -0
  13. data/lib/barometer/data/location.rb +6 -1
  14. data/lib/barometer/data/measurement.rb +71 -42
  15. data/lib/barometer/data/night.rb +69 -0
  16. data/lib/barometer/data/pressure.rb +15 -5
  17. data/lib/barometer/data/speed.rb +16 -5
  18. data/lib/barometer/data/sun.rb +8 -20
  19. data/lib/barometer/data/temperature.rb +22 -9
  20. data/lib/barometer/data/units.rb +10 -19
  21. data/lib/barometer/data/zone.rb +135 -9
  22. data/lib/barometer/formats.rb +12 -0
  23. data/lib/barometer/formats/coordinates.rb +42 -0
  24. data/lib/barometer/formats/format.rb +46 -0
  25. data/lib/barometer/formats/geocode.rb +51 -0
  26. data/lib/barometer/formats/icao.rb +37 -0
  27. data/lib/barometer/formats/postalcode.rb +22 -0
  28. data/lib/barometer/formats/short_zipcode.rb +17 -0
  29. data/lib/barometer/formats/weather_id.rb +107 -0
  30. data/lib/barometer/formats/zipcode.rb +31 -0
  31. data/lib/barometer/query.rb +61 -232
  32. data/lib/barometer/services.rb +14 -4
  33. data/lib/barometer/translations/icao_country_codes.yml +9 -0
  34. data/lib/barometer/translations/weather_country_codes.yml +17 -0
  35. data/lib/barometer/weather.rb +51 -30
  36. data/lib/barometer/{services → weather_services}/google.rb +23 -26
  37. data/lib/barometer/weather_services/noaa.rb +6 -0
  38. data/lib/barometer/{services → weather_services}/service.rb +101 -92
  39. data/lib/barometer/weather_services/weather_bug.rb +6 -0
  40. data/lib/barometer/weather_services/weather_dot_com.rb +261 -0
  41. data/lib/barometer/{services → weather_services}/wunderground.rb +58 -76
  42. data/lib/barometer/{services → weather_services}/yahoo.rb +91 -121
  43. data/lib/barometer/web_services/geocode.rb +33 -0
  44. data/lib/barometer/web_services/weather_id.rb +37 -0
  45. data/lib/barometer/web_services/web_service.rb +32 -0
  46. data/lib/demometer/demometer.rb +31 -4
  47. data/lib/demometer/views/forecast.erb +20 -0
  48. data/lib/demometer/views/index.erb +10 -3
  49. data/lib/demometer/views/measurement.erb +8 -3
  50. data/lib/demometer/views/readme.erb +63 -24
  51. data/spec/barometer_spec.rb +18 -36
  52. data/spec/{data_current_spec.rb → data/current_spec.rb} +73 -49
  53. data/spec/{data_distance_spec.rb → data/distance_spec.rb} +30 -30
  54. data/spec/{data_forecast_spec.rb → data/forecast_spec.rb} +57 -15
  55. data/spec/data/geo_spec.rb +91 -0
  56. data/spec/data/local_datetime_spec.rb +269 -0
  57. data/spec/data/local_time_spec.rb +239 -0
  58. data/spec/{data_location_spec.rb → data/location_spec.rb} +12 -1
  59. data/spec/{data_measurement_spec.rb → data/measurement_spec.rb} +135 -66
  60. data/spec/data/night_measurement_spec.rb +136 -0
  61. data/spec/{data_pressure_spec.rb → data/pressure_spec.rb} +29 -29
  62. data/spec/{data_speed_spec.rb → data/speed_spec.rb} +30 -30
  63. data/spec/data/sun_spec.rb +49 -0
  64. data/spec/{data_temperature_spec.rb → data/temperature_spec.rb} +44 -44
  65. data/spec/{units_spec.rb → data/units_spec.rb} +6 -6
  66. data/spec/{data_zone_spec.rb → data/zone_spec.rb} +15 -15
  67. data/spec/fixtures/formats/weather_id/90210.xml +1 -0
  68. data/spec/fixtures/formats/weather_id/atlanta.xml +1 -0
  69. data/spec/fixtures/formats/weather_id/from_USGA0028.xml +1 -0
  70. data/spec/fixtures/formats/weather_id/new_york.xml +1 -0
  71. data/spec/fixtures/{geocode_40_73.xml → geocode/40_73.xml} +0 -0
  72. data/spec/fixtures/{geocode_90210.xml → geocode/90210.xml} +0 -0
  73. data/spec/fixtures/{geocode_T5B4M9.xml → geocode/T5B4M9.xml} +0 -0
  74. data/spec/fixtures/geocode/atlanta.xml +1 -0
  75. data/spec/fixtures/{geocode_calgary_ab.xml → geocode/calgary_ab.xml} +0 -0
  76. data/spec/fixtures/{geocode_ksfo.xml → geocode/ksfo.xml} +0 -0
  77. data/spec/fixtures/{geocode_newyork_ny.xml → geocode/newyork_ny.xml} +0 -0
  78. data/spec/fixtures/{google_calgary_ab.xml → services/google/calgary_ab.xml} +0 -0
  79. data/spec/fixtures/services/weather_dot_com/90210.xml +1 -0
  80. data/spec/fixtures/{current_calgary_ab.xml → services/wunderground/current_calgary_ab.xml} +0 -0
  81. data/spec/fixtures/{forecast_calgary_ab.xml → services/wunderground/forecast_calgary_ab.xml} +0 -0
  82. data/spec/fixtures/{yahoo_90210.xml → services/yahoo/90210.xml} +0 -0
  83. data/spec/formats/coordinates_spec.rb +158 -0
  84. data/spec/formats/format_spec.rb +73 -0
  85. data/spec/formats/geocode_spec.rb +179 -0
  86. data/spec/formats/icao_spec.rb +61 -0
  87. data/spec/formats/postalcode_spec.rb +59 -0
  88. data/spec/formats/short_zipcode_spec.rb +53 -0
  89. data/spec/formats/weather_id_spec.rb +191 -0
  90. data/spec/formats/zipcode_spec.rb +111 -0
  91. data/spec/query_spec.rb +261 -288
  92. data/spec/spec_helper.rb +128 -4
  93. data/spec/{service_google_spec.rb → weather_services/google_spec.rb} +46 -46
  94. data/spec/weather_services/services_spec.rb +1118 -0
  95. data/spec/weather_services/weather_dot_com_spec.rb +327 -0
  96. data/spec/weather_services/wunderground_spec.rb +332 -0
  97. data/spec/{service_yahoo_spec.rb → weather_services/yahoo_spec.rb} +65 -81
  98. data/spec/weather_spec.rb +73 -61
  99. data/spec/web_services/geocode_spec.rb +45 -0
  100. data/spec/web_services/web_services_spec.rb +26 -0
  101. metadata +88 -36
  102. data/lib/barometer/services/noaa.rb +0 -6
  103. data/lib/barometer/services/weather_bug.rb +0 -6
  104. data/lib/barometer/services/weather_dot_com.rb +0 -6
  105. data/spec/data_geo_spec.rb +0 -94
  106. data/spec/data_sun_spec.rb +0 -76
  107. data/spec/service_wunderground_spec.rb +0 -330
  108. data/spec/services_spec.rb +0 -1106
@@ -0,0 +1,137 @@
1
+ require 'date'
2
+ module Barometer
3
+ #
4
+ # A simple DateTime class
5
+ #
6
+ # A time class that represents the local date_time ...
7
+ # it has no concept of time zone
8
+ #
9
+ class Data::LocalDateTime < Data::LocalTime
10
+
11
+ attr_reader :year, :month, :day
12
+
13
+ def initialize(y,mon,d,h=0,m=0,s=0)
14
+ raise(ArgumentError, "invalid date") unless y && mon && d && Date.civil(y,mon,d)
15
+ @year = y
16
+ @month = mon
17
+ @day = d
18
+ super(h,m,s)
19
+ self
20
+ end
21
+
22
+ def year=(y)
23
+ unless y && y.is_a?(Fixnum) && Date.civil(y,@month,@day)
24
+ raise(ArgumentError, "invalid year")
25
+ end
26
+ @year = y
27
+ end
28
+
29
+ def month=(m)
30
+ unless m && m.is_a?(Fixnum) && Date.civil(@year,m,@day)
31
+ raise(ArgumentError, "invalid month")
32
+ end
33
+ @month = m
34
+ end
35
+
36
+ def day=(d)
37
+ unless d && d.is_a?(Fixnum) && Date.civil(@year,@month,d)
38
+ raise(ArgumentError, "invalid day")
39
+ end
40
+ @day = d
41
+ end
42
+
43
+ def parse(string)
44
+ return unless string
45
+ new_date = Data::LocalDateTime.parse(string)
46
+ @year = new_date.year
47
+ @month = new_date.month
48
+ @day = new_date.day
49
+ @hour = new_date.hour
50
+ @min = new_date.min
51
+ @sec = new_date.sec
52
+ self
53
+ end
54
+
55
+ def self.parse(string)
56
+ return nil unless string
57
+ return string if string.is_a?(Data::LocalDateTime)
58
+
59
+ year = nil; month = nil; day = nil;
60
+ hour = nil; min = nil; sec = nil;
61
+ if string.is_a?(Time) || string.is_a?(DateTime)
62
+ year = string.year
63
+ month = string.mon
64
+ day = string.day
65
+ hour = string.hour
66
+ min = string.min
67
+ sec = string.sec
68
+ elsif string.is_a?(Date)
69
+ year = string.year
70
+ month = string.mon
71
+ day = string.day
72
+ elsif string.is_a?(String)
73
+ datetime = Time.parse(string)
74
+ year = datetime.year
75
+ month = datetime.mon
76
+ day = datetime.day
77
+ hour = datetime.hour
78
+ min = datetime.min
79
+ sec = datetime.sec
80
+ end
81
+ Data::LocalDateTime.new(year, month, day, hour, min, sec)
82
+ end
83
+
84
+ # convert to a Date class
85
+ #
86
+ def to_d
87
+ Date.civil(@year, @month, @day)
88
+ end
89
+
90
+ # convert to a DateTime class
91
+ #
92
+ def to_dt
93
+ DateTime.new(@year, @month, @day, @hour, @min, @sec)
94
+ end
95
+
96
+ def <=>(other)
97
+ if other.is_a?(String) || other.is_a?(Time) || other.is_a?(DateTime) || other.is_a?(Date)
98
+ the_other = Data::LocalDateTime.parse(other)
99
+ else
100
+ the_other = other
101
+ end
102
+ raise ArgumentError unless the_other.is_a?(Data::LocalDateTime) || the_other.is_a?(Data::LocalTime)
103
+
104
+ if (other.is_a?(String) || other.is_a?(Time) || other.is_a?(DateTime)) &&
105
+ the_other.is_a?(Data::LocalDateTime)
106
+ # we are counting days + seconds
107
+ if (_total_days <=> the_other._total_days) == 0
108
+ return total_seconds <=> the_other.total_seconds
109
+ else
110
+ return _total_days <=> the_other._total_days
111
+ end
112
+ elsif other.is_a?(Date) && the_other.is_a?(Data::LocalDateTime)
113
+ # we are counting days
114
+ return _total_days <=> the_other._total_days
115
+ elsif the_other.is_a?(Data::LocalTime)
116
+ # we are counting seconds
117
+ return total_seconds <=> the_other.total_seconds
118
+ end
119
+ end
120
+
121
+ def to_s(time=false)
122
+ datetime = self.to_dt
123
+ format = (time ? "%Y-%m-%d %I:%M:%S %p" : "%Y-%m-%d")
124
+ datetime.strftime(format).downcase
125
+ end
126
+
127
+ def nil?; @year == 0 && @month == 0 && @day == 0 && super; end
128
+
129
+ # this assumes all years have 366 days (which only is true for leap years)
130
+ # but since this is just for comparisons, this will be accurate
131
+ #
132
+ def _total_days
133
+ self.to_d.yday + (@year * 366)
134
+ end
135
+
136
+ end
137
+ end
@@ -0,0 +1,134 @@
1
+ module Barometer
2
+ #
3
+ # A simple Time class
4
+ #
5
+ # A time class that represents the local time ...
6
+ # it has no concept of time zone or date
7
+ #
8
+ class Data::LocalTime
9
+ include Comparable
10
+
11
+ attr_reader :hour, :min, :sec
12
+
13
+ def initialize(h=0,m=0,s=0)
14
+ self.hour = h
15
+ self.min = m
16
+ self.sec = s
17
+ self
18
+ end
19
+
20
+ def hour=(h)
21
+ raise ArgumentError unless (h.is_a?(Fixnum) || h.nil?)
22
+ hour_cap = 24
23
+ if h.to_i >= hour_cap.to_i
24
+ @hour = h.divmod(hour_cap)[1]
25
+ else
26
+ @hour = h
27
+ end
28
+ end
29
+
30
+ def min=(m)
31
+ raise ArgumentError unless (m.is_a?(Fixnum) || m.nil?)
32
+ minute_cap = 60
33
+ if m.to_i >= minute_cap.to_i
34
+ result = m.divmod(minute_cap)
35
+ @min = result[1]
36
+ self.hour = @hour + result[0]
37
+ else
38
+ @min = m
39
+ end
40
+ end
41
+
42
+ def sec=(s)
43
+ raise ArgumentError unless (s.is_a?(Fixnum) || s.nil?)
44
+ second_cap = 60
45
+ if s.to_i >= second_cap.to_i
46
+ result = s.divmod(second_cap)
47
+ @sec = result[1]
48
+ self.min = @min + result[0]
49
+ else
50
+ @sec = s
51
+ end
52
+ end
53
+
54
+ def parse(string)
55
+ if string.is_a?(Time) || string.is_a?(DateTime)
56
+ @hour = string.hour
57
+ @min = string.min
58
+ @sec = string.sec
59
+ elsif string.is_a?(String)
60
+ time = Time.parse(string)
61
+ @hour = time.hour
62
+ @min = time.min
63
+ @sec = time.sec
64
+ end
65
+ self
66
+ end
67
+
68
+ def self.parse(string)
69
+ return string if string.is_a?(Data::LocalTime)
70
+ local = Data::LocalTime.new
71
+ local.parse(string)
72
+ local
73
+ end
74
+
75
+ # convert to a Time class
76
+ #
77
+ def to_t
78
+ date = Date.today
79
+ Time.local(date.year,date.month,date.day,@hour,@min,@sec)
80
+ end
81
+
82
+ def total_seconds
83
+ (@hour * 60 * 60) + (@min * 60) + @sec
84
+ end
85
+
86
+ def <=>(other)
87
+ if other.is_a?(String) || other.is_a?(Time) || other.is_a?(DateTime)
88
+ the_other = Data::LocalTime.parse(other)
89
+ else
90
+ the_other = other
91
+ end
92
+ raise ArgumentError unless the_other.is_a?(Data::LocalTime)
93
+ total_seconds <=> the_other.total_seconds
94
+ end
95
+
96
+ def +(seconds)
97
+ local_time = Data::LocalTime.new
98
+ if seconds.is_a?(Fixnum) || seconds.is_a?(Float)
99
+ local_time.sec = self.total_seconds + seconds.to_i
100
+ elsif seconds.is_a?(Data::LocalTime)
101
+ this_total = self.total_seconds + seconds.total_seconds
102
+ local_time.sec = this_total
103
+ end
104
+ local_time
105
+ end
106
+
107
+ def -(seconds)
108
+ local_time = Data::LocalTime.new
109
+ if seconds.is_a?(Fixnum) || seconds.is_a?(Float)
110
+ local_time.sec = self.total_seconds - seconds.to_i
111
+ elsif seconds.is_a?(Data::LocalTime)
112
+ #self.sec += seconds.total_seconds
113
+ this_total = self.total_seconds - seconds.total_seconds
114
+ local_time.sec = this_total
115
+ end
116
+ local_time
117
+ end
118
+
119
+ def diff(other)
120
+ the_other = Data::LocalTime.parse(other)
121
+ raise ArgumentError unless the_other.is_a?(Data::LocalTime)
122
+ (self.total_seconds - the_other.total_seconds).to_i.abs
123
+ end
124
+
125
+ def to_s(seconds=false)
126
+ time = self.to_t
127
+ format = (seconds ? "%I:%M:%S %p" : "%I:%M %p")
128
+ time.strftime(format).downcase
129
+ end
130
+
131
+ def nil?; @hour == 0 && @min == 0 && @sec == 0; end
132
+
133
+ end
134
+ end
@@ -6,7 +6,7 @@ module Barometer
6
6
  # gave the measurement data for a weather query, or the location
7
7
  # that was queried
8
8
  #
9
- class Location
9
+ class Data::Location
10
10
 
11
11
  attr_accessor :id, :name, :city
12
12
  attr_accessor :state_name, :state_code, :country, :country_code, :zip_code
@@ -16,5 +16,10 @@ module Barometer
16
16
  [@latitude, @longitude].join(',')
17
17
  end
18
18
 
19
+ def to_s
20
+ [@name, @city, @state_name || @state_cocde,
21
+ @country || @country_code].compact.join(', ')
22
+ end
23
+
19
24
  end
20
25
  end
@@ -12,34 +12,35 @@ module Barometer
12
12
  # - time_zone information (for the location in question)
13
13
  # - weather station information (for the station that gave collected the data)
14
14
  #
15
- class Measurement
15
+ class Data::Measurement
16
16
 
17
- # the weather service source
18
- attr_reader :source
19
- # current and forecasted data
17
+ attr_reader :source, :weight
18
+ attr_reader :measured_at, :utc_time_stamp
20
19
  attr_reader :current, :forecast
21
- attr_reader :timezone, :station, :location
22
- attr_reader :success, :time
23
- attr_accessor :metric
20
+ attr_reader :timezone, :station, :location, :links
21
+ attr_reader :success
22
+ attr_accessor :metric, :query, :format
24
23
 
25
24
  def initialize(source=nil, metric=true)
26
25
  @source = source
27
26
  @metric = metric
28
27
  @success = false
28
+ @weight = 1
29
+ @links = {}
29
30
  end
30
31
 
31
32
  def success!
32
- if current && current.temperature && !current.temperature.c.nil?
33
- @success = true
34
- end
33
+ current && current.temperature &&
34
+ !current.temperature.c.nil? && @success = true
35
35
  end
36
36
 
37
- def stamp!; @time = Time.now.utc; end
37
+ def stamp!; @utc_time_stamp = Time.now.utc; end
38
38
  def success?; @success; end
39
39
  def metric?; @metric; end
40
40
  def metric!; @metric=true; end
41
41
  def imperial!; @metric=false; end
42
42
 
43
+ #
43
44
  # this will tell us if the measurement is still current ... if it is still
44
45
  # current this means that the CurrentMeasurement can still used as now
45
46
  #
@@ -51,12 +52,17 @@ module Barometer
51
52
  # and then you want to know if self.windy?(5_hours_in_future) ... we could
52
53
  # not use the current data for this answser as the time 5_hours_in_future
53
54
  # is not current
54
- def current?(utc_time=Time.now.utc)
55
- return false unless @time
56
- raise ArgumentError unless utc_time.is_a?(Time)
55
+ #
56
+ def current?(local_time=nil)
57
+ current_at = ((self.current && self.current.current_at) ?
58
+ self.current.current_at : self.measured_at)
59
+
60
+ local_time = (local_time.nil? ? current_at : Data::LocalTime.parse(local_time))
61
+ return false unless local_time
62
+ raise ArgumentError unless local_time.is_a?(Data::LocalTime)
63
+
57
64
  hours_still_current = 4
58
- difference = (@time - utc_time).to_i
59
- difference = (difference*(-1)).to_i if difference < 0
65
+ difference = (local_time.diff(current_at)).to_i.abs
60
66
  difference <= (60*60*hours_still_current).to_i
61
67
  end
62
68
 
@@ -73,16 +79,18 @@ module Barometer
73
79
 
74
80
  # Format date into a Date class
75
81
  date = case date.class.name
76
- when 'String'
77
- Date.parse(date)
78
82
  when 'Date'
79
83
  date
80
- when 'DateTime'
81
- Date.new(date.year, date.month, date.day)
84
+ when 'Data::LocalDateTime'
85
+ date.to_d
86
+ when 'String'
87
+ Date.parse(date)
82
88
  when 'Time'
83
89
  Date.new(date.year, date.month, date.day)
90
+ when 'DateTime'
91
+ Date.new(date.year, date.month, date.day)
84
92
  end
85
-
93
+
86
94
  day = nil
87
95
  @forecast.each do |f|
88
96
  day = f if date == f.date
@@ -90,21 +98,24 @@ module Barometer
90
98
  return day
91
99
  end
92
100
 
101
+ #
102
+ # accesors (with input checking)
103
+ #
104
+
93
105
  def source=(source)
94
106
  raise ArgumentError unless source.is_a?(Symbol)
95
107
  @source = source
96
108
  end
97
109
 
98
- def time=(time=Time.now.utc)
110
+ def utc_time_stamp=(time=Time.now.utc)
99
111
  raise ArgumentError unless time.is_a?(Time)
100
- @time = time
112
+ @utc_time_stamp = time
101
113
  end
102
114
 
103
115
  def current=(current)
104
- raise ArgumentError unless current.is_a?(Barometer::CurrentMeasurement)
116
+ raise ArgumentError unless current.is_a?(Data::CurrentMeasurement)
105
117
  @current = current
106
118
  self.stamp!
107
- # self-determine success
108
119
  self.success!
109
120
  end
110
121
 
@@ -114,47 +125,65 @@ module Barometer
114
125
  end
115
126
 
116
127
  def timezone=(timezone)
117
- #raise ArgumentError unless timezone.is_a?(String)
118
- raise ArgumentError unless timezone.is_a?(Barometer::Zone)
128
+ raise ArgumentError unless timezone.is_a?(Data::Zone)
119
129
  @timezone = timezone
120
130
  end
121
131
 
122
132
  def station=(station)
123
- raise ArgumentError unless station.is_a?(Barometer::Location)
133
+ raise ArgumentError unless station.is_a?(Data::Location)
124
134
  @station = station
125
135
  end
126
136
 
127
137
  def location=(location)
128
- raise ArgumentError unless location.is_a?(Barometer::Location)
138
+ raise ArgumentError unless location.is_a?(Data::Location)
129
139
  @location = location
130
140
  end
131
141
 
142
+ def weight=(weight)
143
+ raise ArgumentError unless weight.is_a?(Fixnum)
144
+ @weight = weight
145
+ end
146
+
147
+ def links=(links)
148
+ raise ArgumentError unless links.is_a?(Hash)
149
+ @links = links
150
+ end
151
+
152
+ def measured_at=(measured_at)
153
+ raise ArgumentError unless measured_at.is_a?(Data::LocalTime)
154
+ @measured_at = measured_at
155
+ end
156
+
132
157
  #
133
158
  # simple questions
134
159
  # pass questions to the source
135
160
  #
136
161
 
137
- def windy?(threshold=10, utc_time=Time.now.utc)
162
+ def windy?(threshold=10, time_string=nil)
163
+ local_datetime = Data::LocalDateTime.parse(time_string) if time_string
138
164
  raise ArgumentError unless (threshold.is_a?(Fixnum) || threshold.is_a?(Float))
139
- raise ArgumentError unless utc_time.is_a?(Time)
140
- Barometer::Service.source(@source).windy?(self, threshold, utc_time)
165
+ raise ArgumentError unless (local_datetime.is_a?(Data::LocalDateTime) || local_datetime.nil?)
166
+ Barometer::WeatherService.source(@source).windy?(self, threshold, local_datetime)
141
167
  end
142
168
 
143
- def wet?(threshold=50, utc_time=Time.now.utc)
169
+ def wet?(threshold=50, time_string=nil)
170
+ local_datetime = Data::LocalDateTime.parse(time_string) if time_string
144
171
  raise ArgumentError unless (threshold.is_a?(Fixnum) || threshold.is_a?(Float))
145
- raise ArgumentError unless utc_time.is_a?(Time)
146
- Barometer::Service.source(@source).wet?(self, threshold, utc_time)
172
+ raise ArgumentError unless (local_datetime.is_a?(Data::LocalDateTime) || local_datetime.nil?)
173
+ Barometer::WeatherService.source(@source).wet?(self, threshold, local_datetime)
147
174
  end
148
175
 
149
- def day?(utc_time=Time.now.utc)
150
- raise ArgumentError unless utc_time.is_a?(Time)
151
- Barometer::Service.source(@source).day?(self, utc_time)
176
+ def day?(time_string=nil)
177
+ local_datetime = Data::LocalDateTime.parse(time_string) if time_string
178
+ raise ArgumentError unless (local_datetime.is_a?(Data::LocalDateTime) || local_datetime.nil?)
179
+ Barometer::WeatherService.source(@source).day?(self, local_datetime)
152
180
  end
153
181
 
154
- def sunny?(utc_time=Time.now.utc)
155
- raise ArgumentError unless utc_time.is_a?(Time)
156
- return false if self.day?(utc_time) == false
157
- Barometer::Service.source(@source).sunny?(self, utc_time)
182
+ def sunny?(time_string=nil)
183
+ local_datetime = Data::LocalDateTime.parse(time_string) if time_string
184
+ raise ArgumentError unless (local_datetime.is_a?(Data::LocalDateTime) || local_datetime.nil?)
185
+ return false if self.day?(local_datetime) == false
186
+ Barometer::WeatherService.source(@source).sunny?(self, local_datetime)
158
187
  end
159
188
 
160
189
  end