rubytypeformio 0.1.0 → 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile +8 -0
- data/README.md +21 -6
- data/examples/examples.rb +82 -0
- data/lib/rubytypeformio.rb +30 -3
- data/lib/rubytypeformio/base.rb +31 -0
- data/lib/rubytypeformio/choice.rb +33 -0
- data/lib/rubytypeformio/choice_field.rb +26 -0
- data/lib/rubytypeformio/client.rb +13 -0
- data/lib/rubytypeformio/dropdown_field.rb +31 -0
- data/lib/rubytypeformio/email_field.rb +21 -0
- data/lib/rubytypeformio/field.rb +40 -0
- data/lib/rubytypeformio/form.rb +150 -0
- data/lib/rubytypeformio/legal_field.rb +21 -0
- data/lib/rubytypeformio/link.rb +32 -0
- data/lib/rubytypeformio/long_text_field.rb +22 -0
- data/lib/rubytypeformio/multiple_choice_field.rb +31 -0
- data/lib/rubytypeformio/number_field.rb +21 -0
- data/lib/rubytypeformio/opinion_field.rb +21 -0
- data/lib/rubytypeformio/picture_choice_field.rb +30 -0
- data/lib/rubytypeformio/rating_field.rb +21 -0
- data/lib/rubytypeformio/short_text_field.rb +22 -0
- data/lib/rubytypeformio/statement_field.rb +21 -0
- data/lib/rubytypeformio/version.rb +1 -1
- data/lib/rubytypeformio/website_field.rb +21 -0
- data/lib/rubytypeformio/yes_no_field.rb +21 -0
- data/rubytypeformio.gemspec +11 -3
- data/spec/client_spec.rb +10 -0
- data/spec/spec_helper.rb +8 -0
- metadata +122 -12
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: bbe41659dcaa2877b00b11944f59b9b712095ab8
|
4
|
+
data.tar.gz: 31419b54d09ae959eb91b1cf9695378159c8817d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: dd69c5a8bb5c25db7be6ca4f6e9465c84ca67956a2a764a1523c9bef42ee351e862019a11357ee23b1505f403a61ba7d26c6911fdfb4fb54b6571620e78a6953
|
7
|
+
data.tar.gz: 6f41b4825d5bdeab4b9f1ad5b2ab39bac4b8d6a31ef2d0c9bb1c6670efd728373871bb855b3e380af062aee1ea4c760264821acff3c4277c96e2b5a01e939e31
|
data/Gemfile
CHANGED
@@ -2,3 +2,11 @@ source 'https://rubygems.org'
|
|
2
2
|
|
3
3
|
# Specify your gem's dependencies in rubytypeformio.gemspec
|
4
4
|
gemspec
|
5
|
+
|
6
|
+
gem 'vcr', '2.9.3'
|
7
|
+
gem 'webmock', '1.21.0'
|
8
|
+
gem 'faraday', '0.9.1'
|
9
|
+
gem 'json', '1.8.3'
|
10
|
+
gem 'rspec', '3.3.0'
|
11
|
+
gem 'factory_girl', '4.5.0'
|
12
|
+
gem 'pry', '0.10.1'
|
data/README.md
CHANGED
@@ -1,8 +1,6 @@
|
|
1
1
|
# Rubytypeformio
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
TODO: Delete this and the text above, and describe your gem
|
3
|
+
A ruby client library for the typeform i/o api
|
6
4
|
|
7
5
|
## Installation
|
8
6
|
|
@@ -22,7 +20,25 @@ Or install it yourself as:
|
|
22
20
|
|
23
21
|
## Usage
|
24
22
|
|
25
|
-
|
23
|
+
See [examples/examples.rb](https://github.com/zachgoldstein/rubytypeformio/blob/master/examples/examples.rb) for full examples
|
24
|
+
|
25
|
+
2 second example:
|
26
|
+
```ruby
|
27
|
+
|
28
|
+
# First create the fields...
|
29
|
+
short_field = Rubytypeformio::ShortTextField.new('will it work?', 'test short text field', true)
|
30
|
+
long_field = Rubytypeformio::LongTextField.new('will it work?', 'test long text field', true)
|
31
|
+
|
32
|
+
# Then create your form...
|
33
|
+
form = Rubytypeformio::Form.new('A simple form', 'http://311008e2.ngrok.io', 123, [short_field, long_field]])
|
34
|
+
|
35
|
+
# Then post it to issue the request against the typeform API. This returns a new form object with the response data
|
36
|
+
created_form = form.post
|
37
|
+
|
38
|
+
# And now you can do what you will with it!
|
39
|
+
puts "Form url: " + created_form.links[1].rel
|
40
|
+
|
41
|
+
```
|
26
42
|
|
27
43
|
## Development
|
28
44
|
|
@@ -32,8 +48,7 @@ To install this gem onto your local machine, run `bundle exec rake install`. To
|
|
32
48
|
|
33
49
|
## Contributing
|
34
50
|
|
35
|
-
Bug reports and pull requests are welcome on GitHub at https://github.com/
|
36
|
-
|
51
|
+
Bug reports and pull requests are welcome on GitHub at https://github.com/zachgolstein/rubytypeformio. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](contributor-covenant.org) code of conduct.
|
37
52
|
|
38
53
|
## License
|
39
54
|
|
@@ -0,0 +1,82 @@
|
|
1
|
+
require_relative '../lib/rubytypeformio'
|
2
|
+
require 'json'
|
3
|
+
|
4
|
+
puts 'We are running'
|
5
|
+
|
6
|
+
field = Rubytypeformio::Field.new('test field', 'will it work?', true, 'short_text')
|
7
|
+
# Testing json<->ruby obj conversions
|
8
|
+
# puts "manually created new field"
|
9
|
+
# puts field.pretty
|
10
|
+
# puts "question: " + field.question
|
11
|
+
#
|
12
|
+
# puts "new field json:" + field.to_json.to_s
|
13
|
+
# json_obj = field.to_json
|
14
|
+
#
|
15
|
+
# new_field = Rubytypeformio::Field.from_json(json_obj)
|
16
|
+
# puts "unmarshalled new field"
|
17
|
+
# puts new_field.pretty
|
18
|
+
# puts "question: " + new_field.question
|
19
|
+
|
20
|
+
short_field = Rubytypeformio::ShortTextField.new('will it work?', 'test short text field', true)
|
21
|
+
long_field = Rubytypeformio::LongTextField.new('will it work?', 'test long text field', true)
|
22
|
+
statement_field = Rubytypeformio::StatementField.new('will it work?', 'test statement field', true)
|
23
|
+
|
24
|
+
good_choice = Rubytypeformio::Choice.new('good')
|
25
|
+
bad_choice = Rubytypeformio::Choice.new('bad')
|
26
|
+
choices = [good_choice, bad_choice]
|
27
|
+
mc_field = Rubytypeformio::MultipleChoiceField.new('which option would you pick?', 'test multiple choice field', true, choices)
|
28
|
+
|
29
|
+
left_choice = Rubytypeformio::Choice.new('good')
|
30
|
+
right_choice = Rubytypeformio::Choice.new('bad')
|
31
|
+
left_choice.image_id = 123
|
32
|
+
right_choice.image_id = 245
|
33
|
+
choices = [left_choice, right_choice]
|
34
|
+
pc_field = Rubytypeformio::PictureChoiceField.new('which option would you pick?', 'test picture choice field', true, choices)
|
35
|
+
|
36
|
+
top_choice = Rubytypeformio::Choice.new('top')
|
37
|
+
bottom_choice = Rubytypeformio::Choice.new('bottom')
|
38
|
+
choices = [top_choice, bottom_choice]
|
39
|
+
dropdown_field = Rubytypeformio::DropdownField.new('which option would you pick?', 'test picture choice field', true, choices)
|
40
|
+
|
41
|
+
|
42
|
+
opinion_field = Rubytypeformio::OpinionField.new('will it work?', 'test statement field', true)
|
43
|
+
rating_field = Rubytypeformio::RatingField.new('will it work?', 'test rating field', true)
|
44
|
+
number_field = Rubytypeformio::NumberField.new('will it work?', 'test number field', true)
|
45
|
+
website_field = Rubytypeformio::WebsiteField.new('will it work?', 'test website field', true)
|
46
|
+
email_field = Rubytypeformio::EmailField.new('will it work?', 'test email field', true)
|
47
|
+
legal_field = Rubytypeformio::LegalField.new('will it work?', 'test legal field', true)
|
48
|
+
yesno_field = Rubytypeformio::YesNoField.new('will it work?', 'test yes no field', true)
|
49
|
+
|
50
|
+
fields = [
|
51
|
+
field,
|
52
|
+
short_field,
|
53
|
+
long_field,
|
54
|
+
statement_field,
|
55
|
+
mc_field,
|
56
|
+
pc_field,
|
57
|
+
dropdown_field,
|
58
|
+
opinion_field,
|
59
|
+
rating_field,
|
60
|
+
number_field,
|
61
|
+
website_field,
|
62
|
+
email_field,
|
63
|
+
legal_field,
|
64
|
+
yesno_field
|
65
|
+
]
|
66
|
+
|
67
|
+
form = Rubytypeformio::Form.new('A simple form', 'http://311008e2.ngrok.io', 123, fields)
|
68
|
+
puts "manually created new form"
|
69
|
+
puts form.pretty
|
70
|
+
|
71
|
+
json_obj = form.to_json
|
72
|
+
new_form = Rubytypeformio::Form.from_json(json_obj)
|
73
|
+
# Test json<->ruby obj
|
74
|
+
# puts "unmarshalled new form"
|
75
|
+
# puts new_form.pretty
|
76
|
+
|
77
|
+
created_form = new_form.post
|
78
|
+
puts "created form remotely"
|
79
|
+
puts created_form.pretty
|
80
|
+
|
81
|
+
puts "Form url: " + created_form.links[1].rel
|
82
|
+
|
data/lib/rubytypeformio.rb
CHANGED
@@ -1,9 +1,36 @@
|
|
1
|
-
|
1
|
+
require_relative 'rubytypeformio/version'
|
2
2
|
|
3
|
-
|
3
|
+
require_relative 'rubytypeformio/base'
|
4
|
+
|
5
|
+
require_relative 'rubytypeformio/field'
|
6
|
+
require_relative 'rubytypeformio/short_text_field'
|
7
|
+
require_relative 'rubytypeformio/long_text_field'
|
8
|
+
require_relative 'rubytypeformio/statement_field'
|
9
|
+
require_relative 'rubytypeformio/choice_field'
|
10
|
+
require_relative 'rubytypeformio/multiple_choice_field'
|
11
|
+
require_relative 'rubytypeformio/picture_choice_field'
|
12
|
+
require_relative 'rubytypeformio/dropdown_field'
|
13
|
+
require_relative 'rubytypeformio/opinion_field'
|
14
|
+
require_relative 'rubytypeformio/rating_field'
|
15
|
+
require_relative 'rubytypeformio/email_field'
|
16
|
+
require_relative 'rubytypeformio/website_field'
|
17
|
+
require_relative 'rubytypeformio/legal_field'
|
18
|
+
require_relative 'rubytypeformio/yes_no_field'
|
19
|
+
|
20
|
+
require_relative 'rubytypeformio/link'
|
21
|
+
require_relative 'rubytypeformio/choice'
|
4
22
|
|
23
|
+
require_relative 'rubytypeformio/client'
|
24
|
+
require_relative 'rubytypeformio/form'
|
25
|
+
|
26
|
+
module Rubytypeformio
|
5
27
|
def hi
|
6
28
|
puts 'O HAI'
|
7
|
-
end
|
8
29
|
|
30
|
+
# Make request to typeform api with faraday
|
31
|
+
|
32
|
+
|
33
|
+
|
34
|
+
end
|
9
35
|
end
|
36
|
+
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'json'
|
2
|
+
|
3
|
+
module Rubytypeformio
|
4
|
+
|
5
|
+
class Base
|
6
|
+
|
7
|
+
def pretty
|
8
|
+
# pry
|
9
|
+
puts JSON.pretty_generate(self.to_h)
|
10
|
+
end
|
11
|
+
|
12
|
+
def compact(hash)
|
13
|
+
# hash.delete_if { |k, v| v.nil? }
|
14
|
+
hash.delete_if { |key, value| value.to_s.strip == '' }
|
15
|
+
end
|
16
|
+
|
17
|
+
private
|
18
|
+
|
19
|
+
def to_snake_case(string)
|
20
|
+
string.gsub(/::/, '/').
|
21
|
+
gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').
|
22
|
+
gsub(/([a-z\d])([A-Z])/,'\1_\2').
|
23
|
+
tr("-", "_").
|
24
|
+
downcase
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
|
31
|
+
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require 'json'
|
2
|
+
require_relative 'base'
|
3
|
+
|
4
|
+
module Rubytypeformio
|
5
|
+
|
6
|
+
class Choice < Base
|
7
|
+
attr_accessor :image_id, :label
|
8
|
+
|
9
|
+
def initialize (label)
|
10
|
+
@label = label
|
11
|
+
end
|
12
|
+
|
13
|
+
def to_json
|
14
|
+
JSON.dump(self.to_h)
|
15
|
+
end
|
16
|
+
|
17
|
+
def to_h
|
18
|
+
return {
|
19
|
+
:image_id => @image_id,
|
20
|
+
:label => @label
|
21
|
+
}
|
22
|
+
end
|
23
|
+
|
24
|
+
def self.from_json(string)
|
25
|
+
data = JSON.load(string)
|
26
|
+
obj = self.new( data["label"])
|
27
|
+
if (data["image_id"])
|
28
|
+
obj.image_id = data["image_id"]
|
29
|
+
end
|
30
|
+
return obj
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require_relative 'field'
|
2
|
+
require_relative 'choice'
|
3
|
+
|
4
|
+
module Rubytypeformio
|
5
|
+
class ChoiceField < Field
|
6
|
+
|
7
|
+
attr_accessor :choices
|
8
|
+
|
9
|
+
def initialize (question, description, required, type, choices)
|
10
|
+
super(question, description, required, type)
|
11
|
+
@choices = choices
|
12
|
+
end
|
13
|
+
|
14
|
+
def to_h
|
15
|
+
hash = super.to_h
|
16
|
+
|
17
|
+
hash[:choices] = []
|
18
|
+
@choices.each { |c|
|
19
|
+
hash[:choices].push(c.to_h)
|
20
|
+
}
|
21
|
+
return hash
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require_relative 'choice_field'
|
2
|
+
|
3
|
+
module Rubytypeformio
|
4
|
+
class DropdownField < ChoiceField
|
5
|
+
|
6
|
+
def initialize (question, description, required, choices)
|
7
|
+
return super(question, description, required, 'dropdown', choices)
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.from_json(string)
|
11
|
+
data = JSON.load(string)
|
12
|
+
|
13
|
+
choices = []
|
14
|
+
if (!data["choices"].nil?)
|
15
|
+
data["choices"].each { |f|
|
16
|
+
choices.push(Rubytypeformio::Choice.from_json(f.to_json))
|
17
|
+
}
|
18
|
+
end
|
19
|
+
|
20
|
+
obj = self.new( data["question"],
|
21
|
+
data["description"],
|
22
|
+
data["required"],
|
23
|
+
choices)
|
24
|
+
obj.id = data["id"]
|
25
|
+
|
26
|
+
return obj
|
27
|
+
end
|
28
|
+
|
29
|
+
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require_relative 'field'
|
2
|
+
|
3
|
+
module Rubytypeformio
|
4
|
+
class EmailField < Field
|
5
|
+
|
6
|
+
def initialize (question, description, required)
|
7
|
+
return super(question, description, required, 'email')
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.from_json(string)
|
11
|
+
data = JSON.load(string)
|
12
|
+
obj = self.new( data["question"],
|
13
|
+
data["description"],
|
14
|
+
data["required"])
|
15
|
+
obj.id = data["id"]
|
16
|
+
return obj
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
@@ -0,0 +1,40 @@
|
|
1
|
+
require 'json'
|
2
|
+
require_relative 'base'
|
3
|
+
|
4
|
+
module Rubytypeformio
|
5
|
+
|
6
|
+
class Field < Base
|
7
|
+
attr_accessor :id, :description, :question, :required, :type
|
8
|
+
|
9
|
+
def initialize (question, description, required, type)
|
10
|
+
@description = description
|
11
|
+
@question = question
|
12
|
+
@required = required
|
13
|
+
@type = type
|
14
|
+
end
|
15
|
+
|
16
|
+
def to_json
|
17
|
+
JSON.dump(self.to_h)
|
18
|
+
end
|
19
|
+
|
20
|
+
def to_h
|
21
|
+
hash = {
|
22
|
+
:description => @description,
|
23
|
+
:question => @question,
|
24
|
+
:required => @required,
|
25
|
+
:type => @type,
|
26
|
+
:id => @id,
|
27
|
+
}
|
28
|
+
end
|
29
|
+
|
30
|
+
def self.from_json(string)
|
31
|
+
data = JSON.load(string)
|
32
|
+
obj = self.new( data["description"],
|
33
|
+
data["question"],
|
34
|
+
data["required"],
|
35
|
+
data["type"] )
|
36
|
+
obj.id = data["id"]
|
37
|
+
return obj
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,150 @@
|
|
1
|
+
require 'faraday'
|
2
|
+
require 'json'
|
3
|
+
|
4
|
+
require_relative 'base'
|
5
|
+
require_relative 'field'
|
6
|
+
require_relative 'link'
|
7
|
+
|
8
|
+
require_relative 'short_text_field'
|
9
|
+
require_relative 'long_text_field'
|
10
|
+
require_relative 'statement_field'
|
11
|
+
require_relative 'multiple_choice_field'
|
12
|
+
require_relative 'picture_choice_field'
|
13
|
+
require_relative 'dropdown_field'
|
14
|
+
require_relative 'opinion_field'
|
15
|
+
require_relative 'rating_field'
|
16
|
+
require_relative 'number_field'
|
17
|
+
require_relative 'website_field'
|
18
|
+
require_relative 'email_field'
|
19
|
+
require_relative 'legal_field'
|
20
|
+
require_relative 'yes_no_field'
|
21
|
+
|
22
|
+
module Rubytypeformio
|
23
|
+
|
24
|
+
class Form < Base
|
25
|
+
|
26
|
+
attr_accessor :id, :links, :title, :design_id, :webhook_submit_url, :fields
|
27
|
+
|
28
|
+
def initialize (title, webhook, design_id, fields)
|
29
|
+
@title = title
|
30
|
+
@webhook_submit_url = webhook
|
31
|
+
@design_id = design_id
|
32
|
+
@fields = fields
|
33
|
+
end
|
34
|
+
|
35
|
+
def to_h
|
36
|
+
hash = {
|
37
|
+
:id => @id,
|
38
|
+
:title => @title,
|
39
|
+
:design_id => @design_id,
|
40
|
+
:webhook_submit_url => @webhook_submit_url
|
41
|
+
}
|
42
|
+
|
43
|
+
hash[:fields] = []
|
44
|
+
@fields.each { |f|
|
45
|
+
hash[:fields].push(f.to_h)
|
46
|
+
}
|
47
|
+
hash[:links] = []
|
48
|
+
if (!@links.nil?)
|
49
|
+
@links.each { |l|
|
50
|
+
hash[:links].push(l.to_h)
|
51
|
+
}
|
52
|
+
end
|
53
|
+
|
54
|
+
return hash
|
55
|
+
|
56
|
+
end
|
57
|
+
|
58
|
+
def to_json
|
59
|
+
JSON.dump(self.to_h)
|
60
|
+
end
|
61
|
+
|
62
|
+
def self.from_json(string)
|
63
|
+
data = JSON.load(string)
|
64
|
+
fields = []
|
65
|
+
data["fields"].each { |f|
|
66
|
+
|
67
|
+
# @TODO: figure out a cleaner way to do this case statement
|
68
|
+
case f["type"]
|
69
|
+
when 'short_text'
|
70
|
+
fields.push(Rubytypeformio::ShortTextField.from_json(f.to_json))
|
71
|
+
when 'long_text_field'
|
72
|
+
fields.push(Rubytypeformio::LongTextField.from_json(f.to_json))
|
73
|
+
when 'statement'
|
74
|
+
fields.push(Rubytypeformio::StatementField.from_json(f.to_json))
|
75
|
+
when 'multiple_choice'
|
76
|
+
fields.push(Rubytypeformio::MultipleChoiceField.from_json(f.to_json))
|
77
|
+
when 'picture_choice'
|
78
|
+
fields.push(Rubytypeformio::PictureChoiceField.from_json(f.to_json))
|
79
|
+
when 'dropdown'
|
80
|
+
fields.push(Rubytypeformio::DropdownField.from_json(f.to_json))
|
81
|
+
when 'yes_no'
|
82
|
+
fields.push(Rubytypeformio::YesNoField.from_json(f.to_json))
|
83
|
+
when 'number'
|
84
|
+
fields.push(Rubytypeformio::NumberField.from_json(f.to_json))
|
85
|
+
when 'rating'
|
86
|
+
fields.push(Rubytypeformio::RatingField.from_json(f.to_json))
|
87
|
+
when 'opinion_scale'
|
88
|
+
fields.push(Rubytypeformio::OpinionField.from_json(f.to_json))
|
89
|
+
when 'email'
|
90
|
+
fields.push(Rubytypeformio::EmailField.from_json(f.to_json))
|
91
|
+
when 'website'
|
92
|
+
fields.push(Rubytypeformio::WebsiteField.from_json(f.to_json))
|
93
|
+
when 'legal'
|
94
|
+
fields.push(Rubytypeformio::LegalField.from_json(f.to_json))
|
95
|
+
else
|
96
|
+
fields.push(Rubytypeformio::Field.from_json(f.to_json))
|
97
|
+
end
|
98
|
+
|
99
|
+
}
|
100
|
+
|
101
|
+
obj = self.new(data["title"],
|
102
|
+
data["webhook_submit_url"],
|
103
|
+
data["design_id"],
|
104
|
+
fields)
|
105
|
+
|
106
|
+
if (data["links"])
|
107
|
+
links = []
|
108
|
+
data["links"].each { |l|
|
109
|
+
links.push(Rubytypeformio::Link.from_json(l.to_json))
|
110
|
+
}
|
111
|
+
obj.links = links
|
112
|
+
end
|
113
|
+
|
114
|
+
if (data["id"])
|
115
|
+
obj.id = data["id"]
|
116
|
+
end
|
117
|
+
|
118
|
+
return obj
|
119
|
+
end
|
120
|
+
|
121
|
+
# @return [Form]
|
122
|
+
def post
|
123
|
+
|
124
|
+
if (ENV["TYPEFORM_KEY"].nil?)
|
125
|
+
puts "no typeform key set"
|
126
|
+
return nil
|
127
|
+
end
|
128
|
+
|
129
|
+
puts 'creating new form with API'
|
130
|
+
|
131
|
+
conn = Faraday.new(:url => 'https://api.typeform.io') do |faraday|
|
132
|
+
faraday.request :url_encoded
|
133
|
+
faraday.response :logger
|
134
|
+
faraday.adapter Faraday.default_adapter
|
135
|
+
end
|
136
|
+
|
137
|
+
resp = conn.post do |req|
|
138
|
+
req.url 'https://api.typeform.io/v0.3/forms'
|
139
|
+
req.headers['x-api-token'] = ENV["TYPEFORM_KEY"]
|
140
|
+
req.body = self.compact(self.to_h).to_json.to_s
|
141
|
+
|
142
|
+
puts "REQUEST: " + req.to_s
|
143
|
+
end
|
144
|
+
|
145
|
+
return Rubytypeformio::Form.from_json(resp.body)
|
146
|
+
end
|
147
|
+
|
148
|
+
end
|
149
|
+
|
150
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require_relative 'field'
|
2
|
+
|
3
|
+
module Rubytypeformio
|
4
|
+
class LegalField < Field
|
5
|
+
|
6
|
+
def initialize (question, description, required)
|
7
|
+
return super(question, description, required, 'legal')
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.from_json(string)
|
11
|
+
data = JSON.load(string)
|
12
|
+
obj = self.new( data["question"],
|
13
|
+
data["description"],
|
14
|
+
data["required"])
|
15
|
+
obj.id = data["id"]
|
16
|
+
return obj
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require 'json'
|
2
|
+
require_relative 'base'
|
3
|
+
|
4
|
+
module Rubytypeformio
|
5
|
+
|
6
|
+
class Link < Base
|
7
|
+
attr_accessor :href, :rel
|
8
|
+
|
9
|
+
def initialize (rel, href)
|
10
|
+
@rel = rel
|
11
|
+
@href = href
|
12
|
+
end
|
13
|
+
|
14
|
+
def to_json
|
15
|
+
JSON.dump(self.to_h)
|
16
|
+
end
|
17
|
+
|
18
|
+
def to_h
|
19
|
+
return {
|
20
|
+
:href => @href,
|
21
|
+
:rel => @rel
|
22
|
+
}
|
23
|
+
end
|
24
|
+
|
25
|
+
def self.from_json(string)
|
26
|
+
data = JSON.load(string)
|
27
|
+
obj = self.new( data["href"],
|
28
|
+
data["rel"])
|
29
|
+
return obj
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require_relative 'field'
|
2
|
+
|
3
|
+
module Rubytypeformio
|
4
|
+
|
5
|
+
class LongTextField < Field
|
6
|
+
|
7
|
+
def initialize (question, description, required)
|
8
|
+
super(question, description, required, 'long_text')
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.from_json(string)
|
12
|
+
data = JSON.load(string)
|
13
|
+
obj = self.new( data["question"],
|
14
|
+
data["description"],
|
15
|
+
data["required"])
|
16
|
+
obj.id = data["id"]
|
17
|
+
return obj
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require_relative 'choice_field'
|
2
|
+
|
3
|
+
module Rubytypeformio
|
4
|
+
class MultipleChoiceField < ChoiceField
|
5
|
+
|
6
|
+
def initialize (question, description, required, choices)
|
7
|
+
return super(question, description, required, 'multiple_choice', choices)
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.from_json(string)
|
11
|
+
data = JSON.load(string)
|
12
|
+
|
13
|
+
choices = []
|
14
|
+
if (!data["choices"].nil?)
|
15
|
+
data["choices"].each { |f|
|
16
|
+
choices.push(Rubytypeformio::Choice.from_json(f.to_json))
|
17
|
+
}
|
18
|
+
end
|
19
|
+
|
20
|
+
obj = self.new( data["question"],
|
21
|
+
data["description"],
|
22
|
+
data["required"],
|
23
|
+
choices)
|
24
|
+
obj.id = data["id"]
|
25
|
+
|
26
|
+
return obj
|
27
|
+
end
|
28
|
+
|
29
|
+
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require_relative 'field'
|
2
|
+
|
3
|
+
module Rubytypeformio
|
4
|
+
class NumberField < Field
|
5
|
+
|
6
|
+
def initialize (question, description, required)
|
7
|
+
return super(question, description, required, 'number')
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.from_json(string)
|
11
|
+
data = JSON.load(string)
|
12
|
+
obj = self.new( data["question"],
|
13
|
+
data["description"],
|
14
|
+
data["required"])
|
15
|
+
obj.id = data["id"]
|
16
|
+
return obj
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require_relative 'field'
|
2
|
+
|
3
|
+
module Rubytypeformio
|
4
|
+
class OpinionField < Field
|
5
|
+
|
6
|
+
def initialize (question, description, required)
|
7
|
+
return super(question, description, required, 'opinion_scale')
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.from_json(string)
|
11
|
+
data = JSON.load(string)
|
12
|
+
obj = self.new( data["question"],
|
13
|
+
data["description"],
|
14
|
+
data["required"])
|
15
|
+
obj.id = data["id"]
|
16
|
+
return obj
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require_relative 'multiple_choice_field'
|
2
|
+
|
3
|
+
module Rubytypeformio
|
4
|
+
class PictureChoiceField < ChoiceField
|
5
|
+
|
6
|
+
def initialize (question, description, required, choices)
|
7
|
+
return super(question, description, required, 'picture_choice', choices)
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.from_json(string)
|
11
|
+
data = JSON.load(string)
|
12
|
+
|
13
|
+
choices = []
|
14
|
+
if (!data["choices"].nil?)
|
15
|
+
data["choices"].each { |f|
|
16
|
+
choices.push(Rubytypeformio::Choice.from_json(f.to_json))
|
17
|
+
}
|
18
|
+
end
|
19
|
+
|
20
|
+
obj = self.new( data["question"],
|
21
|
+
data["description"],
|
22
|
+
data["required"],
|
23
|
+
choices)
|
24
|
+
obj.id = data["id"]
|
25
|
+
|
26
|
+
return obj
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require_relative 'field'
|
2
|
+
|
3
|
+
module Rubytypeformio
|
4
|
+
class RatingField < Field
|
5
|
+
|
6
|
+
def initialize (question, description, required)
|
7
|
+
return super(question, description, required, 'rating')
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.from_json(string)
|
11
|
+
data = JSON.load(string)
|
12
|
+
obj = self.new( data["question"],
|
13
|
+
data["description"],
|
14
|
+
data["required"])
|
15
|
+
obj.id = data["id"]
|
16
|
+
return obj
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require_relative 'field'
|
2
|
+
|
3
|
+
module Rubytypeformio
|
4
|
+
|
5
|
+
class ShortTextField < Field
|
6
|
+
|
7
|
+
def initialize (question, description, required)
|
8
|
+
super(question, description, required, 'short_text')
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.from_json(string)
|
12
|
+
data = JSON.load(string)
|
13
|
+
obj = self.new( data["question"],
|
14
|
+
data["description"],
|
15
|
+
data["required"])
|
16
|
+
obj.id = data["id"]
|
17
|
+
return obj
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require_relative 'field'
|
2
|
+
|
3
|
+
module Rubytypeformio
|
4
|
+
class StatementField < Field
|
5
|
+
|
6
|
+
def initialize (question, description, required)
|
7
|
+
return super(question, description, required, 'statement')
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.from_json(string)
|
11
|
+
data = JSON.load(string)
|
12
|
+
obj = self.new( data["question"],
|
13
|
+
data["description"],
|
14
|
+
data["required"])
|
15
|
+
obj.id = data["id"]
|
16
|
+
return obj
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require_relative 'field'
|
2
|
+
|
3
|
+
module Rubytypeformio
|
4
|
+
class WebsiteField < Field
|
5
|
+
|
6
|
+
def initialize (question, description, required)
|
7
|
+
return super(question, description, required, 'website')
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.from_json(string)
|
11
|
+
data = JSON.load(string)
|
12
|
+
obj = self.new( data["question"],
|
13
|
+
data["description"],
|
14
|
+
data["required"])
|
15
|
+
obj.id = data["id"]
|
16
|
+
return obj
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require_relative 'field'
|
2
|
+
|
3
|
+
module Rubytypeformio
|
4
|
+
class YesNoField < Field
|
5
|
+
|
6
|
+
def initialize (question, description, required)
|
7
|
+
return super(question, description, required, 'yes_no')
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.from_json(string)
|
11
|
+
data = JSON.load(string)
|
12
|
+
obj = self.new( data["question"],
|
13
|
+
data["description"],
|
14
|
+
data["required"])
|
15
|
+
obj.id = data["id"]
|
16
|
+
return obj
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
data/rubytypeformio.gemspec
CHANGED
@@ -10,7 +10,7 @@ Gem::Specification.new do |spec|
|
|
10
10
|
spec.email = ["zachgold@gmail.com"]
|
11
11
|
|
12
12
|
spec.summary = %q{A simple API wrapper for typeformio.}
|
13
|
-
spec.description = %q{
|
13
|
+
spec.description = %q{Wraps the api to provide convenience methods for interacting with the api.}
|
14
14
|
spec.homepage = "https://github.com/zachgoldstein/rubytypeformio"
|
15
15
|
spec.license = "MIT"
|
16
16
|
|
@@ -20,6 +20,14 @@ Gem::Specification.new do |spec|
|
|
20
20
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
21
21
|
spec.require_paths = ["lib"]
|
22
22
|
|
23
|
-
spec.add_development_dependency "bundler", "
|
24
|
-
spec.add_development_dependency "rake", "
|
23
|
+
spec.add_development_dependency "bundler", "1.10.5"
|
24
|
+
spec.add_development_dependency "rake", "10.4.2"
|
25
|
+
spec.add_development_dependency "rspec", "3.3.0"
|
26
|
+
spec.add_development_dependency "vcr", "2.9.3"
|
27
|
+
spec.add_development_dependency "webmock", "1.21.0"
|
28
|
+
spec.add_development_dependency "pry", "0.10.1"
|
29
|
+
|
30
|
+
spec.add_dependency "faraday", "0.9.1"
|
31
|
+
spec.add_dependency "json", "1.8.3"
|
32
|
+
|
25
33
|
end
|
data/spec/client_spec.rb
ADDED
data/spec/spec_helper.rb
ADDED
metadata
CHANGED
@@ -1,44 +1,129 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rubytypeformio
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Zachary Goldstein
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-08-
|
11
|
+
date: 2015-08-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- -
|
17
|
+
- - '='
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version:
|
19
|
+
version: 1.10.5
|
20
20
|
type: :development
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- -
|
24
|
+
- - '='
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version:
|
26
|
+
version: 1.10.5
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: rake
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- -
|
31
|
+
- - '='
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version:
|
33
|
+
version: 10.4.2
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- -
|
38
|
+
- - '='
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version:
|
41
|
-
|
40
|
+
version: 10.4.2
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rspec
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - '='
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: 3.3.0
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - '='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 3.3.0
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: vcr
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - '='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 2.9.3
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - '='
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: 2.9.3
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: webmock
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - '='
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: 1.21.0
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - '='
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: 1.21.0
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: pry
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - '='
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: 0.10.1
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - '='
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: 0.10.1
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: faraday
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - '='
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: 0.9.1
|
104
|
+
type: :runtime
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - '='
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: 0.9.1
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: json
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - '='
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: 1.8.3
|
118
|
+
type: :runtime
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - '='
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: 1.8.3
|
125
|
+
description: Wraps the api to provide convenience methods for interacting with the
|
126
|
+
api.
|
42
127
|
email:
|
43
128
|
- zachgold@gmail.com
|
44
129
|
executables: []
|
@@ -52,9 +137,32 @@ files:
|
|
52
137
|
- LICENSE.txt
|
53
138
|
- README.md
|
54
139
|
- Rakefile
|
140
|
+
- examples/examples.rb
|
55
141
|
- lib/rubytypeformio.rb
|
142
|
+
- lib/rubytypeformio/base.rb
|
143
|
+
- lib/rubytypeformio/choice.rb
|
144
|
+
- lib/rubytypeformio/choice_field.rb
|
145
|
+
- lib/rubytypeformio/client.rb
|
146
|
+
- lib/rubytypeformio/dropdown_field.rb
|
147
|
+
- lib/rubytypeformio/email_field.rb
|
148
|
+
- lib/rubytypeformio/field.rb
|
149
|
+
- lib/rubytypeformio/form.rb
|
150
|
+
- lib/rubytypeformio/legal_field.rb
|
151
|
+
- lib/rubytypeformio/link.rb
|
152
|
+
- lib/rubytypeformio/long_text_field.rb
|
153
|
+
- lib/rubytypeformio/multiple_choice_field.rb
|
154
|
+
- lib/rubytypeformio/number_field.rb
|
155
|
+
- lib/rubytypeformio/opinion_field.rb
|
156
|
+
- lib/rubytypeformio/picture_choice_field.rb
|
157
|
+
- lib/rubytypeformio/rating_field.rb
|
158
|
+
- lib/rubytypeformio/short_text_field.rb
|
159
|
+
- lib/rubytypeformio/statement_field.rb
|
56
160
|
- lib/rubytypeformio/version.rb
|
161
|
+
- lib/rubytypeformio/website_field.rb
|
162
|
+
- lib/rubytypeformio/yes_no_field.rb
|
57
163
|
- rubytypeformio.gemspec
|
164
|
+
- spec/client_spec.rb
|
165
|
+
- spec/spec_helper.rb
|
58
166
|
homepage: https://github.com/zachgoldstein/rubytypeformio
|
59
167
|
licenses:
|
60
168
|
- MIT
|
@@ -79,4 +187,6 @@ rubygems_version: 2.4.6
|
|
79
187
|
signing_key:
|
80
188
|
specification_version: 4
|
81
189
|
summary: A simple API wrapper for typeformio.
|
82
|
-
test_files:
|
190
|
+
test_files:
|
191
|
+
- spec/client_spec.rb
|
192
|
+
- spec/spec_helper.rb
|