Sha256: 7ae4acf291423635b8bb426a196628465c68eaa17f7626e37ad18997d91a612f
Contents?: true
Size: 1.97 KB
Versions: 1
Compression:
Stored size: 1.97 KB
Contents
module Wasserstand module PegelOnline class Provider def initialize(url = 'http://www.pegelonline.wsv.de/svgz/pegelstaende_neu.xml') @url = url end def [](name) results = doc.xpath(xpath_lookup(name)) case results.size when 0 return nil # loookup returns nil if not found. This is a lookup, not find_all. when 1 return mapper.map(results.first) else raise "Name is not unique. Found #{results.size} results for #{name}." end end def all doc.xpath(xpath_all).map{|o| mapper.map(o)} end def find_by_name(name_expression) # Not the best performing way, but it gives us the ability to use the XPath 2.0 'matches' function # which isn't supported in Nokogiri (yet). doc.xpath(xpath_finder(name_expression), Class.new{ def matches(node_set, regex) node_set.find_all do |node| node.to_s.match(%r{#{regex}}) end end }.new).map{|o| mapper.map(o)} end protected def xpath_lookup(name) "#{xpath_all}[#{name_attribute}/text() = '#{UnicodeUtils.upcase(name)}']" end def xpath_finder(regex) "#{xpath_all}[matches(#{name_attribute}/text(), '#{regex}')]" end def fetch(url) STDERR.puts "FETCH #{url}" open(url).read end def name_attribute 'name' end private def doc Nokogiri::HTML(fetch(@url), nil, 'ISO-8859-1') end end class WaterwayProvider < Provider def xpath_all "//data/table/gewaesser" end def mapper Wasserstand::PegelOnline::WaterwayMapper end end class LevelProvider < Provider def xpath_all "//data/table/gewaesser/item" end def mapper Wasserstand::PegelOnline::LevelMapper end def name_attribute 'pegelname' end end end end
Version data entries
1 entries across 1 versions & 1 rubygems
Version | Path |
---|---|
wasserstand-0.0.8 | lib/wasserstand/provider/pegel-online.rb |