class GoogleForm
Constants
- BASE_URL
Public Class Methods
new(google_form_url_or_id)
click to toggle source
# File lib/google_form.rb, line 9 def initialize(google_form_url_or_id) @id = if is_an_url?(google_form_url_or_id) form_id_from_url(google_form_url_or_id) else google_form_url_or_id end define_input_methods end
Public Instance Methods
form_body()
click to toggle source
# File lib/google_form.rb, line 49 def form_body @form_body ||= Curl.get(view_form_url).body end
form_response_url()
click to toggle source
# File lib/google_form.rb, line 57 def form_response_url "#{BASE_URL}/u/0/d/e/#{@id}/formResponse" end
inputs()
click to toggle source
# File lib/google_form.rb, line 25 def inputs input_nodes = nokogiri_doc .css('form input') .reject { |i| i.attribute('type').value == 'hidden' } @inputs ||= input_nodes.map do |i| container = i.ancestors('.freebirdFormviewerViewNumberedItemContainer') GoogleFormInput.new( i.attribute('type').value, container.css('.freebirdFormviewerComponentsQuestionBaseHeader').text, "entry.#{container.css('[@jsmodel]').attribute('data-params').value[/\[.*\]/].delete('[]').split(',')[4]}" ) end end
inspect()
click to toggle source
# File lib/google_form.rb, line 69 def inspect hidden_variables = %i[@inputs @form_body @nokogiri_doc] variables_to_string = (self.instance_variables - hidden_variables).map do |variable| "#{variable}=\\\"#{instance_variable_get(variable)}\\\"" end "#<#{self.class}:#{object_id} #{variables_to_string.join(', ')}>" end
nokogiri_doc()
click to toggle source
# File lib/google_form.rb, line 53 def nokogiri_doc @nokogiri_doc ||= Nokogiri::HTML(form_body) end
params_from_data(data)
click to toggle source
# File lib/google_form.rb, line 41 def params_from_data(data) data.map { |k, v| [self.send(k).name, v] }.to_h end
params_from_inputs()
click to toggle source
# File lib/google_form.rb, line 45 def params_from_inputs inputs.map(&:to_param).reduce({}, :merge) end
post(data = {})
click to toggle source
# File lib/google_form.rb, line 19 def post(data = {}) params_for_curb = params_from_data(data).merge(params_from_inputs.compact) Curl.post(form_response_url, params_for_curb) end
to_s()
click to toggle source
# File lib/google_form.rb, line 65 def to_s inspect end
view_form_url()
click to toggle source
# File lib/google_form.rb, line 61 def view_form_url "#{BASE_URL}/d/e/#{@id}/viewform" end
Private Instance Methods
define_input_methods()
click to toggle source
# File lib/google_form.rb, line 82 def define_input_methods inputs.each do |input| self.class.send(:define_method, input.label.to_sym) do input end self.class.send(:define_method, "#{input.label.to_sym}=") do |*args| input.value = args.first end end end
form_id_from_url(form_url)
click to toggle source
# File lib/google_form.rb, line 94 def form_id_from_url(form_url) response = Curl.get(form_url) if response.response_code == 302 return form_id_from_viewform_url(response.redirect_url) end @form_body ||= response.body form_id_from_viewform_url(form_url) end
form_id_from_viewform_url(url)
click to toggle source
# File lib/google_form.rb, line 105 def form_id_from_viewform_url(url) url.match(/docs.google.com\/forms\/d\/e\/(.*)\/viewform/)[1] end
is_an_url?(string)
click to toggle source
# File lib/google_form.rb, line 109 def is_an_url?(string) string =~ /\A#{URI::regexp(['http', 'https'])}\z/ end