simple_forecast 0.0.2 → 0.0.3.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +2 -0
- data/bin/forecast +1 -11
- data/config/environment.rb +6 -4
- data/lib/models/cli_router.rb +50 -19
- data/lib/models/forecast.rb +42 -28
- data/lib/models/weather_data.rb +43 -0
- data/simple_forecast.gemspec +8 -5
- metadata +24 -13
- data/bin/run.rb +0 -9
- data/config/cli.rb +0 -56
- data/data/forecast_io_sample.rb +0 -912
- data/lib/models/scraper.rb +0 -20
- data/lib/weather_data.rb +0 -33
- data/notes.md +0 -168
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ceb60046f195e4e07230cd783255fa77f01fb6c9
|
4
|
+
data.tar.gz: 6b994bd43ec0be2c3c58a810527be4ef96358e13
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7ac73c3629ee0265f83d006dcdc8d8846a18c0bfd54489f389782bfa440c999b0e91af902dc4a86339183035bc1df5903eaf4af2b250e568f842d070bae67c53
|
7
|
+
data.tar.gz: 1b27160d13f9618cd15552b43098fb48489008c8a024f22e25fb66a91b11e8f38c0f55ed1c24322fd3d63a401f21c3b38e3671271998f9068e65f2f6b475a743
|
data/.gitignore
CHANGED
data/bin/forecast
CHANGED
@@ -1,14 +1,4 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
-
|
3
|
-
# require 'simple_forecast'
|
4
|
-
|
5
2
|
require_relative '../config/environment.rb'
|
6
|
-
|
7
3
|
cli = CLIRouter.new(ARGV)
|
8
|
-
|
9
|
-
# if ARGV.empty?
|
10
|
-
# # this should return the same as 'forecast today'
|
11
|
-
# ARGV[0] = "help"
|
12
|
-
# end
|
13
|
-
|
14
|
-
cli.commands
|
4
|
+
#cli.parse_commands
|
data/config/environment.rb
CHANGED
@@ -1,10 +1,12 @@
|
|
1
1
|
require 'forecast_io'
|
2
|
-
|
2
|
+
require 'geocoder'
|
3
|
+
require 'open-uri'
|
4
|
+
|
5
|
+
# TODO: set this gem to only be used in dev
|
6
|
+
require 'pry'
|
3
7
|
|
4
8
|
ForecastIO.api_key = '2b5cab93f5051c1207517df51d39ceee'
|
5
9
|
|
6
|
-
require_relative '../config/cli'
|
7
|
-
require_relative '../lib/models/scraper'
|
8
10
|
require_relative '../lib/models/forecast'
|
9
|
-
require_relative '../lib/weather_data'
|
11
|
+
require_relative '../lib/models/weather_data'
|
10
12
|
require_relative '../lib/models/cli_router'
|
data/lib/models/cli_router.rb
CHANGED
@@ -1,33 +1,64 @@
|
|
1
1
|
class CLIRouter
|
2
2
|
|
3
|
-
attr_reader :weather_forecast, :
|
3
|
+
attr_reader :weather_forecast, :commands
|
4
4
|
|
5
|
-
|
6
|
-
@weather_forecast = Forecast.new(WeatherData.new)
|
7
|
-
@args = args # in fact this is ARGV
|
8
|
-
end
|
5
|
+
APPROVED_COMMANDS = ["help","today","tomorrow","weekend"]
|
9
6
|
|
10
|
-
def
|
11
|
-
|
12
|
-
puts "if you'd like a different forecast try something like 'forecast tomorrow'"
|
13
|
-
end
|
7
|
+
def initialize(commands)
|
8
|
+
@commands = commands # in fact this is ARGV
|
14
9
|
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
elsif args.length == 0
|
10
|
+
if commands.length == 0
|
11
|
+
puts "Please enter something like 'forecast tomorrow' or enter 'forecast help' to learn more."
|
12
|
+
elsif commands.include?("help")
|
19
13
|
help
|
14
|
+
else
|
15
|
+
parse_commands
|
20
16
|
end
|
21
17
|
end
|
18
|
+
|
19
|
+
def collect_weather_data
|
20
|
+
get_user_location
|
21
|
+
set_forecast_location
|
22
|
+
wd = WeatherData.new(@forecast_location.first, @forecast_location.last)
|
23
|
+
@weather_forecast = Forecast.new(wd)
|
24
|
+
end
|
22
25
|
|
23
|
-
|
24
|
-
|
26
|
+
def get_user_location
|
27
|
+
@longitude_latitude = Geocoder.coordinates(open('http://whatismyip.akamai.com').read)
|
28
|
+
end
|
29
|
+
|
30
|
+
def set_forecast_location
|
31
|
+
#based on idea that location would live in second slot
|
25
32
|
|
26
|
-
|
33
|
+
#if other location false, use current location
|
34
|
+
@forecast_location = Geocoder.coordinates(commands[1]) || @longitude_latitude
|
35
|
+
end
|
27
36
|
|
28
|
-
|
29
|
-
|
30
|
-
|
37
|
+
def help
|
38
|
+
# TODO: rewrite with more detailed help block
|
39
|
+
#puts weather_forecast.today
|
40
|
+
#puts weather_forecast.separator
|
41
|
+
puts <<-TEXT
|
42
|
+
|
43
|
+
Thanks for using Simple Forecast. Currently, the following commands are supported:
|
44
|
+
|
45
|
+
help Displays help (what you're viewing now)
|
46
|
+
today Today's forecast (compared to yesterday)
|
47
|
+
tomorrow Tomorrow's forecast (compared to today)
|
48
|
+
weekend Average temperature for this weekend (compared to today)
|
49
|
+
|
50
|
+
TEXT
|
51
|
+
end
|
52
|
+
|
53
|
+
def parse_commands
|
54
|
+
#binding.pry
|
55
|
+
if commands.length == 1 && APPROVED_COMMANDS.include?(commands[0])
|
56
|
+
collect_weather_data
|
57
|
+
puts weather_forecast.send(self.commands[0])
|
58
|
+
else
|
59
|
+
puts "Sorry, not sure what you're asking for, please enter 'forecast help' to learn more."
|
60
|
+
end
|
61
|
+
end
|
31
62
|
|
32
63
|
end
|
33
64
|
|
data/lib/models/forecast.rb
CHANGED
@@ -1,47 +1,67 @@
|
|
1
1
|
class Forecast
|
2
2
|
|
3
|
-
attr_accessor :today_temp, :yesterday_temp, :tomorrow_temp, :weather_data
|
3
|
+
attr_accessor :today_temp, :yesterday_temp, :tomorrow_temp, :weather_data, :compare_loc
|
4
4
|
|
5
5
|
def initialize(weather_data_object)
|
6
6
|
@weather_data = weather_data_object
|
7
|
-
|
8
|
-
@
|
9
|
-
@tomorrow_temp = self.weather_data.temp_tomorrow
|
10
|
-
# @this_weekend = self.avg_temp_this_weekend
|
11
|
-
# @next_week = self.avg_temp_next_week
|
7
|
+
@today_temp = self.weather_data.today_temp
|
8
|
+
@tomorrow_temp = self.weather_data.tomorrow_temp
|
12
9
|
end
|
13
10
|
|
14
11
|
def today
|
15
|
-
|
16
|
-
|
17
|
-
compare(today_temp, yesterday_temp)
|
12
|
+
@yesterday_temp = self.weather_data.yesterday_temp
|
13
|
+
separator +
|
14
|
+
"#{compare(today_temp, yesterday_temp)}yesterday, #{self.weather_data.today_summary}"
|
18
15
|
end
|
19
16
|
|
20
17
|
def tomorrow
|
21
|
-
|
18
|
+
separator +
|
19
|
+
"#{compare(tomorrow_temp, today_temp)}today, #{self.weather_data.tomorrow_summary}"
|
20
|
+
end
|
21
|
+
|
22
|
+
def weekend
|
23
|
+
separator +
|
24
|
+
"this weekend will be " +
|
25
|
+
compare(avg_temp_this_weekend, today_temp) + "today"
|
22
26
|
end
|
23
27
|
|
28
|
+
def next_week
|
29
|
+
# TODO: compare(this_week_avg, today)
|
30
|
+
end
|
31
|
+
|
24
32
|
def avg_temp_this_weekend
|
33
|
+
data = find_weekend_data
|
34
|
+
weekend_avg = (data[0]["temperatureMax"] + data[1]["temperatureMax"])/2
|
35
|
+
end
|
25
36
|
|
37
|
+
def find_weekend_data
|
38
|
+
weekend_data = weather_data.today_data["daily"]["data"][1..7].select do |data_hash|
|
39
|
+
ruby_datetime = Time.at(data_hash["time"])
|
40
|
+
ruby_datetime.saturday? || ruby_datetime.sunday?
|
41
|
+
end
|
26
42
|
end
|
27
43
|
|
28
|
-
def
|
44
|
+
def avg_temp_this_week
|
29
45
|
|
30
46
|
end
|
31
47
|
|
32
|
-
def
|
33
|
-
# compare(this_week_avg_temp?, temp_for_upcoming_weekend)
|
48
|
+
def avg_temp_next_week
|
34
49
|
end
|
35
50
|
|
36
|
-
def
|
37
|
-
|
51
|
+
def find_week_time
|
52
|
+
week_data = weather_data.today_data["daily"]["data"][1..7].reject do |data_hash|
|
53
|
+
ruby_datetime = Time.at(data_hash["time"])
|
54
|
+
ruby_datetime.saturday? || ruby_datetime.sunday?
|
55
|
+
end
|
56
|
+
pp week_data
|
57
|
+
week_data
|
38
58
|
end
|
39
59
|
|
40
60
|
def compare(temp1, temp2)
|
41
|
-
diff = temp1-temp2
|
61
|
+
diff = (temp1.round-temp2.round).abs
|
42
62
|
|
43
|
-
case diff
|
44
|
-
when (
|
63
|
+
case diff
|
64
|
+
when (0..2)
|
45
65
|
temp1 = temp2
|
46
66
|
when (3..7)
|
47
67
|
mod = "slightly "
|
@@ -54,7 +74,7 @@ class Forecast
|
|
54
74
|
end
|
55
75
|
|
56
76
|
if temp1 == temp2
|
57
|
-
"
|
77
|
+
"about the same as "
|
58
78
|
elsif temp1 < temp2
|
59
79
|
mod + "colder than "
|
60
80
|
else
|
@@ -62,15 +82,9 @@ class Forecast
|
|
62
82
|
end
|
63
83
|
end
|
64
84
|
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
# "warmer than"
|
69
|
-
|
70
|
-
# compared objects
|
71
|
-
# "yesterday"
|
72
|
-
# "today"
|
73
|
-
# "tomorrow"
|
85
|
+
def separator
|
86
|
+
"\n"
|
87
|
+
end
|
74
88
|
|
75
89
|
end
|
76
90
|
|
@@ -0,0 +1,43 @@
|
|
1
|
+
class WeatherData
|
2
|
+
|
3
|
+
attr_accessor :yesterday_data, :today_data, :lat, :long
|
4
|
+
|
5
|
+
NYC = [40.714623, -74.006605]
|
6
|
+
NYC_LAT = NYC[0]
|
7
|
+
NYC_LONG = NYC[1]
|
8
|
+
|
9
|
+
def initialize(lat = NYC.first, long = NYC.last)
|
10
|
+
@lat = lat
|
11
|
+
@long = long
|
12
|
+
print '.'
|
13
|
+
@today_data = ForecastIO.forecast(self.lat, self.long)
|
14
|
+
# when you don't specify a time in the ForecastIO call, you can get the daily high temps
|
15
|
+
end
|
16
|
+
|
17
|
+
def yesterday_temp
|
18
|
+
print '.'
|
19
|
+
@yesterday_data = ForecastIO.forecast(self.lat, self.long, time: time_yesterday)
|
20
|
+
self.yesterday_data["daily"]["data"].first["temperatureMax"]
|
21
|
+
end
|
22
|
+
|
23
|
+
def today_temp
|
24
|
+
self.today_data["daily"]["data"].first["temperatureMax"]
|
25
|
+
end
|
26
|
+
|
27
|
+
def today_summary
|
28
|
+
self.today_data["daily"]["data"][0]["summary"].downcase.gsub(/\./,'')
|
29
|
+
end
|
30
|
+
|
31
|
+
def tomorrow_temp
|
32
|
+
self.today_data["daily"]["data"][1]["temperatureMax"]
|
33
|
+
end
|
34
|
+
|
35
|
+
def tomorrow_summary
|
36
|
+
self.today_data["daily"]["data"][1]["summary"].downcase.gsub(/\./,'')
|
37
|
+
end
|
38
|
+
|
39
|
+
def time_yesterday
|
40
|
+
Time.now.to_i - 86400
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
data/simple_forecast.gemspec
CHANGED
@@ -1,19 +1,22 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
2
|
s.name = 'simple_forecast'
|
3
3
|
s.executables << 'forecast'
|
4
|
-
s.version = "0.0.
|
5
|
-
s.date = "2013-10-
|
4
|
+
s.version = "0.0.3.1"
|
5
|
+
s.date = "2013-10-27"
|
6
6
|
s.summary = "A simple weather forecaster"
|
7
|
-
s.description = "A weather forecast relative to current conditions where you are.
|
7
|
+
s.description = "A weather forecast relative to current conditions where you are. Allows for getting the forecast for today, tomorrow, or the upcoming weekend."
|
8
8
|
s.authors = ["Anders Ramsay", "Joe O'Conor"]
|
9
9
|
s.email = ["andersr@gmail.com", "joe.oconor@gmail.com"]
|
10
10
|
s.files = `git ls-files`.split("\n")
|
11
|
-
s.homepage = 'https://github.com/
|
11
|
+
s.homepage = 'https://github.com/simple-forecast/ruby-gem'
|
12
12
|
s.license = 'MIT'
|
13
13
|
s.require_path = '.'
|
14
14
|
s.add_runtime_dependency 'forecast_io', ['>= 2.0.0']
|
15
|
+
s.add_runtime_dependency 'geocoder', ['>= 1.1.8']
|
15
16
|
s.post_install_message = <<-MSG
|
16
|
-
|
17
|
+
|
18
|
+
Thanks for installing Simple Forecast. Enter 'forecast today' to get today's forecast. Enter 'forecast help' for more commands.
|
19
|
+
|
17
20
|
MSG
|
18
21
|
|
19
22
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: simple_forecast
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Anders Ramsay
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-10-
|
12
|
+
date: 2013-10-27 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: forecast_io
|
@@ -25,8 +25,22 @@ dependencies:
|
|
25
25
|
- - '>='
|
26
26
|
- !ruby/object:Gem::Version
|
27
27
|
version: 2.0.0
|
28
|
-
|
29
|
-
|
28
|
+
- !ruby/object:Gem::Dependency
|
29
|
+
name: geocoder
|
30
|
+
requirement: !ruby/object:Gem::Requirement
|
31
|
+
requirements:
|
32
|
+
- - '>='
|
33
|
+
- !ruby/object:Gem::Version
|
34
|
+
version: 1.1.8
|
35
|
+
type: :runtime
|
36
|
+
prerelease: false
|
37
|
+
version_requirements: !ruby/object:Gem::Requirement
|
38
|
+
requirements:
|
39
|
+
- - '>='
|
40
|
+
- !ruby/object:Gem::Version
|
41
|
+
version: 1.1.8
|
42
|
+
description: A weather forecast relative to current conditions where you are. Allows
|
43
|
+
for getting the forecast for today, tomorrow, or the upcoming weekend.
|
30
44
|
email:
|
31
45
|
- andersr@gmail.com
|
32
46
|
- joe.oconor@gmail.com
|
@@ -40,15 +54,10 @@ files:
|
|
40
54
|
- LICENSE
|
41
55
|
- README.md
|
42
56
|
- bin/forecast
|
43
|
-
- bin/run.rb
|
44
|
-
- config/cli.rb
|
45
57
|
- config/environment.rb
|
46
|
-
- data/forecast_io_sample.rb
|
47
58
|
- lib/models/cli_router.rb
|
48
59
|
- lib/models/forecast.rb
|
49
|
-
- lib/models/
|
50
|
-
- lib/weather_data.rb
|
51
|
-
- notes.md
|
60
|
+
- lib/models/weather_data.rb
|
52
61
|
- simple_forecast.gemspec
|
53
62
|
- spec/cli_spec.rb
|
54
63
|
- spec/geo_locate_spec.rb
|
@@ -56,12 +65,14 @@ files:
|
|
56
65
|
- spec/spec_helper.rb
|
57
66
|
- spec/weather_data_spec.rb
|
58
67
|
- spec/weather_report_spec.rb
|
59
|
-
homepage: https://github.com/
|
68
|
+
homepage: https://github.com/simple-forecast/ruby-gem
|
60
69
|
licenses:
|
61
70
|
- MIT
|
62
71
|
metadata: {}
|
63
|
-
post_install_message: |2
|
64
|
-
|
72
|
+
post_install_message: |2+
|
73
|
+
|
74
|
+
Thanks for installing Simple Forecast. Enter 'forecast today' to get today's forecast. Enter 'forecast help' for more commands.
|
75
|
+
|
65
76
|
rdoc_options: []
|
66
77
|
require_paths:
|
67
78
|
- .
|
data/bin/run.rb
DELETED
data/config/cli.rb
DELETED
@@ -1,56 +0,0 @@
|
|
1
|
-
class CLI
|
2
|
-
|
3
|
-
def initialize
|
4
|
-
@on = true
|
5
|
-
#self.call
|
6
|
-
end
|
7
|
-
|
8
|
-
def on?
|
9
|
-
@on
|
10
|
-
end
|
11
|
-
|
12
|
-
def call
|
13
|
-
while @on == true
|
14
|
-
self.command
|
15
|
-
end
|
16
|
-
end
|
17
|
-
|
18
|
-
def command
|
19
|
-
input = command_request
|
20
|
-
self.send(input)
|
21
|
-
end
|
22
|
-
|
23
|
-
def command_request
|
24
|
-
gets.downcase.strip
|
25
|
-
end
|
26
|
-
|
27
|
-
### COMMANDS ###
|
28
|
-
# COMMANDS = {
|
29
|
-
# :now => ["", "now", "today"],
|
30
|
-
# :tonight => ["tonight"],
|
31
|
-
# :tomorrow => ["tomorrow"],
|
32
|
-
# :next_week => ["next week"]
|
33
|
-
# :help => ["help"]
|
34
|
-
# }
|
35
|
-
|
36
|
-
def exit
|
37
|
-
@on = false
|
38
|
-
end
|
39
|
-
|
40
|
-
def help
|
41
|
-
puts "Please enter something like 'today' or 'tomorrow'."
|
42
|
-
end
|
43
|
-
|
44
|
-
def tomorrow
|
45
|
-
get_data = Forecast.new(WeatherData.new)
|
46
|
-
puts get_data.tomorrow
|
47
|
-
# exit
|
48
|
-
end
|
49
|
-
|
50
|
-
def today
|
51
|
-
get_data = Forecast.new(WeatherData.new)
|
52
|
-
puts get_data.today
|
53
|
-
end
|
54
|
-
|
55
|
-
|
56
|
-
end
|