roqua-rom-api 0.1.7 → 0.1.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 881dd5c16f0143f91608a347ffb8c53db068158b
4
- data.tar.gz: 46dec1b7bef8b9c165318bca401707dc8cee143b
3
+ metadata.gz: ce8decd48dd3da616e6eb16c463ecc8f8603f104
4
+ data.tar.gz: 2bde7738950a4b361b882a06c50a4752475f6960
5
5
  SHA512:
6
- metadata.gz: dc6f22a64c1b796dd5005ce4d05a623ddce36cf61e5467e3871781759bfbc456b69155527deaaf41b51c59e94c440b591b8bc4693431dfa2de4fd01d2c2d2d64
7
- data.tar.gz: 881c3a68d08afb1eb48eabe34af902b34f3126ea3f10ef7f15e4a7af069af785671d72d0f3b2d0414f4651f52a813fb68f9eaf1e553f5990a1093dc441f3246e
6
+ metadata.gz: c5e0f2e97f3f2f7d17f06b7a45bf4a4d437cb258f17620ce6590effa94ae12e153d06e822c93117a3b08ff55adaa81944bf34535d33842ae8f5cd4c47ac6a8c6
7
+ data.tar.gz: 1ffdcdf567b1372c7e42f6f1fbc86ddcf232e258feb0ee19a7ce92ea6cf63f344efc6f3d0569e9c34d5fd8b5661d538a9d6f4567f0ed85350ac4fe469af3d9ab
data/ChangeLog.md CHANGED
@@ -1,3 +1,7 @@
1
+ ### 0.1.8 / 2014-09-22
2
+
3
+ * Add API endpoint for creating responses
4
+
1
5
  ### 0.1.7 / 2014-07-10
2
6
 
3
7
  * Add id to responses api
data/Guardfile CHANGED
@@ -6,4 +6,3 @@ guard :rspec, cmd: 'bundle exec rspec --format Fuubar --colour', failed_mode: :n
6
6
  watch(%r{^lib/(.+)\.rb$}) { |m| "spec/lib/#{m[1]}_spec.rb" }
7
7
  watch('spec/spec_helper.rb') { "spec" }
8
8
  end
9
-
data/README.md CHANGED
@@ -25,13 +25,13 @@ To create a fill out request run:
25
25
 
26
26
  #### Parameters
27
27
 
28
- * `dossier_id` [Required] - Unique dossier identifier string for the patient about to fill out questionnaires
29
- * `questionnaire_keys [Required] - Array of keys of questionnaires to fill out
30
- * open_from - Time the patient can start filling out the questionnaires and time.
31
- * open_till - Time the patient can no longer fill in the questionnaire.
32
- * callback_url [Required] - Url for event callbacks
33
- * reminders - Array of durations after which a reminder should be sent if fill_out_request has not been finished.
34
- * respondent_type - Defaults to 'patient_version', each type is a separate list of questionnaires to fill out.
28
+ * `dossier_id:` [Required] - Unique dossier identifier string for the patient about to fill out questionnaires
29
+ * `questionnaire_keys:` [Required] - Array of keys of questionnaires to fill out
30
+ * `open_from:` Time the patient can start filling out the questionnaires and time.
31
+ * `open_till:` Time the patient can no longer fill in the questionnaire.
32
+ * `callback_url:` [Required] - Url for event callbacks
33
+ * `reminders:` Array of durations after which a reminder should be sent if fill_out_request has not been finished.
34
+ * `respondent_type:` Defaults to 'patient_version', each type is a separate list of questionnaires to fill out.
35
35
 
36
36
 
37
37
  ## Fill Out Sessions
@@ -45,8 +45,8 @@ To start filling out a set of questionnaires run:
45
45
  #### Parameters
46
46
 
47
47
  * `dossier_id:` [Required] - Unique dossier identifier for the patient about to fill out a questionnaire.
48
- * `questionnaire_keys:` - Array of keys uniquely identifying the questionnaires to be filled out.
49
- * `response_ids:` - Array of ids uniquely identifying aborted responses for which filling out has to be resumed.
48
+ * `questionnaire_keys:` Array of keys uniquely identifying the questionnaires to be filled out.
49
+ * `response_ids:` Array of ids uniquely identifying aborted responses for which filling out has to be resumed.
50
50
  * `return_to:` [Required] - Address to return to after filling out the questionnaire.
51
51
 
52
52
  When questionnaire keys are provided, a set of blank questionnaires will be filled out. When response ids are provided,
@@ -134,6 +134,8 @@ Else the validation errors can be inspected:
134
134
 
135
135
  ## Responses
136
136
 
137
+ ### Index
138
+
137
139
  To retrieve filled out, pending or scheduled questionnaires run:
138
140
 
139
141
  outcome = Roqua::RomApi::ListResponses.run dossier_id: dossier_id
@@ -153,6 +155,34 @@ Else some validation errors can be shown:
153
155
  log_or_display outcome.errors.full_messages
154
156
  end
155
157
 
158
+ ### Create
159
+
160
+ To store an externally filled out questionnaire run:
161
+
162
+ outcome = Roqua::RomApi::CreateResponse.run questionnaire_key: 'questionnaire_key',
163
+ dossier_id: 'dossier_id',
164
+ answer_data: {some: 'aswer_data'}
165
+
166
+ #### Parameters
167
+
168
+ * `questionnaire_key:` [Required] - Key uniquely identifying the questionnaire in RoQua
169
+ * `dossier_id:` [Required] - Unique dossier identifier for the patient you want to store the questionnaire for
170
+ * `answer_data:` [Required] - Hash storing the answered option key for every question key
171
+ * `filled_out_at:` Timestamp indicating the time the questionnaire was filled out
172
+ * `respondent:` ['patient'(default)|'parent'|'second_parent'|'teacher'|'caregiver']
173
+ - String identifying the respondent which filled out the questionnaire
174
+
175
+ When the request succeeds, the stored response is returned:
176
+
177
+ if outcome.valid?
178
+ responses = outcome.result
179
+
180
+ Else some validation errors are provided:
181
+
182
+ else
183
+ log_or_display outcome.errors.full_messages
184
+ end
185
+
156
186
  ## Contributing to roqua-rom-api
157
187
 
158
188
  * Check out the latest master to make sure the feature hasn't been implemented or the bug hasn't been fixed yet.
data/lib/i18n/i18n.rb CHANGED
@@ -1,12 +1,15 @@
1
+ # rubocop:disable HandleExceptions
1
2
  begin
2
3
  require 'rails'
3
4
  module I18n
4
5
  class Railtie < ::Rails::Railtie #:nodoc:
5
- initializer 'rails-i18n' do |app|
6
+ initializer 'rails-i18n' do |_app|
6
7
  I18n.load_path << Dir[File.join(File.expand_path(File.dirname(__FILE__) + '/../../config/locales'), '*.yml')]
7
8
  I18n.load_path.flatten!
8
9
  end
9
10
  end
10
11
  end
11
12
  rescue LoadError
13
+ # No I18n is set up as rails is not installed
12
14
  end
15
+ # rubocop:enable HandleExceptions
data/lib/roqua/rom_api.rb CHANGED
@@ -5,10 +5,12 @@ require 'roqua/rom_api/models'
5
5
  require 'roqua/rom_api/endpoint'
6
6
  require 'roqua/rom_api/list_protocol_subscriptions'
7
7
  require 'roqua/rom_api/list_responses'
8
+ require 'roqua/rom_api/create_response'
8
9
  require 'roqua/rom_api/start_fill_out_session'
9
10
  require 'roqua/rom_api/create_fill_out_request'
10
11
  require 'roqua/rom_api/start_protocol_subscription'
11
12
  require 'roqua/rom_api/stop_protocol_subscription'
13
+ require 'roqua/rom_api/report_calculations'
12
14
 
13
15
  module Roqua
14
16
  module RomApi
@@ -3,7 +3,7 @@ module Roqua
3
3
  # @api private
4
4
  class CreateFillOutRequest < Endpoint
5
5
  string :dossier_id
6
- array :questionnaire_keys, default: [] do string end
6
+ array :questionnaire_keys, default: [] { string }
7
7
  string :respondent_type, default: nil
8
8
  string :callback_url
9
9
  array :reminders, default: []
@@ -12,15 +12,16 @@ module Roqua
12
12
 
13
13
  def execute
14
14
  validate_response_for do
15
- RomApi.basic_auth_session.post("/dossiers/#{dossier_id}/fill_out_requests", fill_out_request: {
16
- questionnaire_keys: questionnaire_keys,
17
- respondent_type: respondent_type,
18
- callback_url: callback_url,
19
- reminders: reminders,
20
- open_from: open_from && open_from.to_i,
21
- open_till: open_till && open_till.to_i
22
- }.keep_if { |k, v| v.present? } )
23
-
15
+ fill_out_request = {
16
+ questionnaire_keys: questionnaire_keys,
17
+ respondent_type: respondent_type,
18
+ callback_url: callback_url,
19
+ reminders: reminders,
20
+ open_from: open_from && open_from.to_i,
21
+ open_till: open_till && open_till.to_i
22
+ }.keep_if { |_k, v| v.present? }
23
+ RomApi.basic_auth_session.post("/dossiers/#{dossier_id}/fill_out_requests",
24
+ fill_out_request: fill_out_request)
24
25
  end
25
26
  end
26
27
 
@@ -0,0 +1,26 @@
1
+ module Roqua
2
+ module RomApi
3
+ # @api private
4
+ class CreateResponse < Endpoint
5
+ string :questionnaire_key
6
+ string :dossier_id
7
+ hash :answer_data, strip: false
8
+ time :filled_out_at, default: nil
9
+ string :respondent, default: nil
10
+
11
+ def execute
12
+ validate_response_for do
13
+ RomApi.basic_auth_session.post "/dossiers/#{dossier_id}/responses",
14
+ questionnaire_key: questionnaire_key,
15
+ answer_data: answer_data,
16
+ filled_out_at: filled_out_at.to_i,
17
+ respondent: respondent
18
+ end
19
+ end
20
+
21
+ def response_to_result(response)
22
+ Models::Response.new(response)
23
+ end
24
+ end
25
+ end
26
+ end
@@ -10,7 +10,6 @@ module Roqua
10
10
  attribute :stop_at, DateTime
11
11
  attribute :protocol_key, String
12
12
  attribute :protocol_name, String
13
-
14
13
  end
15
14
  end
16
15
  end
@@ -0,0 +1,39 @@
1
+ module Roqua
2
+ module RomApi
3
+ # @api private
4
+ class ReportCalculations < Endpoint
5
+ string :dossier_id
6
+ string :calculator
7
+ array(:response_ids, default: nil) { string }
8
+ array(:questionnaire_keys, default: nil) { string }
9
+ time :completed_after, default: nil
10
+ time :completed_before, default: nil
11
+
12
+ validates :questionnaire_keys, presence: true, unless: 'response_ids.present?'
13
+
14
+ def execute
15
+ validate_response_for do
16
+ RomApi.basic_auth_session.get "/dossiers/#{dossier_id}/report_calculations", params
17
+ end
18
+ end
19
+
20
+ private
21
+
22
+ def params
23
+ {calculator: calculator}.merge(filter_params)
24
+ end
25
+
26
+ def filter_params
27
+ if response_ids.present?
28
+ {response_ids: response_ids}
29
+ else
30
+ {filters: {
31
+ questionnaire_keys: questionnaire_keys,
32
+ completed_after: completed_after && completed_after.to_i,
33
+ completed_before: completed_before && completed_before.to_i
34
+ }}.keep_if { |_k, v| v.present? }
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
@@ -3,8 +3,8 @@ module Roqua
3
3
  # @api private
4
4
  class StartFillOutSession < Endpoint
5
5
  string :dossier_id
6
- array :questionnaire_keys, default: [] do string end
7
- array :response_ids, default: [] do integer end
6
+ array :questionnaire_keys, default: [] { string }
7
+ array :response_ids, default: [] { integer }
8
8
  string :return_to
9
9
  string :stylesheet, default: nil
10
10
 
@@ -1,5 +1,5 @@
1
1
  module Roqua
2
2
  module RomApi
3
- VERSION = '0.1.7'
3
+ VERSION = '0.1.8'
4
4
  end
5
5
  end
@@ -1,13 +1,17 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe CreateFillOutRequest do
4
- let(:options) { {dossier_id: 'some_dossier_id',
5
- questionnaire_keys: ['qkey1', 'qkey2'],
6
- respondent_type: 'patient_version',
7
- callback_url: 'http://callback.url',
8
- reminders: [1000, 2000],
9
- open_from: Time.now,
10
- open_till: Time.now + 100_000} }
4
+ let(:options) do
5
+ {
6
+ dossier_id: 'some_dossier_id',
7
+ questionnaire_keys: ['qkey1', 'qkey2'],
8
+ respondent_type: 'patient_version',
9
+ callback_url: 'http://callback.url',
10
+ reminders: [1000, 2000],
11
+ open_from: Time.now,
12
+ open_till: Time.now + 100_000
13
+ }
14
+ end
11
15
  let(:session) { Sessions::BasicAuthSession.new }
12
16
  let(:response) { httparty_response({}) }
13
17
  before do
@@ -15,14 +19,17 @@ describe CreateFillOutRequest do
15
19
  allow(session).to receive(:post).and_return response
16
20
  end
17
21
 
18
- it 'does a post to the rom fill_out_sessions api' do
19
- expect(session).to receive(:post).with("/dossiers/#{options[:dossier_id]}/fill_out_requests", fill_out_request: {
20
- questionnaire_keys: options[:questionnaire_keys],
21
- respondent_type: options[:respondent_type],
22
- callback_url: options[:callback_url],
23
- reminders: options[:reminders],
24
- open_from: options[:open_from].to_i,
25
- open_till: options[:open_till].to_i})
22
+ it 'does a post to the rom fill_out_requests api' do
23
+ fill_out_request = {
24
+ questionnaire_keys: options[:questionnaire_keys],
25
+ respondent_type: options[:respondent_type],
26
+ callback_url: options[:callback_url],
27
+ reminders: options[:reminders],
28
+ open_from: options[:open_from].to_i,
29
+ open_till: options[:open_till].to_i
30
+ }
31
+ expect(session).to receive(:post).with("/dossiers/#{options[:dossier_id]}/fill_out_requests",
32
+ fill_out_request: fill_out_request)
26
33
  CreateFillOutRequest.run!(options)
27
34
  end
28
35
 
@@ -37,7 +44,7 @@ describe CreateFillOutRequest do
37
44
  options[:open_from] = nil
38
45
  options[:open_till] = nil
39
46
  options[:reminders] = nil
40
- expect(session).to receive(:post) do |path, args|
47
+ expect(session).to receive(:post) do |_path, args|
41
48
  expect(args[:fill_out_request][:open_from]).to eq nil
42
49
  expect(args[:fill_out_request][:open_till]).to eq nil
43
50
  expect(args[:fill_out_request][:reminders]).to eq nil
@@ -0,0 +1,33 @@
1
+ require 'spec_helper'
2
+
3
+ describe CreateResponse do
4
+ let(:session) { Sessions::BasicAuthSession.new }
5
+ let(:response) { httparty_response(questionnaire_name: 'Some Questionnaire') }
6
+ before do
7
+ allow(Sessions::BasicAuthSession).to receive(:new).and_return session
8
+ allow(session).to receive(:post).and_return response
9
+ end
10
+
11
+ it 'does a post to the rom responses api' do
12
+ filled_out_at = Time.now
13
+ expect(session).to receive(:post).with '/dossiers/some_dossier_id/responses',
14
+ questionnaire_key: 'some_questionnaire_key',
15
+ answer_data: {some: 'answer_data'},
16
+ filled_out_at: filled_out_at.to_i,
17
+ respondent: 'patient'
18
+ CreateResponse.run! dossier_id: 'some_dossier_id',
19
+ questionnaire_key: 'some_questionnaire_key',
20
+ answer_data: {some: 'answer_data'},
21
+ filled_out_at: filled_out_at,
22
+ respondent: 'patient'
23
+ end
24
+
25
+ it 'returns a response object' do
26
+ response = CreateResponse.run! dossier_id: 'some_dossier_id',
27
+ questionnaire_key: 'some_questionnaire_key',
28
+ answer_data: {some: 'answer_data'},
29
+ respondent: 'patient'
30
+ expect(response).to be_a(Response)
31
+ expect(response.questionnaire_name).to eq('Some Questionnaire')
32
+ end
33
+ end
@@ -0,0 +1,52 @@
1
+ require 'spec_helper'
2
+
3
+ describe ReportCalculations do
4
+ let(:options) { {dossier_id: '1', calculator: 'calc'} }
5
+ let(:api_path) { "/dossiers/#{options[:dossier_id]}/report_calculations" }
6
+ let(:response) { httparty_response('foo' => 'bar') }
7
+ let(:session) { Fabricate :basic_auth_session }
8
+
9
+ before do
10
+ allow(BasicAuthSession).to receive(:new).and_return session
11
+ allow(session).to receive(:get).and_return response
12
+ end
13
+
14
+ subject { ReportCalculations.run!(options) }
15
+
16
+ describe 'given a list of response_ids' do
17
+ let(:options) { {dossier_id: '1', response_ids: ['1', '2'], calculator: 'calc'} }
18
+
19
+ it 'returns the response' do
20
+ expect(subject).to eq('foo' => 'bar')
21
+ end
22
+
23
+ it 'calls the right url' do
24
+ expect(session).to receive(:get).with(api_path, options.slice(:calculator, :response_ids))
25
+ subject
26
+ end
27
+ end
28
+
29
+ describe 'given a list of questionnaire_keys' do
30
+ let(:filters) { {questionnaire_keys: ['q1', 'q2'],
31
+ completed_after: Time.now - 100_000, completed_before: Time.now} }
32
+ let(:options) { {dossier_id: '1', calculator: 'test'}.merge(filters) }
33
+
34
+ it 'calls the right url' do
35
+ filter_hash = {
36
+ questionnaire_keys: filters[:questionnaire_keys],
37
+ completed_after: filters[:completed_after].to_i,
38
+ completed_before: filters[:completed_before].to_i
39
+ }
40
+ expect(session).to receive(:get).with(api_path, calculator: 'test', filters: filter_hash)
41
+ subject
42
+ end
43
+ end
44
+
45
+ describe 'given neither response_ids or questionnaire_keys' do
46
+ let(:options) { {dossier_id: '1', calculator: 'calc'} }
47
+
48
+ it 'should add an attr missing error' do
49
+ expect { subject }.to raise_error(ActiveInteraction::InvalidInteractionError)
50
+ end
51
+ end
52
+ end
@@ -1,8 +1,14 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe StartFillOutSession do
4
- let(:options) { {dossier_id: 'some_dossier_id', questionnaire_keys: ['some_key'],
5
- return_to: '/some/return/url', stylesheet: 'https://example.org/stylesheet.css'} }
4
+ let(:options) do
5
+ {
6
+ dossier_id: 'some_dossier_id',
7
+ questionnaire_keys: ['some_key'],
8
+ return_to: '/some/return/url',
9
+ stylesheet: 'https://example.org/stylesheet.css'
10
+ }
11
+ end
6
12
  let(:session) { Sessions::BasicAuthSession.new }
7
13
  let(:response) { httparty_response 'fill_out_url' => 'some_fill_out_url' }
8
14
  before do
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: roqua-rom-api
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.7
4
+ version: 0.1.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - Samuel Esposito
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-07-10 00:00:00.000000000 Z
11
+ date: 2014-09-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: httparty
@@ -142,12 +142,14 @@ files:
142
142
  - lib/roqua-rom-api.rb
143
143
  - lib/roqua/rom_api.rb
144
144
  - lib/roqua/rom_api/create_fill_out_request.rb
145
+ - lib/roqua/rom_api/create_response.rb
145
146
  - lib/roqua/rom_api/endpoint.rb
146
147
  - lib/roqua/rom_api/list_protocol_subscriptions.rb
147
148
  - lib/roqua/rom_api/list_responses.rb
148
149
  - lib/roqua/rom_api/models.rb
149
150
  - lib/roqua/rom_api/models/protocol_subscription.rb
150
151
  - lib/roqua/rom_api/models/response.rb
152
+ - lib/roqua/rom_api/report_calculations.rb
151
153
  - lib/roqua/rom_api/sessions.rb
152
154
  - lib/roqua/rom_api/sessions/basic_auth_session.rb
153
155
  - lib/roqua/rom_api/start_fill_out_session.rb
@@ -157,11 +159,13 @@ files:
157
159
  - roqua_rom_api.gemspec
158
160
  - spec/fabricators/basic_auth_session_fabricator.rb
159
161
  - spec/lib/roqua/rom_api/create_fill_out_request_spec.rb
162
+ - spec/lib/roqua/rom_api/create_response_spec.rb
160
163
  - spec/lib/roqua/rom_api/endpoint_spec.rb
161
164
  - spec/lib/roqua/rom_api/list_protocol_subscriptions_spec.rb
162
165
  - spec/lib/roqua/rom_api/list_responses_spec.rb
163
166
  - spec/lib/roqua/rom_api/models/protocol_subscription_spec.rb
164
167
  - spec/lib/roqua/rom_api/models/response_spec.rb
168
+ - spec/lib/roqua/rom_api/report_calculations_spec.rb
165
169
  - spec/lib/roqua/rom_api/sessions/basic_auth_session_spec.rb
166
170
  - spec/lib/roqua/rom_api/start_fill_out_session_spec.rb
167
171
  - spec/lib/roqua/rom_api/start_protocol_subscription_spec.rb
@@ -197,11 +201,13 @@ summary: API wrapper gem around RoQua's ROM API
197
201
  test_files:
198
202
  - spec/fabricators/basic_auth_session_fabricator.rb
199
203
  - spec/lib/roqua/rom_api/create_fill_out_request_spec.rb
204
+ - spec/lib/roqua/rom_api/create_response_spec.rb
200
205
  - spec/lib/roqua/rom_api/endpoint_spec.rb
201
206
  - spec/lib/roqua/rom_api/list_protocol_subscriptions_spec.rb
202
207
  - spec/lib/roqua/rom_api/list_responses_spec.rb
203
208
  - spec/lib/roqua/rom_api/models/protocol_subscription_spec.rb
204
209
  - spec/lib/roqua/rom_api/models/response_spec.rb
210
+ - spec/lib/roqua/rom_api/report_calculations_spec.rb
205
211
  - spec/lib/roqua/rom_api/sessions/basic_auth_session_spec.rb
206
212
  - spec/lib/roqua/rom_api/start_fill_out_session_spec.rb
207
213
  - spec/lib/roqua/rom_api/start_protocol_subscription_spec.rb