seed_reaper 0.0.0 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 1cf72255d5cd6a5556a0d2292007d0cb7768e9d4811351c765423388e719600e
4
- data.tar.gz: 0e55d2a5a1efac5163e8cf110d73f923fbd6fa059252f434387329df5b2b1ed5
3
+ metadata.gz: 0347bce9f9ed607a63163bd7e25b290b3a961e9d18b6f9e95a07c917a216a892
4
+ data.tar.gz: 539a54c298af39892b4944d2dd0b18db062029170cf914958f89d5db2a1102ad
5
5
  SHA512:
6
- metadata.gz: 9b2d4b4e50e3dcca8db054497fc8ce889d6543dcd4edeef1c9211b0ac075363cf37a315b43ad35b9bad131feb2caa1204812da561f2a28b99032a19ae4dbbb0d
7
- data.tar.gz: 21bf09230c93d2f0e8de754ffcb0d2ceeb8e4a35036a90ddade1d217306ca9b05eb129944e39e4a759e338ce3ef390fb00e3c36cc63e6bed8a572afb2355a7db
6
+ metadata.gz: 7c8b1f2f7a6b2c21de8ab5c87f329a20d4a21cf622c9816d68cbf69b2d218a63cac468f3176986ffe6ac8b6ecdcd1c9329b1ab61448bb6714407cb9cb516c056
7
+ data.tar.gz: 2dbfe636a01fc0d62bbd54edee05a4daf50db7779687ccb2b288b015d4d26bb55796ac0b94c7de88b850abf1068371c89d5af254198d8baca91efb1051946cbd
data/lib/Rakefile ADDED
@@ -0,0 +1,6 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'seed_reaper'
4
+
5
+ path = File.expand_path(__dir__)
6
+ Dir.glob("#{path}/tasks/**/*.rake").each { |f| load f }
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SeedReaper
4
+ class ConfigEvaluator
5
+ def initialize(config)
6
+ @config = config
7
+ end
8
+
9
+ def schema
10
+ return nil unless @config
11
+ return @config.reject { |k| k == :meta } if @config.is_a?(Hash)
12
+ return @config.reject { |c| c.is_a?(Hash) && c.has_key?(:meta) } if @config.is_a?(Array)
13
+
14
+ @config
15
+ end
16
+
17
+ %i[count joins].each do |meta_field|
18
+ define_method meta_field do
19
+ meta(meta_field)
20
+ end
21
+ end
22
+
23
+ private
24
+
25
+ def meta(field)
26
+ return nil unless @config
27
+ return @config.dig(:meta, field) if @config.is_a?(Hash)
28
+ return nil unless @config.is_a?(Array)
29
+
30
+ @config.select do |c|
31
+ c.is_a?(Hash) && c.has_key?(:meta)
32
+ end.first&.dig(:meta, field)
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'seed_reaper'
4
+
5
+ module SeedReaper
6
+ class Railtie < Rails::Railtie
7
+ railtie_name :seed_reaper
8
+
9
+ rake_tasks do
10
+ path = File.expand_path(__dir__)
11
+ Dir.glob("#{path}/tasks/**/*.rake").each { |f| load f }
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SeedReaper
4
+ class SeedWriter
5
+ def initialize(config)
6
+ @config = config
7
+ end
8
+
9
+ def write!
10
+ FileUtils.rm_rf('db/seeds/.', secure: true)
11
+
12
+ @config.each_with_index do |element, i|
13
+ File.open("db/seeds/#{i.to_s.rjust(@config.count.digits.count, '0')}_#{file_name(element)}.seeds.rb", 'w') do |file|
14
+ file.write(Seedifier.new(element).seedify)
15
+ end
16
+ end
17
+ end
18
+
19
+ private
20
+
21
+ def file_name(element)
22
+ return element if element.is_a?(Symbol)
23
+
24
+ element.first[0]
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,105 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'active_support/inflector'
4
+ require_relative 'config_evaluator'
5
+
6
+ module SeedReaper
7
+ class Seedifier
8
+ def initialize(config)
9
+ @config = config
10
+ end
11
+
12
+ def seedify
13
+ seedify_collection(base_model, base_config)
14
+ end
15
+
16
+ private
17
+
18
+ def base_model
19
+ return @config.to_s.camelize.constantize if @config.is_a?(Symbol)
20
+
21
+ @config.first[0].to_s.camelize.constantize
22
+ end
23
+
24
+ def base_config
25
+ return nil if @config.is_a?(Symbol)
26
+
27
+ @config.first[1]
28
+ end
29
+
30
+ def seedify_collection(collection, config)
31
+ ce = ConfigEvaluator.new(config)
32
+ evaluated_collection(collection, ce).reduce('') do |str, instance|
33
+ str += serialize(instance) + seedify_associations(instance, ce.schema)
34
+ end
35
+ end
36
+
37
+ def seedify_associations(instance, config)
38
+ return '' if config.nil?
39
+
40
+ if config.is_a?(Symbol)
41
+ instance.send(config).tap do |association|
42
+ return '' if association.blank?
43
+
44
+ association = [association] unless association.respond_to?(:each)
45
+ return seedify_collection(association, nil)
46
+ end
47
+ elsif config.is_a?(Array)
48
+ config.map do |sub_config|
49
+ seedify_associations(instance, sub_config)
50
+ end.join
51
+ elsif config.is_a?(Hash)
52
+ config.map do |(association_name, sub_config)|
53
+ association = instance.send(association_name)
54
+ next '' if association.blank?
55
+
56
+ association = [association] unless association.respond_to?(:each)
57
+ seedify_collection(association, sub_config)
58
+ end.join
59
+ else
60
+ fail "Your input config contains a #{config.class_name}. You may only use symbols, arrays and hashes."
61
+ end
62
+ end
63
+
64
+ def evaluated_collection(collection, config_evaluator)
65
+ limited_collection(
66
+ joined_collection(collection, config_evaluator.joins),
67
+ config_evaluator.count
68
+ )
69
+ end
70
+
71
+ def limited_collection(collection, count)
72
+ return collection unless collection.respond_to?(:limit)
73
+ return collection.limit(count) if count
74
+
75
+ collection.all
76
+ end
77
+
78
+ def joined_collection(collection, joins)
79
+ return collection unless collection.respond_to?(:joins)
80
+ return collection.joins(joins) if joins
81
+
82
+ collection
83
+ end
84
+
85
+ def serialize(instance)
86
+ "#{instance.class}.new(\n#{serialize_attrs(instance)}\n).save!(validate: false)\n\n"
87
+ end
88
+
89
+ def serialize_attrs(instance)
90
+ instance.attributes.to_h.reduce('') do |attr_str, (k, v)|
91
+ attr_str += "\s\s#{k}: #{serialize_value(v)},\n"
92
+ end[0...-2]
93
+ end
94
+
95
+ def serialize_value(value)
96
+ if value.nil?
97
+ "nil"
98
+ elsif value.is_a?(Integer)
99
+ value
100
+ else
101
+ "\"#{value}\""
102
+ end
103
+ end
104
+ end
105
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'yaml'
4
+ require 'seed_reaper'
5
+
6
+ namespace :seed_reaper do
7
+ desc 'Write seeds to db/seeds/ based on config/seed_reaper.yml.'
8
+ task :write do
9
+ SeedReaper::SeedWriter.new(
10
+ YAML.load(
11
+ File.read('config/seed_reaper.yml')
12
+ )
13
+ ).write!
14
+ end
15
+ end
data/lib/seed_reaper.rb CHANGED
@@ -1,27 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- include 'seedifier'
3
+ require 'seed_reaper/seedifier'
4
+ require 'seed_reaper/seed_writer'
5
+ require 'seed_reaper/railtie' if defined?(Rails)
4
6
 
5
- class SeedReaper
6
- def initialize(config)
7
- @config = config
8
- end
9
-
10
- def write!
11
- FileUtils.rm_rf('db/seeds/.', secure: true)
12
-
13
- @config.each_with_index do |element, i|
14
- File.open("db/seeds/#{i.to_s.rjust(@config.count.digits.count, '0')}_#{file_name(element)}.seeds.rb", 'w') do |file|
15
- file.write(Seedifier.new(element).seedify)
16
- end
17
- end
18
- end
19
-
20
- private
21
-
22
- def file_name(element)
23
- return element if element.is_a?(Symbol)
24
-
25
- element.first[0]
26
- end
7
+ module SeedReaper
27
8
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: seed_reaper
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.0
4
+ version: 0.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - David Butts
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-02-14 00:00:00.000000000 Z
11
+ date: 2022-02-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -143,9 +143,13 @@ executables: []
143
143
  extensions: []
144
144
  extra_rdoc_files: []
145
145
  files:
146
- - lib/config_evaluator.rb
146
+ - lib/Rakefile
147
147
  - lib/seed_reaper.rb
148
- - lib/seedifier.rb
148
+ - lib/seed_reaper/config_evaluator.rb
149
+ - lib/seed_reaper/railtie.rb
150
+ - lib/seed_reaper/seed_writer.rb
151
+ - lib/seed_reaper/seedifier.rb
152
+ - lib/seed_reaper/tasks/seed_reaper.rake
149
153
  homepage: https://github.com/dbutts2/seed_reaper
150
154
  licenses:
151
155
  - MIT
@@ -1,33 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- class ConfigEvaluator
4
- def initialize(config)
5
- @config = config
6
- end
7
-
8
- def schema
9
- return nil unless @config
10
- return @config.reject { |k| k == :meta } if @config.is_a?(Hash)
11
- return @config.reject { |c| c.is_a?(Hash) && c.has_key?(:meta) } if @config.is_a?(Array)
12
-
13
- @config
14
- end
15
-
16
- %i[count joins].each do |meta_field|
17
- define_method meta_field do
18
- meta(meta_field)
19
- end
20
- end
21
-
22
- private
23
-
24
- def meta(field)
25
- return nil unless @config
26
- return @config.dig(:meta, field) if @config.is_a?(Hash)
27
- return nil unless @config.is_a?(Array)
28
-
29
- @config.select do |c|
30
- c.is_a?(Hash) && c.has_key?(:meta)
31
- end.first&.dig(:meta, field)
32
- end
33
- end
data/lib/seedifier.rb DELETED
@@ -1,103 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'active_support/inflector'
4
- require 'config_evaluator'
5
-
6
- class Seedifier
7
- def initialize(config)
8
- @config = config
9
- end
10
-
11
- def seedify
12
- seedify_collection(base_model, base_config)
13
- end
14
-
15
- private
16
-
17
- def base_model
18
- return @config.to_s.camelize.constantize if @config.is_a?(Symbol)
19
-
20
- @config.first[0].to_s.camelize.constantize
21
- end
22
-
23
- def base_config
24
- return nil if @config.is_a?(Symbol)
25
-
26
- @config.first[1]
27
- end
28
-
29
- def seedify_collection(collection, config)
30
- ce = ConfigEvaluator.new(config)
31
- evaluated_collection(collection, ce).reduce('') do |str, instance|
32
- str += serialize(instance) + seedify_associations(instance, ce.schema)
33
- end
34
- end
35
-
36
- def seedify_associations(instance, config)
37
- return '' if config.nil?
38
-
39
- if config.is_a?(Symbol)
40
- instance.send(config).tap do |association|
41
- return '' if association.blank?
42
-
43
- association = [association] unless association.respond_to?(:each)
44
- return seedify_collection(association, nil)
45
- end
46
- elsif config.is_a?(Array)
47
- config.map do |sub_config|
48
- seedify_associations(instance, sub_config)
49
- end.join
50
- elsif config.is_a?(Hash)
51
- config.map do |(association_name, sub_config)|
52
- association = instance.send(association_name)
53
- next '' if association.blank?
54
-
55
- association = [association] unless association.respond_to?(:each)
56
- seedify_collection(association, sub_config)
57
- end.join
58
- else
59
- fail "Your input config contains a #{config.class_name}. You may only use symbols, arrays and hashes."
60
- end
61
- end
62
-
63
- def evaluated_collection(collection, config_evaluator)
64
- limited_collection(
65
- joined_collection(collection, config_evaluator.joins),
66
- config_evaluator.count
67
- )
68
- end
69
-
70
- def limited_collection(collection, count)
71
- return collection unless collection.respond_to?(:limit)
72
- return collection.limit(count) if count
73
-
74
- collection.all
75
- end
76
-
77
- def joined_collection(collection, joins)
78
- return collection unless collection.respond_to?(:joins)
79
- return collection.joins(joins) if joins
80
-
81
- collection
82
- end
83
-
84
- def serialize(instance)
85
- "#{instance.class}.new(\n#{serialize_attrs(instance)}\n).save!(validate: false)\n\n"
86
- end
87
-
88
- def serialize_attrs(instance)
89
- instance.attributes.to_h.reduce('') do |attr_str, (k, v)|
90
- attr_str += "\s\s#{k}: #{serialize_value(v)},\n"
91
- end[0...-2]
92
- end
93
-
94
- def serialize_value(value)
95
- if value.nil?
96
- "nil"
97
- elsif value.is_a?(Integer)
98
- value
99
- else
100
- "\"#{value}\""
101
- end
102
- end
103
- end