class Windward::Weather
Instantiate an object to get meteo france previsions
Public Class Methods
new()
click to toggle source
# File lib/windward.rb, line 10 def initialize @departments = load_departments_data @cities = load_cities_data @regions = load_regions_data end
root()
click to toggle source
# File lib/windward.rb, line 32 def self.root File.expand_path('../..', __FILE__) end
Public Instance Methods
previsions(name)
click to toggle source
# File lib/windward.rb, line 24 def previsions(name) @regions[name]['previsions'] end
region(name)
click to toggle source
# File lib/windward.rb, line 20 def region(name) @regions[name] end
regions()
click to toggle source
# File lib/windward.rb, line 16 def regions @regions.keys end
reload()
click to toggle source
# File lib/windward.rb, line 28 def reload @regions = load_data end
Private Instance Methods
load_cities_data()
click to toggle source
# File lib/windward.rb, line 42 def load_cities_data load_data_library({ file: 'lib/data/cities.xml', root: 'city', code: 'zip_code', name: 'name' }) end
load_data_library(options = { file: nil, root: nil, code: nil, name: nil })
click to toggle source
Return a hash that contains xml data file content
# File lib/windward.rb, line 63 def load_data_library(options = { file: nil, root: nil, code: nil, name: nil }) doc = Nokogiri::XML(open(File.join Weather.root, options[:file])) root_elements = doc.root.xpath(options[:root]) data = Hash.new root_elements.each do |p| data[p.at_xpath(options[:code]).text] = p.at_xpath(options[:name]).text end data end
load_departments_data()
click to toggle source
# File lib/windward.rb, line 38 def load_departments_data load_data_library({ file: 'lib/data/regions.xml', root: 'province', code: 'code', name: 'name_province' }) end
load_regions_data()
click to toggle source
# File lib/windward.rb, line 46 def load_regions_data # Get webpage page = meteofrance_webpage # Store regions data data = page.parser.css('div.select-region') # Organize rgions data regions = parse_regions data # Get previsions for each region regions.each do |name, values| data = page.parser.css("div##{values['value']}") previsions = region_previsions data regions[name] = regions[name].merge({ 'previsions' => previsions }) end regions end
meteofrance_webpage()
click to toggle source
Get and parse webpage 'www.meteofrance.com/accueil'
# File lib/windward.rb, line 74 def meteofrance_webpage a = Mechanize.new page = a.get('http://www.meteofrance.com/accueil') page.encoding = 'utf-8' page end
parse_regions(data)
click to toggle source
Return a hash for each region like { 'Alsace' => {'slug' => 'alsace', 'value' => 'REGI42' } }
# File lib/windward.rb, line 82 def parse_regions(data) regions = Hash.new data.css('option').each do |option| if option['data-type'] == 'REG_FRANCE' name = option.content slug = option['data-slug'] value = option['value'] regions[name] = { 'slug' => slug, 'value' => value } end end regions end
region_previsions(data)
click to toggle source
Complete regions hash with previsions key like : { 'Alsace' =>
{ 'slug' => 'alsace', 'value' => 'REGI42', 'previsions' => {'Rhin (Bas)' => {'temps'=>'Éclaircies', 'temper' => '10', 'city' => 'Strasbourg'}} }
}
# File lib/windward.rb, line 101 def region_previsions(data) previsions = Hash.new data.each do |datum| temps = datum.css('span.picTemps').first.content.split(' - ').last.strip temper = datum.css('span.temper').first.content.strip department = @departments[datum['data-insee'][0..1]] city = @cities[datum['data-insee'][0..4]] previsions[department] = { 'temps' => temps, 'temper' => temper, 'city' => city } end previsions end