weer 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.
- checksums.yaml +7 -0
- data/bin/console +14 -0
- data/bin/setup +8 -0
- data/bin/weer +4 -0
- data/lib/weer/cli/weather.rb +46 -0
- data/lib/weer/cli.rb +4 -0
- data/lib/weer/error.rb +1 -0
- data/lib/weer/lib/wetter.rb +188 -0
- data/lib/weer/version.rb +3 -0
- data/lib/weer.rb +7 -0
- metadata +194 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 25092b01a78355aed6966fa35c67d29c01649efa
|
4
|
+
data.tar.gz: 1677fd4f5c120df9869dd4a1cc0918c1eec7d194
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 40dbcc727b28077f8a4e62de549603ac59e083dbbcf1c113493195d9a6b104a2e97590f011a5f8aee09e8b8e416a5ccb76301192baf3064b7bfb5b58ececa98c
|
7
|
+
data.tar.gz: 2dc64cf0dd3c48f22626736ded173f951189ff7840ea4890bcd93c14b4adf700433ea83f77ea311053ad27a2797de8f3cb3fefad31dab411deb8b4cfd4167b08
|
data/bin/console
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'bundler/setup'
|
4
|
+
require 'weer'
|
5
|
+
|
6
|
+
# You can add fixtures and/or initialization code here to make experimenting
|
7
|
+
# with your gem easier. You can also use a different console, if you like.
|
8
|
+
|
9
|
+
# (If you use this, don't forget to add pry to your Gemfile!)
|
10
|
+
# require "pry"
|
11
|
+
# Pry.start
|
12
|
+
|
13
|
+
require 'irb'
|
14
|
+
IRB.start
|
data/bin/setup
ADDED
data/bin/weer
ADDED
@@ -0,0 +1,46 @@
|
|
1
|
+
require 'date'
|
2
|
+
|
3
|
+
module Weer
|
4
|
+
module CLI
|
5
|
+
class Weather < Thor
|
6
|
+
# Display weather information of a city
|
7
|
+
#
|
8
|
+
# Option
|
9
|
+
#
|
10
|
+
# temperature - Dislay forecast by temperature
|
11
|
+
# city - Your city
|
12
|
+
# all - Display all weather information
|
13
|
+
#
|
14
|
+
# Returns the weather information
|
15
|
+
desc 'weather', 'Display the weather information of a city'
|
16
|
+
option :temperature, aliases: '-t', banner: 'F(Fahrenheit) or C(Celsius).', default: 'F'
|
17
|
+
option :city, aliases: '-c', banner: 'Your city', required: true
|
18
|
+
option :all, aliases: '-a', banner: 'Display all weather information (wind, atmosphere, astronomy, forecast).'
|
19
|
+
def weather
|
20
|
+
temperature = options[:temperature].downcase
|
21
|
+
wetter = Wetter.new options[:city]
|
22
|
+
response = wetter.connect
|
23
|
+
|
24
|
+
raise FakeURLInvalid if response['query']['results'].nil?
|
25
|
+
forecasts = wetter.forecast response
|
26
|
+
|
27
|
+
puts Rainbow("============= The forecast(#{options[:temperature]}) of #{options[:city].upcase!} in the next coming days =============").green
|
28
|
+
puts Rainbow(wetter.parse_forecast forecasts, temperature).orange
|
29
|
+
|
30
|
+
if options[:all]
|
31
|
+
wind = wetter.wind response
|
32
|
+
|
33
|
+
puts "\n"
|
34
|
+
puts Rainbow("========================= The wind power of #{Date.today.to_s} =========================").green
|
35
|
+
puts Rainbow(wetter.parse_wind wind).orange
|
36
|
+
|
37
|
+
atmosphere = wetter.atmosphere response
|
38
|
+
|
39
|
+
puts "\n"
|
40
|
+
puts Rainbow("========================= The atmosphere of #{Date.today.to_s} =========================").green
|
41
|
+
puts Rainbow(wetter.parse_atmosphere atmosphere).orange
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
data/lib/weer/cli.rb
ADDED
data/lib/weer/error.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
class FakeURLInvalid < StandardError; end
|
@@ -0,0 +1,188 @@
|
|
1
|
+
require 'httparty'
|
2
|
+
require 'terminal-table'
|
3
|
+
|
4
|
+
class Wetter
|
5
|
+
# Set attributes reader
|
6
|
+
attr_reader :city
|
7
|
+
|
8
|
+
# Instance variable
|
9
|
+
BASE_URL = 'https://query.yahooapis.com/v1/public/yql?q='
|
10
|
+
FORMAT_RESPONSE = '&format=json&env=store://datatables.org/alltableswithkeys'
|
11
|
+
|
12
|
+
# Create constructor Wetter object
|
13
|
+
#
|
14
|
+
# city - The city
|
15
|
+
#
|
16
|
+
# Examples
|
17
|
+
#
|
18
|
+
# Wetter.new(city)
|
19
|
+
#
|
20
|
+
# Returns nothing
|
21
|
+
def initialize(city)
|
22
|
+
@city = city.downcase
|
23
|
+
end
|
24
|
+
|
25
|
+
# Make an http request to Yahoo Weather API
|
26
|
+
#
|
27
|
+
# Examples
|
28
|
+
#
|
29
|
+
# connect('Da Nang')
|
30
|
+
# # => {"query"=>{"count"=>1, "created"=>"2016-02-04T08:52:17Z", "lang"=>"en-US", "results"=>{"channel"=>{ ...
|
31
|
+
#
|
32
|
+
# Returns the Hash response
|
33
|
+
def connect
|
34
|
+
url = URI.parse(URI.encode((BASE_URL + yql_city + FORMAT_RESPONSE).strip))
|
35
|
+
request = HTTParty.get(url)
|
36
|
+
request.code == 200 ? JSON.parse(request.body) : nil
|
37
|
+
end
|
38
|
+
|
39
|
+
# Parse the forecasts to table
|
40
|
+
#
|
41
|
+
# raw_fore_casts - The raw HASH forecasts
|
42
|
+
#
|
43
|
+
# Examples
|
44
|
+
#
|
45
|
+
# parse([{"code"=>"12", "date"=>"4 Feb 2016", "day"=>"Thu", "high"=>"72", "low"=>"66", "text"=>"Rain"}])
|
46
|
+
# # =>
|
47
|
+
# +------------+-----+------+------------+
|
48
|
+
# | Date | Low | High | Weather |
|
49
|
+
# +------------+-----+------+------------+
|
50
|
+
# | 4 Feb 2016 | 67 | 75 | Light Rain |
|
51
|
+
# | 5 Feb 2016 | 65 | 72 | Rain |
|
52
|
+
# +------------+-----+------+------------+
|
53
|
+
#
|
54
|
+
# Returns the table object
|
55
|
+
def parse_forecast(raw_fore_casts, temperature)
|
56
|
+
forecast_rows = []
|
57
|
+
|
58
|
+
if temperature == 'f'
|
59
|
+
raw_fore_casts.each do |r|
|
60
|
+
forecast_rows << [r['date'], r['low'], r['high'], r['text']]
|
61
|
+
end
|
62
|
+
elsif temperature == 'c'
|
63
|
+
raw_fore_casts.each do |r|
|
64
|
+
forecast_rows << [r['date'], fahren_to_cel(r['low']), fahren_to_cel(r['high']), r['text']]
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
Terminal::Table.new headings: ['Date', 'Low', 'High', 'Weather'], rows: forecast_rows, style: { width: 80 }
|
69
|
+
end
|
70
|
+
|
71
|
+
# Parse the wind to table
|
72
|
+
#
|
73
|
+
# raw_wind - The raw HASH wind
|
74
|
+
#
|
75
|
+
# Examples
|
76
|
+
#
|
77
|
+
# parse_wind({"chill"=>"68", "direction"=>"330", "speed"=>"5"})
|
78
|
+
# # =>
|
79
|
+
# +-------+-----------+-------+
|
80
|
+
# | Chill | Direction | Speed |
|
81
|
+
# +-------+-----------+-------+
|
82
|
+
# | 68 | 330 | 5 |
|
83
|
+
# +-------+-----------+-------+
|
84
|
+
#
|
85
|
+
# Returns the table object
|
86
|
+
def parse_wind(raw_wind)
|
87
|
+
wind_row = []
|
88
|
+
|
89
|
+
wind_row << [raw_wind['chill'], raw_wind['direction'], raw_wind['speed']]
|
90
|
+
|
91
|
+
Terminal::Table.new headings: ['Chill', 'Direction', 'Speed'], rows: wind_row, style: { width: 80 }
|
92
|
+
end
|
93
|
+
|
94
|
+
# Parse the atmosphere to table
|
95
|
+
#
|
96
|
+
# raw_atmosphere - The raw HASH atmosphere
|
97
|
+
#
|
98
|
+
# Examples
|
99
|
+
#
|
100
|
+
# parse_atmosphere({"humidity"=>"88", "pressure"=>"30.15", "rising"=>"0", "visibility"=>"4.35"})
|
101
|
+
# # =>
|
102
|
+
# +----------+----------+--------+------------+
|
103
|
+
# | Humidity | Pressure | Rising | Visibility |
|
104
|
+
# +----------+----------+--------+------------+
|
105
|
+
# | 88 | 30.15 | 0 | 4.35 |
|
106
|
+
# +----------+----------+--------+------------+
|
107
|
+
#
|
108
|
+
# Returns the table object
|
109
|
+
def parse_atmosphere(raw_atmosphere)
|
110
|
+
atmosphere_row = []
|
111
|
+
|
112
|
+
atmosphere_row << [raw_atmosphere['humidity'], raw_atmosphere['pressure'], raw_atmosphere['rising'], raw_atmosphere['visibility']]
|
113
|
+
|
114
|
+
Terminal::Table.new headings: ['Humidity', 'Pressure', 'Rising', 'Visibility'], rows: atmosphere_row, style: { width: 80 }
|
115
|
+
end
|
116
|
+
|
117
|
+
# Get the forecasts
|
118
|
+
#
|
119
|
+
# response - The raw HASH response
|
120
|
+
#
|
121
|
+
# Examples
|
122
|
+
#
|
123
|
+
# forecast({"query"=>{"count"=>1, "created"...)})
|
124
|
+
# # => {"code"=>"12", "date"=>"4 Feb 2016", "day"=>"Thu", "high"=>"72", "low"=>"66", "text"=>"Rain"}
|
125
|
+
#
|
126
|
+
# Returns the raw forecasts data
|
127
|
+
def forecast(response)
|
128
|
+
response['query']['results']['channel']['item']['forecast']
|
129
|
+
end
|
130
|
+
|
131
|
+
# Get the wind
|
132
|
+
#
|
133
|
+
# response - The raw HASH response
|
134
|
+
#
|
135
|
+
# Examples
|
136
|
+
#
|
137
|
+
# wind({"query"=>{"count"=>1, "created"...)})
|
138
|
+
# # => {"chill"=>"68", "direction"=>"330", "speed"=>"5"}
|
139
|
+
#
|
140
|
+
# Returns the raw wind data
|
141
|
+
def wind(response)
|
142
|
+
response['query']['results']['channel']['wind']
|
143
|
+
end
|
144
|
+
|
145
|
+
# Get the atmosphere
|
146
|
+
#
|
147
|
+
# response - The raw HASH response
|
148
|
+
#
|
149
|
+
# Examples
|
150
|
+
#
|
151
|
+
# atmosphere({"query"=>{"count"=>1, "created"...)})
|
152
|
+
# # => {"humidity"=>"88", "pressure"=>"30.15", "rising"=>"0", "visibility"=>"4.35"}
|
153
|
+
#
|
154
|
+
# Returns the raw atmosphere data
|
155
|
+
def atmosphere(response)
|
156
|
+
response['query']['results']['channel']['atmosphere']
|
157
|
+
end
|
158
|
+
|
159
|
+
# Generate yql (Yahoo Query Language) for a city
|
160
|
+
#
|
161
|
+
# city - The city
|
162
|
+
#
|
163
|
+
# Examples
|
164
|
+
#
|
165
|
+
# yql_city('Da Nang')
|
166
|
+
# # => "select * from weather.forecast where woeid in (select woeid from geo.places(1) where text=\"Da Nang\")"
|
167
|
+
#
|
168
|
+
# Returns an query
|
169
|
+
def yql_city
|
170
|
+
"select * from weather.forecast where woeid in (select woeid from geo.places(1) where text=\"#{city}\")"
|
171
|
+
end
|
172
|
+
|
173
|
+
private
|
174
|
+
|
175
|
+
# Convert Fahrenheit to Celsius
|
176
|
+
#
|
177
|
+
# temp - The temperature
|
178
|
+
#
|
179
|
+
# Examples
|
180
|
+
#
|
181
|
+
# fahren_to_cel(72)
|
182
|
+
# # => 22
|
183
|
+
#
|
184
|
+
# Returns the Celsius
|
185
|
+
def fahren_to_cel(temp)
|
186
|
+
(temp.to_i - 32) * 5 / 9
|
187
|
+
end
|
188
|
+
end
|
data/lib/weer/version.rb
ADDED
data/lib/weer.rb
ADDED
metadata
ADDED
@@ -0,0 +1,194 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: weer
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Vinh Nguyen
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2016-02-06 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: bundler
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rake
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '10.0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '10.0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rspec
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '3.0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '3.0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: byebug
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: webmock
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: coveralls
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - ">="
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: thor
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - ">="
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0'
|
104
|
+
type: :runtime
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - ">="
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: httparty
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - ">="
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '0'
|
118
|
+
type: :runtime
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - ">="
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '0'
|
125
|
+
- !ruby/object:Gem::Dependency
|
126
|
+
name: terminal-table
|
127
|
+
requirement: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - ">="
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: '0'
|
132
|
+
type: :runtime
|
133
|
+
prerelease: false
|
134
|
+
version_requirements: !ruby/object:Gem::Requirement
|
135
|
+
requirements:
|
136
|
+
- - ">="
|
137
|
+
- !ruby/object:Gem::Version
|
138
|
+
version: '0'
|
139
|
+
- !ruby/object:Gem::Dependency
|
140
|
+
name: rainbow
|
141
|
+
requirement: !ruby/object:Gem::Requirement
|
142
|
+
requirements:
|
143
|
+
- - ">="
|
144
|
+
- !ruby/object:Gem::Version
|
145
|
+
version: '0'
|
146
|
+
type: :runtime
|
147
|
+
prerelease: false
|
148
|
+
version_requirements: !ruby/object:Gem::Requirement
|
149
|
+
requirements:
|
150
|
+
- - ">="
|
151
|
+
- !ruby/object:Gem::Version
|
152
|
+
version: '0'
|
153
|
+
description: Display the weather information of your city.
|
154
|
+
email:
|
155
|
+
- vinh.nglx@gmail.com
|
156
|
+
executables:
|
157
|
+
- weer
|
158
|
+
extensions: []
|
159
|
+
extra_rdoc_files: []
|
160
|
+
files:
|
161
|
+
- bin/console
|
162
|
+
- bin/setup
|
163
|
+
- bin/weer
|
164
|
+
- lib/weer.rb
|
165
|
+
- lib/weer/cli.rb
|
166
|
+
- lib/weer/cli/weather.rb
|
167
|
+
- lib/weer/error.rb
|
168
|
+
- lib/weer/lib/wetter.rb
|
169
|
+
- lib/weer/version.rb
|
170
|
+
homepage: http://todayifoundout.net
|
171
|
+
licenses:
|
172
|
+
- MIT
|
173
|
+
metadata: {}
|
174
|
+
post_install_message:
|
175
|
+
rdoc_options: []
|
176
|
+
require_paths:
|
177
|
+
- lib
|
178
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
179
|
+
requirements:
|
180
|
+
- - ">="
|
181
|
+
- !ruby/object:Gem::Version
|
182
|
+
version: '0'
|
183
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
184
|
+
requirements:
|
185
|
+
- - ">="
|
186
|
+
- !ruby/object:Gem::Version
|
187
|
+
version: '0'
|
188
|
+
requirements: []
|
189
|
+
rubyforge_project:
|
190
|
+
rubygems_version: 2.4.8
|
191
|
+
signing_key:
|
192
|
+
specification_version: 4
|
193
|
+
summary: Display the weather information of your city.
|
194
|
+
test_files: []
|