ncs_navigator_configuration 0.3.2 → 0.4.0

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.
@@ -1,6 +1,21 @@
1
1
  NCS Navigator Configuration gem history
2
2
  =======================================
3
3
 
4
+ 0.4.0
5
+ -----
6
+
7
+ - New optional Core attribute: conflict_email_recipients. (#12)
8
+
9
+ - New optional Core attribute: machine_account_username. (#14)
10
+
11
+ - Make sc_id optional. (#16)
12
+
13
+ - Make sampling_units_file optional. (#17)
14
+
15
+ - Make recruitment_type_id optional. (#18)
16
+
17
+ - Make core uri optional. (#19)
18
+
4
19
  0.3.2
5
20
  -----
6
21
 
@@ -166,8 +166,7 @@ module NcsNavigator
166
166
  # @macro [attach] configuration_attribute
167
167
  # Read from the `[$2]` section, key `$3`.
168
168
  # @return [$4]
169
- configuration_attribute :study_center_id, 'Study Center', 'sc_id', String,
170
- :required => true
169
+ configuration_attribute :study_center_id, 'Study Center', 'sc_id', String
171
170
 
172
171
  alias :sc_id :study_center_id
173
172
 
@@ -175,8 +174,7 @@ module NcsNavigator
175
174
  # The recruitment strategy for this study center. The acceptable
176
175
  # values are those from the code list `recruit_type_cl1` in the
177
176
  # MDES.
178
- configuration_attribute :recruitment_type_id, 'Study Center', 'recruitment_type_id', String,
179
- :required => true
177
+ configuration_attribute :recruitment_type_id, 'Study Center', 'recruitment_type_id', String
180
178
 
181
179
  ##
182
180
  # A short, human-readable name or abbreviation for the Study
@@ -203,8 +201,7 @@ module NcsNavigator
203
201
  #
204
202
  # The format is described in the comments in the
205
203
  # {file:sample_configuration.ini sample INI}.
206
- configuration_attribute :sampling_units_file, 'Study Center', 'sampling_units_file', Pathname,
207
- :required => true
204
+ configuration_attribute :sampling_units_file, 'Study Center', 'sampling_units_file', Pathname
208
205
 
209
206
  ##
210
207
  # The image that should appear on the left side of the footer in
@@ -237,10 +234,13 @@ module NcsNavigator
237
234
  ##
238
235
  # The root URI for the NCS Navigator Core deployment in this instance of
239
236
  # the suite.
240
- configuration_attribute :core_uri, 'Core', 'uri', URI, :required => true
237
+ configuration_attribute :core_uri, 'Core', 'uri', URI
241
238
 
242
239
  ##
243
240
  # Machine account for Cases.
241
+ configuration_attribute :core_machine_account_username, 'Core',
242
+ 'machine_account_username', String
243
+
244
244
  configuration_attribute :core_machine_account_password, 'Core',
245
245
  'machine_account_password', String
246
246
 
@@ -249,6 +249,11 @@ module NcsNavigator
249
249
  configuration_attribute :core_mail_from, 'Core', 'mail_from', String,
250
250
  :default => 'cases@navigator.example.edu'
251
251
 
252
+ ##
253
+ # When a merge conflict occurs in Cases, send emails to these addresses.
254
+ configuration_attribute :core_conflict_email_recipients, 'Core',
255
+ 'conflict_email_recipients', Array, :default => []
256
+
252
257
  ##
253
258
  # The root URI for the PSC deployment in this instance of
254
259
  # the suite.
@@ -371,12 +376,13 @@ module NcsNavigator
371
376
  areas = {}
372
377
  ssus = {}
373
378
 
374
- unless sampling_units_file.readable?
379
+ if sampling_units_file && !sampling_units_file.readable?
375
380
  raise Error.new("Could not read sampling units CSV #{sampling_units_file}")
376
381
  end
377
382
 
378
383
  strip_ws = lambda { |h| h.nil? ? nil : h.strip }
379
384
 
385
+ return [] unless sampling_units_file
380
386
  faster_csv_class.foreach(sampling_units_file,
381
387
  :headers => true, :encoding => 'utf-8',
382
388
  :converters => [strip_ws], :header_converters => [strip_ws]
@@ -1,5 +1,5 @@
1
1
  module NcsNavigator
2
2
  class Configuration
3
- VERSION = '0.3.2'
3
+ VERSION = '0.4.0'
4
4
  end
5
5
  end
@@ -91,6 +91,13 @@ uri = "https://ncsnavigator.greaterchicagoncs.org/"
91
91
  # appear to come.
92
92
  mail_from = "ncs-navigator@greaterchicagoncs.org"
93
93
 
94
+ # The password used by Cases to log into other NCS-related applications.
95
+ machine_account_password = "supersecret"
96
+
97
+ # If a merge conflict is detected in Cases, emails will be sent to these
98
+ # addresses. Separate multiple addresses with commas.
99
+ conflict_email_recipients = "Foo Example <foo@example.org>"
100
+
94
101
  [PSC]
95
102
  # Configuration options which describe PSC as used by this instance of
96
103
  # the suite. (For now, PSC's own configuration options must be set
@@ -54,6 +54,7 @@ module NcsNavigator
54
54
  let(:everything_file) { File.expand_path('../everything.ini', __FILE__) }
55
55
 
56
56
  # input_hash should be kept minimally valid
57
+ # ToDo: update minimally valid input_hash with required fields only.
57
58
  let(:input_hash) {
58
59
  {
59
60
  'Study Center' => {
@@ -64,15 +65,24 @@ module NcsNavigator
64
65
  'Staff Portal' => {
65
66
  'uri' => 'https://sp.example.edu/'
66
67
  },
67
- 'Core' => {
68
- 'uri' => 'https://ncsn.example.edu/',
69
- },
70
68
  'PSC' => {
71
69
  'uri' => 'https://psc.example.edu/'
72
70
  }
73
71
  }
74
72
  }
75
73
  let(:from_hash) { Configuration.new(input_hash) }
74
+ let(:minimum_valid_hash) {
75
+ {
76
+ 'Staff Portal' => {
77
+ 'uri' => 'https://sp.example.edu/'
78
+ },
79
+ 'PSC' => {
80
+ 'uri' => 'https://psc.example.edu/'
81
+ }
82
+ }
83
+ }
84
+ let(:from_minimum_valid_hash) { Configuration.new(minimum_valid_hash) }
85
+
76
86
 
77
87
  describe '#initialize' do
78
88
  describe 'from an INI file' do
@@ -107,16 +117,15 @@ module NcsNavigator
107
117
  from_hash.study_center_id.should == '234'
108
118
  end
109
119
 
110
- it 'is mandatory' do
111
- input_hash['Study Center'].delete 'sc_id'
112
- lambda { from_hash }.
113
- should raise_error("Please set a value for [Study Center]: sc_id")
120
+ it 'is not mandatory' do
121
+ lambda { from_minimum_valid_hash }.
122
+ should_not raise_error
114
123
  end
115
124
  end
116
125
 
117
126
  describe '#recruitment_type_id' do
118
127
  it 'reflects the configured value' do
119
- from_hash.recruitment_type_id.should == '3'
128
+ everything.recruitment_type_id.should == '1'
120
129
  end
121
130
 
122
131
  it 'is always a string' do
@@ -124,10 +133,9 @@ module NcsNavigator
124
133
  from_hash.recruitment_type_id.should == '234'
125
134
  end
126
135
 
127
- it 'is mandatory' do
128
- input_hash['Study Center'].delete 'recruitment_type_id'
129
- lambda { from_hash }.
130
- should raise_error("Please set a value for [Study Center]: recruitment_type_id")
136
+ it 'is not mandatory' do
137
+ lambda { from_minimum_valid_hash }.
138
+ should_not raise_error
131
139
  end
132
140
  end
133
141
 
@@ -179,63 +187,53 @@ module NcsNavigator
179
187
  everything.sampling_units_file.should be_a(Pathname)
180
188
  end
181
189
 
182
- it 'is required' do
183
- input_hash['Study Center'].delete 'sampling_units_file'
184
- lambda { from_hash }.
185
- should raise_error "Please set a value for [Study Center]: sampling_units_file"
190
+ it 'is not required' do
191
+ lambda { from_minimum_valid_hash }.
192
+ should_not raise_error
186
193
  end
187
194
  end
188
195
 
189
196
  describe '#sampling_unit_areas' do
190
- subject { everything.sampling_unit_areas }
191
-
192
- it 'has the right number' do
193
- subject.size.should == 2
197
+ describe 'when no sampling_unit_file' do
198
+ it 'is an empty array' do
199
+ from_minimum_valid_hash.sampling_unit_areas.should be_empty
200
+ end
194
201
  end
195
202
 
196
- describe 'an individual area' do
197
- let(:area) { subject.sort_by { |a| a.name }.last }
203
+ describe 'when sampling_units_file is present' do
204
+ subject { everything.sampling_unit_areas }
198
205
 
199
- it 'has a name' do
200
- area.name.should == 'Uptown'
206
+ it 'has the right number' do
207
+ subject.size.should == 2
201
208
  end
202
209
 
203
- it 'has the right number of SSUs' do
204
- area.secondary_sampling_units.size.should == 2
205
- end
210
+ describe 'an individual area' do
211
+ let(:area) { subject.sort_by { |a| a.name }.last }
212
+
213
+ it 'has a name' do
214
+ area.name.should == 'Uptown'
215
+ end
206
216
 
207
- it 'has the right PSU' do
208
- area.primary_sampling_unit.id.should == '204'
217
+ it 'has the right number of SSUs' do
218
+ area.secondary_sampling_units.size.should == 2
219
+ end
220
+
221
+ it 'has the right PSU' do
222
+ area.primary_sampling_unit.id.should == '204'
223
+ end
209
224
  end
210
225
  end
211
226
  end
212
227
 
213
228
  describe '#primary_sampling_units' do
214
- subject { everything.primary_sampling_units }
215
-
216
- it 'has the right number' do
217
- subject.size.should == 1
218
- end
219
-
220
- describe 'an individual PSU' do
221
- let(:psu) { subject.first }
222
-
223
- it 'has the correct ID' do
224
- psu.id.should == '204'
225
- end
226
-
227
- it 'has the correct SSUs' do
228
- psu.secondary_sampling_units.collect(&:id).should == %w(One Two Three)
229
+ describe 'when no sampling_unit_file' do
230
+ it 'is an empty array' do
231
+ from_minimum_valid_hash.primary_sampling_units.should be_empty
229
232
  end
230
233
  end
231
234
 
232
- context 'without Areas and SSUs' do
233
- before do
234
- input_hash['Study Center']['sampling_units_file'] =
235
- File.expand_path('../no_ssus.csv', __FILE__)
236
- end
237
-
238
- subject { from_hash.primary_sampling_units }
235
+ describe 'when sampling_units_file is present' do
236
+ subject { everything.primary_sampling_units }
239
237
 
240
238
  it 'has the right number' do
241
239
  subject.size.should == 1
@@ -248,102 +246,135 @@ module NcsNavigator
248
246
  psu.id.should == '204'
249
247
  end
250
248
 
251
- it 'has no Areas' do
252
- psu.should have(0).sampling_unit_areas
249
+ it 'has the correct SSUs' do
250
+ psu.secondary_sampling_units.collect(&:id).should == %w(One Two Three)
251
+ end
252
+ end
253
+
254
+ context 'without Areas and SSUs' do
255
+ before do
256
+ input_hash['Study Center']['sampling_units_file'] =
257
+ File.expand_path('../no_ssus.csv', __FILE__)
258
+ end
259
+
260
+ subject { from_hash.primary_sampling_units }
261
+
262
+ it 'has the right number' do
263
+ subject.size.should == 1
253
264
  end
254
265
 
255
- it 'has no SSUs' do
256
- psu.should have(0).secondary_sampling_units
266
+ describe 'an individual PSU' do
267
+ let(:psu) { subject.first }
268
+
269
+ it 'has the correct ID' do
270
+ psu.id.should == '204'
271
+ end
272
+
273
+ it 'has no Areas' do
274
+ psu.should have(0).sampling_unit_areas
275
+ end
276
+
277
+ it 'has no SSUs' do
278
+ psu.should have(0).secondary_sampling_units
279
+ end
257
280
  end
258
281
  end
259
282
  end
260
283
  end
261
284
 
262
285
  describe '#secondary_sampling_units' do
263
- subject { everything.secondary_sampling_units }
264
-
265
- it 'has the right number' do
266
- subject.size.should == 3
286
+ describe 'when no sampling_unit_file' do
287
+ it 'is an empty array' do
288
+ from_minimum_valid_hash.secondary_sampling_units.should be_empty
289
+ end
267
290
  end
268
291
 
269
- describe 'an individual SSU' do
270
- let(:ssu) { subject.sort_by { |ssu| ssu.id }.first }
292
+ describe 'when sampling_units_file is present' do
293
+ subject { everything.secondary_sampling_units }
271
294
 
272
- it 'has the correct ID' do
273
- ssu.id.should == 'One'
295
+ it 'has the right number' do
296
+ subject.size.should == 3
274
297
  end
275
298
 
276
- it 'has the correct name' do
277
- ssu.name.should == 'West Side'
278
- end
299
+ describe 'an individual SSU' do
300
+ let(:ssu) { subject.sort_by { |ssu| ssu.id }.first }
279
301
 
280
- it 'has the correct area' do
281
- ssu.area.name.should == 'Uptown'
282
- end
302
+ it 'has the correct ID' do
303
+ ssu.id.should == 'One'
304
+ end
283
305
 
284
- it 'has the same area as another SSU in the same area' do
285
- ssu.area.should eql(subject.find { |ssu| ssu.name == 'West Side' }.area)
286
- end
306
+ it 'has the correct name' do
307
+ ssu.name.should == 'West Side'
308
+ end
287
309
 
288
- it 'has the correct PSU' do
289
- ssu.primary_sampling_unit.id.should == '204'
290
- end
310
+ it 'has the correct area' do
311
+ ssu.area.name.should == 'Uptown'
312
+ end
291
313
 
292
- it 'has the correct TSUs' do
293
- ssu.should have(1).tertiary_sampling_units
294
- end
314
+ it 'has the same area as another SSU in the same area' do
315
+ ssu.area.should eql(subject.find { |ssu| ssu.name == 'West Side' }.area)
316
+ end
295
317
 
296
- describe 'a TSU' do
297
- let(:tsu) { ssu.tertiary_sampling_units.first }
318
+ it 'has the correct PSU' do
319
+ ssu.primary_sampling_unit.id.should == '204'
320
+ end
298
321
 
299
- it 'has a name' do
300
- tsu.name.should == 'Center'
322
+ it 'has the correct TSUs' do
323
+ ssu.should have(1).tertiary_sampling_units
301
324
  end
302
325
 
303
- it 'has an ID' do
304
- tsu.id.should == '1-1'
326
+ describe 'a TSU' do
327
+ let(:tsu) { ssu.tertiary_sampling_units.first }
328
+
329
+ it 'has a name' do
330
+ tsu.name.should == 'Center'
331
+ end
332
+
333
+ it 'has an ID' do
334
+ tsu.id.should == '1-1'
335
+ end
305
336
  end
306
337
  end
307
- end
308
338
 
309
- context 'without TSUs' do
310
- before do
311
- input_hash['Study Center']['sampling_units_file'] =
312
- File.expand_path('../no_tsus.csv', __FILE__)
313
- end
339
+ context 'without TSUs' do
340
+ before do
341
+ input_hash['Study Center']['sampling_units_file'] =
342
+ File.expand_path('../no_tsus.csv', __FILE__)
343
+ end
314
344
 
315
- subject { from_hash.secondary_sampling_units }
345
+ subject { from_hash.secondary_sampling_units }
316
346
 
317
- it 'has the right number' do
318
- subject.size.should == 3
319
- end
347
+ it 'has the right number' do
348
+ subject.size.should == 3
349
+ end
320
350
 
321
- describe 'an individual SSU' do
322
- let(:ssu) { subject.first }
351
+ describe 'an individual SSU' do
352
+ let(:ssu) { subject.first }
323
353
 
324
- it 'has no TSUs' do
325
- ssu.should have(0).tertiary_sampling_units
354
+ it 'has no TSUs' do
355
+ ssu.should have(0).tertiary_sampling_units
356
+ end
326
357
  end
327
358
  end
328
- end
329
359
 
330
- context 'with extra whitespace' do
331
- before do
332
- input_hash['Study Center']['sampling_units_file'] =
333
- File.expand_path('../spaces.csv', __FILE__)
334
- end
360
+ context 'with extra whitespace' do
361
+ before do
362
+ input_hash['Study Center']['sampling_units_file'] =
363
+ File.expand_path('../spaces.csv', __FILE__)
364
+ end
335
365
 
336
- subject { from_hash.secondary_sampling_units }
366
+ subject { from_hash.secondary_sampling_units }
337
367
 
338
- it 'has the right number' do
339
- subject.size.should == 3
340
- end
368
+ it 'has the right number' do
369
+ subject.size.should == 3
370
+ end
341
371
 
342
- describe 'an individual SSU' do
343
- let(:ssu) { subject.detect { |s| s.id == 'One' } }
372
+ describe 'an individual SSU' do
373
+ let(:ssu) { subject.detect { |s| s.id == 'One' } }
344
374
 
345
- it 'has the name' do
346
- ssu.name.should == 'West Side'
375
+ it 'has the name' do
376
+ ssu.name.should == 'West Side'
377
+ end
347
378
  end
348
379
  end
349
380
  end
@@ -440,12 +471,27 @@ module NcsNavigator
440
471
  end
441
472
  end
442
473
 
474
+ describe '#core_machine_account_username' do
475
+ it 'is the configured value' do
476
+ everything.core_machine_account_username.should == 'ncs_navigator_cases_foobar'
477
+ end
478
+ end
479
+
443
480
  describe '#core_machine_account_password' do
444
481
  it 'is the configured value' do
445
482
  everything.core_machine_account_password.should == 'foobar'
446
483
  end
447
484
  end
448
485
 
486
+ describe '#core_conflict_email_recipients' do
487
+ it 'is the configured value' do
488
+ everything.core_conflict_email_recipients.should == [
489
+ 'Foo Bar <foobar@example.edu>',
490
+ 'Baz Quux <bazquux@example.edu>'
491
+ ]
492
+ end
493
+ end
494
+
449
495
  describe '#core' do
450
496
  it 'exposes all the raw values in the Staff Portal section' do
451
497
  everything.core['uri'].should == "https://ncsnavigator.greaterchicagoncs.org/"
@@ -22,7 +22,9 @@ mail_from = "staffportal@greaterchicagoncs.org"
22
22
  [Core]
23
23
  uri = "https://ncsnavigator.greaterchicagoncs.org/"
24
24
  mail_from = "ncs-navigator@greaterchicagoncs.org"
25
+ machine_account_username = "ncs_navigator_cases_foobar"
25
26
  machine_account_password = "foobar"
27
+ conflict_email_recipients="Foo Bar <foobar@example.edu>, Baz Quux <bazquux@example.edu>"
26
28
 
27
29
  [PSC]
28
30
  uri = "https://calendar.greaterchicagoncs.org/"
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ncs_navigator_configuration
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.2
4
+ version: 0.4.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-09-19 00:00:00.000000000 Z
12
+ date: 2013-03-06 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: ncs_mdes
@@ -182,7 +182,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
182
182
  version: '0'
183
183
  segments:
184
184
  - 0
185
- hash: 1883261299905752357
185
+ hash: 4406372814249112619
186
186
  required_rubygems_version: !ruby/object:Gem::Requirement
187
187
  none: false
188
188
  requirements:
@@ -191,10 +191,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
191
191
  version: '0'
192
192
  segments:
193
193
  - 0
194
- hash: 1883261299905752357
194
+ hash: 4406372814249112619
195
195
  requirements: []
196
196
  rubyforge_project:
197
- rubygems_version: 1.8.24
197
+ rubygems_version: 1.8.25
198
198
  signing_key:
199
199
  specification_version: 3
200
200
  summary: Common configuration elements for the NCS Navigator suite