qualtrics_api 0.0.8 → 0.0.9

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.
Files changed (36) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +0 -7
  3. data/fixtures/vcr_cassettes/panel_collection_fetch_fail.yml +10 -8
  4. data/fixtures/vcr_cassettes/panel_collection_fetch_success.yml +14 -11
  5. data/fixtures/vcr_cassettes/panel_import_update_success.yml +12 -10
  6. data/fixtures/vcr_cassettes/panel_member_collection_create_fail.yml +4 -2
  7. data/fixtures/vcr_cassettes/panel_member_collection_create_success.yml +33 -26
  8. data/fixtures/vcr_cassettes/panel_member_collection_fetch_success.yml +15 -12
  9. data/fixtures/vcr_cassettes/response_export_start_success.yml +19 -14
  10. data/fixtures/vcr_cassettes/response_export_update_success.yml +12 -38
  11. data/fixtures/vcr_cassettes/survey_collection_fetch_fail.yml +4 -2
  12. data/fixtures/vcr_cassettes/survey_collection_fetch_sucess.yml +12 -10
  13. data/lib/qualtrics_api/client.rb +3 -3
  14. data/lib/qualtrics_api/panel_collection.rb +4 -4
  15. data/lib/qualtrics_api/panel_import.rb +1 -1
  16. data/lib/qualtrics_api/panel_member.rb +8 -8
  17. data/lib/qualtrics_api/panel_member_collection.rb +9 -6
  18. data/lib/qualtrics_api/request_error_handler.rb +5 -9
  19. data/lib/qualtrics_api/response_export.rb +2 -2
  20. data/lib/qualtrics_api/services/response_export_service.rb +13 -19
  21. data/lib/qualtrics_api/survey.rb +2 -4
  22. data/lib/qualtrics_api/survey_collection.rb +4 -30
  23. data/lib/qualtrics_api/url.rb +1 -1
  24. data/lib/qualtrics_api/version.rb +1 -1
  25. data/qualtrics_api.gemspec +3 -3
  26. data/spec/lib/client_spec.rb +0 -4
  27. data/spec/lib/panel_import_spec.rb +2 -2
  28. data/spec/lib/panel_member_collection_spec.rb +4 -4
  29. data/spec/lib/panel_member_spec.rb +8 -8
  30. data/spec/lib/response_export_spec.rb +1 -1
  31. data/spec/lib/services/response_export_service_spec.rb +25 -29
  32. data/spec/lib/survey_collection_spec.rb +1 -28
  33. data/spec/lib/survey_spec.rb +2 -6
  34. data/spec/spec_helper.rb +1 -1
  35. metadata +9 -10
  36. data/fixtures/vcr_cassettes/survey_collection_fetch_with_scopeId_success.yml +0 -33
@@ -2,13 +2,15 @@
2
2
  http_interactions:
3
3
  - request:
4
4
  method: get
5
- uri: https://co1.qualtrics.com/API/v1/surveys?apiToken=6Wpo0Vsx1cN1kcHivCaGTz5IhOvchLrg1o4L0KOZ&scopeId=fake
5
+ uri: https://co1.qualtrics.com/API/v3/surveys
6
6
  body:
7
7
  encoding: US-ASCII
8
8
  string: ''
9
9
  headers:
10
+ X-API-TOKEN:
11
+ - 6Wpo0Vsx1cN1kcHivCaGTz5IhOvchLrg1o4L0KOZ
10
12
  User-Agent:
11
- - Faraday v0.8.9
13
+ - Faraday v0.9.2
12
14
  response:
13
15
  status:
14
16
  code: 404
@@ -2,32 +2,34 @@
2
2
  http_interactions:
3
3
  - request:
4
4
  method: get
5
- uri: https://co1.qualtrics.com/API/v1/surveys?apiToken=6Wpo0Vsx1cN1kcHivCaGTz5IhOvchLrg1o4L0KOZ
5
+ uri: https://co1.qualtrics.com/API/v3/surveys
6
6
  body:
7
7
  encoding: US-ASCII
8
8
  string: ''
9
9
  headers:
10
+ X-API-TOKEN:
11
+ - 6Wpo0Vsx1cN1kcHivCaGTz5IhOvchLrg1o4L0KOZ
10
12
  User-Agent:
11
- - Faraday v0.8.9
13
+ - Faraday v0.9.2
12
14
  response:
13
15
  status:
14
16
  code: 200
15
17
  message:
16
18
  headers:
17
- server:
18
- - Apache-Coyote/1.1
19
19
  content-type:
20
- - application/json
20
+ - application/json; charset=utf-8
21
+ request-time:
22
+ - '573'
21
23
  content-length:
22
- - '223'
24
+ - '1737'
23
25
  date:
24
- - Sun, 22 Mar 2015 21:05:57 GMT
26
+ - Mon, 11 Apr 2016 13:04:55 GMT
25
27
  connection:
26
28
  - close
27
29
  body:
28
30
  encoding: UTF-8
29
- string: '{"result":[{"id":"SV_djzgZ6eJXqnIUyF","name":"test_survey","ownerId":"UR_3fnAz35QCGlr725","lastModified":"2015-03-20
30
- 12:56:33","status":"Inactive"}],"meta":{"status":"Success","qualtricsErrorCode":null,"errorMessage":null}}'
31
+ string: '{"result":{"elements":[{"id":"SV_djzgZ6eJXqnIUyF","name":"Test","ownerId":"UR_3fnAz35QCGlr725","lastModified":"2015-08-06T16:11:15Z","isActive":false}],"nextPage":"https://co1.qualtrics.com/API/v3/surveys?offset=10"},"meta":{"httpStatus":"200
32
+ - OK"}}'
31
33
  http_version:
32
- recorded_at: Sun, 22 Mar 2015 21:05:57 GMT
34
+ recorded_at: Mon, 11 Apr 2016 13:04:55 GMT
33
35
  recorded_with: VCR 2.9.3
@@ -7,7 +7,6 @@ module QualtricsAPI
7
7
  end
8
8
 
9
9
  def surveys(options = {})
10
- @surveys = nil if @surveys && @surveys.scope_id != options[:scope_id]
11
10
  @surveys ||= QualtricsAPI::SurveyCollection.new(options).propagate_connection(self)
12
11
  end
13
12
 
@@ -22,8 +21,9 @@ module QualtricsAPI
22
21
  private
23
22
 
24
23
  def establish_connection(api_token)
25
- Faraday.new(url: QualtricsAPI::URL, params: { apiToken: api_token }) do |faraday|
26
- faraday.request :url_encoded
24
+ Faraday.new(url: QualtricsAPI::URL, headers: { 'X-API-TOKEN' => api_token }) do |faraday|
25
+ faraday.request :multipart
26
+ faraday.request :json
27
27
  faraday.response :json, :content_type => /\bjson$/
28
28
 
29
29
  faraday.use FaradayMiddleware::FollowRedirects
@@ -4,9 +4,9 @@ module QualtricsAPI
4
4
  attribute :all, Array, :default => []
5
5
  end
6
6
 
7
- def fetch(_options = {})
7
+ def fetch()
8
8
  @all = []
9
- parse_fetch_response(QualtricsAPI.connection(self).get('panels'))
9
+ parse_fetch_response(QualtricsAPI.connection(self).get('mailinglists'))
10
10
  self
11
11
  end
12
12
 
@@ -23,8 +23,8 @@ module QualtricsAPI
23
23
  private
24
24
 
25
25
  def parse_fetch_response(response)
26
- @all = response.body["result"].map do |result|
27
- QualtricsAPI::Panel.new(result).propagate_connection(self)
26
+ @all = response.body["result"]["elements"].map do |elements|
27
+ QualtricsAPI::Panel.new(elements).propagate_connection(self)
28
28
  end
29
29
  end
30
30
  end
@@ -6,7 +6,7 @@ module QualtricsAPI
6
6
  end
7
7
 
8
8
  def update_status
9
- res = QualtricsAPI.connection(self).get("panels/#{panel_id}/members/panelImports/#{id}").body["result"]
9
+ res = QualtricsAPI.connection(self).get("mailinglists/#{panel_id}/contactimports/#{id}").body["result"]
10
10
  @import_progress = res["percentComplete"]
11
11
  @completed = true if @import_progress == 100.0
12
12
  self
@@ -25,14 +25,14 @@ module QualtricsAPI
25
25
 
26
26
  def attributes_for_save
27
27
  {
28
- :id => "RecipientID",
29
- :first_name => "FirstName",
30
- :last_name => "LastName",
31
- :email => "Email",
32
- :language => "Language",
33
- :unsubscribed => 'Unsubscribed',
34
- :external_reference => "ExternalReference",
35
- :embeded_data => "EmbeddedData"
28
+ :id => "recipientID",
29
+ :first_name => "firstName",
30
+ :last_name => "lastName",
31
+ :email => "email",
32
+ :language => "language",
33
+ :unsubscribed => 'unsubscribed',
34
+ :external_reference => "externalReference",
35
+ :embeded_data => "embeddedData"
36
36
  }
37
37
  end
38
38
 
@@ -7,15 +7,18 @@ module QualtricsAPI
7
7
 
8
8
  def fetch(_options = {})
9
9
  @all = []
10
- parse_fetch_response(QualtricsAPI.connection(self).get("panels/#{id}/members"))
10
+ parse_fetch_response(QualtricsAPI.connection(self).get("mailinglists/#{id}/contacts"))
11
11
  self
12
12
  end
13
13
 
14
14
  def create(panel_members)
15
+ payload = {
16
+ contacts: Faraday::UploadIO.new(StringIO.new(panel_members.to_json), 'application/json', 'contacts.json')
17
+ }
15
18
  res = QualtricsAPI.connection(self)
16
- .post("panels/#{id}/members", QualtricsAPI.connection(self).params.merge(panelMembers: panel_members.to_json))
17
- .body["result"]
18
- import_id = res['importStatus'].split('/').last
19
+ .post("mailinglists/#{id}/contactimports", payload)
20
+ .body["result"]
21
+ import_id = res['id']
19
22
  QualtricsAPI::PanelImport.new(id: import_id, panel_id: id).propagate_connection(self)
20
23
  end
21
24
 
@@ -32,8 +35,8 @@ module QualtricsAPI
32
35
  private
33
36
 
34
37
  def parse_fetch_response(response)
35
- @all = response.body["result"].map do |result|
36
- QualtricsAPI::PanelMember.new(result).propagate_connection(self)
38
+ @all = response.body["result"]["elements"].map do |element|
39
+ QualtricsAPI::PanelMember.new(element).propagate_connection(self)
37
40
  end
38
41
  end
39
42
  end
@@ -1,7 +1,5 @@
1
1
  module QualtricsAPI
2
-
3
2
  class RequestErrorHandler < Faraday::Response::Middleware
4
-
5
3
  def on_complete(env)
6
4
  case env[:status]
7
5
  when 404
@@ -19,19 +17,17 @@ module QualtricsAPI
19
17
 
20
18
  def error_message(response)
21
19
  meta = response["meta"]
22
- [ "[",
23
- meta["status"], " - ",
24
- meta["qualtricsErrorCode"] || meta["internalErrorCode"],
25
- "] ",
26
- meta["errorMessage"]
20
+ ["[",
21
+ meta["status"], " - ",
22
+ meta["qualtricsErrorCode"] || meta["internalErrorCode"],
23
+ "] ",
24
+ meta["errorMessage"]
27
25
  ].join
28
26
  end
29
-
30
27
  end
31
28
 
32
29
  class NotFoundError < StandardError; end
33
30
  class BadRequestError < StandardError; end
34
31
  class UnauthorizedError < StandardError; end
35
32
  class InternalServerError < StandardError; end
36
-
37
33
  end
@@ -5,9 +5,9 @@ module QualtricsAPI
5
5
  end
6
6
 
7
7
  def update_status
8
- res = QualtricsAPI.connection(self).get('surveys/responseExports/' + id).body["result"]
8
+ res = QualtricsAPI.connection(self).get('responseexports/' + id).body["result"]
9
9
  @export_progress = res["percentComplete"]
10
- @file_url = res["fileUrl"]
10
+ @file_url = res["file"]
11
11
  @completed = true if @export_progress == 100.0
12
12
  self
13
13
  end
@@ -2,46 +2,42 @@ module QualtricsAPI
2
2
  module Services
3
3
  class ResponseExportService < QualtricsAPI::BaseModel
4
4
  values do
5
+ attribute :format, String, :default => 'csv'
5
6
  attribute :survey_id, String
6
- attribute :response_set_id, String
7
- attribute :file_type, String, :default => 'CSV'
8
7
  attribute :last_response_id, String
9
8
  attribute :start_date, String
10
9
  attribute :end_date, String
11
10
  attribute :limit, String
12
11
  attribute :included_question_ids, String
13
- attribute :max_rows, String
14
12
  attribute :use_labels, Boolean, :default => false
15
- attribute :decimal_format, String, :default => '.'
13
+ attribute :decimal_separator, String, :default => '.'
16
14
  attribute :seen_unanswered_recode, String
17
15
  attribute :use_local_time, Boolean, :default => false
18
- attribute :spss_string_length, String
16
+
19
17
  attribute :id, String
20
18
  end
21
19
 
22
20
  attr_reader :result
23
21
 
24
22
  def start
25
- response = QualtricsAPI.connection(self).get("surveys/#{survey_id}/responseExports", export_params)
26
- export_id = response.body["result"]["exportStatus"].split('/').last
23
+ response = QualtricsAPI.connection(self).post("responseexports", export_params)
24
+ export_id = response.body["result"]["id"]
27
25
  @result = ResponseExport.new(id: export_id)
28
26
  end
29
27
 
30
28
  def export_configurations
31
29
  {
32
- response_set_id: response_set_id,
33
- file_type: file_type,
30
+ format: format,
31
+ survey_id: survey_id,
34
32
  last_response_id: last_response_id,
35
33
  start_date: start_date,
36
34
  end_date: end_date,
37
35
  limit: limit,
38
36
  included_question_ids: included_question_ids,
39
- max_rows: max_rows,
40
37
  use_labels: use_labels,
41
- decimal_format: decimal_format,
38
+ decimal_separator: decimal_separator,
42
39
  seen_unanswered_recode: seen_unanswered_recode,
43
- use_local_time: use_local_time,
44
- spss_string_length: spss_string_length
40
+ use_local_time: use_local_time
45
41
  }
46
42
  end
47
43
 
@@ -49,19 +45,17 @@ module QualtricsAPI
49
45
 
50
46
  def param_mappings
51
47
  {
52
- response_set_id: "responseSetId",
53
- file_type: "fileType",
48
+ format: "format",
49
+ survey_id: "surveyId",
54
50
  last_response_id: "lastResponseId",
55
51
  start_date: "startDate",
56
52
  end_date: "endDate",
57
53
  limit: "limit",
58
54
  included_question_ids: "includedQuestionIds",
59
- max_rows: "maxRows",
60
55
  use_labels: "useLabels",
61
- decimal_format: "decimalFormat",
56
+ decimal_separator: "decimalSeparator",
62
57
  seen_unanswered_recode: "seenUnansweredRecode",
63
- use_local_time: "useLocalTime",
64
- spss_string_length: "spssStringLength"
58
+ use_local_time: "useLocalTime"
65
59
  }
66
60
  end
67
61
 
@@ -5,8 +5,7 @@ module QualtricsAPI
5
5
  attribute :name, String
6
6
  attribute :owner_id, String
7
7
  attribute :last_modified, String
8
- attribute :created_at, String
9
- attribute :status, String
8
+ attribute :is_active, Boolean
10
9
  end
11
10
 
12
11
  def export_responses(export_options = {})
@@ -21,8 +20,7 @@ module QualtricsAPI
21
20
  :name => "name",
22
21
  :owner_id => "ownerId",
23
22
  :last_modified => "lastModified",
24
- :status => "status",
25
- :created_at => "SurveyCreationDate"
23
+ :is_active => "isActive"
26
24
  }
27
25
  end
28
26
  end
@@ -1,29 +1,15 @@
1
1
  module QualtricsAPI
2
2
  class SurveyCollection < BaseCollection
3
3
  values do
4
- attribute :scope_id, String
5
4
  attribute :all, Array, :default => []
6
5
  end
7
6
 
8
- attr_writer :scope_id
9
-
10
- def fetch(options = {})
7
+ def fetch
11
8
  @all = []
12
- update_query_attributes(options)
13
- parse_fetch_response(QualtricsAPI.connection(self).get('surveys', query_params))
9
+ parse_fetch_response(QualtricsAPI.connection(self).get('surveys'))
14
10
  self
15
11
  end
16
12
 
17
- def query_attributes
18
- {
19
- :scope_id => @scope_id
20
- }
21
- end
22
-
23
- def update_query_attributes(new_attributes = {})
24
- @scope_id = new_attributes[:scope_id] if new_attributes.key?(:scope_id)
25
- end
26
-
27
13
  def [](survey_id)
28
14
  find(survey_id)
29
15
  end
@@ -36,21 +22,9 @@ module QualtricsAPI
36
22
 
37
23
  private
38
24
 
39
- def attributes_mapping
40
- {
41
- :scope_id => "scopeId"
42
- }
43
- end
44
-
45
- def query_params
46
- query_attributes.map do |k, v|
47
- [attributes_mapping[k], v] unless v.nil? || v.to_s.empty?
48
- end.compact.to_h
49
- end
50
-
51
25
  def parse_fetch_response(response)
52
- @all = response.body["result"].map do |result|
53
- QualtricsAPI::Survey.new(result).propagate_connection(self)
26
+ @all = response.body["result"]['elements'].map do |elements|
27
+ QualtricsAPI::Survey.new(elements).propagate_connection(self)
54
28
  end
55
29
  end
56
30
  end
@@ -1,3 +1,3 @@
1
1
  module QualtricsAPI
2
- URL = "https://co1.qualtrics.com:443/API/v1/"
2
+ URL = "https://co1.qualtrics.com:443/API/v3/"
3
3
  end
@@ -1,3 +1,3 @@
1
1
  module QualtricsAPI
2
- VERSION = "0.0.8".freeze
2
+ VERSION = "0.0.9".freeze
3
3
  end
@@ -26,9 +26,9 @@ Gem::Specification.new do |spec|
26
26
  spec.add_dependency "faraday_middleware", "~> 0.9.1"
27
27
  spec.add_dependency "virtus", "~> 1.0"
28
28
 
29
- spec.add_development_dependency "bundler", "~> 1.7"
30
- spec.add_development_dependency "rake", "~> 10.0"
31
- spec.add_development_dependency "rspec", "~> 3.2"
29
+ spec.add_development_dependency "bundler", "~> 1.11"
30
+ spec.add_development_dependency "rake", "~> 11.1"
31
+ spec.add_development_dependency "rspec", "~> 3.4"
32
32
  spec.add_development_dependency "vcr", "~> 2.9"
33
33
  spec.add_development_dependency "guard-rspec", "~> 4.5"
34
34
  spec.add_development_dependency "pry", "~> 0.10.1"
@@ -18,10 +18,6 @@ describe QualtricsAPI::Client do
18
18
  expect(subject.surveys).to be_a QualtricsAPI::SurveyCollection
19
19
  end
20
20
 
21
- it "assigns scope_id if passed" do
22
- expect(subject.surveys(:scope_id => "someId").scope_id).to eq "someId"
23
- end
24
-
25
21
  it "caches the surveys" do
26
22
  expect(subject.surveys.object_id).to eq subject.surveys.object_id
27
23
  end
@@ -1,12 +1,12 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe QualtricsAPI::PanelImport do
4
- subject { described_class.new(id: 'PGRS_bEJLYLkqMBs8Bwx', panel_id: 'ML_bC2c5xBz1DxyOYB') }
4
+ subject { described_class.new(id: 'PGRS_4GvIMg79RFEPW4d', panel_id: 'ML_0APx3C4rmHER6w5') }
5
5
 
6
6
  describe "integration" do
7
7
  describe "#update_status" do
8
8
  let(:result) do
9
- VCR.use_cassette('panel_import_update_success') do
9
+ VCR.use_cassette('panel_import_update_success', record: :once) do
10
10
  subject.update_status
11
11
  end
12
12
  end
@@ -61,8 +61,8 @@ describe QualtricsAPI::PanelMemberCollection do
61
61
 
62
62
  describe "#create" do
63
63
  let(:result) do
64
- VCR.use_cassette(cassette) do
65
- QualtricsAPI.panels.fetch['ML_bC2c5xBz1DxyOYB'].members.create(panel_members)
64
+ VCR.use_cassette(cassette, record: :once) do
65
+ QualtricsAPI.panels.fetch['ML_0APx3C4rmHER6w5'].members.create(panel_members)
66
66
  end
67
67
  end
68
68
 
@@ -75,11 +75,11 @@ describe QualtricsAPI::PanelMemberCollection do
75
75
  end
76
76
 
77
77
  it "returns PanelImport with id" do
78
- expect(result.id).to eq('PGRS_bEJLYLkqMBs8Bwx')
78
+ expect(result.id).to eq('PGRS_4GvIMg79RFEPW4d')
79
79
  end
80
80
 
81
81
  it "returns PanelImport with panel id" do
82
- expect(result.panel_id).to eq('ML_bC2c5xBz1DxyOYB')
82
+ expect(result.panel_id).to eq('ML_0APx3C4rmHER6w5')
83
83
  end
84
84
  end
85
85