weather-forecast 0.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 +7 -0
- data/bin/execute +5 -0
- data/lib/emoji.rb +35 -0
- data/lib/environment.rb +16 -0
- data/lib/forecast.rb +53 -0
- data/lib/forecast/version.rb +5 -0
- data/lib/forecastapi.rb +29 -0
- data/lib/forecastcli.rb +146 -0
- data/lib/weather_forecast.rb +4 -0
- metadata +224 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 27876f859e30cfb06a997a0e7aa1a13a72a522b87e6a735ed3b28e1a2cb54821
|
4
|
+
data.tar.gz: c419a3e455141ce5be4f26a139dee8207afbf1d7c507142598f8c84650c2667d
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 849a23a721fee16d8f235d3f956cbbaf7796ac8a49e91ab5bf9ee4812894ccf6a94c06dc7c437912a6304b2bb5316e9d9388f46a1f10429a43731287649b4077
|
7
|
+
data.tar.gz: 0d9b13988c203e297d013608855bb2ae7cf21722ecb5b8f775441f643c1a5f3dad30e2a15118c3b318ad8a3da4ea1736cf9a18a5ba1a1fef9fe57cab9c511b8b
|
data/bin/execute
ADDED
data/lib/emoji.rb
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
class String
|
2
|
+
def to_emoji
|
3
|
+
case self
|
4
|
+
when 'thunderstorm'
|
5
|
+
"\u{26A1}"
|
6
|
+
when 'light rain'
|
7
|
+
"\u{1F326}"
|
8
|
+
when 'rain'
|
9
|
+
"\u{2614}"
|
10
|
+
when 'clear sky'
|
11
|
+
"\u{1F31E}"
|
12
|
+
when 'few clouds'
|
13
|
+
"\u{26C5}"
|
14
|
+
when 'scattered clouds'
|
15
|
+
"\u{1F324}"
|
16
|
+
when 'broken clouds'
|
17
|
+
"\u{1F325}"
|
18
|
+
when 'overcast clouds'
|
19
|
+
"\u{2601}"
|
20
|
+
when 'tornado'
|
21
|
+
"\u{1F32A}"
|
22
|
+
when 'cold'
|
23
|
+
"\u{2744}"
|
24
|
+
when 'hot'
|
25
|
+
"\u{1F525}"
|
26
|
+
when 'windy'
|
27
|
+
"\u{1F32C}"
|
28
|
+
when 'hail'
|
29
|
+
"\u{1F30A}"
|
30
|
+
else
|
31
|
+
"\u{1F30A}" # error
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
data/lib/environment.rb
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
require "bundler/setup"
|
2
|
+
Bundler.require
|
3
|
+
|
4
|
+
require 'dotenv'
|
5
|
+
Dotenv.load
|
6
|
+
require 'tty-prompt'
|
7
|
+
require 'httparty'
|
8
|
+
require 'json'
|
9
|
+
require 'terminal-table'
|
10
|
+
require 'colorize'
|
11
|
+
require 'ruby_figlet'
|
12
|
+
require 'forecast/version'
|
13
|
+
require 'forecastapi.rb'
|
14
|
+
require 'forecastcli.rb'
|
15
|
+
require 'forecast.rb'
|
16
|
+
require 'emoji.rb'
|
data/lib/forecast.rb
ADDED
@@ -0,0 +1,53 @@
|
|
1
|
+
require 'pry'
|
2
|
+
|
3
|
+
module Weather
|
4
|
+
|
5
|
+
class Forecast
|
6
|
+
@@all = []
|
7
|
+
attr_accessor :location, :date, :temp, :humidity, :description
|
8
|
+
|
9
|
+
def initialize (date:, temp:, humidity:, description:)
|
10
|
+
@date = date
|
11
|
+
@temp = temp
|
12
|
+
@humidity = humidity
|
13
|
+
@description = description
|
14
|
+
save
|
15
|
+
end
|
16
|
+
|
17
|
+
def save
|
18
|
+
@@all << self
|
19
|
+
end
|
20
|
+
|
21
|
+
def self.day_display
|
22
|
+
forecast = []
|
23
|
+
|
24
|
+
8.times do
|
25
|
+
forecast << @@all.shift
|
26
|
+
end
|
27
|
+
|
28
|
+
forecast.each do |data|
|
29
|
+
puts Terminal::Table.new(
|
30
|
+
rows: [
|
31
|
+
[data.date, "Temp: #{data.temp} F Humidity: #{data.humidity} Sky: #{data.description.to_emoji} #{data.description}"]
|
32
|
+
],
|
33
|
+
style: {
|
34
|
+
border_i: 'X',
|
35
|
+
border_x: '=',
|
36
|
+
width: 130
|
37
|
+
}
|
38
|
+
)
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
42
|
+
|
43
|
+
|
44
|
+
def self.all
|
45
|
+
@@all
|
46
|
+
end
|
47
|
+
|
48
|
+
def self.erase
|
49
|
+
@@all.clear
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
end
|
data/lib/forecastapi.rb
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'pry'
|
2
|
+
|
3
|
+
module Weather
|
4
|
+
class ForecastApi
|
5
|
+
APP_ID = ENV['API_KEY']
|
6
|
+
|
7
|
+
# fetch forecast info from OpenWeather API
|
8
|
+
def self.fetch(zipcode)
|
9
|
+
url = "http://api.openweathermap.org/data/2.5/forecast?zip=#{zipcode}&units=imperial&appid=#{APP_ID}"
|
10
|
+
|
11
|
+
response = HTTParty.get(url)
|
12
|
+
query = JSON.parse(response.body, symbolize_names: true)
|
13
|
+
query[:list].each do |data|
|
14
|
+
Weather::Forecast.new(
|
15
|
+
date: Time.at(data[:dt]).strftime('%a %b-%d %H:%M'),
|
16
|
+
temp: data[:main][:temp],
|
17
|
+
humidity: data[:main][:humidity],
|
18
|
+
description: data[:weather].first[:description]
|
19
|
+
)
|
20
|
+
end
|
21
|
+
|
22
|
+
Weather::Forecast.all.each {|forecast| forecast.location = query[:city][:name]}
|
23
|
+
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
27
|
+
|
28
|
+
|
29
|
+
end
|
data/lib/forecastcli.rb
ADDED
@@ -0,0 +1,146 @@
|
|
1
|
+
module Weather
|
2
|
+
class ForecastCli
|
3
|
+
include RubyFiglet
|
4
|
+
APP_ID = ENV['API_KEY']
|
5
|
+
$prompt = TTY::Prompt.new
|
6
|
+
def start
|
7
|
+
self.welcome
|
8
|
+
self.instructions
|
9
|
+
end
|
10
|
+
|
11
|
+
def welcome
|
12
|
+
|
13
|
+
puts Figlet.new('WEATHER-FORECAST').to_s.colorize(:red)
|
14
|
+
puts ''
|
15
|
+
puts ''
|
16
|
+
puts 'Welcome to your forecast!'.colorize(:blue)
|
17
|
+
puts ''
|
18
|
+
puts 'This is your personalized weather assistant that allows you
|
19
|
+
to get daily weather information by zipcode.'
|
20
|
+
line_break
|
21
|
+
puts ''
|
22
|
+
puts 'Instructions'.colorize(:red)
|
23
|
+
puts ''
|
24
|
+
puts 'Follow instruction bellow'
|
25
|
+
puts 'Enter zipcode to get weather detail'
|
26
|
+
puts "Type 'exit' to quit".colorize(:blue)
|
27
|
+
self.line_break
|
28
|
+
puts ''
|
29
|
+
end
|
30
|
+
|
31
|
+
def instructions
|
32
|
+
puts 'Enter your five digit zipcode to get started or "exit" to quit:'.colorize(:blue)
|
33
|
+
zipcode = gets.chomp.downcase
|
34
|
+
#check for vald zip code: all digits string and length = 5
|
35
|
+
while zipcode != 'exit'
|
36
|
+
if zipcode[/[0-9]+/] == zipcode && zipcode.length == 5
|
37
|
+
system('cls') || system('clear')
|
38
|
+
Weather::ForecastApi.fetch(zipcode)
|
39
|
+
puts "This is the 24 HRS forecast for #{Weather::Forecast.all.first.location}:".colorize(:blue)
|
40
|
+
puts ''
|
41
|
+
Weather::Forecast.day_display
|
42
|
+
line_break
|
43
|
+
puts ''
|
44
|
+
@options = %w(Exit Check-Another-Area Next-Day-Forecast Next-2-Days-Forecast Next-3-Days-Forecast Next-4-Days-Forecast)
|
45
|
+
additional_options
|
46
|
+
else
|
47
|
+
begin
|
48
|
+
raise Error
|
49
|
+
rescue Error => exception
|
50
|
+
puts exception.message
|
51
|
+
end
|
52
|
+
instructions
|
53
|
+
end
|
54
|
+
end
|
55
|
+
system('cls') || system('clear')
|
56
|
+
goodbye
|
57
|
+
end
|
58
|
+
|
59
|
+
def additional_options
|
60
|
+
menu
|
61
|
+
system('cls') || system('clear')
|
62
|
+
case @selection
|
63
|
+
when 'Next-Day-Forecast'
|
64
|
+
@@counter = 1
|
65
|
+
specific_request
|
66
|
+
additional_options
|
67
|
+
|
68
|
+
when 'Next-2-Days-Forecast'
|
69
|
+
@@counter = 2
|
70
|
+
specific_request
|
71
|
+
additional_options
|
72
|
+
when 'Next-3-Days-Forecast'
|
73
|
+
@@counter = 3
|
74
|
+
specific_request
|
75
|
+
additional_options
|
76
|
+
when 'Next-4-Days-Forecast'
|
77
|
+
@@counter = 4
|
78
|
+
specific_request
|
79
|
+
additional_options
|
80
|
+
when 'Check-Another-Area'
|
81
|
+
Weather::Forecast.erase
|
82
|
+
system('cls') || system('clear')
|
83
|
+
instructions
|
84
|
+
|
85
|
+
else
|
86
|
+
Weather::Forecast.erase
|
87
|
+
system('cls') || system('clear')
|
88
|
+
goodbye
|
89
|
+
exit
|
90
|
+
end
|
91
|
+
|
92
|
+
end
|
93
|
+
|
94
|
+
def menu
|
95
|
+
@selection = $prompt.select("What would you like to do next?".colorize(:green), @options)
|
96
|
+
end
|
97
|
+
|
98
|
+
def line_break
|
99
|
+
puts '============================================================================================================='.colorize(:white)
|
100
|
+
end
|
101
|
+
|
102
|
+
def goodbye
|
103
|
+
puts 'Thanks "for" visiting!'.colorize(:blue)
|
104
|
+
puts 'Enjoy the weather until next time :)'.colorize(:blue)
|
105
|
+
end
|
106
|
+
|
107
|
+
def specific_request
|
108
|
+
if Weather::Forecast.all.empty?
|
109
|
+
begin
|
110
|
+
raise WeatherError
|
111
|
+
rescue WeatherError => exception
|
112
|
+
puts exception.message
|
113
|
+
end
|
114
|
+
@options = %w(Exit Check-Another-Area)
|
115
|
+
additional_options
|
116
|
+
else
|
117
|
+
@@counter.times do
|
118
|
+
Weather::Forecast.day_display unless Weather::Forecast.all.empty?
|
119
|
+
@options.pop
|
120
|
+
end
|
121
|
+
|
122
|
+
puts 'You have now viewed the maximum five days forecast.'.colorize(:red) if @options.size == 2
|
123
|
+
end
|
124
|
+
line_break
|
125
|
+
end
|
126
|
+
|
127
|
+
class Error < StandardError
|
128
|
+
def message
|
129
|
+
puts 'Invalid Input'.colorize(:red)
|
130
|
+
puts ''
|
131
|
+
puts 'Please try again!'.colorize(:green)
|
132
|
+
end
|
133
|
+
end
|
134
|
+
|
135
|
+
class WeatherError < StandardError
|
136
|
+
def message
|
137
|
+
puts 'No more Forecast available'.colorize(:red)
|
138
|
+
puts ''
|
139
|
+
puts 'Make another Selection!'.colorize(:green)
|
140
|
+
end
|
141
|
+
end
|
142
|
+
|
143
|
+
end
|
144
|
+
|
145
|
+
|
146
|
+
end
|
metadata
ADDED
@@ -0,0 +1,224 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: weather-forecast
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Vanessa Fotso
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2020-12-28 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: '1.17'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.17'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rake
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '13.0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '13.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: '0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: pry
|
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: dotenv
|
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: colorize
|
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: tty
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - ">="
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0'
|
104
|
+
type: :development
|
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: tty-prompt
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - ">="
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '0'
|
118
|
+
type: :development
|
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: httparty
|
127
|
+
requirement: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - ">="
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: '0'
|
132
|
+
type: :development
|
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: json
|
141
|
+
requirement: !ruby/object:Gem::Requirement
|
142
|
+
requirements:
|
143
|
+
- - ">="
|
144
|
+
- !ruby/object:Gem::Version
|
145
|
+
version: '0'
|
146
|
+
type: :development
|
147
|
+
prerelease: false
|
148
|
+
version_requirements: !ruby/object:Gem::Requirement
|
149
|
+
requirements:
|
150
|
+
- - ">="
|
151
|
+
- !ruby/object:Gem::Version
|
152
|
+
version: '0'
|
153
|
+
- !ruby/object:Gem::Dependency
|
154
|
+
name: terminal-table
|
155
|
+
requirement: !ruby/object:Gem::Requirement
|
156
|
+
requirements:
|
157
|
+
- - ">="
|
158
|
+
- !ruby/object:Gem::Version
|
159
|
+
version: '0'
|
160
|
+
type: :development
|
161
|
+
prerelease: false
|
162
|
+
version_requirements: !ruby/object:Gem::Requirement
|
163
|
+
requirements:
|
164
|
+
- - ">="
|
165
|
+
- !ruby/object:Gem::Version
|
166
|
+
version: '0'
|
167
|
+
- !ruby/object:Gem::Dependency
|
168
|
+
name: ruby_figlet
|
169
|
+
requirement: !ruby/object:Gem::Requirement
|
170
|
+
requirements:
|
171
|
+
- - ">="
|
172
|
+
- !ruby/object:Gem::Version
|
173
|
+
version: '0'
|
174
|
+
type: :development
|
175
|
+
prerelease: false
|
176
|
+
version_requirements: !ruby/object:Gem::Requirement
|
177
|
+
requirements:
|
178
|
+
- - ">="
|
179
|
+
- !ruby/object:Gem::Version
|
180
|
+
version: '0'
|
181
|
+
description:
|
182
|
+
email: vanessuniq@gmail.com
|
183
|
+
executables:
|
184
|
+
- execute
|
185
|
+
extensions: []
|
186
|
+
extra_rdoc_files: []
|
187
|
+
files:
|
188
|
+
- bin/execute
|
189
|
+
- lib/emoji.rb
|
190
|
+
- lib/environment.rb
|
191
|
+
- lib/forecast.rb
|
192
|
+
- lib/forecast/version.rb
|
193
|
+
- lib/forecastapi.rb
|
194
|
+
- lib/forecastcli.rb
|
195
|
+
- lib/weather_forecast.rb
|
196
|
+
homepage: https://rubygems.org/gems/weather-forecast
|
197
|
+
licenses:
|
198
|
+
- MIT
|
199
|
+
metadata:
|
200
|
+
allowed_push_host: https://rubygems.org
|
201
|
+
homepage_uri: https://rubygems.org/gems/weather-forecast
|
202
|
+
source_code_uri: https://github.com/vanessuniq/weather-forecast
|
203
|
+
changelog_uri: https://github.com/vanessuniq/weather-forecast
|
204
|
+
post_install_message:
|
205
|
+
rdoc_options: []
|
206
|
+
require_paths:
|
207
|
+
- lib
|
208
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
209
|
+
requirements:
|
210
|
+
- - ">="
|
211
|
+
- !ruby/object:Gem::Version
|
212
|
+
version: '0'
|
213
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
214
|
+
requirements:
|
215
|
+
- - ">="
|
216
|
+
- !ruby/object:Gem::Version
|
217
|
+
version: '0'
|
218
|
+
requirements: []
|
219
|
+
rubygems_version: 3.0.8
|
220
|
+
signing_key:
|
221
|
+
specification_version: 4
|
222
|
+
summary: Gem and CLI providing weather/forecast by zipcode. Weather is provided by
|
223
|
+
scraping the OpenWeather website.
|
224
|
+
test_files: []
|