aemet 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
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
- city = Aemet::Crawler.new("A Coruña")
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
- city.aemet_id # => "15030"
29
+ searcher.aemet_id # => "15030"
29
30
 
30
- # XML url is constructed with `aemet_id`
31
- city.xml_url # => http://www.aemet.es/xml/municipios/localidad_15030.xml
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 # => http://www.aemet.es/es/eltiempo/prediccion/municipios/coruna-a-id15030
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 # => [ { "fecha" => "2013-03-23", "viento" => [] ...}, { "fecha" => ...} ]
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
@@ -1,7 +1,18 @@
1
- require "active_support/all"
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
- # Your code goes here...
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
@@ -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
@@ -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 :city
11
- attr_accessor :aemet_id
13
+ attr_reader :search
14
+ attr_accessor :aemet_id, :city
12
15
 
13
- def initialize(city)
14
- @city = CGI.escape(city.parameterize(" "))
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=#{city}"
41
+ "#{BASE_URL}/es/buscador?modo=and&orden=n&tipo=sta&str=#{search}"
46
42
  end
47
43
  end
48
44
  end
@@ -1,3 +1,3 @@
1
1
  module Aemet
2
- VERSION = "0.0.1"
2
+ VERSION = "0.0.2"
3
3
  end
@@ -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
@@ -5,7 +5,30 @@ describe Aemet do
5
5
  Aemet::VERSION.should_not be_nil
6
6
  end
7
7
 
8
- it 'should do something useful' do
9
- false.should be_true
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.1
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-09 00:00:00.000000000 Z
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: 2.0.3
178
+ rubygems_version: 1.8.23
161
179
  signing_key:
162
- specification_version: 4
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
@@ -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