qualtrics_api 0.0.7 → 0.0.8
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 +4 -4
- data/lib/qualtrics_api.rb +18 -1
- data/lib/qualtrics_api/base_collection.rb +12 -0
- data/lib/qualtrics_api/base_model.rb +2 -1
- data/lib/qualtrics_api/client.rb +13 -8
- data/lib/qualtrics_api/connectable.rb +10 -0
- data/lib/qualtrics_api/panel.rb +1 -1
- data/lib/qualtrics_api/panel_collection.rb +4 -12
- data/lib/qualtrics_api/panel_import.rb +2 -4
- data/lib/qualtrics_api/panel_member_collection.rb +7 -14
- data/lib/qualtrics_api/response_export.rb +2 -4
- data/lib/qualtrics_api/response_export_collection.rb +2 -9
- data/lib/qualtrics_api/services/response_export_service.rb +19 -19
- data/lib/qualtrics_api/survey.rb +1 -1
- data/lib/qualtrics_api/survey_collection.rb +3 -10
- data/lib/qualtrics_api/version.rb +1 -1
- data/spec/lib/client_spec.rb +12 -0
- data/spec/lib/survey_spec.rb +1 -1
- data/spec/qualtrics_api_spec.rb +56 -2
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a61e69c480b7a2b20a2f64d820d0dee7ef906b30
|
4
|
+
data.tar.gz: 96f38df517d7b6b061f0b110cd44c24f94b83a0f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0460ac8586c6f6afcd345a8e7cda73a0e7d8c93fb4f34f12cc0620253aeb07ea18e42109a47ad7f3b2f73e5cdb3a02bcb68cac15042c759d7ab81e2a6f62116f
|
7
|
+
data.tar.gz: 74010e87087b798bf4e80a53a719de558e7b4d707f7ed1aace8fe5da45f341d09f2cc1c70281b85b99fc45f60179a00a26248199e21f54751a2cfca3dbe0b61e
|
data/lib/qualtrics_api.rb
CHANGED
@@ -9,12 +9,14 @@ require "qualtrics_api/url"
|
|
9
9
|
require "qualtrics_api/request_error_handler"
|
10
10
|
|
11
11
|
require "qualtrics_api/configurable"
|
12
|
+
require "qualtrics_api/connectable"
|
12
13
|
require "qualtrics_api/client"
|
13
14
|
|
14
15
|
require "qualtrics_api/extensions/serializable_model"
|
15
16
|
require "qualtrics_api/extensions/serializable_collection"
|
16
17
|
|
17
18
|
require "qualtrics_api/base_model"
|
19
|
+
require "qualtrics_api/base_collection"
|
18
20
|
|
19
21
|
require "qualtrics_api/survey"
|
20
22
|
require "qualtrics_api/survey_collection"
|
@@ -31,6 +33,21 @@ require "qualtrics_api/services/response_export_service"
|
|
31
33
|
module QualtricsAPI
|
32
34
|
class << self
|
33
35
|
include QualtricsAPI::Configurable
|
34
|
-
|
36
|
+
extend Forwardable
|
37
|
+
|
38
|
+
def_delegator :client, :surveys
|
39
|
+
def_delegator :client, :response_exports
|
40
|
+
def_delegator :client, :panels
|
41
|
+
|
42
|
+
def connection(parent = nil)
|
43
|
+
return parent.connection if parent && parent.connection
|
44
|
+
client.connection
|
45
|
+
end
|
46
|
+
|
47
|
+
private
|
48
|
+
|
49
|
+
def client
|
50
|
+
@client ||= QualtricsAPI::Client.new(QualtricsAPI.api_token)
|
51
|
+
end
|
35
52
|
end
|
36
53
|
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
module QualtricsAPI
|
2
|
+
class BaseCollection
|
3
|
+
extend Forwardable
|
4
|
+
include Enumerable
|
5
|
+
include Virtus.value_object
|
6
|
+
include QualtricsAPI::Extensions::SerializableCollection
|
7
|
+
include QualtricsAPI::Connectable
|
8
|
+
|
9
|
+
def_delegator :all, :each
|
10
|
+
def_delegator :all, :size
|
11
|
+
end
|
12
|
+
end
|
@@ -2,8 +2,10 @@ module QualtricsAPI
|
|
2
2
|
class BaseModel
|
3
3
|
include Virtus.value_object
|
4
4
|
include QualtricsAPI::Extensions::SerializableModel
|
5
|
+
include QualtricsAPI::Connectable
|
5
6
|
|
6
7
|
def initialize(options = {})
|
8
|
+
@connection = options[:connection]
|
7
9
|
attributes_mappings.each do |key, qualtrics_key|
|
8
10
|
instance_variable_set "@#{key}", options[qualtrics_key]
|
9
11
|
end
|
@@ -15,6 +17,5 @@ module QualtricsAPI
|
|
15
17
|
def attributes_mappings
|
16
18
|
{}
|
17
19
|
end
|
18
|
-
|
19
20
|
end
|
20
21
|
end
|
data/lib/qualtrics_api/client.rb
CHANGED
@@ -1,23 +1,28 @@
|
|
1
1
|
module QualtricsAPI
|
2
|
-
|
3
|
-
include
|
2
|
+
class Client
|
3
|
+
include QualtricsAPI::Connectable
|
4
|
+
|
5
|
+
def initialize(api_token)
|
6
|
+
@connection = establish_connection(api_token || fail('Please provide api token!'))
|
7
|
+
end
|
4
8
|
|
5
9
|
def surveys(options = {})
|
6
10
|
@surveys = nil if @surveys && @surveys.scope_id != options[:scope_id]
|
7
|
-
@surveys ||= QualtricsAPI::SurveyCollection.new(options)
|
11
|
+
@surveys ||= QualtricsAPI::SurveyCollection.new(options).propagate_connection(self)
|
8
12
|
end
|
9
13
|
|
10
14
|
def response_exports(options = {})
|
11
|
-
@response_exports ||= QualtricsAPI::ResponseExportCollection.new(options)
|
15
|
+
@response_exports ||= QualtricsAPI::ResponseExportCollection.new(options).propagate_connection(self)
|
12
16
|
end
|
13
17
|
|
14
18
|
def panels(options = {})
|
15
|
-
@panels ||= QualtricsAPI::PanelCollection.new(options)
|
19
|
+
@panels ||= QualtricsAPI::PanelCollection.new(options).propagate_connection(self)
|
16
20
|
end
|
17
21
|
|
18
|
-
|
19
|
-
|
20
|
-
|
22
|
+
private
|
23
|
+
|
24
|
+
def establish_connection(api_token)
|
25
|
+
Faraday.new(url: QualtricsAPI::URL, params: { apiToken: api_token }) do |faraday|
|
21
26
|
faraday.request :url_encoded
|
22
27
|
faraday.response :json, :content_type => /\bjson$/
|
23
28
|
|
data/lib/qualtrics_api/panel.rb
CHANGED
@@ -1,20 +1,12 @@
|
|
1
1
|
module QualtricsAPI
|
2
|
-
class PanelCollection
|
3
|
-
extend Forwardable
|
4
|
-
include Enumerable
|
5
|
-
include Virtus.value_object
|
6
|
-
include QualtricsAPI::Extensions::SerializableCollection
|
7
|
-
|
2
|
+
class PanelCollection < BaseCollection
|
8
3
|
values do
|
9
4
|
attribute :all, Array, :default => []
|
10
5
|
end
|
11
6
|
|
12
|
-
def_delegator :all, :each
|
13
|
-
def_delegator :all, :size
|
14
|
-
|
15
7
|
def fetch(_options = {})
|
16
8
|
@all = []
|
17
|
-
parse_fetch_response(QualtricsAPI.connection.get('panels'))
|
9
|
+
parse_fetch_response(QualtricsAPI.connection(self).get('panels'))
|
18
10
|
self
|
19
11
|
end
|
20
12
|
|
@@ -25,14 +17,14 @@ module QualtricsAPI
|
|
25
17
|
def find(panel_id)
|
26
18
|
@all.detect do |panel|
|
27
19
|
panel.id == panel_id
|
28
|
-
end || QualtricsAPI::Panel.new("panelId" => panel_id)
|
20
|
+
end || QualtricsAPI::Panel.new("panelId" => panel_id).propagate_connection(self)
|
29
21
|
end
|
30
22
|
|
31
23
|
private
|
32
24
|
|
33
25
|
def parse_fetch_response(response)
|
34
26
|
@all = response.body["result"].map do |result|
|
35
|
-
QualtricsAPI::Panel.new(result)
|
27
|
+
QualtricsAPI::Panel.new(result).propagate_connection(self)
|
36
28
|
end
|
37
29
|
end
|
38
30
|
end
|
@@ -1,14 +1,12 @@
|
|
1
1
|
module QualtricsAPI
|
2
|
-
class PanelImport
|
3
|
-
include Virtus.value_object
|
4
|
-
|
2
|
+
class PanelImport < BaseModel
|
5
3
|
values do
|
6
4
|
attribute :id, String
|
7
5
|
attribute :panel_id, String
|
8
6
|
end
|
9
7
|
|
10
8
|
def update_status
|
11
|
-
res = QualtricsAPI.connection.get("panels/#{panel_id}/members/panelImports/#{id}").body["result"]
|
9
|
+
res = QualtricsAPI.connection(self).get("panels/#{panel_id}/members/panelImports/#{id}").body["result"]
|
12
10
|
@import_progress = res["percentComplete"]
|
13
11
|
@completed = true if @import_progress == 100.0
|
14
12
|
self
|
@@ -1,29 +1,22 @@
|
|
1
1
|
module QualtricsAPI
|
2
|
-
class PanelMemberCollection
|
3
|
-
extend Forwardable
|
4
|
-
include Enumerable
|
5
|
-
include Virtus.value_object
|
6
|
-
|
2
|
+
class PanelMemberCollection < BaseCollection
|
7
3
|
values do
|
8
4
|
attribute :id, String
|
9
5
|
attribute :all, Array, :default => []
|
10
6
|
end
|
11
7
|
|
12
|
-
def_delegator :all, :each
|
13
|
-
def_delegator :all, :size
|
14
|
-
|
15
8
|
def fetch(_options = {})
|
16
9
|
@all = []
|
17
|
-
parse_fetch_response(QualtricsAPI.connection.get("panels/#{id}/members"))
|
10
|
+
parse_fetch_response(QualtricsAPI.connection(self).get("panels/#{id}/members"))
|
18
11
|
self
|
19
12
|
end
|
20
13
|
|
21
14
|
def create(panel_members)
|
22
|
-
res = QualtricsAPI.connection
|
23
|
-
.post("panels/#{id}/members", QualtricsAPI.connection.params.merge(panelMembers: panel_members.to_json))
|
15
|
+
res = QualtricsAPI.connection(self)
|
16
|
+
.post("panels/#{id}/members", QualtricsAPI.connection(self).params.merge(panelMembers: panel_members.to_json))
|
24
17
|
.body["result"]
|
25
18
|
import_id = res['importStatus'].split('/').last
|
26
|
-
QualtricsAPI::PanelImport.new(id: import_id, panel_id: id)
|
19
|
+
QualtricsAPI::PanelImport.new(id: import_id, panel_id: id).propagate_connection(self)
|
27
20
|
end
|
28
21
|
|
29
22
|
def [](member_id)
|
@@ -33,14 +26,14 @@ module QualtricsAPI
|
|
33
26
|
def find(member_id)
|
34
27
|
@all.detect do |panel_member|
|
35
28
|
panel_member.id == member_id
|
36
|
-
end || QualtricsAPI::PanelMember.new(:id => member_id)
|
29
|
+
end || QualtricsAPI::PanelMember.new(:id => member_id).propagate_connection(self)
|
37
30
|
end
|
38
31
|
|
39
32
|
private
|
40
33
|
|
41
34
|
def parse_fetch_response(response)
|
42
35
|
@all = response.body["result"].map do |result|
|
43
|
-
QualtricsAPI::PanelMember.new(result)
|
36
|
+
QualtricsAPI::PanelMember.new(result).propagate_connection(self)
|
44
37
|
end
|
45
38
|
end
|
46
39
|
end
|
@@ -1,13 +1,11 @@
|
|
1
1
|
module QualtricsAPI
|
2
|
-
class ResponseExport
|
3
|
-
include Virtus.value_object
|
4
|
-
|
2
|
+
class ResponseExport < BaseModel
|
5
3
|
values do
|
6
4
|
attribute :id, String
|
7
5
|
end
|
8
6
|
|
9
7
|
def update_status
|
10
|
-
res = QualtricsAPI.connection.get('surveys/responseExports/' + id).body["result"]
|
8
|
+
res = QualtricsAPI.connection(self).get('surveys/responseExports/' + id).body["result"]
|
11
9
|
@export_progress = res["percentComplete"]
|
12
10
|
@file_url = res["fileUrl"]
|
13
11
|
@completed = true if @export_progress == 100.0
|
@@ -1,16 +1,9 @@
|
|
1
1
|
module QualtricsAPI
|
2
|
-
class ResponseExportCollection
|
3
|
-
extend Forwardable
|
4
|
-
include Enumerable
|
5
|
-
include Virtus.value_object
|
6
|
-
|
2
|
+
class ResponseExportCollection < BaseCollection
|
7
3
|
values do
|
8
4
|
attribute :all, Array, :default => []
|
9
5
|
end
|
10
6
|
|
11
|
-
def_delegator :all, :each
|
12
|
-
def_delegator :all, :size
|
13
|
-
|
14
7
|
def [](export_id)
|
15
8
|
find(export_id)
|
16
9
|
end
|
@@ -18,7 +11,7 @@ module QualtricsAPI
|
|
18
11
|
def find(export_id)
|
19
12
|
@all.detect do |response_export|
|
20
13
|
response_export.id == export_id
|
21
|
-
end || QualtricsAPI::ResponseExport.new(:id => export_id)
|
14
|
+
end || QualtricsAPI::ResponseExport.new(:id => export_id).propagate_connection(self)
|
22
15
|
end
|
23
16
|
end
|
24
17
|
end
|
@@ -1,28 +1,28 @@
|
|
1
1
|
module QualtricsAPI
|
2
2
|
module Services
|
3
|
-
class ResponseExportService
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
3
|
+
class ResponseExportService < QualtricsAPI::BaseModel
|
4
|
+
values do
|
5
|
+
attribute :survey_id, String
|
6
|
+
attribute :response_set_id, String
|
7
|
+
attribute :file_type, String, :default => 'CSV'
|
8
|
+
attribute :last_response_id, String
|
9
|
+
attribute :start_date, String
|
10
|
+
attribute :end_date, String
|
11
|
+
attribute :limit, String
|
12
|
+
attribute :included_question_ids, String
|
13
|
+
attribute :max_rows, String
|
14
|
+
attribute :use_labels, Boolean, :default => false
|
15
|
+
attribute :decimal_format, String, :default => '.'
|
16
|
+
attribute :seen_unanswered_recode, String
|
17
|
+
attribute :use_local_time, Boolean, :default => false
|
18
|
+
attribute :spss_string_length, String
|
19
|
+
attribute :id, String
|
20
|
+
end
|
21
21
|
|
22
22
|
attr_reader :result
|
23
23
|
|
24
24
|
def start
|
25
|
-
response = QualtricsAPI.connection.get("surveys/#{survey_id}/responseExports", export_params)
|
25
|
+
response = QualtricsAPI.connection(self).get("surveys/#{survey_id}/responseExports", export_params)
|
26
26
|
export_id = response.body["result"]["exportStatus"].split('/').last
|
27
27
|
@result = ResponseExport.new(id: export_id)
|
28
28
|
end
|
data/lib/qualtrics_api/survey.rb
CHANGED
@@ -10,7 +10,7 @@ module QualtricsAPI
|
|
10
10
|
end
|
11
11
|
|
12
12
|
def export_responses(export_options = {})
|
13
|
-
QualtricsAPI::Services::ResponseExportService.new(export_options.merge(survey_id: id))
|
13
|
+
QualtricsAPI::Services::ResponseExportService.new(export_options.merge(survey_id: id)).propagate_connection(self)
|
14
14
|
end
|
15
15
|
|
16
16
|
private
|
@@ -1,9 +1,5 @@
|
|
1
1
|
module QualtricsAPI
|
2
|
-
class SurveyCollection
|
3
|
-
extend Forwardable
|
4
|
-
include Enumerable
|
5
|
-
include Virtus.value_object
|
6
|
-
|
2
|
+
class SurveyCollection < BaseCollection
|
7
3
|
values do
|
8
4
|
attribute :scope_id, String
|
9
5
|
attribute :all, Array, :default => []
|
@@ -11,13 +7,10 @@ module QualtricsAPI
|
|
11
7
|
|
12
8
|
attr_writer :scope_id
|
13
9
|
|
14
|
-
def_delegator :all, :each
|
15
|
-
def_delegator :all, :size
|
16
|
-
|
17
10
|
def fetch(options = {})
|
18
11
|
@all = []
|
19
12
|
update_query_attributes(options)
|
20
|
-
parse_fetch_response(QualtricsAPI.connection.get('surveys', query_params))
|
13
|
+
parse_fetch_response(QualtricsAPI.connection(self).get('surveys', query_params))
|
21
14
|
self
|
22
15
|
end
|
23
16
|
|
@@ -57,7 +50,7 @@ module QualtricsAPI
|
|
57
50
|
|
58
51
|
def parse_fetch_response(response)
|
59
52
|
@all = response.body["result"].map do |result|
|
60
|
-
QualtricsAPI::Survey.new
|
53
|
+
QualtricsAPI::Survey.new(result).propagate_connection(self)
|
61
54
|
end
|
62
55
|
end
|
63
56
|
end
|
data/spec/lib/client_spec.rb
CHANGED
@@ -26,4 +26,16 @@ describe QualtricsAPI::Client do
|
|
26
26
|
expect(subject.surveys.object_id).to eq subject.surveys.object_id
|
27
27
|
end
|
28
28
|
end
|
29
|
+
|
30
|
+
describe "#initialize" do
|
31
|
+
subject { QualtricsAPI::Client }
|
32
|
+
|
33
|
+
it "fails if api_token not provided" do
|
34
|
+
expect { subject.new(nil) }.to raise_error('Please provide api token!')
|
35
|
+
end
|
36
|
+
|
37
|
+
it 'establishes connection when api_token' do
|
38
|
+
subject.new('sample_token')
|
39
|
+
end
|
40
|
+
end
|
29
41
|
end
|
data/spec/lib/survey_spec.rb
CHANGED
@@ -47,7 +47,7 @@ describe QualtricsAPI::Survey do
|
|
47
47
|
|
48
48
|
it "inits a ResponseExportService with options" do
|
49
49
|
expect(QualtricsAPI::Services::ResponseExportService).to receive(:new).with(start_date: options[:start_date],
|
50
|
-
survey_id: subject.id)
|
50
|
+
survey_id: subject.id).and_return(QualtricsAPI::Services::ResponseExportService.new)
|
51
51
|
|
52
52
|
subject.export_responses(options)
|
53
53
|
end
|
data/spec/qualtrics_api_spec.rb
CHANGED
@@ -4,8 +4,62 @@ describe QualtricsAPI do
|
|
4
4
|
describe "#new" do
|
5
5
|
subject { QualtricsAPI }
|
6
6
|
|
7
|
-
it
|
8
|
-
|
7
|
+
it 'two clients have different connection' do
|
8
|
+
client_1 = QualtricsAPI::Client.new('some_id')
|
9
|
+
client_2 = QualtricsAPI::Client.new('other_id')
|
10
|
+
expect(client_1.connection).not_to eq(client_2.connection)
|
11
|
+
end
|
12
|
+
|
13
|
+
it 'reuses connection if globally configured' do
|
14
|
+
expect(QualtricsAPI.connection).to eq(QualtricsAPI.connection)
|
15
|
+
end
|
16
|
+
|
17
|
+
it 'does not reuse connection with client' do
|
18
|
+
client = QualtricsAPI::Client.new('some_id')
|
19
|
+
expect(client.connection).not_to eq(QualtricsAPI.connection)
|
20
|
+
end
|
21
|
+
|
22
|
+
context 'chains' do
|
23
|
+
it 'does propagate default connection' do
|
24
|
+
members = VCR.use_cassette('panel_member_collection_create_success') do
|
25
|
+
QualtricsAPI.panels.fetch['ML_bC2c5xBz1DxyOYB'].members
|
26
|
+
end
|
27
|
+
expect(members.connection).to eq(QualtricsAPI.connection)
|
28
|
+
end
|
29
|
+
|
30
|
+
context 'with client' do
|
31
|
+
let(:client) { QualtricsAPI::Client.new(TEST_API_TOKEN) }
|
32
|
+
let(:members) do
|
33
|
+
VCR.use_cassette('panel_member_collection_create_success') do
|
34
|
+
client.panels.fetch['ML_bC2c5xBz1DxyOYB'].members
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
it 'has client connection' do
|
39
|
+
expect(client.connection).not_to be_nil
|
40
|
+
end
|
41
|
+
|
42
|
+
it 'has propagated exception to members' do
|
43
|
+
expect(members.connection).to eq(client.connection)
|
44
|
+
end
|
45
|
+
|
46
|
+
context 'with different client' do
|
47
|
+
let(:client_2) { QualtricsAPI::Client.new(TEST_API_TOKEN) }
|
48
|
+
let(:members_2) do
|
49
|
+
VCR.use_cassette('panel_member_collection_create_success') do
|
50
|
+
client_2.panels.fetch['ML_bC2c5xBz1DxyOYB'].members
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
it 'has propagated exception to members' do
|
55
|
+
expect(members_2.connection).to eq(client_2.connection)
|
56
|
+
end
|
57
|
+
|
58
|
+
it 'does not conflict with different client' do
|
59
|
+
expect(client_2.connection).not_to eq(client.connection)
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
9
63
|
end
|
10
64
|
end
|
11
65
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: qualtrics_api
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.8
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Yurui Zhang
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2015-08-
|
13
|
+
date: 2015-08-19 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: faraday
|
@@ -170,9 +170,11 @@ files:
|
|
170
170
|
- fixtures/vcr_cassettes/survey_collection_fetch_sucess.yml
|
171
171
|
- fixtures/vcr_cassettes/survey_collection_fetch_with_scopeId_success.yml
|
172
172
|
- lib/qualtrics_api.rb
|
173
|
+
- lib/qualtrics_api/base_collection.rb
|
173
174
|
- lib/qualtrics_api/base_model.rb
|
174
175
|
- lib/qualtrics_api/client.rb
|
175
176
|
- lib/qualtrics_api/configurable.rb
|
177
|
+
- lib/qualtrics_api/connectable.rb
|
176
178
|
- lib/qualtrics_api/extensions/serializable_collection.rb
|
177
179
|
- lib/qualtrics_api/extensions/serializable_model.rb
|
178
180
|
- lib/qualtrics_api/panel.rb
|