google_forms 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: ac8065484bf64be707159c0525e865336672991ed37325d7a9bf7e02bf4cd16f
4
+ data.tar.gz: 22555253d4c4ed60939e7448784303474873caaa57e6f103d8e1815b38879faa
5
+ SHA512:
6
+ metadata.gz: 14121db7fa919144dec6ec5115d425825fd7d22745f4fc4f070405b6aa1ad1010c1554cc9da70a171e5a07cccc77eb27cfba4aff364cf41d6c9e9fc048cf59f5
7
+ data.tar.gz: 030c0043b60eb14665862e73e27566523fe5c95f42d10e46b31f63974881cd52a870917bb55bff8f527df1b43ce11261b9b72ea289552bea9d4aa3f11c21c7fb
@@ -0,0 +1,110 @@
1
+ require 'curb'
2
+ require 'nokogiri'
3
+
4
+ require_relative 'google_form_input'
5
+
6
+ class GoogleForm
7
+ BASE_URL = 'https://docs.google.com/forms'
8
+
9
+ def initialize(google_form_url_or_id)
10
+ @id = if is_an_url?(google_form_url_or_id)
11
+ form_id_from_url(google_form_url_or_id)
12
+ else
13
+ google_form_url_or_id
14
+ end
15
+
16
+ define_input_methods
17
+ end
18
+
19
+ def post(data = {})
20
+ params_for_curb = params_from_data(data).merge(params_from_inputs.compact)
21
+
22
+ Curl.post(form_response_url, params_for_curb)
23
+ end
24
+
25
+ def inputs
26
+ input_nodes = nokogiri_doc
27
+ .css('form input')
28
+ .reject { |i| i.attribute('aria-label').nil? }
29
+
30
+ @inputs ||= input_nodes.map do |i|
31
+ GoogleFormInput.new(
32
+ i.attribute('type').value,
33
+ i.attribute('aria-label').value,
34
+ i.attribute('name').value
35
+ )
36
+ end
37
+ end
38
+
39
+ def params_from_data(data)
40
+ data.map { |k, v| [self.send(k).name, v] }.to_h
41
+ end
42
+
43
+ def params_from_inputs
44
+ inputs.map(&:to_param).reduce({}, :merge)
45
+ end
46
+
47
+ def form_body
48
+ @form_body ||= Curl.get(view_form_url).body
49
+ end
50
+
51
+ def nokogiri_doc
52
+ @nokogiri_doc ||= Nokogiri::HTML(form_body)
53
+ end
54
+
55
+ def form_response_url
56
+ "#{BASE_URL}/u/0/d/e/#{@id}/formResponse"
57
+ end
58
+
59
+ def view_form_url
60
+ "#{BASE_URL}/d/e/#{@id}/viewform"
61
+ end
62
+
63
+ def to_s
64
+ inspect
65
+ end
66
+
67
+ def inspect
68
+ hidden_variables = %i[@inputs @form_body @nokogiri_doc]
69
+
70
+ variables_to_string =
71
+ (self.instance_variables - hidden_variables).map do |variable|
72
+ "#{variable}=\\\"#{instance_variable_get(variable)}\\\""
73
+ end
74
+
75
+ "#<#{self.class}:#{object_id} #{variables_to_string.join(', ')}>"
76
+ end
77
+
78
+ private
79
+
80
+ def define_input_methods
81
+ inputs.each do |input|
82
+ self.class.send(:define_method, input.label.to_sym) do
83
+ input
84
+ end
85
+
86
+ self.class.send(:define_method, "#{input.label.to_sym}=") do |*args|
87
+ input.value = args.first
88
+ end
89
+ end
90
+ end
91
+
92
+ def form_id_from_url(form_url)
93
+ response = Curl.get(form_url)
94
+
95
+ if response.response_code == 302
96
+ return form_id_from_viewform_url(response.redirect_url)
97
+ end
98
+
99
+ @form_body ||= response.body
100
+ form_id_from_viewform_url(form_url)
101
+ end
102
+
103
+ def form_id_from_viewform_url(url)
104
+ url.match(/docs.google.com\/forms\/d\/e\/(.*)\/viewform/)[1]
105
+ end
106
+
107
+ def is_an_url?(string)
108
+ string =~ /\A#{URI::regexp(['http', 'https'])}\z/
109
+ end
110
+ end
@@ -0,0 +1,17 @@
1
+ class GoogleFormInput
2
+ attr_reader :input_type, :label, :name, :value
3
+
4
+ def initialize(input_type, label, name)
5
+ @input_type = input_type
6
+ @label = label
7
+ @name = name
8
+ end
9
+
10
+ def value=(value)
11
+ @value = value
12
+ end
13
+
14
+ def to_param
15
+ {@name => @value}
16
+ end
17
+ end
@@ -0,0 +1 @@
1
+ require 'google_form'
metadata ADDED
@@ -0,0 +1,73 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: google_forms
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.2
5
+ platform: ruby
6
+ authors:
7
+ - Vadim Venediktov
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2020-04-25 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: curb
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '0.9'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '0.9'
27
+ - !ruby/object:Gem::Dependency
28
+ name: nokogiri
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '1.10'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '1.10'
41
+ description:
42
+ email: install.vv@gmail.com
43
+ executables: []
44
+ extensions: []
45
+ extra_rdoc_files: []
46
+ files:
47
+ - lib/google_form.rb
48
+ - lib/google_form_input.rb
49
+ - lib/google_forms.rb
50
+ homepage: https://github.com/installero/google_forms_ruby
51
+ licenses:
52
+ - MIT
53
+ metadata: {}
54
+ post_install_message:
55
+ rdoc_options: []
56
+ require_paths:
57
+ - lib
58
+ required_ruby_version: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - ">="
61
+ - !ruby/object:Gem::Version
62
+ version: '0'
63
+ required_rubygems_version: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - ">="
66
+ - !ruby/object:Gem::Version
67
+ version: '0'
68
+ requirements: []
69
+ rubygems_version: 3.1.2
70
+ signing_key:
71
+ specification_version: 4
72
+ summary: Posting to Google Forms from your ruby scripts
73
+ test_files: []