typed_form 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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: d67800ceba46ef713f9fc5aa6d60390ad29d1737
4
- data.tar.gz: dfe2b5bcf4c885ad9883af07d6a92f86d107572c
3
+ metadata.gz: d5ead981248e841e93b35f762ad6bfa365603a40
4
+ data.tar.gz: 47d2587d6a6bfc5405ae5c1263e9b912d65e0853
5
5
  SHA512:
6
- metadata.gz: 3817ca0f77392d2846dca9b7f7b51fc00a5685d3caacf5a25dd90f6ec7a6a4aefa9cffa92a5d0eb8218b05099234ea14af6631512463b8edf9a8c7ee08d94b01
7
- data.tar.gz: c1ed19b2752ec0e4d3fed9a2a20a913ba751c18bbf7af79ec79f359a070b4a8d6792f559f2fc65241a7cdbe3e96a7bc9a563877d1c9dad1f04fa9876d072b3af
6
+ metadata.gz: 21dc2335dac2fbc928e5e640612cda0aa05df5b88f75274351b25c916d0cfaa5e210f172efa033fdfa699c32474d3c451c1b84567797c04a1d5f4a16a28d6b91
7
+ data.tar.gz: 9973d47d3053017994a482de7584dc12c8001bb1ab2a68d10bf1693c302502dc3f2f59175437efcc0aabc604cfd3a34ef1a8332b8ea2d54dbf359aa57bd20c3a
data/.yardopts ADDED
@@ -0,0 +1 @@
1
+ --markup=markdown
data/CHANGELOG.md CHANGED
@@ -1,5 +1,9 @@
1
1
  # Change Log
2
2
 
3
+ ## [0.1.1] - 2017-03-12
4
+
5
+ Adds support for TypedForm::VirtualModel. Adds a decorator-like model which allows user-defined VirtualModels which respond with Typeform Data values.
6
+
3
7
  ## [0.1.0] - 2017-03-12
4
8
 
5
9
  Adds logic for extracting data needed for Data API from incoming Webhooks.
data/Gemfile CHANGED
@@ -2,3 +2,4 @@ source 'https://rubygems.org'
2
2
 
3
3
  # Specify your gem's dependencies in typed_form.gemspec
4
4
  gemspec
5
+ gem "redcarpet"
data/README.md CHANGED
@@ -105,7 +105,18 @@ questions.first.type
105
105
 
106
106
  The most common use case for this is extrapolating question and answers into a simple object that can provide a clean interface for displaying them. Question type information can be used to allow helpers to format and display different field types (most specifically dates) in a more user-friendly format.
107
107
 
108
- Additional documentation is available at [Rubydoc.](http://www.rubydoc.info/github/useed/typed_form)
108
+ Additional documentation is available at [Rubydoc.](http://www.rubydoc.info/github/useed/typed_form/master)
109
+
110
+ ## Wishlist
111
+
112
+ This gem is in the very early stages of development. Typeform does not provide a full example of the full JSON schema, so specific question and answer formats are not guaranteed to work. Issues and PRs are welcome, especially for functionality which focuses on working with data from the Typeform Data API.
113
+
114
+ The API wrapper is minimalist by purpose, and currently is only designed to fetch a single form response for a specific form from the Data API. Additional functionality may be desired in the future.
115
+
116
+ - [ ] Error Handling for JSON Responses
117
+ - [ ] Error Handling for API Requests
118
+ - [ ] Error Logging Configuration
119
+ - [ ] Automatic retry & failover for Typeform API response failures
109
120
 
110
121
  ## Development
111
122
 
@@ -121,3 +132,8 @@ Bug reports and pull requests are welcome on GitHub at https://github.com/useed/
121
132
  ## License
122
133
 
123
134
  The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
135
+
136
+
137
+ ## Code of Conduct
138
+
139
+ Everyone interacting in this repository is expected to follow [our code of conduct](https://github.com/useed/typed_form/blob/master/CODE_OF_CONDUCT.md)
@@ -1,6 +1,5 @@
1
1
  module TypedForm
2
- # A representation of the Typeform Form Data for a single
3
- # form response.
2
+ # A representation of the Typeform Form Data for a single form response.
4
3
  #
5
4
  # @attr_reader [String] json JSON data using Typeform's Data API schema
6
5
  class Form
@@ -16,7 +15,7 @@ module TypedForm
16
15
  def_delegators :submission, :questions
17
16
 
18
17
  # Creates a new instance of a Form, to allow querying
19
- def initialize(json: json)
18
+ def initialize(json:)
20
19
  @json = json
21
20
  end
22
21
 
@@ -37,13 +36,17 @@ module TypedForm
37
36
  questions.each_with_object({}) { |q, hash| hash[q.text] = q.answer }
38
37
  end
39
38
 
39
+ def response
40
+ raise StandardError, "Form expects a single response" if multi_response?
41
+ responses.first
42
+ end
43
+
40
44
  private
41
45
 
42
46
  def submission
43
- raise StandardError, "Form expects a single response" if multi_response?
44
47
  @_submission ||= FormData::FormSubmission.new(
45
48
  parsed_questions: parsed_json.questions,
46
- parsed_response: responses.first
49
+ parsed_response: response
47
50
  )
48
51
  end
49
52
 
@@ -54,9 +57,5 @@ module TypedForm
54
57
  def parsed_json
55
58
  @_parsed_json ||= FormData::ParsedJson.new(json: json)
56
59
  end
57
-
58
- def response
59
- responses.first
60
- end
61
60
  end
62
61
  end
@@ -35,7 +35,7 @@ module TypedForm
35
35
 
36
36
  def answerable_questions
37
37
  parsed_questions
38
- .reject { |q| q.id.match /(hidden|legal|statement|group)/ }
38
+ .reject { |q| q.id.match(/(hidden|legal|statement|group)/) }
39
39
  .group_by(&:field_id)
40
40
  end
41
41
 
@@ -8,9 +8,11 @@ module TypedForm
8
8
  attr_reader :json
9
9
 
10
10
  # @!method questions
11
- # @return [Arendelle] parsed_json["questions"] questions data
11
+ # @return [Arendelle] An immutable representation of the Typeform Data
12
+ # API JSON questions field.
12
13
  # @!method responses
13
- # @return [Arendelle] parsed_json["responses"] response data
14
+ # @return [Arendelle] An immutable representation of the Typeform Data
15
+ # API JSON responses field.
14
16
  def_delegators :parsed_json, :questions, :responses
15
17
 
16
18
  # Creates and freezes JSON data.
@@ -1,4 +1,4 @@
1
1
  module TypedForm
2
2
  # Up-to-date version of gem.
3
- VERSION = "0.1.0"
3
+ VERSION = "0.1.1"
4
4
  end
@@ -0,0 +1,96 @@
1
+ module TypedForm
2
+ # A representation of the Typeform Response Data for a single form response.
3
+ # Dynamically adds methods at initialization time, to provide a simple
4
+ # interface for accessing form response data.
5
+ #
6
+ # ```ruby
7
+ # # this example would require json data with a question of "What is your
8
+ # # "email?" and an answer of "user@example.com"
9
+ #
10
+ # form = TypedForm::Form.build_form_from(json: your_json_source)
11
+ # hash = { "user_email" => "What is your email" }
12
+ # virtual_model = TypedForm::VirtualModel.new(form: form, question_attr: hash)
13
+ # ```
14
+ #
15
+ # VirtualModel has now dynamically matched the user_email attribute to the
16
+ # answer of the question, by finding the question matching the regular
17
+ # expression "What is your email", and then responding with the answer.
18
+ #
19
+ # ```ruby
20
+ # virtual_model.user_email => "user@example.com"
21
+ # ```
22
+ #
23
+ # @attr_reader [Form] form The instance of the form used when referencing
24
+ # questions and answers in the submission.
25
+ # @attr_reader [Hash] question_attrs Hash mapping attribute names to regular
26
+ # expressions, expressed as strings.
27
+ #
28
+ # Format example: To match the answers of "What is your email" to an
29
+ # attribute of "user_email", the format would look like:
30
+ #
31
+ # ```ruby
32
+ # question_attrs = { "user_email" => "What is your email" }
33
+ # ```
34
+ #
35
+ # @attr_reader [Hash] response_attrs Hash mapping attribute names to a
36
+ # chain of attributes accessbile from the form response.
37
+ #
38
+ # Format example: To match the user_agent of the submission, which is under
39
+ # response["metadata"]["user_agent"], the format would look like:
40
+ #
41
+ # ```ruby
42
+ # response_attrs = { "user_agent" => "metadata.user_agent" }
43
+ # ```
44
+ class VirtualModel
45
+ attr_reader :form, :question_attrs, :response_attrs
46
+
47
+ def initialize(form:, question_attrs: nil, response_attrs: nil)
48
+ @form = form
49
+
50
+ _define_question_attributes(question_attrs || {})
51
+ _define_response_attributes(response_attrs || {})
52
+ end
53
+
54
+ private
55
+
56
+ def find_answer_to(text)
57
+ question = form.questions.detect { |q| q.text.match Regexp.new(text) }
58
+ return unless question
59
+ question.answer
60
+ end
61
+
62
+ def able_to_define?(attr)
63
+ !self.class.method_defined?(attr) &&
64
+ attr.to_s.match(/^[a-z_][a-zA-Z_0-9!?]*$/)
65
+ end
66
+
67
+ def _define_question_attributes(question_attrs)
68
+ question_attrs.each do |k, v|
69
+ next unless able_to_define?(k)
70
+
71
+ answer = find_answer_to(v)
72
+ next if answer.nil?
73
+
74
+ define_singleton_method k do
75
+ answer
76
+ end
77
+ end
78
+ end
79
+
80
+ def response_attribute_value(messages)
81
+ messages.split(".").inject(form.response) do |message, e|
82
+ message.send(e)
83
+ end
84
+ end
85
+
86
+ def _define_response_attributes(response_attrs)
87
+ response_attrs.each do |k, v|
88
+ next unless able_to_define?(k)
89
+
90
+ define_singleton_method k do
91
+ response_attribute_value(v)
92
+ end
93
+ end
94
+ end
95
+ end
96
+ end
@@ -20,7 +20,7 @@ module TypedForm
20
20
 
21
21
  # Creates a new webhook object from an incoming Typeform Data stream.
22
22
  # @param [String] json JSON Data from a Typeform Webhook
23
- def initialize(json: json)
23
+ def initialize(json:)
24
24
  @json = json.freeze
25
25
  end
26
26
 
data/lib/typed_form.rb CHANGED
@@ -6,6 +6,7 @@ require "typed_form/form_data/parsed_json"
6
6
  require "typed_form/form_data/question"
7
7
  require "typed_form/form_data/answers"
8
8
  require "typed_form/form_data/form_submission"
9
+ require "typed_form/virtual_model"
9
10
  require "typed_form/form"
10
11
  require "typed_form/webhook"
11
12
  require "typed_form/version"
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: typed_form
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Rob Cole
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: exe
11
11
  cert_chain: []
12
- date: 2017-03-12 00:00:00.000000000 Z
12
+ date: 2017-03-13 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: httparty
@@ -125,6 +125,7 @@ extra_rdoc_files: []
125
125
  files:
126
126
  - ".gitignore"
127
127
  - ".rspec"
128
+ - ".yardopts"
128
129
  - CHANGELOG.md
129
130
  - CODE_OF_CONDUCT.md
130
131
  - Gemfile
@@ -141,6 +142,7 @@ files:
141
142
  - lib/typed_form/form_data/parsed_json.rb
142
143
  - lib/typed_form/form_data/question.rb
143
144
  - lib/typed_form/version.rb
145
+ - lib/typed_form/virtual_model.rb
144
146
  - lib/typed_form/webhook.rb
145
147
  homepage: https://github.com/useed/typed_form
146
148
  licenses: