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