open_weather 0.0.2 → 0.0.3
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 +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:
|