meteo 1.0.2 → 1.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 +8 -8
- data/.idea/.name +1 -0
- data/.idea/.rakeTasks +7 -0
- data/.idea/encodings.xml +5 -0
- data/.idea/meteo.iml +199 -0
- data/.idea/misc.xml +5 -0
- data/.idea/modules.xml +9 -0
- data/.idea/scopes/scope_settings.xml +5 -0
- data/.idea/vcs.xml +7 -0
- data/.idea/workspace.xml +802 -0
- data/CHANGES +5 -1
- data/bin/meteo +7 -1
- data/lib/meteo/colors.rb +55 -0
- data/lib/meteo/geo.rb +20 -0
- data/lib/meteo/meteo.rb +10 -5
- data/lib/meteo/meteo_cli.rb +13 -11
- data/lib/meteo/version.rb +1 -1
- data/lib/meteo/weather_reporter.rb +147 -0
- data/meteo.gemspec +26 -0
- data/spec/geo_spec.rb +15 -0
- data/spec/meteo_spec.rb +2 -6
- data/spec/spec_helper.rb +2 -0
- data/spec/weather_reporter_spec.rb +11 -0
- metadata +19 -3
- data/lib/meteo/reporter.rb +0 -118
data/CHANGES
CHANGED
data/bin/meteo
CHANGED
@@ -7,6 +7,7 @@ require 'meteo/meteo_cli'
|
|
7
7
|
params = []
|
8
8
|
|
9
9
|
units = "imperial"
|
10
|
+
forecast = 0
|
10
11
|
|
11
12
|
index = 0
|
12
13
|
|
@@ -18,6 +19,11 @@ while index < ARGV.size do
|
|
18
19
|
elsif param =~ /--units/ or param =~ /-u/
|
19
20
|
units = ARGV[index+1]
|
20
21
|
index = index + 1
|
22
|
+
elsif param =~ /--forecast=/ or param =~ /-f=/
|
23
|
+
forecast = ARGV[index][ARGV[index].index("=")+1..-1]
|
24
|
+
elsif param =~ /--forecast/ or param =~ /-f/
|
25
|
+
forecast = ARGV[index+1]
|
26
|
+
index = index + 1
|
21
27
|
else
|
22
28
|
params << param
|
23
29
|
end
|
@@ -25,4 +31,4 @@ while index < ARGV.size do
|
|
25
31
|
index = index + 1
|
26
32
|
end
|
27
33
|
|
28
|
-
MeteoCLI.start ["quote", "--units=#{units}", "#{params.join(' ')}"]
|
34
|
+
MeteoCLI.start ["quote", "--units=#{units}", "--forecast=#{forecast}", "#{params.join(' ')}"]
|
data/lib/meteo/colors.rb
ADDED
@@ -0,0 +1,55 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
module Colors
|
4
|
+
def sun
|
5
|
+
"\033[33;1m\xe2\x98\x80"
|
6
|
+
end
|
7
|
+
|
8
|
+
def moon
|
9
|
+
"\033[36m\xe2\x98\xbd"
|
10
|
+
end
|
11
|
+
|
12
|
+
def clouds
|
13
|
+
"\033[37;1m\xe2\x98\x81"
|
14
|
+
end
|
15
|
+
|
16
|
+
def rain
|
17
|
+
"\xe2\x98\x94"
|
18
|
+
end
|
19
|
+
|
20
|
+
def fog
|
21
|
+
"\033[37;1m\xe2\x96\x92"
|
22
|
+
end
|
23
|
+
|
24
|
+
def snow
|
25
|
+
"\033[37;1m\xe2\x9d\x84"
|
26
|
+
end
|
27
|
+
|
28
|
+
def thunderstorm
|
29
|
+
"\xe2\x9a\xa1"
|
30
|
+
end
|
31
|
+
|
32
|
+
def background
|
33
|
+
"\033[44m"
|
34
|
+
end
|
35
|
+
|
36
|
+
def dashes
|
37
|
+
"\033[34m-"
|
38
|
+
end
|
39
|
+
|
40
|
+
def text
|
41
|
+
"\033[36;1m"
|
42
|
+
end
|
43
|
+
|
44
|
+
def delimiter
|
45
|
+
"\033[35m=>"
|
46
|
+
end
|
47
|
+
|
48
|
+
def data
|
49
|
+
"\033[33;1m"
|
50
|
+
end
|
51
|
+
|
52
|
+
def stop
|
53
|
+
"\033[0m"
|
54
|
+
end
|
55
|
+
end
|
data/lib/meteo/geo.rb
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'net/http'
|
2
|
+
require 'json'
|
3
|
+
|
4
|
+
class Geo
|
5
|
+
GEO_LOCATION_SERVICE_URL = "http://freegeoip.net/json/"
|
6
|
+
|
7
|
+
attr_reader :url
|
8
|
+
|
9
|
+
def initialize
|
10
|
+
@url = GEO_LOCATION_SERVICE_URL
|
11
|
+
end
|
12
|
+
|
13
|
+
def quote ip_address=nil
|
14
|
+
quote_url = ip_address ? "#{url}#{ip_address}" : url
|
15
|
+
|
16
|
+
uri = URI.parse(URI.escape(quote_url))
|
17
|
+
|
18
|
+
JSON.parse(Net::HTTP.get(uri))
|
19
|
+
end
|
20
|
+
end
|
data/lib/meteo/meteo.rb
CHANGED
@@ -1,19 +1,24 @@
|
|
1
1
|
require 'net/http'
|
2
|
+
require 'json'
|
2
3
|
|
3
4
|
class Meteo
|
4
|
-
OPEN_WEATHER_MAP_SERVICE_URL = 'http://api.openweathermap.org/data/2.5
|
5
|
+
OPEN_WEATHER_MAP_SERVICE_URL = 'http://api.openweathermap.org/data/2.5'
|
5
6
|
|
6
7
|
attr_reader :url
|
7
8
|
|
8
|
-
def initialize
|
9
|
-
|
9
|
+
def initialize(forecast=false)
|
10
|
+
if forecast
|
11
|
+
@url = "#{OPEN_WEATHER_MAP_SERVICE_URL}/forecast/daily"
|
12
|
+
else
|
13
|
+
@url = "#{OPEN_WEATHER_MAP_SERVICE_URL}/weather"
|
14
|
+
end
|
10
15
|
end
|
11
16
|
|
12
17
|
def quote location, units
|
13
|
-
quote_url = "#{url}?q=#{location}
|
18
|
+
quote_url = "#{url}?q=#{location}&units=#{units}"
|
14
19
|
|
15
20
|
uri = URI.parse(URI.escape(quote_url))
|
16
21
|
|
17
|
-
Net::HTTP.get(uri)
|
22
|
+
JSON.parse(Net::HTTP.get(uri))
|
18
23
|
end
|
19
24
|
end
|
data/lib/meteo/meteo_cli.rb
CHANGED
@@ -1,10 +1,9 @@
|
|
1
1
|
require "thor"
|
2
|
-
require '
|
3
|
-
require 'meteo'
|
4
|
-
require 'meteo/
|
2
|
+
require 'meteo/meteo'
|
3
|
+
require 'meteo/geo'
|
4
|
+
require 'meteo/weather_reporter'
|
5
5
|
|
6
6
|
class MeteoCLI < Thor
|
7
|
-
include Reporter
|
8
7
|
|
9
8
|
desc "quote location", "quote weather for location"
|
10
9
|
long_desc <<-LONGDESC
|
@@ -15,20 +14,23 @@ class MeteoCLI < Thor
|
|
15
14
|
|
16
15
|
> $ meteo Plainsboro, NJ
|
17
16
|
> $ meteo Moscow, RU --units=metric
|
17
|
+
> $ meteo # get weather for current location based on IP address
|
18
18
|
LONGDESC
|
19
19
|
option :units, :aliases => "-u"
|
20
|
+
option :forecast
|
20
21
|
def quote(location)
|
22
|
+
location = (location.nil? or location.strip.size == 0) ? Geo.new.quote : location
|
23
|
+
|
21
24
|
units = options[:units] ? options[:units] : "imperial"
|
25
|
+
forecast = options[:forecast] ? options[:forecast].to_i : 0
|
26
|
+
|
27
|
+
service = Meteo.new(forecast > 0)
|
22
28
|
|
23
|
-
|
29
|
+
response = service.quote(location, units)
|
24
30
|
|
25
|
-
|
31
|
+
reporter = WeatherReporter.new
|
26
32
|
|
27
|
-
|
28
|
-
puts response["message"]
|
29
|
-
else
|
30
|
-
puts report(response, units).join(' ')
|
31
|
-
end
|
33
|
+
reporter.report(response, units, forecast)
|
32
34
|
end
|
33
35
|
|
34
36
|
end
|
data/lib/meteo/version.rb
CHANGED
@@ -0,0 +1,147 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
require 'meteo/colors'
|
4
|
+
require 'awesome_print'
|
5
|
+
|
6
|
+
class WeatherReporter
|
7
|
+
include Colors
|
8
|
+
|
9
|
+
WIND_DIRECTIONS = %W(N NNE NE ENE E ESE SE SSE S SSW SW WSW W WNW NW NNW)
|
10
|
+
|
11
|
+
def report(response, units, forecast)
|
12
|
+
if forecast == 0
|
13
|
+
current_weather_report response, units
|
14
|
+
else
|
15
|
+
forecast_report response, units, forecast
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def current_weather_report response, units
|
20
|
+
if response["message"]
|
21
|
+
puts response["message"]
|
22
|
+
else
|
23
|
+
sunrise = response['sys']['sunrise']
|
24
|
+
sunset = response['sys']['sunset']
|
25
|
+
pressure = response['main']['pressure']
|
26
|
+
city = response['name']
|
27
|
+
temperature = response['main']['temp']
|
28
|
+
humidity = response['main']['humidity']
|
29
|
+
sky = response['weather'][0]['main']
|
30
|
+
wind = response['wind']['speed']
|
31
|
+
azimuth = response['wind']['deg']
|
32
|
+
|
33
|
+
direction = WIND_DIRECTIONS[((azimuth + 11.25)/22.5 % 16).to_i]
|
34
|
+
|
35
|
+
result = %W(
|
36
|
+
#{background}#{text}#{get_icon(sky, current_period(sunset, sunrise))}#{dashes}#{text}
|
37
|
+
#{city} #{delimiter}#{data}
|
38
|
+
#{text}Temperature #{data}#{temperature}#{temperature_scale(units)}
|
39
|
+
#{text}Humidity #{data}#{humidity}%
|
40
|
+
#{text}Wind #{data}#{wind}#{speed_unit(units)} #{direction}
|
41
|
+
#{text}Pressure #{data}#{pressure(pressure, units)}#{pressure_unit(units)}
|
42
|
+
#{text}Sunrise #{data}#{Time.at(sunrise).strftime('%I:%M:%S%p')}
|
43
|
+
#{text}Sunset #{data}#{Time.at(sunset).strftime('%I:%M:%S%p')}#{stop}
|
44
|
+
)
|
45
|
+
|
46
|
+
puts result.join(' ')
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def forecast_report response, units, forecast
|
51
|
+
city = response['city']['name']
|
52
|
+
|
53
|
+
max_forecast = response['list'].size
|
54
|
+
|
55
|
+
forecast = (forecast <= max_forecast) ? forecast : max_forecast
|
56
|
+
|
57
|
+
puts "#{background}#{text}Forecast for #{city}:"
|
58
|
+
|
59
|
+
(0..forecast-1).each do |index|
|
60
|
+
day = response['list'][index]
|
61
|
+
sky = day['weather'][0]['main']
|
62
|
+
date = day['dt']
|
63
|
+
max = day['temp']['max']
|
64
|
+
min = day['temp']['min']
|
65
|
+
morning = day['temp']['morn']
|
66
|
+
evening = day['temp']['eve']
|
67
|
+
night = day['temp']['night']
|
68
|
+
humidity = day['humidity']
|
69
|
+
pressure = day['pressure']
|
70
|
+
|
71
|
+
wind = day['speed']
|
72
|
+
azimuth = day['deg']
|
73
|
+
|
74
|
+
direction = WIND_DIRECTIONS[((azimuth + 11.25)/22.5 % 16).to_i]
|
75
|
+
|
76
|
+
result = %W(
|
77
|
+
#{background}#{text}#{index+1}. #{get_icon(sky, 'none')}
|
78
|
+
#{data}#{Time.at(date).strftime('%Y/%m/%d')}
|
79
|
+
#{text}Temperature
|
80
|
+
#{text}min: #{data}#{min}#{temperature_scale(units)}
|
81
|
+
#{text}max: #{data}#{max}#{temperature_scale(units)}
|
82
|
+
#{text}morning: #{data}#{morning}#{temperature_scale(units)}
|
83
|
+
#{text}evening: #{data}#{evening}#{temperature_scale(units)}
|
84
|
+
#{text}night: #{data}#{night}#{temperature_scale(units)}
|
85
|
+
#{text}Humidity #{data}#{humidity}%
|
86
|
+
#{text}Wind #{data}#{wind}#{speed_unit(units)} #{direction}
|
87
|
+
#{text}Pressure #{data}#{pressure(pressure, units)}#{pressure_unit(units)}#{stop}
|
88
|
+
)
|
89
|
+
|
90
|
+
puts result.join(' ')
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
def get_icon(sky, period)
|
95
|
+
name =
|
96
|
+
case sky
|
97
|
+
when 'Clear'
|
98
|
+
(period == "night") ? moon : sun
|
99
|
+
|
100
|
+
when 'Clouds'
|
101
|
+
clouds
|
102
|
+
|
103
|
+
when 'Rain'
|
104
|
+
rain
|
105
|
+
|
106
|
+
when 'Fog'
|
107
|
+
fog
|
108
|
+
|
109
|
+
when 'Snow'
|
110
|
+
snow
|
111
|
+
|
112
|
+
when 'Thunderstorm'
|
113
|
+
thunderstorm
|
114
|
+
|
115
|
+
else
|
116
|
+
(period == "night") ? moon : sun
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
def current_period
|
121
|
+
current_time = Time.now.to_i
|
122
|
+
|
123
|
+
if current_time >= sunset or current_time <= sunrise
|
124
|
+
'night'
|
125
|
+
else
|
126
|
+
'day'
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
def temperature_scale units
|
131
|
+
(units == 'metric') ? "°C" : "°F"
|
132
|
+
end
|
133
|
+
|
134
|
+
def speed_unit units
|
135
|
+
(units == 'metric') ? "m/s" : "mph"
|
136
|
+
end
|
137
|
+
|
138
|
+
def pressure_unit units
|
139
|
+
(units == 'metric') ? "hPa" : "inHg"
|
140
|
+
end
|
141
|
+
|
142
|
+
def pressure pressure, units
|
143
|
+
(units == 'metric') ? sprintf('%.0f', pressure) : sprintf('%.2f', pressure*0.0295)
|
144
|
+
end
|
145
|
+
end
|
146
|
+
|
147
|
+
|
data/meteo.gemspec
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
require File.expand_path(File.dirname(__FILE__) + '/lib/meteo/version')
|
4
|
+
|
5
|
+
Gem::Specification.new do |spec|
|
6
|
+
spec.name = "meteo"
|
7
|
+
spec.summary = %q{Provides command line access to OpenWeatherMap service.}
|
8
|
+
spec.description = %q{Provides command line access to OpenWeatherMap service.}
|
9
|
+
spec.email = "alexander.shvets@gmail.com"
|
10
|
+
spec.authors = ["Alexander Shvets"]
|
11
|
+
spec.homepage = "http://github.com/shvets/meteo"
|
12
|
+
spec.executables = ["meteo"]
|
13
|
+
|
14
|
+
spec.files = `git ls-files`.split($\)
|
15
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
16
|
+
spec.require_paths = ["lib"]
|
17
|
+
spec.version = Meteo::VERSION
|
18
|
+
spec.license = "MIT"
|
19
|
+
|
20
|
+
|
21
|
+
spec.add_runtime_dependency "thor", [">= 0"]
|
22
|
+
spec.add_development_dependency "gemspec_deps_gen", [">= 0"]
|
23
|
+
spec.add_development_dependency "gemcutter", [">= 0"]
|
24
|
+
|
25
|
+
end
|
26
|
+
|
data/spec/geo_spec.rb
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/spec_helper'
|
2
|
+
|
3
|
+
require 'meteo/geo'
|
4
|
+
|
5
|
+
describe Geo do
|
6
|
+
describe "#quote" do
|
7
|
+
it "gets the quote" do
|
8
|
+
result = subject.quote("apple.com")
|
9
|
+
|
10
|
+
expect(result['city']).to eq("Cupertino")
|
11
|
+
expect(result['country_code']).to eq("US")
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
end
|
data/spec/meteo_spec.rb
CHANGED
@@ -1,15 +1,11 @@
|
|
1
|
-
# meteo_spec.rb
|
2
|
-
|
3
1
|
require File.dirname(__FILE__) + '/spec_helper'
|
4
2
|
|
5
|
-
require 'meteo'
|
6
|
-
require 'json'
|
7
|
-
#require 'awesome_print'
|
3
|
+
require 'meteo/meteo'
|
8
4
|
|
9
5
|
describe Meteo do
|
10
6
|
describe "#quote" do
|
11
7
|
it "gets the quote" do
|
12
|
-
result =
|
8
|
+
result = subject.quote("plainsboro, nj", "imperial")
|
13
9
|
|
14
10
|
expect(result['sys']['country']).to eq("United States of America")
|
15
11
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -0,0 +1,11 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/spec_helper'
|
2
|
+
|
3
|
+
require 'meteo/weather_reporter'
|
4
|
+
|
5
|
+
describe WeatherReporter do
|
6
|
+
it 'has expected meteo status instance methods' do
|
7
|
+
%w[fog rain moon sun clouds thunderstorm].each do |status|
|
8
|
+
subject.methods.should include(status.to_sym)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: meteo
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0
|
4
|
+
version: 1.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Alexander Shvets
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-11-
|
11
|
+
date: 2013-11-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: thor
|
@@ -60,6 +60,15 @@ extensions: []
|
|
60
60
|
extra_rdoc_files: []
|
61
61
|
files:
|
62
62
|
- .gitignore
|
63
|
+
- .idea/.name
|
64
|
+
- .idea/.rakeTasks
|
65
|
+
- .idea/encodings.xml
|
66
|
+
- .idea/meteo.iml
|
67
|
+
- .idea/misc.xml
|
68
|
+
- .idea/modules.xml
|
69
|
+
- .idea/scopes/scope_settings.xml
|
70
|
+
- .idea/vcs.xml
|
71
|
+
- .idea/workspace.xml
|
63
72
|
- .ruby-gemset
|
64
73
|
- .ruby-version
|
65
74
|
- CHANGES
|
@@ -70,13 +79,18 @@ files:
|
|
70
79
|
- bin/meteo
|
71
80
|
- bin/meteo.bat
|
72
81
|
- lib/meteo.rb
|
82
|
+
- lib/meteo/colors.rb
|
83
|
+
- lib/meteo/geo.rb
|
73
84
|
- lib/meteo/meteo.rb
|
74
85
|
- lib/meteo/meteo_cli.rb
|
75
|
-
- lib/meteo/reporter.rb
|
76
86
|
- lib/meteo/version.rb
|
87
|
+
- lib/meteo/weather_reporter.rb
|
88
|
+
- meteo.gemspec
|
77
89
|
- meteo.gemspec.erb
|
90
|
+
- spec/geo_spec.rb
|
78
91
|
- spec/meteo_spec.rb
|
79
92
|
- spec/spec_helper.rb
|
93
|
+
- spec/weather_reporter_spec.rb
|
80
94
|
homepage: http://github.com/shvets/meteo
|
81
95
|
licenses:
|
82
96
|
- MIT
|
@@ -102,5 +116,7 @@ signing_key:
|
|
102
116
|
specification_version: 4
|
103
117
|
summary: Provides command line access to OpenWeatherMap service.
|
104
118
|
test_files:
|
119
|
+
- spec/geo_spec.rb
|
105
120
|
- spec/meteo_spec.rb
|
106
121
|
- spec/spec_helper.rb
|
122
|
+
- spec/weather_reporter_spec.rb
|