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