active_record_data_loader 1.0.2 → 1.3.1

Sign up to get free protection for your applications and to get access to all the features.
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"