ndr_import 4.1.4 → 5.0.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.
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'