open-weather-api 0.0.6 → 0.0.7
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rspec +1 -1
- data/CONTRIBUTING.md +9 -9
- data/Gemfile +2 -2
- data/lib/open-weather-api/api.rb +56 -56
- data/lib/open-weather-api/config.rb +8 -8
- data/lib/open-weather-api/resources/base.rb +66 -66
- data/lib/open-weather-api/resources/current.rb +44 -44
- data/lib/open-weather-api/resources/forecast_daily.rb +18 -18
- data/lib/open-weather-api/resources/forecast_hourly.rb +27 -27
- data/lib/open-weather-api/resources/handlers/base.rb +98 -98
- data/lib/open-weather-api/resources/handlers/current.rb +54 -54
- data/lib/open-weather-api/resources/raw.rb +14 -14
- data/lib/open-weather-api/version.rb +1 -1
- data/open-weather-api.gemspec +1 -1
- data/rakefile +29 -28
- data/spec/current_weather_spec.rb +50 -50
- data/spec/forecast_daily_spec.rb +33 -33
- data/spec/forecast_hourly_spec.rb +33 -33
- data/spec/raw_spec.rb +16 -16
- data/spec/spec_helper.rb +11 -11
- metadata +15 -16
@@ -1,99 +1,99 @@
|
|
1
|
-
module OpenWeatherAPI
|
2
|
-
module Resources
|
3
|
-
module Handlers
|
4
|
-
|
5
|
-
class QueryHandler
|
6
|
-
def initialize(api_obj, parameters = {})
|
7
|
-
@api_obj = api_obj
|
8
|
-
@parameters = parameters
|
9
|
-
end
|
10
|
-
|
11
|
-
def handle
|
12
|
-
build if can?
|
13
|
-
end
|
14
|
-
|
15
|
-
def can?
|
16
|
-
value != nil
|
17
|
-
end
|
18
|
-
|
19
|
-
private
|
20
|
-
|
21
|
-
def value
|
22
|
-
true
|
23
|
-
end
|
24
|
-
|
25
|
-
def build
|
26
|
-
@parameters
|
27
|
-
end
|
28
|
-
|
29
|
-
def country_code
|
30
|
-
@parameters[:country_code] || @parameters[:cc] || @api_obj.default_country_code
|
31
|
-
end
|
32
|
-
|
33
|
-
def cities_count
|
34
|
-
@parameters[:count] || @parameters[:cnt] || @parameters[:cities_count]
|
35
|
-
end
|
36
|
-
|
37
|
-
def cluster
|
38
|
-
@parameters[:cluster] if @parameters[:cluster].to_s == 'yes' || @parameters[:cluster].to_s == 'no'
|
39
|
-
end
|
40
|
-
|
41
|
-
def fill(hash)
|
42
|
-
hash[:cnt] = cities_count if cities_count
|
43
|
-
hash[:cluster] = cluster if cluster
|
44
|
-
|
45
|
-
hash
|
46
|
-
end
|
47
|
-
end
|
48
|
-
|
49
|
-
class City < QueryHandler
|
50
|
-
private
|
51
|
-
|
52
|
-
def build
|
53
|
-
{ q: [value, country_code].compact.flatten.join(',') }
|
54
|
-
end
|
55
|
-
|
56
|
-
def value
|
57
|
-
@parameters[:city]
|
58
|
-
end
|
59
|
-
end
|
60
|
-
|
61
|
-
class CityID < QueryHandler
|
62
|
-
def multiple?
|
63
|
-
value.is_a? Array
|
64
|
-
end
|
65
|
-
|
66
|
-
private
|
67
|
-
|
68
|
-
def build
|
69
|
-
{ id: [value].flatten.compact.join(',') }
|
70
|
-
end
|
71
|
-
|
72
|
-
def value
|
73
|
-
@parameters[:id] || @parameters[:city_id]
|
74
|
-
end
|
75
|
-
end
|
76
|
-
|
77
|
-
class Geolocation < QueryHandler
|
78
|
-
def can?
|
79
|
-
latitude != nil && longitude != nil
|
80
|
-
end
|
81
|
-
|
82
|
-
private
|
83
|
-
|
84
|
-
def build
|
85
|
-
{ lat: latitude, lon: longitude }
|
86
|
-
end
|
87
|
-
|
88
|
-
def latitude
|
89
|
-
@parameters[:latitude] || @parameters[:lat]
|
90
|
-
end
|
91
|
-
|
92
|
-
def longitude
|
93
|
-
@parameters[:longitude] || @parameters[:lon]
|
94
|
-
end
|
95
|
-
end
|
96
|
-
|
97
|
-
end
|
98
|
-
end
|
1
|
+
module OpenWeatherAPI
|
2
|
+
module Resources
|
3
|
+
module Handlers
|
4
|
+
|
5
|
+
class QueryHandler
|
6
|
+
def initialize(api_obj, parameters = {})
|
7
|
+
@api_obj = api_obj
|
8
|
+
@parameters = parameters
|
9
|
+
end
|
10
|
+
|
11
|
+
def handle
|
12
|
+
build if can?
|
13
|
+
end
|
14
|
+
|
15
|
+
def can?
|
16
|
+
value != nil
|
17
|
+
end
|
18
|
+
|
19
|
+
private
|
20
|
+
|
21
|
+
def value
|
22
|
+
true
|
23
|
+
end
|
24
|
+
|
25
|
+
def build
|
26
|
+
@parameters
|
27
|
+
end
|
28
|
+
|
29
|
+
def country_code
|
30
|
+
@parameters[:country_code] || @parameters[:cc] || @api_obj.default_country_code
|
31
|
+
end
|
32
|
+
|
33
|
+
def cities_count
|
34
|
+
@parameters[:count] || @parameters[:cnt] || @parameters[:cities_count]
|
35
|
+
end
|
36
|
+
|
37
|
+
def cluster
|
38
|
+
@parameters[:cluster] if @parameters[:cluster].to_s == 'yes' || @parameters[:cluster].to_s == 'no'
|
39
|
+
end
|
40
|
+
|
41
|
+
def fill(hash)
|
42
|
+
hash[:cnt] = cities_count if cities_count
|
43
|
+
hash[:cluster] = cluster if cluster
|
44
|
+
|
45
|
+
hash
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
class City < QueryHandler
|
50
|
+
private
|
51
|
+
|
52
|
+
def build
|
53
|
+
{ q: [value, country_code].compact.flatten.join(',') }
|
54
|
+
end
|
55
|
+
|
56
|
+
def value
|
57
|
+
@parameters[:city]
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
class CityID < QueryHandler
|
62
|
+
def multiple?
|
63
|
+
value.is_a? Array
|
64
|
+
end
|
65
|
+
|
66
|
+
private
|
67
|
+
|
68
|
+
def build
|
69
|
+
{ id: [value].flatten.compact.join(',') }
|
70
|
+
end
|
71
|
+
|
72
|
+
def value
|
73
|
+
@parameters[:id] || @parameters[:city_id]
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
class Geolocation < QueryHandler
|
78
|
+
def can?
|
79
|
+
latitude != nil && longitude != nil
|
80
|
+
end
|
81
|
+
|
82
|
+
private
|
83
|
+
|
84
|
+
def build
|
85
|
+
{ lat: latitude, lon: longitude }
|
86
|
+
end
|
87
|
+
|
88
|
+
def latitude
|
89
|
+
@parameters[:latitude] || @parameters[:lat]
|
90
|
+
end
|
91
|
+
|
92
|
+
def longitude
|
93
|
+
@parameters[:longitude] || @parameters[:lon]
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
end
|
98
|
+
end
|
99
99
|
end
|
@@ -1,55 +1,55 @@
|
|
1
|
-
module OpenWeatherAPI
|
2
|
-
module Resources
|
3
|
-
module Handlers
|
4
|
-
|
5
|
-
class Zipcode < QueryHandler
|
6
|
-
private
|
7
|
-
|
8
|
-
def build
|
9
|
-
{ zip: [value, country_code].compact.flatten.join(',') }
|
10
|
-
end
|
11
|
-
|
12
|
-
def value
|
13
|
-
@parameters[:zipcode] || @parameters[:zip]
|
14
|
-
end
|
15
|
-
end
|
16
|
-
|
17
|
-
class BoundingBox < QueryHandler
|
18
|
-
private
|
19
|
-
|
20
|
-
def topleft
|
21
|
-
[ value[:topleft][:lat], value[:topleft][:lon] ].join(',')
|
22
|
-
end
|
23
|
-
|
24
|
-
def bottomright
|
25
|
-
[ value[:bottomright][:lat], value[:bottomright][:lon] ].join(',')
|
26
|
-
end
|
27
|
-
|
28
|
-
def zoom
|
29
|
-
value[:zoom] || value[:map_zoom] || 10
|
30
|
-
end
|
31
|
-
|
32
|
-
def value
|
33
|
-
@parameters[:box] || @parameters[:box] || @parameters[:rect] || @parameters[:rectangle]
|
34
|
-
end
|
35
|
-
|
36
|
-
def build
|
37
|
-
fill bbox: [topleft, bottomright, zoom].join(',')
|
38
|
-
end
|
39
|
-
end
|
40
|
-
|
41
|
-
class Circle < QueryHandler
|
42
|
-
private
|
43
|
-
|
44
|
-
def value
|
45
|
-
@parameters[:circle]
|
46
|
-
end
|
47
|
-
|
48
|
-
def build
|
49
|
-
fill lat: value[:lat], lon: value[:lon]
|
50
|
-
end
|
51
|
-
end
|
52
|
-
|
53
|
-
end
|
54
|
-
end
|
1
|
+
module OpenWeatherAPI
|
2
|
+
module Resources
|
3
|
+
module Handlers
|
4
|
+
|
5
|
+
class Zipcode < QueryHandler
|
6
|
+
private
|
7
|
+
|
8
|
+
def build
|
9
|
+
{ zip: [value, country_code].compact.flatten.join(',') }
|
10
|
+
end
|
11
|
+
|
12
|
+
def value
|
13
|
+
@parameters[:zipcode] || @parameters[:zip]
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
class BoundingBox < QueryHandler
|
18
|
+
private
|
19
|
+
|
20
|
+
def topleft
|
21
|
+
[ value[:topleft][:lat], value[:topleft][:lon] ].join(',')
|
22
|
+
end
|
23
|
+
|
24
|
+
def bottomright
|
25
|
+
[ value[:bottomright][:lat], value[:bottomright][:lon] ].join(',')
|
26
|
+
end
|
27
|
+
|
28
|
+
def zoom
|
29
|
+
value[:zoom] || value[:map_zoom] || 10
|
30
|
+
end
|
31
|
+
|
32
|
+
def value
|
33
|
+
@parameters[:box] || @parameters[:box] || @parameters[:rect] || @parameters[:rectangle]
|
34
|
+
end
|
35
|
+
|
36
|
+
def build
|
37
|
+
fill bbox: [topleft, bottomright, zoom].join(',')
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
class Circle < QueryHandler
|
42
|
+
private
|
43
|
+
|
44
|
+
def value
|
45
|
+
@parameters[:circle]
|
46
|
+
end
|
47
|
+
|
48
|
+
def build
|
49
|
+
fill lat: value[:lat], lon: value[:lon]
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
end
|
54
|
+
end
|
55
55
|
end
|
@@ -1,15 +1,15 @@
|
|
1
|
-
module OpenWeatherAPI
|
2
|
-
module Resources
|
3
|
-
class Raw < Base
|
4
|
-
|
5
|
-
def execute(resource = '/', **args, &block)
|
6
|
-
@resource = resource
|
7
|
-
super(**args, &block)
|
8
|
-
end
|
9
|
-
|
10
|
-
def base_url
|
11
|
-
return super + @resource
|
12
|
-
end
|
13
|
-
end
|
14
|
-
end
|
1
|
+
module OpenWeatherAPI
|
2
|
+
module Resources
|
3
|
+
class Raw < Base
|
4
|
+
|
5
|
+
def execute(resource = '/', **args, &block)
|
6
|
+
@resource = resource
|
7
|
+
super(**args, &block)
|
8
|
+
end
|
9
|
+
|
10
|
+
def base_url
|
11
|
+
return super + @resource
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
15
|
end
|
data/open-weather-api.gemspec
CHANGED
@@ -18,7 +18,7 @@ Gem::Specification.new do |spec|
|
|
18
18
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
19
|
spec.require_paths = ["lib"]
|
20
20
|
|
21
|
-
spec.add_runtime_dependency "rest-client", "~>
|
21
|
+
spec.add_runtime_dependency "rest-client", "~> 2.0"
|
22
22
|
|
23
23
|
spec.add_development_dependency "rspec"
|
24
24
|
spec.add_development_dependency "fuubar"
|
data/rakefile
CHANGED
@@ -1,28 +1,29 @@
|
|
1
|
-
# Gemspec
|
2
|
-
load 'open-weather-api.gemspec'
|
3
|
-
|
4
|
-
# Dependencies
|
5
|
-
require 'open-weather-api'
|
6
|
-
require 'fileutils'
|
7
|
-
|
8
|
-
|
9
|
-
# Build
|
10
|
-
|
11
|
-
built_gem_file = "open-weather-api-#{OpenWeatherAPI::VERSION}.gem"
|
12
|
-
|
13
|
-
task :build do
|
14
|
-
# Build the gem
|
15
|
-
sh 'gem build open-weather-api.gemspec'
|
16
|
-
|
17
|
-
# Move it to /build
|
18
|
-
FileUtils.
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
1
|
+
# Gemspec
|
2
|
+
load 'open-weather-api.gemspec'
|
3
|
+
|
4
|
+
# Dependencies
|
5
|
+
require 'open-weather-api'
|
6
|
+
require 'fileutils'
|
7
|
+
|
8
|
+
|
9
|
+
# Build
|
10
|
+
|
11
|
+
built_gem_file = "open-weather-api-#{OpenWeatherAPI::VERSION}.gem"
|
12
|
+
|
13
|
+
task :build do
|
14
|
+
# Build the gem
|
15
|
+
sh 'gem build open-weather-api.gemspec'
|
16
|
+
|
17
|
+
# Move it to /build
|
18
|
+
FileUtils.mkdir_p "build/"
|
19
|
+
FileUtils.mv "#{built_gem_file}", "build/#{built_gem_file}", force: true
|
20
|
+
end
|
21
|
+
|
22
|
+
task publish: [:build] do
|
23
|
+
sh "gem push build/#{built_gem_file}"
|
24
|
+
end
|
25
|
+
|
26
|
+
# Test
|
27
|
+
task :test do
|
28
|
+
sh 'bundle exec rspec spec'
|
29
|
+
end
|
@@ -1,51 +1,51 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe OpenWeatherAPI::API do
|
4
|
-
describe 'When fetching current weather' do
|
5
|
-
let(:api) { OpenWeatherAPI::API.new( api_key: ENV['OPEN_WEATHER_API_KEY'], default_language: 'es', default_country_code: 'es' ) }
|
6
|
-
|
7
|
-
it 'should retrieve data by city name' do
|
8
|
-
expect(api.current(city: 'Santa Cruz de Tenerife')[:cod].to_i).to eq(200)
|
9
|
-
end
|
10
|
-
|
11
|
-
it 'should retrieve data by city id' do
|
12
|
-
expect(api.current(id: 6360638)[:cod].to_i).to eq(200)
|
13
|
-
end
|
14
|
-
|
15
|
-
it 'should retrieve data by cities ids' do
|
16
|
-
response = api.current(id: [6360638, 2511401])
|
17
|
-
expect(response[:cod].to_i).not_to be >= 400
|
18
|
-
end
|
19
|
-
|
20
|
-
it 'should retrieve data by geolocation' do
|
21
|
-
expect(api.current(lon: -16.20302, lat: 28.53924)[:cod].to_i).to eq(200)
|
22
|
-
end
|
23
|
-
|
24
|
-
it 'should retrieve data by zipcode' do
|
25
|
-
expect(api.current(zipcode: 38190)[:cod].to_i).to eq(200)
|
26
|
-
end
|
27
|
-
|
28
|
-
it 'should retrieve data by bounding box' do
|
29
|
-
expect(api.current(rectangle: { topleft: { lat: -16.3319, lon: 28.5046 }, bottomright: { lat: -16.1972, lon: 28.4400}, zoom: 10 })[:cod].to_i).to eq(200)
|
30
|
-
end
|
31
|
-
|
32
|
-
it 'should retrieve data by circle' do
|
33
|
-
expect(api.current(circle: { lat: -16.3319, lon: 28.5046 }, cities_count: 2)[:cod].to_i).to eq(200)
|
34
|
-
end
|
35
|
-
|
36
|
-
it 'works with a given block' do
|
37
|
-
json1, json2 = nil
|
38
|
-
json1 = api.current(city: 'Santa Cruz de Tenerife') { |json| json2 = json }
|
39
|
-
|
40
|
-
expect(json1).to eq(json2)
|
41
|
-
end
|
42
|
-
|
43
|
-
it 'works with xml format' do
|
44
|
-
expect(api.current(city: 'Santa Cruz de Tenerife', mode: :xml)).not_to be_nil
|
45
|
-
end
|
46
|
-
|
47
|
-
it 'works with html format' do
|
48
|
-
expect(api.current(city: 'Santa Cruz de Tenerife', mode: :html)).not_to be_nil
|
49
|
-
end
|
50
|
-
end
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe OpenWeatherAPI::API do
|
4
|
+
describe 'When fetching current weather' do
|
5
|
+
let(:api) { OpenWeatherAPI::API.new( api_key: ENV['OPEN_WEATHER_API_KEY'], default_language: 'es', default_country_code: 'es' ) }
|
6
|
+
|
7
|
+
it 'should retrieve data by city name' do
|
8
|
+
expect(api.current(city: 'Santa Cruz de Tenerife')[:cod].to_i).to eq(200)
|
9
|
+
end
|
10
|
+
|
11
|
+
it 'should retrieve data by city id' do
|
12
|
+
expect(api.current(id: 6360638)[:cod].to_i).to eq(200)
|
13
|
+
end
|
14
|
+
|
15
|
+
it 'should retrieve data by cities ids' do
|
16
|
+
response = api.current(id: [6360638, 2511401])
|
17
|
+
expect(response[:cod].to_i).not_to be >= 400
|
18
|
+
end
|
19
|
+
|
20
|
+
it 'should retrieve data by geolocation' do
|
21
|
+
expect(api.current(lon: -16.20302, lat: 28.53924)[:cod].to_i).to eq(200)
|
22
|
+
end
|
23
|
+
|
24
|
+
it 'should retrieve data by zipcode' do
|
25
|
+
expect(api.current(zipcode: 38190)[:cod].to_i).to eq(200)
|
26
|
+
end
|
27
|
+
|
28
|
+
it 'should retrieve data by bounding box' do
|
29
|
+
expect(api.current(rectangle: { topleft: { lat: -16.3319, lon: 28.5046 }, bottomright: { lat: -16.1972, lon: 28.4400}, zoom: 10 })[:cod].to_i).to eq(200)
|
30
|
+
end
|
31
|
+
|
32
|
+
it 'should retrieve data by circle' do
|
33
|
+
expect(api.current(circle: { lat: -16.3319, lon: 28.5046 }, cities_count: 2)[:cod].to_i).to eq(200)
|
34
|
+
end
|
35
|
+
|
36
|
+
it 'works with a given block' do
|
37
|
+
json1, json2 = nil
|
38
|
+
json1 = api.current(city: 'Santa Cruz de Tenerife') { |json| json2 = json }
|
39
|
+
|
40
|
+
expect(json1).to eq(json2)
|
41
|
+
end
|
42
|
+
|
43
|
+
it 'works with xml format' do
|
44
|
+
expect(api.current(city: 'Santa Cruz de Tenerife', mode: :xml)).not_to be_nil
|
45
|
+
end
|
46
|
+
|
47
|
+
it 'works with html format' do
|
48
|
+
expect(api.current(city: 'Santa Cruz de Tenerife', mode: :html)).not_to be_nil
|
49
|
+
end
|
50
|
+
end
|
51
51
|
end
|