Sha256: 106dc2fcb81faaac7ae8c5df43a9ba5f8c1e6411ba6207ad1df67eefc3cd058f
Contents?: true
Size: 1.94 KB
Versions: 2
Compression:
Stored size: 1.94 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) 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
2 entries across 2 versions & 1 rubygems
Version | Path |
---|---|
wasserstand-0.0.7 | lib/wasserstand/provider/pegel-online.rb |
wasserstand-0.0.6 | lib/wasserstand/provider/pegel-online.rb |