weatheruby 0.3.1 → 0.4.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 +4 -4
- data/CHANGELOG.md +5 -0
- data/bin/weatheruby +89 -0
- data/lib/weather/actions.rb +81 -80
- data/lib/weatheruby.rb +6 -2
- metadata +34 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 080f4dae1ac613cf073d26a558b44df9c9e8cc60
|
4
|
+
data.tar.gz: f222373bc209df14fb962f995ab6a102151670e5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 488fd79edc6c949452c50754a0e24d7598a311f20a969279cbe8bbc02541b09d9b6fcf40c797cb879be6967a43f2eed98f9e0ede18cd1ea6c116ac428db47a9c
|
7
|
+
data.tar.gz: 4a5d071ac7d746646c927f479165970bd3e813ab4e9229c200a3b4c3c0e550f1e4a3a0c833bc3e1f51b0e80abc272d0e5263820bfaac48def1249c43baae1baa
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,10 @@
|
|
1
1
|
# Changelog
|
2
2
|
## Version 0
|
3
|
+
### Version 0.4.0
|
4
|
+
* New weatheruby executable.
|
5
|
+
* Fail when there are many results and it cannot get actual data.
|
6
|
+
* Many style fixes.
|
7
|
+
|
3
8
|
### Version 0.3.1
|
4
9
|
* Fix forecast names to 10day, and made it apparent in documentation that the non-10 day methods are only for the next 3 days.
|
5
10
|
|
data/bin/weatheruby
ADDED
@@ -0,0 +1,89 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# encoding: utf-8
|
3
|
+
|
4
|
+
path = File.expand_path('../lib', __FILE__)
|
5
|
+
$LOAD_PATH.unshift(path)
|
6
|
+
|
7
|
+
require 'rainbow'
|
8
|
+
require 'string-utility'
|
9
|
+
require_relative '../lib/weatheruby'
|
10
|
+
|
11
|
+
fail ArgumentError if ARGV.empty?
|
12
|
+
|
13
|
+
@args = {
|
14
|
+
help: false,
|
15
|
+
verbose: false,
|
16
|
+
token: nil,
|
17
|
+
location: nil,
|
18
|
+
language: 'EN'
|
19
|
+
}
|
20
|
+
|
21
|
+
usage = 'Usage: weatheruby [t] token [-l] [-j] languagecode [-v] [-h]'
|
22
|
+
help = "-h, --help Show helpful information about Weatheruby usage\n" \
|
23
|
+
"-v, --verbose Output verbose errors\n" \
|
24
|
+
"-t, --token The token to log in as\n" \
|
25
|
+
"-l, --location The location to get weather data for\n" \
|
26
|
+
'-j, --language The language code to use'
|
27
|
+
|
28
|
+
ARGV.each do |arg|
|
29
|
+
case arg
|
30
|
+
when '-t', '--token' then @args[:token] = ARGV.at(ARGV.index(arg) + 1)
|
31
|
+
when '-h', '--help' then @args[:help] = true
|
32
|
+
when '-l', '--location' then @args[:location] = ARGV.at(ARGV.index(arg) + 1)
|
33
|
+
when '-v', '--verbose' then @args[:verbose] = true
|
34
|
+
when '-j', '--language' then @args[:language] = ARGV.at(ARGV.index(arg) + 1)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
if @args[:help]
|
39
|
+
puts usage
|
40
|
+
puts help
|
41
|
+
exit
|
42
|
+
end
|
43
|
+
|
44
|
+
if @args[:token].nil? || @args[:location].nil?
|
45
|
+
puts usage
|
46
|
+
exit
|
47
|
+
end
|
48
|
+
|
49
|
+
client = Weatheruby.new(@args[:token],
|
50
|
+
@args[:language],
|
51
|
+
true,
|
52
|
+
true,
|
53
|
+
@args[:verbose])
|
54
|
+
|
55
|
+
conditions = client.conditions(@args[:location])
|
56
|
+
moon = client.moon_phase(@args[:location])
|
57
|
+
alerts = client.alerts(@args[:location])
|
58
|
+
forecast = client.simple_forecast_10day(@args[:location])
|
59
|
+
|
60
|
+
location = Rainbow(@args[:location]).color(StringUtility.random_color_six)
|
61
|
+
updated = Rainbow(conditions[:updated]).magenta
|
62
|
+
weather = Rainbow(conditions[:weather]).color(StringUtility.random_color_six)
|
63
|
+
temp = Rainbow(conditions[:formatted_temperature].to_s).cyan
|
64
|
+
humidity = Rainbow(conditions[:humidity].to_s).cyan
|
65
|
+
wind = Rainbow(conditions[:formatted_wind]).green
|
66
|
+
feels = Rainbow(conditions[:formatted_feelslike]).yellow
|
67
|
+
age = Rainbow(moon[:age].to_s).white
|
68
|
+
illum = Rainbow("#{moon[:illumination]} %").white
|
69
|
+
|
70
|
+
puts "Getting weather data for #{location}"
|
71
|
+
puts updated
|
72
|
+
puts weather
|
73
|
+
puts temp
|
74
|
+
puts feels
|
75
|
+
puts "Humidity: #{humidity} %"
|
76
|
+
puts wind
|
77
|
+
alerts.each do |a|
|
78
|
+
alert = Rainbow(a[:description]).red.bright + ' until ' +
|
79
|
+
Rainbow(a[:expires]).red.bright
|
80
|
+
puts alert
|
81
|
+
end
|
82
|
+
puts "Moon phase: #{age}"
|
83
|
+
puts "Moon illumination: #{illum}"
|
84
|
+
|
85
|
+
puts '* BEGIN 10 DAY FORECAST *'
|
86
|
+
20.times do |i|
|
87
|
+
d = Rainbow(forecast[i][:weekday_name]).color(StringUtility.random_color_six)
|
88
|
+
puts "#{d}: #{forecast[i][:text]}"
|
89
|
+
end
|
data/lib/weather/actions.rb
CHANGED
@@ -12,11 +12,11 @@ module Weather
|
|
12
12
|
count = 0
|
13
13
|
response['alerts'].each do |a|
|
14
14
|
ret[count] = {
|
15
|
-
:
|
16
|
-
:
|
17
|
-
:
|
18
|
-
:
|
19
|
-
:
|
15
|
+
type: a['type'],
|
16
|
+
description: a['description'],
|
17
|
+
date: a['date'],
|
18
|
+
expires: a['expires'],
|
19
|
+
message: a['message']
|
20
20
|
}
|
21
21
|
count += 1
|
22
22
|
end
|
@@ -64,26 +64,26 @@ module Weather
|
|
64
64
|
display_location = current_observation['display_location']
|
65
65
|
|
66
66
|
ret = {
|
67
|
-
:
|
68
|
-
:
|
69
|
-
:
|
70
|
-
:
|
71
|
-
:
|
72
|
-
:
|
73
|
-
:
|
74
|
-
:
|
75
|
-
:
|
76
|
-
:
|
77
|
-
:
|
78
|
-
:
|
79
|
-
:
|
80
|
-
:
|
81
|
-
:
|
82
|
-
:
|
83
|
-
:
|
84
|
-
:
|
85
|
-
:
|
86
|
-
:
|
67
|
+
full_name: display_location['full'],
|
68
|
+
city_name: display_location['city'],
|
69
|
+
state_abbreviation: display_location['state'],
|
70
|
+
state_name: display_location['state_name'],
|
71
|
+
country: display_location['country'],
|
72
|
+
zip_code: display_location['zip'].to_i,
|
73
|
+
updated: current_observation['observation_time'],
|
74
|
+
weather: current_observation['weather'],
|
75
|
+
formatted_temperature: current_observation['temperature_string'],
|
76
|
+
temperature_f: current_observation['temp_f'],
|
77
|
+
temperature_c: current_observation['temp_c'],
|
78
|
+
humidity: current_observation['relative_humidity'],
|
79
|
+
formatted_wind: current_observation['wind_string'],
|
80
|
+
wind_direction: current_observation['wind_dir'],
|
81
|
+
wind_degrees: current_observation['wind_degrees'],
|
82
|
+
wind_speed: current_observation['wind_mph'],
|
83
|
+
wind_gust_speed: current_observation['wind_gust_mph'].to_i,
|
84
|
+
formatted_feelslike: current_observation['feelslike_string'],
|
85
|
+
feelslike_f: current_observation['feelslike_f'].to_i,
|
86
|
+
feelslike_c: current_observation['feelslike_c'].to_i
|
87
87
|
}
|
88
88
|
|
89
89
|
ret[:humidity] = ret[:humidity].sub('%', '').to_i
|
@@ -106,11 +106,11 @@ module Weather
|
|
106
106
|
|
107
107
|
if response['response']['error'].nil?
|
108
108
|
ret = {
|
109
|
-
:
|
110
|
-
:
|
111
|
-
:
|
112
|
-
:
|
113
|
-
:
|
109
|
+
average_low_f: response['almanac']['temp_low']['normal']['F'].to_i,
|
110
|
+
average_low_c: response['almanac']['temp_low']['normal']['C'].to_i,
|
111
|
+
record_year: response['almanac']['temp_low']['recordyear'].to_i,
|
112
|
+
record_low_f: response['almanac']['temp_low']['record']['F'].to_i,
|
113
|
+
record_low_c: response['almanac']['temp_low']['record']['C'].to_i
|
114
114
|
}
|
115
115
|
|
116
116
|
ret
|
@@ -131,11 +131,11 @@ module Weather
|
|
131
131
|
|
132
132
|
if response['response']['error'].nil?
|
133
133
|
ret = {
|
134
|
-
:
|
135
|
-
:
|
136
|
-
:
|
137
|
-
:
|
138
|
-
:
|
134
|
+
average_high_f: response['almanac']['temp_high']['normal']['F'].to_i,
|
135
|
+
average_high_c: response['almanac']['temp_high']['normal']['C'].to_i,
|
136
|
+
record_year: response['almanac']['temp_high']['recordyear'].to_i,
|
137
|
+
record_high_f: response['almanac']['temp_high']['record']['F'].to_i,
|
138
|
+
record_high_c: response['almanac']['temp_high']['record']['C'].to_i
|
139
139
|
}
|
140
140
|
|
141
141
|
ret
|
@@ -158,16 +158,16 @@ module Weather
|
|
158
158
|
ret = {}
|
159
159
|
response['currenthurricane'].each do |h|
|
160
160
|
ret[h['stormInfo']['stormName_Nice']] = {
|
161
|
-
:
|
162
|
-
:
|
163
|
-
:
|
164
|
-
:
|
165
|
-
:
|
166
|
-
:
|
167
|
-
:
|
168
|
-
:
|
169
|
-
:
|
170
|
-
:
|
161
|
+
name: h['stormInfo']['stormName'],
|
162
|
+
number: h['stormInfo']['stormNumber'],
|
163
|
+
category: h['Current']['Category'],
|
164
|
+
time: h['Current']['Time']['pretty'],
|
165
|
+
wind_speed_mph: h['Current']['WindSpeed']['Mph'],
|
166
|
+
wind_speed_kts: h['Current']['WindSpeed']['Kts'],
|
167
|
+
wind_speed_kph: h['Current']['WindSpeed']['Kph'],
|
168
|
+
gust_speed_mph: h['Current']['WindGust']['Mph'],
|
169
|
+
gust_speed_kts: h['Current']['WindGust']['Kts'],
|
170
|
+
gust_speed_kph: h['Current']['WindGust']['Kph']
|
171
171
|
}
|
172
172
|
end
|
173
173
|
|
@@ -191,7 +191,7 @@ module Weather
|
|
191
191
|
def simple_forecast(location)
|
192
192
|
response = get('forecast', location)
|
193
193
|
|
194
|
-
|
194
|
+
parse_simple_forecast(response)
|
195
195
|
end
|
196
196
|
|
197
197
|
# Gets more complicated forecast information for the location. Only gets
|
@@ -205,7 +205,7 @@ module Weather
|
|
205
205
|
def complex_forecast(location)
|
206
206
|
response = get('forecast', location)
|
207
207
|
|
208
|
-
|
208
|
+
parse_complex_forecast(response)
|
209
209
|
end
|
210
210
|
|
211
211
|
# Exactly the same as #simple_forecast, except that it gets the data for
|
@@ -213,7 +213,7 @@ module Weather
|
|
213
213
|
def simple_forecast_10day(location)
|
214
214
|
response = get('forecast10day', location)
|
215
215
|
|
216
|
-
|
216
|
+
parse_simple_forecast(response)
|
217
217
|
end
|
218
218
|
|
219
219
|
# Exactly the same as #complex_forecast, except that it gets the data for
|
@@ -221,10 +221,11 @@ module Weather
|
|
221
221
|
def complex_forecast_10day(location)
|
222
222
|
response = get('forecast10day', location)
|
223
223
|
|
224
|
-
|
224
|
+
parse_complex_forecast(response)
|
225
225
|
end
|
226
226
|
|
227
227
|
private
|
228
|
+
|
228
229
|
# Parses the simple forecast information.
|
229
230
|
def parse_simple_forecast(response)
|
230
231
|
if response['response']['error'].nil?
|
@@ -232,9 +233,9 @@ module Weather
|
|
232
233
|
|
233
234
|
response['forecast']['txt_forecast']['forecastday'].each do |f|
|
234
235
|
ret[f['period']] = {
|
235
|
-
:
|
236
|
-
:
|
237
|
-
:
|
236
|
+
weekday_name: f['title'],
|
237
|
+
text: f['fcttext'],
|
238
|
+
text_metric: f['fcttext_metric']
|
238
239
|
}
|
239
240
|
end
|
240
241
|
|
@@ -255,36 +256,36 @@ module Weather
|
|
255
256
|
|
256
257
|
response['forecast']['simpleforecast']['forecastday'].each do |f|
|
257
258
|
ret[f['period'] - 1] = {
|
258
|
-
:
|
259
|
-
:
|
260
|
-
:
|
261
|
-
:
|
262
|
-
:
|
263
|
-
:
|
264
|
-
:
|
265
|
-
:
|
266
|
-
:
|
267
|
-
:
|
268
|
-
:
|
269
|
-
:
|
259
|
+
high_f: f['high']['fahrenheit'].to_i,
|
260
|
+
high_c: f['high']['celsius'].to_i,
|
261
|
+
low_f: f['low']['fahrenheit'].to_i,
|
262
|
+
low_c: f['low']['celsius'].to_i,
|
263
|
+
conditions: f['conditions'].to_i,
|
264
|
+
snow: {
|
265
|
+
snow_total_in: f['snow_allday']['in'],
|
266
|
+
snow_total_cm: f['snow_allday']['cm'],
|
267
|
+
snow_night_in: f['snow_night']['in'],
|
268
|
+
snow_night_cm: f['snow_night']['cm'],
|
269
|
+
snow_day_in: f['snow_day']['in'],
|
270
|
+
snow_day_cm: f['snow_day']['cm']
|
270
271
|
},
|
271
|
-
:
|
272
|
-
:
|
273
|
-
:
|
274
|
-
:
|
275
|
-
:
|
276
|
-
:
|
277
|
-
:
|
272
|
+
quantative_precipitation: {
|
273
|
+
qpf_total_in: f['qpf_allday']['in'],
|
274
|
+
qpf_total_cm: f['qpf_allday']['cm'],
|
275
|
+
qpf_night_in: f['qpf_night']['in'],
|
276
|
+
qpf_night_cm: f['qpf_night']['cm'],
|
277
|
+
qpf_day_in: f['qpf_day']['in'],
|
278
|
+
qpf_day_cm: f['qpf_day']['cm']
|
278
279
|
},
|
279
|
-
:
|
280
|
-
:
|
281
|
-
:
|
282
|
-
:
|
283
|
-
:
|
284
|
-
:
|
285
|
-
:
|
286
|
-
:
|
287
|
-
:
|
280
|
+
wind: {
|
281
|
+
average_mph: f['avewind']['mph'],
|
282
|
+
average_kph: f['avewind']['kph'],
|
283
|
+
average_dir: f['avewind']['dir'],
|
284
|
+
average_temp: f['avewind']['degrees'],
|
285
|
+
max_mph: f['maxwind']['mph'],
|
286
|
+
max_kph: f['maxwind']['kph'],
|
287
|
+
max_dir: f['maxwind']['dir'],
|
288
|
+
max_temp: f['maxwind']['degrees']
|
288
289
|
}
|
289
290
|
}
|
290
291
|
end
|
data/lib/weatheruby.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
require 'httpclient'
|
2
2
|
require 'json'
|
3
3
|
require_relative 'weather/actions'
|
4
|
+
require_relative 'weather/exceptions'
|
4
5
|
|
5
6
|
class Weatheruby
|
6
7
|
include Weather::Actions
|
@@ -38,10 +39,13 @@ class Weatheruby
|
|
38
39
|
url = URI.encode(url)
|
39
40
|
uri = URI.parse(url)
|
40
41
|
res = @client.get(uri)
|
42
|
+
json = JSON.parse(res.body)
|
43
|
+
unless json['response']['results'].nil?
|
44
|
+
fail Weather::Exceptions::TooManyResultsError
|
45
|
+
end
|
41
46
|
|
42
47
|
if autoparse
|
43
|
-
return
|
44
|
-
# puts JSON.parse(res.body)
|
48
|
+
return json
|
45
49
|
else
|
46
50
|
return res
|
47
51
|
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.
|
4
|
+
version: 0.4.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: 2015-
|
11
|
+
date: 2015-11-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: httpclient
|
@@ -24,13 +24,43 @@ dependencies:
|
|
24
24
|
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rainbow
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: string-utility
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
27
55
|
description: Accessing the Weather Underground API through HTTPClient.
|
28
56
|
email: elifosterwy@gmail.com
|
29
|
-
executables:
|
57
|
+
executables:
|
58
|
+
- weatheruby
|
30
59
|
extensions: []
|
31
60
|
extra_rdoc_files: []
|
32
61
|
files:
|
33
62
|
- CHANGELOG.md
|
63
|
+
- bin/weatheruby
|
34
64
|
- lib/weather/actions.rb
|
35
65
|
- lib/weatheruby.rb
|
36
66
|
homepage: https://github.com/elifoster/weatheruby
|
@@ -59,3 +89,4 @@ signing_key:
|
|
59
89
|
specification_version: 4
|
60
90
|
summary: A Ruby gem for accessing the Weather Underground API.
|
61
91
|
test_files: []
|
92
|
+
has_rdoc:
|