ntq_excelsior 0.5.4 → 1.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: cc8cbf2a89c838237dc9ab67a36e6c610b058ee4636ba2b7d8b1e6c782ffe989
4
- data.tar.gz: d4ccb408477c98f9cb66cf7dea7e3ae255b1a69690090f58207c7786e9856647
3
+ metadata.gz: b1b7c2ea8995dcb68450bc1771e8fef43e04dc6aeea67b585783378bf68bd8c1
4
+ data.tar.gz: a8f6b916a1b0cca7e6ee306a9453ac802d0ce859eb1f3bf82d1aa4d8e991ef40
5
5
  SHA512:
6
- metadata.gz: ca1474e047e0785f7312a3275c8f4fda697c366b6efa156442eb253a9d8b7ead28d3d1997b35562f7300fa3a4cc506e2538a41b111470ba9424365c131775b9e
7
- data.tar.gz: 2d45cdd5ad98112b37c94e0c60c1b07cdc92dd80a1d28ace095a958958d327d129a51b93fa8e7cfdb77e73a616d3ed5e656c6f1ebd408458025bacbcc7b675fc
6
+ metadata.gz: 0efaeba2512cd02f8770014c4a02c06b7245e6e42db275bd0f4d5f2a5455ca54b1aaec40fc221086d50795e706b1ec5594a5054cb7a3d6b04898abf57d795d39
7
+ data.tar.gz: 3db4c3881a7a1677bd6a61b820384657cc25b2041f78463b175597b3032932f94550c7a8b941b975b18e571383dbdeb90e0e99618c873915c6aa57815c9fab0a
data/.codeclimate.yml ADDED
@@ -0,0 +1,19 @@
1
+ version: "2"
2
+ plugins:
3
+ rubocop:
4
+ enabled: true
5
+ channel: "beta"
6
+ exclude_patterns:
7
+ - "config/"
8
+ - "db/"
9
+ - "dist/"
10
+ - "features/"
11
+ - "**/node_modules/"
12
+ - "script/"
13
+ - "**/spec/"
14
+ - "**/test/"
15
+ - "**/tests/"
16
+ - "Tests/"
17
+ - "**/vendor/"
18
+ - "**/*_test.go"
19
+ - "**/*.d.ts"
data/Gemfile.lock ADDED
@@ -0,0 +1,75 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ ntq_excelsior (1.0.0)
5
+ caxlsx (< 4)
6
+ roo (< 3)
7
+
8
+ GEM
9
+ remote: https://rubygems.org/
10
+ specs:
11
+ ast (2.4.2)
12
+ caxlsx (3.3.0)
13
+ htmlentities (~> 4.3, >= 4.3.4)
14
+ marcel (~> 1.0)
15
+ nokogiri (~> 1.10, >= 1.10.4)
16
+ rubyzip (>= 1.3.0, < 3)
17
+ diff-lcs (1.5.0)
18
+ htmlentities (4.3.4)
19
+ json (2.6.3)
20
+ marcel (1.0.2)
21
+ nokogiri (1.15.2-arm64-darwin)
22
+ racc (~> 1.4)
23
+ parallel (1.23.0)
24
+ parser (3.2.2.3)
25
+ ast (~> 2.4.1)
26
+ racc
27
+ racc (1.7.1)
28
+ rainbow (3.1.1)
29
+ rake (13.0.6)
30
+ regexp_parser (2.8.1)
31
+ rexml (3.2.5)
32
+ roo (2.10.0)
33
+ nokogiri (~> 1)
34
+ rubyzip (>= 1.3.0, < 3.0.0)
35
+ rspec (3.11.0)
36
+ rspec-core (~> 3.11.0)
37
+ rspec-expectations (~> 3.11.0)
38
+ rspec-mocks (~> 3.11.0)
39
+ rspec-core (3.11.0)
40
+ rspec-support (~> 3.11.0)
41
+ rspec-expectations (3.11.1)
42
+ diff-lcs (>= 1.2.0, < 2.0)
43
+ rspec-support (~> 3.11.0)
44
+ rspec-mocks (3.11.1)
45
+ diff-lcs (>= 1.2.0, < 2.0)
46
+ rspec-support (~> 3.11.0)
47
+ rspec-support (3.11.1)
48
+ rubocop (1.52.1)
49
+ json (~> 2.3)
50
+ parallel (~> 1.10)
51
+ parser (>= 3.2.2.3)
52
+ rainbow (>= 2.2.2, < 4.0)
53
+ regexp_parser (>= 1.8, < 3.0)
54
+ rexml (>= 3.2.5, < 4.0)
55
+ rubocop-ast (>= 1.28.0, < 2.0)
56
+ ruby-progressbar (~> 1.7)
57
+ unicode-display_width (>= 2.4.0, < 3.0)
58
+ rubocop-ast (1.29.0)
59
+ parser (>= 3.2.1.0)
60
+ ruby-progressbar (1.13.0)
61
+ rubyzip (2.3.2)
62
+ unicode-display_width (2.4.2)
63
+
64
+ PLATFORMS
65
+ arm64-darwin-21
66
+
67
+ DEPENDENCIES
68
+ caxlsx (~> 3.2)
69
+ ntq_excelsior!
70
+ rake (~> 13.0)
71
+ rspec (~> 3.0)
72
+ rubocop (~> 1.21)
73
+
74
+ BUNDLED WITH
75
+ 2.4.14
data/README.md CHANGED
@@ -132,7 +132,8 @@ class UserImporter < NtqExcelsior::Importer
132
132
  required: true
133
133
  },
134
134
  active: {
135
- header: /Actif/i,
135
+ header: /Actif.+/i,
136
+ humanized_header: 'Actif', # (Optional) if provided, will be displayed instead regex in missing headers
136
137
  required: false
137
138
  }
138
139
  })
@@ -2,11 +2,9 @@ require 'roo'
2
2
 
3
3
  module NtqExcelsior
4
4
  class Importer
5
-
6
5
  attr_accessor :file, :check, :lines, :options, :status_tracker
7
6
 
8
7
  class << self
9
-
10
8
  def autosave(value = nil)
11
9
  @autosave ||= value
12
10
  end
@@ -48,38 +46,56 @@ module NtqExcelsior
48
46
  return @spreadsheet unless @spreadsheet.nil?
49
47
 
50
48
  raise 'File is missing' unless file.present?
51
-
49
+
52
50
  @spreadsheet = Roo::Spreadsheet.open(file, self.class.spreadsheet_options || {})
53
51
  end
54
52
 
55
53
  def required_headers
56
54
  return @required_headers if @required_headers
57
55
 
58
- @required_columns = self.class.schema.select { |field, column_config| !column_config.is_a?(Hash) || !column_config.has_key?(:required) || column_config[:required] }
59
- @required_line_keys = @required_columns.map{ |k, v| k }
60
- @required_headers = @required_columns.map{ |k, column_config| column_config.is_a?(Hash) ? column_config[:header] : column_config }.map{|header| header.is_a?(String) ? Regexp.new(header, "i") : header}
61
- if self.class.primary_key && !@required_line_keys.include?(self.class.primary_key)
62
- @required_line_keys = @required_line_keys.unshift(self.class.primary_key)
63
- @required_headers = @required_headers.unshift(Regexp.new(self.class.primary_key.to_s, "i"))
56
+ @required_columns = self.class.schema.select { |_field, column_config| !column_config.is_a?(Hash) || !column_config.key?(:required) || column_config[:required] }
57
+ @required_headers = @required_columns.values.map { |column| get_column_header(column) }.map { |header| tranform_header_to_regexp(header) }
58
+ if self.class.primary_key && !@required_columns.keys.include?(self.class.primary_key)
59
+ @required_headers.unshift(Regexp.new(self.class.primary_key.to_s, "i"))
64
60
  end
65
61
  @required_headers
66
62
  end
67
63
 
68
64
  def spreadsheet_data
69
- spreadsheet.sheet(spreadsheet.sheets[0]).parse(header_search: required_headers)
65
+ begin
66
+ spreadsheet_data = spreadsheet.sheet(spreadsheet.sheets[0]).parse(header_search: required_headers)
67
+ raise 'File is inconsistent, please check all headers of your file for specials characters (, / ; etc...)'
68
+ rescue Roo::HeaderRowNotFoundError => e
69
+ missing_headers = []
70
+
71
+ e.message.slice(1..-1).chop.split(",").map(&:strip).each do |header_missing|
72
+ header_missing_regex = tranform_header_to_regexp(header_missing, true)
73
+ header_found = @required_columns.values.find do |column|
74
+ tranform_header_to_regexp(get_column_header(column)) == header_missing_regex
75
+ end
76
+ if header_found && header_found.is_a?(Hash) && header_found[:humanized_header].present?
77
+ missing_headers << header_found[:humanized_header]
78
+ else
79
+ missing_headers << header_missing
80
+ end
81
+ end
82
+ raise Roo::HeaderRowNotFoundError, missing_headers.join(", ")
83
+ end
70
84
  end
71
85
 
72
86
  def detect_header_scheme
73
87
  return @header_scheme if @header_scheme
88
+
74
89
  @header_scheme = {}
75
- l = spreadsheet_data[0].dup
90
+ l = spreadsheet_data[0].dup || []
76
91
 
77
92
  self.class.schema.each do |field, column_config|
78
93
  header = column_config.is_a?(Hash) ? column_config[:header] : column_config
79
94
 
80
95
  l.each do |parsed_header, _value|
81
- next unless header.is_a?(Regexp) && parsed_header.match?(header) || header.is_a?(String) && parsed_header == header
82
-
96
+ next unless parsed_header
97
+ next unless (header.is_a?(Regexp) && parsed_header && parsed_header.match?(header)) || header.is_a?(String) && parsed_header == header
98
+
83
99
  l.delete(parsed_header)
84
100
  @header_scheme[parsed_header] = field
85
101
  end
@@ -131,7 +147,7 @@ module NtqExcelsior
131
147
  def record_attributes(record)
132
148
  return @record_attributes if @record_attributes
133
149
 
134
- @record_attributes = self.class.schema.keys.select{|k| k.to_sym != :id && record.respond_to?(:"#{k}=") }
150
+ @record_attributes = self.class.schema.keys.select { |k| k.to_sym != :id && record.respond_to?(:"#{k}=") }
135
151
  end
136
152
 
137
153
  def set_record_fields(record, line)
@@ -149,7 +165,7 @@ module NtqExcelsior
149
165
  @success = false
150
166
  @action = nil
151
167
  @errors = []
152
-
168
+
153
169
  if (self.class.autoset)
154
170
  record = set_record_fields(record, line)
155
171
  end
@@ -199,6 +215,24 @@ module NtqExcelsior
199
215
 
200
216
  { success_count: success_count, not_found_count: not_found_count, errors: errors_lines }
201
217
  end
218
+
219
+ private
220
+
221
+ def get_column_header(column)
222
+ return column unless column.is_a?(Hash)
223
+
224
+ column[:header]
225
+ end
226
+
227
+ def tranform_header_to_regexp(header, gsub_enclosure = false)
228
+ return header unless header.is_a?(String)
229
+
230
+ if gsub_enclosure && header.scan(/^\/[\^]?([^(\$\/)]+)[\$]?\/[i]?$/i) && $1
231
+ header = $1
232
+ end
233
+ Regexp.new("^#{header}$", "i")
234
+ end
202
235
 
203
236
  end
237
+
204
238
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module NtqExcelsior
4
- VERSION = "0.5.4"
4
+ VERSION = "1.0.0"
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ntq_excelsior
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.4
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kevin
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2023-04-28 00:00:00.000000000 Z
11
+ date: 2023-07-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: caxlsx
@@ -45,11 +45,13 @@ executables: []
45
45
  extensions: []
46
46
  extra_rdoc_files: []
47
47
  files:
48
+ - ".codeclimate.yml"
48
49
  - ".rspec"
49
50
  - ".rubocop.yml"
50
51
  - CHANGELOG.md
51
52
  - CODE_OF_CONDUCT.md
52
53
  - Gemfile
54
+ - Gemfile.lock
53
55
  - LICENSE.txt
54
56
  - README.md
55
57
  - Rakefile