aemet 0.0.1 → 0.0.2
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.
- data/README.md +21 -7
- data/lib/aemet.rb +13 -2
- data/lib/aemet/city.rb +28 -0
- data/lib/aemet/crawler.rb +11 -15
- data/lib/aemet/version.rb +1 -1
- data/spec/aemet/city_spec.rb +15 -0
- data/spec/aemet/crawler_spec.rb +24 -0
- data/spec/aemet_spec.rb +25 -2
- metadata +40 -20
- checksums.yaml +0 -7
- data/lib/aemet/parser.rb +0 -37
data/README.md
CHANGED
@@ -22,22 +22,36 @@ Or install it yourself as:
|
|
22
22
|
|
23
23
|
Extracts AEMET data url for city:
|
24
24
|
|
25
|
-
|
25
|
+
# Inialize the crawler
|
26
|
+
searcher = Aemet.search("A Coruña") # Aemet::Crawler.new("A Coruña")
|
26
27
|
|
27
28
|
# When initialized the crawler searchs for the city and initializes it.
|
28
|
-
|
29
|
+
searcher.aemet_id # => "15030"
|
29
30
|
|
30
|
-
#
|
31
|
-
city.
|
31
|
+
# It provides an Aemet::City object
|
32
|
+
city = searcher.city # Aemet::City.new("15030")
|
33
|
+
|
34
|
+
# On the city XML url is constructed with `aemet_id`. Now this method is
|
35
|
+
# private, just to compare with previous versions.
|
36
|
+
city.send(:xml_url) # => http://www.aemet.es/xml/municipios/localidad_15030.xml
|
32
37
|
|
33
38
|
# Get current Weather data
|
34
|
-
city.weather
|
39
|
+
city.weather # => { :prediccion => { :dia => { [ ...] }}
|
35
40
|
|
36
41
|
# Get the city page url (from xml response)
|
37
|
-
city.weather.origen.enlace
|
42
|
+
city.weather.origen.enlace # => http://www.aemet.es/es/eltiempo/prediccion/municipios/coruna-a-id15030
|
38
43
|
|
39
44
|
# The actual weather forecast
|
40
|
-
city.weather.prediccion.dia
|
45
|
+
city.weather.prediccion.dia # => [ { "fecha" => "2013-03-23", "viento" => [] ...}, { "fecha" => ...} ]
|
46
|
+
|
47
|
+
If you have the city AEMET id stored in database you can initialize the city
|
48
|
+
and even search for weather conidtions directly:
|
49
|
+
|
50
|
+
# Initialize a city with aemet_id
|
51
|
+
Aemet.city("15030")
|
52
|
+
|
53
|
+
# Get weather forecast based on aemet_id
|
54
|
+
Aemet.weather("15030")
|
41
55
|
|
42
56
|
|
43
57
|
## Contributing
|
data/lib/aemet.rb
CHANGED
@@ -1,7 +1,18 @@
|
|
1
|
-
require "active_support/
|
1
|
+
require "active_support/core_ext"
|
2
2
|
require "aemet/crawler"
|
3
|
+
require "aemet/city"
|
3
4
|
require "aemet/version"
|
4
5
|
|
5
6
|
module Aemet
|
6
|
-
|
7
|
+
def self.search(city)
|
8
|
+
Crawler.new(city)
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.city(aemet_id)
|
12
|
+
City.new(aemet_id)
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.weather(aemet_id)
|
16
|
+
city(aemet_id).weather
|
17
|
+
end
|
7
18
|
end
|
data/lib/aemet/city.rb
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
module Aemet
|
2
|
+
class City
|
3
|
+
attr_reader :aemet_id
|
4
|
+
|
5
|
+
def initialize(aemet_id)
|
6
|
+
@aemet_id = aemet_id
|
7
|
+
end
|
8
|
+
|
9
|
+
def weather
|
10
|
+
@weather ||= get_weather
|
11
|
+
end
|
12
|
+
|
13
|
+
private
|
14
|
+
|
15
|
+
def weather_response
|
16
|
+
@weather_response ||= HTTParty.get(xml_url)
|
17
|
+
end
|
18
|
+
|
19
|
+
def get_weather
|
20
|
+
@weather = Hashie::Mash.new(weather_response).root
|
21
|
+
end
|
22
|
+
|
23
|
+
def xml_url
|
24
|
+
"#{BASE_URL}/xml/municipios/localidad_#{aemet_id}.xml"
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
end
|
data/lib/aemet/crawler.rb
CHANGED
@@ -1,3 +1,6 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'cgi' unless defined?(CGI)
|
1
4
|
require 'httparty'
|
2
5
|
require 'nokogiri'
|
3
6
|
require 'hashie'
|
@@ -7,14 +10,16 @@ module Aemet
|
|
7
10
|
|
8
11
|
class Crawler
|
9
12
|
|
10
|
-
attr_reader :
|
11
|
-
attr_accessor :aemet_id
|
13
|
+
attr_reader :search
|
14
|
+
attr_accessor :aemet_id, :city
|
12
15
|
|
13
|
-
def initialize(
|
14
|
-
@
|
16
|
+
def initialize(search)
|
17
|
+
@search = CGI.escape(search.parameterize(" "))
|
15
18
|
search_city
|
16
19
|
end
|
17
20
|
|
21
|
+
private
|
22
|
+
|
18
23
|
def search_city
|
19
24
|
city_pattern = ".resultados_busqueda li a:contains('Predicción por Municipios')"
|
20
25
|
|
@@ -26,23 +31,14 @@ module Aemet
|
|
26
31
|
first_result[:href] =~ /-id(.*)\Z/
|
27
32
|
|
28
33
|
self.aemet_id = $1
|
29
|
-
|
30
|
-
OpenStruct.new(:aemet_xml_url => xml_url)
|
34
|
+
self.city = City.new(aemet_id)
|
31
35
|
else
|
32
36
|
raise "Not found"
|
33
37
|
end
|
34
38
|
end
|
35
39
|
|
36
|
-
def weather
|
37
|
-
@prediction ||= Hashie::Mash.new(HTTParty.get(xml_url)).root
|
38
|
-
end
|
39
|
-
|
40
|
-
def xml_url
|
41
|
-
"#{BASE_URL}/xml/municipios/localidad_#{aemet_id}.xml"
|
42
|
-
end
|
43
|
-
|
44
40
|
def search_url
|
45
|
-
"#{BASE_URL}/es/buscador?modo=and&orden=n&tipo=sta&str=#{
|
41
|
+
"#{BASE_URL}/es/buscador?modo=and&orden=n&tipo=sta&str=#{search}"
|
46
42
|
end
|
47
43
|
end
|
48
44
|
end
|
data/lib/aemet/version.rb
CHANGED
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Aemet::City do
|
4
|
+
let(:aemet_id) { "08022" }
|
5
|
+
subject(:city) { Aemet::City.new(aemet_id) }
|
6
|
+
|
7
|
+
describe "#weather" do
|
8
|
+
let(:weather) { city.weather }
|
9
|
+
|
10
|
+
it "returns the city weather" do
|
11
|
+
weather.should be_kind_of Hashie::Mash
|
12
|
+
weather.prediccion.dia.should be_instance_of Array
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
#
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
describe Aemet::Crawler do
|
6
|
+
|
7
|
+
subject(:crawler) { Aemet::Crawler.new(search_city) }
|
8
|
+
|
9
|
+
describe "when searching for Berga" do
|
10
|
+
let(:search_city) { "Berga" }
|
11
|
+
|
12
|
+
its(:city) { should be_instance_of Aemet::City }
|
13
|
+
its(:aemet_id) { should == "08022" }
|
14
|
+
end
|
15
|
+
|
16
|
+
xit 'finds the result for cities that match province' do
|
17
|
+
crawler = Aemet::Crawler.new("Girona")
|
18
|
+
result = crawler.result
|
19
|
+
|
20
|
+
result.aemet_page_url.should == "http://www.aemet.es/es/eltiempo/prediccion/municipios/girona-id17079"
|
21
|
+
result.aemet_xml_url.should == "http://www.aemet.es/xml/municipios/localidad_17079.xml"
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
data/spec/aemet_spec.rb
CHANGED
@@ -5,7 +5,30 @@ describe Aemet do
|
|
5
5
|
Aemet::VERSION.should_not be_nil
|
6
6
|
end
|
7
7
|
|
8
|
-
|
9
|
-
|
8
|
+
describe "#search" do
|
9
|
+
let(:search) { Aemet.search("Berga") }
|
10
|
+
|
11
|
+
it "returns the weather for a city" do
|
12
|
+
search.should be_instance_of Aemet::Crawler
|
13
|
+
search.aemet_id.should == "08022"
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
describe "#city" do
|
18
|
+
let(:city) { Aemet.city("08022") }
|
19
|
+
|
20
|
+
it "returns the correct city" do
|
21
|
+
city.should be_instance_of Aemet::City
|
22
|
+
city.aemet_id.should == "08022"
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
describe "#weather" do
|
27
|
+
let(:weather) { Aemet.weather("08022") }
|
28
|
+
|
29
|
+
it "returns the weather for a city" do
|
30
|
+
weather.should be_kind_of Hashie::Mash
|
31
|
+
weather.prediccion.dia.should be_instance_of Array
|
32
|
+
end
|
10
33
|
end
|
11
34
|
end
|
metadata
CHANGED
@@ -1,7 +1,8 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: aemet
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
|
+
prerelease:
|
5
6
|
platform: ruby
|
6
7
|
authors:
|
7
8
|
- Joaquin Rivera Padron
|
@@ -10,67 +11,76 @@ authors:
|
|
10
11
|
autorequire:
|
11
12
|
bindir: bin
|
12
13
|
cert_chain: []
|
13
|
-
date: 2013-10-
|
14
|
+
date: 2013-10-12 00:00:00.000000000 Z
|
14
15
|
dependencies:
|
15
16
|
- !ruby/object:Gem::Dependency
|
16
17
|
name: activesupport
|
17
18
|
requirement: !ruby/object:Gem::Requirement
|
19
|
+
none: false
|
18
20
|
requirements:
|
19
|
-
- - '>='
|
21
|
+
- - ! '>='
|
20
22
|
- !ruby/object:Gem::Version
|
21
23
|
version: '0'
|
22
24
|
type: :runtime
|
23
25
|
prerelease: false
|
24
26
|
version_requirements: !ruby/object:Gem::Requirement
|
27
|
+
none: false
|
25
28
|
requirements:
|
26
|
-
- - '>='
|
29
|
+
- - ! '>='
|
27
30
|
- !ruby/object:Gem::Version
|
28
31
|
version: '0'
|
29
32
|
- !ruby/object:Gem::Dependency
|
30
33
|
name: nokogiri
|
31
34
|
requirement: !ruby/object:Gem::Requirement
|
35
|
+
none: false
|
32
36
|
requirements:
|
33
|
-
- - '>='
|
37
|
+
- - ! '>='
|
34
38
|
- !ruby/object:Gem::Version
|
35
39
|
version: '0'
|
36
40
|
type: :runtime
|
37
41
|
prerelease: false
|
38
42
|
version_requirements: !ruby/object:Gem::Requirement
|
43
|
+
none: false
|
39
44
|
requirements:
|
40
|
-
- - '>='
|
45
|
+
- - ! '>='
|
41
46
|
- !ruby/object:Gem::Version
|
42
47
|
version: '0'
|
43
48
|
- !ruby/object:Gem::Dependency
|
44
49
|
name: httparty
|
45
50
|
requirement: !ruby/object:Gem::Requirement
|
51
|
+
none: false
|
46
52
|
requirements:
|
47
|
-
- - '>='
|
53
|
+
- - ! '>='
|
48
54
|
- !ruby/object:Gem::Version
|
49
55
|
version: '0'
|
50
56
|
type: :runtime
|
51
57
|
prerelease: false
|
52
58
|
version_requirements: !ruby/object:Gem::Requirement
|
59
|
+
none: false
|
53
60
|
requirements:
|
54
|
-
- - '>='
|
61
|
+
- - ! '>='
|
55
62
|
- !ruby/object:Gem::Version
|
56
63
|
version: '0'
|
57
64
|
- !ruby/object:Gem::Dependency
|
58
65
|
name: hashie
|
59
66
|
requirement: !ruby/object:Gem::Requirement
|
67
|
+
none: false
|
60
68
|
requirements:
|
61
|
-
- - '>='
|
69
|
+
- - ! '>='
|
62
70
|
- !ruby/object:Gem::Version
|
63
71
|
version: '0'
|
64
72
|
type: :runtime
|
65
73
|
prerelease: false
|
66
74
|
version_requirements: !ruby/object:Gem::Requirement
|
75
|
+
none: false
|
67
76
|
requirements:
|
68
|
-
- - '>='
|
77
|
+
- - ! '>='
|
69
78
|
- !ruby/object:Gem::Version
|
70
79
|
version: '0'
|
71
80
|
- !ruby/object:Gem::Dependency
|
72
81
|
name: bundler
|
73
82
|
requirement: !ruby/object:Gem::Requirement
|
83
|
+
none: false
|
74
84
|
requirements:
|
75
85
|
- - ~>
|
76
86
|
- !ruby/object:Gem::Version
|
@@ -78,6 +88,7 @@ dependencies:
|
|
78
88
|
type: :development
|
79
89
|
prerelease: false
|
80
90
|
version_requirements: !ruby/object:Gem::Requirement
|
91
|
+
none: false
|
81
92
|
requirements:
|
82
93
|
- - ~>
|
83
94
|
- !ruby/object:Gem::Version
|
@@ -85,29 +96,33 @@ dependencies:
|
|
85
96
|
- !ruby/object:Gem::Dependency
|
86
97
|
name: rake
|
87
98
|
requirement: !ruby/object:Gem::Requirement
|
99
|
+
none: false
|
88
100
|
requirements:
|
89
|
-
- - '>='
|
101
|
+
- - ! '>='
|
90
102
|
- !ruby/object:Gem::Version
|
91
103
|
version: '0'
|
92
104
|
type: :development
|
93
105
|
prerelease: false
|
94
106
|
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
none: false
|
95
108
|
requirements:
|
96
|
-
- - '>='
|
109
|
+
- - ! '>='
|
97
110
|
- !ruby/object:Gem::Version
|
98
111
|
version: '0'
|
99
112
|
- !ruby/object:Gem::Dependency
|
100
113
|
name: rspec
|
101
114
|
requirement: !ruby/object:Gem::Requirement
|
115
|
+
none: false
|
102
116
|
requirements:
|
103
|
-
- - '>='
|
117
|
+
- - ! '>='
|
104
118
|
- !ruby/object:Gem::Version
|
105
119
|
version: '0'
|
106
120
|
type: :development
|
107
121
|
prerelease: false
|
108
122
|
version_requirements: !ruby/object:Gem::Requirement
|
123
|
+
none: false
|
109
124
|
requirements:
|
110
|
-
- - '>='
|
125
|
+
- - ! '>='
|
111
126
|
- !ruby/object:Gem::Version
|
112
127
|
version: '0'
|
113
128
|
description: Extracts information from http://www.aemet.es
|
@@ -130,38 +145,43 @@ files:
|
|
130
145
|
- aemet.gemspec
|
131
146
|
- bin/aemet
|
132
147
|
- lib/aemet.rb
|
148
|
+
- lib/aemet/city.rb
|
133
149
|
- lib/aemet/crawler.rb
|
134
|
-
- lib/aemet/parser.rb
|
135
150
|
- lib/aemet/version.rb
|
136
151
|
- lib/tasks/.keep
|
137
152
|
- lib/tasks/aemet.rake
|
153
|
+
- spec/aemet/city_spec.rb
|
154
|
+
- spec/aemet/crawler_spec.rb
|
138
155
|
- spec/aemet_spec.rb
|
139
156
|
- spec/spec_helper.rb
|
140
157
|
homepage: http://para.glid.es
|
141
158
|
licenses:
|
142
159
|
- MIT
|
143
|
-
metadata: {}
|
144
160
|
post_install_message:
|
145
161
|
rdoc_options: []
|
146
162
|
require_paths:
|
147
163
|
- lib
|
148
164
|
required_ruby_version: !ruby/object:Gem::Requirement
|
165
|
+
none: false
|
149
166
|
requirements:
|
150
|
-
- - '>='
|
167
|
+
- - ! '>='
|
151
168
|
- !ruby/object:Gem::Version
|
152
169
|
version: '0'
|
153
170
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
171
|
+
none: false
|
154
172
|
requirements:
|
155
|
-
- - '>='
|
173
|
+
- - ! '>='
|
156
174
|
- !ruby/object:Gem::Version
|
157
175
|
version: '0'
|
158
176
|
requirements: []
|
159
177
|
rubyforge_project:
|
160
|
-
rubygems_version:
|
178
|
+
rubygems_version: 1.8.23
|
161
179
|
signing_key:
|
162
|
-
specification_version:
|
180
|
+
specification_version: 3
|
163
181
|
summary: Extracts information from http://www.aemet.es
|
164
182
|
test_files:
|
183
|
+
- spec/aemet/city_spec.rb
|
184
|
+
- spec/aemet/crawler_spec.rb
|
165
185
|
- spec/aemet_spec.rb
|
166
186
|
- spec/spec_helper.rb
|
167
187
|
has_rdoc:
|
checksums.yaml
DELETED
@@ -1,7 +0,0 @@
|
|
1
|
-
---
|
2
|
-
SHA1:
|
3
|
-
metadata.gz: 112ccf8efb06966833b07d716884902bc51f0c2a
|
4
|
-
data.tar.gz: 4bc953d1d5785cbff2731bdd688f7e7d464b6a7e
|
5
|
-
SHA512:
|
6
|
-
metadata.gz: cef7edef28068eb771778dc95ddebcbe34b4f63f74de1d59cd2776133be2ee9f12186c8354cfe100d1dd72f5145bee3272c939f23127f41e00a89fb810f22f34
|
7
|
-
data.tar.gz: ff00b94ce17f6137ba8ea072a3fe41409b6cb7cb3535aca473cef7e9430bd0af2a5a6842e986b6916429a022a6f01a947b7d6532b64e505ee922d89d709da06b
|
data/lib/aemet/parser.rb
DELETED
@@ -1,37 +0,0 @@
|
|
1
|
-
module Aemet
|
2
|
-
class Parser
|
3
|
-
attr_reader :document
|
4
|
-
|
5
|
-
def initialize(document)
|
6
|
-
@document = document
|
7
|
-
end
|
8
|
-
|
9
|
-
def result(date)
|
10
|
-
day = document.css("prediccion>dia[fecha='#{date}']")
|
11
|
-
|
12
|
-
results = {}
|
13
|
-
|
14
|
-
day.css('estado_cielo').each do |e|
|
15
|
-
period = e[:periodo]
|
16
|
-
results[period] ||= {}
|
17
|
-
results[period][:sky] = e.text
|
18
|
-
end
|
19
|
-
|
20
|
-
day.css('viento').each do |v|
|
21
|
-
period = v[:periodo]
|
22
|
-
results[period] ||= {}
|
23
|
-
results[period][:wind] ||= {}
|
24
|
-
results[period][:wind][:velocity] = v.css('velocidad').text
|
25
|
-
results[period][:wind][:direction] = v.css('direccion').text
|
26
|
-
end
|
27
|
-
|
28
|
-
day.css('prob_precipitacion').each do |p|
|
29
|
-
period = p[:periodo]
|
30
|
-
results[period] ||= {}
|
31
|
-
results[period][:rain] = p.text
|
32
|
-
end
|
33
|
-
|
34
|
-
results
|
35
|
-
end
|
36
|
-
end
|
37
|
-
end
|