factory_girl_kibiz0r 2.0.0.beta2

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.
Files changed (83) hide show
  1. data/Appraisals +12 -0
  2. data/CONTRIBUTION_GUIDELINES.md +9 -0
  3. data/Changelog +29 -0
  4. data/GETTING_STARTED.md +246 -0
  5. data/Gemfile +12 -0
  6. data/Gemfile.lock +62 -0
  7. data/LICENSE +19 -0
  8. data/README.md +64 -0
  9. data/Rakefile +54 -0
  10. data/features/factory_girl_steps.feature +151 -0
  11. data/features/step_definitions/database_steps.rb +20 -0
  12. data/features/support/env.rb +6 -0
  13. data/features/support/factories.rb +84 -0
  14. data/lib/factory_girl/aliases.rb +21 -0
  15. data/lib/factory_girl/attribute/association.rb +24 -0
  16. data/lib/factory_girl/attribute/callback.rb +16 -0
  17. data/lib/factory_girl/attribute/dynamic.rb +21 -0
  18. data/lib/factory_girl/attribute/implicit.rb +36 -0
  19. data/lib/factory_girl/attribute/list.rb +19 -0
  20. data/lib/factory_girl/attribute/sequence.rb +16 -0
  21. data/lib/factory_girl/attribute/static.rb +18 -0
  22. data/lib/factory_girl/attribute.rb +42 -0
  23. data/lib/factory_girl/definition_proxy.rb +147 -0
  24. data/lib/factory_girl/deprecated.rb +18 -0
  25. data/lib/factory_girl/factory.rb +196 -0
  26. data/lib/factory_girl/find_definitions.rb +23 -0
  27. data/lib/factory_girl/proxy/attributes_for.rb +21 -0
  28. data/lib/factory_girl/proxy/build.rb +36 -0
  29. data/lib/factory_girl/proxy/create.rb +16 -0
  30. data/lib/factory_girl/proxy/stub.rb +64 -0
  31. data/lib/factory_girl/proxy.rb +87 -0
  32. data/lib/factory_girl/rails2.rb +1 -0
  33. data/lib/factory_girl/registry.rb +45 -0
  34. data/lib/factory_girl/sequence.rb +31 -0
  35. data/lib/factory_girl/step_definitions.rb +60 -0
  36. data/lib/factory_girl/syntax/blueprint.rb +42 -0
  37. data/lib/factory_girl/syntax/default.rb +33 -0
  38. data/lib/factory_girl/syntax/generate.rb +73 -0
  39. data/lib/factory_girl/syntax/make.rb +41 -0
  40. data/lib/factory_girl/syntax/methods.rb +86 -0
  41. data/lib/factory_girl/syntax/sham.rb +45 -0
  42. data/lib/factory_girl/syntax/vintage.rb +152 -0
  43. data/lib/factory_girl/syntax.rb +12 -0
  44. data/lib/factory_girl/version.rb +4 -0
  45. data/lib/factory_girl.rb +54 -0
  46. data/spec/acceptance/acceptance_helper.rb +11 -0
  47. data/spec/acceptance/attribute_aliases_spec.rb +26 -0
  48. data/spec/acceptance/attributes_for_spec.rb +48 -0
  49. data/spec/acceptance/build_spec.rb +35 -0
  50. data/spec/acceptance/build_stubbed_spec.rb +79 -0
  51. data/spec/acceptance/callbacks_spec.rb +53 -0
  52. data/spec/acceptance/create_spec.rb +67 -0
  53. data/spec/acceptance/default_strategy_spec.rb +27 -0
  54. data/spec/acceptance/definition_spec.rb +28 -0
  55. data/spec/acceptance/parent_spec.rb +39 -0
  56. data/spec/acceptance/sequence_spec.rb +34 -0
  57. data/spec/acceptance/syntax/blueprint_spec.rb +32 -0
  58. data/spec/acceptance/syntax/generate_spec.rb +60 -0
  59. data/spec/acceptance/syntax/make_spec.rb +35 -0
  60. data/spec/acceptance/syntax/sham_spec.rb +44 -0
  61. data/spec/acceptance/syntax/vintage_spec.rb +224 -0
  62. data/spec/factory_girl/aliases_spec.rb +33 -0
  63. data/spec/factory_girl/attribute/association_spec.rb +33 -0
  64. data/spec/factory_girl/attribute/callback_spec.rb +23 -0
  65. data/spec/factory_girl/attribute/dynamic_spec.rb +60 -0
  66. data/spec/factory_girl/attribute/implicit_spec.rb +50 -0
  67. data/spec/factory_girl/attribute/sequence_spec.rb +21 -0
  68. data/spec/factory_girl/attribute/static_spec.rb +29 -0
  69. data/spec/factory_girl/attribute_spec.rb +39 -0
  70. data/spec/factory_girl/definition_proxy_spec.rb +129 -0
  71. data/spec/factory_girl/deprecated_spec.rb +66 -0
  72. data/spec/factory_girl/factory_spec.rb +374 -0
  73. data/spec/factory_girl/find_definitions_spec.rb +100 -0
  74. data/spec/factory_girl/proxy/attributes_for_spec.rb +52 -0
  75. data/spec/factory_girl/proxy/build_spec.rb +86 -0
  76. data/spec/factory_girl/proxy/create_spec.rb +107 -0
  77. data/spec/factory_girl/proxy/stub_spec.rb +80 -0
  78. data/spec/factory_girl/proxy_spec.rb +102 -0
  79. data/spec/factory_girl/registry_spec.rb +83 -0
  80. data/spec/factory_girl/sequence_spec.rb +96 -0
  81. data/spec/factory_girl_spec.rb +17 -0
  82. data/spec/spec_helper.rb +93 -0
  83. metadata +294 -0
@@ -0,0 +1,21 @@
1
+ module FactoryGirl
2
+ class Proxy #:nodoc:
3
+ class AttributesFor < Proxy #:nodoc:
4
+ def initialize(klass)
5
+ @hash = {}
6
+ end
7
+
8
+ def get(attribute)
9
+ @hash[attribute]
10
+ end
11
+
12
+ def set(attribute, value)
13
+ @hash[attribute] = value
14
+ end
15
+
16
+ def result(to_create)
17
+ @hash
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,36 @@
1
+ module FactoryGirl
2
+ class Proxy #:nodoc:
3
+ class Build < Proxy #:nodoc:
4
+ def initialize(klass)
5
+ @instance = klass.new
6
+ end
7
+
8
+ def get(attribute)
9
+ if @instance.respond_to?(attribute)
10
+ @instance.send(attribute)
11
+ else
12
+ super
13
+ end
14
+ end
15
+
16
+ def set(attribute, value)
17
+ @instance.send(:"#{attribute}=", value)
18
+ end
19
+
20
+ def associate(name, factory_name, overrides)
21
+ factory = FactoryGirl.factory_by_name(factory_name)
22
+ set(name, factory.run(Proxy::Create, overrides))
23
+ end
24
+
25
+ def association(factory_name, overrides = {})
26
+ factory = FactoryGirl.factory_by_name(factory_name)
27
+ factory.run(Proxy::Create, overrides)
28
+ end
29
+
30
+ def result(to_create)
31
+ run_callbacks(:after_build)
32
+ @instance
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,16 @@
1
+ module FactoryGirl
2
+ class Proxy #:nodoc:
3
+ class Create < Build #:nodoc:
4
+ def result(to_create)
5
+ run_callbacks(:after_build)
6
+ if to_create
7
+ to_create.call(@instance)
8
+ else
9
+ @instance.save!
10
+ end
11
+ run_callbacks(:after_create)
12
+ @instance
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,64 @@
1
+ module FactoryGirl
2
+ class Proxy
3
+ class Stub < Proxy #:nodoc:
4
+ @@next_id = 1000
5
+
6
+ def initialize(klass)
7
+ @instance = klass.new
8
+ @instance.id = next_id
9
+ @instance.instance_eval do
10
+ def new_record?
11
+ id.nil?
12
+ end
13
+
14
+ def save(*args)
15
+ raise "stubbed models are not allowed to access the database"
16
+ end
17
+
18
+ def destroy(*args)
19
+ raise "stubbed models are not allowed to access the database"
20
+ end
21
+
22
+ def connection
23
+ raise "stubbed models are not allowed to access the database"
24
+ end
25
+
26
+ def reload
27
+ raise "stubbed models are not allowed to access the database"
28
+ end
29
+
30
+ def update_attribute(*args)
31
+ raise "stubbed models are not allowed to access the database"
32
+ end
33
+ end
34
+ end
35
+
36
+ def next_id
37
+ @@next_id += 1
38
+ end
39
+
40
+ def get(attribute)
41
+ @instance.send(attribute)
42
+ end
43
+
44
+ def set(attribute, value)
45
+ @instance.send(:"#{attribute}=", value)
46
+ end
47
+
48
+ def associate(name, factory_name, overrides)
49
+ factory = FactoryGirl.factory_by_name(factory_name)
50
+ set(name, factory.run(Proxy::Stub, overrides))
51
+ end
52
+
53
+ def association(factory_name, overrides = {})
54
+ factory = FactoryGirl.factory_by_name(factory_name)
55
+ factory.run(Proxy::Stub, overrides)
56
+ end
57
+
58
+ def result(to_create)
59
+ run_callbacks(:after_stub)
60
+ @instance
61
+ end
62
+ end
63
+ end
64
+ end
@@ -0,0 +1,87 @@
1
+ module FactoryGirl
2
+ class Proxy #:nodoc:
3
+
4
+ attr_reader :callbacks
5
+
6
+ def initialize(klass)
7
+ end
8
+
9
+ def get(attribute)
10
+ @ignored && @ignored[attribute]
11
+ end
12
+
13
+ def set(attribute, value)
14
+ end
15
+
16
+ def ignore(attribute, value)
17
+ @ignored = {}
18
+ @ignored[attribute] = value
19
+ end
20
+
21
+ def associate(name, factory, attributes)
22
+ end
23
+
24
+ def add_callback(name, block)
25
+ @callbacks ||= {}
26
+ @callbacks[name] ||= []
27
+ @callbacks[name] << block
28
+ end
29
+
30
+ def run_callbacks(name)
31
+ if @callbacks && @callbacks[name]
32
+ @callbacks[name].each do |block|
33
+ case block.arity
34
+ when 0 then block.call
35
+ when 2 then block.call(@instance, self)
36
+ else
37
+ block.call(@instance)
38
+ end
39
+ end
40
+ end
41
+ end
42
+
43
+ # Generates an association using the current build strategy.
44
+ #
45
+ # Arguments:
46
+ # name: (Symbol)
47
+ # The name of the factory that should be used to generate this
48
+ # association.
49
+ # attributes: (Hash)
50
+ # A hash of attributes that should be overridden for this association.
51
+ #
52
+ # Returns:
53
+ # The generated association for the current build strategy. Note that
54
+ # associations are not generated for the attributes_for strategy. Returns
55
+ # nil in this case.
56
+ #
57
+ # Example:
58
+ #
59
+ # factory :user do
60
+ # # ...
61
+ # end
62
+ #
63
+ # factory :post do
64
+ # # ...
65
+ # author { |post| post.association(:user, :name => 'Joe') }
66
+ # end
67
+ #
68
+ # # Builds (but doesn't save) a Post and a User
69
+ # FactoryGirl.build(:post)
70
+ #
71
+ # # Builds and saves a User, builds a Post, assigns the User to the
72
+ # # author association, and saves the User.
73
+ # FactoryGirl.create(:post)
74
+ #
75
+ def association(name, overrides = {})
76
+ nil
77
+ end
78
+
79
+ def method_missing(method, *args, &block)
80
+ get(method)
81
+ end
82
+
83
+ def result(to_create)
84
+ raise NotImplementedError, "Strategies must return a result"
85
+ end
86
+ end
87
+ end
@@ -0,0 +1 @@
1
+ Rails.configuration.after_initialize { FactoryGirl.find_definitions }
@@ -0,0 +1,45 @@
1
+ module FactoryGirl
2
+ class Registry
3
+ include Enumerable
4
+
5
+ def initialize
6
+ @items = {}
7
+ end
8
+
9
+ def add(item)
10
+ item.names.each { |name| add_as(name, item) }
11
+ item
12
+ end
13
+
14
+ def find(name)
15
+ @items[name.to_sym] or raise ArgumentError.new("Not registered: #{name.to_s}")
16
+ end
17
+
18
+ def each(&block)
19
+ @items.values.each(&block)
20
+ end
21
+
22
+ def [](name)
23
+ find(name)
24
+ end
25
+
26
+ def registered?(name)
27
+ @items.key?(name.to_sym)
28
+ end
29
+
30
+ def clear
31
+ @items.clear
32
+ end
33
+
34
+ private
35
+
36
+ def add_as(name, item)
37
+ if registered?(name)
38
+ raise DuplicateDefinitionError, "Already defined: #{name}"
39
+ else
40
+ @items[name.to_sym] = item
41
+ end
42
+ end
43
+ end
44
+ end
45
+
@@ -0,0 +1,31 @@
1
+ module FactoryGirl
2
+
3
+ # Raised when calling Factory.sequence from a dynamic attribute block
4
+ class SequenceAbuseError < StandardError; end
5
+
6
+ # Sequences are defined using sequence within a FactoryGirl.define block.
7
+ # Sequence values are generated using next.
8
+ class Sequence
9
+ attr_reader :name
10
+
11
+ def initialize(name, value = 1, &proc) #:nodoc:
12
+ @name = name
13
+ @proc = proc
14
+ @value = value || 1
15
+ end
16
+
17
+ def next
18
+ @proc ? @proc.call(@value) : @value
19
+ ensure
20
+ @value = @value.next
21
+ end
22
+
23
+ def default_strategy
24
+ :create
25
+ end
26
+
27
+ def names
28
+ [@name]
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,60 @@
1
+ module FactoryGirlStepHelpers
2
+
3
+ def convert_association_string_to_instance(factory_name, assignment)
4
+ attribute, value = assignment.split(':', 2)
5
+ return if value.blank?
6
+ factory = FactoryGirl.factory_by_name(factory_name)
7
+ attributes = convert_human_hash_to_attribute_hash({attribute => value.strip}, factory.associations)
8
+ attributes_find = {}
9
+ attributes.each do |k, v|
10
+ k = "#{k}_id" if v.is_a? ActiveRecord::Base
11
+ attributes_find[k] = v
12
+ end
13
+ model_class = factory.build_class
14
+ model_class.find(:first, :conditions => attributes_find) or
15
+ FactoryGirl.create(factory_name, attributes)
16
+ end
17
+
18
+ def convert_human_hash_to_attribute_hash(human_hash, associations = [])
19
+ human_hash.inject({}) do |attribute_hash, (human_key, value)|
20
+ key = human_key.downcase.gsub(' ', '_').to_sym
21
+ if association = associations.detect {|association| association.name == key }
22
+ value = convert_association_string_to_instance(association.factory, value)
23
+ end
24
+ attribute_hash.merge(key => value)
25
+ end
26
+ end
27
+ end
28
+
29
+ World(FactoryGirlStepHelpers)
30
+
31
+ FactoryGirl.factories.each do |factory|
32
+ Given /^the following (?:#{factory.human_name}|#{factory.human_name.pluralize}) exists?:$/ do |table|
33
+ table.hashes.each do |human_hash|
34
+ attributes = convert_human_hash_to_attribute_hash(human_hash, factory.associations)
35
+ factory.run(FactoryGirl::Proxy::Create, attributes)
36
+ end
37
+ end
38
+
39
+ Given /^an? #{factory.human_name} exists$/ do
40
+ FactoryGirl.create(factory.name)
41
+ end
42
+
43
+ Given /^(\d+) #{factory.human_name.pluralize} exist$/ do |count|
44
+ count.to_i.times { FactoryGirl.create(factory.name) }
45
+ end
46
+
47
+ if factory.build_class.respond_to?(:columns)
48
+ factory.build_class.columns.each do |column|
49
+ human_column_name = column.name.downcase.gsub('_', ' ')
50
+ Given /^an? #{factory.human_name} exists with an? #{human_column_name} of "([^"]*)"$/i do |value|
51
+ FactoryGirl.create(factory.name, column.name => value)
52
+ end
53
+
54
+ Given /^(\d+) #{factory.human_name.pluralize} exist with an? #{human_column_name} of "([^"]*)"$/i do |count, value|
55
+ count.to_i.times { FactoryGirl.create(factory.name, column.name => value) }
56
+ end
57
+ end
58
+ end
59
+ end
60
+
@@ -0,0 +1,42 @@
1
+ module FactoryGirl
2
+ module Syntax
3
+
4
+ # Extends ActiveRecord::Base to provide a make class method, which is an
5
+ # alternate syntax for defining factories.
6
+ #
7
+ # Usage:
8
+ #
9
+ # require 'factory_girl/syntax/blueprint'
10
+ #
11
+ # User.blueprint do
12
+ # name { 'Billy Bob' }
13
+ # email { 'billy@bob.example.com' }
14
+ # end
15
+ #
16
+ # FactoryGirl.create(:user, :name => 'Johnny')
17
+ #
18
+ # This syntax was derived from Pete Yandell's machinist.
19
+ module Blueprint
20
+ module ActiveRecord #:nodoc:
21
+
22
+ def self.included(base) # :nodoc:
23
+ base.extend ClassMethods
24
+ end
25
+
26
+ module ClassMethods #:nodoc:
27
+
28
+ def blueprint(&block)
29
+ instance = Factory.new(name.underscore, :class => self)
30
+ proxy = FactoryGirl::DefinitionProxy.new(instance)
31
+ proxy.instance_eval(&block)
32
+ FactoryGirl.register_factory(instance)
33
+ end
34
+
35
+ end
36
+
37
+ end
38
+ end
39
+ end
40
+ end
41
+
42
+ ActiveRecord::Base.send(:include, FactoryGirl::Syntax::Blueprint::ActiveRecord)
@@ -0,0 +1,33 @@
1
+ module FactoryGirl
2
+ module Syntax
3
+ module Default
4
+ include Methods
5
+
6
+ def define(&block)
7
+ DSL.run(block)
8
+ end
9
+
10
+ class DSL
11
+ def self.run(block)
12
+ new.instance_eval(&block)
13
+ end
14
+
15
+ def factory(name, options = {}, &block)
16
+ factory = Factory.new(name, options)
17
+ proxy = FactoryGirl::DefinitionProxy.new(factory)
18
+ proxy.instance_eval(&block)
19
+ if parent = options.delete(:parent)
20
+ factory.inherit_from(FactoryGirl.factory_by_name(parent))
21
+ end
22
+ FactoryGirl.register_factory(factory)
23
+ end
24
+
25
+ def sequence(name, start_value = 1, &block)
26
+ FactoryGirl.register_sequence(Sequence.new(name, start_value, &block))
27
+ end
28
+ end
29
+ end
30
+ end
31
+
32
+ extend Syntax::Default
33
+ end
@@ -0,0 +1,73 @@
1
+ module FactoryGirl
2
+ module Syntax
3
+
4
+ # Extends ActiveRecord::Base to provide generation methods for factories.
5
+ #
6
+ # Usage:
7
+ #
8
+ # require 'factory_girl/syntax/generate'
9
+ #
10
+ # FactoryGirl.define do
11
+ # factory :user do
12
+ # name 'Billy Bob'
13
+ # email 'billy@bob.example.com'
14
+ # end
15
+ # end
16
+ #
17
+ # # Creates a saved instance without raising (same as saving the result
18
+ # # of FactoryGirl.build)
19
+ # User.generate(:name => 'Johnny')
20
+ #
21
+ # # Creates a saved instance and raises when invalid (same as
22
+ # # FactoryGirl.create)
23
+ # User.generate!
24
+ #
25
+ # # Creates an unsaved instance (same as FactoryGirl.build)
26
+ # User.spawn
27
+ #
28
+ # # Creates an instance and yields it to the passed block
29
+ # User.generate do |user|
30
+ # # ...do something with user...
31
+ # end
32
+ #
33
+ # This syntax was derived from Rick Bradley and Yossef Mendelssohn's
34
+ # object_daddy.
35
+ module Generate
36
+ module ActiveRecord #:nodoc:
37
+
38
+ def self.included(base) # :nodoc:
39
+ base.extend ClassMethods
40
+ end
41
+
42
+ module ClassMethods #:nodoc:
43
+
44
+ def generate(overrides = {}, &block)
45
+ factory = FactoryGirl.factory_by_name(name.underscore)
46
+ instance = factory.run(Proxy::Build, overrides)
47
+ instance.save
48
+ yield(instance) if block_given?
49
+ instance
50
+ end
51
+
52
+ def generate!(overrides = {}, &block)
53
+ factory = FactoryGirl.factory_by_name(name.underscore)
54
+ instance = factory.run(Proxy::Create, overrides)
55
+ yield(instance) if block_given?
56
+ instance
57
+ end
58
+
59
+ def spawn(overrides = {}, &block)
60
+ factory = FactoryGirl.factory_by_name(name.underscore)
61
+ instance = factory.run(Proxy::Build, overrides)
62
+ yield(instance) if block_given?
63
+ instance
64
+ end
65
+
66
+ end
67
+
68
+ end
69
+ end
70
+ end
71
+ end
72
+
73
+ ActiveRecord::Base.send(:include, FactoryGirl::Syntax::Generate::ActiveRecord)
@@ -0,0 +1,41 @@
1
+ module FactoryGirl
2
+ module Syntax
3
+
4
+ # Extends ActiveRecord::Base to provide a make class method, which is a
5
+ # shortcut for FactoryGirl.create.
6
+ #
7
+ # Usage:
8
+ #
9
+ # require 'factory_girl/syntax/make'
10
+ #
11
+ # FactoryGirl.define do
12
+ # factory :user do
13
+ # name 'Billy Bob'
14
+ # email 'billy@bob.example.com'
15
+ # end
16
+ # end
17
+ #
18
+ # User.make(:name => 'Johnny')
19
+ #
20
+ # This syntax was derived from Pete Yandell's machinist.
21
+ module Make
22
+ module ActiveRecord #:nodoc:
23
+
24
+ def self.included(base) # :nodoc:
25
+ base.extend ClassMethods
26
+ end
27
+
28
+ module ClassMethods #:nodoc:
29
+
30
+ def make(overrides = {})
31
+ FactoryGirl.factory_by_name(name.underscore).run(Proxy::Create, overrides)
32
+ end
33
+
34
+ end
35
+
36
+ end
37
+ end
38
+ end
39
+ end
40
+
41
+ ActiveRecord::Base.send(:include, FactoryGirl::Syntax::Make::ActiveRecord)
@@ -0,0 +1,86 @@
1
+ module FactoryGirl
2
+ module Syntax
3
+ module Methods
4
+ # Generates and returns a Hash of attributes from this factory. Attributes
5
+ # can be individually overridden by passing in a Hash of attribute => value
6
+ # pairs.
7
+ #
8
+ # Arguments:
9
+ # * name: +Symbol+ or +String+
10
+ # The name of the factory that should be used.
11
+ # * overrides: +Hash+
12
+ # Attributes to overwrite for this set.
13
+ #
14
+ # Returns: +Hash+
15
+ # A set of attributes that can be used to build an instance of the class
16
+ # this factory generates.
17
+ def attributes_for(name, overrides = {})
18
+ FactoryGirl.factory_by_name(name).run(Proxy::AttributesFor, overrides)
19
+ end
20
+
21
+ # Generates and returns an instance from this factory. Attributes can be
22
+ # individually overridden by passing in a Hash of attribute => value pairs.
23
+ #
24
+ # Arguments:
25
+ # * name: +Symbol+ or +String+
26
+ # The name of the factory that should be used.
27
+ # * overrides: +Hash+
28
+ # Attributes to overwrite for this instance.
29
+ #
30
+ # Returns: +Object+
31
+ # An instance of the class this factory generates, with generated attributes
32
+ # assigned.
33
+ def build(name, overrides = {})
34
+ FactoryGirl.factory_by_name(name).run(Proxy::Build, overrides)
35
+ end
36
+
37
+ # Generates, saves, and returns an instance from this factory. Attributes can
38
+ # be individually overridden by passing in a Hash of attribute => value
39
+ # pairs.
40
+ #
41
+ # Instances are saved using the +save!+ method, so ActiveRecord models will
42
+ # raise ActiveRecord::RecordInvalid exceptions for invalid attribute sets.
43
+ #
44
+ # Arguments:
45
+ # * name: +Symbol+ or +String+
46
+ # The name of the factory that should be used.
47
+ # * overrides: +Hash+
48
+ # Attributes to overwrite for this instance.
49
+ #
50
+ # Returns: +Object+
51
+ # A saved instance of the class this factory generates, with generated
52
+ # attributes assigned.
53
+ def create(name, overrides = {})
54
+ FactoryGirl.factory_by_name(name).run(Proxy::Create, overrides)
55
+ end
56
+
57
+ # Generates and returns an object with all attributes from this factory
58
+ # stubbed out. Attributes can be individually overridden by passing in a Hash
59
+ # of attribute => value pairs.
60
+ #
61
+ # Arguments:
62
+ # * name: +Symbol+ or +String+
63
+ # The name of the factory that should be used.
64
+ # * overrides: +Hash+
65
+ # Attributes to overwrite for this instance.
66
+ #
67
+ # Returns: +Object+
68
+ # An object with generated attributes stubbed out.
69
+ def build_stubbed(name, overrides = {})
70
+ FactoryGirl.factory_by_name(name).run(Proxy::Stub, overrides)
71
+ end
72
+
73
+ # Generates and returns the next value in a sequence.
74
+ #
75
+ # Arguments:
76
+ # name: (Symbol)
77
+ # The name of the sequence that a value should be generated for.
78
+ #
79
+ # Returns:
80
+ # The next value in the sequence. (Object)
81
+ def generate(name)
82
+ FactoryGirl.sequence_by_name(name).next
83
+ end
84
+ end
85
+ end
86
+ end
@@ -0,0 +1,45 @@
1
+ module FactoryGirl
2
+ module Syntax
3
+
4
+ # Adds a Sham module, which provides an alternate interface to
5
+ # FactoryGirl::Sequence.
6
+ #
7
+ # Usage:
8
+ #
9
+ # require 'factory_girl/syntax/sham'
10
+ #
11
+ # Sham.email {|n| "somebody#{n}@example.com" }
12
+ #
13
+ # FactoryGirl.define do
14
+ # factory :user do
15
+ # email
16
+ # end
17
+ # end
18
+ #
19
+ # Note that you can also use Faker, but it is recommended that you simply
20
+ # use a sequence as in the above example, as factory_girl does not provide
21
+ # protection against duplication in randomized sequences, and a randomized
22
+ # value does not provide any tangible benefits over an ascending sequence.
23
+ #
24
+ # This syntax was derived from Pete Yandell's machinist.
25
+ module Sham
26
+ module Sham #:nodoc:
27
+ def self.method_missing(name, *args, &block)
28
+ if block_given?
29
+ start_value = args.first
30
+ FactoryGirl.register_sequence(Sequence.new(name, start_value || 1, &block))
31
+ else
32
+ FactoryGirl.sequence_by_name(name).next
33
+ end
34
+ end
35
+
36
+ # overrides name on Module
37
+ def self.name(&block)
38
+ method_missing('name', &block)
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
44
+
45
+ include FactoryGirl::Syntax::Sham