ndr_import 3.1.6 → 4.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
  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