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 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
@@ -0,0 +1,2 @@
1
+ source 'https://rubygems.org'
2
+ gemspec
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,4 @@
1
+ require 'custom_seeds'
2
+
3
+ path = File.expand_path(__dir__)
4
+ Dir.glob("#{path}/lib/custom_seeds/tasks/*.rake").each { |f| import f }
@@ -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,11 @@
1
+ module CustomSeeds
2
+ class Railtie < Rails::Railtie
3
+ railtie_name :custom_seeds
4
+
5
+ rake_tasks do
6
+ path = File.expand_path(__dir__)
7
+
8
+ Dir.glob("#{path}/tasks/*.rake").each { |f| load f }
9
+ end
10
+ end
11
+ 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
@@ -0,0 +1,3 @@
1
+ module CustomSeeds
2
+ VERSION = '0.1.0'.freeze
3
+ end
@@ -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: []