custom_seeds 0.1.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/.tool-versions +1 -0
- data/Gemfile +2 -0
- data/Gemfile.lock +48 -0
- data/README.md +58 -0
- data/Rakefile +4 -0
- data/custom_seeds.gemspec +26 -0
- data/lib/custom_seeds/railtie.rb +11 -0
- data/lib/custom_seeds/seed_file.rb +96 -0
- data/lib/custom_seeds/seed_list.rb +45 -0
- data/lib/custom_seeds/task_builder.rb +53 -0
- data/lib/custom_seeds/tasks/custom_seed.rake +18 -0
- data/lib/custom_seeds/version.rb +3 -0
- data/lib/custom_seeds.rb +11 -0
- metadata +125 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 9602b763569053bcf931f449a65f4a2137eebec44c7503db21e040fe0cef193f
|
4
|
+
data.tar.gz: 9823e21e7d44e4c3bf2189b672600c4828525f221d091612da00b1f1f66e8a7c
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 94217e6c650f77bd1b247260fc5105fed80aeb75b4f3ab49bdb8c4ce81bd07631634b7e2c806ed514f4ab5963b52dd28875ff3a29f494779b4a4756c957488a9
|
7
|
+
data.tar.gz: eeac7048aba9934c5efc21b47e6f567503f3d1c47eea2b2dbf62e2a776e3f69bbcabe94e1d8eb86f64468bad17e091ee3b34a9f7e76c2d78e17ebdc4da25ad88
|
data/.tool-versions
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
ruby 3.2.4
|
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -0,0 +1,48 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
custom_seeds (0.1.0)
|
5
|
+
progress_bar (= 1.3.1)
|
6
|
+
|
7
|
+
GEM
|
8
|
+
remote: https://rubygems.org/
|
9
|
+
specs:
|
10
|
+
coderay (1.1.3)
|
11
|
+
diff-lcs (1.5.1)
|
12
|
+
highline (2.1.0)
|
13
|
+
method_source (1.1.0)
|
14
|
+
options (2.3.2)
|
15
|
+
progress_bar (1.3.1)
|
16
|
+
highline (>= 1.6, < 3)
|
17
|
+
options (~> 2.3.0)
|
18
|
+
pry (0.14.2)
|
19
|
+
coderay (~> 1.1)
|
20
|
+
method_source (~> 1.0)
|
21
|
+
rake (13.2.1)
|
22
|
+
rspec (3.10.0)
|
23
|
+
rspec-core (~> 3.10.0)
|
24
|
+
rspec-expectations (~> 3.10.0)
|
25
|
+
rspec-mocks (~> 3.10.0)
|
26
|
+
rspec-core (3.10.2)
|
27
|
+
rspec-support (~> 3.10.0)
|
28
|
+
rspec-expectations (3.10.2)
|
29
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
30
|
+
rspec-support (~> 3.10.0)
|
31
|
+
rspec-mocks (3.10.3)
|
32
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
33
|
+
rspec-support (~> 3.10.0)
|
34
|
+
rspec-support (3.10.3)
|
35
|
+
|
36
|
+
PLATFORMS
|
37
|
+
x86_64-darwin-21
|
38
|
+
x86_64-darwin-23
|
39
|
+
|
40
|
+
DEPENDENCIES
|
41
|
+
bundler
|
42
|
+
custom_seeds!
|
43
|
+
pry
|
44
|
+
rake (~> 13.0)
|
45
|
+
rspec (= 3.10.0)
|
46
|
+
|
47
|
+
BUNDLED WITH
|
48
|
+
2.4.20
|
data/README.md
ADDED
@@ -0,0 +1,58 @@
|
|
1
|
+
# CustomSeeds
|
2
|
+
|
3
|
+
Seed file helpers for Rails applications.
|
4
|
+
|
5
|
+
## Installation
|
6
|
+
|
7
|
+
Add this line to your application's Gemfile:
|
8
|
+
|
9
|
+
```ruby
|
10
|
+
gem 'custom_seeds'
|
11
|
+
```
|
12
|
+
|
13
|
+
And then execute:
|
14
|
+
|
15
|
+
$ bundle
|
16
|
+
|
17
|
+
## Usage
|
18
|
+
|
19
|
+
Create a seedfile under `db/seeds`:
|
20
|
+
|
21
|
+
```ruby
|
22
|
+
# db/seeds/users/followed_products.rb
|
23
|
+
|
24
|
+
CustomSeeds.define do
|
25
|
+
title 'Followed Products'
|
26
|
+
description 'Add followed products to user accounts'
|
27
|
+
|
28
|
+
let(:products) { Product.validated.sample }
|
29
|
+
|
30
|
+
before do
|
31
|
+
FollowedProduct.destroy_all
|
32
|
+
end
|
33
|
+
|
34
|
+
records do
|
35
|
+
User.all
|
36
|
+
end
|
37
|
+
|
38
|
+
each_record do |user|
|
39
|
+
products.each do { |product| user.followed_products.create!(product: product) }
|
40
|
+
end
|
41
|
+
|
42
|
+
log_each do |user|
|
43
|
+
"User #{user.email} followed #{user.followed_products.count} products"
|
44
|
+
end
|
45
|
+
end
|
46
|
+
```
|
47
|
+
|
48
|
+
Run the file using the rake task:
|
49
|
+
|
50
|
+
```bash
|
51
|
+
$ rake db:seed:users:followed_products
|
52
|
+
```
|
53
|
+
|
54
|
+
Run all seeds using the rake task:
|
55
|
+
|
56
|
+
```bash
|
57
|
+
$ rake db:seed:all
|
58
|
+
```
|
data/Rakefile
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
lib = File.expand_path('../lib', __FILE__)
|
2
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
3
|
+
require 'custom_seeds/version'
|
4
|
+
|
5
|
+
Gem::Specification.new do |spec|
|
6
|
+
spec.name = 'custom_seeds'
|
7
|
+
spec.version = CustomSeeds::VERSION
|
8
|
+
spec.authors = ['Michael Wheeler']
|
9
|
+
spec.email = ['mwheeler@g2.com']
|
10
|
+
|
11
|
+
spec.summary = 'custom_seeds gem'
|
12
|
+
|
13
|
+
spec.files = `[ -d ".git" ] > /dev/null && type git > /dev/null && git ls-files -z`.split("\x0").reject do |f|
|
14
|
+
f.match(%r{^(test|spec|features)/})
|
15
|
+
end
|
16
|
+
spec.bindir = 'exe'
|
17
|
+
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
18
|
+
spec.require_paths = ['lib']
|
19
|
+
|
20
|
+
spec.add_dependency 'progress_bar', '1.3.1'
|
21
|
+
|
22
|
+
spec.add_development_dependency 'bundler'
|
23
|
+
spec.add_development_dependency 'pry'
|
24
|
+
spec.add_development_dependency 'rake', '~> 13.0'
|
25
|
+
spec.add_development_dependency 'rspec', '3.10.0'
|
26
|
+
end
|
@@ -0,0 +1,96 @@
|
|
1
|
+
require 'progress_bar'
|
2
|
+
|
3
|
+
module CustomSeeds
|
4
|
+
class SeedFile
|
5
|
+
attr_reader :build_block, :log_block
|
6
|
+
|
7
|
+
MAP = {
|
8
|
+
blue: 34,
|
9
|
+
green: 32
|
10
|
+
}.freeze
|
11
|
+
|
12
|
+
def self.define(&block)
|
13
|
+
new.tap do |seed_file|
|
14
|
+
seed_file.instance_eval(&block)
|
15
|
+
seed_file.run
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def initialize
|
20
|
+
@records = []
|
21
|
+
@build_block = ->(_record) { raise 'No build block defined' }
|
22
|
+
@log_block = nil
|
23
|
+
end
|
24
|
+
|
25
|
+
def colorize(string, color_code)
|
26
|
+
"\e[#{MAP[color_code]}m#{string}\e[0m"
|
27
|
+
end
|
28
|
+
|
29
|
+
def title(value)
|
30
|
+
puts colorize("🌱 #{value}", :green)
|
31
|
+
end
|
32
|
+
|
33
|
+
def description(value)
|
34
|
+
puts colorize(value, :blue)
|
35
|
+
end
|
36
|
+
|
37
|
+
def records(&block)
|
38
|
+
return @records if block.nil?
|
39
|
+
@records = block.call
|
40
|
+
end
|
41
|
+
|
42
|
+
def each_record(&block)
|
43
|
+
return @build_block if block.nil?
|
44
|
+
|
45
|
+
@build_block = block
|
46
|
+
end
|
47
|
+
|
48
|
+
def before(&block)
|
49
|
+
return @before_block if block.nil?
|
50
|
+
|
51
|
+
@before_block = block
|
52
|
+
end
|
53
|
+
|
54
|
+
# memoize block
|
55
|
+
def let(name, &block)
|
56
|
+
@memoized ||= {}
|
57
|
+
|
58
|
+
@memoized[name] ||= block.call
|
59
|
+
end
|
60
|
+
|
61
|
+
def respond_to_missing?(method_name, _include_private = false)
|
62
|
+
@memoized&.key?(method_name) || super
|
63
|
+
end
|
64
|
+
|
65
|
+
def method_missing(method_name, **_args)
|
66
|
+
if @memoized&.key?(method_name)
|
67
|
+
@memoized[method_name]
|
68
|
+
else
|
69
|
+
super
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
def log_each(&block)
|
74
|
+
return @log_block if block.nil?
|
75
|
+
|
76
|
+
@log_block = block
|
77
|
+
end
|
78
|
+
|
79
|
+
def run
|
80
|
+
before&.call
|
81
|
+
progress_bar = ProgressBar.new(records.size)
|
82
|
+
|
83
|
+
records.each do |record|
|
84
|
+
build_block.call(record)
|
85
|
+
|
86
|
+
if log_block
|
87
|
+
puts colorize(log_block.call(record), :blue)
|
88
|
+
else
|
89
|
+
progress_bar.increment!
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
puts colorize('✅ Seeding completed', :green)
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
module CustomSeeds
|
2
|
+
class SeedList
|
3
|
+
include Enumerable
|
4
|
+
|
5
|
+
attr_reader :directory
|
6
|
+
|
7
|
+
class Item
|
8
|
+
attr_reader :filename, :name
|
9
|
+
|
10
|
+
def initialize(filename, name)
|
11
|
+
@filename = filename
|
12
|
+
@name = name
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def initialize(directory: Rails.root.join('db/seeds/'))
|
17
|
+
@directory = directory
|
18
|
+
end
|
19
|
+
|
20
|
+
def seeds
|
21
|
+
@seeds ||= Dir.glob("#{directory}/**/*.rb").map do |filename|
|
22
|
+
namespaces = namespaces_for(filename)
|
23
|
+
task_name = taskname_for(filename)
|
24
|
+
|
25
|
+
Item.new(filename, (namespaces + [task_name]).join(':').intern)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def each(&block)
|
30
|
+
seeds.each(&block)
|
31
|
+
end
|
32
|
+
|
33
|
+
private
|
34
|
+
|
35
|
+
def taskname_for(filename)
|
36
|
+
filename.split('/').last.sub('.rb', '').intern
|
37
|
+
end
|
38
|
+
|
39
|
+
def namespaces_for(filename)
|
40
|
+
parts = filename.sub(@directory.to_s, '').split('/').filter { |part| part != '' }
|
41
|
+
|
42
|
+
parts[0..-2].map(&:intern)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
require 'custom_seeds/seed_list'
|
2
|
+
# This class exercises the Rake API to generate rake tasks based on a given seed file
|
3
|
+
# directory.
|
4
|
+
#
|
5
|
+
# Given a directory structure like:
|
6
|
+
# db/seeds/
|
7
|
+
# ├── foo
|
8
|
+
# │ └── bar.rb
|
9
|
+
# └── baz.rb
|
10
|
+
#
|
11
|
+
# The following rake tasks will be generated:
|
12
|
+
#
|
13
|
+
# db:seed:foo:bar
|
14
|
+
# db:seed:baz
|
15
|
+
# db:seed:all
|
16
|
+
|
17
|
+
module CustomSeeds
|
18
|
+
class TaskBuilder
|
19
|
+
attr_reader :directory, :rake_dsl
|
20
|
+
|
21
|
+
def initialize(rake_dsl:, directory: Rails.root.join('db/seeds/'))
|
22
|
+
@directory = directory
|
23
|
+
@rake_dsl = rake_dsl
|
24
|
+
end
|
25
|
+
|
26
|
+
def build
|
27
|
+
build_individual_tasks
|
28
|
+
build_global_task
|
29
|
+
end
|
30
|
+
|
31
|
+
def build_individual_tasks
|
32
|
+
SeedList.new(directory: @directory).each do |seed|
|
33
|
+
rake_dsl.send(:task, seed.name => :environment) do
|
34
|
+
load(seed.filename)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def build_global_task
|
40
|
+
rake_dsl.send(:task, :all, [:directory] => :environment) do |_, args|
|
41
|
+
files = if args[:directory]
|
42
|
+
Dir.glob("#{@directory}/#{args[:directory]}/**/*.rb")
|
43
|
+
else
|
44
|
+
Dir.glob("#{@directory}/**/*.rb")
|
45
|
+
end
|
46
|
+
|
47
|
+
ProgressBar.each(files) do |filename|
|
48
|
+
load(filename)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'custom_seeds'
|
2
|
+
|
3
|
+
namespace :db do
|
4
|
+
namespace :seed do
|
5
|
+
# This will load all files in db/seeds and create a task for each file
|
6
|
+
# The task is named after the full filename and directory name, but with underscores
|
7
|
+
# instead of slashes. For example, db/seeds/foo/bar.rb will create a task called
|
8
|
+
# db:seed:foo:bar
|
9
|
+
CustomSeeds::TaskBuilder.new(rake_dsl: self).build
|
10
|
+
|
11
|
+
task :list do
|
12
|
+
puts 'Available seed tasks:'
|
13
|
+
CustomSeeds::SeedList.new.each do |seed|
|
14
|
+
puts seed.name
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
data/lib/custom_seeds.rb
ADDED
@@ -0,0 +1,11 @@
|
|
1
|
+
require 'custom_seeds/version'
|
2
|
+
require 'custom_seeds/seed_file'
|
3
|
+
require 'custom_seeds/task_builder'
|
4
|
+
|
5
|
+
module CustomSeeds
|
6
|
+
require 'custom_seeds/railtie' if defined?(Rails)
|
7
|
+
|
8
|
+
def self.define(&block)
|
9
|
+
CustomSeeds::SeedFile.define(&block)
|
10
|
+
end
|
11
|
+
end
|
metadata
ADDED
@@ -0,0 +1,125 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: custom_seeds
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Michael Wheeler
|
8
|
+
autorequire:
|
9
|
+
bindir: exe
|
10
|
+
cert_chain: []
|
11
|
+
date: 2024-10-07 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: progress_bar
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - '='
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 1.3.1
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - '='
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 1.3.1
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: bundler
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: pry
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: rake
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '13.0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '13.0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: rspec
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - '='
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: 3.10.0
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - '='
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: 3.10.0
|
83
|
+
description:
|
84
|
+
email:
|
85
|
+
- mwheeler@g2.com
|
86
|
+
executables: []
|
87
|
+
extensions: []
|
88
|
+
extra_rdoc_files: []
|
89
|
+
files:
|
90
|
+
- ".tool-versions"
|
91
|
+
- Gemfile
|
92
|
+
- Gemfile.lock
|
93
|
+
- README.md
|
94
|
+
- Rakefile
|
95
|
+
- custom_seeds.gemspec
|
96
|
+
- lib/custom_seeds.rb
|
97
|
+
- lib/custom_seeds/railtie.rb
|
98
|
+
- lib/custom_seeds/seed_file.rb
|
99
|
+
- lib/custom_seeds/seed_list.rb
|
100
|
+
- lib/custom_seeds/task_builder.rb
|
101
|
+
- lib/custom_seeds/tasks/custom_seed.rake
|
102
|
+
- lib/custom_seeds/version.rb
|
103
|
+
homepage:
|
104
|
+
licenses: []
|
105
|
+
metadata: {}
|
106
|
+
post_install_message:
|
107
|
+
rdoc_options: []
|
108
|
+
require_paths:
|
109
|
+
- lib
|
110
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
111
|
+
requirements:
|
112
|
+
- - ">="
|
113
|
+
- !ruby/object:Gem::Version
|
114
|
+
version: '0'
|
115
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
116
|
+
requirements:
|
117
|
+
- - ">="
|
118
|
+
- !ruby/object:Gem::Version
|
119
|
+
version: '0'
|
120
|
+
requirements: []
|
121
|
+
rubygems_version: 3.4.19
|
122
|
+
signing_key:
|
123
|
+
specification_version: 4
|
124
|
+
summary: custom_seeds gem
|
125
|
+
test_files: []
|