qualtrics_api 0.0.12 → 0.0.13
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/.travis.yml +2 -2
- data/README.md +4 -0
- data/fixtures/vcr_cassettes/event_subscription_create.yml +81 -0
- data/fixtures/vcr_cassettes/event_subscription_create_partial_response_sub.yml +81 -0
- data/fixtures/vcr_cassettes/event_subscription_create_response_sub.yml +81 -0
- data/fixtures/vcr_cassettes/event_subscription_delete.yml +114 -0
- data/fixtures/vcr_cassettes/event_subscription_delete_all.yml +116 -0
- data/fixtures/vcr_cassettes/event_subscription_delete_one.yml +76 -0
- data/fixtures/vcr_cassettes/event_subscription_find.yml +41 -0
- data/fixtures/vcr_cassettes/event_subscription_find_fail.yml +39 -0
- data/lib/qualtrics_api.rb +8 -3
- data/lib/qualtrics_api/base_collection.rb +14 -0
- data/lib/qualtrics_api/client.rb +8 -4
- data/lib/qualtrics_api/configurable.rb +5 -0
- data/lib/qualtrics_api/event_subscription.rb +35 -0
- data/lib/qualtrics_api/event_subscription_collection.rb +48 -0
- data/lib/qualtrics_api/request_error_handler.rb +25 -8
- data/lib/qualtrics_api/version.rb +1 -1
- data/qualtrics_api.gemspec +7 -7
- data/spec/lib/client_spec.rb +10 -3
- data/spec/lib/event_subscription_collection_spec.rb +89 -0
- data/spec/lib/event_subscription_spec.rb +53 -0
- data/spec/qualtrics_api_spec.rb +5 -5
- metadata +30 -17
- data/lib/qualtrics_api/url.rb +0 -3
@@ -0,0 +1,76 @@
|
|
1
|
+
---
|
2
|
+
http_interactions:
|
3
|
+
- request:
|
4
|
+
method: delete
|
5
|
+
uri: https://co1.qualtrics.com/API/v3/eventsubscriptions/SUB_5pPHcNfCaiADoFf
|
6
|
+
body:
|
7
|
+
encoding: US-ASCII
|
8
|
+
string: ''
|
9
|
+
headers:
|
10
|
+
X-API-TOKEN:
|
11
|
+
- 6Wpo0Vsx1cN1kcHivCaGTz5IhOvchLrg1o4L0KOZ
|
12
|
+
User-Agent:
|
13
|
+
- Faraday v0.9.2
|
14
|
+
response:
|
15
|
+
status:
|
16
|
+
code: 200
|
17
|
+
message:
|
18
|
+
headers:
|
19
|
+
request-time:
|
20
|
+
- '325'
|
21
|
+
content-type:
|
22
|
+
- application/json
|
23
|
+
content-length:
|
24
|
+
- '85'
|
25
|
+
x-edgeconnect-midmile-rtt:
|
26
|
+
- '13'
|
27
|
+
x-edgeconnect-origin-mex-latency:
|
28
|
+
- '399'
|
29
|
+
date:
|
30
|
+
- Mon, 04 Dec 2017 22:33:13 GMT
|
31
|
+
connection:
|
32
|
+
- close
|
33
|
+
strict-transport-security:
|
34
|
+
- max-age=31536000; includeSubDomains; preload
|
35
|
+
body:
|
36
|
+
encoding: UTF-8
|
37
|
+
string: '{"meta":{"httpStatus":"200 - OK","requestId":"fa58c44f-f1a4-41ba-9c7b-3db9547407d7"}}'
|
38
|
+
http_version:
|
39
|
+
recorded_at: Mon, 04 Dec 2017 22:33:13 GMT
|
40
|
+
- request:
|
41
|
+
method: get
|
42
|
+
uri: https://co1.qualtrics.com/API/v3/eventsubscriptions/SUB_5pPHcNfCaiADoFf
|
43
|
+
body:
|
44
|
+
encoding: US-ASCII
|
45
|
+
string: ''
|
46
|
+
headers:
|
47
|
+
X-API-TOKEN:
|
48
|
+
- 6Wpo0Vsx1cN1kcHivCaGTz5IhOvchLrg1o4L0KOZ
|
49
|
+
User-Agent:
|
50
|
+
- Faraday v0.9.2
|
51
|
+
response:
|
52
|
+
status:
|
53
|
+
code: 404
|
54
|
+
message:
|
55
|
+
headers:
|
56
|
+
content-type:
|
57
|
+
- application/json
|
58
|
+
content-length:
|
59
|
+
- '136'
|
60
|
+
x-edgeconnect-midmile-rtt:
|
61
|
+
- '18'
|
62
|
+
x-edgeconnect-origin-mex-latency:
|
63
|
+
- '317'
|
64
|
+
date:
|
65
|
+
- Mon, 04 Dec 2017 22:33:13 GMT
|
66
|
+
connection:
|
67
|
+
- close
|
68
|
+
strict-transport-security:
|
69
|
+
- max-age=31536000; includeSubDomains; preload
|
70
|
+
body:
|
71
|
+
encoding: UTF-8
|
72
|
+
string: '{"meta":{"httpStatus":"404 - Not Found","error":{"errorMessage":"SUB_5pPHcNfCaiADoFf
|
73
|
+
not found","errorCode":"ESSG_2"},"requestId":null}}'
|
74
|
+
http_version:
|
75
|
+
recorded_at: Mon, 04 Dec 2017 22:33:13 GMT
|
76
|
+
recorded_with: VCR 2.9.3
|
@@ -0,0 +1,41 @@
|
|
1
|
+
---
|
2
|
+
http_interactions:
|
3
|
+
- request:
|
4
|
+
method: get
|
5
|
+
uri: https://co1.qualtrics.com/API/v3/eventsubscriptions/SUB_6XMPw9UoySyGNyl
|
6
|
+
body:
|
7
|
+
encoding: US-ASCII
|
8
|
+
string: ''
|
9
|
+
headers:
|
10
|
+
X-API-TOKEN:
|
11
|
+
- 6Wpo0Vsx1cN1kcHivCaGTz5IhOvchLrg1o4L0KOZ
|
12
|
+
User-Agent:
|
13
|
+
- Faraday v0.9.2
|
14
|
+
response:
|
15
|
+
status:
|
16
|
+
code: 200
|
17
|
+
message:
|
18
|
+
headers:
|
19
|
+
request-time:
|
20
|
+
- '454'
|
21
|
+
content-type:
|
22
|
+
- application/json
|
23
|
+
content-length:
|
24
|
+
- '274'
|
25
|
+
x-edgeconnect-midmile-rtt:
|
26
|
+
- '22'
|
27
|
+
x-edgeconnect-origin-mex-latency:
|
28
|
+
- '504'
|
29
|
+
date:
|
30
|
+
- Mon, 04 Dec 2017 21:22:04 GMT
|
31
|
+
connection:
|
32
|
+
- close
|
33
|
+
strict-transport-security:
|
34
|
+
- max-age=31536000; includeSubDomains; preload
|
35
|
+
body:
|
36
|
+
encoding: UTF-8
|
37
|
+
string: '{"result":{"id":"SUB_6XMPw9UoySyGNyl","scope":"cambridgetripod","topics":"controlpanel.activateSurvey","publicationUrl":"https://requestb.in/1mnrk0m1","encrypted":false,"successfulCalls":0},"meta":{"httpStatus":"200
|
38
|
+
- OK","requestId":"9ce297f0-0e9b-49fa-9710-ef53cde43b90"}}'
|
39
|
+
http_version:
|
40
|
+
recorded_at: Mon, 04 Dec 2017 21:22:04 GMT
|
41
|
+
recorded_with: VCR 2.9.3
|
@@ -0,0 +1,39 @@
|
|
1
|
+
---
|
2
|
+
http_interactions:
|
3
|
+
- request:
|
4
|
+
method: get
|
5
|
+
uri: https://co1.qualtrics.com/API/v3/eventsubscriptions/pewpewpewpew
|
6
|
+
body:
|
7
|
+
encoding: US-ASCII
|
8
|
+
string: ''
|
9
|
+
headers:
|
10
|
+
X-API-TOKEN:
|
11
|
+
- 6Wpo0Vsx1cN1kcHivCaGTz5IhOvchLrg1o4L0KOZ
|
12
|
+
User-Agent:
|
13
|
+
- Faraday v0.9.2
|
14
|
+
response:
|
15
|
+
status:
|
16
|
+
code: 404
|
17
|
+
message:
|
18
|
+
headers:
|
19
|
+
content-type:
|
20
|
+
- application/json
|
21
|
+
content-length:
|
22
|
+
- '129'
|
23
|
+
x-edgeconnect-midmile-rtt:
|
24
|
+
- '23'
|
25
|
+
x-edgeconnect-origin-mex-latency:
|
26
|
+
- '397'
|
27
|
+
date:
|
28
|
+
- Mon, 04 Dec 2017 21:24:24 GMT
|
29
|
+
connection:
|
30
|
+
- close
|
31
|
+
strict-transport-security:
|
32
|
+
- max-age=31536000; includeSubDomains; preload
|
33
|
+
body:
|
34
|
+
encoding: UTF-8
|
35
|
+
string: '{"meta":{"httpStatus":"404 - Not Found","error":{"errorMessage":"pewpewpewpew
|
36
|
+
not found","errorCode":"ESSG_2"},"requestId":null}}'
|
37
|
+
http_version:
|
38
|
+
recorded_at: Mon, 04 Dec 2017 21:24:24 GMT
|
39
|
+
recorded_with: VCR 2.9.3
|
data/lib/qualtrics_api.rb
CHANGED
@@ -4,8 +4,6 @@ require "faraday"
|
|
4
4
|
require "faraday_middleware"
|
5
5
|
|
6
6
|
require "qualtrics_api/version"
|
7
|
-
require "qualtrics_api/url"
|
8
|
-
|
9
7
|
require "qualtrics_api/request_error_handler"
|
10
8
|
|
11
9
|
require "qualtrics_api/configurable"
|
@@ -27,6 +25,8 @@ require "qualtrics_api/panel_collection"
|
|
27
25
|
require "qualtrics_api/panel_member"
|
28
26
|
require "qualtrics_api/panel_member_collection"
|
29
27
|
require "qualtrics_api/panel_import"
|
28
|
+
require "qualtrics_api/event_subscription"
|
29
|
+
require "qualtrics_api/event_subscription_collection"
|
30
30
|
|
31
31
|
require "qualtrics_api/services/response_export_service"
|
32
32
|
|
@@ -38,16 +38,21 @@ module QualtricsAPI
|
|
38
38
|
def_delegator :client, :surveys
|
39
39
|
def_delegator :client, :response_exports
|
40
40
|
def_delegator :client, :panels
|
41
|
+
def_delegator :client, :event_subscriptions
|
41
42
|
|
42
43
|
def connection(parent = nil)
|
43
44
|
return parent.connection if parent && parent.connection
|
44
45
|
client.connection
|
45
46
|
end
|
46
47
|
|
48
|
+
def url(data_center_id = self.data_center_id)
|
49
|
+
"https://#{data_center_id}.qualtrics.com:443/API/v3/"
|
50
|
+
end
|
51
|
+
|
47
52
|
private
|
48
53
|
|
49
54
|
def client
|
50
|
-
@client ||= QualtricsAPI::Client.new(QualtricsAPI.api_token)
|
55
|
+
@client ||= QualtricsAPI::Client.new(QualtricsAPI.api_token, QualtricsAPI.data_center_id)
|
51
56
|
end
|
52
57
|
end
|
53
58
|
end
|
@@ -14,6 +14,20 @@ module QualtricsAPI
|
|
14
14
|
end
|
15
15
|
end
|
16
16
|
|
17
|
+
def map
|
18
|
+
res = []
|
19
|
+
each_page do |page|
|
20
|
+
page.each do |element|
|
21
|
+
res.push(yield element)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
res
|
25
|
+
end
|
26
|
+
|
27
|
+
def all
|
28
|
+
map {|element| element}
|
29
|
+
end
|
30
|
+
|
17
31
|
def each_page
|
18
32
|
endpoint = list_endpoint
|
19
33
|
loop do
|
data/lib/qualtrics_api/client.rb
CHANGED
@@ -2,8 +2,8 @@ module QualtricsAPI
|
|
2
2
|
class Client
|
3
3
|
include QualtricsAPI::Connectable
|
4
4
|
|
5
|
-
def initialize(api_token)
|
6
|
-
@connection = establish_connection(api_token || fail('Please provide api token!'))
|
5
|
+
def initialize(api_token, data_center_id)
|
6
|
+
@connection = establish_connection(api_token || fail('Please provide api token!'), data_center_id)
|
7
7
|
end
|
8
8
|
|
9
9
|
def surveys(options = {})
|
@@ -18,10 +18,14 @@ module QualtricsAPI
|
|
18
18
|
QualtricsAPI::PanelCollection.new(options).propagate_connection(self)
|
19
19
|
end
|
20
20
|
|
21
|
+
def event_subscriptions(options = {})
|
22
|
+
QualtricsAPI::EventSubscriptionCollection.new(options).propagate_connection(self)
|
23
|
+
end
|
24
|
+
|
21
25
|
private
|
22
26
|
|
23
|
-
def establish_connection(api_token)
|
24
|
-
Faraday.new(url: QualtricsAPI
|
27
|
+
def establish_connection(api_token, data_center_id)
|
28
|
+
Faraday.new(url: QualtricsAPI.url(data_center_id), headers: { 'X-API-TOKEN' => api_token }) do |faraday|
|
25
29
|
faraday.request :multipart
|
26
30
|
faraday.request :json
|
27
31
|
faraday.response :json, :content_type => /\bjson$/
|
@@ -0,0 +1,35 @@
|
|
1
|
+
module QualtricsAPI
|
2
|
+
class EventSubscription < BaseModel
|
3
|
+
values do
|
4
|
+
attribute :id, String
|
5
|
+
attribute :scope, String
|
6
|
+
attribute :topics, String
|
7
|
+
attribute :publication_url, String
|
8
|
+
attribute :encrypted, Boolean, default: false
|
9
|
+
attribute :successful_calls, Integer, default: 0
|
10
|
+
end
|
11
|
+
|
12
|
+
def delete
|
13
|
+
QualtricsAPI.connection(self)
|
14
|
+
.delete(endpoint)
|
15
|
+
.body["result"]
|
16
|
+
end
|
17
|
+
|
18
|
+
private
|
19
|
+
|
20
|
+
def endpoint
|
21
|
+
"eventsubscriptions/#{id}"
|
22
|
+
end
|
23
|
+
|
24
|
+
def attributes_mappings
|
25
|
+
{
|
26
|
+
id: "id",
|
27
|
+
scope: "scope",
|
28
|
+
topics: "topics",
|
29
|
+
publication_url: "publicationUrl",
|
30
|
+
encrypted: "encrypted",
|
31
|
+
successful_calls: "successfulCalls"
|
32
|
+
}
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
module QualtricsAPI
|
2
|
+
class EventSubscriptionCollection < BaseCollection
|
3
|
+
alias_method :[], :find
|
4
|
+
|
5
|
+
def create(publication_url, topics, opts = { encrypt: false })
|
6
|
+
payload = {
|
7
|
+
publicationUrl: publication_url,
|
8
|
+
topics: topics
|
9
|
+
}.merge(opts)
|
10
|
+
res = QualtricsAPI.connection(self)
|
11
|
+
.post(list_endpoint, payload)
|
12
|
+
.body["result"]
|
13
|
+
find(res["id"])
|
14
|
+
end
|
15
|
+
|
16
|
+
def create_completed_response_subscription(url, survey_id, opts = { encrypt: false })
|
17
|
+
create(url, "surveyengine.completedResponse.#{survey_id}", opts)
|
18
|
+
end
|
19
|
+
|
20
|
+
def create_partial_response_subscription(url, survey_id, opts = { encrypt: false })
|
21
|
+
create(url, "surveyengine.partialResponse.#{survey_id}", opts)
|
22
|
+
end
|
23
|
+
|
24
|
+
def delete(id)
|
25
|
+
QualtricsAPI.connection(self)
|
26
|
+
.delete(endpoint(id))
|
27
|
+
end
|
28
|
+
|
29
|
+
def delete_all
|
30
|
+
QualtricsAPI.connection(self)
|
31
|
+
.delete(list_endpoint)
|
32
|
+
end
|
33
|
+
|
34
|
+
private
|
35
|
+
|
36
|
+
def build_result(element)
|
37
|
+
QualtricsAPI::EventSubscription.new(element)
|
38
|
+
end
|
39
|
+
|
40
|
+
def list_endpoint
|
41
|
+
"eventsubscriptions"
|
42
|
+
end
|
43
|
+
|
44
|
+
def endpoint(id)
|
45
|
+
"eventsubscriptions/#{id}"
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -1,27 +1,44 @@
|
|
1
|
+
require 'logger'
|
2
|
+
|
1
3
|
module QualtricsAPI
|
2
4
|
class RequestErrorHandler < Faraday::Response::Middleware
|
3
5
|
def on_complete(env)
|
4
|
-
|
6
|
+
raise_http_errors(env[:status], env[:body])
|
7
|
+
show_notices(env[:body])
|
8
|
+
end
|
9
|
+
|
10
|
+
private
|
11
|
+
|
12
|
+
def raise_http_errors(code, body)
|
13
|
+
case code
|
5
14
|
when 404
|
6
15
|
raise NotFoundError, "Not Found"
|
7
16
|
when 400
|
8
|
-
raise BadRequestError, error_message(JSON.parse(
|
17
|
+
raise BadRequestError, error_message(JSON.parse(body))
|
9
18
|
when 401
|
10
|
-
raise UnauthorizedError, error_message(JSON.parse(
|
19
|
+
raise UnauthorizedError, error_message(JSON.parse(body))
|
11
20
|
when 500
|
12
|
-
raise InternalServerError, error_message(JSON.parse(
|
21
|
+
raise InternalServerError, error_message(JSON.parse(body))
|
13
22
|
end
|
14
23
|
end
|
15
24
|
|
16
|
-
|
25
|
+
def show_notices(body)
|
26
|
+
response = JSON.parse(body)
|
27
|
+
notice = response["meta"]["notice"]
|
28
|
+
if notice && notice.size > 0
|
29
|
+
STDERR.puts notice
|
30
|
+
end
|
31
|
+
end
|
17
32
|
|
18
33
|
def error_message(response)
|
19
34
|
meta = response["meta"]
|
35
|
+
err = meta["error"] || {}
|
20
36
|
["[",
|
21
|
-
|
22
|
-
|
37
|
+
meta["status"] || meta["httpStatus"],
|
38
|
+
" - ",
|
39
|
+
err["qualtricsErrorCode"] || err["internalErrorCode"] || err["errorCode"],
|
23
40
|
"] ",
|
24
|
-
|
41
|
+
err["errorMessage"]
|
25
42
|
].join
|
26
43
|
end
|
27
44
|
end
|
data/qualtrics_api.gemspec
CHANGED
@@ -20,14 +20,14 @@ Gem::Specification.new do |spec|
|
|
20
20
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
21
21
|
spec.require_paths = ["lib"]
|
22
22
|
|
23
|
-
spec.required_ruby_version = '>= 2.
|
23
|
+
spec.required_ruby_version = '>= 2.3.0'
|
24
24
|
|
25
|
-
spec.add_dependency "faraday", "~> 0.
|
26
|
-
spec.add_dependency "faraday_middleware", "~> 0.
|
25
|
+
spec.add_dependency "faraday", "~> 0.13.1"
|
26
|
+
spec.add_dependency "faraday_middleware", "~> 0.12.2"
|
27
27
|
spec.add_dependency "virtus", "~> 1.0"
|
28
28
|
|
29
|
-
spec.add_development_dependency "bundler", "~> 1.
|
30
|
-
spec.add_development_dependency "rake", "~>
|
31
|
-
spec.add_development_dependency "rspec", "~> 3.
|
32
|
-
spec.add_development_dependency "vcr", "~>
|
29
|
+
spec.add_development_dependency "bundler", "~> 1.16"
|
30
|
+
spec.add_development_dependency "rake", "~> 12.3"
|
31
|
+
spec.add_development_dependency "rspec", "~> 3.7"
|
32
|
+
spec.add_development_dependency "vcr", "~> 3.0"
|
33
33
|
end
|
data/spec/lib/client_spec.rb
CHANGED
@@ -19,11 +19,18 @@ describe QualtricsAPI::Client do
|
|
19
19
|
subject { QualtricsAPI::Client }
|
20
20
|
|
21
21
|
it "fails if api_token not provided" do
|
22
|
-
expect { subject.new(nil) }.to raise_error('Please provide api token!')
|
22
|
+
expect { subject.new(nil, nil) }.to raise_error('Please provide api token!')
|
23
23
|
end
|
24
24
|
|
25
|
-
it 'establishes connection when api_token' do
|
26
|
-
subject.new('sample_token')
|
25
|
+
it 'establishes connection when api_token is provided' do
|
26
|
+
client = subject.new('sample_token', 'co1')
|
27
|
+
expect(client.connection).not_to be_nil
|
28
|
+
expect(client.connection.headers["X-API-TOKEN"]).to eq('sample_token')
|
29
|
+
end
|
30
|
+
|
31
|
+
it 'establishes connection to the specified data center' do
|
32
|
+
client = subject.new('sample_token', 'somedcid')
|
33
|
+
expect(client.connection.url_prefix.to_s).to eq('https://somedcid.qualtrics.com/API/v3/')
|
27
34
|
end
|
28
35
|
end
|
29
36
|
end
|