seed_reaper 0.0.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/lib/config_evaluator.rb +33 -0
- data/lib/seed_reaper.rb +27 -0
- data/lib/seedifier.rb +103 -0
- metadata +172 -0
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
|
data/lib/seed_reaper.rb
ADDED
@@ -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: []
|