csv_step_importer 0.7.5 → 0.8.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: 96a84016e041d144dc81796ae295e23d934305f722bd03cb88dc574cbbd460ca
4
- data.tar.gz: 24d5229cdbe01cacf8ced8fc137a21334a10051ec0917801e83330401db778df
3
+ metadata.gz: be53e398ba3edb80965c62aae4b900166c45c348ed3bd6dadd432f4c3b0ea9c7
4
+ data.tar.gz: d29aedb38946e7d4e2e6ae8bdb6bd870a95d336ed712e9628dcb346753f5213b
5
5
  SHA512:
6
- metadata.gz: 05ade3ead9a672dd14d214991e1e18f58ed739c479a4a2fe71f7de2c8ce22d41cf5bca5400733be2c637371f1fbf80ec01e013d2544e4534bd9377a49d07056e
7
- data.tar.gz: d3a9b37b47bac1a099c0942de35f95df534fba5c87fc7fae082365733180f9f056c6982dd38f481d55814b993e795788460300b05be9ccaa9e1323e327d45f26
6
+ metadata.gz: 3ce3c6ac60969835e3582ff5dd7da0b364163918ca0fba0fd49ba30e6a546428ff113966e07c5f6a65f2e4dc84e583b94d34e67c76892477ffa928c1343dd58b
7
+ data.tar.gz: 6a6bac4957ac2937a658c2089bbae55363fc76efb9d15c934f5f2b01701caca74cc8e08a8e9fee1277dac63fc92ccce14fd0a29e681132309233e2ed914c7a57
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- csv_step_importer (0.7.5)
4
+ csv_step_importer (0.8.0)
5
5
  activemodel
6
6
  activerecord-import
7
7
  activesupport
data/README.md CHANGED
@@ -85,6 +85,33 @@ CSVStepImporter::File.new(path: 'currencies.csv', processor_classes: [Currency::
85
85
  puts Currency.all.to_yaml
86
86
  ```
87
87
 
88
+ ### Simple model
89
+
90
+ By default, for each row read from the CSV file, a DAO belonging to a model will be created.
91
+ These models will be validated and saved in the order specified by the processor_classes option.
92
+
93
+ The simplest model is one, which simply calls `save` on all DAOs, which calls internally `create_or_update`.
94
+ `create_or_update` is customizable.
95
+
96
+ Example:
97
+
98
+ This example will call `find_or_create_by` for each row after all validations have passed.
99
+
100
+ ```ruby
101
+ class SimpleDAO < CSVStepImporter::Model::DAO
102
+ def create_or_update
103
+ Currency.find_or_create_by( name: row.name, code: row.code )
104
+ end
105
+ end
106
+
107
+ class SimpleModel < CSVStepImporter::Model::Model
108
+ def dao_class
109
+ SimpleDAO
110
+ end
111
+ end
112
+
113
+ CSVStepImporter::File.new(path: 'currencies.csv', processor_classes: [SimpleModel]).save
114
+ ```
88
115
 
89
116
  ## Development
90
117
 
@@ -22,10 +22,8 @@ module CSVStepImporter
22
22
  self.row_class = row_class || CSVStepImporter::Row
23
23
  self.processor_classes = processor_classes
24
24
 
25
- self.csv_options = {
26
- chunk_size: 1000,
27
- file_encoding: "CP932:UTF-8",
28
- }.merge(csv_options)
25
+ self.csv_options = csv_options
26
+ precompile_csv_options!
29
27
 
30
28
  load_csv
31
29
  end
@@ -35,11 +33,7 @@ module CSVStepImporter
35
33
 
36
34
  first_row = 2
37
35
 
38
- options = csv_options.deep_dup
39
- options[:header_transformations] ||= []
40
- options[:header_transformations] << header_proc
41
-
42
- ::SmarterCSV.process(path, **options) do |rows|
36
+ ::SmarterCSV.process(path, **csv_options) do |rows|
43
37
  add_children chunk_class.new(
44
38
  first_row: first_row,
45
39
  parent: self,
@@ -78,5 +72,39 @@ module CSVStepImporter
78
72
  headers
79
73
  }
80
74
  end
75
+
76
+ def keys_as_symbols(case_sensitive: false)
77
+ if case_sensitive
78
+ Proc.new { |headers|
79
+ headers.map { |x| x.strip.gsub(%r{"}, '').gsub(/(\s|\-)+/, '_').to_sym }
80
+ }
81
+ else
82
+ # use existing helper
83
+ :keys_as_symbols
84
+ end
85
+ end
86
+
87
+ def precompile_csv_options!
88
+ # set default options
89
+ self.csv_options = {
90
+ chunk_size: 1000,
91
+ file_encoding: "CP932:UTF-8",
92
+ }.merge(csv_options)
93
+
94
+ # easier specification of headers, including case case sensitive headers
95
+ if csv_options[:headers] || csv_options[:case_sensitive_headers]
96
+ if csv_options[:header_transformations]
97
+ raise "either use header_transformations or headers (and case_sensitive_headers optionally)"
98
+ end
99
+
100
+ csv_options[:header_transformations] = [ :none ]
101
+ csv_options[:header_transformations] << { key_mapping: csv_options.delete(:headers) } if csv_options[:headers]
102
+ csv_options[:header_transformations] << keys_as_symbols(case_sensitive: csv_options.delete(:case_sensitive_headers))
103
+ end
104
+
105
+ # retrieve headers from CSV
106
+ csv_options[:header_transformations] ||= []
107
+ csv_options[:header_transformations] << header_proc
108
+ end
81
109
  end
82
110
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module CSVStepImporter
4
- VERSION = "0.7.5"
4
+ VERSION = "0.8.0"
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: csv_step_importer
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.5
4
+ version: 0.8.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Christian-Manuel Butzke
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2018-06-19 00:00:00.000000000 Z
11
+ date: 2018-06-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler