seed_reaper 0.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 1cf72255d5cd6a5556a0d2292007d0cb7768e9d4811351c765423388e719600e
4
+ data.tar.gz: 0e55d2a5a1efac5163e8cf110d73f923fbd6fa059252f434387329df5b2b1ed5
5
+ SHA512:
6
+ metadata.gz: 9b2d4b4e50e3dcca8db054497fc8ce889d6543dcd4edeef1c9211b0ac075363cf37a315b43ad35b9bad131feb2caa1204812da561f2a28b99032a19ae4dbbb0d
7
+ data.tar.gz: 21bf09230c93d2f0e8de754ffcb0d2ceeb8e4a35036a90ddade1d217306ca9b05eb129944e39e4a759e338ce3ef390fb00e3c36cc63e6bed8a572afb2355a7db
@@ -0,0 +1,33 @@
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
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ include 'seedifier'
4
+
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
27
+ end
data/lib/seedifier.rb ADDED
@@ -0,0 +1,103 @@
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
metadata ADDED
@@ -0,0 +1,172 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: seed_reaper
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.0
5
+ platform: ruby
6
+ authors:
7
+ - David Butts
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2022-02-14 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: activesupport
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '7.0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '7.0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: pry
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '0.13'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '0.13'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '3.10'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '3.10'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rdoc
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '6.4'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '6.4'
69
+ - !ruby/object:Gem::Dependency
70
+ name: bundler
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '2.3'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '2.3'
83
+ - !ruby/object:Gem::Dependency
84
+ name: juwelier
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: 2.1.0
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: 2.1.0
97
+ - !ruby/object:Gem::Dependency
98
+ name: simplecov
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: '0.21'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: '0.21'
111
+ - !ruby/object:Gem::Dependency
112
+ name: activerecord
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - "~>"
116
+ - !ruby/object:Gem::Version
117
+ version: '7.0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - "~>"
123
+ - !ruby/object:Gem::Version
124
+ version: '7.0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: sqlite3
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - "~>"
130
+ - !ruby/object:Gem::Version
131
+ version: '1.4'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - "~>"
137
+ - !ruby/object:Gem::Version
138
+ version: '1.4'
139
+ description: Traverses active record relations given a config and writes seeds to
140
+ a specified location.
141
+ email: dbutts2@protonmail.com
142
+ executables: []
143
+ extensions: []
144
+ extra_rdoc_files: []
145
+ files:
146
+ - lib/config_evaluator.rb
147
+ - lib/seed_reaper.rb
148
+ - lib/seedifier.rb
149
+ homepage: https://github.com/dbutts2/seed_reaper
150
+ licenses:
151
+ - MIT
152
+ metadata: {}
153
+ post_install_message:
154
+ rdoc_options: []
155
+ require_paths:
156
+ - lib
157
+ required_ruby_version: !ruby/object:Gem::Requirement
158
+ requirements:
159
+ - - ">="
160
+ - !ruby/object:Gem::Version
161
+ version: '0'
162
+ required_rubygems_version: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - ">="
165
+ - !ruby/object:Gem::Version
166
+ version: '0'
167
+ requirements: []
168
+ rubygems_version: 3.2.15
169
+ signing_key:
170
+ specification_version: 4
171
+ summary: Subsetter and object to seed serializer.
172
+ test_files: []