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