ndr_import 4.0.0 → 4.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +4 -0
- data/code_safety.yml +7 -7
- data/lib/ndr_import/table.rb +32 -4
- data/lib/ndr_import/version.rb +1 -1
- data/test/table_test.rb +60 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0b9dfb908b8fd54add87023de9f374e6b3a74af9
|
4
|
+
data.tar.gz: a0d67ce391abf53242f15e221df6cb297f83cb14
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 46478e258b56cf0cebe45f8255087bbd48371bb0f4e5a1c30ce69e2b40d1500fa24427f8eea949a21a72ab22ef6e5e147283706d99fbe900f490502422b2b5a5
|
7
|
+
data.tar.gz: de540d72430687fd0c2731bd810910fc65ba0edf0c05798e6970f437ebbc451b58f9c7a77df35862b830e5b31f973fb3bc264d9646967de42d62a6d6d5db5d41
|
data/.rubocop.yml
CHANGED
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:
|
14
|
-
safe_revision:
|
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:
|
162
|
-
safe_revision:
|
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:
|
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:
|
398
|
-
safe_revision:
|
397
|
+
reviewed_by: joshpencheon
|
398
|
+
safe_revision: e70ece909c44b26208eaff3cf27ada7145e03f11
|
399
399
|
test/test_helper.rb:
|
400
400
|
comments:
|
401
401
|
reviewed_by: joshpencheon
|
data/lib/ndr_import/table.rb
CHANGED
@@ -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
|
-
|
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
|
-
|
171
|
-
|
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
|
data/lib/ndr_import/version.rb
CHANGED
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.
|
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-
|
11
|
+
date: 2016-04-01 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|