fabrication 0.7.1 → 0.8.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -34,6 +34,15 @@ Now you can define fabricators in any of the following locations.
34
34
 
35
35
  They are automatically loaded, so no additional requires are necessary.
36
36
 
37
+ ### Rails 3 Generators ###
38
+
39
+ They are really easy to configure! Just add this to your `config/application.rb`:
40
+
41
+ config.generators do |g|
42
+ g.test_framework :rspec, :fixture => true
43
+ g.fixture_replacement :fabrication, :dir => "spec/fabricators"
44
+ end
45
+
37
46
  ### Usage ###
38
47
 
39
48
  Define your fabricators.
@@ -70,6 +79,18 @@ You can also explicitly specify the class being fabricated with the :class_name
70
79
  type "LLC"
71
80
  end
72
81
 
82
+ The callbacks will be stacked when inheriting from other fabricators. For example, when you define something like this:
83
+
84
+ Fabricator(:user) do
85
+ after_create { |user| user.confirm! }
86
+ end
87
+
88
+ Fabricator(:admin, :from => :user) do
89
+ after_create { |user| user.make_admin! }
90
+ end
91
+
92
+ When calling `Fabricate(:admin)`, the user callback will be executed first and then the admin callback.
93
+
73
94
  ### Fabricating ###
74
95
 
75
96
  Now that your Fabricators are defined, you can start generating some objects! To generate the LLC from the previous example, just do this:
@@ -135,3 +156,4 @@ To run rake successfully:
135
156
  * Matt (winescout)
136
157
  * Lar Van Der Jagt (supaspoida)
137
158
  * Justin Smestad (jsmestad)
159
+ * chanks
@@ -2,23 +2,12 @@ class Fabrication::Generator::Base
2
2
 
3
3
  def self.supports?(klass); true end
4
4
 
5
- def after_build(&block)
6
- callbacks[:after_build] = block if block_given?
7
- end
8
-
9
- def after_create(&block)
10
- callbacks[:after_create] = block if block_given?
11
- end
12
-
13
- def callbacks
14
- @callbacks ||= {}
15
- end
16
-
17
- def generate(options={:save => true}, attributes=[])
5
+ def generate(options={:save => true}, attributes=[], callbacks={})
18
6
  process_attributes(attributes)
19
- callbacks[:after_build].call(instance) if callbacks.include?(:after_build)
7
+
8
+ callbacks[:after_build].each { |callback| callback.call(instance) } if callbacks[:after_build]
20
9
  after_generation(options)
21
- callbacks[:after_create].call(instance) if callbacks.include?(:after_create)
10
+ callbacks[:after_create].each { |callback| callback.call(instance) } if callbacks[:after_create]
22
11
  instance
23
12
  end
24
13
 
@@ -49,15 +38,10 @@ class Fabrication::Generator::Base
49
38
 
50
39
  def process_attributes(attributes)
51
40
  attributes.each do |attribute|
52
- case attribute.name
53
- when :after_create; after_create(&attribute.value)
54
- when :after_build; after_build(&attribute.value)
41
+ if Proc === attribute.value
42
+ method_missing(attribute.name, attribute.params, &attribute.value)
55
43
  else
56
- if Proc === attribute.value
57
- method_missing(attribute.name, attribute.params, &attribute.value)
58
- else
59
- method_missing(attribute.name, attribute.value)
60
- end
44
+ method_missing(attribute.name, attribute.value)
61
45
  end
62
46
  end
63
47
  end
@@ -13,6 +13,16 @@ class Fabrication::Schematic
13
13
  instance_eval(&block) if block_given?
14
14
  end
15
15
 
16
+ def after_build(&block)
17
+ callbacks[:after_build] ||= []
18
+ callbacks[:after_build] << block
19
+ end
20
+
21
+ def after_create(&block)
22
+ callbacks[:after_create] ||= []
23
+ callbacks[:after_create] << block
24
+ end
25
+
16
26
  def attribute(name)
17
27
  attributes.select { |a| a.name == name }.first
18
28
  end
@@ -22,16 +32,26 @@ class Fabrication::Schematic
22
32
  @attributes ||= []
23
33
  end
24
34
 
35
+ attr_writer :callbacks
36
+ def callbacks
37
+ @callbacks ||= {}
38
+ end
39
+
25
40
  def generate(options={}, overrides={}, &block)
26
41
  attributes = merge(overrides, &block).attributes
27
42
  if options[:attributes]
28
43
  to_hash(attributes, overrides)
29
44
  else
30
- generator.new(klass).generate(options, attributes)
45
+ generator.new(klass).generate(options, attributes, callbacks)
31
46
  end
32
47
  end
33
48
 
34
49
  def initialize_copy(original)
50
+ self.callbacks = {}
51
+ original.callbacks.each do |type, callbacks|
52
+ self.callbacks[type] = callbacks.clone
53
+ end
54
+
35
55
  self.attributes = original.attributes.map do |a|
36
56
  Fabrication::Attribute.new(a.name, a.params, a.value)
37
57
  end
@@ -1,3 +1,3 @@
1
1
  module Fabrication
2
- VERSION = '0.7.1'
2
+ VERSION = '0.8.0'
3
3
  end
@@ -0,0 +1,15 @@
1
+ require 'rails/generators/fabrication_generator'
2
+
3
+ module Fabrication
4
+ module Generators
5
+ class ModelGenerator < Base
6
+ argument :attributes, :type => :array, :default => [], :banner => "field:type field:type"
7
+ class_option :dir, :type => :string, :default => "test/fabricators", :desc => "The directory where the fabricators should go"
8
+ class_option :extension, :type => :string, :default => "rb", :desc => "file extension name"
9
+
10
+ def create_fabrication_file
11
+ template 'fabricator.rb', File.join(options[:dir], "#{table_name}.#{options[:extension].to_s}")
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,5 @@
1
+ Fabricator :<%= singular_name %> do
2
+ <% attributes.each do |attribute| -%>
3
+ <%= attribute.name %> <%= attribute.default.inspect %>
4
+ <% end -%>
5
+ end
@@ -0,0 +1,11 @@
1
+ require 'rails/generators/named_base'
2
+
3
+ module Fabrication
4
+ module Generators
5
+ class Base < Rails::Generators::NamedBase #:nodoc:
6
+ def self.source_root
7
+ @_fabrication_source_root ||= File.expand_path(File.join(File.dirname(__FILE__), 'fabrication', generator_name, 'templates'))
8
+ end
9
+ end
10
+ end
11
+ end
@@ -9,22 +9,6 @@ describe Fabrication::Generator::Base do
9
9
  end
10
10
  end
11
11
 
12
- describe "#after_build" do
13
- subject { Fabrication::Generator::Base.new(Object) }
14
- before { subject.after_build { "something" } }
15
- it "stores the after create block" do
16
- Proc.should === subject.callbacks[:after_build]
17
- end
18
- end
19
-
20
- describe "#after_create" do
21
- subject { Fabrication::Generator::Base.new(Object) }
22
- before { subject.after_create { "something" } }
23
- it "stores the after create block" do
24
- Proc.should === subject.callbacks[:after_create]
25
- end
26
- end
27
-
28
12
  describe "#generate" do
29
13
 
30
14
  let(:generator) { Fabrication::Generator::Base.new(Person) }
@@ -219,6 +219,26 @@ describe Fabrication do
219
219
  end
220
220
  end
221
221
 
222
+ context 'with multiple callbacks' do
223
+ let(:child) { Fabricate(:child) }
224
+
225
+ it "runs the first callback" do
226
+ child.first_name.should == "Johnny"
227
+ end
228
+
229
+ it "runs the second callback" do
230
+ child.age.should == 10
231
+ end
232
+ end
233
+
234
+ context 'with multiple, inherited callbacks' do
235
+ let(:senior) { Fabricate(:senior) }
236
+
237
+ it "runs the parent callbacks first" do
238
+ senior.age.should == 70
239
+ end
240
+ end
241
+
222
242
  context 'with a parent fabricator' do
223
243
 
224
244
  context 'and a previously defined parent' do
@@ -20,6 +20,15 @@ Fabricator(:person) do
20
20
  location
21
21
  end
22
22
 
23
+ Fabricator(:child, :from => :person) do
24
+ after_build { |child| child.first_name = 'Johnny' }
25
+ after_build { |child| child.age = 10 }
26
+ end
27
+
28
+ Fabricator(:senior, :from => :child) do
29
+ after_build { |senior| senior.age *= 7 }
30
+ end
31
+
23
32
  # ActiveRecord Objects
24
33
  Fabricator(:division) do
25
34
  name "Division Name"
metadata CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
4
4
  prerelease: false
5
5
  segments:
6
6
  - 0
7
- - 7
8
- - 1
9
- version: 0.7.1
7
+ - 8
8
+ - 0
9
+ version: 0.8.0
10
10
  platform: ruby
11
11
  authors:
12
12
  - Paul Elliott
@@ -14,7 +14,7 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2010-09-12 00:00:00 -04:00
17
+ date: 2010-09-13 00:00:00 -04:00
18
18
  default_executable:
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
@@ -132,6 +132,9 @@ files:
132
132
  - lib/fabrication/support.rb
133
133
  - lib/fabrication/version.rb
134
134
  - lib/fabrication.rb
135
+ - lib/rails/generators/fabrication/model/model_generator.rb
136
+ - lib/rails/generators/fabrication/model/templates/fabricator.rb
137
+ - lib/rails/generators/fabrication_generator.rb
135
138
  - spec/fabrication/attribute_spec.rb
136
139
  - spec/fabrication/fabricator_spec.rb
137
140
  - spec/fabrication/generator/active_record_spec.rb