ncs_mdes_warehouse 0.3.2 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (26) hide show
  1. data/CHANGELOG.md +31 -2
  2. data/README.md +25 -0
  3. data/generated_models/ncs_navigator/warehouse/models/two_point_zero/drf_therm_verification.rb +1 -1
  4. data/generated_models/ncs_navigator/warehouse/models/two_point_zero/env_equipment.rb +4 -4
  5. data/generated_models/ncs_navigator/warehouse/models/two_point_zero/env_equipment_prob_log.rb +3 -3
  6. data/generated_models/ncs_navigator/warehouse/models/two_point_zero/prec_therm_cert.rb +2 -2
  7. data/generated_models/ncs_navigator/warehouse/models/two_point_zero/ref_freezer_verification.rb +2 -2
  8. data/generated_models/ncs_navigator/warehouse/models/two_point_zero/sample_receipt_confirm.rb +1 -1
  9. data/generated_models/ncs_navigator/warehouse/models/two_point_zero/spec_equipment.rb +4 -4
  10. data/generated_models/ncs_navigator/warehouse/models/two_point_zero/spec_spsc_info.rb +2 -2
  11. data/generated_models/ncs_navigator/warehouse/models/two_point_zero/srsc_info.rb +2 -2
  12. data/generated_models/ncs_navigator/warehouse/models/two_point_zero/trh_meter_calibration.rb +1 -1
  13. data/lib/ncs_navigator/warehouse/database_initializer.rb +112 -31
  14. data/lib/ncs_navigator/warehouse/table_modeler/mdes_ext.rb +1 -1
  15. data/lib/ncs_navigator/warehouse/transform_load.rb +15 -9
  16. data/lib/ncs_navigator/warehouse/transformers/vdr_xml/reader.rb +26 -6
  17. data/lib/ncs_navigator/warehouse/version.rb +1 -1
  18. data/lib/ncs_navigator/warehouse/xml_emitter.rb +8 -7
  19. data/spec/ncs_navigator/warehouse/database_initializer_spec.rb +113 -0
  20. data/spec/ncs_navigator/warehouse/table_modeler_spec.rb +7 -0
  21. data/spec/ncs_navigator/warehouse/transform_load_spec.rb +28 -0
  22. data/spec/ncs_navigator/warehouse/transformers/vdr_xml/made_up_vdr_xml.xml +12 -4
  23. data/spec/ncs_navigator/warehouse/transformers/vdr_xml/reader_spec.rb +18 -1
  24. data/spec/ncs_navigator/warehouse/xml_emitter_spec.rb +8 -2
  25. data/spec/spec_helper.rb +2 -1
  26. metadata +53 -51
@@ -17,6 +17,13 @@ class NcsNavigator::Warehouse::Transformers::VdrXml
17
17
 
18
18
  def_delegator :@configuration, :shell
19
19
 
20
+ ##
21
+ # These code values indicate missing or unknown data.
22
+ # If one of them appears in a nullable, non-coded field, we will
23
+ # skip it. Similarly, if a record's PK is one of these values, we
24
+ # will skip the entire record.
25
+ MISSING_CODES = %w(-3 -4 -6 -7)
26
+
20
27
  ##
21
28
  # @return [Fixnum] the number of records that have been read so far.
22
29
  attr_reader :record_count
@@ -42,7 +49,7 @@ class NcsNavigator::Warehouse::Transformers::VdrXml
42
49
  # @yield a series of model instances
43
50
  # @return [void]
44
51
  def each(&block)
45
- shell.say_line("Beginning VDR XML read#{" of #{filename}" if filename}")
52
+ shell.say_line("Reading VDR XML #{filename if filename}")
46
53
  @start = Time.now
47
54
 
48
55
  Nokogiri::XML::Reader(@io).each do |node|
@@ -69,7 +76,10 @@ class NcsNavigator::Warehouse::Transformers::VdrXml
69
76
  elsif @current_model_class
70
77
  if !is_open && node.local_name == @current_model_class.mdes_table_name
71
78
  # on the way out of this record
72
- yield build_current_instance
79
+ rec = build_current_instance
80
+ unless MISSING_CODES.include?(rec.key.first)
81
+ yield rec
82
+ end
73
83
  @current_model_class = nil
74
84
  @record_count += 1
75
85
  shell.clear_line_then_say('%6d records (%3.1f per second); up to %s' %
@@ -103,12 +113,22 @@ class NcsNavigator::Warehouse::Transformers::VdrXml
103
113
 
104
114
  def should_filter_out(model_class, variable_name, value)
105
115
  return true if variable_name == :transaction_type
106
- # if it's a key to another table...
107
- if @current_model_class.relationships.detect { |r| r.child_key.collect(&:name).include?(variable_name) }
108
- # ...and it is unknown or empty
109
- return value == '-3' || value.strip.empty?
116
+
117
+ if is_foreign_key_in_current_model?(variable_name)
118
+ return MISSING_CODES.include?(value) || value.strip.empty?
110
119
  end
120
+
121
+ property = @current_model_class.properties.find { |p| p.name == variable_name }
122
+ unless property.required? || property.options[:set]
123
+ return MISSING_CODES.include?(value)
124
+ end
125
+ end
126
+
127
+ def is_foreign_key_in_current_model?(variable_name)
128
+ @current_model_class.relationships.
129
+ detect { |r| r.child_key.collect(&:name).include?(variable_name) }
111
130
  end
131
+ private :is_foreign_key_in_current_model?
112
132
 
113
133
  def build_current_instance
114
134
  @current_model_class.new(@current_parameter_values)
@@ -1,5 +1,5 @@
1
1
  module NcsNavigator
2
2
  module Warehouse
3
- VERSION = '0.3.2'
3
+ VERSION = '0.4.0'
4
4
  end
5
5
  end
@@ -58,8 +58,8 @@ XML
58
58
  ##
59
59
  # @param configuration [Configuration]
60
60
  # @return [Pathname] the default filename to use for a VDR XML
61
- # submission. The format is `{county}-{YYYYMMDD}.xml`.
62
- def self.default_filename(configuration)
61
+ # submission. The format is `{county}-{YYYYMMDD}{-PII}.xml`.
62
+ def self.default_filename(configuration, include_pii=false)
63
63
  psu_type = configuration.mdes.types.detect { |type| type.name =~ /^psu_cl/ }
64
64
  unless psu_type
65
65
  fail 'Cannot find the PSU code list. Please specify a filename manually.'
@@ -71,9 +71,10 @@ XML
71
71
  fail "Cannot find PSU #{psu_id} in #{psu_type.name}. Please specify a filename manually."
72
72
  end
73
73
 
74
- Pathname.new '%s-%s.xml' % [
74
+ Pathname.new '%s-%s%s.xml' % [
75
75
  psu_entry.label.split(',', 2).first.downcase.gsub(/\s*county\s*/, '').strip.gsub(' ', '_'),
76
- Time.now.iso8601.split('T').first.gsub('-', '')
76
+ Time.now.iso8601.split('T').first.gsub('-', ''),
77
+ include_pii ? '-PII' : ''
77
78
  ]
78
79
  end
79
80
 
@@ -98,18 +99,18 @@ XML
98
99
  # produced alongside the XML file?
99
100
  def initialize(config, filename, options={})
100
101
  @configuration = config
102
+ @include_pii = options[:'include-pii']
101
103
  @filename = case filename
102
104
  when Pathname
103
105
  filename
104
106
  when nil
105
- self.class.default_filename(configuration)
107
+ self.class.default_filename(configuration, @include_pii)
106
108
  else
107
109
  Pathname.new(filename.to_s)
108
110
  end
109
111
  @record_count = 0
110
112
  @block_size = options[:'block-size'] || 5000
111
113
  @zip = options.has_key?(:zip) ? options[:zip] : true
112
- @include_pii = options[:'include-pii']
113
114
  @models =
114
115
  if options[:tables]
115
116
  options[:tables].collect { |t| t.to_s }.collect { |t|
@@ -125,7 +126,7 @@ XML
125
126
  #
126
127
  # @return [void]
127
128
  def emit_xml
128
- shell.say_line("Exporting to #{filename}")
129
+ shell.say_line("Exporting to #{filename}#{include_pii? ? ' with PII' : ''}")
129
130
  log.info("Beginning XML export to #{filename}")
130
131
 
131
132
  @start = Time.now
@@ -0,0 +1,113 @@
1
+ require File.expand_path('../../../spec_helper', __FILE__)
2
+
3
+ module NcsNavigator::Warehouse
4
+ describe DatabaseInitializer do
5
+ describe '#replace_schema', :slow, :use_mdes do
6
+ subject { DatabaseInitializer.new(spec_config) }
7
+ let(:mdes_models) { spec_config.models_module.mdes_order }
8
+ let(:mdes_table_names) { mdes_models.collect(&:mdes_table_name) }
9
+
10
+ before do
11
+ subject.set_up_repository(:both)
12
+ end
13
+
14
+ def table_names(schema)
15
+ ::DataMapper.repository("mdes_warehouse_#{schema}").adapter.select(
16
+ "SELECT table_name FROM information_schema.tables WHERE table_schema='public'")
17
+ end
18
+
19
+ it 'does not touch the reporting repository' do
20
+ subject.drop_all(:reporting) # just to make sure
21
+ subject.replace_schema
22
+ table_names(:reporting).should == []
23
+ end
24
+
25
+ it 'creates all the MDES model tables' do
26
+ subject.replace_schema
27
+ (mdes_table_names - table_names(:working)).
28
+ should == []
29
+ end
30
+
31
+ it 'creates the ancillary warehouse information tables' do
32
+ subject.replace_schema
33
+ table_names(:working).select { |n| n =~ /^wh_/ }.size.should == 2
34
+ end
35
+
36
+ describe 'with foreign keys' do
37
+ let(:foreign_keys) {
38
+ ::DataMapper.repository(:mdes_warehouse_working).adapter.select(
39
+ %q{
40
+ SELECT constraint_name, is_deferrable
41
+ FROM information_schema.table_constraints
42
+ WHERE constraint_schema='public'
43
+ AND constraint_type='FOREIGN KEY'
44
+ })
45
+ }
46
+
47
+ before do
48
+ subject.replace_schema
49
+ end
50
+
51
+ it 'creates them' do
52
+ foreign_keys.should_not == []
53
+ end
54
+
55
+ it 'flags them as deferrable' do
56
+ foreign_keys.collect(&:is_deferrable).uniq.should == %w(YES)
57
+ end
58
+ end
59
+
60
+ describe 'including no-pii views' do
61
+ def select_from_working(sql)
62
+ ::DataMapper.repository(:mdes_warehouse_working).adapter.select(sql)
63
+ end
64
+
65
+ let(:pii_variables) {
66
+ spec_config.mdes.transmission_tables.collect { |t|
67
+ t.variables.reject { |v| v.pii.blank? }.collect { |v| [t.name, v.name].join('.') }
68
+ }.flatten.sort
69
+ }
70
+
71
+ let(:nonpii_variables) {
72
+ spec_config.mdes.transmission_tables.collect { |t|
73
+ t.variables.select { |v| v.pii.blank? }.
74
+ reject { |v| v.name == 'transaction_type' }.
75
+ collect { |v| [t.name, v.name].join('.') }
76
+ }.flatten.sort
77
+ }
78
+
79
+ let(:no_pii_views) {
80
+ select_from_working(%q{
81
+ SELECT table_name
82
+ FROM information_schema.views
83
+ WHERE table_schema='no_pii'
84
+ })
85
+ }
86
+
87
+ let(:no_pii_view_column_usage) {
88
+ select_from_working(%q(
89
+ SELECT table_name || '.' || column_name
90
+ FROM information_schema.view_column_usage
91
+ WHERE view_schema='no_pii' AND table_schema='public'
92
+ )).uniq.sort
93
+ }
94
+
95
+ before do
96
+ subject.replace_schema
97
+ end
98
+
99
+ it 'creates a no-pii view for every table' do
100
+ (mdes_table_names - no_pii_views).should == []
101
+ end
102
+
103
+ it 'does not include values for any PII variables in the views' do
104
+ (pii_variables & no_pii_view_column_usage).should == []
105
+ end
106
+
107
+ it 'does include values for all non-PII variables in the views' do
108
+ (nonpii_variables - no_pii_view_column_usage).should == []
109
+ end
110
+ end
111
+ end
112
+ end
113
+ end
@@ -353,6 +353,13 @@ end
353
353
  model_property.pii.should == :possible
354
354
  end
355
355
 
356
+ it 'ignores blank PII values' do
357
+ variable.pii = ' '
358
+ subject.load!
359
+
360
+ model_property.pii.should be_nil
361
+ end
362
+
356
363
  it 'preserves the omittableness' do
357
364
  variable.omittable = true
358
365
  subject.load!
@@ -134,6 +134,34 @@ module NcsNavigator::Warehouse
134
134
  end
135
135
  end
136
136
 
137
+ describe 'with an integrity error on transaction commit' do
138
+ let(:runs) { [] }
139
+
140
+ before do
141
+ config.add_transformer(BlockTransformer.new { |s| runs << 'A' })
142
+ config.add_transformer(BlockTransformer.new { |s| runs << 'B' })
143
+ config.add_transformer(BlockTransformer.new { |s| runs << 'C3' })
144
+
145
+ TransformStatus.should_receive(:transaction).ordered.and_yield
146
+ TransformStatus.should_receive(:transaction).ordered.
147
+ and_raise(DataObjects::IntegrityError.new('Foo'))
148
+ TransformStatus.should_receive(:transaction).ordered.and_yield
149
+
150
+ loader.run
151
+ end
152
+
153
+ it 'records a TransformError' do
154
+ TransformStatus.all[1].transform_errors.first.message.
155
+ should =~ /^Transform failed with data integrity error: Foo/
156
+ end
157
+
158
+ it 'still runs all the transformers' do
159
+ # this is not A B C3 due to a limitation in rspec-mocks --
160
+ # you apparently can't .and_yield.and_raise and have both apply.
161
+ runs.should == %w(A C3)
162
+ end
163
+ end
164
+
137
165
  describe 'sending e-mail' do
138
166
  it 'sends on success'
139
167
 
@@ -10,7 +10,7 @@
10
10
  <study_center>
11
11
  <sc_id>20000029</sc_id>
12
12
  <sc_name>Northwestern University</sc_name>
13
- <comments>NA</comments>
13
+ <comments>-7</comments>
14
14
  <transaction_type>NA</transaction_type>
15
15
  </study_center>
16
16
 
@@ -30,13 +30,21 @@
30
30
  <transaction_type>NA</transaction_type>
31
31
  </ssu>
32
32
 
33
+ <ssu>
34
+ <sc_id>20000029</sc_id>
35
+ <psu_id>20000030</psu_id>
36
+ <ssu_id>-7</ssu_id>
37
+ <ssu_name>-7</ssu_name>
38
+ <transaction_type>NA</transaction_type>
39
+ </ssu>
40
+
33
41
  <listing_unit>
34
42
  <psu_id>20000030</psu_id>
35
43
  <list_id>100</list_id>
36
44
  <ssu_id>13.1</ssu_id>
37
45
  <tsu_id>-7</tsu_id>
38
- <list_line random_attr='foo'>-7</list_line>
39
- <list_source>3</list_source>
46
+ <list_line>-7</list_line>
47
+ <list_source random_attr='foo'>3</list_source>
40
48
  <list_comment>NA</list_comment>
41
49
  <transaction_type>NA</transaction_type>
42
50
  </listing_unit>
@@ -51,7 +59,7 @@
51
59
  <maiden_name></maiden_name>
52
60
  <suffix>-7</suffix>
53
61
  <title>-7</title>
54
- <sex>2</sex>
62
+ <sex>-6</sex>
55
63
  <age>49</age>
56
64
  <age_range>5</age_range>
57
65
  <person_dob>1962-01-01</person_dob>
@@ -9,6 +9,7 @@ class NcsNavigator::Warehouse::Transformers::VdrXml
9
9
  let(:person) { reader.detect { |rec| rec.class.name =~ /Person$/ } }
10
10
  let(:link_contact) { reader.detect { |rec| rec.class.name =~ /LinkContact$/ } }
11
11
  let(:listing_unit) { reader.detect { |rec| rec.class.name =~ /ListingUnit$/ } }
12
+ let(:study_center) { reader.detect { |rec| rec.class.name =~ /StudyCenter$/ } }
12
13
  let(:email) { reader.detect { |rec| rec.class.name =~ /Email$/ } }
13
14
 
14
15
  it 'verifies the PSU matches the configuration'
@@ -31,8 +32,24 @@ class NcsNavigator::Warehouse::Transformers::VdrXml
31
32
  person.new_address_id.should be_nil
32
33
  end
33
34
 
35
+ it 'converts a -7 FK to no assocation' do
36
+ listing_unit.tsu_id.should be_nil
37
+ end
38
+
34
39
  it 'ignores random attributes' do
35
- listing_unit.list_line.should == "-7"
40
+ listing_unit.list_source.should == "3"
41
+ end
42
+
43
+ it 'converts an "unknown" code in a text field to no value' do
44
+ study_center.comments.should be_nil
45
+ end
46
+
47
+ it 'leaves alone "unknown" codes in coded fields' do
48
+ person.sex.should == "-6"
49
+ end
50
+
51
+ it 'completely ignores records whose key is an "unknown" code' do
52
+ reader.select { |rec| rec.class.name =~ /Ssu$/ }.collect(&:key).should == [['13']]
36
53
  end
37
54
 
38
55
  describe 'with a blank variable value' do
@@ -228,7 +228,8 @@ module NcsNavigator::Warehouse
228
228
  end
229
229
 
230
230
  describe 'the default filename', :slow, :use_mdes do
231
- subject { XmlEmitter.new(spec_config, nil).filename }
231
+ subject { XmlEmitter.new(spec_config, nil, options).filename }
232
+ let(:options) { { } }
232
233
 
233
234
  before do
234
235
  pending "ncs_mdes doesn't work on JRuby" if RUBY_PLATFORM == 'java'
@@ -239,13 +240,18 @@ module NcsNavigator::Warehouse
239
240
  # Time.parse uses Time.now internally, so this needs to be
240
241
  # defined before starting to register the mock.
241
242
  t = Time.parse('2011-07-28')
242
- Time.should_receive(:now).and_return(t)
243
+ Time.stub!(:now).and_return(t)
243
244
  end
244
245
 
245
246
  it 'is county_name-DATE.xml' do
246
247
  subject.to_s.should == 'bear_lake-20110728.xml'
247
248
  end
248
249
 
250
+ it 'is county_name-DATE-PII.xml when PII is included' do
251
+ options[:'include-pii'] = true
252
+ subject.to_s.should == 'bear_lake-20110728-PII.xml'
253
+ end
254
+
249
255
  it 'is a Pathname' do
250
256
  subject.should be_a Pathname
251
257
  end
@@ -78,9 +78,10 @@ RSpec.configure do |config|
78
78
  end
79
79
 
80
80
  config.after(:each, :use_database) do
81
+ DataMapper.repository.adapter.execute("SET client_min_messages = warning")
81
82
  ::DataMapper::Model.descendants.each do |model|
82
83
  begin
83
- DataMapper.repository.adapter.execute("TRUNCATE TABLE #{model.storage_name}")
84
+ DataMapper.repository.adapter.execute("TRUNCATE TABLE #{model.storage_name} CASCADE")
84
85
  rescue DataObjects::SyntaxError
85
86
  # table was never created
86
87
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ncs_mdes_warehouse
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,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-01-03 00:00:00.000000000Z
12
+ date: 2012-02-19 00:00:00.000000000Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: ncs_mdes
16
- requirement: &2152198740 !ruby/object:Gem::Requirement
16
+ requirement: &70266978643600 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ~>
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: '0.5'
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *2152198740
24
+ version_requirements: *70266978643600
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: ncs_navigator_configuration
27
- requirement: &2152197440 !ruby/object:Gem::Requirement
27
+ requirement: &70266978643100 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ~>
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: '0.2'
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *2152197440
35
+ version_requirements: *70266978643100
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: activesupport
38
- requirement: &2152196400 !ruby/object:Gem::Requirement
38
+ requirement: &70266978642640 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ~>
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: '3.0'
44
44
  type: :runtime
45
45
  prerelease: false
46
- version_requirements: *2152196400
46
+ version_requirements: *70266978642640
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: i18n
49
- requirement: &2152195520 !ruby/object:Gem::Requirement
49
+ requirement: &70266978642180 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ~>
@@ -54,10 +54,10 @@ dependencies:
54
54
  version: '0.4'
55
55
  type: :runtime
56
56
  prerelease: false
57
- version_requirements: *2152195520
57
+ version_requirements: *70266978642180
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: thor
60
- requirement: &2152194580 !ruby/object:Gem::Requirement
60
+ requirement: &70266978641720 !ruby/object:Gem::Requirement
61
61
  none: false
62
62
  requirements:
63
63
  - - ~>
@@ -65,10 +65,10 @@ dependencies:
65
65
  version: 0.14.6
66
66
  type: :runtime
67
67
  prerelease: false
68
- version_requirements: *2152194580
68
+ version_requirements: *70266978641720
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: rubyzip
71
- requirement: &2152193540 !ruby/object:Gem::Requirement
71
+ requirement: &70266978641260 !ruby/object:Gem::Requirement
72
72
  none: false
73
73
  requirements:
74
74
  - - ~>
@@ -76,10 +76,10 @@ dependencies:
76
76
  version: 0.9.4
77
77
  type: :runtime
78
78
  prerelease: false
79
- version_requirements: *2152193540
79
+ version_requirements: *70266978641260
80
80
  - !ruby/object:Gem::Dependency
81
81
  name: childprocess
82
- requirement: &2152192480 !ruby/object:Gem::Requirement
82
+ requirement: &70266978640800 !ruby/object:Gem::Requirement
83
83
  none: false
84
84
  requirements:
85
85
  - - ~>
@@ -87,10 +87,10 @@ dependencies:
87
87
  version: 0.2.3
88
88
  type: :runtime
89
89
  prerelease: false
90
- version_requirements: *2152192480
90
+ version_requirements: *70266978640800
91
91
  - !ruby/object:Gem::Dependency
92
92
  name: json
93
- requirement: &2152191600 !ruby/object:Gem::Requirement
93
+ requirement: &70266978640340 !ruby/object:Gem::Requirement
94
94
  none: false
95
95
  requirements:
96
96
  - - ~>
@@ -98,10 +98,10 @@ dependencies:
98
98
  version: '1.6'
99
99
  type: :runtime
100
100
  prerelease: false
101
- version_requirements: *2152191600
101
+ version_requirements: *70266978640340
102
102
  - !ruby/object:Gem::Dependency
103
103
  name: nokogiri
104
- requirement: &2152190680 !ruby/object:Gem::Requirement
104
+ requirement: &70266978639880 !ruby/object:Gem::Requirement
105
105
  none: false
106
106
  requirements:
107
107
  - - ~>
@@ -109,10 +109,10 @@ dependencies:
109
109
  version: 1.5.0
110
110
  type: :runtime
111
111
  prerelease: false
112
- version_requirements: *2152190680
112
+ version_requirements: *70266978639880
113
113
  - !ruby/object:Gem::Dependency
114
114
  name: builder
115
- requirement: &2152189820 !ruby/object:Gem::Requirement
115
+ requirement: &70266978639420 !ruby/object:Gem::Requirement
116
116
  none: false
117
117
  requirements:
118
118
  - - ! '>='
@@ -120,10 +120,10 @@ dependencies:
120
120
  version: 2.1.2
121
121
  type: :runtime
122
122
  prerelease: false
123
- version_requirements: *2152189820
123
+ version_requirements: *70266978639420
124
124
  - !ruby/object:Gem::Dependency
125
125
  name: dm-core
126
- requirement: &2152188600 !ruby/object:Gem::Requirement
126
+ requirement: &70266978638800 !ruby/object:Gem::Requirement
127
127
  none: false
128
128
  requirements:
129
129
  - - ~>
@@ -131,10 +131,10 @@ dependencies:
131
131
  version: 1.2.0
132
132
  type: :runtime
133
133
  prerelease: false
134
- version_requirements: *2152188600
134
+ version_requirements: *70266978638800
135
135
  - !ruby/object:Gem::Dependency
136
136
  name: dm-constraints
137
- requirement: &2152187620 !ruby/object:Gem::Requirement
137
+ requirement: &70266978638360 !ruby/object:Gem::Requirement
138
138
  none: false
139
139
  requirements:
140
140
  - - ~>
@@ -142,10 +142,10 @@ dependencies:
142
142
  version: 1.2.0
143
143
  type: :runtime
144
144
  prerelease: false
145
- version_requirements: *2152187620
145
+ version_requirements: *70266978638360
146
146
  - !ruby/object:Gem::Dependency
147
147
  name: dm-migrations
148
- requirement: &2152186720 !ruby/object:Gem::Requirement
148
+ requirement: &70266974531160 !ruby/object:Gem::Requirement
149
149
  none: false
150
150
  requirements:
151
151
  - - ~>
@@ -153,10 +153,10 @@ dependencies:
153
153
  version: 1.2.0
154
154
  type: :runtime
155
155
  prerelease: false
156
- version_requirements: *2152186720
156
+ version_requirements: *70266974531160
157
157
  - !ruby/object:Gem::Dependency
158
158
  name: dm-transactions
159
- requirement: &2152185700 !ruby/object:Gem::Requirement
159
+ requirement: &70266974530720 !ruby/object:Gem::Requirement
160
160
  none: false
161
161
  requirements:
162
162
  - - ~>
@@ -164,10 +164,10 @@ dependencies:
164
164
  version: 1.2.0
165
165
  type: :runtime
166
166
  prerelease: false
167
- version_requirements: *2152185700
167
+ version_requirements: *70266974530720
168
168
  - !ruby/object:Gem::Dependency
169
169
  name: dm-validations
170
- requirement: &2152184580 !ruby/object:Gem::Requirement
170
+ requirement: &70266974530280 !ruby/object:Gem::Requirement
171
171
  none: false
172
172
  requirements:
173
173
  - - ~>
@@ -175,10 +175,10 @@ dependencies:
175
175
  version: 1.2.0
176
176
  type: :runtime
177
177
  prerelease: false
178
- version_requirements: *2152184580
178
+ version_requirements: *70266974530280
179
179
  - !ruby/object:Gem::Dependency
180
180
  name: dm-types
181
- requirement: &2152183640 !ruby/object:Gem::Requirement
181
+ requirement: &70266974529840 !ruby/object:Gem::Requirement
182
182
  none: false
183
183
  requirements:
184
184
  - - ~>
@@ -186,10 +186,10 @@ dependencies:
186
186
  version: 1.2.0
187
187
  type: :runtime
188
188
  prerelease: false
189
- version_requirements: *2152183640
189
+ version_requirements: *70266974529840
190
190
  - !ruby/object:Gem::Dependency
191
191
  name: dm-aggregates
192
- requirement: &2152182340 !ruby/object:Gem::Requirement
192
+ requirement: &70266974529400 !ruby/object:Gem::Requirement
193
193
  none: false
194
194
  requirements:
195
195
  - - ~>
@@ -197,10 +197,10 @@ dependencies:
197
197
  version: 1.2.0
198
198
  type: :runtime
199
199
  prerelease: false
200
- version_requirements: *2152182340
200
+ version_requirements: *70266974529400
201
201
  - !ruby/object:Gem::Dependency
202
202
  name: dm-postgres-adapter
203
- requirement: &2152181640 !ruby/object:Gem::Requirement
203
+ requirement: &70266974528960 !ruby/object:Gem::Requirement
204
204
  none: false
205
205
  requirements:
206
206
  - - ~>
@@ -208,10 +208,10 @@ dependencies:
208
208
  version: 1.2.0
209
209
  type: :runtime
210
210
  prerelease: false
211
- version_requirements: *2152181640
211
+ version_requirements: *70266974528960
212
212
  - !ruby/object:Gem::Dependency
213
213
  name: bcdatabase
214
- requirement: &2152180900 !ruby/object:Gem::Requirement
214
+ requirement: &70266974528500 !ruby/object:Gem::Requirement
215
215
  none: false
216
216
  requirements:
217
217
  - - ~>
@@ -219,10 +219,10 @@ dependencies:
219
219
  version: '1.1'
220
220
  type: :runtime
221
221
  prerelease: false
222
- version_requirements: *2152180900
222
+ version_requirements: *70266974528500
223
223
  - !ruby/object:Gem::Dependency
224
224
  name: rspec
225
- requirement: &2152180100 !ruby/object:Gem::Requirement
225
+ requirement: &70266974528040 !ruby/object:Gem::Requirement
226
226
  none: false
227
227
  requirements:
228
228
  - - ~>
@@ -230,10 +230,10 @@ dependencies:
230
230
  version: '2.6'
231
231
  type: :development
232
232
  prerelease: false
233
- version_requirements: *2152180100
233
+ version_requirements: *70266974528040
234
234
  - !ruby/object:Gem::Dependency
235
235
  name: rake
236
- requirement: &2152179300 !ruby/object:Gem::Requirement
236
+ requirement: &70266974527580 !ruby/object:Gem::Requirement
237
237
  none: false
238
238
  requirements:
239
239
  - - ~>
@@ -241,10 +241,10 @@ dependencies:
241
241
  version: 0.9.2
242
242
  type: :development
243
243
  prerelease: false
244
- version_requirements: *2152179300
244
+ version_requirements: *70266974527580
245
245
  - !ruby/object:Gem::Dependency
246
246
  name: yard
247
- requirement: &2152178340 !ruby/object:Gem::Requirement
247
+ requirement: &70266974527120 !ruby/object:Gem::Requirement
248
248
  none: false
249
249
  requirements:
250
250
  - - ~>
@@ -252,10 +252,10 @@ dependencies:
252
252
  version: 0.7.2
253
253
  type: :development
254
254
  prerelease: false
255
- version_requirements: *2152178340
255
+ version_requirements: *70266974527120
256
256
  - !ruby/object:Gem::Dependency
257
257
  name: ci_reporter
258
- requirement: &2152177500 !ruby/object:Gem::Requirement
258
+ requirement: &70266974526660 !ruby/object:Gem::Requirement
259
259
  none: false
260
260
  requirements:
261
261
  - - =
@@ -263,10 +263,10 @@ dependencies:
263
263
  version: 1.6.6
264
264
  type: :development
265
265
  prerelease: false
266
- version_requirements: *2152177500
266
+ version_requirements: *70266974526660
267
267
  - !ruby/object:Gem::Dependency
268
268
  name: fakefs
269
- requirement: &2152176600 !ruby/object:Gem::Requirement
269
+ requirement: &70266974526200 !ruby/object:Gem::Requirement
270
270
  none: false
271
271
  requirements:
272
272
  - - ~>
@@ -274,7 +274,7 @@ dependencies:
274
274
  version: 0.4.0
275
275
  type: :development
276
276
  prerelease: false
277
- version_requirements: *2152176600
277
+ version_requirements: *70266974526200
278
278
  description:
279
279
  email:
280
280
  - r-sutphin@northwestern.edu
@@ -596,6 +596,7 @@ files:
596
596
  - spec/navigator.ini
597
597
  - spec/ncs_navigator/warehouse/configuration_spec.rb
598
598
  - spec/ncs_navigator/warehouse/data_mapper_spec.rb
599
+ - spec/ncs_navigator/warehouse/database_initializer_spec.rb
599
600
  - spec/ncs_navigator/warehouse/models/mdes_model_spec.rb
600
601
  - spec/ncs_navigator/warehouse/postgresql/pgpass_spec.rb
601
602
  - spec/ncs_navigator/warehouse/table_modeler_spec.rb
@@ -633,7 +634,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
633
634
  version: '0'
634
635
  requirements: []
635
636
  rubyforge_project:
636
- rubygems_version: 1.8.10
637
+ rubygems_version: 1.8.15
637
638
  signing_key:
638
639
  specification_version: 3
639
640
  summary: Scripts and models for building and maintaining the MDES-based reporting
@@ -646,6 +647,7 @@ test_files:
646
647
  - spec/navigator.ini
647
648
  - spec/ncs_navigator/warehouse/configuration_spec.rb
648
649
  - spec/ncs_navigator/warehouse/data_mapper_spec.rb
650
+ - spec/ncs_navigator/warehouse/database_initializer_spec.rb
649
651
  - spec/ncs_navigator/warehouse/models/mdes_model_spec.rb
650
652
  - spec/ncs_navigator/warehouse/postgresql/pgpass_spec.rb
651
653
  - spec/ncs_navigator/warehouse/table_modeler_spec.rb