fabrication 0.8.3 → 0.9.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.
- data/README.markdown +9 -0
- data/lib/fabrication/generator/base.rb +6 -1
- data/lib/fabrication/schematic.rb +15 -5
- data/lib/fabrication/version.rb +1 -1
- data/spec/fabrication/generator/base_spec.rb +33 -0
- data/spec/fabrication/schematic_spec.rb +27 -0
- data/spec/fabrication_spec.rb +11 -0
- data/spec/fabricators.rb +4 -0
- data/spec/support/helper_objects.rb +9 -0
- metadata +5 -5
data/README.markdown
CHANGED
|
@@ -63,6 +63,14 @@ Breaking down the above, we are defining a "company" fabricator, which will gene
|
|
|
63
63
|
* After the object is built but before it is saved, it will update the name to "Another Fun Factory".
|
|
64
64
|
* After the object is created, it will update the "ceo" association with a new "drone" record.
|
|
65
65
|
|
|
66
|
+
|
|
67
|
+
For a class with required arguments in its constructor, use the `on_init` method:
|
|
68
|
+
|
|
69
|
+
Fabricator(:location) do
|
|
70
|
+
on_init { init_with(30.284167, -81.396111) }
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
|
|
66
74
|
### Inheritance ###
|
|
67
75
|
|
|
68
76
|
So you already have a company fabricator, but you need one that specifically generates an LLC. No problem!
|
|
@@ -155,6 +163,7 @@ To run rake successfully:
|
|
|
155
163
|
* Dave Ott (daveott)
|
|
156
164
|
* Matt (winescout)
|
|
157
165
|
* Lar Van Der Jagt (supaspoida)
|
|
166
|
+
* Sandro Turriate (sandro)
|
|
158
167
|
* Justin Smestad (jsmestad)
|
|
159
168
|
* Christopher Hanks (chanks) - Chained callbacks
|
|
160
169
|
* monsterlabs - Rails 3 Generators
|
|
@@ -3,7 +3,12 @@ class Fabrication::Generator::Base
|
|
|
3
3
|
def self.supports?(klass); true end
|
|
4
4
|
|
|
5
5
|
def generate(options={:save => true}, attributes=[], callbacks={})
|
|
6
|
-
|
|
6
|
+
if callbacks[:on_init]
|
|
7
|
+
self.instance = klass.new(*callbacks[:on_init].call)
|
|
8
|
+
else
|
|
9
|
+
self.instance = klass.new
|
|
10
|
+
end
|
|
11
|
+
|
|
7
12
|
process_attributes(attributes)
|
|
8
13
|
|
|
9
14
|
callbacks[:after_build].each { |callback| callback.call(instance) } if callbacks[:after_build]
|
|
@@ -38,11 +38,13 @@ class Fabrication::Schematic
|
|
|
38
38
|
end
|
|
39
39
|
|
|
40
40
|
def generate(options={}, overrides={}, &block)
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
41
|
+
new_schematic = merge(overrides, &block)
|
|
42
|
+
new_schematic.instance_eval do
|
|
43
|
+
if options[:attributes]
|
|
44
|
+
to_hash(attributes, overrides)
|
|
45
|
+
else
|
|
46
|
+
generator.new(klass).generate(options, attributes, callbacks)
|
|
47
|
+
end
|
|
46
48
|
end
|
|
47
49
|
end
|
|
48
50
|
|
|
@@ -57,6 +59,10 @@ class Fabrication::Schematic
|
|
|
57
59
|
end
|
|
58
60
|
end
|
|
59
61
|
|
|
62
|
+
def init_with(*args)
|
|
63
|
+
args
|
|
64
|
+
end
|
|
65
|
+
|
|
60
66
|
def merge(overrides={}, &block)
|
|
61
67
|
clone.tap do |schematic|
|
|
62
68
|
schematic.instance_eval(&block) if block_given?
|
|
@@ -87,6 +93,10 @@ class Fabrication::Schematic
|
|
|
87
93
|
end
|
|
88
94
|
end
|
|
89
95
|
|
|
96
|
+
def on_init(&block)
|
|
97
|
+
callbacks[:on_init] = block
|
|
98
|
+
end
|
|
99
|
+
|
|
90
100
|
def parse_method_name(method_name, args)
|
|
91
101
|
if method_name.to_s.end_with?("!")
|
|
92
102
|
method_name = method_name.to_s.chomp("!").to_sym
|
data/lib/fabrication/version.rb
CHANGED
|
@@ -36,6 +36,39 @@ describe Fabrication::Generator::Base do
|
|
|
36
36
|
person.instance_variable_get(:@first_name).should == 'Guy'
|
|
37
37
|
end
|
|
38
38
|
|
|
39
|
+
context "with on_init block" do
|
|
40
|
+
subject { schematic.generate }
|
|
41
|
+
|
|
42
|
+
let(:klass) { Struct.new :arg1, :arg2 }
|
|
43
|
+
|
|
44
|
+
context "using init_with" do
|
|
45
|
+
let(:schematic) do
|
|
46
|
+
Fabrication::Schematic.new(klass) do
|
|
47
|
+
on_init { init_with(:a, :b) }
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
it "sends the return value of the block to the klass' initialize method" do
|
|
52
|
+
subject.arg1.should == :a
|
|
53
|
+
subject.arg2.should == :b
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
context "not using init_with" do
|
|
58
|
+
let(:schematic) do
|
|
59
|
+
Fabrication::Schematic.new(klass) do
|
|
60
|
+
on_init { [ :a, :b ] }
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
it "sends the return value of the block to the klass' initialize method" do
|
|
65
|
+
subject.arg1.should == :a
|
|
66
|
+
subject.arg2.should == :b
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
|
|
39
72
|
end
|
|
40
73
|
|
|
41
74
|
end
|
|
@@ -135,4 +135,31 @@ describe Fabrication::Schematic do
|
|
|
135
135
|
|
|
136
136
|
end
|
|
137
137
|
|
|
138
|
+
describe "#on_init" do
|
|
139
|
+
let(:init_block) { lambda {} }
|
|
140
|
+
let(:init_schematic) do
|
|
141
|
+
block = init_block
|
|
142
|
+
Fabrication::Schematic.new(OpenStruct) do
|
|
143
|
+
on_init &block
|
|
144
|
+
end
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
it "stores the on_init callback" do
|
|
148
|
+
init_schematic.callbacks[:on_init].should == init_block
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
context "with inheritance" do
|
|
152
|
+
let(:child_block) { lambda {} }
|
|
153
|
+
let(:child_schematic) do
|
|
154
|
+
block = child_block
|
|
155
|
+
init_schematic.merge do
|
|
156
|
+
on_init &block
|
|
157
|
+
end
|
|
158
|
+
end
|
|
159
|
+
|
|
160
|
+
it "overwrites the on_init callback" do
|
|
161
|
+
child_schematic.callbacks[:on_init].should == child_block
|
|
162
|
+
end
|
|
163
|
+
end
|
|
164
|
+
end
|
|
138
165
|
end
|
data/spec/fabrication_spec.rb
CHANGED
|
@@ -56,6 +56,17 @@ describe Fabrication do
|
|
|
56
56
|
|
|
57
57
|
end
|
|
58
58
|
|
|
59
|
+
context 'when the class requires a constructor' do
|
|
60
|
+
subject do
|
|
61
|
+
Fabricate(:city) do
|
|
62
|
+
on_init { init_with('Jacksonville Beach', 'FL') }
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
its(:city) { should == 'Jacksonville Beach' }
|
|
67
|
+
its(:state) { should == 'FL' }
|
|
68
|
+
end
|
|
69
|
+
|
|
59
70
|
context "when referring to other fabricators" do
|
|
60
71
|
|
|
61
72
|
let(:person) { Fabricate(:person) }
|
data/spec/fabricators.rb
CHANGED
metadata
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: fabrication
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
hash:
|
|
4
|
+
hash: 59
|
|
5
5
|
prerelease: false
|
|
6
6
|
segments:
|
|
7
7
|
- 0
|
|
8
|
-
-
|
|
9
|
-
-
|
|
10
|
-
version: 0.
|
|
8
|
+
- 9
|
|
9
|
+
- 0
|
|
10
|
+
version: 0.9.0
|
|
11
11
|
platform: ruby
|
|
12
12
|
authors:
|
|
13
13
|
- Paul Elliott
|
|
@@ -15,7 +15,7 @@ autorequire:
|
|
|
15
15
|
bindir: bin
|
|
16
16
|
cert_chain: []
|
|
17
17
|
|
|
18
|
-
date: 2010-
|
|
18
|
+
date: 2010-10-07 00:00:00 -04:00
|
|
19
19
|
default_executable:
|
|
20
20
|
dependencies:
|
|
21
21
|
- !ruby/object:Gem::Dependency
|