open_weather 0.0.2 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/open_weather.rb +19 -1
- data/lib/open_weather/client.rb +16 -6
- data/lib/open_weather/query_builder.rb +92 -0
- data/lib/open_weather/version.rb +1 -1
- data/spec/open_weather/query_builder_spec.rb +70 -0
- metadata +5 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 001deca9d50d6b07ab8284a3ec5c038ee5143fcc
|
4
|
+
data.tar.gz: 2a18341ff8cf95e807ddad88d9cfe48bb9b712cf
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 36d5b56d5402bd32130489c3e7792a62a865b13c9ba253cddaf09514aadf5376be52e120754fb829fd99897108bff7110bacc95fbd4ecf92cce55b698efd9e11
|
7
|
+
data.tar.gz: 10170e99eb833b90d8521dbf66d84d6eb7cd035ad9446bbaa6f5111144cc2e00d7e87385c6192b76453c93000f964cd943b3c9d47a38aaac9390de4c0d5ed909
|
data/lib/open_weather.rb
CHANGED
@@ -6,5 +6,23 @@ require "open_weather/version"
|
|
6
6
|
require "open_weather/client"
|
7
7
|
|
8
8
|
module OpenWeather
|
9
|
-
|
9
|
+
def self.current(*location)
|
10
|
+
client.weather(*location)
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.forecast(*location)
|
14
|
+
client.forecast(*location)
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.daily(*location)
|
18
|
+
client.daily_forecast(*location)
|
19
|
+
end
|
20
|
+
|
21
|
+
def self.find(*location)
|
22
|
+
client.find(*location)
|
23
|
+
end
|
24
|
+
|
25
|
+
def self.client
|
26
|
+
Client.new
|
27
|
+
end
|
10
28
|
end
|
data/lib/open_weather/client.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'open_weather/query_builder'
|
2
|
+
|
1
3
|
module OpenWeather
|
2
4
|
class Client
|
3
5
|
include HTTParty
|
@@ -6,16 +8,24 @@ module OpenWeather
|
|
6
8
|
|
7
9
|
format :json
|
8
10
|
|
9
|
-
def weather(
|
10
|
-
get
|
11
|
+
def weather(*args)
|
12
|
+
get '/weather', build_query(args)
|
13
|
+
end
|
14
|
+
|
15
|
+
def daily_forecast(*args)
|
16
|
+
get '/forecast/daily', build_query(args)
|
17
|
+
end
|
18
|
+
|
19
|
+
def forecast(*args)
|
20
|
+
get '/forecast', build_query(args)
|
11
21
|
end
|
12
22
|
|
13
|
-
def
|
14
|
-
get
|
23
|
+
def find(*args)
|
24
|
+
get '/find', build_query(args, false)
|
15
25
|
end
|
16
26
|
|
17
|
-
def
|
18
|
-
|
27
|
+
def build_query(args, use_id=true)
|
28
|
+
QueryBuilder.new(args, use_id).build
|
19
29
|
end
|
20
30
|
|
21
31
|
def get(path, query)
|
@@ -0,0 +1,92 @@
|
|
1
|
+
module OpenWeather
|
2
|
+
class QueryError < StandardError
|
3
|
+
end
|
4
|
+
|
5
|
+
class QueryBuilder
|
6
|
+
|
7
|
+
attr_reader :arguments, :query_options
|
8
|
+
|
9
|
+
def initialize(args, use_id=true)
|
10
|
+
clean_args = Array(args)
|
11
|
+
@query_options = clean_args.extract_options!
|
12
|
+
@arguments = clean_args
|
13
|
+
end
|
14
|
+
|
15
|
+
def build
|
16
|
+
query = _from_array(arguments)
|
17
|
+
query.merge(query_options)
|
18
|
+
end
|
19
|
+
|
20
|
+
private
|
21
|
+
|
22
|
+
def _from_array(args)
|
23
|
+
query_keys = [:lat, :lon]
|
24
|
+
args.size > 1 ? Hash[query_keys.zip(args)] : _from_object(args[0])
|
25
|
+
end
|
26
|
+
|
27
|
+
def _from_string(str)
|
28
|
+
key = str =~ /\A\d+\Z/ ? :id : :q
|
29
|
+
{ key => str }
|
30
|
+
end
|
31
|
+
|
32
|
+
def _from_object(obj)
|
33
|
+
case obj
|
34
|
+
when NilClass
|
35
|
+
raise QueryError, 'you should provide at least one location'
|
36
|
+
when Array
|
37
|
+
_from_array(obj)
|
38
|
+
when Hash
|
39
|
+
_from_methods(OpenStruct.new(obj))
|
40
|
+
when String
|
41
|
+
_from_string(obj)
|
42
|
+
when Integer
|
43
|
+
{ id: obj }
|
44
|
+
else
|
45
|
+
_from_methods(obj)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
def _get_lat(obj)
|
50
|
+
_fetch_value(obj, :lat) ||
|
51
|
+
_fetch_value(obj, :latitude)
|
52
|
+
end
|
53
|
+
|
54
|
+
def _get_lon(obj)
|
55
|
+
_fetch_value(obj, :lon) ||
|
56
|
+
_fetch_value(obj, :lng) ||
|
57
|
+
_fetch_value(obj, :latitude)
|
58
|
+
end
|
59
|
+
|
60
|
+
def _from_lat_lon(obj)
|
61
|
+
lat, lon = _get_lat(obj), _get_lon(obj)
|
62
|
+
(lat && lon) ? _from_array([ lat, lon ]) : nil
|
63
|
+
end
|
64
|
+
|
65
|
+
def _from_coordinates(obj)
|
66
|
+
_from_array(obj.to_coordinates) if obj.respond_to?(:to_coordinates)
|
67
|
+
end
|
68
|
+
|
69
|
+
def _from_other(obj)
|
70
|
+
_fetch_array(obj, :location) ||
|
71
|
+
_fetch_array(obj, :address) ||
|
72
|
+
_fetch_array(obj, :region) ||
|
73
|
+
_fetch_array(obj, :city) ||
|
74
|
+
_fetch_array(obj, :attributes)
|
75
|
+
end
|
76
|
+
|
77
|
+
def _fetch_value(obj, meth)
|
78
|
+
obj.send(meth) if obj.respond_to?(meth)
|
79
|
+
end
|
80
|
+
|
81
|
+
def _fetch_array(obj, meth)
|
82
|
+
_from_array(Array(obj.send(meth))) if obj.respond_to?(meth)
|
83
|
+
end
|
84
|
+
|
85
|
+
def _from_methods(obj)
|
86
|
+
_from_lat_lon(obj) ||
|
87
|
+
_from_coordinates(obj) ||
|
88
|
+
_from_other(obj) ||
|
89
|
+
raise(QueryError, "Don't know how to obtain weather from #{obj.class.name}")
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
data/lib/open_weather/version.rb
CHANGED
@@ -0,0 +1,70 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module OpenWeather
|
4
|
+
describe QueryBuilder do
|
5
|
+
|
6
|
+
def build_query(*args)
|
7
|
+
options = args.extract_options!
|
8
|
+
use_id = options.delete(:use_id) || true
|
9
|
+
args << options
|
10
|
+
QueryBuilder.new(args, use_id).build
|
11
|
+
end
|
12
|
+
|
13
|
+
it "generates a coordinates query when lat and lng are given" do
|
14
|
+
build_query(1, 2).should == { lat: 1, lon: 2 }
|
15
|
+
end
|
16
|
+
|
17
|
+
it "generates a coordinates query when object with to_coordinates method is given" do
|
18
|
+
waypoint = OpenStruct.new(to_coordinates: [1, 2])
|
19
|
+
build_query(waypoint).should == { lat: 1, lon: 2 }
|
20
|
+
end
|
21
|
+
|
22
|
+
it "generates a coordinates query when object with :lat, :lng method available" do
|
23
|
+
waypoint = OpenStruct.new(lat: 1, lon: 2)
|
24
|
+
build_query(waypoint).should == { lat: 1, lon: 2 }
|
25
|
+
end
|
26
|
+
|
27
|
+
it "generates a city query when an string is given" do
|
28
|
+
build_query("Madrid").should == { q: "Madrid" }
|
29
|
+
end
|
30
|
+
|
31
|
+
it "generates an id query when a numeric string is given" do
|
32
|
+
build_query("123").should == { id: "123" }
|
33
|
+
end
|
34
|
+
|
35
|
+
it "generates an id query when a numeric id is given" do
|
36
|
+
build_query(123).should == { id: 123 }
|
37
|
+
end
|
38
|
+
|
39
|
+
it "parses internal attributes" do
|
40
|
+
team = OpenStruct.new(location: "Madrid")
|
41
|
+
build_query(team).should == { q: "Madrid" }
|
42
|
+
end
|
43
|
+
|
44
|
+
it "raise query error if location is nil" do
|
45
|
+
team = OpenStruct.new(location: nil)
|
46
|
+
expect {
|
47
|
+
build_query(team)
|
48
|
+
}.to raise_error(QueryError, 'you should provide at least one location')
|
49
|
+
end
|
50
|
+
|
51
|
+
it { build_query({lat: 1, lng: 2}, use_id: true).should == { lat: 1, lon: 2 } }
|
52
|
+
it { build_query([1, 2]).should == { lat: 1, lon: 2 } }
|
53
|
+
it { build_query([1, 2, 3]).should == { lat: 1, lon: 2 } }
|
54
|
+
it { build_query(1, 2, 3).should == { lat: 1, lon: 2 } }
|
55
|
+
|
56
|
+
it "raise query error if no arguments are given" do
|
57
|
+
expect {
|
58
|
+
build_query
|
59
|
+
}.to raise_error(OpenWeather::QueryError, 'you should provide at least one location')
|
60
|
+
end
|
61
|
+
|
62
|
+
it "raise query error if can't figure out the query" do
|
63
|
+
::School = Class.new
|
64
|
+
expect {
|
65
|
+
build_query(School.new)
|
66
|
+
}.to raise_error(QueryError, "Don't know how to obtain weather from School")
|
67
|
+
end
|
68
|
+
|
69
|
+
end
|
70
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: open_weather
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jorge Calás Lozano
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-10-
|
11
|
+
date: 2013-10-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: httparty
|
@@ -112,8 +112,10 @@ files:
|
|
112
112
|
- bin/open_weather
|
113
113
|
- lib/open_weather.rb
|
114
114
|
- lib/open_weather/client.rb
|
115
|
+
- lib/open_weather/query_builder.rb
|
115
116
|
- lib/open_weather/version.rb
|
116
117
|
- open_weather.gemspec
|
118
|
+
- spec/open_weather/query_builder_spec.rb
|
117
119
|
- spec/open_weather_spec.rb
|
118
120
|
- spec/spec_helper.rb
|
119
121
|
homepage: ''
|
@@ -141,6 +143,7 @@ signing_key:
|
|
141
143
|
specification_version: 4
|
142
144
|
summary: Ruby client for the Open Weather Map API
|
143
145
|
test_files:
|
146
|
+
- spec/open_weather/query_builder_spec.rb
|
144
147
|
- spec/open_weather_spec.rb
|
145
148
|
- spec/spec_helper.rb
|
146
149
|
has_rdoc:
|