ndr_import 3.1.6 → 4.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
  SHA1:
3
- metadata.gz: 5d79b720417de07bd9f4db6de53c08600ee190ac
4
- data.tar.gz: d267da10cc8446fe3272b6aab0e6792e6d77b3e2
3
+ metadata.gz: ee9c5c86bbcd00af6877225040d6beb01007575d
4
+ data.tar.gz: 7dabb1d68c3467314e90f916f7ccb573be33ea1a
5
5
  SHA512:
6
- metadata.gz: 47a472805cd80bede14e404c026dbfdaa4a0b1f7cd1cd48f33d4c83fc27e66b0b41f91f3a64b4fdd77486f302d2ee58a0fd2c3280a9d93e128f1fc55aace7634
7
- data.tar.gz: 515cd22f7ae8a0c2b5faa8b3d2b9f5aac08932772637bd189bfe791c3446f2daa42317a87993af8dd642969b289ef0ab880bc647a795ea9e7a9c06f89c6359ad
6
+ metadata.gz: d9a13b367b3b094c041221b989456af8dfa1571395fd0b4ba11e1fcae10d830ea6b50b89a8f59f7bd72bc49209419c3f9bfbbfe86f9c0b47cbdf600b5e754508
7
+ data.tar.gz: a8da74311916a789f8203407fc1bfd7db5540940efdf28a1d96b615fa8f52321f7c541596d82a69f8ee704ad50863bf547ec812a86d138d82dfda59d79ba3b9d
@@ -70,12 +70,12 @@ file safety:
70
70
  safe_revision: a8451809db86e0e023b0d93826114a33ff896c4f
71
71
  lib/ndr_import/file/delimited.rb:
72
72
  comments:
73
- reviewed_by: josh.pencheon
74
- safe_revision: c88000b32401b5ae9ef7f5878a9b630506ab5a94
73
+ reviewed_by: joshpencheon
74
+ safe_revision: 4f7588ef0246bfced14f42b247436507568422a2
75
75
  lib/ndr_import/file/excel.rb:
76
76
  comments:
77
77
  reviewed_by: joshpencheon
78
- safe_revision: 334d53bb9e8698bba3d92b4dbd71b36faacae629
78
+ safe_revision: e108b1635e41e89e4cba816d47514dcd9d0d6433
79
79
  lib/ndr_import/file/pdf.rb:
80
80
  comments:
81
81
  reviewed_by: timgentry
@@ -98,12 +98,12 @@ file safety:
98
98
  safe_revision: c88000b32401b5ae9ef7f5878a9b630506ab5a94
99
99
  lib/ndr_import/helpers/file/delimited.rb:
100
100
  comments:
101
- reviewed_by: josh.pencheon
102
- safe_revision: 277e5d8159542b539fe7548fb30b449d9273c8f9
101
+ reviewed_by: joshpencheon
102
+ safe_revision: 06fd16643d02957ce856728e4911143c8e0178dc
103
103
  lib/ndr_import/helpers/file/excel.rb:
104
104
  comments:
105
105
  reviewed_by: joshpencheon
106
- safe_revision: 80ce15cc5ca15019400d4cd24c3353191bec00cc
106
+ safe_revision: 06fd16643d02957ce856728e4911143c8e0178dc
107
107
  lib/ndr_import/helpers/file/pdf.rb:
108
108
  comments:
109
109
  reviewed_by: timgentry
@@ -122,8 +122,8 @@ file safety:
122
122
  safe_revision: 6c6f204fab2f4232d81cb76aa523c26b0c490ae7
123
123
  lib/ndr_import/mapper.rb:
124
124
  comments:
125
- reviewed_by: josh.pencheon
126
- safe_revision: 74ea81bd4c4119912012ff9f3b7c031e592438f9
125
+ reviewed_by: joshpencheon
126
+ safe_revision: 582ce42b27ce3813efa7f93e09928e8f228ba6df
127
127
  lib/ndr_import/mapping_error.rb:
128
128
  comments:
129
129
  reviewed_by: timgentry
@@ -163,7 +163,7 @@ file safety:
163
163
  lib/ndr_import/version.rb:
164
164
  comments: another check?
165
165
  reviewed_by: joshpencheon
166
- safe_revision: 749aa9bb66f6e07b52acab1096f6f866034fc676
166
+ safe_revision: 04a29ed03b6772091d7208403f0acc5032117149
167
167
  ndr_import.gemspec:
168
168
  comments:
169
169
  reviewed_by: josh.pencheon
@@ -202,12 +202,12 @@ file safety:
202
202
  safe_revision: c88000b32401b5ae9ef7f5878a9b630506ab5a94
203
203
  test/helpers/file/delimited_test.rb:
204
204
  comments:
205
- reviewed_by: timgentry
206
- safe_revision: fd2904c1c8166b5284bd6213965401c40f292246
205
+ reviewed_by: joshpencheon
206
+ safe_revision: 377c060bd1e012d6e162a4ab8923a3609aacdf57
207
207
  test/helpers/file/excel_test.rb:
208
208
  comments:
209
209
  reviewed_by: joshpencheon
210
- safe_revision: 80ce15cc5ca15019400d4cd24c3353191bec00cc
210
+ safe_revision: 377c060bd1e012d6e162a4ab8923a3609aacdf57
211
211
  test/helpers/file/pdf_test.rb:
212
212
  comments:
213
213
  reviewed_by: timgentry
@@ -398,5 +398,5 @@ file safety:
398
398
  safe_revision: 6bb588c17d33a604c96c648c6eebfe2d063dfbc0
399
399
  test/test_helper.rb:
400
400
  comments:
401
- reviewed_by: josh.pencheon
402
- safe_revision: c244390ab15a9745d4e8c4cbfbaff67d7ef80cb4
401
+ reviewed_by: joshpencheon
402
+ safe_revision: 646c08329cba0ba8ea2c37226cf26434da29c747
@@ -32,7 +32,7 @@ module NdrImport
32
32
  # By now, we know `encodings` should let us read the whole
33
33
  # file succesfully; if there are problems, we should crash.
34
34
  CSVLibrary.foreach(safe_path, encodings) do |line|
35
- yield line.map(&:to_s) unless line.length <= 5
35
+ yield line.map(&:to_s)
36
36
  end
37
37
  end
38
38
 
@@ -64,12 +64,12 @@ module NdrImport
64
64
  def xls_rows(workbook, sheet_name)
65
65
  return enum_for(:xls_rows, workbook, sheet_name) unless block_given?
66
66
 
67
- activate_sheet!(workbook, sheet_name)
68
- return unless workbook.first_row
69
- (workbook.first_row..workbook.last_row).each do |row|
70
- activate_sheet!(workbook, sheet_name)
71
- columns = (workbook.first_column..workbook.last_column)
72
- yield columns.map { |col| cast_excel_value(workbook.cell(row, col)) }
67
+ return unless workbook.first_row(sheet_name)
68
+ rows = workbook.first_row(sheet_name)..workbook.last_row(sheet_name)
69
+ columns = workbook.first_column(sheet_name)..workbook.last_column(sheet_name)
70
+
71
+ rows.each do |row|
72
+ yield columns.map { |col| cast_excel_value(workbook.cell(row, col, sheet_name)) }
73
73
  end
74
74
  end
75
75
 
@@ -78,9 +78,7 @@ module NdrImport
78
78
  def xlsx_rows(workbook, sheet_name)
79
79
  return enum_for(:xlsx_rows, workbook, sheet_name) unless block_given?
80
80
 
81
- activate_sheet!(workbook, sheet_name)
82
-
83
- workbook.each_row_streaming(:pad_cells => true) do |row|
81
+ workbook.each_row_streaming(sheet: sheet_name, pad_cells: true) do |row|
84
82
  yield row.map { |cell| cast_excel_value(cell.value) }
85
83
  end
86
84
  end
@@ -126,14 +124,6 @@ module NdrImport
126
124
  FileUtils.mkdir_p(SafeFile.safepath_to_string(SafeFile.dirname(dest)))
127
125
  FileUtils.cp(SafeFile.safepath_to_string(source), SafeFile.safepath_to_string(dest))
128
126
  end
129
-
130
- # Sets `sheet_name' to be the default (i.e. active) sheet in `workbook'.
131
- # This setting applies to the Roo object, so needs to re-applied if (for example)
132
- # streaming rows from multiple sheets simultaneously - something that was problematic
133
- # with Workbook#each_with_pagename.
134
- def activate_sheet!(workbook, sheet_name)
135
- workbook.sheet(sheet_name)
136
- end
137
127
  end
138
128
 
139
129
  Registry.register(Excel, 'xls', 'xlsx')
@@ -27,13 +27,6 @@ module NdrImport
27
27
  yield nil, delimited_rows(path, col_sep)
28
28
  end
29
29
 
30
- # Deprecated method
31
- def each_delimited_table(path, col_sep = nil, &block)
32
- Kernel.warn '[warning] each_delimited_table will be deprecated,' \
33
- ' please use delimited_tables instead.'
34
- delimited_tables(path, col_sep, &block)
35
- end
36
-
37
30
  # Iterate through the file line by line, yielding each one in turn.
38
31
  def delimited_rows(path, col_sep = nil)
39
32
  return enum_for(:delimited_rows, path, col_sep) unless block_given?
@@ -44,17 +37,10 @@ module NdrImport
44
37
  # By now, we know `encodings` should let us read the whole
45
38
  # file succesfully; if there are problems, we should crash.
46
39
  CSVLibrary.foreach(safe_path, encodings) do |line|
47
- yield line.map(&:to_s) unless line.length <= 5
40
+ yield line.map(&:to_s)
48
41
  end
49
42
  end
50
43
 
51
- # Deprecated method
52
- def each_delimited_row(path, col_sep = nil, &block)
53
- Kernel.warn '[warning] each_delimited_row will be deprecated,' \
54
- ' please use delimited_rows instead.'
55
- delimited_rows(path, col_sep, &block)
56
- end
57
-
58
44
  private
59
45
 
60
46
  # Derive the source encoding by trying all supported encodings.
@@ -45,13 +45,6 @@ module NdrImport
45
45
  end
46
46
  end
47
47
 
48
- # Deprecated method
49
- def each_excel_table(path, &block)
50
- Kernel.warn '[warning] each_excel_table will be deprecated,' \
51
- ' please use excel_tables instead.'
52
- excel_tables(path, &block)
53
- end
54
-
55
48
  private
56
49
 
57
50
  def read_excel_file(path, selected_sheet = nil)
@@ -85,13 +78,6 @@ module NdrImport
85
78
  end
86
79
  end
87
80
 
88
- # Deprecated method
89
- def each_excel_row(workbook, sheet, &block)
90
- Kernel.warn '[warning] each_excel_row will be deprecated,' \
91
- ' please use excel_rows instead.'
92
- excel_rows(workbook, sheet, &block)
93
- end
94
-
95
81
  # Iterate through an xls sheet line by line, yielding each one in turn.
96
82
  def xls_rows(sheet)
97
83
  return enum_for(:xls_rows, sheet) unless block_given?
@@ -106,13 +92,6 @@ module NdrImport
106
92
  end
107
93
  end
108
94
 
109
- # Deprecated method
110
- def each_xls_row(sheet, &block)
111
- Kernel.warn '[warning] each_xls_row will be deprecated,' \
112
- ' please use xls_rows instead.'
113
- xls_rows(sheet, &block)
114
- end
115
-
116
95
  # Iterate through an xlsx sheet line by line, yielding each one in turn.
117
96
  # This method uses streaming https://github.com/roo-rb/roo#excel-xlsx-and-xlsm-support
118
97
  def xlsx_rows(sheet)
@@ -123,13 +102,6 @@ module NdrImport
123
102
  end
124
103
  end
125
104
 
126
- # Deprecated method
127
- def each_xlsx_row(sheet, &block)
128
- Kernel.warn '[warning] each_xlsx_row will be deprecated,' \
129
- ' please use xlsx_rows instead.'
130
- xlsx_rows(sheet, &block)
131
- end
132
-
133
105
  def get_excel_sheets_name(path)
134
106
  workbook = load_workbook(path)
135
107
  workbook.sheets
@@ -21,40 +21,37 @@ module NdrImport::Mapper
21
21
 
22
22
  [field_mapping['replace']].flatten.each do |field_replacement|
23
23
  field_replacement.each do |pattern, replacement|
24
- if original_value.is_a?(Array)
25
- original_value.map { |val| val.gsub!(pattern, replacement) }
26
- else
27
- original_value.gsub!(pattern, replacement)
28
- end
24
+ Array(original_value).each { |val| val.gsub!(pattern, replacement) }
29
25
  end
30
26
  end
31
27
  end
32
28
 
33
29
  # Returns the standard_mapping hash specified
34
- # Assumes mappping exists
30
+ # Assumes mapping exists
35
31
  def standard_mapping(mapping_name, column_mapping)
36
32
  standard_mapping = NdrImport::StandardMappings.mappings[mapping_name]
37
- return nil if standard_mapping.nil?
38
-
39
- # Work on deep copies of reference standard mapping,
40
- # as well as the given column_mapping:
41
- reference = YAML.load(standard_mapping.to_yaml)
42
- incoming = YAML.load(column_mapping.to_yaml)
33
+ return unless standard_mapping
43
34
 
44
- # Merge the 'mappings' key into the reference value,
45
- # but replace any other keys using `incoming`:
46
- reference['mappings'].concat(incoming.delete('mappings')) if incoming['mappings']
47
- reference.merge!(incoming)
35
+ column_mapping.each_with_object(standard_mapping.dup) do |(key, value), result|
36
+ if 'mappings' == key
37
+ # Column mapping appends mappings to the standard mapping...
38
+ result[key] += value
39
+ else
40
+ # ...but overwrites other values.
41
+ result[key] = value
42
+ end
43
+ end
48
44
  end
49
45
 
50
46
  # This takes an array of raw values and their associated mappings and returns an attribute hash
51
47
  # It accepts a block to alter the raw value that is stored in the raw text (if necessary),
52
48
  # enabling it to work for different sources
53
49
  def mapped_line(line, line_mappings)
54
- attributes = {}
55
- rawtext = {}
56
50
  validate_line_mappings(line_mappings)
57
51
 
52
+ rawtext = {}
53
+ data = {}
54
+
58
55
  line.each_with_index do |raw_value, col|
59
56
  column_mapping = line_mappings[col]
60
57
  if column_mapping.nil?
@@ -67,7 +64,6 @@ module NdrImport::Mapper
67
64
  if column_mapping['standard_mapping']
68
65
  column_mapping = standard_mapping(column_mapping['standard_mapping'], column_mapping)
69
66
  end
70
- field_mappings = column_mapping['mappings'] || []
71
67
 
72
68
  # Establish the rawtext column name we are to use for this column
73
69
  rawtext_column_name = (column_mapping['rawtext_name'] || column_mapping['column']).downcase
@@ -85,68 +81,56 @@ module NdrImport::Mapper
85
81
  # Store the raw column value
86
82
  rawtext[rawtext_column_name] = raw_value
87
83
 
88
- field_mappings.each do |field_mapping|
84
+ next unless column_mapping.key?('mappings')
85
+ column_mapping['mappings'].each do |field_mapping|
89
86
  # create a duplicate of the raw value we can manipulate
90
87
  original_value = raw_value ? raw_value.dup : nil
91
88
 
92
89
  replace_before_mapping(original_value, field_mapping)
93
90
  value = mapped_value(original_value, field_mapping)
94
91
 
92
+ # We don't care about blank values, unless we're mapping a :join
93
+ # field (in which case, :compact may or may not be being used).
94
+ next if value.blank? && !field_mapping['join']
95
+
95
96
  field = field_mapping['field']
96
97
 
97
- # Assumes join is specified in first joined field
98
- joined = field_mapping['join'] ? true : false
99
-
100
- # Currently assuming already validated YAML, s.t. no fields have the
101
- # same priorities
102
- #
103
- # This has become really messy...
104
- unless value.blank? && !joined
105
- attributes[field] = {} unless attributes[field]
106
- attributes[field][:priority] = {} unless attributes[field][:priority]
107
- if field_mapping['order']
108
- attributes[field][field_mapping['order']] = value
109
- attributes[field][:join] = field_mapping['join'] if field_mapping['join']
110
- attributes[field][:compact] = field_mapping['compact'] if field_mapping.include?('compact')
111
- elsif field_mapping['priority']
112
- attributes[field][:priority][field_mapping['priority']] = value
113
- else
114
- # Check if already a mapped-to field, and assign default low
115
- # priority
116
- attributes[field][:priority][1] = value
117
- attributes[field][:value] = value
118
- end
98
+ data[field] ||= {}
99
+ data[field][:values] ||= [] # "better" values come earlier
100
+ data[field][:compact] = true unless data[field].key?(:compact)
101
+
102
+ if field_mapping['order']
103
+ data[field][:join] ||= field_mapping['join']
104
+ data[field][:compact] = field_mapping['compact'] if field_mapping.key?('compact')
105
+
106
+ data[field][:values][field_mapping['order'] - 1] = value
107
+ elsif field_mapping['priority']
108
+ data[field][:values][field_mapping['priority']] = value
109
+ else
110
+ data[field][:values].unshift(value) # new "best" value
119
111
  end
120
112
  end
121
113
  end
122
114
 
115
+ attributes = {}
116
+
123
117
  # tidy up many to one field mappings
124
118
  # and one to many, for cross-populating
125
- attributes.each do |field, value|
126
- if value.include?(:join)
127
- join_string = value.delete(:join) || ','
128
- value.delete(:value)
129
- value.delete(:priority)
130
- if value.include?(:compact)
131
- compact = value.delete(:compact)
119
+ data.each do |field, field_data|
120
+ values = field_data[:values]
121
+
122
+ attributes[field] =
123
+ if field_data.key?(:join)
124
+ # Map "blank" values to nil:
125
+ values = values.map { |value| value if value.present? }
126
+ values.compact! if field_data[:compact]
127
+ values.join(field_data[:join])
132
128
  else
133
- compact = true
134
- end
135
- t = value.sort.map do |_part_order, part_value|
136
- part_value.blank? ? nil : part_value
129
+ values.detect(&:present?)
137
130
  end
138
- if compact
139
- attributes[field] = t.compact.join(join_string)
140
- else
141
- attributes[field] = t.join(join_string)
142
- end
143
- else
144
- attributes[field][:priority].reject! { |_k, v| v.blank? }
145
- attributes[field] = attributes[field][:priority].sort.first[1]
146
- end
147
131
  end
148
132
 
149
- attributes[:rawtext] = rawtext
133
+ attributes[:rawtext] = rawtext # Assign last
150
134
  attributes
151
135
  end
152
136
 
@@ -186,8 +170,9 @@ module NdrImport::Mapper
186
170
  fail "Standard mapping \"#{column_mapping['standard_mapping']}\" does not exist"
187
171
  end
188
172
  end
189
- field_mappings = column_mapping['mappings'] || []
190
- field_mappings.each do |field_mapping|
173
+
174
+ next unless column_mapping.key?('mappings')
175
+ column_mapping['mappings'].each do |field_mapping|
191
176
  field = field_mapping['field']
192
177
  if field_mapping['priority']
193
178
  fail 'Cannot have duplicate priorities' if priority[field] == field_mapping['priority']
@@ -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 = '3.1.6'.freeze
4
+ VERSION = '4.0.0'.freeze
5
5
  end
@@ -87,27 +87,4 @@ class DelimitedTest < ActiveSupport::TestCase
87
87
  assert_equal ['2'] * 26, sheet[2]
88
88
  end
89
89
  end
90
-
91
- def test_each_delimited_table_should_be_deprecated
92
- original_stderr = $stderr
93
- $stderr = StringIO.new
94
-
95
- table = @importer.send(:each_delimited_table, @permanent_test_files.join('normal.csv'))
96
- table.each do |tablename, sheet|
97
- assert_nil tablename
98
- sheet = sheet.to_a
99
- assert_equal(('A'..'Z').to_a, sheet[0])
100
- assert_equal ['1'] * 26, sheet[1]
101
- assert_equal ['2'] * 26, sheet[2]
102
- end
103
-
104
- assert_match(/\A\[warning\] each_delimited_table will be deprecated/, $stderr.string)
105
- ensure
106
- $stderr = original_stderr
107
- end if Gem::Requirement.new('< 4.0.0').satisfied_by?(Gem::Version.new(NdrImport::VERSION))
108
-
109
- def test_deprecated_methods_removed_in_v3
110
- refute @importer.public_methods.include?(:each_delimited_table), 'should be removed in v4.0.0'
111
- refute @importer.public_methods.include?(:each_delimited_row), 'should be removed in v4.0.0'
112
- end if Gem::Requirement.new('>= 4.0.0').satisfied_by?(Gem::Version.new(NdrImport::VERSION))
113
90
  end
@@ -79,26 +79,4 @@ class ExcelTest < ActiveSupport::TestCase
79
79
  assert_equal %w(1A 1B), sheet.first
80
80
  end
81
81
  end
82
-
83
- def test_each_excel_table_should_be_deprecated
84
- original_stderr = $stderr
85
- $stderr = StringIO.new
86
-
87
- table = @importer.send(:each_excel_table, @permanenttestfiles.join('sample_xlsx.xlsx'))
88
- table.each do |tablename, sheet|
89
- assert_equal 'Sheet1', tablename
90
- assert_equal %w(1A 1B), sheet.first
91
- end
92
-
93
- assert_match(/\A\[warning\] each_excel_table will be deprecated/, $stderr.string)
94
- ensure
95
- $stderr = original_stderr
96
- end if Gem::Requirement.new('< 4.0.0').satisfied_by?(Gem::Version.new(NdrImport::VERSION))
97
-
98
- def test_deprecated_methods_removed_in_v3
99
- refute @importer.protected_methods.include?(:each_excel_table), 'should be removed in v4.0.0'
100
- refute @importer.private_methods.include?(:each_excel_row), 'should be removed in v4.0.0'
101
- refute @importer.private_methods.include?(:each_xls_row), 'should be removed in v4.0.0'
102
- refute @importer.private_methods.include?(:each_xlsx_row), 'should be removed in v4.0.0'
103
- end if Gem::Requirement.new('>= 4.0.0').satisfied_by?(Gem::Version.new(NdrImport::VERSION))
104
82
  end
@@ -14,6 +14,8 @@ rescue LoadError
14
14
  # Rails 4+ only
15
15
  end
16
16
 
17
+ ActiveSupport.test_order = :random if ActiveSupport.respond_to?(:test_order=)
18
+
17
19
  # The default changes to UTC in Rails 4.
18
20
  # TODO: ndr_support should cope...
19
21
  ActiveRecord::Base.default_timezone = :local
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: 3.1.6
4
+ version: 4.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: 2016-03-10 00:00:00.000000000 Z
11
+ date: 2016-03-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport