qualtrics_api 0.0.2 → 0.0.3
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/README.md +46 -0
- data/fixtures/vcr_cassettes/panel_collection_fetch_fail.yml +33 -0
- data/fixtures/vcr_cassettes/panel_collection_fetch_success.yml +32 -0
- data/fixtures/vcr_cassettes/panel_import_update_success.yml +32 -0
- data/fixtures/vcr_cassettes/panel_member_collection_create_fail.yml +31 -0
- data/fixtures/vcr_cassettes/panel_member_collection_create_success.yml +66 -0
- data/fixtures/vcr_cassettes/panel_member_collection_fetch_fail.yml +33 -0
- data/fixtures/vcr_cassettes/panel_member_collection_fetch_success.yml +33 -0
- data/lib/qualtrics_api.rb +6 -2
- data/lib/qualtrics_api/client.rb +7 -3
- data/lib/qualtrics_api/panel.rb +32 -0
- data/lib/qualtrics_api/panel_collection.rb +37 -0
- data/lib/qualtrics_api/panel_import.rb +30 -0
- data/lib/qualtrics_api/panel_member.rb +50 -0
- data/lib/qualtrics_api/panel_member_collection.rb +46 -0
- data/lib/qualtrics_api/response_export_collection.rb +2 -2
- data/lib/qualtrics_api/survey.rb +0 -2
- data/lib/qualtrics_api/survey_collection.rb +2 -2
- data/lib/qualtrics_api/version.rb +1 -1
- data/spec/lib/panel_collection_spec.rb +77 -0
- data/spec/lib/panel_import_spec.rb +28 -0
- data/spec/lib/panel_member_collection_spec.rb +115 -0
- data/spec/lib/panel_member_spec.rb +66 -0
- data/spec/lib/panel_spec.rb +54 -0
- metadata +24 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: abd7228ac110efc90a89dce24f0a7de7e7335704
|
4
|
+
data.tar.gz: bc6f5225fd701ad819038027d0d3baadec2ecdf8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 813bbed6a8992818faec40c1dc93707bc5c2c5769cc2f422de93578a19c941516ee3b1912963fac4c8e9be7aeeda22bbcd378db449dba7a3e3ab5b365acc7287
|
7
|
+
data.tar.gz: 147e595c36036bd0664d5fb3d90ec387a74f46fb35120f1ab7c7d56551433b7505303e15dc5471aa94907e9da007b5b59874265f2b7d4c794b7b4590db5ae96f
|
data/README.md
CHANGED
@@ -136,6 +136,52 @@ export.status
|
|
136
136
|
=> "99.99999%"
|
137
137
|
```
|
138
138
|
|
139
|
+
### Panels
|
140
|
+
|
141
|
+
To get all the panels:
|
142
|
+
|
143
|
+
```ruby
|
144
|
+
client.panels.fetch
|
145
|
+
# => #<QualtricsAPI::PanelCollection:0x007f8769aae2c0 ....>
|
146
|
+
```
|
147
|
+
|
148
|
+
After you have received results, you can search for a panel by id:
|
149
|
+
|
150
|
+
```ruby
|
151
|
+
panel = client.panels.find("panelIdHere")
|
152
|
+
# => #<QualtricsAPI::Panel:0x007f876906f278 @id="panelIdHere" ...>
|
153
|
+
```
|
154
|
+
|
155
|
+
or just:
|
156
|
+
|
157
|
+
```ruby
|
158
|
+
panel = client.panels["panelIdHere"]
|
159
|
+
# => #<QualtricsAPI::Panel:0x007f876906f278 @id="panelIdHere" ...>
|
160
|
+
```
|
161
|
+
|
162
|
+
#### Panel Members
|
163
|
+
|
164
|
+
To add panel members to a panel:
|
165
|
+
|
166
|
+
```ruby
|
167
|
+
panel = client.panels.fetch["panelIdHere"]
|
168
|
+
members = [QualtricsAPI::PanelMember.new(first_name: 'John', last_name: 'Doe', email: 'test@test.com')]
|
169
|
+
panel.members.create(members)
|
170
|
+
=> #<QualtricsAPI::PanelImport:0x007fb7db984668 ...>
|
171
|
+
```
|
172
|
+
|
173
|
+
and update athe status of panel import:
|
174
|
+
```ruby
|
175
|
+
members = [QualtricsAPI::PanelMember.new(first_name: 'John', last_name: 'Doe', email: 'test@test.com')]
|
176
|
+
panel_import = panel.members.create(members)
|
177
|
+
=> #<QualtricsAPI::PanelImport:0x007fb7db984668 ...>
|
178
|
+
panel_import.status
|
179
|
+
=> "99.99999%"
|
180
|
+
panel_import.update_status
|
181
|
+
panel_import.status
|
182
|
+
=> "100.0%"
|
183
|
+
```
|
184
|
+
|
139
185
|
## Contributing
|
140
186
|
|
141
187
|
1. Fork it ( https://github.com/pallymore/qualtrics_api/fork )
|
@@ -0,0 +1,33 @@
|
|
1
|
+
---
|
2
|
+
http_interactions:
|
3
|
+
- request:
|
4
|
+
method: get
|
5
|
+
uri: https://co1.qualtrics.com/API/v1/panels?apiToken=6Wpo0Vsx1cN1kcHivCaGTz5IhOvchLrg1o4L0KOZ
|
6
|
+
body:
|
7
|
+
encoding: US-ASCII
|
8
|
+
string: ''
|
9
|
+
headers:
|
10
|
+
User-Agent:
|
11
|
+
- Faraday v0.8.9
|
12
|
+
response:
|
13
|
+
status:
|
14
|
+
code: 200
|
15
|
+
message:
|
16
|
+
headers:
|
17
|
+
server:
|
18
|
+
- Apache-Coyote/1.1
|
19
|
+
content-type:
|
20
|
+
- application/json
|
21
|
+
content-length:
|
22
|
+
- '223'
|
23
|
+
date:
|
24
|
+
- Sun, 28 Jun 2015 21:05:57 GMT
|
25
|
+
connection:
|
26
|
+
- close
|
27
|
+
body:
|
28
|
+
encoding: UTF-8
|
29
|
+
string: '{"meta":{"status":"Error","errorMessage":"You do not have permission
|
30
|
+
to access this resource.","internalErrorCode":"GS_5","errorId":"3d6a9018-3b87-4265-b662-572ad96bbe6c"},"result":null}'
|
31
|
+
http_version:
|
32
|
+
recorded_at: Sun, 28 Jun 2015 21:05:57 GMT
|
33
|
+
recorded_with: VCR 2.9.3
|
@@ -0,0 +1,32 @@
|
|
1
|
+
---
|
2
|
+
http_interactions:
|
3
|
+
- request:
|
4
|
+
method: get
|
5
|
+
uri: https://co1.qualtrics.com/API/v1/panels?apiToken=6Wpo0Vsx1cN1kcHivCaGTz5IhOvchLrg1o4L0KOZ
|
6
|
+
body:
|
7
|
+
encoding: US-ASCII
|
8
|
+
string: ''
|
9
|
+
headers:
|
10
|
+
User-Agent:
|
11
|
+
- Faraday v0.8.9
|
12
|
+
response:
|
13
|
+
status:
|
14
|
+
code: 200
|
15
|
+
message:
|
16
|
+
headers:
|
17
|
+
server:
|
18
|
+
- Apache-Coyote/1.1
|
19
|
+
content-type:
|
20
|
+
- application/json
|
21
|
+
content-length:
|
22
|
+
- '223'
|
23
|
+
date:
|
24
|
+
- Sun, 28 Jun 2015 21:05:57 GMT
|
25
|
+
connection:
|
26
|
+
- close
|
27
|
+
body:
|
28
|
+
encoding: UTF-8
|
29
|
+
string: '{"result":[{"panelId":"AB_abcdefghijk","name":"Master Panel","libraryId":"GR_abcdefghijk","category":"Unassigned"}],"meta":{"status":"Success","qualtricsErrorCode":null,"errorMessage":null}}'
|
30
|
+
http_version:
|
31
|
+
recorded_at: Sun, 28 Jun 2015 21:05:57 GMT
|
32
|
+
recorded_with: VCR 2.9.3
|
@@ -0,0 +1,32 @@
|
|
1
|
+
---
|
2
|
+
http_interactions:
|
3
|
+
- request:
|
4
|
+
method: get
|
5
|
+
uri: https://co1.qualtrics.com/API/v1/panels/ML_bC2c5xBz1DxyOYB/members/panelImports/PGRS_bEJLYLkqMBs8Bwx?apiToken=6Wpo0Vsx1cN1kcHivCaGTz5IhOvchLrg1o4L0KOZ
|
6
|
+
body:
|
7
|
+
encoding: US-ASCII
|
8
|
+
string: ''
|
9
|
+
headers:
|
10
|
+
User-Agent:
|
11
|
+
- Faraday v0.8.9
|
12
|
+
response:
|
13
|
+
status:
|
14
|
+
code: 200
|
15
|
+
message:
|
16
|
+
headers:
|
17
|
+
server:
|
18
|
+
- Apache-Coyote/1.1
|
19
|
+
content-type:
|
20
|
+
- application/json
|
21
|
+
date:
|
22
|
+
- Tue, 30 Jun 2015 18:36:33 GMT
|
23
|
+
content-length:
|
24
|
+
- '85'
|
25
|
+
connection:
|
26
|
+
- close
|
27
|
+
body:
|
28
|
+
encoding: UTF-8
|
29
|
+
string: '{"result":{"status":"COMPLETED","percentComplete":100.0},"meta":{"status":"Success"}}'
|
30
|
+
http_version:
|
31
|
+
recorded_at: Tue, 30 Jun 2015 18:36:34 GMT
|
32
|
+
recorded_with: VCR 2.9.3
|
@@ -0,0 +1,31 @@
|
|
1
|
+
---
|
2
|
+
http_interactions:
|
3
|
+
- request:
|
4
|
+
method: get
|
5
|
+
uri: https://co1.qualtrics.com/API/v1/panels/ABCD/members?apiToken=6Wpo0Vsx1cN1kcHivCaGTz5IhOvchLrg1o4L0KOZ
|
6
|
+
body:
|
7
|
+
encoding: US-ASCII
|
8
|
+
string: ''
|
9
|
+
headers:
|
10
|
+
User-Agent:
|
11
|
+
- Faraday v0.8.9
|
12
|
+
response:
|
13
|
+
status:
|
14
|
+
code: 400
|
15
|
+
message:
|
16
|
+
headers:
|
17
|
+
server:
|
18
|
+
- Apache-Coyote/1.1
|
19
|
+
content-type:
|
20
|
+
- application/json
|
21
|
+
date:
|
22
|
+
- Tue, 30 Jun 2015 11:02:46 GMT
|
23
|
+
connection:
|
24
|
+
- close
|
25
|
+
body:
|
26
|
+
encoding: UTF-8
|
27
|
+
string: '{"meta":{"status":"Error","errorMessage":"Missing or invalid parameter
|
28
|
+
panelId.","internalErrorCode":"GPR_1","errorId":"f399b7aa-7ce4-4d1d-9903-61435a929a9d"},"result":null}'
|
29
|
+
http_version:
|
30
|
+
recorded_at: Tue, 30 Jun 2015 11:02:46 GMT
|
31
|
+
recorded_with: VCR 2.9.3
|
@@ -0,0 +1,66 @@
|
|
1
|
+
---
|
2
|
+
http_interactions:
|
3
|
+
- request:
|
4
|
+
method: get
|
5
|
+
uri: https://co1.qualtrics.com/API/v1/panels?apiToken=6Wpo0Vsx1cN1kcHivCaGTz5IhOvchLrg1o4L0KOZ
|
6
|
+
body:
|
7
|
+
encoding: US-ASCII
|
8
|
+
string: ''
|
9
|
+
headers:
|
10
|
+
User-Agent:
|
11
|
+
- Faraday v0.8.9
|
12
|
+
response:
|
13
|
+
status:
|
14
|
+
code: 200
|
15
|
+
message:
|
16
|
+
headers:
|
17
|
+
server:
|
18
|
+
- Apache-Coyote/1.1
|
19
|
+
content-type:
|
20
|
+
- application/json
|
21
|
+
date:
|
22
|
+
- Tue, 30 Jun 2015 11:05:46 GMT
|
23
|
+
content-length:
|
24
|
+
- '1104'
|
25
|
+
connection:
|
26
|
+
- close
|
27
|
+
body:
|
28
|
+
encoding: UTF-8
|
29
|
+
string: '{"result":[{"libraryId":"UR_a3IUfBgXyuCHefP","panelId":"ML_bC2c5xBz1DxyOYB","name":"Test
|
30
|
+
Panel","category":"Unassigned"},{"libraryId":"GR_2aaKA1aGidXQtOA","panelId":"ML_3DWuh7BTCbBDMrz","name":"1032
|
31
|
+
test","category":"Unassigned"},{"libraryId":"GR_2aaKA1aGidXQtOA","panelId":"ML_801qFFVH8bOdbdH","name":"Master2015","category":"Unassigned"},{"libraryId":"GR_2aaKA1aGidXQtOA","panelId":"ML_8CTTM1NuWINZUO1","name":"29.X-2","category":"Unassigned"},{"libraryId":"GR_2aaKA1aGidXQtOA","panelId":"ML_8FZn6SlO02EfpwV","name":"29.X","category":"Unassigned"},{"libraryId":"GR_2aaKA1aGidXQtOA","panelId":"ML_aYrBXdYJZ5SnYqx","name":"ML_b3GT2LOMImo2Rnf","category":"Unassigned"},{"libraryId":"GR_2aaKA1aGidXQtOA","panelId":"ML_bJj6bKQErauewzH","name":"GRPSteacherSpring2013fixed_seperate","category":"Unassigned"},{"libraryId":"GR_2aaKA1aGidXQtOA","panelId":"ML_bseUhQDwAJolD1j","name":"Master
|
32
|
+
Panel","category":"Unassigned"},{"libraryId":"GR_2aaKA1aGidXQtOA","panelId":"ML_eRKRb6a6Waiukap","name":"OhioSpring2015","category":"Unassigned"}],"meta":{"status":"Success","qualtricsErrorCode":null,"errorMessage":null}}'
|
33
|
+
http_version:
|
34
|
+
recorded_at: Tue, 30 Jun 2015 11:05:47 GMT
|
35
|
+
- request:
|
36
|
+
method: post
|
37
|
+
uri: https://co1.qualtrics.com/API/v1/panels/ML_bC2c5xBz1DxyOYB/members?apiToken=6Wpo0Vsx1cN1kcHivCaGTz5IhOvchLrg1o4L0KOZ
|
38
|
+
body:
|
39
|
+
encoding: US-ASCII
|
40
|
+
string: apiToken=6Wpo0Vsx1cN1kcHivCaGTz5IhOvchLrg1o4L0KOZ&panelMembers=%5B%7B%22FirstName%22%3A%22Marcin%22%2C%22LastName%22%3A%22Naglik%22%2C%22Email%22%3A%22test%40test.com%22%7D%5D
|
41
|
+
headers:
|
42
|
+
User-Agent:
|
43
|
+
- Faraday v0.8.9
|
44
|
+
Content-Type:
|
45
|
+
- application/x-www-form-urlencoded
|
46
|
+
response:
|
47
|
+
status:
|
48
|
+
code: 200
|
49
|
+
message:
|
50
|
+
headers:
|
51
|
+
server:
|
52
|
+
- Apache-Coyote/1.1
|
53
|
+
content-type:
|
54
|
+
- application/json
|
55
|
+
date:
|
56
|
+
- Tue, 30 Jun 2015 11:05:47 GMT
|
57
|
+
content-length:
|
58
|
+
- '203'
|
59
|
+
connection:
|
60
|
+
- close
|
61
|
+
body:
|
62
|
+
encoding: UTF-8
|
63
|
+
string: '{"result":{"importStatus":"http://co1.qualtrics.com/API/v1/panels/ML_bC2c5xBz1DxyOYB/members/panelImports/PGRS_bEJLYLkqMBs8Bwx"},"meta":{"status":"Success","qualtricsErrorCode":null,"errorMessage":null}}'
|
64
|
+
http_version:
|
65
|
+
recorded_at: Tue, 30 Jun 2015 11:05:47 GMT
|
66
|
+
recorded_with: VCR 2.9.3
|
@@ -0,0 +1,33 @@
|
|
1
|
+
---
|
2
|
+
http_interactions:
|
3
|
+
- request:
|
4
|
+
method: get
|
5
|
+
uri: https://co1.qualtrics.com/API/v1/panels/ABCD/members?apiToken=6Wpo0Vsx1cN1kcHivCaGTz5IhOvchLrg1o4L0KOZ
|
6
|
+
body:
|
7
|
+
encoding: US-ASCII
|
8
|
+
string: ''
|
9
|
+
headers:
|
10
|
+
User-Agent:
|
11
|
+
- Faraday v0.8.9
|
12
|
+
response:
|
13
|
+
status:
|
14
|
+
code: 200
|
15
|
+
message:
|
16
|
+
headers:
|
17
|
+
server:
|
18
|
+
- Apache-Coyote/1.1
|
19
|
+
content-type:
|
20
|
+
- application/json
|
21
|
+
content-length:
|
22
|
+
- '223'
|
23
|
+
date:
|
24
|
+
- Sun, 28 Jun 2015 21:05:57 GMT
|
25
|
+
connection:
|
26
|
+
- close
|
27
|
+
body:
|
28
|
+
encoding: UTF-8
|
29
|
+
string: '{"meta":{"status":"Error","errorMessage":"You do not have permission
|
30
|
+
to access this resource.","internalErrorCode":"GS_5","errorId":"3d6a9018-3b87-4265-b662-572ad96bbe6c"},"result":null}'
|
31
|
+
http_version:
|
32
|
+
recorded_at: Sun, 28 Jun 2015 21:05:57 GMT
|
33
|
+
recorded_with: VCR 2.9.3
|
@@ -0,0 +1,33 @@
|
|
1
|
+
|
2
|
+
---
|
3
|
+
http_interactions:
|
4
|
+
- request:
|
5
|
+
method: get
|
6
|
+
uri: https://co1.qualtrics.com/API/v1/panels/ABCD/members?apiToken=6Wpo0Vsx1cN1kcHivCaGTz5IhOvchLrg1o4L0KOZ
|
7
|
+
body:
|
8
|
+
encoding: US-ASCII
|
9
|
+
string: ''
|
10
|
+
headers:
|
11
|
+
User-Agent:
|
12
|
+
- Faraday v0.8.9
|
13
|
+
response:
|
14
|
+
status:
|
15
|
+
code: 200
|
16
|
+
message:
|
17
|
+
headers:
|
18
|
+
server:
|
19
|
+
- Apache-Coyote/1.1
|
20
|
+
content-type:
|
21
|
+
- application/json
|
22
|
+
content-length:
|
23
|
+
- '223'
|
24
|
+
date:
|
25
|
+
- Sun, 28 Jun 2015 21:05:57 GMT
|
26
|
+
connection:
|
27
|
+
- close
|
28
|
+
body:
|
29
|
+
encoding: UTF-8
|
30
|
+
string: '{ "result": [ { "rowId": "33369396", "panelMemberId": "MLRP_abcd", "firstName": "Thom", "lastName": "Yorke", "email": "thom@yorke.com", "externalDataReference": null, "embeddedData": { } } ], "meta": { "status": "Success", "qualtricsErrorCode": null, "errorMessage": null }}'
|
31
|
+
http_version:
|
32
|
+
recorded_at: Sun, 28 Jun 2015 21:05:57 GMT
|
33
|
+
recorded_with: VCR 2.9.3
|
data/lib/qualtrics_api.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
require 'json'
|
1
2
|
require 'virtus'
|
2
3
|
require "faraday"
|
3
4
|
require "faraday_middleware"
|
@@ -12,13 +13,16 @@ require "qualtrics_api/survey"
|
|
12
13
|
require "qualtrics_api/survey_collection"
|
13
14
|
require "qualtrics_api/response_export"
|
14
15
|
require "qualtrics_api/response_export_collection"
|
16
|
+
require "qualtrics_api/panel"
|
17
|
+
require "qualtrics_api/panel_collection"
|
18
|
+
require "qualtrics_api/panel_member"
|
19
|
+
require "qualtrics_api/panel_member_collection"
|
20
|
+
require "qualtrics_api/panel_import"
|
15
21
|
|
16
22
|
require "qualtrics_api/services/response_export_service"
|
17
23
|
|
18
24
|
module QualtricsAPI
|
19
|
-
|
20
25
|
def self.new(token)
|
21
26
|
Client.new(api_token: token)
|
22
27
|
end
|
23
|
-
|
24
28
|
end
|
data/lib/qualtrics_api/client.rb
CHANGED
@@ -5,17 +5,21 @@ module QualtricsAPI
|
|
5
5
|
attribute :api_token, String
|
6
6
|
|
7
7
|
def surveys(options = {})
|
8
|
-
@surveys ||= QualtricsAPI::SurveyCollection.new
|
8
|
+
@surveys ||= QualtricsAPI::SurveyCollection.new(options.merge(connection: connection))
|
9
9
|
end
|
10
10
|
|
11
11
|
def response_exports(options = {})
|
12
|
-
@response_exports ||= QualtricsAPI::ResponseExportCollection.new
|
12
|
+
@response_exports ||= QualtricsAPI::ResponseExportCollection.new(options.merge(connection: connection))
|
13
|
+
end
|
14
|
+
|
15
|
+
def panels(options = {})
|
16
|
+
@panels ||= QualtricsAPI::PanelCollection.new(options.merge(connection: connection))
|
13
17
|
end
|
14
18
|
|
15
19
|
def connection
|
16
20
|
@conn ||= Faraday.new(url: QualtricsAPI::URL,
|
17
21
|
params: { apiToken: api_token }) do |faraday|
|
18
|
-
faraday.request :
|
22
|
+
faraday.request :url_encoded
|
19
23
|
faraday.response :json, :content_type => /\bjson$/
|
20
24
|
|
21
25
|
faraday.use FaradayMiddleware::FollowRedirects
|
@@ -0,0 +1,32 @@
|
|
1
|
+
module QualtricsAPI
|
2
|
+
class Panel
|
3
|
+
include Virtus.value_object
|
4
|
+
|
5
|
+
attribute :connection
|
6
|
+
attribute :id, String
|
7
|
+
attribute :library_id, String
|
8
|
+
attribute :name, String
|
9
|
+
attribute :category, String
|
10
|
+
|
11
|
+
def initialize(options = {})
|
12
|
+
attributes_mappings.each do |key, qualtrics_key|
|
13
|
+
instance_variable_set "@#{key}", options[qualtrics_key]
|
14
|
+
end
|
15
|
+
super
|
16
|
+
end
|
17
|
+
|
18
|
+
def members(options = {})
|
19
|
+
@members ||= QualtricsAPI::PanelMemberCollection.new(options.merge(id: id, connection: connection))
|
20
|
+
end
|
21
|
+
|
22
|
+
private
|
23
|
+
|
24
|
+
def attributes_mappings
|
25
|
+
{
|
26
|
+
:id => "panelId",
|
27
|
+
:library_id => "libraryId",
|
28
|
+
:name => "name"
|
29
|
+
}
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
module QualtricsAPI
|
2
|
+
class PanelCollection
|
3
|
+
extend Forwardable
|
4
|
+
include Enumerable
|
5
|
+
include Virtus.value_object
|
6
|
+
|
7
|
+
attribute :connection
|
8
|
+
attribute :all, Array, :default => []
|
9
|
+
|
10
|
+
def_delegator :all, :each
|
11
|
+
def_delegator :all, :size
|
12
|
+
|
13
|
+
def fetch(_options = {})
|
14
|
+
@all = []
|
15
|
+
parse_fetch_response(connection.get('panels'))
|
16
|
+
self
|
17
|
+
end
|
18
|
+
|
19
|
+
def [](panel_id)
|
20
|
+
find(panel_id)
|
21
|
+
end
|
22
|
+
|
23
|
+
def find(panel_id)
|
24
|
+
@all.detect do |panel|
|
25
|
+
panel.id == panel_id
|
26
|
+
end || QualtricsAPI::Panel.new("panelId" => panel_id, connection: connection)
|
27
|
+
end
|
28
|
+
|
29
|
+
private
|
30
|
+
|
31
|
+
def parse_fetch_response(response)
|
32
|
+
@all = response.body["result"].map do |result|
|
33
|
+
QualtricsAPI::Panel.new result.merge(connection: connection)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module QualtricsAPI
|
2
|
+
class PanelImport
|
3
|
+
include Virtus.value_object
|
4
|
+
|
5
|
+
attribute :connection
|
6
|
+
attribute :id, String
|
7
|
+
attribute :panel_id, String
|
8
|
+
|
9
|
+
def update_status
|
10
|
+
res = connection.get("panels/#{panel_id}/members/panelImports/#{id}").body["result"]
|
11
|
+
@import_progress = res["percentComplete"]
|
12
|
+
@completed = true if @import_progress == 100.0
|
13
|
+
self
|
14
|
+
end
|
15
|
+
|
16
|
+
def status
|
17
|
+
update_status unless completed?
|
18
|
+
"#{@import_progress}%"
|
19
|
+
end
|
20
|
+
|
21
|
+
def percent_completed
|
22
|
+
update_status unless completed?
|
23
|
+
@import_progress
|
24
|
+
end
|
25
|
+
|
26
|
+
def completed?
|
27
|
+
@completed == true
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
module QualtricsAPI
|
2
|
+
class PanelMember
|
3
|
+
include Virtus.value_object
|
4
|
+
|
5
|
+
attribute :connection
|
6
|
+
attribute :id, String
|
7
|
+
attribute :first_name, String
|
8
|
+
attribute :last_name, String
|
9
|
+
attribute :email, String
|
10
|
+
attribute :language, String
|
11
|
+
attribute :unsubscribed, Integer
|
12
|
+
attribute :external_data_reference, String
|
13
|
+
attribute :embeded_data, Hash
|
14
|
+
|
15
|
+
def initialize(options = {})
|
16
|
+
attributes_mappings.each do |key, qualtrics_key|
|
17
|
+
instance_variable_set "@#{key}", options[qualtrics_key]
|
18
|
+
end
|
19
|
+
super
|
20
|
+
end
|
21
|
+
|
22
|
+
def to_json(_options = {})
|
23
|
+
serialized_attributes.to_json
|
24
|
+
end
|
25
|
+
|
26
|
+
private
|
27
|
+
|
28
|
+
def serialized_attributes
|
29
|
+
Hash[attributes.map { |k, v| [mapped_and_uppercased_attribute(k), v] }].tap do |h|
|
30
|
+
h.delete("Connection")
|
31
|
+
end.delete_if { |_k, v| v.nil? }
|
32
|
+
end
|
33
|
+
|
34
|
+
def mapped_and_uppercased_attribute(attribute)
|
35
|
+
(attributes_mappings[attribute] || attribute).to_s.tap do |a|
|
36
|
+
a[0] = a[0].upcase
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def attributes_mappings
|
41
|
+
{
|
42
|
+
:id => "panelMemberId",
|
43
|
+
:first_name => "firstName",
|
44
|
+
:last_name => "lastName",
|
45
|
+
:external_data_reference => "externalDataReference",
|
46
|
+
:embeded_data => "embeddedData"
|
47
|
+
}
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
module QualtricsAPI
|
2
|
+
class PanelMemberCollection
|
3
|
+
extend Forwardable
|
4
|
+
include Enumerable
|
5
|
+
include Virtus.value_object
|
6
|
+
|
7
|
+
attribute :connection
|
8
|
+
attribute :id, String
|
9
|
+
attribute :all, Array, :default => []
|
10
|
+
|
11
|
+
def_delegator :all, :each
|
12
|
+
def_delegator :all, :size
|
13
|
+
|
14
|
+
def fetch(_options = {})
|
15
|
+
@all = []
|
16
|
+
parse_fetch_response(connection.get("panels/#{id}/members"))
|
17
|
+
self
|
18
|
+
end
|
19
|
+
|
20
|
+
def create(panel_members)
|
21
|
+
res = connection
|
22
|
+
.post("panels/#{id}/members", connection.params.merge(panelMembers: panel_members.to_json))
|
23
|
+
.body["result"]
|
24
|
+
import_id = res['importStatus'].split('/').last
|
25
|
+
QualtricsAPI::PanelImport.new(id: import_id, panel_id: id, connection: connection)
|
26
|
+
end
|
27
|
+
|
28
|
+
def [](member_id)
|
29
|
+
find(member_id)
|
30
|
+
end
|
31
|
+
|
32
|
+
def find(member_id)
|
33
|
+
@all.detect do |panel_member|
|
34
|
+
panel_member.id == member_id
|
35
|
+
end || QualtricsAPI::PanelMember.new(:id => member_id, connection: connection)
|
36
|
+
end
|
37
|
+
|
38
|
+
private
|
39
|
+
|
40
|
+
def parse_fetch_response(response)
|
41
|
+
@all = response.body["result"].map do |result|
|
42
|
+
QualtricsAPI::PanelMember.new(result.merge(connection: connection))
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -15,9 +15,9 @@ module QualtricsAPI
|
|
15
15
|
end
|
16
16
|
|
17
17
|
def find(export_id)
|
18
|
-
@all.
|
18
|
+
@all.detect do |response_export|
|
19
19
|
response_export.id == export_id
|
20
|
-
end
|
20
|
+
end || QualtricsAPI::ResponseExport.new(:id => export_id, connection: connection)
|
21
21
|
end
|
22
22
|
end
|
23
23
|
end
|
data/lib/qualtrics_api/survey.rb
CHANGED
@@ -10,8 +10,6 @@ module QualtricsAPI
|
|
10
10
|
attribute :created_at, String
|
11
11
|
attribute :status, String
|
12
12
|
|
13
|
-
attr_accessor :id, :name, :owner_id, :last_modified, :status, :created_at
|
14
|
-
|
15
13
|
def initialize(options = {})
|
16
14
|
attributes_mappings.each do |key, qualtrics_key|
|
17
15
|
instance_variable_set "@#{key}", options[qualtrics_key]
|
@@ -35,9 +35,9 @@ module QualtricsAPI
|
|
35
35
|
end
|
36
36
|
|
37
37
|
def find(survey_id)
|
38
|
-
@all.
|
38
|
+
@all.detect do |survey|
|
39
39
|
survey.id == survey_id
|
40
|
-
end
|
40
|
+
end || QualtricsAPI::Survey.new("id" => survey_id, connection: connection)
|
41
41
|
end
|
42
42
|
|
43
43
|
private
|
@@ -0,0 +1,77 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe QualtricsAPI::PanelCollection do
|
4
|
+
let(:connection) { double('connection') }
|
5
|
+
|
6
|
+
subject { described_class.new connection: connection }
|
7
|
+
|
8
|
+
it "has no @all when initialized" do
|
9
|
+
expect(subject.all).to eq []
|
10
|
+
end
|
11
|
+
|
12
|
+
it "takes a connection" do
|
13
|
+
expect(subject.connection).to eq connection
|
14
|
+
end
|
15
|
+
|
16
|
+
describe "#find, #[]" do
|
17
|
+
let(:panel_1) { QualtricsAPI::Panel.new "panelId" => "p1" }
|
18
|
+
let(:panel_2) { QualtricsAPI::Panel.new "panelId" => "p2" }
|
19
|
+
|
20
|
+
it "finds the panel by id" do
|
21
|
+
subject.instance_variable_set :@all, [panel_1, panel_2]
|
22
|
+
expect(subject.find("p1")).to eq panel_1
|
23
|
+
expect(subject["p2"]).to eq panel_2
|
24
|
+
end
|
25
|
+
|
26
|
+
it "returns a new panel with the id" do
|
27
|
+
new_panel = subject["p3"]
|
28
|
+
expect(new_panel).to be_a QualtricsAPI::Panel
|
29
|
+
expect(new_panel.id).to eq "p3"
|
30
|
+
expect(new_panel.connection).to eq connection
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
describe "integration" do
|
35
|
+
let(:client) { QualtricsAPI.new TEST_API_TOKEN }
|
36
|
+
|
37
|
+
subject { described_class.new connection: client.connection }
|
38
|
+
|
39
|
+
describe "#fetch" do
|
40
|
+
describe "when success" do
|
41
|
+
before do
|
42
|
+
expect(subject.size).to eq 0
|
43
|
+
end
|
44
|
+
|
45
|
+
let!(:result) do
|
46
|
+
VCR.use_cassette("panel_collection_fetch_success") do
|
47
|
+
subject.fetch
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
it "populates the collection" do
|
52
|
+
expect(subject.size).to eq 1
|
53
|
+
expect(subject.first).to be_a QualtricsAPI::Panel
|
54
|
+
end
|
55
|
+
|
56
|
+
it "passes down the connection" do
|
57
|
+
expect(subject.all.first.connection).to eq client.connection
|
58
|
+
end
|
59
|
+
|
60
|
+
it "returns itself" do
|
61
|
+
expect(result).to eq subject
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
describe "when failed" do
|
66
|
+
it "resets panels" do
|
67
|
+
subject.instance_variable_set :@all, [QualtricsAPI::Panel.new({})]
|
68
|
+
expect {
|
69
|
+
VCR.use_cassette("panel_collection_fetch_fail") do
|
70
|
+
subject.fetch rescue nil
|
71
|
+
end
|
72
|
+
}.to change { subject.all }.to([])
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe QualtricsAPI::PanelImport do
|
4
|
+
describe "integration" do
|
5
|
+
let(:connection) { QualtricsAPI.new(TEST_API_TOKEN).connection }
|
6
|
+
subject { described_class.new(id: 'PGRS_bEJLYLkqMBs8Bwx', panel_id: 'ML_bC2c5xBz1DxyOYB', connection: connection) }
|
7
|
+
|
8
|
+
describe "#update_status" do
|
9
|
+
let(:result) do
|
10
|
+
VCR.use_cassette('panel_import_update_success') do
|
11
|
+
subject.update_status
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
it "updates status" do
|
16
|
+
expect(result.status).to eq('100.0%')
|
17
|
+
end
|
18
|
+
|
19
|
+
it "updates percent completed" do
|
20
|
+
expect(result.percent_completed).to eq(100.0)
|
21
|
+
end
|
22
|
+
|
23
|
+
it "updates completed" do
|
24
|
+
expect(result.completed?).to be_truthy
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,115 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe QualtricsAPI::PanelMemberCollection do
|
4
|
+
let(:connection) { double('connection') }
|
5
|
+
|
6
|
+
subject { described_class.new connection: connection }
|
7
|
+
|
8
|
+
it "has no @all when initialized" do
|
9
|
+
expect(subject.all).to eq []
|
10
|
+
end
|
11
|
+
|
12
|
+
it "takes a connection" do
|
13
|
+
expect(subject.connection).to eq connection
|
14
|
+
end
|
15
|
+
|
16
|
+
describe "#find, #[]" do
|
17
|
+
let(:panel_member_1) { QualtricsAPI::PanelMember.new("panelMemberId" => "p1") }
|
18
|
+
let(:panel_member_2) { QualtricsAPI::PanelMember.new("panelMemberId" => "p2") }
|
19
|
+
|
20
|
+
it "finds the panel member by id" do
|
21
|
+
subject.instance_variable_set :@all, [panel_member_1, panel_member_2]
|
22
|
+
expect(subject.find("p1")).to eq panel_member_1
|
23
|
+
expect(subject["p2"]).to eq panel_member_2
|
24
|
+
end
|
25
|
+
|
26
|
+
it "returns a new panel with the id" do
|
27
|
+
new_panel_member = subject["p3"]
|
28
|
+
expect(new_panel_member).to be_a QualtricsAPI::PanelMember
|
29
|
+
expect(new_panel_member.id).to eq "p3"
|
30
|
+
expect(new_panel_member.connection).to eq connection
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
describe "integration" do
|
35
|
+
let(:client) { QualtricsAPI.new TEST_API_TOKEN }
|
36
|
+
|
37
|
+
subject { described_class.new(connection: client.connection, id: 'ABCD') }
|
38
|
+
|
39
|
+
describe "#fetch" do
|
40
|
+
describe "when success" do
|
41
|
+
before do
|
42
|
+
expect(subject.size).to eq 0
|
43
|
+
end
|
44
|
+
|
45
|
+
let!(:result) do
|
46
|
+
VCR.use_cassette("panel_member_collection_fetch_success") do
|
47
|
+
subject.fetch
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
it "populates the collection" do
|
52
|
+
expect(subject.size).to eq 1
|
53
|
+
expect(subject.first).to be_a QualtricsAPI::PanelMember
|
54
|
+
end
|
55
|
+
|
56
|
+
it "passes down the connection" do
|
57
|
+
expect(subject.all.first.connection).to eq client.connection
|
58
|
+
end
|
59
|
+
|
60
|
+
it "returns itself" do
|
61
|
+
expect(result).to eq subject
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
describe "when failed" do
|
66
|
+
it "resets panels" do
|
67
|
+
subject.instance_variable_set :@all, [QualtricsAPI::PanelMember.new({})]
|
68
|
+
expect do
|
69
|
+
VCR.use_cassette("panel_member_collection_fetch_fail") do
|
70
|
+
expect { subject.fetch }.to raise_error
|
71
|
+
end
|
72
|
+
end.to change { subject.all }.to([])
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
describe "#create" do
|
78
|
+
let(:result) do
|
79
|
+
VCR.use_cassette(cassette) do
|
80
|
+
QualtricsAPI.new(TEST_API_TOKEN).panels.fetch['ML_bC2c5xBz1DxyOYB'].members.create(panel_members)
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
describe "when success" do
|
85
|
+
let(:cassette) { "panel_member_collection_create_success" }
|
86
|
+
let(:panel_members) { [QualtricsAPI::PanelMember.new(first_name: 'Marcin', last_name: 'Naglik', email: 'test@test.com')] }
|
87
|
+
|
88
|
+
it "returns PanelImport" do
|
89
|
+
expect(result).to be_a QualtricsAPI::PanelImport
|
90
|
+
end
|
91
|
+
|
92
|
+
it "returns PanelImport with id" do
|
93
|
+
expect(result.id).to eq('PGRS_bEJLYLkqMBs8Bwx')
|
94
|
+
end
|
95
|
+
|
96
|
+
it "returns PanelImport with panel id" do
|
97
|
+
expect(result.panel_id).to eq('ML_bC2c5xBz1DxyOYB')
|
98
|
+
end
|
99
|
+
|
100
|
+
it "returns PanelImport with connection" do
|
101
|
+
expect(result.connection).not_to be_nil
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
describe "when failed" do
|
106
|
+
let(:cassette) { "panel_member_collection_create_fail" }
|
107
|
+
let(:panel_members) { [QualtricsAPI::PanelMember.new] }
|
108
|
+
|
109
|
+
it "returns results" do
|
110
|
+
expect { result }.to raise_error
|
111
|
+
end
|
112
|
+
end
|
113
|
+
end
|
114
|
+
end
|
115
|
+
end
|
@@ -0,0 +1,66 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe QualtricsAPI::PanelMember do
|
4
|
+
let(:panel_member) do
|
5
|
+
{
|
6
|
+
"panelMemberId" => "ML_abcdefg",
|
7
|
+
"firstName" => "Thom",
|
8
|
+
"lastName" => "Yorke",
|
9
|
+
"email" => "thom@radiohead.com",
|
10
|
+
"language" => "EN",
|
11
|
+
"unsubscribed" => 1,
|
12
|
+
"externalDataReference" => "1234",
|
13
|
+
"embeddedData" => { "a" => "b", "b" => "c" }
|
14
|
+
}
|
15
|
+
end
|
16
|
+
|
17
|
+
let(:connection) { double('connection', get: {}) }
|
18
|
+
subject { described_class.new panel_member.merge(connection: connection) }
|
19
|
+
|
20
|
+
it "has a panel member id" do
|
21
|
+
expect(subject.id).to eq(panel_member["panelMemberId"])
|
22
|
+
end
|
23
|
+
|
24
|
+
it "has a first name" do
|
25
|
+
expect(subject.first_name).to eq(panel_member["firstName"])
|
26
|
+
end
|
27
|
+
|
28
|
+
it "has a last name" do
|
29
|
+
expect(subject.last_name).to eq(panel_member["lastName"])
|
30
|
+
end
|
31
|
+
|
32
|
+
it "has an email" do
|
33
|
+
expect(subject.email).to eq(panel_member["email"])
|
34
|
+
end
|
35
|
+
|
36
|
+
it "has language" do
|
37
|
+
expect(subject.language).to eq(panel_member["language"])
|
38
|
+
end
|
39
|
+
|
40
|
+
it "has unsubscribed flag" do
|
41
|
+
expect(subject.unsubscribed).to eq(panel_member["unsubscribed"])
|
42
|
+
end
|
43
|
+
|
44
|
+
it "has external data reference" do
|
45
|
+
expect(subject.external_data_reference).to eq(panel_member["externalDataReference"])
|
46
|
+
end
|
47
|
+
|
48
|
+
it "has embedded data" do
|
49
|
+
expect(subject.embeded_data).to eq(panel_member["embeddedData"])
|
50
|
+
end
|
51
|
+
|
52
|
+
context "#to_json" do
|
53
|
+
let(:members) { [subject].to_json }
|
54
|
+
it "serialize array of panel members" do
|
55
|
+
expect(JSON.parse(members)).to eq(
|
56
|
+
[{ "PanelMemberId" => "ML_abcdefg",
|
57
|
+
"FirstName" => "Thom",
|
58
|
+
"LastName" => "Yorke",
|
59
|
+
"Email" => "thom@radiohead.com",
|
60
|
+
"Language" => "EN",
|
61
|
+
"Unsubscribed" => 1,
|
62
|
+
"ExternalDataReference" => "1234",
|
63
|
+
"EmbeddedData" => { "a" => "b", "b" => "c" } }])
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe QualtricsAPI::Panel do
|
4
|
+
let(:qualtrics_response) do
|
5
|
+
{
|
6
|
+
"panelid" => "ML_bseUhQDwAJolD1j",
|
7
|
+
"name" => "Master Panel",
|
8
|
+
"libraryId" => "GR_2aaKA1aGidXQtOA",
|
9
|
+
"category" => "Unassigned"
|
10
|
+
}
|
11
|
+
end
|
12
|
+
|
13
|
+
let(:connection) { double('connection', get: {}) }
|
14
|
+
|
15
|
+
subject { described_class.new qualtrics_response.merge(connection: connection) }
|
16
|
+
|
17
|
+
it "has an panelId" do
|
18
|
+
expect(subject.id).to eq qualtrics_response["panelId"]
|
19
|
+
end
|
20
|
+
|
21
|
+
it "has a name" do
|
22
|
+
expect(subject.name).to eq qualtrics_response["name"]
|
23
|
+
end
|
24
|
+
|
25
|
+
it "has an libraryId" do
|
26
|
+
expect(subject.library_id).to eq qualtrics_response["libraryId"]
|
27
|
+
end
|
28
|
+
|
29
|
+
it "has a category" do
|
30
|
+
expect(subject.category).to eq qualtrics_response["category"]
|
31
|
+
end
|
32
|
+
|
33
|
+
it "has a connection" do
|
34
|
+
expect(subject.connection).to eq(connection)
|
35
|
+
end
|
36
|
+
|
37
|
+
describe "#members" do
|
38
|
+
it "returns a PanelMemberCollection" do
|
39
|
+
expect(subject.members).to be_a QualtricsAPI::PanelMemberCollection
|
40
|
+
end
|
41
|
+
|
42
|
+
it "sets connection" do
|
43
|
+
expect(subject.members.connection).to eq subject.connection
|
44
|
+
end
|
45
|
+
|
46
|
+
it "assigns panel id" do
|
47
|
+
expect(subject.members.id).to eq subject.id
|
48
|
+
end
|
49
|
+
|
50
|
+
it "caches the members" do
|
51
|
+
expect(subject.members.object_id).to eq subject.members.object_id
|
52
|
+
end
|
53
|
+
end
|
54
|
+
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.3
|
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-06-
|
13
|
+
date: 2015-06-30 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: faraday
|
@@ -143,6 +143,13 @@ files:
|
|
143
143
|
- LICENSE.txt
|
144
144
|
- README.md
|
145
145
|
- Rakefile
|
146
|
+
- fixtures/vcr_cassettes/panel_collection_fetch_fail.yml
|
147
|
+
- fixtures/vcr_cassettes/panel_collection_fetch_success.yml
|
148
|
+
- fixtures/vcr_cassettes/panel_import_update_success.yml
|
149
|
+
- fixtures/vcr_cassettes/panel_member_collection_create_fail.yml
|
150
|
+
- fixtures/vcr_cassettes/panel_member_collection_create_success.yml
|
151
|
+
- fixtures/vcr_cassettes/panel_member_collection_fetch_fail.yml
|
152
|
+
- fixtures/vcr_cassettes/panel_member_collection_fetch_success.yml
|
146
153
|
- fixtures/vcr_cassettes/response_export_start_success.yml
|
147
154
|
- fixtures/vcr_cassettes/response_export_update_success.yml
|
148
155
|
- fixtures/vcr_cassettes/survey_collection_fetch_fail.yml
|
@@ -150,6 +157,11 @@ files:
|
|
150
157
|
- fixtures/vcr_cassettes/survey_collection_fetch_with_scopeId_success.yml
|
151
158
|
- lib/qualtrics_api.rb
|
152
159
|
- lib/qualtrics_api/client.rb
|
160
|
+
- lib/qualtrics_api/panel.rb
|
161
|
+
- lib/qualtrics_api/panel_collection.rb
|
162
|
+
- lib/qualtrics_api/panel_import.rb
|
163
|
+
- lib/qualtrics_api/panel_member.rb
|
164
|
+
- lib/qualtrics_api/panel_member_collection.rb
|
153
165
|
- lib/qualtrics_api/request_error_handler.rb
|
154
166
|
- lib/qualtrics_api/response_export.rb
|
155
167
|
- lib/qualtrics_api/response_export_collection.rb
|
@@ -160,6 +172,11 @@ files:
|
|
160
172
|
- lib/qualtrics_api/version.rb
|
161
173
|
- qualtrics_api.gemspec
|
162
174
|
- spec/lib/client_spec.rb
|
175
|
+
- spec/lib/panel_collection_spec.rb
|
176
|
+
- spec/lib/panel_import_spec.rb
|
177
|
+
- spec/lib/panel_member_collection_spec.rb
|
178
|
+
- spec/lib/panel_member_spec.rb
|
179
|
+
- spec/lib/panel_spec.rb
|
163
180
|
- spec/lib/response_export_collection_spec.rb
|
164
181
|
- spec/lib/response_export_spec.rb
|
165
182
|
- spec/lib/services/response_export_service_spec.rb
|
@@ -193,6 +210,11 @@ specification_version: 4
|
|
193
210
|
summary: A Ruby wrapper for Qualtrics REST API v3.0
|
194
211
|
test_files:
|
195
212
|
- spec/lib/client_spec.rb
|
213
|
+
- spec/lib/panel_collection_spec.rb
|
214
|
+
- spec/lib/panel_import_spec.rb
|
215
|
+
- spec/lib/panel_member_collection_spec.rb
|
216
|
+
- spec/lib/panel_member_spec.rb
|
217
|
+
- spec/lib/panel_spec.rb
|
196
218
|
- spec/lib/response_export_collection_spec.rb
|
197
219
|
- spec/lib/response_export_spec.rb
|
198
220
|
- spec/lib/services/response_export_service_spec.rb
|