class Gfrom
Constants
- MATCHERS
Attributes
fields[RW]
form[RW]
Public Class Methods
locale_url(url, lang = 'en')
click to toggle source
# File lib/gfrom.rb, line 50 def self.locale_url(url, lang = 'en') uri = Addressable::URI.parse(url) if uri.to_hash.select{|k,v| [:scheme, :host].include? k }.values.any?{|v| v.nil? || v.length == 0} raise "Invalid URI" end uri.query_values ||= Hash.new uri.query_values = uri.query_values.merge({"hl" => lang}) uri.to_s end
new(url, regenerate_cache = false, lang = 'en')
click to toggle source
# File lib/gfrom.rb, line 14 def initialize(url, regenerate_cache = false, lang = 'en') @form = Hash.new @fields = [] url = Gfrom::locale_url(url, lang) @cache = "#{Dir.tmpdir}/#{Digest::SHA1.hexdigest(url)}" if File.exists?(@cache) and regenerate_cache File.delete @cache end unless File.exists?(@cache) req = Curl.get(url) File.open(@cache, "w") do |f| f.write req.body_str end end keys = [] doc = Nokogiri::XML(File.open(@cache)) doc.search(MATCHERS).each do |node| case node.name when "form" @form[:action] = node.attributes["action"].value unless @form.has_key?(:action) @form[:title] = doc.search('//title').first.text.strip unless @form.has_key?(:title) else n = hash_it(node) @fields << n keys << n[:name] end end @form[:keys] = keys end
Public Instance Methods
submit(params)
click to toggle source
# File lib/gfrom.rb, line 60 def submit(params) response = Curl.post(@form[:action], params) doc = Nokogiri::XML.parse(response.body_str) errorheader = doc.search('//div[@class="errorheader"]') success = errorheader.empty? out = { :success => success } if success out[:message] = doc.search('//div[@class="ss-custom-resp"]').first.text.strip rescue doc.search('//title').first.text.strip else out[:message] = errorheader.children.first.text.strip end out end
Private Instance Methods
hash_it(node)
click to toggle source
# File lib/gfrom.rb, line 76 def hash_it(node) group = ["checkbox", "radio"] object = Hash.new object[:element] = node.name node.attributes.each do |k,v| object[k.to_sym] = v.value if k == "id" label = node.search("//label[@for=\"#{v.value}\"]").first if label object[:label] = label.children.first.text.strip object[:required] = true unless label.search("//label[@for=\"#{v.value}\"]/span[contains(@class, \"required\")]").empty? end end if object[:label].nil? and group.include?(object[:type]) object[:label] = node.attributes["value"].value end end # override when element has all the attributes if (object[:type] == "checkbox" and node.search("//input[@name=\"#{object[:name]}\"]").length > 1) # checkbox needs name to be array'ed object[:name] = "#{object[:name]}[]" end object end