ndr_import 4.0.0 → 4.0.1

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: ee9c5c86bbcd00af6877225040d6beb01007575d
4
- data.tar.gz: 7dabb1d68c3467314e90f916f7ccb573be33ea1a
3
+ metadata.gz: 0b9dfb908b8fd54add87023de9f374e6b3a74af9
4
+ data.tar.gz: a0d67ce391abf53242f15e221df6cb297f83cb14
5
5
  SHA512:
6
- metadata.gz: d9a13b367b3b094c041221b989456af8dfa1571395fd0b4ba11e1fcae10d830ea6b50b89a8f59f7bd72bc49209419c3f9bfbbfe86f9c0b47cbdf600b5e754508
7
- data.tar.gz: a8da74311916a789f8203407fc1bfd7db5540940efdf28a1d96b615fa8f52321f7c541596d82a69f8ee704ad50863bf547ec812a86d138d82dfda59d79ba3b9d
6
+ metadata.gz: 46478e258b56cf0cebe45f8255087bbd48371bb0f4e5a1c30ce69e2b40d1500fa24427f8eea949a21a72ab22ef6e5e147283706d99fbe900f490502422b2b5a5
7
+ data.tar.gz: de540d72430687fd0c2731bd810910fc65ba0edf0c05798e6970f437ebbc451b58f9c7a77df35862b830e5b31f973fb3bc264d9646967de42d62a6d6d5db5d41
data/.rubocop.yml CHANGED
@@ -11,6 +11,10 @@ HashSyntax:
11
11
  - ruby19
12
12
  - hash_rockets
13
13
 
14
+ # Override HoundCI's preference for double quotes:
15
+ Style/StringLiterals:
16
+ EnforcedStyle: single_quotes
17
+
14
18
  # Would enforce "-> { }", which we cannot use yet.
15
19
  Lambda:
16
20
  Enabled: false
data/code_safety.yml CHANGED
@@ -10,8 +10,8 @@ file safety:
10
10
  safe_revision: df3c0be0e655f4fc95c86d4a57bda6eef1fb8955
11
11
  ".rubocop.yml":
12
12
  comments:
13
- reviewed_by: josh.pencheon
14
- safe_revision: 899c079b3a8aaa60cddebc062f072f8d7074cdc8
13
+ reviewed_by: joshpencheon
14
+ safe_revision: ac40ad6e6a9d79d139ba063681f3fe6093c73b14
15
15
  ".travis.yml":
16
16
  comments:
17
17
  reviewed_by: josh.pencheon
@@ -158,12 +158,12 @@ file safety:
158
158
  safe_revision: 3c7f827d17aacbf7b811eea67e27553f3b039070
159
159
  lib/ndr_import/table.rb:
160
160
  comments: uses File.basename
161
- reviewed_by: timgentry
162
- safe_revision: cf382902508a21a95b80ac4582fbbd117164e80e
161
+ reviewed_by: joshpencheon
162
+ safe_revision: e70ece909c44b26208eaff3cf27ada7145e03f11
163
163
  lib/ndr_import/version.rb:
164
164
  comments: another check?
165
165
  reviewed_by: joshpencheon
166
- safe_revision: 04a29ed03b6772091d7208403f0acc5032117149
166
+ safe_revision: 00e02b83f5ae640becdb98d378eddfb67f8ae5c5
167
167
  ndr_import.gemspec:
168
168
  comments:
169
169
  reviewed_by: josh.pencheon
@@ -394,8 +394,8 @@ file safety:
394
394
  safe_revision: 3c7f827d17aacbf7b811eea67e27553f3b039070
395
395
  test/table_test.rb:
396
396
  comments:
397
- reviewed_by: timgentry
398
- safe_revision: 6bb588c17d33a604c96c648c6eebfe2d063dfbc0
397
+ reviewed_by: joshpencheon
398
+ safe_revision: e70ece909c44b26208eaff3cf27ada7145e03f11
399
399
  test/test_helper.rb:
400
400
  comments:
401
401
  reviewed_by: joshpencheon
@@ -46,6 +46,7 @@ module NdrImport
46
46
 
47
47
  @row_index = 0
48
48
  @header_valid = false
49
+ @header_best_guess = nil
49
50
  @notifier.try(:started)
50
51
 
51
52
  skip_footer_lines(lines, footer_lines).each do |line|
@@ -63,7 +64,7 @@ module NdrImport
63
64
  if @row_index < header_lines
64
65
  validate_header(line, @columns)
65
66
  else
66
- fail 'Header is not valid' if header_lines > 0 && !header_valid?
67
+ fail_unless_header_complete(@columns)
67
68
  transform_line(line, @row_index, &block)
68
69
  end
69
70
 
@@ -165,10 +166,37 @@ module NdrImport
165
166
  # if there is a header, then check the column headings are as expected in the correct order
166
167
  def validate_header(line, column_mappings)
167
168
  columns = column_names(column_mappings)
168
- fail 'Number of columns does not match' if line.length != columns.length
169
169
 
170
- return unless line.map(&:downcase) == columns
171
- @header_valid = true
170
+ unless line.length == columns.length
171
+ fail "Number of columns does not match; expected #{columns.length}, got #{line.length}!"
172
+ end
173
+
174
+ header_guess = line.map(&:downcase)
175
+
176
+ @header_best_guess = header_guess if header_guess.any?(&:present?)
177
+ @header_valid = true if header_guess == columns
178
+ end
179
+
180
+ def fail_unless_header_complete(column_mappings)
181
+ return unless header_lines > 0 && !header_valid?
182
+
183
+ expected_names = column_names(column_mappings)
184
+ received_names = @header_best_guess || []
185
+
186
+ unexpected = received_names - expected_names
187
+ missing = expected_names - received_names
188
+
189
+ fail header_message_for(missing, unexpected)
190
+ end
191
+
192
+ def header_message_for(missing, unexpected)
193
+ message = ['Header is not valid!']
194
+
195
+ message << "missing: #{missing.inspect}" if missing.any?
196
+ message << "unexpected: #{unexpected.inspect}" if unexpected.any?
197
+ message << '(out of order)' if missing.none? && unexpected.none?
198
+
199
+ message.join(' ')
172
200
  end
173
201
 
174
202
  # returns the column names as we expect to receive them
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
  # This stores the current version of the NdrImport gem
3
3
  module NdrImport
4
- VERSION = '4.0.0'.freeze
4
+ VERSION = '4.0.1'.freeze
5
5
  end
data/test/table_test.rb CHANGED
@@ -243,6 +243,66 @@ class TableTest < ActiveSupport::TestCase
243
243
  assert_equal expected_output, output
244
244
  end
245
245
 
246
+ def test_invalid_header_length
247
+ lines = [
248
+ %w(NOTHEADING1 NOTHEADING2 UHOH3 UHOH4),
249
+ %w(ONE TWO),
250
+ %w(DEFINITELYNOTHEADING1 DEFINITELYNOTHEADING2)
251
+ ].each
252
+
253
+ table = NdrImport::Table.new(:header_lines => 3, :footer_lines => 0,
254
+ :klass => 'SomeTestKlass',
255
+ :columns => [{ 'column' => 'one' }, { 'column' => 'two' }])
256
+
257
+ exception = assert_raises(RuntimeError) { table.transform(lines).to_a }
258
+ assert_match(/expected 2, got 4/, exception.message)
259
+ end
260
+
261
+ def test_jumbled_header
262
+ lines = [
263
+ %w(NOTHEADING1 NOTHEADING2 NOTHEADING3),
264
+ %w(ONE THREE TWO),
265
+ %w(DATA ROW HERE)
266
+ ].each
267
+
268
+ table = NdrImport::Table.new(
269
+ :header_lines => 2,
270
+ :footer_lines => 0,
271
+ :klass => 'SomeTestKlass',
272
+ :columns => [
273
+ { 'column' => 'one' },
274
+ { 'column' => 'two' },
275
+ { 'column' => 'three' }
276
+ ]
277
+ )
278
+
279
+ exception = assert_raises(RuntimeError) { table.transform(lines).to_a }
280
+ assert_equal('Header is not valid! (out of order)', exception.message)
281
+ end
282
+
283
+ def test_wrong_header_names
284
+ lines = [
285
+ %w(NOTHEADING1 NOTHEADING2 NOTHEADING3),
286
+ %w(FUN TWO TREE),
287
+ %w(DATA ROW HERE)
288
+ ].each
289
+
290
+ table = NdrImport::Table.new(
291
+ :header_lines => 2,
292
+ :footer_lines => 0,
293
+ :klass => 'SomeTestKlass',
294
+ :columns => [
295
+ { 'column' => 'one' },
296
+ { 'column' => 'two' },
297
+ { 'column' => 'three' }
298
+ ]
299
+ )
300
+
301
+ exception = assert_raises(RuntimeError) { table.transform(lines).to_a }
302
+ assert_equal('Header is not valid! missing: ' \
303
+ '["one", "three"] unexpected: ["fun", "tree"]', exception.message)
304
+ end
305
+
246
306
  private
247
307
 
248
308
  def simple_deserialized_table
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ndr_import
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.0.0
4
+ version: 4.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - NCRS Development Team
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-03-17 00:00:00.000000000 Z
11
+ date: 2016-04-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport