col_active_importer_starter 0.1.0 → 0.1.1

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
  SHA256:
3
- metadata.gz: 8640f42dbcfff94ba0d58115a6a78ec859fe2dc63e9d695e36dab8546871e9d4
4
- data.tar.gz: 723b1c2c15c2b53d07e1891edc493c1f1156d541a0155db0ff550d98a60e3790
3
+ metadata.gz: cbc87cc0fb9f6774deb81aa67430a579307573abd5d76da037ae1c85ab066135
4
+ data.tar.gz: 33c5a66a2f5e70c00890be462dc79f885b055c2b8db3c10c94e425e5182f91f8
5
5
  SHA512:
6
- metadata.gz: 7854b72e834966f362ca3acad0cf5a94ecc725b022d377e89b6842674b2aef46b40ed5156941cab9853eba776a76f07cf8a0200cb0ab21b82037e721b76b527c
7
- data.tar.gz: 5ed2ae585209d7baec0e3096fb9371e89ca18af9b521c738814078757a75b8085583f1a150ce990b4652e60a603b620d430c8a20169ed02692526cd895d2874d
6
+ metadata.gz: 2783cf206f6e21215126258c2428b61e994e85456f85f335660fdd0b30a08a0ffc9c5fbd552c986d9518377ae5d067afd1d4d938f30f3b1dfedea035fbb15c80
7
+ data.tar.gz: d3433a4093a35ee77142a497239d3438c4c0c2a960edc02e8106da8258048cf733ebe41d0dd0262c651a764d4c72dd91a6cc3503754c65b887009f693b65de03
data/README.md CHANGED
@@ -7,9 +7,10 @@ col_active_importer_starter is a starter(or wrapper) to [active_importer - https
7
7
  `col_active_importer_starter` makes full use of `active_importer` gem to import tabular data from spreadsheets or similar sources into Active Record models.
8
8
 
9
9
  - The best practices of `active_importer`, such as:
10
+ - [Custom parameters · continuum/active_importer Wiki - https://github.com/continuum/active_importer/wiki/Custom-parameters](https://github.com/continuum/active_importer/wiki/Custom-parameters)
10
11
  - [Events and callbacks - https://github.com/continuum/active_importer/wiki/Callbacks](https://github.com/continuum/active_importer/wiki/Callbacks).
11
12
  - Introduce a optional cache to retain data in the memory
12
- - Write out a file with the original data and more information for result
13
+ - Use rubyXL to write out a file with the original data and more information for result
13
14
 
14
15
  ## Installation
15
16
 
@@ -37,7 +38,7 @@ Suppose there is a ActiveRecord model `Article`:
37
38
 
38
39
  ```ruby
39
40
  class Article < ApplicationRecord
40
-
41
+
41
42
  end
42
43
  ```
43
44
  and tabular data file `data/Articles.xlsx`
@@ -54,38 +55,38 @@ and tabular data file `data/Articles.xlsx`
54
55
 
55
56
  class ArticleImporter < ColActiveImporterStarter::BaseImporter
56
57
  imports Article
57
-
58
+
58
59
  transactional
59
60
  module ColumnName
60
61
  Title = "Title"
61
62
  Body = "Body"
62
63
  end
63
-
64
+
64
65
  column ColumnName::Title, :title
65
66
  column ColumnName::Body, :body
66
-
67
+
67
68
  def handle_fetch_model
68
69
  params = {
69
70
  title: row[ColumnName::Title],
70
71
  }
71
-
72
+
72
73
  model = Article.find_or_initialize_by(params)
73
-
74
+
74
75
  model
75
76
  end
76
-
77
+
77
78
  fetch_model do
78
79
  handle_fetch_model
79
80
  end
80
-
81
+
81
82
  def handle_skip_rows_if?
82
83
  row[ColumnName::Title].blank?
83
84
  end
84
-
85
+
85
86
  skip_rows_if do
86
87
  handle_skip_rows_if?
87
88
  end
88
-
89
+
89
90
  # ArticleImporter.execute
90
91
  def self.execute(file = "#{Rails.root}/data/Articles.1.xlsx")
91
92
  params = {
@@ -95,7 +96,7 @@ class ArticleImporter < ColActiveImporterStarter::BaseImporter
95
96
  }
96
97
  import(file, params: params)
97
98
  end
98
-
99
+
99
100
  private
100
101
  end
101
102
  ```
@@ -103,7 +104,12 @@ end
103
104
  2. Import data from a file.
104
105
 
105
106
  ```ruby
106
- ArticleImporter.execute("#{Rails.root}/data/Articles.1.xlsx")
107
+ ArticleImporter.import("#{Rails.root}/data/Articles.1.xlsx")
108
+
109
+ # Or use ArticleImporter instance.
110
+ # importer = ArticleImporter.new(file, {params: params(file)})
111
+ # importer.import
112
+ # puts importer.row_count
107
113
  ```
108
114
 
109
115
  Or specify more arguments.
@@ -112,12 +118,19 @@ Or specify more arguments.
112
118
  params = {
113
119
  cache: {},
114
120
  file: "#{Rails.root}/data/Articles.1.xlsx",
115
- result_index: 10,
121
+ result_index: 3,
116
122
  }
117
123
 
118
- ArticleImporter.import(file, params: params)
124
+ ArticleImporter.import(file, {params: params})
125
+
126
+ # Or use ArticleImporter instance.
127
+ # importer = ArticleImporter.new(file, {params: params(file)})
128
+ # importer.import
129
+ # puts importer.row_count
119
130
  ```
120
131
 
132
+ For more examples to see [./test/dummy/test/importers/article_importer_test.rb](./test/dummy/test/importers/article_importer_test.rb).
133
+
121
134
  3. Then, check `tmp/importers` directory to find the result file.
122
135
 
123
136
  | Title | Body | | Result ID | Result Message |
@@ -125,6 +138,14 @@ ArticleImporter.import(file, params: params)
125
138
  | Article.1.title | Article.1.body | | 1 | success |
126
139
  | Article.2.title | Article.2.body | | 2 | success |
127
140
 
141
+ ## Testing
142
+
143
+ Run `rails test` to execute all test cases in `test/dummy/test` directory.
144
+
145
+ ```shell
146
+ rails test test/dummy/test
147
+ ```
148
+
128
149
  ## Inspire
129
150
 
130
151
  Inspire by [active_importer - https://github.com/continuum/active_importer](https://github.com/continuum/active_importer).
@@ -146,4 +167,15 @@ The gem is available as open source under the terms of the [MIT License - https:
146
167
 
147
168
  ## References
148
169
 
149
- [1] [continuum/active_importer: Define importers that load tabular data from spreadsheets or CSV files into any ActiveRecord-like ORM. - https://github.com/continuum/active_importer](https://github.com/continuum/active_importer)
170
+ [1] [CloudoLife-Rails/col_active_importer_starter: col_active_importer_starter is a starter(or wrapper) to [active_importer. - https://github.com/CloudoLife-Rails/col_active_importer_starter](https://github.com/CloudoLife-Rails/col_active_importer_starter)
171
+
172
+ [2] [col_active_importer_starter | RubyGems.org | your community gem host - https://rubygems.org/gems/col_active_importer_starter](https://rubygems.org/gems/col_active_importer_starter)
173
+
174
+ [3] [continuum/active_importer: Define importers that load tabular data from spreadsheets or CSV files into any ActiveRecord-like ORM. - https://github.com/continuum/active_importer](https://github.com/continuum/active_importer)
175
+
176
+ [4] [weshatheleopard/rubyXL: Ruby lib for reading/writing/modifying .xlsx and .xlsm files - https://github.com/weshatheleopard/rubyXL](https://github.com/weshatheleopard/rubyXL)
177
+
178
+ [5] [rubyXL | RubyGems.org | your community gem host - https://rubygems.org/gems/rubyXL/](https://rubygems.org/gems/rubyXL/)
179
+
180
+ [6] [RubyGems.org | your community gem host - https://rubygems.org/](https://rubygems.org/)
181
+
@@ -41,16 +41,25 @@ module ColActiveImporterStarter
41
41
 
42
42
  class BaseImporter < ActiveImporter::Base
43
43
 
44
+ attr_reader :start_at, :end_at, :time_consuming
45
+
44
46
  def get_result_id_column_index
47
+ return -1 if params.blank?
48
+
45
49
  params[ResultIndex::ID]
46
50
  end
47
51
 
48
52
  def initialize_result_exporter
53
+ return if params.blank?
54
+
49
55
  exporter = RubyXL::Parser.parse(params[:file])
50
56
  exporter_sheet1 = exporter[0]
51
57
 
52
58
  header_index = @header_index - 1
53
59
  column_index = get_result_id_column_index
60
+
61
+ return if invalid_column_index?(column_index)
62
+
54
63
  exporter_sheet1.add_cell(header_index, (column_index += 1), ResultColumnName::ID)
55
64
  exporter_sheet1.add_cell(header_index, (column_index += 1), ResultColumnName::Message)
56
65
 
@@ -59,30 +68,39 @@ module ColActiveImporterStarter
59
68
  end
60
69
 
61
70
  def initialize_model_cache
71
+ return if params.blank?
72
+
62
73
  model_cache = params.try(:[], :model_cache) || {}
63
74
 
64
75
  @model_cache = model_cache
65
76
  end
66
77
 
67
78
  on :import_started do
79
+ # initialize_count
80
+
68
81
  initialize_result_exporter
69
82
  initialize_model_cache
83
+
84
+ start_time_consuming
70
85
  end
71
86
 
72
- # on :row_skipped do
73
- # sheet1 = @sheet1
74
- #
75
- # row_index = @row_index - @header_index
76
- # column_index = ColumnIndex::Imported
77
- # column_index += 1
78
- # sheet1[row_index, (column_index += 1)] = ResultColumnName::Skip
79
- # end
87
+ on :row_skipped do
88
+ # sheet1 = @sheet1
89
+
90
+ # row_index = @row_index - @header_index
91
+ # column_index = ColumnIndex::Imported
92
+ # column_index += 1
93
+ # sheet1[row_index, (column_index += 1)] = ResultColumnName::Skip
94
+ end
80
95
 
81
96
  def handle_row_success
82
97
  exporter_sheet1 = @exporter_sheet1
83
98
 
84
99
  row_index = @row_index - @header_index
85
100
  column_index = get_result_id_column_index
101
+
102
+ return if invalid_column_index?(column_index)
103
+
86
104
  column_index += 1
87
105
  exporter_sheet1.add_cell(row_index, (column_index += 1), ResultValue::Success)
88
106
  end
@@ -96,6 +114,9 @@ module ColActiveImporterStarter
96
114
 
97
115
  row_index = @row_index - @header_index
98
116
  column_index = get_result_id_column_index
117
+
118
+ return if invalid_column_index?(column_index)
119
+
99
120
  column_index += 1
100
121
  exporter_sheet1.add_cell(row_index, (column_index += 1), ResultValue::Fail)
101
122
  exporter_sheet1.add_cell(row_index, (column_index += 1), e.message)
@@ -110,6 +131,9 @@ module ColActiveImporterStarter
110
131
 
111
132
  row_index = @row_index - @header_index
112
133
  column_index = get_result_id_column_index
134
+
135
+ return if invalid_column_index?(column_index)
136
+
113
137
  exporter_sheet1.add_cell(row_index, (column_index += 1), model&.id)
114
138
  end
115
139
 
@@ -117,10 +141,11 @@ module ColActiveImporterStarter
117
141
  handle_row_processed
118
142
  end
119
143
 
120
-
121
144
  def handle_import_finished
122
145
  exporter = @exporter
123
146
 
147
+ return if params.blank?
148
+
124
149
  file = params[:file]
125
150
 
126
151
  extname = '.xlsx'
@@ -136,6 +161,36 @@ module ColActiveImporterStarter
136
161
 
137
162
  on :import_finished do
138
163
  handle_import_finished
164
+
165
+ end_start_time_consuming
166
+ end
167
+
168
+ def info
169
+ {
170
+ start_at: start_at,
171
+ end_at: end_at,
172
+ time_consuming: time_consuming,
173
+
174
+ row_count: row_count,
175
+ row_processed_count: row_processed_count,
176
+ row_success_count: row_success_count,
177
+ row_error_count: row_error_count,
178
+ }
179
+ end
180
+
181
+ private
182
+
183
+ def invalid_column_index?(column_index)
184
+ column_index == -1
185
+ end
186
+
187
+ def start_time_consuming
188
+ @start_at = Time.now
189
+ end
190
+
191
+ def end_start_time_consuming
192
+ @end_at = Time.now
193
+ @time_consuming = @end_at - @start_at
139
194
  end
140
195
  end
141
- end
196
+ end
@@ -1,3 +1,3 @@
1
1
  module ColActiveImporterStarter
2
- VERSION = "0.1.0"
2
+ VERSION = "0.1.1"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: col_active_importer_starter
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Benjamin CloudoLife
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-01-07 00:00:00.000000000 Z
11
+ date: 2023-01-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -76,13 +76,13 @@ files:
76
76
  - lib/col_active_importer_starter/lib.rb
77
77
  - lib/col_active_importer_starter/version.rb
78
78
  - lib/tasks/col_active_importer_starter_tasks.rake
79
- homepage: https://github.com/CloudoLife-RoR/col_active_importer_starter
79
+ homepage: https://github.com/CloudoLife-Rails/col_active_importer_starter
80
80
  licenses: []
81
81
  metadata:
82
82
  allowed_push_host: https://rubygems.org
83
- homepage_uri: https://github.com/CloudoLife-RoR/col_active_importer_starter
84
- source_code_uri: https://github.com/CloudoLife-RoR/col_active_importer_starter
85
- changelog_uri: https://github.com/CloudoLife-RoR/col_active_importer_starter
83
+ homepage_uri: https://github.com/CloudoLife-Rails/col_active_importer_starter
84
+ source_code_uri: https://github.com/CloudoLife-Rails/col_active_importer_starter
85
+ changelog_uri: https://github.com/CloudoLife-Rails/col_active_importer_starter
86
86
  post_install_message:
87
87
  rdoc_options: []
88
88
  require_paths: