survey-gizmo-ruby 5.0.3 → 5.0.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +10 -6
- data/lib/survey_gizmo/api/account_teams.rb +10 -12
- data/lib/survey_gizmo/api/answer.rb +45 -48
- data/lib/survey_gizmo/api/campaign.rb +2 -3
- data/lib/survey_gizmo/api/contact.rb +2 -3
- data/lib/survey_gizmo/api/email_message.rb +2 -3
- data/lib/survey_gizmo/api/option.rb +2 -3
- data/lib/survey_gizmo/api/page.rb +2 -3
- data/lib/survey_gizmo/api/question.rb +2 -3
- data/lib/survey_gizmo/api/response.rb +4 -4
- data/lib/survey_gizmo/api/survey.rb +6 -8
- data/lib/survey_gizmo/configuration.rb +3 -0
- data/lib/survey_gizmo/connection.rb +2 -4
- data/lib/survey_gizmo/version.rb +1 -1
- data/survey-gizmo-ruby.gemspec +3 -3
- metadata +13 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c2d8dfa46ed2f287166d32c156466b1ff39d84b7
|
4
|
+
data.tar.gz: c22d6cb33d3e3a57fe6d848e33011dd9c5f860ad
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 89cda081f559f84fb5c19493ddb11e2f48bd0d8c4ff26d76ab6f4d8320428dc5dbfc7561cbbf929a67fb4217cae391414b269eeb6a330c2a7fb3f9549d1986eb
|
7
|
+
data.tar.gz: 06cac087f8f21a42fe5a6e2c535d0e407fac2d86fa39967778942e68ce469419dadb7e56308a47a95e48c1e87d5241788d9465792b7356d48805bf2372995f2d
|
data/README.md
CHANGED
@@ -58,6 +58,9 @@ SurveyGizmo.configure do |config|
|
|
58
58
|
|
59
59
|
# Optional - Defaults to 50, maximum 500. Setting too high may cause SurveyGizmo to start throwing timeouts.
|
60
60
|
config.results_per_page = 100
|
61
|
+
|
62
|
+
# Optional - Defaults to 300 seconds
|
63
|
+
config.timeout_seconds = 600
|
61
64
|
end
|
62
65
|
```
|
63
66
|
|
@@ -78,7 +81,8 @@ Pester.configure do |config|
|
|
78
81
|
config.environments[:survey_gizmo_ruby][:retry_error_classes] = [MyExceptionClass, MyOtherExceptionClass]
|
79
82
|
end
|
80
83
|
|
81
|
-
# To set Pester to retry on ALL exception classes, do this
|
84
|
+
# To set Pester to retry on ALL exception classes, do this:
|
85
|
+
# (use with caution! Can include exceptions Rails likes to throw on SIGHUP)
|
82
86
|
Pester.configure do |config|
|
83
87
|
config.environments[:survey_gizmo_ruby][:retry_error_classes] = nil
|
84
88
|
end
|
@@ -121,9 +125,9 @@ questions = survey.questions
|
|
121
125
|
questions = survey.actual_questions
|
122
126
|
|
123
127
|
# Create a question for your survey. The returned object will be given an :id parameter by SG.
|
124
|
-
question = SurveyGizmo::API::Question.create(survey_id: survey.id, title: 'Do
|
128
|
+
question = SurveyGizmo::API::Question.create(survey_id: survey.id, title: 'Do u ruby?', type: 'checkbox')
|
125
129
|
# Update a question
|
126
|
-
question.title = "Do
|
130
|
+
question.title = "Do u <3 Ruby?"
|
127
131
|
question.save
|
128
132
|
# Destroy a question
|
129
133
|
question.destroy
|
@@ -131,8 +135,8 @@ question.destroy
|
|
131
135
|
# Iterate over all your Responses
|
132
136
|
survey.responses.each { |response| do_something_with(response) }
|
133
137
|
# Use filters to limit results - this example will iterate over page 3 of completed, non test data
|
134
|
-
# SurveyResponses submitted within the past 3 days for contact 999. It demonstrates how to use some of
|
135
|
-
# built in filters/generators as well as how to construct a filter.
|
138
|
+
# SurveyResponses submitted within the past 3 days for contact 999. It demonstrates how to use some of
|
139
|
+
# the gem's built in filters/generators as well as how to construct a filter.
|
136
140
|
# See: http://apihelp.surveygizmo.com/help/article/link/filters for more info on filters
|
137
141
|
filters = [
|
138
142
|
SurveyGizmo::API::Response::NO_TEST_DATA,
|
@@ -197,7 +201,7 @@ class SomeObject
|
|
197
201
|
get: '/something/:id',
|
198
202
|
update: '/something/weird/:id',
|
199
203
|
create: '/something',
|
200
|
-
delete: /something/delete/:id'
|
204
|
+
delete: '/something/delete/:id'
|
201
205
|
}
|
202
206
|
end
|
203
207
|
```
|
@@ -1,19 +1,17 @@
|
|
1
1
|
# This REST endpoint is only available to accounts with admin privileges
|
2
2
|
# This code is untested.
|
3
3
|
|
4
|
-
module SurveyGizmo
|
5
|
-
|
6
|
-
|
7
|
-
include SurveyGizmo::Resource
|
4
|
+
module SurveyGizmo::API
|
5
|
+
class AccountTeams
|
6
|
+
include SurveyGizmo::Resource
|
8
7
|
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
8
|
+
attribute :id, Integer
|
9
|
+
attribute :teamid, Integer
|
10
|
+
attribute :teamname, String
|
11
|
+
attribute :color, String
|
12
|
+
attribute :default_role, String
|
13
|
+
attribute :status, String
|
15
14
|
|
16
|
-
|
17
|
-
end
|
15
|
+
@route = '/accountteams'
|
18
16
|
end
|
19
17
|
end
|
@@ -1,59 +1,56 @@
|
|
1
|
-
module SurveyGizmo
|
2
|
-
|
3
|
-
|
4
|
-
include Virtus.model
|
1
|
+
module SurveyGizmo::API
|
2
|
+
class Answer
|
3
|
+
include Virtus.model
|
5
4
|
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
5
|
+
attribute :key, String
|
6
|
+
attribute :value, String
|
7
|
+
attribute :survey_id, Integer
|
8
|
+
attribute :response_id, Integer
|
9
|
+
attribute :question_id, Integer
|
10
|
+
attribute :option_id, Integer
|
11
|
+
attribute :submitted_at, DateTime
|
12
|
+
attribute :answer_text, String
|
13
|
+
attribute :other_text, String
|
14
|
+
attribute :question_pipe, String
|
16
15
|
|
17
|
-
|
18
|
-
|
16
|
+
def initialize(attrs = {})
|
17
|
+
self.attributes = attrs
|
19
18
|
|
20
|
-
|
21
|
-
|
22
|
-
|
19
|
+
case key
|
20
|
+
when /\[question\((\d+)\),\s*option\((\d+|"\d+-other")\)\]/
|
21
|
+
self.question_id, self.option_id = $1, $2
|
23
22
|
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
end
|
28
|
-
when /\[question\((\d+)\),\s*question_pipe\("(.*)"\)\]/
|
29
|
-
@question_id = $1
|
30
|
-
@question_pipe = $2
|
31
|
-
when /\[question\((\d+)\)\]/
|
32
|
-
@question_id = $1
|
33
|
-
else
|
34
|
-
fail "Can't recognize pattern for #{attrs[:key]} => #{attrs[:value]} - you may have to parse your answers manually."
|
35
|
-
end
|
36
|
-
|
37
|
-
self.question_id = @question_id.to_i
|
38
|
-
if @option_id
|
39
|
-
fail "Bad option_id #{option_id}!" if option_id.to_i == 0 && option_id != '0'
|
40
|
-
self.option_id = @option_id.to_i
|
23
|
+
if option_id =~ /-other/
|
24
|
+
option_id.delete!('-other"')
|
25
|
+
self.other_text = value
|
41
26
|
end
|
27
|
+
when /\[question\((\d+)\),\s*question_pipe\("(.*)"\)\]/
|
28
|
+
self.question_id, self.question_pipe = $1, $2
|
29
|
+
when /\[question\((\d+)\)\]/
|
30
|
+
self.question_id = $1
|
31
|
+
else
|
32
|
+
fail "Can't recognize pattern for #{attrs[:key]} => #{attrs[:value]} - you may have to parse your answers manually."
|
42
33
|
end
|
43
34
|
|
44
|
-
|
45
|
-
|
46
|
-
{
|
47
|
-
|
48
|
-
question_id: question_id,
|
49
|
-
option_id: option_id,
|
50
|
-
question_pipe: question_pipe,
|
51
|
-
submitted_at: submitted_at,
|
52
|
-
survey_id: survey_id,
|
53
|
-
other_text: other_text,
|
54
|
-
answer_text: option_id || other_text ? nil : answer_text
|
55
|
-
}.reject { |k,v| v.nil? }
|
35
|
+
self.question_id = question_id.to_i
|
36
|
+
if option_id
|
37
|
+
fail "Bad option_id #{option_id} (class: #{option_id.class}) for #{attrs}!" if option_id.to_i == 0 && option_id != '0' && option_id != 0
|
38
|
+
self.option_id = option_id.to_i
|
56
39
|
end
|
57
40
|
end
|
41
|
+
|
42
|
+
# Strips out the answer_text when there is a valid option_id
|
43
|
+
def to_hash
|
44
|
+
{
|
45
|
+
response_id: response_id,
|
46
|
+
question_id: question_id,
|
47
|
+
option_id: option_id,
|
48
|
+
question_pipe: question_pipe,
|
49
|
+
submitted_at: submitted_at,
|
50
|
+
survey_id: survey_id,
|
51
|
+
other_text: other_text,
|
52
|
+
answer_text: option_id || other_text ? nil : answer_text
|
53
|
+
}.reject { |k, v| v.nil? }
|
54
|
+
end
|
58
55
|
end
|
59
56
|
end
|
@@ -1,5 +1,4 @@
|
|
1
|
-
module SurveyGizmo
|
2
|
-
# @see SurveyGizmo::Resource::ClassMethods
|
1
|
+
module SurveyGizmo::API
|
3
2
|
class Campaign
|
4
3
|
include SurveyGizmo::Resource
|
5
4
|
|
@@ -29,4 +28,4 @@ module SurveyGizmo; module API
|
|
29
28
|
Contact.all(conditions.merge(children_params).merge(all_pages: !conditions[:page]))
|
30
29
|
end
|
31
30
|
end
|
32
|
-
end
|
31
|
+
end
|
@@ -1,5 +1,4 @@
|
|
1
|
-
module SurveyGizmo
|
2
|
-
# @see SurveyGizmo::Resource::ClassMethods
|
1
|
+
module SurveyGizmo::API
|
3
2
|
class Contact
|
4
3
|
include SurveyGizmo::Resource
|
5
4
|
|
@@ -38,4 +37,4 @@ module SurveyGizmo; module API
|
|
38
37
|
|
39
38
|
@route = '/survey/:survey_id/surveycampaign/:campaign_id/contact'
|
40
39
|
end
|
41
|
-
end
|
40
|
+
end
|
@@ -1,5 +1,4 @@
|
|
1
|
-
module SurveyGizmo
|
2
|
-
# @see SurveyGizmo::Resource::ClassMethods
|
1
|
+
module SurveyGizmo::API
|
3
2
|
class EmailMessage
|
4
3
|
include SurveyGizmo::Resource
|
5
4
|
|
@@ -22,4 +21,4 @@ module SurveyGizmo; module API
|
|
22
21
|
|
23
22
|
@route = '/survey/:survey_id/surveycampaign/:campaign_id/emailmessage'
|
24
23
|
end
|
25
|
-
end
|
24
|
+
end
|
@@ -1,5 +1,4 @@
|
|
1
|
-
module SurveyGizmo
|
2
|
-
# @see SurveyGizmo::Resource::ClassMethods
|
1
|
+
module SurveyGizmo::API
|
3
2
|
class Option
|
4
3
|
include SurveyGizmo::Resource
|
5
4
|
include SurveyGizmo::MultilingualTitle
|
@@ -13,4 +12,4 @@ module SurveyGizmo; module API
|
|
13
12
|
|
14
13
|
@route = '/survey/:survey_id/surveypage/:page_id/surveyquestion/:question_id/surveyoption'
|
15
14
|
end
|
16
|
-
end
|
15
|
+
end
|
@@ -1,7 +1,6 @@
|
|
1
1
|
require 'survey_gizmo/api/question'
|
2
2
|
|
3
|
-
module SurveyGizmo
|
4
|
-
# @see SurveyGizmo::Resource::ClassMethods
|
3
|
+
module SurveyGizmo::API
|
5
4
|
class Page
|
6
5
|
include SurveyGizmo::Resource
|
7
6
|
include SurveyGizmo::MultilingualTitle
|
@@ -33,4 +32,4 @@ module SurveyGizmo; module API
|
|
33
32
|
@questions = with_subquestions.each { |q| q.attributes = children_params }
|
34
33
|
end
|
35
34
|
end
|
36
|
-
end
|
35
|
+
end
|
@@ -1,7 +1,6 @@
|
|
1
1
|
require 'survey_gizmo/api/option'
|
2
2
|
|
3
|
-
module SurveyGizmo
|
4
|
-
# @see SurveyGizmo::Resource::ClassMethods
|
3
|
+
module SurveyGizmo::API
|
5
4
|
class Question
|
6
5
|
include SurveyGizmo::Resource
|
7
6
|
include SurveyGizmo::MultilingualTitle
|
@@ -59,4 +58,4 @@ module SurveyGizmo; module API
|
|
59
58
|
end
|
60
59
|
end
|
61
60
|
end
|
62
|
-
end
|
61
|
+
end
|
@@ -1,5 +1,4 @@
|
|
1
|
-
module SurveyGizmo
|
2
|
-
# @see SurveyGizmo::Resource::ClassMethods
|
1
|
+
module SurveyGizmo::API
|
3
2
|
class Response
|
4
3
|
include SurveyGizmo::Resource
|
5
4
|
|
@@ -40,7 +39,8 @@ module SurveyGizmo; module API
|
|
40
39
|
answers.select do |k,v|
|
41
40
|
next false unless v.is_a?(FalseClass) || v.present?
|
42
41
|
|
43
|
-
# Strip out "Other" answers that don't actually have the "other" text
|
42
|
+
# Strip out "Other" answers that don't actually have the "other" text (they come back as two responses - one
|
43
|
+
# for the "Other" option_id, and then a whole separate response for the text given as an "Other" response.
|
44
44
|
if k =~ /\[question\((\d+)\),\s*option\((\d+)\)\]/
|
45
45
|
!answers.keys.any? { |key| key =~ /\[question\((#{$1})\),\s*option\("(#{$2})-other"\)\]/ }
|
46
46
|
else
|
@@ -49,4 +49,4 @@ module SurveyGizmo; module API
|
|
49
49
|
end.map { |k,v| Answer.new(children_params.merge(key: k, value: v, answer_text: v, submitted_at: submitted_at)) }
|
50
50
|
end
|
51
51
|
end
|
52
|
-
end
|
52
|
+
end
|
@@ -1,7 +1,6 @@
|
|
1
1
|
require 'survey_gizmo/api/page'
|
2
2
|
|
3
|
-
module SurveyGizmo
|
4
|
-
# @see SurveyGizmo::Resource::ClassMethods
|
3
|
+
module SurveyGizmo::API
|
5
4
|
class Survey
|
6
5
|
include SurveyGizmo::Resource
|
7
6
|
|
@@ -22,16 +21,15 @@ module SurveyGizmo; module API
|
|
22
21
|
attribute :created_on, DateTime
|
23
22
|
attribute :modified_on, DateTime
|
24
23
|
attribute :copy, Boolean
|
25
|
-
#
|
26
|
-
# types to Survey.all and Survey.first and cause an incorrect reload
|
24
|
+
# See comment in the #pages method for why this :pages can't be an attribute
|
27
25
|
# attribute :pages, Array[Page]
|
28
26
|
|
29
27
|
@route = '/survey'
|
30
28
|
|
31
29
|
def pages
|
32
|
-
# SurveyGizmo sends down the page info to .first requests but NOT to .all requests, so we must load pages
|
33
|
-
# We should be able to just .reload this Survey BUT we can't make :pages a Virtus attribute without
|
34
|
-
# call to this method during Survey.save
|
30
|
+
# SurveyGizmo sends down the page info to .first requests but NOT to .all requests, so we must load pages
|
31
|
+
# manually. We should be able to just .reload this Survey BUT we can't make :pages a Virtus attribute without
|
32
|
+
# requiring a call to this method during Survey.save
|
35
33
|
@pages ||= Page.all(children_params.merge(all_pages: true)).to_a
|
36
34
|
@pages.each { |p| p.attributes = children_params }
|
37
35
|
end
|
@@ -84,4 +82,4 @@ module SurveyGizmo; module API
|
|
84
82
|
@campaigns ||= Campaign.all(children_params.merge(all_pages: true)).to_a
|
85
83
|
end
|
86
84
|
end
|
87
|
-
end
|
85
|
+
end
|
@@ -58,6 +58,7 @@ module SurveyGizmo
|
|
58
58
|
DEFAULT_REST_API_URL = 'https://restapi.surveygizmo.com'
|
59
59
|
DEFAULT_API_VERSION = 'v4'
|
60
60
|
DEFAULT_RESULTS_PER_PAGE = 50
|
61
|
+
DEFAULT_TIMEOUT_SECONDS = 300
|
61
62
|
|
62
63
|
attr_accessor :user
|
63
64
|
attr_accessor :password
|
@@ -67,11 +68,13 @@ module SurveyGizmo
|
|
67
68
|
attr_accessor :api_version
|
68
69
|
attr_accessor :logger
|
69
70
|
attr_accessor :results_per_page
|
71
|
+
attr_accessor :timeout_seconds
|
70
72
|
|
71
73
|
def initialize
|
72
74
|
@api_url = DEFAULT_REST_API_URL
|
73
75
|
@api_version = DEFAULT_API_VERSION
|
74
76
|
@results_per_page = DEFAULT_RESULTS_PER_PAGE
|
77
|
+
@timeout_seconds = DEFAULT_TIMEOUT_SECONDS
|
75
78
|
@logger = SurveyGizmo::Logger.new(STDOUT)
|
76
79
|
@api_debug = ENV['GIZMO_DEBUG'].to_s =~ /^(true|t|yes|y|1)$/i
|
77
80
|
end
|
@@ -2,8 +2,6 @@ require 'active_support/core_ext/module/delegation'
|
|
2
2
|
|
3
3
|
module SurveyGizmo
|
4
4
|
class Connection
|
5
|
-
TIMEOUT_SECONDS = 300
|
6
|
-
|
7
5
|
class << self
|
8
6
|
delegate :put, :get, :delete, :post, to: :connection
|
9
7
|
|
@@ -18,8 +16,8 @@ module SurveyGizmo
|
|
18
16
|
url: SurveyGizmo.configuration.api_url,
|
19
17
|
params: { 'user:md5' => "#{SurveyGizmo.configuration.user}:#{Digest::MD5.hexdigest(SurveyGizmo.configuration.password)}" },
|
20
18
|
request: {
|
21
|
-
timeout:
|
22
|
-
open_timeout:
|
19
|
+
timeout: SurveyGizmo.configuration.timeout_seconds,
|
20
|
+
open_timeout: SurveyGizmo.configuration.timeout_seconds
|
23
21
|
}
|
24
22
|
}
|
25
23
|
|
data/lib/survey_gizmo/version.rb
CHANGED
data/survey-gizmo-ruby.gemspec
CHANGED
@@ -11,15 +11,15 @@ Gem::Specification.new do |gem|
|
|
11
11
|
gem.email = ['adrien.jarthon@dimelo.com']
|
12
12
|
gem.description = 'Gem to use the SurveyGizmo.com REST API, v3+'
|
13
13
|
gem.summary = 'Gem to use the SurveyGizmo.com REST API, v3+'
|
14
|
-
gem.homepage = 'http://github.com/
|
14
|
+
gem.homepage = 'http://github.com/jarthod/survey-gizmo-ruby'
|
15
15
|
gem.licenses = ['MIT']
|
16
16
|
gem.required_ruby_version = '>= 1.9'
|
17
17
|
|
18
18
|
gem.add_dependency 'activesupport', '>= 3.0'
|
19
19
|
gem.add_dependency 'addressable', '~> 2'
|
20
20
|
gem.add_dependency 'awesome_print', '~> 1'
|
21
|
-
gem.add_dependency 'faraday', '~> 0.9'
|
22
|
-
gem.add_dependency 'faraday_middleware'
|
21
|
+
gem.add_dependency 'faraday', '>= 0.9.1', '~> 0.9'
|
22
|
+
gem.add_dependency 'faraday_middleware', '~> 0.10'
|
23
23
|
gem.add_dependency 'i18n'
|
24
24
|
gem.add_dependency 'pester', '>= 1.0.0'
|
25
25
|
gem.add_dependency 'virtus', '>= 1.0.0'
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: survey-gizmo-ruby
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 5.0.
|
4
|
+
version: 5.0.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Kabari Hendrick
|
@@ -11,7 +11,7 @@ authors:
|
|
11
11
|
autorequire:
|
12
12
|
bindir: bin
|
13
13
|
cert_chain: []
|
14
|
-
date: 2016-01-
|
14
|
+
date: 2016-01-26 00:00:00.000000000 Z
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
17
17
|
name: activesupport
|
@@ -59,6 +59,9 @@ dependencies:
|
|
59
59
|
name: faraday
|
60
60
|
requirement: !ruby/object:Gem::Requirement
|
61
61
|
requirements:
|
62
|
+
- - ">="
|
63
|
+
- !ruby/object:Gem::Version
|
64
|
+
version: 0.9.1
|
62
65
|
- - "~>"
|
63
66
|
- !ruby/object:Gem::Version
|
64
67
|
version: '0.9'
|
@@ -66,6 +69,9 @@ dependencies:
|
|
66
69
|
prerelease: false
|
67
70
|
version_requirements: !ruby/object:Gem::Requirement
|
68
71
|
requirements:
|
72
|
+
- - ">="
|
73
|
+
- !ruby/object:Gem::Version
|
74
|
+
version: 0.9.1
|
69
75
|
- - "~>"
|
70
76
|
- !ruby/object:Gem::Version
|
71
77
|
version: '0.9'
|
@@ -73,16 +79,16 @@ dependencies:
|
|
73
79
|
name: faraday_middleware
|
74
80
|
requirement: !ruby/object:Gem::Requirement
|
75
81
|
requirements:
|
76
|
-
- - "
|
82
|
+
- - "~>"
|
77
83
|
- !ruby/object:Gem::Version
|
78
|
-
version: '0'
|
84
|
+
version: '0.10'
|
79
85
|
type: :runtime
|
80
86
|
prerelease: false
|
81
87
|
version_requirements: !ruby/object:Gem::Requirement
|
82
88
|
requirements:
|
83
|
-
- - "
|
89
|
+
- - "~>"
|
84
90
|
- !ruby/object:Gem::Version
|
85
|
-
version: '0'
|
91
|
+
version: '0.10'
|
86
92
|
- !ruby/object:Gem::Dependency
|
87
93
|
name: i18n
|
88
94
|
requirement: !ruby/object:Gem::Requirement
|
@@ -226,7 +232,7 @@ files:
|
|
226
232
|
- spec/test_json/question.json
|
227
233
|
- spec/test_json/survey.json
|
228
234
|
- survey-gizmo-ruby.gemspec
|
229
|
-
homepage: http://github.com/
|
235
|
+
homepage: http://github.com/jarthod/survey-gizmo-ruby
|
230
236
|
licenses:
|
231
237
|
- MIT
|
232
238
|
metadata: {}
|