weatheruby 0.6.1 → 1.0.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: ef81a1f522c927a6742c86c1ad121d10f912c01d
4
- data.tar.gz: a61998454d2e9f01d8142bf0e32afc7dbc9e1f7a
3
+ metadata.gz: 217f72114c4d922e058e95acda948b549ba8a91e
4
+ data.tar.gz: 8084acda49e9aad4bddb921d32b45c9e17cffe6d
5
5
  SHA512:
6
- metadata.gz: 2899edb7672c61f8879eeb9fb7496695fa31773a4694cfc8df6ccef9daf0fdc69e0833be75067fb85230db6c7cdabe56af667586861a5d4fe5c7da279f01d04e
7
- data.tar.gz: 440bf75169474ae8a3a4311890a002a3796221a1f7e3308367192efbce2944d71b285823986cd3fec37aa6a8ecf1f59fde1380ee1c8a98e3ae0ebb021aabd060
6
+ metadata.gz: 1a40e220d7f4491383c53da7784f51b569ea491e0d4c35e402ca0073f63b4799e5a054d956a88edc1f49101e7c32552a9e999e160b703cf37fcbe1d79ecbb7f2
7
+ data.tar.gz: cfb1aeeac85b2334f7b35f5f0413f22d1a6c7d0682ffbeac8f88003f540a5a258da85475bb5805c5366dbdced6b1d71f5b1de2f423be3ec2e2fac7fb97d30951
data/CHANGELOG.md CHANGED
@@ -1,5 +1,20 @@
1
1
  # Changelog
2
+
3
+ ## Version 1
4
+
5
+ ### Version 1.0.0
6
+ * New `#sun_info` method for sunset/sunrise times
7
+ * Add `:image_url` to simple forecast return hash
8
+ * Add `:date`, `:weekday_name`, and `:image_url` to complex forecast return data
9
+ * Improve documentation across the library. The recommended place for docs is now
10
+ [GitHub Pages](http://elifoster.github.io/weatheruby/) instead of RubyDocs.info
11
+ * `#get` is now private
12
+ * Remove `autoparse` parameter from `#get`
13
+ * Fix `#hurricane_data` by ignoring the `WeatherError` thrown by that API
14
+ * Return `Time` and `DateTime` objects instead of `String`s for timestamp values across the library.
15
+
2
16
  ## Version 0
17
+
3
18
  ### Version 0.6.1
4
19
  * Update to StringUtility 3.0
5
20
 
@@ -1,10 +1,17 @@
1
+ require 'time'
2
+
1
3
  module Weather
2
4
  module Actions
3
5
  # Gets alert information for a location.
4
6
  # @param location [String] The place to get the alert data for.
5
- # @return [Hash/String] Nil if there are no alerts, or a hash of hashes
6
- # containing relevant data if not. Each array in the hash contains
7
- # information for a different alert.
7
+ # @return [Array<Hash<Symbol, String>>] A list of alerts for the given location. The array will be empty if there
8
+ # are no alerts. Each value in the array is a hash containing symbol keys:
9
+ #
10
+ # * `:type` (`String`) — The 3 character identifier for the alert type (see Wunderground API docs)
11
+ # * `:description` (`String`) — The full name of the alert type
12
+ # * `:date` (`Time`) — The date that the alert begins to take effect, using the local timezone to this location.
13
+ # * `:expires` (`Time`) — The date that the alert is no longer in effect, using the local timezone to this location.
14
+ # * `:message` (`String`) — The full message for the alert (this is usually dozens of paragraphs long)
8
15
  def alerts(location)
9
16
  response = get('alerts', location)
10
17
  ret = []
@@ -13,8 +20,8 @@ module Weather
13
20
  ret[count] = {
14
21
  type: a['type'],
15
22
  description: a['description'],
16
- date: a['date'],
17
- expires: a['expires'],
23
+ date: Time.parse(a['date']),
24
+ expires: Time.parse(a['expires']),
18
25
  message: a['message']
19
26
  }
20
27
  count += 1
@@ -25,9 +32,9 @@ module Weather
25
32
 
26
33
  # Gets the current moon phase of the location.
27
34
  # @param location [String] The place to get the phase for.
28
- # @return [Hash/String] A hash of two integers for the moon phase
29
- # information. The age key in the hash contains the moon's age in days,
30
- # and the illumination key contains the percentage of how illuminated it
35
+ # @return [Hash<Symbol, Integer>] A hash of two integers for the moon phase
36
+ # information. The `:age` key in the hash contains the moon's age in days,
37
+ # and the `:illumination` key contains the percentage of how illuminated it
31
38
  # is.
32
39
  def moon_phase(location)
33
40
  response = get('astronomy', location)
@@ -37,9 +44,54 @@ module Weather
37
44
  }
38
45
  end
39
46
 
47
+ # Gets sunrise and sunset information for the current day at the current location.
48
+ # @param location [String] The place to get the info for.
49
+ # @return [Hash<Symbol, Hash<Symbol, Integer>>] A hash containing two hashes at keys :rise and :set for sunrise
50
+ # and sunset information respectively. They each contain an :hour key and a :minute key which point to the hour
51
+ # and minute that the sun will rise or set.
52
+ def sun_info(location)
53
+ response = get('astronomy', location)
54
+ {
55
+ rise: {
56
+ hour: response['moon_phase']['sunrise']['hour'].to_i,
57
+ minute: response['moon_phase']['sunrise']['minute'].to_i
58
+ },
59
+ set: {
60
+ hour: response['moon_phase']['sunset']['hour'].to_i,
61
+ minute: response['moon_phase']['sunset']['minute'].to_i
62
+ }
63
+ }
64
+ end
65
+
40
66
  # Gets weather conditions for the location.
41
67
  # @param location [String] The place to get the weather report for.
42
- # @return [Hash] A hash containing strings of relevant weather information.
68
+ # @return [Hash<Symbol, Object>] A hash containing strings of relevant weather information. It contains the
69
+ # following keys:
70
+ #
71
+ # * `:full_name` (`String`) — The full name of the location
72
+ # * `:city_name` (`String`) — The name of the city
73
+ # * `:state_abbreviation` (`String`) — The abbreviation for the state (or national equivalent)
74
+ # * `:state_name` (`String`) — The name of the state (or national equivalent)
75
+ # * `:country` (`String`) — The name of the country
76
+ # * `:zip_code` (`Integer`) — The zip code for this location
77
+ # * `:updated` (`String`) — A string describing the date for when this data was last updated.
78
+ # * `:weather` (`String`) — A brief description of the current weather conditions in this location (e.g., Partly
79
+ # Cloudy)
80
+ # * `:formatted_temperature` (`String`) — The formatted temperature as provided by the API. It does not contain °
81
+ # symbols. Its format is "XX F (YY C)"
82
+ # * `:temperature_f` (`Float`) — The current temperature in fahrenheit
83
+ # * `:temperature_c` (`Float`) — The current temperature in celsius
84
+ # * `:humidity` (`Integer`) — The humidity percentage
85
+ # * `:formatted_wind` (`String`) — A brief description of the current wind conditions (e.g., Calm)
86
+ # * `:wind_direction` (`String`) — The direction (East, West, etc.) that the wind is blowing
87
+ # * `:wind_degrees` (`Integer`) — The angle of the wind
88
+ # * `:wind_speed` (`Float`) — The speed of the wind in miles per hour
89
+ # * `:wind_gust_speed` (`Integer`) — The speed of the gusts of wind in miles per hour
90
+ # * `:formatted_feelslike` (`String`) — The formatted string for the "feels like" temperature data as provided
91
+ # by the API. See :formatted_temperature for the format.
92
+ # * `:feelslike_f` (`Integer`) — The temperature that it feels like (not always the same as the temperature it
93
+ # is) in fahrenheit
94
+ # * `:feelslike_c` (`Integer`) — Like feelslike_f but in celsius
43
95
  def conditions(location)
44
96
  response = get('conditions', location)
45
97
  current_observation = response['current_observation']
@@ -75,7 +127,13 @@ module Weather
75
127
 
76
128
  # Gets the record low for the location.
77
129
  # @param location [String] The place to get the record low for.
78
- # @return [Hash] A hash containing a few integers of data.
130
+ # @return [Hash<Symbol, Integer>] A hash containing a few integers of data:
131
+ #
132
+ # * `:average_low_f` (`Integer`) — The average low temperature in this location in fahrenheit
133
+ # * `:average_low_c` (`Integer`) — The average low temperature in this location in celsius
134
+ # * `:record_year` (`Integer`) — The year in which this location had its lowest temperatures
135
+ # * `:record_low_f` (`Integer`) — The lowest temperature this location has had in fahrenheit
136
+ # * `:record_low_c` (`Integer`) — The lowest temperature this location has had in celsius
79
137
  def record_low(location)
80
138
  response = get('almanac', location)
81
139
  {
@@ -89,7 +147,13 @@ module Weather
89
147
 
90
148
  # Gets the record high for the location.
91
149
  # @param location [String] The place to get the record high for.
92
- # @return [Hash] A hash containing a few integers of data.
150
+ # @return [Hash<Symbol, Integer>] A hash containing a few integers of data:
151
+ #
152
+ # * `:average_high_f` (`Integer`) — The average high temperature in this location in fahrenheit
153
+ # * `:average_high_c` (`Integer`) — The average high temperature in this location in celsius
154
+ # * `:record_year` (`Integer`) — The year in which this location had its highest temperatures
155
+ # * `:record_high_f` (`Integer`) — The highest temperature this location has had in fahrenheit
156
+ # * `:record_high_c` (`Integer`) — The highest temperature this location has had in celsius
93
157
  def record_high(location)
94
158
  response = get('almanac', location)
95
159
  {
@@ -101,11 +165,30 @@ module Weather
101
165
  }
102
166
  end
103
167
 
104
- # Gets data for currently-happening hurricanes around the world.
105
- # @return [Hash] A hash containing hashes of data. Each sub-hash is named
106
- # as the "nice" name for the hurricane (example: Hurricane Daniel).
168
+ # Gets data for currently-happening storms around the world.
169
+ # @return [Hash<String, Hash<Symbol, String/Integer>>] A hash containing hashes of data. Each sub-hash is named
170
+ # as the name for the storm including the type (example: Hurricane Daniel). The sub-hash values are as follows:
171
+ #
172
+ # * `:name` (`String`) — The name of the hurricane (example: Daniel)
173
+ # * `:number` (`String`) — The ID of the storm, 8 characters with a 2 letter basin ID.
174
+ # * `:category` (`String`) — The type of storm according to the Saffir-Simpson scale.
175
+ # * `:time` (`Time`) — The time the storm is recorded to start or have started using the local timezone for this
176
+ # location.
177
+ # * `:wind_speed_mph` (`Integer`) — The speed of the wind in this storm in miles per hour.
178
+ # * `:wind_speed_kts` (`Integer`) — The speed of the wind in this storm in knots.
179
+ # * `:wind_speed_kph` (`Integer`) — The speed of the wind in this storm in kilometers per hour.
180
+ # * `:gust_speed_mph` (`Integer`) — The speed of the gusts of wind in this storm in miles per hour.
181
+ # * `:gust_speed_kts` (`Integer`) — The speed of the gusts of wind in this storm in knots.
182
+ # * `:gust_speed_kph` (`Integer`) — The speed of the gusts of wind in this storm in kilometers per hour.
107
183
  def hurricane_data
108
- response = get('currenthurricane', 'view')
184
+ begin
185
+ response = get('currenthurricane', 'view')
186
+ rescue Weatheruby::WeatherError => e
187
+ # For some reason the API always errors with this when getting current hurricane data.
188
+ fail e unless e.message.start_with?('querynotfound')
189
+ response = e.full_response
190
+ end
191
+ p response
109
192
 
110
193
  ret = {}
111
194
  response['currenthurricane'].each do |h|
@@ -113,7 +196,7 @@ module Weather
113
196
  name: h['stormInfo']['stormName'],
114
197
  number: h['stormInfo']['stormNumber'],
115
198
  category: h['Current']['Category'],
116
- time: h['Current']['Time']['pretty'],
199
+ time: Time.parse(h['Current']['Time']['pretty']),
117
200
  wind_speed_mph: h['Current']['WindSpeed']['Mph'],
118
201
  wind_speed_kts: h['Current']['WindSpeed']['Kts'],
119
202
  wind_speed_kph: h['Current']['WindSpeed']['Kph'],
@@ -139,30 +222,29 @@ module Weather
139
222
  parse_simple_forecast(response)
140
223
  end
141
224
 
142
- # Gets more complicated forecast information for the location. Only gets
143
- # the forecast for the next three days.
225
+ # Gets more complicated forecast information for the location. Only gets the forecast for the next three days.
144
226
  # @param location [String] The place to get the forecast for.
145
- # @return [Hash] A hash containing hashes of information. Sub-hashes are
146
- # named as their "period", or the day in relation to the current day.
147
- # For example: 0 is today, 1 is tomorrow, etc. It does not organize itself
148
- # by weekday. Unlike simple_forecast, you do not get very many strings in
149
- # this method.
227
+ # @return [Hash] A hash containing hashes of information. Sub-hashes are named as their "period", or the day in
228
+ # relation to the current day. For example: 0 is today, 1 is tomorrow, etc. It does not organize itself by
229
+ # weekday. Unlike simple_forecast, you do not get very many strings in this method.
150
230
  def complex_forecast(location)
151
231
  response = get('forecast', location)
152
232
 
153
233
  parse_complex_forecast(response)
154
234
  end
155
235
 
156
- # Exactly the same as #simple_forecast, except that it gets the data for
157
- # 10 days.
236
+ # Exactly the same as {#simple_forecast}, except that it gets the data for 10 days.
237
+ # @param (see #simple_forecast)
238
+ # @return (see #simple_forecast)
158
239
  def simple_forecast_10day(location)
159
240
  response = get('forecast10day', location)
160
241
 
161
242
  parse_simple_forecast(response)
162
243
  end
163
244
 
164
- # Exactly the same as #complex_forecast, except that it gets the data for
165
- # 10 days.
245
+ # Exactly the same as {#complex_forecast}, except that it gets the data for 10 days.
246
+ # @param (see #complex_forecast)
247
+ # @return (see #complex_forecast)
166
248
  def complex_forecast_10day(location)
167
249
  response = get('forecast10day', location)
168
250
 
@@ -179,7 +261,8 @@ module Weather
179
261
  ret[f['period']] = {
180
262
  weekday_name: f['title'],
181
263
  text: f['fcttext'],
182
- text_metric: f['fcttext_metric']
264
+ text_metric: f['fcttext_metric'],
265
+ image_url: f['icon_url']
183
266
  }
184
267
  end
185
268
 
@@ -191,12 +274,16 @@ module Weather
191
274
  ret = {}
192
275
 
193
276
  response['forecast']['simpleforecast']['forecastday'].each do |f|
277
+ date = f['date']
194
278
  ret[f['period'] - 1] = {
279
+ date: DateTime.new(date['year'], date['month'], date['day'], date['hour'], date['min'].to_i, date['sec'], date['tz_short']),
280
+ weekday_name: date['weekday'],
195
281
  high_f: f['high']['fahrenheit'].to_i,
196
282
  high_c: f['high']['celsius'].to_i,
197
283
  low_f: f['low']['fahrenheit'].to_i,
198
284
  low_c: f['low']['celsius'].to_i,
199
285
  conditions: f['conditions'].to_i,
286
+ image_url: f['icon_url'],
200
287
  snow: {
201
288
  snow_total_in: f['snow_allday']['in'],
202
289
  snow_total_cm: f['snow_allday']['cm'],
@@ -1,122 +1,140 @@
1
1
  module Weather
2
2
  module Planner
3
3
  # Gets the chance of snow within the date range.
4
- # @see #get_planner_response
4
+ # @param (see #get_planner_response)
5
+ # @return (see #get_chance_of)
5
6
  def chance_of_snow(start_date, end_date, location)
6
7
  get_chance_of('chanceofsnowday', start_date, end_date, location)
7
8
  end
8
9
 
9
10
  # Gets the chance of hail within the date range.
10
- # @see #get_planner_response
11
+ # @param (see #get_planner_response)
12
+ # @return (see #get_chance_of)
11
13
  def chance_of_hail(start_date, end_date, location)
12
14
  get_chance_of('chanceofhailday', start_date, end_date, location)
13
15
  end
14
16
 
15
17
  # Gets the chance of temperatures above 0 C/32 F within the date range.
16
- # @see #get_planner_response
18
+ # @param (see #get_planner_response)
19
+ # @return (see #get_chance_of)
17
20
  def chance_of_not_freezing(start_date, end_date, location)
18
21
  get_chance_of('tempoverfreezing', start_date, end_date, location)
19
22
  end
20
23
 
21
24
  # Gets the chance of temperatures below 0 C/32 F within the date range.
22
- # @see #get_planner_response
25
+ # @param (see #get_planner_response)
26
+ # @return (see #get_chance_of)
23
27
  def chance_of_freezing(start_date, end_date, location)
24
28
  get_chance_of('tempbelowfreezing', start_date, end_date, location)
25
29
  end
26
30
 
27
31
  # Gets chance of sultry within the date range.
28
- # @see #get_planner_response
32
+ # @param (see #get_planner_response)
33
+ # @return (see #get_chance_of)
29
34
  def chance_of_sultry(start_date, end_date, location)
30
35
  get_chance_of('chanceofsultryday', start_date, end_date, location)
31
36
  end
32
37
 
33
38
  # Gets the chance of a tornado within the date range.
34
- # @see #get_planner_response
39
+ # @param (see #get_planner_response)
40
+ # @return (see #get_chance_of)
35
41
  def chance_of_tornado(start_date, end_date, location)
36
42
  get_chance_of('chanceoftornadoday', start_date, end_date, location)
37
43
  end
38
44
 
39
45
  # Gets the chance of snow on the ground within the date range.
40
- # @see #get_planner_response
46
+ # @param (see #get_planner_response)
47
+ # @return (see #get_chance_of)
41
48
  def chance_of_groundsnow(start_date, end_date, location)
42
49
  get_chance_of('chanceofsnowonground', start_date, end_date, location)
43
50
  end
44
51
 
45
52
  # Gets the chance of thunderstorms within the date range.
46
- # @see #get_planner_response
53
+ # @param (see #get_planner_response)
54
+ # @return (see #get_chance_of)
47
55
  def chance_of_thunderstorms(start_date, end_date, location)
48
56
  get_chance_of('chanceofthunderday', start_date, end_date, location)
49
57
  end
50
58
 
51
59
  # Gets the chance of temperatures above 32.2 C/90 F within the date range.
52
- # @see #get_planner_response
60
+ # @param (see #get_planner_response)
61
+ # @return (see #get_chance_of)
53
62
  def chance_of_heat(start_date, end_date, location)
54
63
  get_chance_of('tempoverninety', start_date, end_date, location)
55
64
  end
56
65
 
57
66
  # Gets the chance of rain within the date range.
58
- # @see #get_planner_response
67
+ # @param (see #get_planner_response)
68
+ # @return (see #get_chance_of)
59
69
  def chance_of_rain(start_date, end_date, location)
60
70
  get_chance_of('chanceofrainday', start_date, end_date, location)
61
71
  end
62
72
 
63
73
  # Gets the chance of precipitation within the date range.
64
- # @see #get_planner_response
74
+ # @param (see #get_planner_response)
75
+ # @return (see #get_chance_of)
65
76
  def chance_of_precipitation(start_date, end_date, location)
66
77
  get_chance_of('chanceofprecip', start_date, end_date, location)
67
78
  end
68
79
 
69
80
  # Gets the chance of humidity within the date range.
70
- # @see #get_planner_response
81
+ # @param (see #get_planner_response)
82
+ # @return (see #get_chance_of)
71
83
  def chance_of_humid(start_date, end_date, location)
72
84
  get_chance_of('chanceofhumidday', start_date, end_date, location)
73
85
  end
74
86
 
75
87
  # Gets the chance of fog within the date range.
76
- # @see #get_planner_response
88
+ # @param (see #get_planner_response)
89
+ # @return (see #get_chance_of)
77
90
  def chance_of_fog(start_date, end_date, location)
78
91
  get_chance_of('chanceoffogday', start_date, end_date, location)
79
92
  end
80
93
 
81
94
  # Gets the chance of cloudy conditions within the date range.
82
- # @see #get_planner_response
95
+ # @param (see #get_planner_response)
96
+ # @return (see #get_chance_of)
83
97
  def chance_of_cloudy(start_date, end_date, location)
84
98
  get_chance_of('chanceofcloudyday', start_date, end_date, location)
85
99
  end
86
100
 
87
101
  # Gets the chance of sunshine within the date range.
88
- # @see #get_planner_response
102
+ # @param (see #get_planner_response)
103
+ # @return (see #get_chance_of)
89
104
  def chance_of_sunny(start_date, end_date, location)
90
105
  get_chance_of('chanceofsunnycloudyday', start_date, end_date, location)
91
106
  end
92
107
 
93
108
  # Gets the chance of partially cloudy conditions within the date range.
94
- # @see #get_planner_response
109
+ # @param (see #get_planner_response)
110
+ # @return (see #get_chance_of)
95
111
  def chance_of_partlycloudy(start_date, end_date, location)
96
112
  get_chance_of('chanceofpartlycloudyday', start_date, end_date, location)
97
113
  end
98
114
 
99
115
  # Gets the chance of high winds within the date range.
100
- # @see #get_planner_response
116
+ # @param (see #get_planner_response)
117
+ # @return (see #get_chance_of)
101
118
  def chance_of_high_wind(start_date, end_date, location)
102
119
  get_chance_of('chanceofwindyday', start_date, end_date, location)
103
120
  end
104
121
 
105
122
  # Gets the chance of a temperature of 15.5 C/60 F within the date range.
106
- # @see #get_planner_response
123
+ # @param (see #get_planner_response)
124
+ # @return (see #get_chance_of)
107
125
  def chance_of_warmth(start_date, end_date, location)
108
126
  get_chance_of('tempoversixty', start_date, end_date, location)
109
127
  end
110
128
 
111
129
  # Gets the dewpoint highs and lows for the date range.
112
- # @see #get_planner_response
113
- # @return [Hash] Highs and lows minimum, average, and maximum for both
130
+ # @param (see #get_planner_response)
131
+ # @return [Hash<Symbol, Hash<Symbol, Hash<Symbol, Integer>>>] Highs and lows minimum, average, and maximum for both
114
132
  # metric and imperial systems.
115
133
  # @return [String] The error if possible.
134
+ # @todo Raise an error instead of returning a String.
116
135
  def get_dewpoints(start_date, end_date, location)
117
136
  response = get_planner_response(start_date, end_date, location)
118
- return response['response']['error'] unless
119
- response['response']['error'].nil?
137
+ return response['response']['error'] unless response['response']['error'].nil?
120
138
  highs = response['trip']['dewpoint_high']
121
139
  lows = response['trip']['dewpoint_low']
122
140
 
@@ -150,9 +168,10 @@ module Weather
150
168
 
151
169
  # Gets the precipitation amounts (not chance) for the date range.
152
170
  # @see #get_planner_response
153
- # @return [Hash] Minimum, maximum, and average precipitation quantities for
171
+ # @return [Hash<Symbol, Hash<Symbol, Integer>>] Minimum, maximum, and average precipitation quantities for
154
172
  # the location in both inches and centimeters.
155
173
  # @return [String] The error if possible.
174
+ # @todo Raise an error instead of returning a String.
156
175
  def get_precipitation(start_date, end_date, location)
157
176
  response = get_planner_response(start_date, end_date, location)
158
177
  return response['response']['error'] unless
@@ -179,7 +198,7 @@ module Weather
179
198
 
180
199
  # Gets the highs and lows for the date range.
181
200
  # @see #get_planner_response
182
- # @return [Hash] Highs and lows minimum, average, and maximum for both
201
+ # @return [Hash<Symbol, Hash<Symbol, Hash<Symbol, Integer>>>] Highs and lows minimum, average, and maximum for both
183
202
  # metric and imperial systems.
184
203
  def get_temperatures(start_date, end_date, location)
185
204
  response = get_planner_response(start_date, end_date, location)
@@ -217,25 +236,20 @@ module Weather
217
236
  private
218
237
 
219
238
  # Gets the full planner API response.
220
- # @param start_date [DateTime] The date to start at. Only month and day
221
- # actually matter.
222
- # @param end_date [DateTime] The date to end at. Only month and day actually
223
- # matter.
239
+ # @param start_date [DateTime] The date to start at. Only month and day actually matter.
240
+ # @param end_date [DateTime] The date to end at. Only month and day actually matter.
224
241
  # @param location [String] The location to get the planner data for.
225
242
  # @since 0.5.0
226
- # @return [Hash] (see {Weatheruby#get #get})
243
+ # @return (see Weatheruby#get)
227
244
  def get_planner_response(start_date, end_date, location)
228
245
  start = start_date.strftime('%m%d')
229
246
  final = end_date.strftime('%m%d')
230
247
  get("planner_#{start}#{final}", location)
231
248
  end
232
249
 
233
- # Gets the chance of any given string key in the chance_of hash returned by
234
- # get_planner_response.
250
+ # Gets the chance of any given string key in the chance_of hash returned by {#get_planner_response}.
235
251
  # @param subject [String] The chance_of hash's key.
236
- # @param start_date [DateTime] (see {#get_planner_response})
237
- # @param end_date [DateTime] (see {#get_planner_response})
238
- # @param location [String] (see {#get_planner_response})
252
+ # @param (see #get_planner_response)
239
253
  # @since 0.5.0
240
254
  # @return [Integer] The chance of the subject happening.
241
255
  def get_chance_of(subject, start_date, end_date, location)
data/lib/weatheruby.rb CHANGED
@@ -3,8 +3,22 @@ require 'json'
3
3
  require_relative 'weather/actions'
4
4
  require_relative 'weather/planner'
5
5
 
6
+ # @todo Return proper objects instead of ugly hashes throughout the library
6
7
  class Weatheruby
7
- class WeatherError < StandardError; end
8
+ class WeatherError < StandardError
9
+ # @return [Hash] The full parsed HTTP response
10
+ attr_reader :full_response
11
+
12
+ def initialize(json, type, description)
13
+ @full_response = json
14
+ @type = type
15
+ @description = description
16
+ end
17
+
18
+ def message
19
+ "#{@type}: #{@description}"
20
+ end
21
+ end
8
22
 
9
23
  include Weather::Actions
10
24
  include Weather::Planner
@@ -25,29 +39,25 @@ class Weatheruby
25
39
  @client = HTTPClient.new
26
40
  end
27
41
 
42
+ private
43
+
28
44
  # Performs a generic HTTP GET request. This method should generally not be used by a standard user, unless there is
29
45
  # not a method for a particular action/feature.
30
46
  # @param feature [String] The "feature" parameter defined by Wunderground.
31
47
  # @param location [String] The location of the query.
32
- # @param autoparse [Boolean] Whether to automatically parse the response.
33
- # @return [Hash/HTTPMessage] Parsed JSON if autoparse is true, or raw response if not.
34
- # @raise WeatherError if anything goes wrong with the API, or it returns too many results for us to handle.
35
- def get(feature, location, autoparse = true)
36
- url = "http://api.wunderground.com/api/#{@api_key}/#{feature}/lang:" \
37
- "#{@language_key}/pws:#{@use_pws}/bestfct:#{@use_bestfct}/q/" \
38
- "#{location}.json"
39
- url = URI.encode(url)
40
- uri = URI.parse(url)
41
- res = @client.get(uri)
42
- json = JSON.parse(res.body)
48
+ # @return [Hash] Parsed JSON response
49
+ # @raise [WeatherError] If anything goes wrong with the API, or it returns too many results for us to handle.
50
+ def get(feature, location)
51
+ url = "http://api.wunderground.com/api/#{@api_key}/#{feature}/lang:#{@language_key}/pws:#{@use_pws}/bestfct:#{@use_bestfct}/q/#{location}.json"
52
+ json = JSON.parse(@client.get(URI.parse(URI.encode(url))).body)
43
53
  if json['response'].key?('error')
44
- fail(WeatherError, json['response']['error']['type'] + ': ' + json['response']['error']['description'].capitalize)
54
+ error = json['response']['error']
55
+ fail(WeatherError.new(json, error['type'], error['description'].capitalize))
45
56
  end
46
57
  if json['response'].key?('results')
47
- fail(WeatherError, 'toomanyresults: Too many results were returned. Try narrowing your search.')
58
+ fail(WeatherError.new(json, 'toomanyresults', 'Too many results were returned. Try narrowing your search.'))
48
59
  end
49
60
 
50
-
51
- autoparse ? json : res
61
+ json
52
62
  end
53
63
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: weatheruby
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.1
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Eli Foster
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-03-01 00:00:00.000000000 Z
11
+ date: 2017-07-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: httpclient
@@ -86,7 +86,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
86
86
  version: '0'
87
87
  requirements: []
88
88
  rubyforge_project:
89
- rubygems_version: 2.6.8
89
+ rubygems_version: 2.6.10
90
90
  signing_key:
91
91
  specification_version: 4
92
92
  summary: A Ruby gem for accessing the Weather Underground API.