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 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