dibber 0.5.0 → 0.7.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/README.rdoc +33 -6
- data/lib/dibber/seeder.rb +17 -6
- data/lib/dibber/version.rb +6 -1
- data/test/dibber/dynamic_thing_test.rb +18 -0
- data/test/dibber/seeder_test.rb +38 -5
- data/test/dibber/seeds/dynamic_things.yml +2 -0
- data/test/not_quite_active_record.rb +3 -3
- metadata +21 -18
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 7ac217e07668aaa17e034576c170a3e7736ea6bdedc5776bc05c197ad0604f1a
|
4
|
+
data.tar.gz: 6b07f8f169bd0e2e9f3cfd0aa9a9c86d4f4a10dba5f75ebeda44ef4c8b507fd0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 25af64ca3571627ccead7c5c873dd72548d6b58997311b22ad3cd459bbd28e78d4238cb17e8dbaf77e2b144dea0b9ecd5a0fae6b4c31519535a794277fc0616a
|
7
|
+
data.tar.gz: abaedc7100af6b56597d4faedced8e17704cddc5212c0e2842ffd293642b357f1653e03d89605636b0917788893cf77d55e40aec677d7c6ae899a3fa86c53bc9
|
data/README.rdoc
CHANGED
@@ -48,6 +48,39 @@ You'll then be able to do this:
|
|
48
48
|
thing = Thing.find_by(name: 'foo')
|
49
49
|
thing.colour ---> 'red'
|
50
50
|
|
51
|
+
=== Pass the name of the class to seed
|
52
|
+
|
53
|
+
All of these are equivalent commands
|
54
|
+
|
55
|
+
Dibber::Seeder.seed Thing
|
56
|
+
Dibber::Seeder.seed :thing
|
57
|
+
Dibber::Seeder.seed 'Thing'
|
58
|
+
|
59
|
+
=== Dynamic content
|
60
|
+
|
61
|
+
Seed content can also have dynamic content added via ERB. For example, if
|
62
|
+
you want the colour of the `foo` thing to be either 'red' or 'yellow', change
|
63
|
+
`db/seeds/things.yml` to
|
64
|
+
|
65
|
+
foo:
|
66
|
+
colour: <%= ['red', 'yellow'].sample %>
|
67
|
+
size: large
|
68
|
+
|
69
|
+
Then when we run `Dibber::Seeder.seed :thing` a new `Thing` will be created
|
70
|
+
with the colour set to either 'red' or 'yellow'.
|
71
|
+
|
72
|
+
=== Using blocks with Seeder
|
73
|
+
|
74
|
+
If you pass a block to `.seed` the block will be called on each object being
|
75
|
+
built as it is created or updated.
|
76
|
+
|
77
|
+
So for example, if Thing has attributes `size` and `big` the following is
|
78
|
+
possible:
|
79
|
+
|
80
|
+
Dibber::Seeder.seed(:thing) do |thing|
|
81
|
+
thing.big = thing.attributes['size'] > 10
|
82
|
+
end
|
83
|
+
|
51
84
|
== Report
|
52
85
|
|
53
86
|
Seeder.report outputs a report detailing start and end time, and a log of how
|
@@ -94,9 +127,3 @@ If you clone this app, you can run this example at the project root:
|
|
94
127
|
There is also an example of process log usage:
|
95
128
|
|
96
129
|
ruby test/examples/process_logs.rb
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
data/lib/dibber/seeder.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
require 'active_support/inflector'
|
2
2
|
require 'yaml'
|
3
|
+
require 'erb'
|
3
4
|
|
4
5
|
module Dibber
|
5
6
|
class Seeder
|
@@ -7,16 +8,16 @@ module Dibber
|
|
7
8
|
|
8
9
|
class << self
|
9
10
|
|
10
|
-
def seed(klass, args = {})
|
11
|
+
def seed(klass, args = {}, &block)
|
11
12
|
if klass.kind_of?(String) || klass.kind_of?(Symbol)
|
12
|
-
name = klass.to_s
|
13
|
+
name = klass.to_s.underscore
|
13
14
|
class_name = klass.to_s.strip.classify
|
14
15
|
klass = Kernel.const_get(class_name)
|
15
16
|
else
|
16
17
|
name = klass.to_s.underscore
|
17
18
|
end
|
18
19
|
new_file = "#{name.pluralize}.yml"
|
19
|
-
new(klass, new_file, args).build
|
20
|
+
new(klass, new_file, args).build(&block)
|
20
21
|
end
|
21
22
|
|
22
23
|
def process_log
|
@@ -39,7 +40,15 @@ module Dibber
|
|
39
40
|
end
|
40
41
|
|
41
42
|
def objects_from(file)
|
42
|
-
YAML.
|
43
|
+
YAML.load erb_processed(file_content(file))
|
44
|
+
end
|
45
|
+
|
46
|
+
def erb_processed(content)
|
47
|
+
ERB.new(content).result
|
48
|
+
end
|
49
|
+
|
50
|
+
def file_content(file)
|
51
|
+
File.read File.join(seeds_path, file)
|
43
52
|
end
|
44
53
|
|
45
54
|
def seeds_path
|
@@ -63,14 +72,16 @@ module Dibber
|
|
63
72
|
def build
|
64
73
|
check_objects_exist
|
65
74
|
start_log
|
66
|
-
objects.
|
75
|
+
objects.map do |name, attributes|
|
67
76
|
object = find_or_initialize_by(name)
|
68
77
|
if overwrite or object.new_record?
|
69
78
|
object.send("#{attribute_method}=", attributes)
|
79
|
+
yield(object) if block_given?
|
70
80
|
unless object.save
|
71
81
|
self.class.errors << object.errors
|
72
82
|
end
|
73
83
|
end
|
84
|
+
object
|
74
85
|
end
|
75
86
|
end
|
76
87
|
|
@@ -130,4 +141,4 @@ module Dibber
|
|
130
141
|
end
|
131
142
|
|
132
143
|
end
|
133
|
-
end
|
144
|
+
end
|
data/lib/dibber/version.rb
CHANGED
@@ -1,9 +1,14 @@
|
|
1
1
|
module Dibber
|
2
|
-
VERSION = "0.
|
2
|
+
VERSION = "0.7.0"
|
3
3
|
end
|
4
4
|
|
5
5
|
# History
|
6
6
|
# =======
|
7
|
+
# 0.7.0 Adds ability to pass blocks into Seeder.seed and Seed#build
|
8
|
+
#
|
9
|
+
# 0.6.0 ERB parse the source files before passing it to YAML. Allows dynamic
|
10
|
+
# content to be used.
|
11
|
+
#
|
7
12
|
# 0.5.0 Allow the `Seeder.seed` method to take a Class or the string/symbol
|
8
13
|
# representation of the class name.
|
9
14
|
#
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
require_relative 'thing'
|
3
|
+
|
4
|
+
module Dibber
|
5
|
+
class DynamicThingTest < Minitest::Test
|
6
|
+
|
7
|
+
def setup
|
8
|
+
Seeder.seeds_path = File.join(File.dirname(__FILE__), 'seeds')
|
9
|
+
end
|
10
|
+
|
11
|
+
|
12
|
+
def test_objects_from
|
13
|
+
hash = Seeder.objects_from('dynamic_things.yml')
|
14
|
+
assert_equal 'something', hash['one']['title']
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
18
|
+
end
|
data/test/dibber/seeder_test.rb
CHANGED
@@ -38,7 +38,7 @@ module Dibber
|
|
38
38
|
def test_clear_process_log
|
39
39
|
test_monitor
|
40
40
|
Seeder.clear_process_log
|
41
|
-
|
41
|
+
assert_nil Seeder.process_log.raw[:things], "Log should be empty"
|
42
42
|
end
|
43
43
|
|
44
44
|
def test_seeds_path
|
@@ -71,12 +71,20 @@ module Dibber
|
|
71
71
|
assert_equal(0, Thing.count)
|
72
72
|
thing_seeder.build
|
73
73
|
assert_equal(2, Thing.count)
|
74
|
-
foo = Thing.find_or_initialize_by(name:
|
74
|
+
foo = Thing.find_or_initialize_by(name: :foo)
|
75
75
|
bar = Thing.find_or_initialize_by(name: :bar)
|
76
76
|
assert_equal([foo, bar], Thing.saved)
|
77
77
|
assert_equal({'title' => 'one'}, foo.attributes)
|
78
78
|
end
|
79
79
|
|
80
|
+
def test_build_with_block
|
81
|
+
other = 'other'
|
82
|
+
thing_seeder.build { |t| t.other_method = other }
|
83
|
+
foo = Thing.find_or_initialize_by(name: :foo)
|
84
|
+
bar = Thing.find_or_initialize_by(name: :bar)
|
85
|
+
assert_equal([foo, bar], Thing.where(other_method: other))
|
86
|
+
end
|
87
|
+
|
80
88
|
def test_rebuilding_does_not_overwrite
|
81
89
|
test_build
|
82
90
|
attributes = {'title' => 'something else'}
|
@@ -138,7 +146,22 @@ module Dibber
|
|
138
146
|
assert_equal({'title' => 'one'}, foo.attributes)
|
139
147
|
end
|
140
148
|
|
141
|
-
|
149
|
+
def test_seed_with_block
|
150
|
+
other = 'other'
|
151
|
+
Seeder.seed(:things) { |thing| thing.other_method = other }
|
152
|
+
foo = Thing.find_or_initialize_by(name: :foo)
|
153
|
+
bar = Thing.find_or_initialize_by(name: :bar)
|
154
|
+
assert_equal([foo, bar], Thing.where(other_method: other))
|
155
|
+
end
|
156
|
+
|
157
|
+
def test_seed_with_block_using_attributes
|
158
|
+
other = 'other'
|
159
|
+
Seeder.seed(:things) { |thing| thing.other_method = thing.attributes['title'] }
|
160
|
+
foo = Thing.find_or_initialize_by(name: :foo)
|
161
|
+
assert_equal('one', foo.other_method)
|
162
|
+
end
|
163
|
+
|
164
|
+
def test_seed_with_alternative_name_method
|
142
165
|
Seeder.seed(:things, :name_method => 'other_method')
|
143
166
|
assert_equal(2, Thing.count)
|
144
167
|
foo = Thing.find_or_initialize_by(other_method: :foo)
|
@@ -179,7 +202,17 @@ module Dibber
|
|
179
202
|
assert_equal({'title' => 'one'}, foo.attributes)
|
180
203
|
end
|
181
204
|
|
182
|
-
|
205
|
+
def test_seed_with_class_name
|
206
|
+
assert_equal(0, Thing.count)
|
207
|
+
Seeder.seed('Thing')
|
208
|
+
assert_equal(2, Thing.count)
|
209
|
+
foo = Thing.find_or_initialize_by(name: :foo)
|
210
|
+
bar = Thing.find_or_initialize_by(name: :bar)
|
211
|
+
assert_equal([foo, bar], Thing.saved)
|
212
|
+
assert_equal({'title' => 'one'}, foo.attributes)
|
213
|
+
end
|
214
|
+
|
215
|
+
def test_seed_with_class_with_alternative_name_method
|
183
216
|
Seeder.seed(Thing, :name_method => 'other_method')
|
184
217
|
assert_equal(2, Thing.count)
|
185
218
|
foo = Thing.find_or_initialize_by(other_method: :foo)
|
@@ -244,7 +277,7 @@ module Dibber
|
|
244
277
|
end
|
245
278
|
|
246
279
|
def thing_file_path
|
247
|
-
File.join(File.dirname(__FILE__),'seeds', 'things.yml')
|
280
|
+
File.join(File.dirname(__FILE__), 'seeds', 'things.yml')
|
248
281
|
end
|
249
282
|
end
|
250
283
|
|
@@ -7,7 +7,7 @@ class NotQuiteActiveRecord
|
|
7
7
|
extract_attributes
|
8
8
|
self.class.members << self
|
9
9
|
end
|
10
|
-
|
10
|
+
|
11
11
|
def extract_attributes
|
12
12
|
attributes.each do |name, value|
|
13
13
|
self.send("#{name}=", value.to_s) if self.respond_to?(name.to_sym)
|
@@ -22,11 +22,11 @@ class NotQuiteActiveRecord
|
|
22
22
|
def new_record?
|
23
23
|
!self.class.saved.include? self
|
24
24
|
end
|
25
|
-
|
25
|
+
|
26
26
|
def self.where(hash)
|
27
27
|
members.select{|m| hash.collect{|k, v| m.send(k) == v.to_s}.uniq == [true]}
|
28
28
|
end
|
29
|
-
|
29
|
+
|
30
30
|
def self.find_or_initialize_by(hash)
|
31
31
|
if exists?(hash)
|
32
32
|
where(hash).first
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dibber
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.7.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Rob Nichols
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2022-09-30 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -28,16 +28,16 @@ dependencies:
|
|
28
28
|
name: minitest
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- - "
|
31
|
+
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: '
|
33
|
+
version: '0'
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- - "
|
38
|
+
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: '
|
40
|
+
version: '0'
|
41
41
|
description: Packages up code needed to pull data from YAML files when seeding, and
|
42
42
|
adds a process log.
|
43
43
|
email:
|
@@ -53,9 +53,11 @@ files:
|
|
53
53
|
- lib/dibber/process_log.rb
|
54
54
|
- lib/dibber/seeder.rb
|
55
55
|
- lib/dibber/version.rb
|
56
|
+
- test/dibber/dynamic_thing_test.rb
|
56
57
|
- test/dibber/foo/bar.rb
|
57
58
|
- test/dibber/process_log_test.rb
|
58
59
|
- test/dibber/seeder_test.rb
|
60
|
+
- test/dibber/seeds/dynamic_things.yml
|
59
61
|
- test/dibber/seeds/empty.yml
|
60
62
|
- test/dibber/seeds/foo/bars.yml
|
61
63
|
- test/dibber/seeds/things.yml
|
@@ -76,7 +78,7 @@ files:
|
|
76
78
|
- test/test_helper.rb
|
77
79
|
homepage: https://github.com/reggieb/Dibber
|
78
80
|
licenses:
|
79
|
-
- MIT
|
81
|
+
- MIT
|
80
82
|
metadata: {}
|
81
83
|
post_install_message:
|
82
84
|
rdoc_options: []
|
@@ -93,30 +95,31 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
93
95
|
- !ruby/object:Gem::Version
|
94
96
|
version: '0'
|
95
97
|
requirements: []
|
96
|
-
|
97
|
-
rubygems_version: 2.4.8
|
98
|
+
rubygems_version: 3.3.22
|
98
99
|
signing_key:
|
99
100
|
specification_version: 4
|
100
101
|
summary: Tool for seeding database from YAML.
|
101
102
|
test_files:
|
103
|
+
- test/dibber/dynamic_thing_test.rb
|
102
104
|
- test/dibber/foo/bar.rb
|
103
|
-
- test/dibber/seeder_test.rb
|
104
|
-
- test/dibber/thing.rb
|
105
105
|
- test/dibber/process_log_test.rb
|
106
|
+
- test/dibber/seeder_test.rb
|
107
|
+
- test/dibber/seeds/dynamic_things.yml
|
108
|
+
- test/dibber/seeds/empty.yml
|
106
109
|
- test/dibber/seeds/foo/bars.yml
|
107
110
|
- test/dibber/seeds/things.yml
|
108
|
-
- test/dibber/
|
111
|
+
- test/dibber/thing.rb
|
109
112
|
- test/dibber/thing_test.rb
|
110
|
-
- test/examples/
|
113
|
+
- test/examples/models/admin_user.rb
|
111
114
|
- test/examples/models/borough.rb
|
112
|
-
- test/examples/models/disclaimer.rb
|
113
115
|
- test/examples/models/category.rb
|
116
|
+
- test/examples/models/disclaimer.rb
|
114
117
|
- test/examples/models/fee.rb
|
115
|
-
- test/examples/
|
116
|
-
- test/examples/seeds/
|
118
|
+
- test/examples/process_logs.rb
|
119
|
+
- test/examples/seeds/boroughs.yml
|
117
120
|
- test/examples/seeds/categories.yml
|
118
121
|
- test/examples/seeds/disclaimer/documents.yml
|
119
|
-
- test/examples/seeds/
|
120
|
-
- test/examples/
|
122
|
+
- test/examples/seeds/fees.yml
|
123
|
+
- test/examples/seeds.rb
|
121
124
|
- test/not_quite_active_record.rb
|
122
125
|
- test/test_helper.rb
|