db_seed_dump 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 +7 -0
- data/.rspec +2 -0
- data/.rubocop.yml +92 -0
- data/.rubocop_todo.yml +118 -0
- data/Gemfile +24 -0
- data/MIT-LICENSE +20 -0
- data/README.md +125 -0
- data/Rakefile +32 -0
- data/VERSION +1 -0
- data/bin/fastcheck +1 -0
- data/db_seed_dump.gemspec +80 -0
- data/lib/seed_dump/dependency_unwrangler.rb +51 -0
- data/lib/seed_dump/dump_methods/enumeration.rb +86 -0
- data/lib/seed_dump/dump_methods.rb +173 -0
- data/lib/seed_dump/environment.rb +182 -0
- data/lib/seed_dump/railtie.rb +7 -0
- data/lib/seed_dump.rb +15 -0
- data/lib/tasks/seed_dump.rake +8 -0
- data/spec/dump_methods_spec.rb +200 -0
- data/spec/environment_spec.rb +160 -0
- data/spec/factories/another_samples.rb +14 -0
- data/spec/factories/samples.rb +16 -0
- data/spec/factories/yet_another_samples.rb +14 -0
- data/spec/helpers.rb +92 -0
- data/spec/spec_helper.rb +36 -0
- metadata +211 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 12060dc2ff4d43740982f7ba85591a5957be54061b5edb727a9a4b98d0f5eb0a
|
4
|
+
data.tar.gz: b82fc9a34b062e6fd4e74589d99c807037c8fb02c22a25613a2fb087672b62b6
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 71c7aa7db97b4a637146f3ca9022ff8e1379f0f91ed8096dd0ae9de5df05f971fd63ffec5d81cd49955e8bf5fd10bc52523398485985681a40fb127807444b94
|
7
|
+
data.tar.gz: 8ec68dead1f7db5ecc0e842d0f42216be36cfa5a790e29c8f7b8696f0132ab571762e637cb754771e62aaa968f721474db22c747a02ba4c6176288df65dd984c
|
data/.rspec
ADDED
data/.rubocop.yml
ADDED
@@ -0,0 +1,92 @@
|
|
1
|
+
inherit_from: .rubocop_todo.yml
|
2
|
+
|
3
|
+
require:
|
4
|
+
- rubocop-performance
|
5
|
+
- rubocop-rspec
|
6
|
+
|
7
|
+
Layout/LineLength:
|
8
|
+
Max: 120
|
9
|
+
|
10
|
+
Lint/MissingSuper:
|
11
|
+
Enabled: false
|
12
|
+
|
13
|
+
Style/FrozenStringLiteralComment:
|
14
|
+
Enabled: false
|
15
|
+
|
16
|
+
Style/Documentation:
|
17
|
+
Enabled: false
|
18
|
+
|
19
|
+
Style/MixinUsage:
|
20
|
+
Exclude:
|
21
|
+
- 'bin/setup'
|
22
|
+
- 'bin/update'
|
23
|
+
- 'db/seeds.rb'
|
24
|
+
|
25
|
+
Style/NonNilCheck:
|
26
|
+
IncludeSemanticChanges: true
|
27
|
+
|
28
|
+
Style/HashEachMethods:
|
29
|
+
Enabled: true
|
30
|
+
|
31
|
+
Style/HashTransformKeys:
|
32
|
+
Enabled: true
|
33
|
+
|
34
|
+
Style/HashTransformValues:
|
35
|
+
Enabled: true
|
36
|
+
|
37
|
+
Style/HashAsLastArrayItem:
|
38
|
+
Enabled: false
|
39
|
+
|
40
|
+
Metrics/BlockLength:
|
41
|
+
Exclude:
|
42
|
+
- 'spec/**/*.rb'
|
43
|
+
- 'config/environments/**/*.rb'
|
44
|
+
- 'config/routes.rb'
|
45
|
+
- 'db/seeds.rb'
|
46
|
+
|
47
|
+
Metrics/MethodLength:
|
48
|
+
CountAsOne:
|
49
|
+
- array
|
50
|
+
- hash
|
51
|
+
- heredoc
|
52
|
+
|
53
|
+
RSpec/MultipleMemoizedHelpers:
|
54
|
+
Enabled: false
|
55
|
+
|
56
|
+
RSpec/MultipleExpectations:
|
57
|
+
Enabled: false
|
58
|
+
|
59
|
+
RSpec/DescribeClass:
|
60
|
+
Exclude:
|
61
|
+
- 'spec/system/**/*'
|
62
|
+
- 'spec/views/**/*'
|
63
|
+
|
64
|
+
RSpec/AnyInstance:
|
65
|
+
Enabled: false
|
66
|
+
|
67
|
+
RSpec/DescribedClass:
|
68
|
+
SkipBlocks: true
|
69
|
+
|
70
|
+
RSpec/ExampleLength:
|
71
|
+
Max: 20
|
72
|
+
Exclude:
|
73
|
+
- 'spec/system/**/*'
|
74
|
+
- 'spec/requests/**/*'
|
75
|
+
- 'spec/views/**/*'
|
76
|
+
|
77
|
+
RSpec/InstanceVariable:
|
78
|
+
Exclude:
|
79
|
+
- 'spec/views/**/*'
|
80
|
+
|
81
|
+
RSpec/NestedGroups:
|
82
|
+
Max: 5
|
83
|
+
|
84
|
+
AllCops:
|
85
|
+
NewCops: enable
|
86
|
+
Exclude:
|
87
|
+
- 'bin/**/*'
|
88
|
+
- 'db_seed_dump.gemspec'
|
89
|
+
|
90
|
+
inherit_mode:
|
91
|
+
merge:
|
92
|
+
- Exclude
|
data/.rubocop_todo.yml
ADDED
@@ -0,0 +1,118 @@
|
|
1
|
+
# This configuration was generated by
|
2
|
+
# `rubocop --auto-gen-config --auto-gen-only-exclude --exclude-limit 1000`
|
3
|
+
# on 2021-09-23 15:39:08 UTC using RuboCop version 1.21.0.
|
4
|
+
# The point is for the user to remove these configuration records
|
5
|
+
# one by one as the offenses are removed from the code base.
|
6
|
+
# Note that changes in the inspected code, or installation of new
|
7
|
+
# versions of RuboCop, may require this file to be generated again.
|
8
|
+
|
9
|
+
# Offense count: 1
|
10
|
+
# Configuration parameters: Include.
|
11
|
+
# Include: **/*.gemspec
|
12
|
+
Gemspec/RequiredRubyVersion:
|
13
|
+
Exclude:
|
14
|
+
- 'seed_dump.gemspec'
|
15
|
+
|
16
|
+
# Offense count: 1
|
17
|
+
# Configuration parameters: IgnoreLiteralBranches, IgnoreConstantBranches.
|
18
|
+
Lint/DuplicateBranch:
|
19
|
+
Exclude:
|
20
|
+
- 'lib/seed_dump/dump_methods.rb'
|
21
|
+
|
22
|
+
# Offense count: 3
|
23
|
+
Lint/UselessAssignment:
|
24
|
+
Exclude:
|
25
|
+
- 'lib/seed_dump/dump_methods/enumeration.rb'
|
26
|
+
- 'lib/seed_dump/environment.rb'
|
27
|
+
- 'spec/dump_methods_spec.rb'
|
28
|
+
|
29
|
+
# Offense count: 5
|
30
|
+
# Configuration parameters: IgnoredMethods, CountRepeatedAttributes, Max.
|
31
|
+
Metrics/AbcSize:
|
32
|
+
Exclude:
|
33
|
+
- 'lib/seed_dump/dump_methods.rb'
|
34
|
+
- 'lib/seed_dump/dump_methods/enumeration.rb'
|
35
|
+
- 'lib/seed_dump/environment.rb'
|
36
|
+
- 'spec/helpers.rb'
|
37
|
+
|
38
|
+
# Offense count: 1
|
39
|
+
# Configuration parameters: IgnoredMethods, Max.
|
40
|
+
Metrics/CyclomaticComplexity:
|
41
|
+
Exclude:
|
42
|
+
- 'lib/seed_dump/dump_methods.rb'
|
43
|
+
|
44
|
+
# Offense count: 6
|
45
|
+
# Configuration parameters: CountComments, Max, CountAsOne, ExcludedMethods, IgnoredMethods.
|
46
|
+
Metrics/MethodLength:
|
47
|
+
Exclude:
|
48
|
+
- 'lib/seed_dump/dump_methods.rb'
|
49
|
+
- 'lib/seed_dump/dump_methods/enumeration.rb'
|
50
|
+
- 'lib/seed_dump/environment.rb'
|
51
|
+
- 'spec/helpers.rb'
|
52
|
+
|
53
|
+
# Offense count: 1
|
54
|
+
# Configuration parameters: CountComments, Max, CountAsOne.
|
55
|
+
Metrics/ModuleLength:
|
56
|
+
Exclude:
|
57
|
+
- 'lib/seed_dump/dump_methods.rb'
|
58
|
+
|
59
|
+
# Offense count: 1
|
60
|
+
# Configuration parameters: IgnoredMethods, Max.
|
61
|
+
Metrics/PerceivedComplexity:
|
62
|
+
Exclude:
|
63
|
+
- 'lib/seed_dump/dump_methods.rb'
|
64
|
+
|
65
|
+
# Offense count: 1
|
66
|
+
RSpec/BeforeAfterAll:
|
67
|
+
Exclude:
|
68
|
+
- 'spec/environment_spec.rb'
|
69
|
+
|
70
|
+
# Offense count: 6
|
71
|
+
# Configuration parameters: Prefixes.
|
72
|
+
# Prefixes: when, with, without
|
73
|
+
RSpec/ContextWording:
|
74
|
+
Exclude:
|
75
|
+
- 'spec/dump_methods_spec.rb'
|
76
|
+
|
77
|
+
# Offense count: 2
|
78
|
+
# Configuration parameters: Include, CustomTransform, IgnoreMethods, SpecSuffixOnly.
|
79
|
+
# Include: **/*_spec*rb*, **/spec/**/*
|
80
|
+
RSpec/FilePath:
|
81
|
+
Exclude:
|
82
|
+
- 'spec/dump_methods_spec.rb'
|
83
|
+
- 'spec/environment_spec.rb'
|
84
|
+
|
85
|
+
# Offense count: 6
|
86
|
+
# Configuration parameters: AssignmentOnly.
|
87
|
+
RSpec/InstanceVariable:
|
88
|
+
Exclude:
|
89
|
+
- 'spec/dump_methods_spec.rb'
|
90
|
+
|
91
|
+
# Offense count: 1
|
92
|
+
# Configuration parameters: IgnoreNameless, IgnoreSymbolicNames.
|
93
|
+
RSpec/VerifiedDoubles:
|
94
|
+
Exclude:
|
95
|
+
- 'spec/environment_spec.rb'
|
96
|
+
|
97
|
+
# Offense count: 1
|
98
|
+
# Configuration parameters: MinBodyLength.
|
99
|
+
Style/GuardClause:
|
100
|
+
Exclude:
|
101
|
+
- 'spec/helpers.rb'
|
102
|
+
|
103
|
+
# Offense count: 1
|
104
|
+
# Cop supports --auto-correct.
|
105
|
+
# Configuration parameters: Mode.
|
106
|
+
Style/StringConcatenation:
|
107
|
+
Exclude:
|
108
|
+
- 'lib/seed_dump/dump_methods.rb'
|
109
|
+
|
110
|
+
# Offense count: 8
|
111
|
+
# Cop supports --auto-correct.
|
112
|
+
# Configuration parameters: Max, AllowHeredoc, AllowURI, URISchemes, IgnoreCopDirectives, IgnoredPatterns.
|
113
|
+
# URISchemes: http, https
|
114
|
+
Layout/LineLength:
|
115
|
+
Exclude:
|
116
|
+
- 'Rakefile'
|
117
|
+
- 'seed_dump.gemspec'
|
118
|
+
- 'spec/dump_methods_spec.rb'
|
data/Gemfile
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
source 'https://rubygems.org'
|
2
|
+
|
3
|
+
gem 'activerecord', '>= 4'
|
4
|
+
gem 'activesupport', '>= 4'
|
5
|
+
gem 'rgl'
|
6
|
+
|
7
|
+
group :development, :test do
|
8
|
+
gem 'activerecord-import', '~> 0.4'
|
9
|
+
gem 'byebug', '~> 11.0'
|
10
|
+
gem 'factory_bot', '~> 4.8.2'
|
11
|
+
gem 'rubocop', require: false
|
12
|
+
gem 'rubocop-performance', require: false
|
13
|
+
gem 'rubocop-rspec', require: false
|
14
|
+
end
|
15
|
+
|
16
|
+
group :development do
|
17
|
+
gem 'jeweler', '~> 2.0'
|
18
|
+
end
|
19
|
+
|
20
|
+
group :test do
|
21
|
+
gem 'database_cleaner', '~> 1.0'
|
22
|
+
gem 'rspec', '~> 3.7.0'
|
23
|
+
gem 'sqlite3', '~> 1.0'
|
24
|
+
end
|
data/MIT-LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright (c) 2021 Nick Flueckiger
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,125 @@
|
|
1
|
+
Seed Dump
|
2
|
+
========
|
3
|
+
|
4
|
+
Seed Dump is a Rails 4 and 5 plugin that adds a rake task named `db:seed:dump`.
|
5
|
+
|
6
|
+
It allows you to create seed data files from the existing data in your database.
|
7
|
+
|
8
|
+
You can also use Seed Dump from the Rails console. See below for usage examples.
|
9
|
+
|
10
|
+
Installation
|
11
|
+
------------
|
12
|
+
|
13
|
+
Add it to your Gemfile with:
|
14
|
+
```ruby
|
15
|
+
gem 'seed_dump', git: 'git://github.com/renuo/seed_dump', branch: 'master'
|
16
|
+
```
|
17
|
+
|
18
|
+
Documentation
|
19
|
+
-------------
|
20
|
+
|
21
|
+
This documentation is point to the develop branch of the repository.
|
22
|
+
For the documentation of the current release head to: https://github.com/renuo/seed_dump/blob/master/README.md.
|
23
|
+
|
24
|
+
Examples
|
25
|
+
--------
|
26
|
+
|
27
|
+
### Rake task
|
28
|
+
|
29
|
+
Dump all data directly to `db/seeds.rb`:
|
30
|
+
```sh
|
31
|
+
$ rake db:seed:dump
|
32
|
+
```
|
33
|
+
Result:
|
34
|
+
```ruby
|
35
|
+
Product.create!([
|
36
|
+
{ category_id: 1, description: "Long Sleeve Shirt", name: "Long Sleeve Shirt" },
|
37
|
+
{ category_id: 3, description: "Plain White Tee Shirt", name: "Plain T-Shirt" }
|
38
|
+
])
|
39
|
+
User.create!([
|
40
|
+
{ password: "123456", username: "test_1" },
|
41
|
+
{ password: "234567", username: "test_2" }
|
42
|
+
])
|
43
|
+
```
|
44
|
+
|
45
|
+
Dump only data from the users table and dump a maximum of 1 record:
|
46
|
+
```sh
|
47
|
+
$ rake db:seed:dump MODELS=User LIMIT=1
|
48
|
+
```
|
49
|
+
|
50
|
+
Result:
|
51
|
+
```ruby
|
52
|
+
User.create!([
|
53
|
+
{ password: "123456", username: "test_1" }
|
54
|
+
])
|
55
|
+
```
|
56
|
+
|
57
|
+
Append to `db/seeds.rb` instead of overwriting it:
|
58
|
+
```sh
|
59
|
+
rake db:seed:dump APPEND=true
|
60
|
+
```
|
61
|
+
|
62
|
+
Use another output file instead of `db/seeds.rb`:
|
63
|
+
```sh
|
64
|
+
rake db:seed:dump FILE=db/seeds/users.rb
|
65
|
+
```
|
66
|
+
|
67
|
+
Exclude `name` and `age` from the dump:
|
68
|
+
```sh
|
69
|
+
rake db:seed:dump EXCLUDE=name,age
|
70
|
+
```
|
71
|
+
|
72
|
+
There are more options that can be set— see below for all of them.
|
73
|
+
|
74
|
+
### Console
|
75
|
+
|
76
|
+
Output a dump of all User records:
|
77
|
+
```ruby
|
78
|
+
irb(main):001:0> puts SeedDump.dump(User)
|
79
|
+
User.create!([
|
80
|
+
{ password: "123456", username: "test_1" },
|
81
|
+
{ password: "234567", username: "test_2" }
|
82
|
+
])
|
83
|
+
```
|
84
|
+
|
85
|
+
Write the dump to a file:
|
86
|
+
```ruby
|
87
|
+
irb(main):002:0> SeedDump.dump(User, file: 'db/seeds.rb')
|
88
|
+
```
|
89
|
+
|
90
|
+
Append the dump to a file:
|
91
|
+
```ruby
|
92
|
+
irb(main):003:0> SeedDump.dump(User, file: 'db/seeds.rb', append: true)
|
93
|
+
```
|
94
|
+
|
95
|
+
Exclude `name` and `age` from the dump:
|
96
|
+
```ruby
|
97
|
+
irb(main):004:0> SeedDump.dump(User, exclude: [:name, :age])
|
98
|
+
```
|
99
|
+
|
100
|
+
Options are specified as a Hash for the second argument.
|
101
|
+
|
102
|
+
In the console, any relation of ActiveRecord rows can be dumped (not individual objects though)
|
103
|
+
```ruby
|
104
|
+
irb(main):001:0> puts SeedDump.dump(User.where(is_admin: false))
|
105
|
+
User.create!([
|
106
|
+
{ password: "123456", username: "test_1", is_admin: false },
|
107
|
+
{ password: "234567", username: "test_2", is_admin: false }
|
108
|
+
])
|
109
|
+
```
|
110
|
+
|
111
|
+
Options
|
112
|
+
-------
|
113
|
+
|
114
|
+
| Option | Values | Usage | Default |
|
115
|
+
|-----------------|---------------|----------------------------------------------------------------------------------------------------------------------------|---------------------------------|
|
116
|
+
| append | [true, false] | Set if the data should be appended to the file or overwritten | false |
|
117
|
+
| batch_size | [Integer] | Number of records written to the file at once. Decrease if you are running out of memory, Increase if too slow | 1000 |
|
118
|
+
| limit | [Integer] | Limits the number of entries dumped into the seeds file | no |
|
119
|
+
| file | [Path] | Sets the file path for the output seeds file | 'db/seeds.rb' |
|
120
|
+
| exclude | [Columns] | Exclude multiple attributes from the dump | [:id, :created_at, :updated_at] |
|
121
|
+
| import | [true, false] | Use the format for the [activerecord-import](https://github.com/zdennis/activerecord-import) gem | false |
|
122
|
+
| conditions | [] | Dump only specific records to the seeds. Can be set in the console with (e.g. `SeedDump.dump(User.where(state: :active))`) | None |
|
123
|
+
| models | [Models] | List of models that should be dumped to the seeds | All Models |
|
124
|
+
| models_excluded | [Models] | List of modles that should be excluded from the seeds dump | No Models excluded |
|
125
|
+
| insert_all | [true, false] | Set if the data should use insert_all instead of create! in the dump | false |
|
data/Rakefile
ADDED
@@ -0,0 +1,32 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'rake'
|
3
|
+
|
4
|
+
begin
|
5
|
+
require 'jeweler'
|
6
|
+
Jeweler::Tasks.new do |gem|
|
7
|
+
gem.name = 'db_seed_dump'
|
8
|
+
gem.summary = '{Seed Dumper for Rails}'
|
9
|
+
gem.description = %{Dump (parts) of your database to db/seeds.rb to get a headstart creating a meaningful seeds.rb file}
|
10
|
+
gem.email = 'nick.flueckiger@renuo.ch'
|
11
|
+
gem.homepage = 'https://github.com/reno/seed_dump'
|
12
|
+
gem.authors = ['Rob Halff', 'Ryan Oblak', 'Nick Flueckiger']
|
13
|
+
gem.license = 'MIT'
|
14
|
+
end
|
15
|
+
Jeweler::GemcutterTasks.new
|
16
|
+
rescue LoadError
|
17
|
+
puts 'Jeweler (or a dependency) not available. Install it with: gem install jeweler'
|
18
|
+
end
|
19
|
+
|
20
|
+
require 'rdoc/task'
|
21
|
+
Rake::RDocTask.new do |rdoc|
|
22
|
+
version = File.exist?('VERSION') ? File.read('VERSION') : ''
|
23
|
+
|
24
|
+
rdoc.rdoc_dir = 'rdoc'
|
25
|
+
rdoc.title = "db_seed_dump #{version}"
|
26
|
+
rdoc.rdoc_files.include('README*')
|
27
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
28
|
+
end
|
29
|
+
|
30
|
+
require 'rspec/core/rake_task'
|
31
|
+
RSpec::Core::RakeTask.new(:spec)
|
32
|
+
task default: :spec
|
data/VERSION
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
1.0.0
|
data/bin/fastcheck
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
bundle exec rubocop
|
@@ -0,0 +1,80 @@
|
|
1
|
+
# Generated by jeweler
|
2
|
+
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
|
4
|
+
# -*- encoding: utf-8 -*-
|
5
|
+
# stub: db_seed_dump 1.0.0 ruby lib
|
6
|
+
|
7
|
+
Gem::Specification.new do |s|
|
8
|
+
s.name = "db_seed_dump".freeze
|
9
|
+
s.version = "1.0.0"
|
10
|
+
|
11
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
|
12
|
+
s.require_paths = ["lib".freeze]
|
13
|
+
s.authors = ["Rob Halff".freeze, "Ryan Oblak".freeze, "Nick Flueckiger".freeze]
|
14
|
+
s.date = "2021-10-02"
|
15
|
+
s.description = "Dump (parts) of your database to db/seeds.rb to get a headstart creating a meaningful seeds.rb file".freeze
|
16
|
+
s.email = "nick.flueckiger@renuo.ch".freeze
|
17
|
+
s.executables = ["fastcheck".freeze]
|
18
|
+
s.extra_rdoc_files = [
|
19
|
+
"README.md"
|
20
|
+
]
|
21
|
+
s.files = [
|
22
|
+
".rspec",
|
23
|
+
".rubocop.yml",
|
24
|
+
".rubocop_todo.yml",
|
25
|
+
"Gemfile",
|
26
|
+
"MIT-LICENSE",
|
27
|
+
"README.md",
|
28
|
+
"Rakefile",
|
29
|
+
"VERSION",
|
30
|
+
"bin/fastcheck",
|
31
|
+
"db_seed_dump.gemspec",
|
32
|
+
"lib/seed_dump.rb",
|
33
|
+
"lib/seed_dump/dependency_unwrangler.rb",
|
34
|
+
"lib/seed_dump/dump_methods.rb",
|
35
|
+
"lib/seed_dump/dump_methods/enumeration.rb",
|
36
|
+
"lib/seed_dump/environment.rb",
|
37
|
+
"lib/seed_dump/railtie.rb",
|
38
|
+
"lib/tasks/seed_dump.rake",
|
39
|
+
"spec/dump_methods_spec.rb",
|
40
|
+
"spec/environment_spec.rb",
|
41
|
+
"spec/factories/another_samples.rb",
|
42
|
+
"spec/factories/samples.rb",
|
43
|
+
"spec/factories/yet_another_samples.rb",
|
44
|
+
"spec/helpers.rb",
|
45
|
+
"spec/spec_helper.rb"
|
46
|
+
]
|
47
|
+
s.homepage = "https://github.com/reno/seed_dump".freeze
|
48
|
+
s.licenses = ["MIT".freeze]
|
49
|
+
s.rubygems_version = "3.2.22".freeze
|
50
|
+
s.summary = "{Seed Dumper for Rails}".freeze
|
51
|
+
|
52
|
+
if s.respond_to? :specification_version then
|
53
|
+
s.specification_version = 4
|
54
|
+
end
|
55
|
+
|
56
|
+
if s.respond_to? :add_runtime_dependency then
|
57
|
+
s.add_runtime_dependency(%q<activerecord>.freeze, [">= 4"])
|
58
|
+
s.add_runtime_dependency(%q<activesupport>.freeze, [">= 4"])
|
59
|
+
s.add_runtime_dependency(%q<rgl>.freeze, [">= 0"])
|
60
|
+
s.add_development_dependency(%q<activerecord-import>.freeze, ["~> 0.4"])
|
61
|
+
s.add_development_dependency(%q<byebug>.freeze, ["~> 11.0"])
|
62
|
+
s.add_development_dependency(%q<factory_bot>.freeze, ["~> 4.8.2"])
|
63
|
+
s.add_development_dependency(%q<rubocop>.freeze, [">= 0"])
|
64
|
+
s.add_development_dependency(%q<rubocop-performance>.freeze, [">= 0"])
|
65
|
+
s.add_development_dependency(%q<rubocop-rspec>.freeze, [">= 0"])
|
66
|
+
s.add_development_dependency(%q<jeweler>.freeze, ["~> 2.0"])
|
67
|
+
else
|
68
|
+
s.add_dependency(%q<activerecord>.freeze, [">= 4"])
|
69
|
+
s.add_dependency(%q<activesupport>.freeze, [">= 4"])
|
70
|
+
s.add_dependency(%q<rgl>.freeze, [">= 0"])
|
71
|
+
s.add_dependency(%q<activerecord-import>.freeze, ["~> 0.4"])
|
72
|
+
s.add_dependency(%q<byebug>.freeze, ["~> 11.0"])
|
73
|
+
s.add_dependency(%q<factory_bot>.freeze, ["~> 4.8.2"])
|
74
|
+
s.add_dependency(%q<rubocop>.freeze, [">= 0"])
|
75
|
+
s.add_dependency(%q<rubocop-performance>.freeze, [">= 0"])
|
76
|
+
s.add_dependency(%q<rubocop-rspec>.freeze, [">= 0"])
|
77
|
+
s.add_dependency(%q<jeweler>.freeze, ["~> 2.0"])
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
@@ -0,0 +1,51 @@
|
|
1
|
+
require 'rgl/adjacency'
|
2
|
+
require 'rgl/topsort'
|
3
|
+
|
4
|
+
class SeedDump
|
5
|
+
class DependencyUnwrangler
|
6
|
+
def initialize(models)
|
7
|
+
@models = models
|
8
|
+
@graph = RGL::DirectedAdjacencyGraph.new
|
9
|
+
@evaluation_order = []
|
10
|
+
end
|
11
|
+
|
12
|
+
def evaluation_order
|
13
|
+
return [] if @models.empty?
|
14
|
+
return @evaluation_order unless @evaluation_order.empty?
|
15
|
+
|
16
|
+
build_graph unless graph_built?
|
17
|
+
|
18
|
+
@evaluation_order = @graph.topsort_iterator.to_a.reverse
|
19
|
+
@evaluation_order
|
20
|
+
end
|
21
|
+
|
22
|
+
private
|
23
|
+
|
24
|
+
def build_graph
|
25
|
+
@models.map do |model|
|
26
|
+
referents_by_model(model).each do |referent|
|
27
|
+
@graph.add_edge(model, referent)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def graph_built?
|
33
|
+
!@graph.edges.empty? && !@graph.vertices.empty?
|
34
|
+
end
|
35
|
+
|
36
|
+
def referents_by_model(model)
|
37
|
+
associations = model.reflect_on_all_associations(:belongs_to)
|
38
|
+
associations.map do |association|
|
39
|
+
association.options[:polymorphic] ? collect_polymorphic_deps(association) : association.klass
|
40
|
+
end.flatten
|
41
|
+
end
|
42
|
+
|
43
|
+
def collect_polymorphic_deps(association)
|
44
|
+
ActiveRecord::Base.descendants.select do |other_model|
|
45
|
+
other_model.reflect_on_all_associations(:has_many).any? do |has_many_association|
|
46
|
+
has_many_association.options[:as] == association.name
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,86 @@
|
|
1
|
+
class SeedDump
|
2
|
+
module DumpMethods
|
3
|
+
module Enumeration
|
4
|
+
def active_record_enumeration(records, _io, options)
|
5
|
+
# If the records don't already have an order,
|
6
|
+
# order them by primary key ascending.
|
7
|
+
if !records.respond_to?(:arel) || records.arel.orders.blank?
|
8
|
+
records.order("#{records.quoted_table_name}.#{records.quoted_primary_key} ASC")
|
9
|
+
end
|
10
|
+
|
11
|
+
num_of_batches, batch_size, last_batch_size = batch_params_from(records, options)
|
12
|
+
|
13
|
+
processed_entities = 0
|
14
|
+
# Loop through each batch
|
15
|
+
(1..num_of_batches).each do |batch_number|
|
16
|
+
record_strings = []
|
17
|
+
|
18
|
+
last_batch = (batch_number == num_of_batches)
|
19
|
+
|
20
|
+
cur_batch_size = if last_batch
|
21
|
+
last_batch_size
|
22
|
+
else
|
23
|
+
batch_size
|
24
|
+
end
|
25
|
+
|
26
|
+
processed_entities += cur_batch_size
|
27
|
+
|
28
|
+
# Loop through the records of the current batch
|
29
|
+
records.offset((batch_number - 1) * batch_size).limit(cur_batch_size).each do |record|
|
30
|
+
record_strings << dump_record(record, options)
|
31
|
+
end
|
32
|
+
|
33
|
+
should_split_file = split_file?(processed_entities, options)
|
34
|
+
processed_entities -= options[:file_split_limit] if should_split_file
|
35
|
+
|
36
|
+
yield record_strings, last_batch, should_split_file
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def split_file?(processed_entities, options)
|
41
|
+
return false if options[:file_split_limit].nil?
|
42
|
+
|
43
|
+
(processed_entities / file_index_from(options)) >= options[:file_split_limit]
|
44
|
+
end
|
45
|
+
|
46
|
+
def enumerable_enumeration(records, _io, options)
|
47
|
+
num_of_batches, batch_size = batch_params_from(records, options)
|
48
|
+
|
49
|
+
record_strings = []
|
50
|
+
|
51
|
+
batch_number = 1
|
52
|
+
|
53
|
+
records.each_with_index do |record, i|
|
54
|
+
record_strings << dump_record(record, options)
|
55
|
+
|
56
|
+
last_batch = (i == records.length - 1)
|
57
|
+
|
58
|
+
next unless (record_strings.length == batch_size) || last_batch
|
59
|
+
|
60
|
+
yield record_strings, last_batch
|
61
|
+
|
62
|
+
record_strings = []
|
63
|
+
batch_number += 1
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
def batch_params_from(records, options)
|
68
|
+
batch_size = batch_size_from(options)
|
69
|
+
|
70
|
+
count = records.count
|
71
|
+
|
72
|
+
remainder = count % batch_size
|
73
|
+
|
74
|
+
[(count.to_f / batch_size).ceil, batch_size, (remainder.zero? ? batch_size : remainder)]
|
75
|
+
end
|
76
|
+
|
77
|
+
def batch_size_from(options)
|
78
|
+
options[:batch_size]&.to_i || 1000
|
79
|
+
end
|
80
|
+
|
81
|
+
def file_index_from(options)
|
82
|
+
options[:current_file_index]&.to_i || 1
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|