active_record_data_loader 1.0.2 → 1.3.1

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.
Files changed (38) hide show
  1. checksums.yaml +5 -5
  2. data/.github/workflows/build.yml +51 -0
  3. data/.github/workflows/codeql-analysis.yml +70 -0
  4. data/.github/workflows/gem-push.yml +29 -0
  5. data/.rubocop.yml +46 -7
  6. data/CHANGELOG.md +38 -2
  7. data/CODE_OF_CONDUCT.md +2 -2
  8. data/Gemfile.lock +71 -73
  9. data/README.md +162 -9
  10. data/Rakefile +8 -2
  11. data/active_record_data_loader.gemspec +7 -6
  12. data/config/database.yml +2 -0
  13. data/docker-compose.yml +18 -0
  14. data/gemfiles/activerecord_6.gemfile +1 -1
  15. data/lib/active_record_data_loader/active_record/{belongs_to_configuration.rb → belongs_to_data_provider.rb} +8 -7
  16. data/lib/active_record_data_loader/active_record/{column_configuration.rb → column_data_provider.rb} +2 -2
  17. data/lib/active_record_data_loader/active_record/enum_value_generator.rb +9 -8
  18. data/lib/active_record_data_loader/active_record/integer_value_generator.rb +1 -1
  19. data/lib/active_record_data_loader/active_record/list.rb +47 -0
  20. data/lib/active_record_data_loader/active_record/model_data_generator.rb +62 -7
  21. data/lib/active_record_data_loader/active_record/{polymorphic_belongs_to_configuration.rb → polymorphic_belongs_to_data_provider.rb} +12 -7
  22. data/lib/active_record_data_loader/active_record/unique_index_tracker.rb +67 -0
  23. data/lib/active_record_data_loader/bulk_insert_strategy.rb +16 -8
  24. data/lib/active_record_data_loader/configuration.rb +26 -3
  25. data/lib/active_record_data_loader/connection_handler.rb +52 -0
  26. data/lib/active_record_data_loader/copy_strategy.rb +38 -24
  27. data/lib/active_record_data_loader/data_faker.rb +12 -4
  28. data/lib/active_record_data_loader/dsl/model.rb +19 -2
  29. data/lib/active_record_data_loader/errors.rb +5 -0
  30. data/lib/active_record_data_loader/file_output_adapter.rb +48 -0
  31. data/lib/active_record_data_loader/loader.rb +55 -71
  32. data/lib/active_record_data_loader/null_output_adapter.rb +15 -0
  33. data/lib/active_record_data_loader/table_loader.rb +59 -0
  34. data/lib/active_record_data_loader/version.rb +1 -1
  35. data/lib/active_record_data_loader.rb +11 -38
  36. metadata +51 -29
  37. data/.travis.yml +0 -24
  38. data/config/database.yml.travis +0 -12
@@ -0,0 +1,59 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "benchmark"
4
+
5
+ module ActiveRecordDataLoader
6
+ class TableLoader
7
+ def self.load_data(
8
+ total_rows:,
9
+ batch_size:,
10
+ logger:,
11
+ connection_handler:,
12
+ strategy:
13
+ )
14
+ new(logger: logger, connection_handler: connection_handler, strategy: strategy)
15
+ .load_data(batch_size, total_rows)
16
+ end
17
+
18
+ def initialize(logger:, connection_handler:, strategy:)
19
+ @logger = logger
20
+ @connection_handler = connection_handler
21
+ @strategy = strategy
22
+ end
23
+
24
+ def load_data(batch_size, total_rows)
25
+ batch_count = (total_rows / batch_size.to_f).ceil
26
+
27
+ logger.info(
28
+ "[ActiveRecordDataLoader] "\
29
+ "Loading #{total_rows} row(s) into '#{strategy.table_name}' via #{strategy.name}. "\
30
+ "#{batch_size} row(s) per batch, #{batch_count} batch(es)."
31
+ )
32
+ total_time = Benchmark.realtime do
33
+ load_in_batches(batch_size, total_rows, batch_count)
34
+ end
35
+ logger.info(
36
+ "[ActiveRecordDataLoader] "\
37
+ "Completed loading #{total_rows} row(s) into '#{strategy.table_name}' "\
38
+ "in #{total_time} seconds."
39
+ )
40
+ end
41
+
42
+ private
43
+
44
+ attr_reader :strategy, :connection_handler, :logger
45
+
46
+ def load_in_batches(batch_size, total_rows, batch_count)
47
+ connection_handler.with_connection do |connection|
48
+ total_rows.times.each_slice(batch_size).with_index do |row_numbers, i|
49
+ time = Benchmark.realtime { strategy.load_batch(row_numbers, connection) }
50
+
51
+ logger.debug(
52
+ "[ActiveRecordDataLoader] "\
53
+ "Completed batch #{i + 1}/#{batch_count}, #{row_numbers.count} row(s) in #{time} seconds"
54
+ )
55
+ end
56
+ end
57
+ end
58
+ end
59
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module ActiveRecordDataLoader
4
- VERSION = "1.0.2"
4
+ VERSION = "1.3.1"
5
5
  end
@@ -2,28 +2,35 @@
2
2
 
3
3
  require "active_record_data_loader/version"
4
4
  require "active_record"
5
+ require "active_record_data_loader/errors"
5
6
  require "active_record_data_loader/configuration"
7
+ require "active_record_data_loader/connection_handler"
6
8
  require "active_record_data_loader/data_faker"
9
+ require "active_record_data_loader/active_record/list"
7
10
  require "active_record_data_loader/active_record/per_row_value_cache"
8
11
  require "active_record_data_loader/active_record/integer_value_generator"
9
12
  require "active_record_data_loader/active_record/text_value_generator"
10
13
  require "active_record_data_loader/active_record/enum_value_generator"
11
14
  require "active_record_data_loader/active_record/datetime_value_generator"
12
- require "active_record_data_loader/active_record/column_configuration"
13
- require "active_record_data_loader/active_record/belongs_to_configuration"
14
- require "active_record_data_loader/active_record/polymorphic_belongs_to_configuration"
15
+ require "active_record_data_loader/active_record/column_data_provider"
16
+ require "active_record_data_loader/active_record/belongs_to_data_provider"
17
+ require "active_record_data_loader/active_record/polymorphic_belongs_to_data_provider"
18
+ require "active_record_data_loader/active_record/unique_index_tracker"
15
19
  require "active_record_data_loader/active_record/model_data_generator"
16
20
  require "active_record_data_loader/dsl/belongs_to_association"
17
21
  require "active_record_data_loader/dsl/polymorphic_association"
18
22
  require "active_record_data_loader/dsl/model"
19
23
  require "active_record_data_loader/dsl/definition"
24
+ require "active_record_data_loader/file_output_adapter"
25
+ require "active_record_data_loader/null_output_adapter"
20
26
  require "active_record_data_loader/copy_strategy"
21
27
  require "active_record_data_loader/bulk_insert_strategy"
28
+ require "active_record_data_loader/table_loader"
22
29
  require "active_record_data_loader/loader"
23
30
 
24
31
  module ActiveRecordDataLoader
25
32
  def self.define(config = ActiveRecordDataLoader.configuration, &block)
26
- LoaderProxy.new(
33
+ ActiveRecordDataLoader::Loader.new(
27
34
  config,
28
35
  ActiveRecordDataLoader::Dsl::Definition.new(config).tap { |l| l.instance_eval(&block) }
29
36
  )
@@ -36,38 +43,4 @@ module ActiveRecordDataLoader
36
43
  def self.configuration
37
44
  @configuration ||= ActiveRecordDataLoader::Configuration.new
38
45
  end
39
-
40
- class LoaderProxy
41
- def initialize(configuration, definition)
42
- @configuration = configuration
43
- @definition = definition
44
- end
45
-
46
- def load_data
47
- ActiveRecordDataLoader::ActiveRecord::PerRowValueCache.clear
48
-
49
- definition.models.map { |m| load_model(m) }
50
- end
51
-
52
- private
53
-
54
- attr_reader :definition, :configuration
55
-
56
- def load_model(model)
57
- generator = ActiveRecordDataLoader::ActiveRecord::ModelDataGenerator.new(
58
- model: model.klass,
59
- column_settings: model.columns,
60
- polymorphic_settings: model.polymorphic_associations,
61
- belongs_to_settings: model.belongs_to_associations,
62
- connection_factory: configuration.connection_factory
63
- )
64
-
65
- ActiveRecordDataLoader::Loader.load_data(
66
- data_generator: generator,
67
- batch_size: model.batch_size,
68
- total_rows: model.row_count,
69
- configuration: configuration
70
- )
71
- end
72
- end
73
46
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: active_record_data_loader
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.2
4
+ version: 1.3.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Alejandro Beiderman
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-07-06 00:00:00.000000000 Z
11
+ date: 2021-12-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: '4.0'
19
+ version: '5.0'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
- version: '4.0'
26
+ version: '5.0'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: appraisal
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -52,20 +52,6 @@ dependencies:
52
52
  - - ">="
53
53
  - !ruby/object:Gem::Version
54
54
  version: '1.16'
55
- - !ruby/object:Gem::Dependency
56
- name: coveralls
57
- requirement: !ruby/object:Gem::Requirement
58
- requirements:
59
- - - ">="
60
- - !ruby/object:Gem::Version
61
- version: '0'
62
- type: :development
63
- prerelease: false
64
- version_requirements: !ruby/object:Gem::Requirement
65
- requirements:
66
- - - ">="
67
- - !ruby/object:Gem::Version
68
- version: '0'
69
55
  - !ruby/object:Gem::Dependency
70
56
  name: mysql2
71
57
  requirement: !ruby/object:Gem::Requirement
@@ -114,14 +100,14 @@ dependencies:
114
100
  requirements:
115
101
  - - "~>"
116
102
  - !ruby/object:Gem::Version
117
- version: '12.0'
103
+ version: '13.0'
118
104
  type: :development
119
105
  prerelease: false
120
106
  version_requirements: !ruby/object:Gem::Requirement
121
107
  requirements:
122
108
  - - "~>"
123
109
  - !ruby/object:Gem::Version
124
- version: '12.0'
110
+ version: '13.0'
125
111
  - !ruby/object:Gem::Dependency
126
112
  name: rspec
127
113
  requirement: !ruby/object:Gem::Requirement
@@ -164,6 +150,34 @@ dependencies:
164
150
  - - ">="
165
151
  - !ruby/object:Gem::Version
166
152
  version: '0'
153
+ - !ruby/object:Gem::Dependency
154
+ name: simplecov
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - ">="
158
+ - !ruby/object:Gem::Version
159
+ version: '0'
160
+ type: :development
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - ">="
165
+ - !ruby/object:Gem::Version
166
+ version: '0'
167
+ - !ruby/object:Gem::Dependency
168
+ name: simplecov-lcov
169
+ requirement: !ruby/object:Gem::Requirement
170
+ requirements:
171
+ - - ">="
172
+ - !ruby/object:Gem::Version
173
+ version: '0'
174
+ type: :development
175
+ prerelease: false
176
+ version_requirements: !ruby/object:Gem::Requirement
177
+ requirements:
178
+ - - ">="
179
+ - !ruby/object:Gem::Version
180
+ version: '0'
167
181
  - !ruby/object:Gem::Dependency
168
182
  name: sqlite3
169
183
  requirement: !ruby/object:Gem::Requirement
@@ -194,17 +208,19 @@ dependencies:
194
208
  version: '0'
195
209
  description: A utility to bulk load test data for performance testing.
196
210
  email:
197
- - abeiderman@gmail.com
211
+ - active_record_data_loader@ossprojects.dev
198
212
  executables:
199
213
  - console
200
214
  - setup
201
215
  extensions: []
202
216
  extra_rdoc_files: []
203
217
  files:
218
+ - ".github/workflows/build.yml"
219
+ - ".github/workflows/codeql-analysis.yml"
220
+ - ".github/workflows/gem-push.yml"
204
221
  - ".gitignore"
205
222
  - ".rspec"
206
223
  - ".rubocop.yml"
207
- - ".travis.yml"
208
224
  - Appraisals
209
225
  - CHANGELOG.md
210
226
  - CODE_OF_CONDUCT.md
@@ -217,7 +233,7 @@ files:
217
233
  - bin/console
218
234
  - bin/setup
219
235
  - config/database.yml
220
- - config/database.yml.travis
236
+ - docker-compose.yml
221
237
  - gemfiles/.bundle/config
222
238
  - gemfiles/activerecord_5.gemfile
223
239
  - gemfiles/activerecord_6.gemfile
@@ -225,24 +241,31 @@ files:
225
241
  - gemfiles/ffaker.gemfile
226
242
  - gemfiles/rails.gemfile
227
243
  - lib/active_record_data_loader.rb
228
- - lib/active_record_data_loader/active_record/belongs_to_configuration.rb
229
- - lib/active_record_data_loader/active_record/column_configuration.rb
244
+ - lib/active_record_data_loader/active_record/belongs_to_data_provider.rb
245
+ - lib/active_record_data_loader/active_record/column_data_provider.rb
230
246
  - lib/active_record_data_loader/active_record/datetime_value_generator.rb
231
247
  - lib/active_record_data_loader/active_record/enum_value_generator.rb
232
248
  - lib/active_record_data_loader/active_record/integer_value_generator.rb
249
+ - lib/active_record_data_loader/active_record/list.rb
233
250
  - lib/active_record_data_loader/active_record/model_data_generator.rb
234
251
  - lib/active_record_data_loader/active_record/per_row_value_cache.rb
235
- - lib/active_record_data_loader/active_record/polymorphic_belongs_to_configuration.rb
252
+ - lib/active_record_data_loader/active_record/polymorphic_belongs_to_data_provider.rb
236
253
  - lib/active_record_data_loader/active_record/text_value_generator.rb
254
+ - lib/active_record_data_loader/active_record/unique_index_tracker.rb
237
255
  - lib/active_record_data_loader/bulk_insert_strategy.rb
238
256
  - lib/active_record_data_loader/configuration.rb
257
+ - lib/active_record_data_loader/connection_handler.rb
239
258
  - lib/active_record_data_loader/copy_strategy.rb
240
259
  - lib/active_record_data_loader/data_faker.rb
241
260
  - lib/active_record_data_loader/dsl/belongs_to_association.rb
242
261
  - lib/active_record_data_loader/dsl/definition.rb
243
262
  - lib/active_record_data_loader/dsl/model.rb
244
263
  - lib/active_record_data_loader/dsl/polymorphic_association.rb
264
+ - lib/active_record_data_loader/errors.rb
265
+ - lib/active_record_data_loader/file_output_adapter.rb
245
266
  - lib/active_record_data_loader/loader.rb
267
+ - lib/active_record_data_loader/null_output_adapter.rb
268
+ - lib/active_record_data_loader/table_loader.rb
246
269
  - lib/active_record_data_loader/version.rb
247
270
  - log/.keep
248
271
  homepage:
@@ -258,15 +281,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
258
281
  requirements:
259
282
  - - ">="
260
283
  - !ruby/object:Gem::Version
261
- version: 2.3.0
284
+ version: 2.5.0
262
285
  required_rubygems_version: !ruby/object:Gem::Requirement
263
286
  requirements:
264
287
  - - ">="
265
288
  - !ruby/object:Gem::Version
266
289
  version: '0'
267
290
  requirements: []
268
- rubyforge_project:
269
- rubygems_version: 2.6.14
291
+ rubygems_version: 3.0.3.1
270
292
  signing_key:
271
293
  specification_version: 4
272
294
  summary: A utility to bulk load test data for performance testing.
data/.travis.yml DELETED
@@ -1,24 +0,0 @@
1
- sudo: false
2
- language: ruby
3
- env:
4
- - COVERALLS_PARALLEL=true
5
- rvm:
6
- - 2.3.8
7
- - 2.4.6
8
- - 2.5.5
9
- - 2.6.3
10
- gemfile:
11
- - gemfiles/activerecord_5.gemfile
12
- - gemfiles/rails.gemfile
13
- - gemfiles/faker.gemfile
14
- - gemfiles/ffaker.gemfile
15
- services:
16
- - postgresql
17
- notifications:
18
- webhooks: https://coveralls.io/webhook
19
- before_install: "gem update --system && gem install bundler"
20
- before_script:
21
- - psql -c 'create database test;' -U postgres
22
- - mysql -e 'CREATE DATABASE IF NOT EXISTS test;'
23
- - cp config/database.yml.travis config/database.yml
24
- script: "bundle exec rake"
@@ -1,12 +0,0 @@
1
- postgres:
2
- adapter: "postgresql"
3
- database: "test"
4
-
5
- sqlite3:
6
- adapter: "sqlite3"
7
- database: ":memory:"
8
-
9
- mysql:
10
- adapter: "mysql2"
11
- database: "test"
12
- username: "travis"