factory_girl 2.1.2 → 2.2.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/Changelog +25 -0
- data/GETTING_STARTED.md +10 -3
- data/Gemfile.lock +1 -1
- data/README.md +1 -1
- data/gemfiles/2.1.gemfile.lock +1 -1
- data/gemfiles/2.3.gemfile.lock +1 -1
- data/gemfiles/3.0.gemfile.lock +1 -1
- data/gemfiles/3.1.gemfile.lock +1 -1
- data/lib/factory_girl.rb +9 -0
- data/lib/factory_girl/attribute.rb +2 -6
- data/lib/factory_girl/attribute/association.rb +1 -1
- data/lib/factory_girl/attribute/dynamic.rb +8 -3
- data/lib/factory_girl/attribute/sequence.rb +8 -3
- data/lib/factory_girl/attribute/static.rb +7 -3
- data/lib/factory_girl/attribute_list.rb +5 -4
- data/lib/factory_girl/declaration.rb +5 -5
- data/lib/factory_girl/declaration/association.rb +1 -1
- data/lib/factory_girl/declaration/dynamic.rb +3 -3
- data/lib/factory_girl/declaration/implicit.rb +3 -3
- data/lib/factory_girl/declaration/static.rb +3 -3
- data/lib/factory_girl/definition_proxy.rb +14 -11
- data/lib/factory_girl/factory.rb +71 -79
- data/lib/factory_girl/proxy.rb +6 -1
- data/lib/factory_girl/proxy/attributes_for.rb +2 -6
- data/lib/factory_girl/proxy/build.rb +2 -7
- data/lib/factory_girl/proxy/stub.rb +2 -6
- data/lib/factory_girl/step_definitions.rb +3 -2
- data/lib/factory_girl/syntax/default.rb +1 -9
- data/lib/factory_girl/syntax/methods.rb +16 -8
- data/lib/factory_girl/syntax/vintage.rb +0 -3
- data/lib/factory_girl/version.rb +1 -1
- data/spec/acceptance/attribute_existing_on_object.rb +21 -0
- data/spec/acceptance/attributes_for_spec.rb +17 -0
- data/spec/acceptance/build_spec.rb +17 -0
- data/spec/acceptance/build_stubbed_spec.rb +18 -0
- data/spec/acceptance/create_spec.rb +18 -0
- data/spec/acceptance/define_child_before_parent_spec.rb +21 -0
- data/spec/acceptance/syntax/blueprint_spec.rb +2 -2
- data/spec/acceptance/syntax/generate_spec.rb +9 -9
- data/spec/acceptance/syntax/make_spec.rb +6 -6
- data/spec/acceptance/syntax/sham_spec.rb +3 -3
- data/spec/acceptance/syntax/vintage_spec.rb +30 -29
- data/spec/acceptance/transient_attributes_spec.rb +45 -3
- data/spec/factory_girl/attribute/dynamic_spec.rb +5 -5
- data/spec/factory_girl/attribute/sequence_spec.rb +1 -1
- data/spec/factory_girl/attribute/static_spec.rb +3 -3
- data/spec/factory_girl/attribute_list_spec.rb +9 -24
- data/spec/factory_girl/attribute_spec.rb +3 -3
- data/spec/factory_girl/definition_proxy_spec.rb +23 -42
- data/spec/factory_girl/factory_spec.rb +26 -95
- data/spec/factory_girl/find_definitions_spec.rb +1 -1
- data/spec/support/shared_examples/proxy.rb +1 -1
- metadata +119 -122
data/Changelog
CHANGED
@@ -1,3 +1,28 @@
|
|
1
|
+
2.2.0 (October 14, 2011)
|
2
|
+
Clean up RSpec suite to not use 'should'
|
3
|
+
Use create_list in step definitions
|
4
|
+
Syntax methods that deal with ORM interaction (attributes_for, build, build_stubbed,
|
5
|
+
and create) now accept a block that yields the result. This results in a
|
6
|
+
more convenient way to interact with the result than using Object.tap.
|
7
|
+
Standardize deprecation warnings
|
8
|
+
Update transient attribute syntax to use blocks instead of calling ignore on
|
9
|
+
each attribute declaration
|
10
|
+
Parents can be defined after children because factories are evaluated when
|
11
|
+
they're used; this means breaking up factories across multiple files will
|
12
|
+
behave as expected
|
13
|
+
Large internal refactoring, including changing access modifiers for a
|
14
|
+
handful of methods for a more clearly defined API
|
15
|
+
|
16
|
+
2.1.2 (September 23, 2011)
|
17
|
+
Bugfix: Vintage syntax fixed after bug introduced in 2.1.1
|
18
|
+
Introduce dependency on activesupport to remove code from Factory class
|
19
|
+
|
20
|
+
2.1.1 (September 23, 2011) (yanked)
|
21
|
+
Bugfix: Parent object callbacks are run before child object callbacks
|
22
|
+
Declarations: allow overriding/modification of individual traits in child factories
|
23
|
+
Callbacks refactored to not be attributes
|
24
|
+
Updating documentation for formatting and clarity (incl. new specificity for cucumber)
|
25
|
+
|
1
26
|
2.1.0 (September 02, 2011)
|
2
27
|
Bugfix: created_at now defined for stubbed models
|
3
28
|
Gemspec updated for use with Rails 3.1
|
data/GETTING_STARTED.md
CHANGED
@@ -69,7 +69,12 @@ factory\_girl supports several different build strategies: build, create, attrib
|
|
69
69
|
attrs = FactoryGirl.attributes_for(:user)
|
70
70
|
|
71
71
|
# Returns an object with all defined attributes stubbed out
|
72
|
-
stub = FactoryGirl.build_stubbed(:user
|
72
|
+
stub = FactoryGirl.build_stubbed(:user
|
73
|
+
|
74
|
+
# Passing a block to any of the methods above will yield the return object
|
75
|
+
FactoryGirl.create(:user) do |user|
|
76
|
+
user.posts.create(attributes_for(:post))
|
77
|
+
end
|
73
78
|
|
74
79
|
No matter which strategy is used, it's possible to override the defined attributes by passing a hash:
|
75
80
|
|
@@ -159,8 +164,10 @@ Transient Attributes
|
|
159
164
|
There may be times where your code can be DRYed up by passing in transient attributes to factories.
|
160
165
|
|
161
166
|
factory :user do
|
162
|
-
|
163
|
-
|
167
|
+
ignore do
|
168
|
+
rockstar true
|
169
|
+
upcased { false }
|
170
|
+
end
|
164
171
|
|
165
172
|
name { "John Doe#{" - Rockstar" if rockstar}" }
|
166
173
|
email { "#{name.downcase}@example.com" }
|
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -10,7 +10,7 @@ Documentation
|
|
10
10
|
|
11
11
|
You should find the documentation for your version of factory_girl on [Rubygems](http://rubygems.org/gems/factory_girl).
|
12
12
|
|
13
|
-
See
|
13
|
+
See {file:GETTING_STARTED.md} for information on defining and using factories.
|
14
14
|
|
15
15
|
Install
|
16
16
|
--------
|
data/gemfiles/2.1.gemfile.lock
CHANGED
data/gemfiles/2.3.gemfile.lock
CHANGED
data/gemfiles/3.0.gemfile.lock
CHANGED
data/gemfiles/3.1.gemfile.lock
CHANGED
data/lib/factory_girl.rb
CHANGED
@@ -34,6 +34,15 @@ if defined?(Rails) && Rails::VERSION::MAJOR == 2
|
|
34
34
|
end
|
35
35
|
|
36
36
|
module FactoryGirl
|
37
|
+
# Raised when a factory is defined that attempts to instantiate itself.
|
38
|
+
class AssociationDefinitionError < RuntimeError; end
|
39
|
+
|
40
|
+
# Raised when a callback is defined that has an invalid name
|
41
|
+
class InvalidCallbackNameError < RuntimeError; end
|
42
|
+
|
43
|
+
# Raised when a factory is defined with the same name as a previously-defined factory.
|
44
|
+
class DuplicateDefinitionError < RuntimeError; end
|
45
|
+
|
37
46
|
def self.factories
|
38
47
|
@factories ||= Registry.new
|
39
48
|
end
|
@@ -12,16 +12,12 @@ module FactoryGirl
|
|
12
12
|
|
13
13
|
attr_reader :name, :ignored
|
14
14
|
|
15
|
-
def initialize(name)
|
15
|
+
def initialize(name, ignored)
|
16
16
|
@name = name.to_sym
|
17
|
-
@ignored =
|
17
|
+
@ignored = ignored
|
18
18
|
ensure_non_attribute_writer!
|
19
19
|
end
|
20
20
|
|
21
|
-
def ignore
|
22
|
-
@ignored = true
|
23
|
-
end
|
24
|
-
|
25
21
|
def add_to(proxy)
|
26
22
|
end
|
27
23
|
|
@@ -1,8 +1,8 @@
|
|
1
1
|
module FactoryGirl
|
2
2
|
class Attribute #:nodoc:
|
3
3
|
class Dynamic < Attribute #:nodoc:
|
4
|
-
def initialize(name, block)
|
5
|
-
super(name)
|
4
|
+
def initialize(name, ignored, block)
|
5
|
+
super(name, ignored)
|
6
6
|
@block = block
|
7
7
|
end
|
8
8
|
|
@@ -11,7 +11,12 @@ module FactoryGirl
|
|
11
11
|
if FactoryGirl::Sequence === value
|
12
12
|
raise SequenceAbuseError
|
13
13
|
end
|
14
|
-
|
14
|
+
|
15
|
+
if @ignored
|
16
|
+
proxy.set_ignored(name, value)
|
17
|
+
else
|
18
|
+
proxy.set(name, value)
|
19
|
+
end
|
15
20
|
end
|
16
21
|
end
|
17
22
|
end
|
@@ -2,13 +2,18 @@ module FactoryGirl
|
|
2
2
|
class Attribute
|
3
3
|
|
4
4
|
class Sequence < Attribute
|
5
|
-
def initialize(name, sequence)
|
6
|
-
super(name)
|
5
|
+
def initialize(name, sequence, ignored)
|
6
|
+
super(name, ignored)
|
7
7
|
@sequence = sequence
|
8
8
|
end
|
9
9
|
|
10
10
|
def add_to(proxy)
|
11
|
-
|
11
|
+
value = FactoryGirl.generate(@sequence)
|
12
|
+
if @ignored
|
13
|
+
proxy.set_ignored(name, value)
|
14
|
+
else
|
15
|
+
proxy.set(name, value)
|
16
|
+
end
|
12
17
|
end
|
13
18
|
end
|
14
19
|
|
@@ -5,13 +5,17 @@ module FactoryGirl
|
|
5
5
|
|
6
6
|
attr_reader :value
|
7
7
|
|
8
|
-
def initialize(name, value)
|
9
|
-
super(name)
|
8
|
+
def initialize(name, value, ignored)
|
9
|
+
super(name, ignored)
|
10
10
|
@value = value
|
11
11
|
end
|
12
12
|
|
13
13
|
def add_to(proxy)
|
14
|
-
|
14
|
+
if @ignored
|
15
|
+
proxy.set_ignored(name, @value)
|
16
|
+
else
|
17
|
+
proxy.set(name, @value)
|
18
|
+
end
|
15
19
|
end
|
16
20
|
|
17
21
|
def priority
|
@@ -13,6 +13,7 @@ module FactoryGirl
|
|
13
13
|
|
14
14
|
def declare_attribute(declaration)
|
15
15
|
@declarations << declaration
|
16
|
+
declaration
|
16
17
|
end
|
17
18
|
|
18
19
|
def define_attribute(attribute)
|
@@ -31,10 +32,6 @@ module FactoryGirl
|
|
31
32
|
flattened_attributes.each(&block)
|
32
33
|
end
|
33
34
|
|
34
|
-
def attribute_defined?(attribute_name)
|
35
|
-
!!find_attribute(attribute_name)
|
36
|
-
end
|
37
|
-
|
38
35
|
def apply_attributes(attributes_to_apply)
|
39
36
|
attributes_to_apply.callbacks.reverse.each { |callback| prepend_callback(callback) }
|
40
37
|
new_attributes = []
|
@@ -93,6 +90,10 @@ module FactoryGirl
|
|
93
90
|
end.flatten
|
94
91
|
end
|
95
92
|
|
93
|
+
def attribute_defined?(attribute_name)
|
94
|
+
!!find_attribute(attribute_name)
|
95
|
+
end
|
96
|
+
|
96
97
|
def find_attribute(attribute_name)
|
97
98
|
@attributes.values.flatten.detect do |attribute|
|
98
99
|
attribute.name == attribute_name
|
@@ -2,18 +2,18 @@ module FactoryGirl
|
|
2
2
|
class Declaration
|
3
3
|
attr_reader :name
|
4
4
|
|
5
|
-
def initialize(name)
|
6
|
-
@name
|
5
|
+
def initialize(name, ignored = false)
|
6
|
+
@name = name
|
7
|
+
@ignored = ignored
|
7
8
|
end
|
8
9
|
|
9
10
|
def ignore
|
11
|
+
$stderr.puts "DEPRECATION WARNING: Use ignore block syntax instead of calling #ignore"
|
10
12
|
@ignored = true
|
11
13
|
end
|
12
14
|
|
13
15
|
def to_attributes
|
14
|
-
build
|
15
|
-
attributes.each(&:ignore) if @ignored
|
16
|
-
end
|
16
|
+
build
|
17
17
|
end
|
18
18
|
end
|
19
19
|
end
|
@@ -1,15 +1,15 @@
|
|
1
1
|
module FactoryGirl
|
2
2
|
class Declaration
|
3
3
|
class Dynamic < Declaration
|
4
|
-
def initialize(name, block)
|
5
|
-
super(name)
|
4
|
+
def initialize(name, ignored = false, block = nil)
|
5
|
+
super(name, ignored)
|
6
6
|
@block = block
|
7
7
|
end
|
8
8
|
|
9
9
|
private
|
10
10
|
|
11
11
|
def build
|
12
|
-
[Attribute::Dynamic.new(name, @block)]
|
12
|
+
[Attribute::Dynamic.new(name, @ignored, @block)]
|
13
13
|
end
|
14
14
|
end
|
15
15
|
end
|
@@ -1,8 +1,8 @@
|
|
1
1
|
module FactoryGirl
|
2
2
|
class Declaration
|
3
3
|
class Implicit < Declaration
|
4
|
-
def initialize(name, factory = nil)
|
5
|
-
super(name)
|
4
|
+
def initialize(name, factory = nil, ignored = false)
|
5
|
+
super(name, ignored)
|
6
6
|
@factory = factory
|
7
7
|
end
|
8
8
|
|
@@ -12,7 +12,7 @@ module FactoryGirl
|
|
12
12
|
if FactoryGirl.factories.registered?(name)
|
13
13
|
[Attribute::Association.new(name, name, {})]
|
14
14
|
elsif FactoryGirl.sequences.registered?(name)
|
15
|
-
[Attribute::Sequence.new(name, name)]
|
15
|
+
[Attribute::Sequence.new(name, name, @ignored)]
|
16
16
|
else
|
17
17
|
trait_root = @factory || FactoryGirl
|
18
18
|
trait_root.trait_by_name(name).attributes.to_a
|
@@ -1,15 +1,15 @@
|
|
1
1
|
module FactoryGirl
|
2
2
|
class Declaration
|
3
3
|
class Static < Declaration
|
4
|
-
def initialize(name, value)
|
5
|
-
super(name)
|
4
|
+
def initialize(name, value, ignored = false)
|
5
|
+
super(name, ignored)
|
6
6
|
@value = value
|
7
7
|
end
|
8
8
|
|
9
9
|
private
|
10
10
|
|
11
11
|
def build
|
12
|
-
[Attribute::Static.new(name, @value)]
|
12
|
+
[Attribute::Static.new(name, @value, @ignored)]
|
13
13
|
end
|
14
14
|
end
|
15
15
|
end
|
@@ -8,8 +8,9 @@ module FactoryGirl
|
|
8
8
|
|
9
9
|
attr_reader :child_factories
|
10
10
|
|
11
|
-
def initialize(factory)
|
12
|
-
@factory
|
11
|
+
def initialize(factory, ignore = false)
|
12
|
+
@factory = factory
|
13
|
+
@ignore = ignore
|
13
14
|
@child_factories = []
|
14
15
|
end
|
15
16
|
|
@@ -32,18 +33,20 @@ module FactoryGirl
|
|
32
33
|
# * value: +Object+
|
33
34
|
# If no block is given, this value will be used for this attribute.
|
34
35
|
def add_attribute(name, value = nil, &block)
|
35
|
-
if block_given?
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
declaration = Declaration::Dynamic.new(name, block)
|
40
|
-
end
|
36
|
+
raise AttributeDefinitionError, "Both value and block given" if value && block_given?
|
37
|
+
|
38
|
+
declaration = if block_given?
|
39
|
+
Declaration::Dynamic.new(name, @ignore, block)
|
41
40
|
else
|
42
|
-
|
41
|
+
Declaration::Static.new(name, value, @ignore)
|
43
42
|
end
|
44
43
|
|
45
44
|
@factory.declare_attribute(declaration)
|
46
|
-
|
45
|
+
end
|
46
|
+
|
47
|
+
def ignore(&block)
|
48
|
+
proxy = DefinitionProxy.new(@factory, true)
|
49
|
+
proxy.instance_eval(&block)
|
47
50
|
end
|
48
51
|
|
49
52
|
# Calls add_attribute using the missing method name as the name of the
|
@@ -79,7 +82,7 @@ module FactoryGirl
|
|
79
82
|
# are equivalent.
|
80
83
|
def method_missing(name, *args, &block)
|
81
84
|
if args.empty? && block.nil?
|
82
|
-
@factory.declare_attribute(Declaration::Implicit.new(name, @factory))
|
85
|
+
@factory.declare_attribute(Declaration::Implicit.new(name, @factory, @ignore))
|
83
86
|
elsif args.first.is_a?(Hash) && args.first.has_key?(:factory)
|
84
87
|
association(name, *args)
|
85
88
|
else
|
data/lib/factory_girl/factory.rb
CHANGED
@@ -2,28 +2,25 @@ require "active_support/core_ext/hash/keys"
|
|
2
2
|
require "active_support/inflector"
|
3
3
|
|
4
4
|
module FactoryGirl
|
5
|
-
# Raised when a factory is defined that attempts to instantiate itself.
|
6
|
-
class AssociationDefinitionError < RuntimeError
|
7
|
-
end
|
8
|
-
|
9
|
-
# Raised when a callback is defined that has an invalid name
|
10
|
-
class InvalidCallbackNameError < RuntimeError
|
11
|
-
end
|
12
|
-
|
13
|
-
# Raised when a factory is defined with the same name as a previously-defined factory.
|
14
|
-
class DuplicateDefinitionError < RuntimeError
|
15
|
-
end
|
16
|
-
|
17
5
|
class Factory
|
18
6
|
attr_reader :name #:nodoc:
|
19
7
|
|
20
|
-
def
|
21
|
-
|
22
|
-
name
|
8
|
+
def initialize(name, options = {}) #:nodoc:
|
9
|
+
assert_valid_options(options)
|
10
|
+
@name = name.to_s.underscore.to_sym
|
11
|
+
@parent = options[:parent]
|
12
|
+
@aliases = options[:aliases] || []
|
13
|
+
@traits = options[:traits] || []
|
14
|
+
@class_name = options[:class]
|
15
|
+
@default_strategy = options[:default_strategy]
|
16
|
+
@defined_traits = []
|
17
|
+
@attribute_list = AttributeList.new
|
18
|
+
@compiled = false
|
23
19
|
end
|
24
20
|
|
25
|
-
def
|
26
|
-
|
21
|
+
def factory_name
|
22
|
+
$stderr.puts "DEPRECATION WARNING: factory.factory_name is deprecated; use factory.name instead."
|
23
|
+
name
|
27
24
|
end
|
28
25
|
|
29
26
|
def build_class #:nodoc:
|
@@ -31,23 +28,11 @@ module FactoryGirl
|
|
31
28
|
end
|
32
29
|
|
33
30
|
def default_strategy #:nodoc:
|
34
|
-
@
|
35
|
-
end
|
36
|
-
|
37
|
-
def initialize(name, options = {}) #:nodoc:
|
38
|
-
assert_valid_options(options)
|
39
|
-
@name = name.to_s.underscore.to_sym
|
40
|
-
@parent = options[:parent]
|
41
|
-
@parent_factory = nil
|
42
|
-
@options = options
|
43
|
-
@defined_traits = []
|
44
|
-
@traits = []
|
45
|
-
@children = []
|
46
|
-
@attribute_list = AttributeList.new
|
47
|
-
@compiled = false
|
31
|
+
@default_strategy || (parent && parent.default_strategy) || :create
|
48
32
|
end
|
49
33
|
|
50
34
|
def allow_overrides
|
35
|
+
@compiled = false
|
51
36
|
@attribute_list.overridable
|
52
37
|
self
|
53
38
|
end
|
@@ -56,24 +41,6 @@ module FactoryGirl
|
|
56
41
|
@attribute_list.overridable?
|
57
42
|
end
|
58
43
|
|
59
|
-
def inherit_factory(parent) #:nodoc:
|
60
|
-
@options[:class] ||= parent.class_name
|
61
|
-
@options[:default_strategy] ||= parent.default_strategy
|
62
|
-
|
63
|
-
allow_overrides if parent.allow_overrides?
|
64
|
-
parent.add_child(self)
|
65
|
-
|
66
|
-
@parent_factory = parent
|
67
|
-
end
|
68
|
-
|
69
|
-
def add_child(factory)
|
70
|
-
@children << factory unless @children.include?(factory)
|
71
|
-
end
|
72
|
-
|
73
|
-
def inherit_traits(traits)
|
74
|
-
@traits = traits
|
75
|
-
end
|
76
|
-
|
77
44
|
def define_trait(trait)
|
78
45
|
@defined_traits << trait
|
79
46
|
end
|
@@ -82,19 +49,8 @@ module FactoryGirl
|
|
82
49
|
@attribute_list.add_callback(Callback.new(name, block))
|
83
50
|
end
|
84
51
|
|
85
|
-
def
|
52
|
+
def run(proxy_class, overrides, &block) #:nodoc:
|
86
53
|
ensure_compiled
|
87
|
-
AttributeList.new.tap do |list|
|
88
|
-
@traits.reverse.map { |name| trait_by_name(name) }.each do |trait|
|
89
|
-
list.apply_attributes(trait.attributes)
|
90
|
-
end
|
91
|
-
|
92
|
-
list.apply_attributes(@attribute_list)
|
93
|
-
list.apply_attributes(@parent_factory.attributes) if @parent_factory
|
94
|
-
end
|
95
|
-
end
|
96
|
-
|
97
|
-
def run(proxy_class, overrides) #:nodoc:
|
98
54
|
proxy = proxy_class.new(build_class)
|
99
55
|
callbacks.each { |callback| proxy.add_callback(callback) }
|
100
56
|
overrides = overrides.symbolize_keys
|
@@ -104,11 +60,21 @@ module FactoryGirl
|
|
104
60
|
if factory_overrides.empty?
|
105
61
|
attribute.add_to(proxy)
|
106
62
|
else
|
107
|
-
factory_overrides.each
|
63
|
+
factory_overrides.each do |attr, val|
|
64
|
+
if attribute.ignored
|
65
|
+
proxy.set_ignored(attr, val)
|
66
|
+
else
|
67
|
+
proxy.set(attr, val)
|
68
|
+
end
|
69
|
+
|
70
|
+
overrides.delete(attr)
|
71
|
+
end
|
108
72
|
end
|
109
73
|
end
|
110
74
|
overrides.each { |attr, val| proxy.set(attr, val) }
|
111
|
-
proxy.result(@to_create_block)
|
75
|
+
result = proxy.result(@to_create_block)
|
76
|
+
|
77
|
+
block ? block.call(result) : result
|
112
78
|
end
|
113
79
|
|
114
80
|
def human_names
|
@@ -122,8 +88,8 @@ module FactoryGirl
|
|
122
88
|
def trait_by_name(name)
|
123
89
|
if existing_attribute = trait_for(name)
|
124
90
|
existing_attribute
|
125
|
-
elsif
|
126
|
-
|
91
|
+
elsif parent
|
92
|
+
parent.trait_by_name(name)
|
127
93
|
else
|
128
94
|
FactoryGirl.trait_by_name(name)
|
129
95
|
end
|
@@ -155,47 +121,72 @@ module FactoryGirl
|
|
155
121
|
# FactoryGirl.create(:post).author.class
|
156
122
|
# # => User
|
157
123
|
def names
|
158
|
-
[name] +
|
124
|
+
[name] + @aliases
|
159
125
|
end
|
160
126
|
|
161
127
|
def to_create(&block)
|
162
128
|
@to_create_block = block
|
163
129
|
end
|
164
130
|
|
131
|
+
def ensure_compiled
|
132
|
+
compile unless @compiled
|
133
|
+
end
|
134
|
+
|
135
|
+
def declare_attribute(declaration)
|
136
|
+
@attribute_list.declare_attribute(declaration)
|
137
|
+
end
|
138
|
+
|
139
|
+
protected
|
140
|
+
|
141
|
+
def class_name #:nodoc:
|
142
|
+
@class_name || (parent && parent.class_name) || name
|
143
|
+
end
|
144
|
+
|
145
|
+
def attributes
|
146
|
+
ensure_compiled
|
147
|
+
AttributeList.new.tap do |list|
|
148
|
+
@traits.reverse.map { |name| trait_by_name(name) }.each do |trait|
|
149
|
+
list.apply_attributes(trait.attributes)
|
150
|
+
end
|
151
|
+
|
152
|
+
list.apply_attributes(@attribute_list)
|
153
|
+
list.apply_attributes(parent.attributes) if parent
|
154
|
+
end
|
155
|
+
end
|
156
|
+
|
157
|
+
private
|
158
|
+
|
165
159
|
def callbacks
|
166
160
|
attributes.callbacks
|
167
161
|
end
|
168
162
|
|
169
163
|
def compile
|
164
|
+
inherit_factory(parent) if parent
|
165
|
+
|
170
166
|
declarations.each do |declaration|
|
171
167
|
declaration.to_attributes.each do |attribute|
|
172
168
|
define_attribute(attribute)
|
173
169
|
end
|
174
170
|
end
|
171
|
+
|
175
172
|
@compiled = true
|
176
173
|
end
|
177
174
|
|
178
|
-
def
|
179
|
-
|
175
|
+
def inherit_factory(parent) #:nodoc:
|
176
|
+
parent.ensure_compiled
|
177
|
+
allow_overrides if parent.allow_overrides?
|
180
178
|
end
|
181
179
|
|
182
|
-
private
|
183
|
-
|
184
180
|
def declarations
|
185
181
|
@attribute_list.declarations
|
186
182
|
end
|
187
183
|
|
188
|
-
def update_children
|
189
|
-
@children.each { |child| child.inherit_factory(self) }
|
190
|
-
end
|
191
|
-
|
192
184
|
def define_attribute(attribute)
|
193
185
|
if attribute.respond_to?(:factory) && attribute.factory == self.name
|
194
186
|
raise AssociationDefinitionError, "Self-referencing association '#{attribute.name}' in factory '#{self.name}'"
|
195
187
|
end
|
196
188
|
|
197
189
|
@attribute_list.define_attribute(attribute)
|
198
|
-
update_children if allow_overrides?
|
199
190
|
end
|
200
191
|
|
201
192
|
def assert_valid_options(options)
|
@@ -203,8 +194,8 @@ module FactoryGirl
|
|
203
194
|
|
204
195
|
if options[:default_strategy]
|
205
196
|
assert_valid_strategy(options[:default_strategy])
|
206
|
-
puts "WARNING: default_strategy is deprecated."
|
207
|
-
puts "Override to_create if you need to prevent a call to #save!."
|
197
|
+
$stderr.puts "DEPRECATION WARNING: default_strategy is deprecated."
|
198
|
+
$stderr.puts "Override to_create if you need to prevent a call to #save!."
|
208
199
|
end
|
209
200
|
end
|
210
201
|
|
@@ -218,8 +209,9 @@ module FactoryGirl
|
|
218
209
|
@defined_traits.detect {|trait| trait.name == name }
|
219
210
|
end
|
220
211
|
|
221
|
-
def
|
222
|
-
|
212
|
+
def parent
|
213
|
+
return unless @parent
|
214
|
+
FactoryGirl.factory_by_name(@parent)
|
223
215
|
end
|
224
216
|
end
|
225
217
|
end
|