weer 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
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
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
7
+
8
+ # Do any other automated setup that you need to do here
data/bin/weer ADDED
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'weer'
4
+ Weer::CLI::Weather.start(ARGV)
@@ -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
@@ -0,0 +1,4 @@
1
+ require 'thor'
2
+ require 'rainbow'
3
+ require 'weer/lib/wetter'
4
+ require 'weer/cli/weather'
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
@@ -0,0 +1,3 @@
1
+ module Weer
2
+ VERSION = "0.1.0"
3
+ end
data/lib/weer.rb ADDED
@@ -0,0 +1,7 @@
1
+ require 'weer/version'
2
+ require 'weer/cli'
3
+ require 'weer/error'
4
+
5
+ module Weer
6
+ # Your code goes here
7
+ end
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: []