ndr_import 4.1.4 → 5.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3ce8655ee8ebe40d7df275d8a7a029e5f8a778b5dca6ee94b2a7df857b84fa85
4
- data.tar.gz: 128b840a7a26d6f245ee6532b3ec371d190d1c3b7aaadfe233a3039035bab7b8
3
+ metadata.gz: c3697b01f732fdef03d66858b9f699b0c95673824332a1d4f2d8fa2b845aed24
4
+ data.tar.gz: 87bb849993db749b7b9a58d2a47be6b1f4ecd5a928f9541f97529452836f7fb1
5
5
  SHA512:
6
- metadata.gz: 352e35cc8ac5ca10739864fae020ff7960a932da0e91bd1f7d493af841559b40fc8dc1ebafd8608683680bde4a40314a9138e4ea1cfc962cbeb97e4e216bceec
7
- data.tar.gz: 9702cecbf759bb74389870d2679a07a3f57d1e8aaac04c5a82218b8e64b4380b42ddc8575be8eb73f27ee090bdc028a84ae6e36ed4c47ba2243ec3c927815993
6
+ metadata.gz: 445825462bf049b2d8ebacd391695176302924e8b12a5e08c283e9b5ed32bb9600befa48c6777ed038f8a2f6c257604d3c86b899b795fd8d13e7980f85b7911f
7
+ data.tar.gz: a9c796eb0f8d1914df8fc1dc5c943c49ab7de68f7f109e2e917637a88262d334ef1e1a47f5f23571a910e51664109851f4748988c0b8592cf3c376f8d8c5b0cd
data/.gitignore CHANGED
@@ -1,3 +1,4 @@
1
+ /.rubocop-https---raw-githubusercontent-com-PublicHealthEngland-ndr-dev-support-master--rubocop-yml
1
2
  /.bundle/
2
3
  /.yardoc
3
4
  /Gemfile.lock
data/.rubocop.yml CHANGED
@@ -1,32 +1 @@
1
- Rails:
2
- Enabled: true
3
-
4
- # Multi-line method chaining should be done with trailing dots.
5
- Style/DotPosition:
6
- EnforcedStyle: trailing
7
-
8
- HashSyntax:
9
- EnforcedStyle: hash_rockets
10
- SupportedStyles:
11
- - ruby19
12
- - hash_rockets
13
-
14
- # Override HoundCI's preference for double quotes:
15
- Style/StringLiterals:
16
- EnforcedStyle: single_quotes
17
-
18
- # Would enforce "-> { }", which we cannot use yet.
19
- Lambda:
20
- Enabled: false
21
-
22
- # ...
23
- LineLength:
24
- Max: 99
25
-
26
- # Relax some of the cops for tests
27
- Metrics/ClassLength:
28
- Exclude:
29
- - test/**/*.rb
30
- Metrics/MethodLength:
31
- Exclude:
32
- - test/**/*.rb
1
+ inherit_from: 'https://raw.githubusercontent.com/PublicHealthEngland/ndr_dev_support/master/.rubocop.yml'
data/.travis.yml CHANGED
@@ -1,19 +1,21 @@
1
1
  language: ruby
2
-
3
2
  rvm:
4
- - 2.2.5
5
- - 2.3.1
6
-
3
+ - 2.3
4
+ - 2.4
5
+ - 2.5
7
6
  gemfile:
8
- - gemfiles/Gemfile.rails32
9
- - gemfiles/Gemfile.rails41
10
- - gemfiles/Gemfile.rails42
11
- - gemfiles/Gemfile.rails50
12
-
7
+ - gemfiles/Gemfile.rails42
8
+ - gemfiles/Gemfile.rails50
9
+ - gemfiles/Gemfile.rails51
10
+ - gemfiles/Gemfile.rails52
13
11
  sudo: false
14
-
15
12
  cache: bundler
16
-
17
- before_script: "bundle update"
18
-
19
- script: "bundle exec rake test"
13
+ before_script: bundle update
14
+ script: bundle exec rake test
15
+ notifications:
16
+ slack:
17
+ on_pull_requests: false
18
+ on_success: always
19
+ on_failure: always
20
+ rooms:
21
+ secure: NMd9N/jNbECT/fCUBxPDKy4IMpUnRdMhobwa+9kDRaWYbRAwIkHLd8sI1l63qx7O03SlDpsHLLckjayMKS35gO/wRmgC7T8k9ppW75Xs5D4jR/j3FdTFawnXF+wVx0ddQrpH0K8oftPX1euPEllIh7+bJUYct/Siv0UX5eP+qyHT0gKtbDlI2CMKOcOHE8Q/zwjx0mLVSj/0U+HRx5+sMEDcwPupzhCYLdIAtenHsZ2Zmo2uSqOzK9Ruf3UsIh3gVSKXWGvXQzG8bIxogIJbEbwIk/gQyMr7UXwgNzhltPz1CqOrrTmSonrd3HbLVajJvDWPMBPGDZrUyipiW/MOUKpXgd8CsL46o4icYIZIAYEWLsn/AJkrA+UQZ8S5poR06jNH8xrI0eUQsu6maWhJ/rPfzwb6x2hCCyk2iQsGtO+SPCUrWnT1T3ir8H0HStD+AZ4/yz4cdWlClchko2ZfqS0q3Yv5jF3K4iVOF4GOUo01Ft+LDU3sPC7Ngq51bejoaLTzexiOfEaF0kKvB8XNXYYjV5ATNJ8XWQR7ISJ+na4FCwt4KaKtC864TWWDTxaz6lfr0B3Wf0lZLH22+BhpzrfPWFo3YGyMsOcgPU0rPHrtAzks55rqCTQEOaKTw4rfEmuMEFJK/y80GYS2jTPu0nCnJo4NdV1fVuSSD8iUFAM=
data/code_safety.yml CHANGED
@@ -3,19 +3,19 @@ file safety:
3
3
  ".gitignore":
4
4
  comments: whole file re-reviewed
5
5
  reviewed_by: josh.pencheon
6
- safe_revision: d22b012a99fb1f8d94acbe445b6170f251a7b4a2
6
+ safe_revision: 3ef51291c413fd5772d61a8394359146a02ae628
7
7
  ".hound.yml":
8
8
  comments:
9
9
  reviewed_by: timgentry
10
10
  safe_revision: df3c0be0e655f4fc95c86d4a57bda6eef1fb8955
11
11
  ".rubocop.yml":
12
12
  comments:
13
- reviewed_by: joshpencheon
14
- safe_revision: ac40ad6e6a9d79d139ba063681f3fe6093c73b14
13
+ reviewed_by: josh.pencheon
14
+ safe_revision: b09e268ff9c8349b914aa1b7ba888e1d39f97e4a
15
15
  ".travis.yml":
16
16
  comments:
17
17
  reviewed_by: josh.pencheon
18
- safe_revision: f9de73c5988557e29ea73c279f2fdae19ffa8bb4
18
+ safe_revision: 661b5b8e71572bba28aa92fb95aa218e3f8444f4
19
19
  CODE_OF_CONDUCT.md:
20
20
  comments:
21
21
  reviewed_by: timgentry
@@ -40,14 +40,6 @@ file safety:
40
40
  comments:
41
41
  reviewed_by: josh.pencheon
42
42
  safe_revision: 5a7f26cecaabab20f4e666776f9166dcc3fa6bfe
43
- gemfiles/Gemfile.rails32:
44
- comments:
45
- reviewed_by: timgentry
46
- safe_revision: 0c5967732100f43e7b60a97a7f0aae60d3641791
47
- gemfiles/Gemfile.rails41:
48
- comments:
49
- reviewed_by: timgentry
50
- safe_revision: 0c5967732100f43e7b60a97a7f0aae60d3641791
51
43
  gemfiles/Gemfile.rails42:
52
44
  comments:
53
45
  reviewed_by: timgentry
@@ -56,6 +48,14 @@ file safety:
56
48
  comments:
57
49
  reviewed_by: josh.pencheon
58
50
  safe_revision: 738577adf8eeacc7a000d08289bd7ae7bf3b5849
51
+ gemfiles/Gemfile.rails51:
52
+ comments:
53
+ reviewed_by: josh.pencheon
54
+ safe_revision: eedd8f5588edd2a9463250fcddc5602f62ab26f1
55
+ gemfiles/Gemfile.rails52:
56
+ comments:
57
+ reviewed_by: josh.pencheon
58
+ safe_revision: c158dc783b84cab31380708e76e3812544cc1c2f
59
59
  lib/ndr_import.rb:
60
60
  comments:
61
61
  reviewed_by: timgentry
@@ -63,7 +63,7 @@ file safety:
63
63
  lib/ndr_import/csv_library.rb:
64
64
  comments:
65
65
  reviewed_by: josh.pencheon
66
- safe_revision: 20939133f61ed102feb2a841b6c43b86f385b972
66
+ safe_revision: be12e57519d3737e8d3901d7b01485c6995708dd
67
67
  lib/ndr_import/file/all.rb:
68
68
  comments:
69
69
  reviewed_by: timgentry
@@ -75,7 +75,7 @@ file safety:
75
75
  lib/ndr_import/file/delimited.rb:
76
76
  comments:
77
77
  reviewed_by: josh.pencheon
78
- safe_revision: 62702f103dd41c188684cfda73a94401b130cd01
78
+ safe_revision: be12e57519d3737e8d3901d7b01485c6995708dd
79
79
  lib/ndr_import/file/excel.rb:
80
80
  comments:
81
81
  reviewed_by: joshpencheon
@@ -102,8 +102,8 @@ file safety:
102
102
  safe_revision: c88000b32401b5ae9ef7f5878a9b630506ab5a94
103
103
  lib/ndr_import/helpers/file/delimited.rb:
104
104
  comments:
105
- reviewed_by: joshpencheon
106
- safe_revision: 06fd16643d02957ce856728e4911143c8e0178dc
105
+ reviewed_by: josh.pencheon
106
+ safe_revision: be12e57519d3737e8d3901d7b01485c6995708dd
107
107
  lib/ndr_import/helpers/file/excel.rb:
108
108
  comments:
109
109
  reviewed_by: joshpencheon
@@ -119,15 +119,15 @@ file safety:
119
119
  lib/ndr_import/helpers/file/xml.rb:
120
120
  comments:
121
121
  reviewed_by: josh.pencheon
122
- safe_revision: 4d20f3483a073b8de681b06355e7c532dc68f674
122
+ safe_revision: d2245268ec6a0e4f60c521d171a820f299632c4f
123
123
  lib/ndr_import/helpers/file/zip.rb:
124
124
  comments:
125
125
  reviewed_by: timgentry
126
126
  safe_revision: 6c6f204fab2f4232d81cb76aa523c26b0c490ae7
127
127
  lib/ndr_import/mapper.rb:
128
- comments: digests changed on branch
128
+ comments:
129
129
  reviewed_by: josh.pencheon
130
- safe_revision: 0627a1e730c4a3ede183ddac90fb8eef7e8da5dd
130
+ safe_revision: fbd4e1bfda8acd9ae026601dc4ecdabca5be4bc7
131
131
  lib/ndr_import/mapping_error.rb:
132
132
  comments:
133
133
  reviewed_by: timgentry
@@ -161,10 +161,9 @@ file safety:
161
161
  reviewed_by: josh.pencheon
162
162
  safe_revision: 3c7f827d17aacbf7b811eea67e27553f3b039070
163
163
  lib/ndr_import/table.rb:
164
- comments: 'uses File.basename. Revision 5c8b12ca9b88a3bba972aaa2e38cdae25403e033:
165
- digests changed on branch'
164
+ comments: uses File.basename
166
165
  reviewed_by: josh.pencheon
167
- safe_revision: 5c8b12ca9b88a3bba972aaa2e38cdae25403e033
166
+ safe_revision: 14775e7262dbec3b6d0f69930ff526f856a94214
168
167
  lib/ndr_import/universal_importer_helper.rb:
169
168
  comments:
170
169
  reviewed_by: josh.pencheon
@@ -172,11 +171,11 @@ file safety:
172
171
  lib/ndr_import/version.rb:
173
172
  comments: another check?
174
173
  reviewed_by: josh.pencheon
175
- safe_revision: fa2ddc1ad2bda3c2a262a4cc82c78e1983718052
174
+ safe_revision: 1df87077495c1f595023bdbbd1e0bfb220dc5da5
176
175
  ndr_import.gemspec:
177
- comments: digests changed on branch
176
+ comments:
178
177
  reviewed_by: josh.pencheon
179
- safe_revision: bd53fc8ae3ad5fb9caab9e79fe05fe578202849e
178
+ safe_revision: b3f39d7243c41a44594336c3feed3b29c2386a0e
180
179
  test/file/base_test.rb:
181
180
  comments:
182
181
  reviewed_by: timgentry
@@ -184,19 +183,19 @@ file safety:
184
183
  test/file/delimited_test.rb:
185
184
  comments:
186
185
  reviewed_by: josh.pencheon
187
- safe_revision: 62702f103dd41c188684cfda73a94401b130cd01
186
+ safe_revision: be12e57519d3737e8d3901d7b01485c6995708dd
188
187
  test/file/excel_test.rb:
189
188
  comments:
190
189
  reviewed_by: joshpencheon
191
190
  safe_revision: 334d53bb9e8698bba3d92b4dbd71b36faacae629
192
191
  test/file/pdf_test.rb:
193
192
  comments:
194
- reviewed_by: timgentry
195
- safe_revision: c88000b32401b5ae9ef7f5878a9b630506ab5a94
193
+ reviewed_by: josh.pencheon
194
+ safe_revision: f82e6839f7e3f9932a6f92242c03d94234fc1d82
196
195
  test/file/registry_test.rb:
197
196
  comments:
198
- reviewed_by: timgentry
199
- safe_revision: c88000b32401b5ae9ef7f5878a9b630506ab5a94
197
+ reviewed_by: josh.pencheon
198
+ safe_revision: f82e6839f7e3f9932a6f92242c03d94234fc1d82
200
199
  test/file/text_test.rb:
201
200
  comments:
202
201
  reviewed_by: timgentry
@@ -219,8 +218,8 @@ file safety:
219
218
  safe_revision: 377c060bd1e012d6e162a4ab8923a3609aacdf57
220
219
  test/helpers/file/pdf_test.rb:
221
220
  comments:
222
- reviewed_by: timgentry
223
- safe_revision: 9abdd6ced1d0c90ce8dd88abee4eb6472c7ff0d6
221
+ reviewed_by: josh.pencheon
222
+ safe_revision: f82e6839f7e3f9932a6f92242c03d94234fc1d82
224
223
  test/helpers/file/word_test.rb:
225
224
  comments:
226
225
  reviewed_by: timgentry
@@ -234,10 +233,9 @@ file safety:
234
233
  reviewed_by: josh.pencheon
235
234
  safe_revision: 9abdd6ced1d0c90ce8dd88abee4eb6472c7ff0d6
236
235
  test/mapper_test.rb:
237
- comments: 'exposes Mapper internals to test them. Revision f707f42686cabe21d80e2547e9a24fe094b6c7d1:
238
- digests changed on branch'
236
+ comments: exposes Mapper internals to test them
239
237
  reviewed_by: josh.pencheon
240
- safe_revision: f707f42686cabe21d80e2547e9a24fe094b6c7d1
238
+ safe_revision: 3cea78767a73fd0d0ae64a4af3f07389e45349e9
241
239
  test/non_tabular/mapping_test.rb:
242
240
  comments:
243
241
  reviewed_by: timgentry
@@ -304,8 +302,8 @@ file safety:
304
302
  safe_revision: 45da71ebd3acbc0fe53755bcd75483ba17cb6924
305
303
  test/resources/hello_world.pdf:
306
304
  comments:
307
- reviewed_by: timgentry
308
- safe_revision: ed2360bd226dd6babb7683f2f888ba9547ff7e53
305
+ reviewed_by: josh.pencheon
306
+ safe_revision: f82e6839f7e3f9932a6f92242c03d94234fc1d82
309
307
  test/resources/hello_world.txt:
310
308
  comments:
311
309
  reviewed_by: timgentry
@@ -404,12 +402,12 @@ file safety:
404
402
  safe_revision: 3c7f827d17aacbf7b811eea67e27553f3b039070
405
403
  test/table_test.rb:
406
404
  comments:
407
- reviewed_by: joshpencheon
408
- safe_revision: e70ece909c44b26208eaff3cf27ada7145e03f11
405
+ reviewed_by: josh.pencheon
406
+ safe_revision: 14775e7262dbec3b6d0f69930ff526f856a94214
409
407
  test/test_helper.rb:
410
408
  comments:
411
409
  reviewed_by: josh.pencheon
412
- safe_revision: 53cc0af4321b64746367231b65821fda0f8d8a0a
410
+ safe_revision: 72750275da2193cc9ed362da85b88e9b5054f2d7
413
411
  test/universal_importer_helper_test.rb:
414
412
  comments:
415
413
  reviewed_by: josh.pencheon
@@ -0,0 +1,6 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec path: '..'
4
+
5
+ # Minitest 5.10.2 doesn't work with Rails version
6
+ gem 'minitest', '< 5.10.2'
@@ -0,0 +1,7 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec path: '..'
4
+
5
+ gem 'activesupport', '~> 5.2.0'
6
+
7
+ gem 'ndr_support', tag: 'v5.4.0', git: 'https://github.com/PublicHealthEngland/ndr_support'
@@ -10,6 +10,14 @@ class << CSVLibrary
10
10
  not self.const_defined?(:Reader)
11
11
  end
12
12
 
13
+ # Ensure that we can pass "mode" straight through the underlying IO object
14
+ def foreach(path, **options, &block)
15
+ return to_enum(__method__, path, options) unless block
16
+ open(path, options.delete(:mode) || 'r', options) do |csv|
17
+ csv.each(&block)
18
+ end
19
+ end
20
+
13
21
  def write_csv_to_string(data)
14
22
  self.generate do |csv|
15
23
  data.each { |line| csv << line }
@@ -46,17 +46,17 @@ module NdrImport
46
46
  def determine_encodings!(safe_path)
47
47
  # delimiter encoding => # FasterCSV encoding string
48
48
  supported_encodings = {
49
- 'UTF-8' => 'bom|utf-8',
50
- 'Windows-1252' => 'windows-1252:utf-8'
49
+ 'UTF-8' => 'r:bom|utf-8',
50
+ 'Windows-1252' => 'r:windows-1252:utf-8'
51
51
  }
52
52
 
53
53
  successful_options = nil
54
- supported_encodings.each do |delimiter_encoding, csv_encoding|
54
+ supported_encodings.each do |delimiter_encoding, access_mode|
55
55
  begin
56
56
  col_sep = @options['col_sep']
57
57
  options = {
58
58
  :col_sep => (col_sep || ',').force_encoding(delimiter_encoding),
59
- :encoding => csv_encoding
59
+ :mode => access_mode
60
60
  }
61
61
 
62
62
  row_num = 0
@@ -48,16 +48,16 @@ module NdrImport
48
48
  def determine_encodings!(safe_path, col_sep = nil)
49
49
  # delimiter encoding => # FasterCSV encoding string
50
50
  supported_encodings = {
51
- 'UTF-8' => 'bom|utf-8',
52
- 'Windows-1252' => 'windows-1252:utf-8'
51
+ 'UTF-8' => 'r:bom|utf-8',
52
+ 'Windows-1252' => 'r:windows-1252:utf-8'
53
53
  }
54
54
 
55
55
  successful_options = nil
56
- supported_encodings.each do |delimiter_encoding, csv_encoding|
56
+ supported_encodings.each do |delimiter_encoding, access_mode|
57
57
  begin
58
58
  options = {
59
- :col_sep => (col_sep || ',').force_encoding(delimiter_encoding),
60
- :encoding => csv_encoding
59
+ :col_sep => (col_sep || ',').force_encoding(delimiter_encoding),
60
+ :mode => access_mode
61
61
  }
62
62
 
63
63
  row_num = 0
@@ -31,13 +31,16 @@ module NdrImport
31
31
  # We let slide any warnings about xml declared as one of our
32
32
  # auto encodings, but parsed as UTF-8:
33
33
  encoding_pattern = AUTO_ENCODINGS.map { |name| Regexp.escape(name) }.join('|')
34
- encoding_warning = /\A(\d+:\d+: FATAL: )?Document labelled (#{encoding_pattern}) but has UTF-8 content\z/
34
+ encoding_warning = /Document labelled (#{encoding_pattern}) but has UTF-8 content\z/
35
35
  fatal_errors = document.errors.select do |error|
36
36
  error.fatal? && (encoding_warning !~ error.message)
37
37
  end
38
38
 
39
39
  return unless fatal_errors.any?
40
- fail Nokogiri::XML::SyntaxError, "The file had #{fatal_errors.length} fatal error(s)!"
40
+ raise Nokogiri::XML::SyntaxError, <<~MSG
41
+ The file had #{fatal_errors.length} fatal error(s)!"
42
+ #{fatal_errors.join("\n")}
43
+ MSG
41
44
  end
42
45
  end
43
46
  end
@@ -177,11 +177,14 @@ module NdrImport::Mapper
177
177
  raise e2
178
178
  end
179
179
  elsif field_mapping.include?(Strings::CLEAN)
180
- return original_value.blank? ? nil : original_value.clean(field_mapping[Strings::CLEAN])
180
+ return nil if original_value.blank?
181
+
182
+ cleaners = Array(field_mapping[Strings::CLEAN])
183
+ return cleaners.inject(original_value) { |a, e| a.clean(e) }
181
184
  elsif field_mapping.include?(Strings::MAP)
182
- return field_mapping[Strings::MAP] ? field_mapping[Strings::MAP][original_value] : nil
185
+ return field_mapping[Strings::MAP].fetch(original_value, original_value)
183
186
  elsif field_mapping.include?(Strings::MATCH)
184
- # WARNING:TVB Thu Aug 9 17:09:25 BST 2012 field_mapping['match'] regexp
187
+ # WARNING:TVB Thu Aug 9 17:09:25 BST 2012 field_mapping[Strings::MATCH] regexp
185
188
  # may need to be escaped
186
189
  matches = Regexp.new(field_mapping[Strings::MATCH]).match(original_value)
187
190
  return matches[1].strip if matches && matches.size > 0
@@ -62,13 +62,16 @@ module NdrImport
62
62
  return enum_for(:process_line, line) unless block
63
63
 
64
64
  if @row_index < header_lines
65
- validate_header(line, @columns)
65
+ consume_header_line(line, @columns)
66
66
  else
67
- fail_unless_header_complete(@columns)
68
67
  transform_line(line, @row_index, &block)
69
68
  end
70
69
 
71
70
  @row_index += 1
71
+
72
+ # We've now seen enough lines to have consumed a valid header; is this the case?
73
+ fail_unless_header_complete(@columns) if @row_index == header_lines
74
+
72
75
  @notifier.try(:processed, @row_index)
73
76
  end
74
77
 
@@ -163,20 +166,21 @@ module NdrImport
163
166
  fail ArgumentError, "Unrecognised options: #{unrecognised_options.inspect}"
164
167
  end
165
168
 
166
- # if there is a header, then check the column headings are as expected in the correct order
167
- def validate_header(line, column_mappings)
169
+ # Process `line` as a candidate header row. Header validation is done
170
+ # lazily, once all expected header lines have been consumed.
171
+ def consume_header_line(line, column_mappings)
168
172
  columns = column_names(column_mappings)
169
173
 
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)
174
+ header_guess = line.map { |column| column.to_s.downcase }
175
175
 
176
+ # The "best guess" is only if/when the header eventually deemed to be
177
+ # invalid - in which case, it builds the informative error message.
176
178
  @header_best_guess = header_guess if header_guess.any?(&:present?)
177
179
  @header_valid = true if header_guess == columns
178
180
  end
179
181
 
182
+ # Once all header lines have been consumed, blow up in a
183
+ # helpful fashion if no valid row was found:
180
184
  def fail_unless_header_complete(column_mappings)
181
185
  return unless header_lines > 0 && !header_valid?
182
186
 
@@ -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.1.4'.freeze
4
+ VERSION = '5.0.0'.freeze
5
5
  end
data/ndr_import.gemspec CHANGED
@@ -19,16 +19,16 @@ Gem::Specification.new do |spec|
19
19
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
20
20
  spec.require_paths = ['lib']
21
21
 
22
- spec.add_dependency 'activesupport', '>= 3.2.18', '< 5.1'
23
- spec.add_dependency 'ndr_support', '>= 4.1.2', '< 6'
22
+ spec.add_dependency 'activesupport', '>= 3.2.18', '< 5.3'
23
+ spec.add_dependency 'ndr_support', '>= 5.3.2', '< 6'
24
24
 
25
25
  spec.add_dependency 'rubyzip', '~> 1.2', '>= 1.2.1'
26
26
  spec.add_dependency 'roo', '~> 2.0'
27
27
 
28
- spec.add_dependency 'nokogiri', '~> 1.6'
28
+ spec.add_dependency 'nokogiri', '~> 1.8', '>= 1.8.2'
29
29
  spec.add_dependency 'roo-xls'
30
30
  spec.add_dependency 'spreadsheet', '1.0.3'
31
- spec.add_dependency 'pdf-reader', '1.2.0'
31
+ spec.add_dependency 'pdf-reader', '1.2.0' # Raises warnings on Ruby 2.4+
32
32
  spec.add_dependency 'msworddoc-extractor', '0.2.0'
33
33
 
34
34
  spec.required_ruby_version = '>= 2.2'
@@ -37,7 +37,7 @@ Gem::Specification.new do |spec|
37
37
  spec.add_development_dependency 'rake', '~> 10.0'
38
38
  spec.add_development_dependency 'minitest'
39
39
  spec.add_development_dependency 'mocha'
40
- spec.add_development_dependency 'ndr_dev_support', '~> 1.1', '>= 1.1.3'
40
+ spec.add_development_dependency 'ndr_dev_support', '~> 3.0'
41
41
  spec.add_development_dependency 'guard'
42
42
  spec.add_development_dependency 'guard-rubocop'
43
43
  spec.add_development_dependency 'guard-test'
@@ -143,7 +143,7 @@ module NdrImport
143
143
  file_path = @permanent_test_files.join('normal.csv')
144
144
  handler = NdrImport::File::Delimited.new(file_path, 'csv', 'col_sep' => nil)
145
145
 
146
- handler.expects(determine_encodings!: { encoding: 'bom|utf-8', col_sep: ',' }).once
146
+ handler.expects(determine_encodings!: { mode: 'r:bom|utf-8', col_sep: ',' }).once
147
147
 
148
148
  2.times do
149
149
  handler.tables.each do |tablename, sheet|
@@ -15,7 +15,7 @@ module NdrImport
15
15
  handler.tables.each do |tablename, sheet|
16
16
  assert_nil tablename
17
17
  assert_instance_of Enumerator, sheet
18
- assert_equal ['Hello World'], sheet.to_a
18
+ assert_equal ['Hello World ', 'Goodbye Universe ', ' '], sheet.to_a
19
19
  end
20
20
  end
21
21
 
@@ -35,7 +35,7 @@ module NdrImport
35
35
  tables.each do |tablename, sheet|
36
36
  assert_nil tablename
37
37
  assert_instance_of Enumerator, sheet
38
- assert_equal ['Hello World'], sheet.to_a
38
+ assert_equal ['Hello World ', 'Goodbye Universe ', ' '], sheet.to_a
39
39
  end
40
40
  end
41
41
 
@@ -15,7 +15,7 @@ class PdfTest < ActiveSupport::TestCase
15
15
 
16
16
  test 'read_pdf_file helper should read pdf file' do
17
17
  file_content = @importer.send(:read_pdf_file, @permanent_test_files.join('hello_world.pdf'))
18
- assert_equal file_content, ['Hello World']
18
+ assert_equal ['Hello World ', 'Goodbye Universe ', ' '], file_content
19
19
  end
20
20
 
21
21
  test 'read_pdf_file helper should raise exception on invalid pdf file' do
data/test/mapper_test.rb CHANGED
@@ -21,6 +21,7 @@ class MapperTest < ActiveSupport::TestCase
21
21
  clean_ethniccategory_mapping = { 'clean' => :ethniccategory }
22
22
  clean_icd_mapping = { 'clean' => :icd }
23
23
  clean_opcs_mapping = { 'clean' => :code_opcs }
24
+ clean_code_and_upcase_mapping = { 'clean' => [:code, :upcase] }
24
25
  map_mapping = { 'map' => { 'A' => '1' } }
25
26
  replace_mapping = { 'replace' => { '.0' => '' } }
26
27
  daysafter_mapping = { 'daysafter' => '2012-05-16' }
@@ -102,6 +103,21 @@ class MapperTest < ActiveSupport::TestCase
102
103
  priority: 1
103
104
  YML
104
105
 
106
+ cross_populate_map_reverse_priority_mapping = YAML.load <<-YML
107
+ - column: referringclinicianname
108
+ mappings:
109
+ - field: consultantname
110
+ - field: consultantcode
111
+ priority: 1
112
+ map:
113
+ "Bob Fossil": "C5678"
114
+ "Bolo": ""
115
+ - column: referringcliniciancode
116
+ mappings:
117
+ - field: consultantcode
118
+ priority: 2
119
+ YML
120
+
105
121
  cross_populate_order_mapping = YAML.load <<-YML
106
122
  - column: referringclinicianname
107
123
  mappings:
@@ -282,7 +298,7 @@ class MapperTest < ActiveSupport::TestCase
282
298
  end
283
299
 
284
300
  test 'map should return nil' do
285
- assert_nil TestMapper.new.mapped_value('B', map_mapping)
301
+ assert_equal 'B', TestMapper.new.mapped_value('B', map_mapping)
286
302
  end
287
303
 
288
304
  test 'map should return correct date format' do
@@ -333,11 +349,16 @@ class MapperTest < ActiveSupport::TestCase
333
349
  assert_equal 'U212 Y973', TestMapper.new.mapped_value('U212,Y973,X1', clean_opcs_mapping)
334
350
  assert_equal '', TestMapper.new.mapped_value('98', clean_opcs_mapping)
335
351
  assert_equal '', TestMapper.new.mapped_value('TooLong', clean_opcs_mapping)
336
- assert_equal nil, TestMapper.new.mapped_value('', clean_opcs_mapping)
352
+ assert_nil TestMapper.new.mapped_value('', clean_opcs_mapping)
337
353
  assert_equal 'ABCD', TestMapper.new.mapped_value('AbcD', clean_opcs_mapping)
338
354
  assert_equal '1234', TestMapper.new.mapped_value('1234', clean_opcs_mapping)
339
355
  end
340
356
 
357
+ test 'map should use multiple cleans' do
358
+ assert_equal 'U3 Y2 X1',
359
+ TestMapper.new.mapped_value('u3,y2,x1', clean_code_and_upcase_mapping)
360
+ end
361
+
341
362
  test 'map should handle array original value' do
342
363
  original_value = ['C9999998', %w(Addenbrookes RGT01)]
343
364
  mapped_value = TestMapper.new.mapped_line(original_value, replace_array_mapping)
@@ -373,7 +394,7 @@ class MapperTest < ActiveSupport::TestCase
373
394
  test 'line mapping should create valid hash with blank cleaned value' do
374
395
  assert_equal '', TestMapper.new.mapped_value('98', clean_opcs_mapping)
375
396
  line_hash = TestMapper.new.mapped_line(['98'], simple_mapping_with_clean_opcs)
376
- assert_equal nil, line_hash['primaryprocedures']
397
+ assert_nil line_hash['primaryprocedures']
377
398
  assert_equal '98', line_hash[:rawtext]['primaryprocedures']
378
399
  end
379
400
 
@@ -453,13 +474,52 @@ class MapperTest < ActiveSupport::TestCase
453
474
  assert_equal 'C5678', line_hash['consultantcode']
454
475
  end
455
476
 
477
+ test 'should create valid hash with used cross populate with map with no p2 map' do
478
+ line_hash = TestMapper.new.mapped_line(['something', ''], cross_populate_map_mapping)
479
+ assert_equal 'something', line_hash[:rawtext]['referringclinicianname']
480
+ assert_equal '', line_hash[:rawtext]['referringcliniciancode']
481
+
482
+ assert_equal 'something', line_hash['consultantname']
483
+ assert_equal 'something', line_hash['consultantcode']
484
+ end
485
+
486
+ test 'should create valid hash with used cross populate with map with p1 mapped' do
487
+ line_hash = TestMapper.new.mapped_line(['Bob Fossil', 'P2'],
488
+ cross_populate_map_reverse_priority_mapping)
489
+ assert_equal 'Bob Fossil', line_hash[:rawtext]['referringclinicianname']
490
+ assert_equal 'P2', line_hash[:rawtext]['referringcliniciancode']
491
+
492
+ assert_equal 'Bob Fossil', line_hash['consultantname']
493
+ assert_equal 'C5678', line_hash['consultantcode']
494
+ end
495
+
496
+ test 'should create valid hash with used cross populate with map with p1 mapped out' do
497
+ line_hash = TestMapper.new.mapped_line(['Bolo', 'P2'],
498
+ cross_populate_map_reverse_priority_mapping)
499
+ assert_equal 'Bolo', line_hash[:rawtext]['referringclinicianname']
500
+ assert_equal 'P2', line_hash[:rawtext]['referringcliniciancode']
501
+
502
+ assert_equal 'Bolo', line_hash['consultantname']
503
+ assert_equal 'P2', line_hash['consultantcode']
504
+ end
505
+
506
+ test 'should create valid hash with used cross populate with map with p1 no map' do
507
+ line_hash = TestMapper.new.mapped_line(['something', 'P2'],
508
+ cross_populate_map_reverse_priority_mapping)
509
+ assert_equal 'something', line_hash[:rawtext]['referringclinicianname']
510
+ assert_equal 'P2', line_hash[:rawtext]['referringcliniciancode']
511
+
512
+ assert_equal 'something', line_hash['consultantname']
513
+ assert_equal 'something', line_hash['consultantcode']
514
+ end
515
+
456
516
  test 'should create valid hash with used cross populate without map' do
457
517
  line_hash = TestMapper.new.mapped_line(['Bob Smith', ''], cross_populate_map_mapping)
458
518
  assert_equal 'Bob Smith', line_hash[:rawtext]['referringclinicianname']
459
519
  assert_equal '', line_hash[:rawtext]['referringcliniciancode']
460
520
 
461
521
  assert_equal 'Bob Smith', line_hash['consultantname']
462
- assert_nil line_hash['consultantcode']
522
+ assert_equal 'Bob Smith', line_hash['consultantcode']
463
523
  end
464
524
 
465
525
  test 'should create valid hash with used cross populate without map and priorities' do
Binary file
data/test/table_test.rb CHANGED
@@ -100,11 +100,22 @@ class TableTest < ActiveSupport::TestCase
100
100
  :columns => [{ 'column' => 'one' }, { 'column' => 'two' }])
101
101
 
102
102
  output = []
103
- table.process_line(%w(CARROT POTATO)).each do |klass, fields, index|
104
- output << [klass, fields, index]
105
- end
103
+ table.process_line(%w(ONE TWO)).each { |*stuff| output << stuff }
104
+ table.process_line(%w(CARROT POTATO)).each { |*stuff| output << stuff }
106
105
 
107
- assert_equal [], output
106
+ expected_output = [
107
+ ['SomeTestKlass', { :rawtext => { 'one' => 'CARROT', 'two' => 'POTATO' } }, 1]
108
+ ]
109
+ assert_equal expected_output, output
110
+ end
111
+
112
+ def test_process_line_with_unsatisifed_header
113
+ table = NdrImport::Table.new(:header_lines => 1, :footer_lines => 0,
114
+ :klass => 'SomeTestKlass',
115
+ :columns => [{ 'column' => 'one' }, { 'column' => 'two' }])
116
+
117
+ exception = assert_raises(RuntimeError) { table.process_line(%w(ONE THREE)).to_a }
118
+ assert_equal 'Header is not valid! missing: ["two"] unexpected: ["three"]', exception.message
108
119
  end
109
120
 
110
121
  def test_transform_line
@@ -243,11 +254,59 @@ class TableTest < ActiveSupport::TestCase
243
254
  assert_equal expected_output, output
244
255
  end
245
256
 
246
- def test_invalid_header_length
257
+ def test_varying_header_line_lengths_with_valid_header_row_including_nils
258
+ lines = [
259
+ [nil] << 'RIGHTALIGN1' << 'RIGHTALIGN2',
260
+ %w(ONE TWO),
261
+ %w(LEFTALIGN) << nil,
262
+ %w(CENTRE1) << nil << 'CENTRE2',
263
+ %w(UNO DOS)
264
+ ].each
265
+
266
+ table = NdrImport::Table.new(:header_lines => 4, :footer_lines => 0,
267
+ :klass => 'SomeTestKlass',
268
+ :columns => [{ 'column' => 'one' }, { 'column' => 'two' }])
269
+
270
+ output = []
271
+ table.transform(lines).each do |klass, fields, index|
272
+ output << [klass, fields, index]
273
+ end
274
+
275
+ assert table.header_valid?
276
+
277
+ expected_output = [['SomeTestKlass', { :rawtext => { 'one' => 'UNO', 'two' => 'DOS' } }, 4]]
278
+ assert_equal expected_output, output
279
+ end
280
+
281
+ def test_varying_header_line_lengths_with_valid_header_row
247
282
  lines = [
248
283
  %w(NOTHEADING1 NOTHEADING2 UHOH3 UHOH4),
249
284
  %w(ONE TWO),
250
- %w(DEFINITELYNOTHEADING1 DEFINITELYNOTHEADING2)
285
+ %w(DEFINITELYNOTHEADING1 DEFINITELYNOTHEADING2),
286
+ %w(UNO DOS)
287
+ ].each
288
+
289
+ table = NdrImport::Table.new(:header_lines => 3, :footer_lines => 0,
290
+ :klass => 'SomeTestKlass',
291
+ :columns => [{ 'column' => 'one' }, { 'column' => 'two' }])
292
+
293
+ output = []
294
+ table.transform(lines).each do |klass, fields, index|
295
+ output << [klass, fields, index]
296
+ end
297
+
298
+ assert table.header_valid?
299
+
300
+ expected_output = [['SomeTestKlass', { :rawtext => { 'one' => 'UNO', 'two' => 'DOS' } }, 3]]
301
+ assert_equal expected_output, output
302
+ end
303
+
304
+ def test_varying_header_line_lengths_without_valid_header_row
305
+ lines = [
306
+ %w(NOTHEADING1 NOTHEADING2 UHOH3 UHOH4),
307
+ %w(ONE TWO NOPE),
308
+ %w(NOT_HERE OR_HERE),
309
+ %w(UNO DOS)
251
310
  ].each
252
311
 
253
312
  table = NdrImport::Table.new(:header_lines => 3, :footer_lines => 0,
@@ -255,7 +314,10 @@ class TableTest < ActiveSupport::TestCase
255
314
  :columns => [{ 'column' => 'one' }, { 'column' => 'two' }])
256
315
 
257
316
  exception = assert_raises(RuntimeError) { table.transform(lines).to_a }
258
- assert_match(/expected 2, got 4/, exception.message)
317
+
318
+ assert_match(/Header is not valid!/, exception.message)
319
+ assert_match(/missing: \["one", "two"\]/, exception.message)
320
+ assert_match(/unexpected: \["not_here", "or_here"\]/, exception.message)
259
321
  end
260
322
 
261
323
  def test_jumbled_header
data/test/test_helper.rb CHANGED
@@ -25,4 +25,4 @@ NdrImport::StandardMappings.mappings = YAML.load_file(
25
25
  File.expand_path(File.dirname(__FILE__) + '/resources/standard_mappings.yml')
26
26
  )
27
27
 
28
- require 'mocha/mini_test'
28
+ require 'mocha/minitest'
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.1.4
4
+ version: 5.0.0
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: 2018-03-20 00:00:00.000000000 Z
11
+ date: 2018-06-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -19,7 +19,7 @@ dependencies:
19
19
  version: 3.2.18
20
20
  - - "<"
21
21
  - !ruby/object:Gem::Version
22
- version: '5.1'
22
+ version: '5.3'
23
23
  type: :runtime
24
24
  prerelease: false
25
25
  version_requirements: !ruby/object:Gem::Requirement
@@ -29,14 +29,14 @@ dependencies:
29
29
  version: 3.2.18
30
30
  - - "<"
31
31
  - !ruby/object:Gem::Version
32
- version: '5.1'
32
+ version: '5.3'
33
33
  - !ruby/object:Gem::Dependency
34
34
  name: ndr_support
35
35
  requirement: !ruby/object:Gem::Requirement
36
36
  requirements:
37
37
  - - ">="
38
38
  - !ruby/object:Gem::Version
39
- version: 4.1.2
39
+ version: 5.3.2
40
40
  - - "<"
41
41
  - !ruby/object:Gem::Version
42
42
  version: '6'
@@ -46,7 +46,7 @@ dependencies:
46
46
  requirements:
47
47
  - - ">="
48
48
  - !ruby/object:Gem::Version
49
- version: 4.1.2
49
+ version: 5.3.2
50
50
  - - "<"
51
51
  - !ruby/object:Gem::Version
52
52
  version: '6'
@@ -90,14 +90,20 @@ dependencies:
90
90
  requirements:
91
91
  - - "~>"
92
92
  - !ruby/object:Gem::Version
93
- version: '1.6'
93
+ version: '1.8'
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: 1.8.2
94
97
  type: :runtime
95
98
  prerelease: false
96
99
  version_requirements: !ruby/object:Gem::Requirement
97
100
  requirements:
98
101
  - - "~>"
99
102
  - !ruby/object:Gem::Version
100
- version: '1.6'
103
+ version: '1.8'
104
+ - - ">="
105
+ - !ruby/object:Gem::Version
106
+ version: 1.8.2
101
107
  - !ruby/object:Gem::Dependency
102
108
  name: roo-xls
103
109
  requirement: !ruby/object:Gem::Requirement
@@ -216,20 +222,14 @@ dependencies:
216
222
  requirements:
217
223
  - - "~>"
218
224
  - !ruby/object:Gem::Version
219
- version: '1.1'
220
- - - ">="
221
- - !ruby/object:Gem::Version
222
- version: 1.1.3
225
+ version: '3.0'
223
226
  type: :development
224
227
  prerelease: false
225
228
  version_requirements: !ruby/object:Gem::Requirement
226
229
  requirements:
227
230
  - - "~>"
228
231
  - !ruby/object:Gem::Version
229
- version: '1.1'
230
- - - ">="
231
- - !ruby/object:Gem::Version
232
- version: 1.1.3
232
+ version: '3.0'
233
233
  - !ruby/object:Gem::Dependency
234
234
  name: guard
235
235
  requirement: !ruby/object:Gem::Requirement
@@ -317,10 +317,10 @@ files:
317
317
  - README.md
318
318
  - Rakefile
319
319
  - code_safety.yml
320
- - gemfiles/Gemfile.rails32
321
- - gemfiles/Gemfile.rails41
322
320
  - gemfiles/Gemfile.rails42
323
321
  - gemfiles/Gemfile.rails50
322
+ - gemfiles/Gemfile.rails51
323
+ - gemfiles/Gemfile.rails52
324
324
  - lib/ndr_import.rb
325
325
  - lib/ndr_import/csv_library.rb
326
326
  - lib/ndr_import/file/all.rb
@@ -1,5 +0,0 @@
1
- source 'https://rubygems.org'
2
-
3
- gemspec path: '..'
4
-
5
- gem 'activesupport', '~> 3.2.18'
@@ -1,5 +0,0 @@
1
- source 'https://rubygems.org'
2
-
3
- gemspec path: '..'
4
-
5
- gem 'activesupport', '~> 4.1.0'