fabrication 2.21.0 → 3.0.0.beta.1.1

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 (33) hide show
  1. checksums.yaml +4 -4
  2. data/README.markdown +1 -4
  3. data/Rakefile +8 -10
  4. data/lib/fabricate.rb +10 -13
  5. data/lib/fabrication.rb +4 -9
  6. data/lib/fabrication/config.rb +23 -22
  7. data/lib/fabrication/cucumber/step_fabricator.rb +20 -13
  8. data/lib/fabrication/errors/duplicate_fabricator_error.rb +5 -3
  9. data/lib/fabrication/errors/infinite_recursion_error.rb +5 -3
  10. data/lib/fabrication/errors/misplaced_fabricate_error.rb +7 -3
  11. data/lib/fabrication/errors/unfabricatable_error.rb +5 -4
  12. data/lib/fabrication/errors/unknown_fabricator_error.rb +5 -5
  13. data/lib/fabrication/generator/active_record.rb +18 -15
  14. data/lib/fabrication/generator/base.rb +93 -81
  15. data/lib/fabrication/generator/sequel.rb +29 -27
  16. data/lib/fabrication/railtie.rb +1 -3
  17. data/lib/fabrication/schematic/attribute.rb +69 -62
  18. data/lib/fabrication/schematic/definition.rb +139 -134
  19. data/lib/fabrication/schematic/evaluator.rb +61 -54
  20. data/lib/fabrication/schematic/manager.rb +67 -59
  21. data/lib/fabrication/schematic/runner.rb +12 -9
  22. data/lib/fabrication/sequencer.rb +23 -22
  23. data/lib/fabrication/support.rb +57 -54
  24. data/lib/fabrication/syntax/make.rb +0 -1
  25. data/lib/fabrication/transform.rb +34 -36
  26. data/lib/fabrication/version.rb +1 -1
  27. data/lib/rails/generators/fabrication/cucumber_steps/cucumber_steps_generator.rb +2 -3
  28. data/lib/rails/generators/fabrication/cucumber_steps/templates/fabrication_steps.rb +10 -10
  29. data/lib/rails/generators/fabrication/model/model_generator.rb +9 -9
  30. data/lib/tasks/defined_fabricators.rake +11 -11
  31. metadata +10 -12
  32. data/lib/fabrication/generator/data_mapper.rb +0 -17
  33. data/lib/fabrication/generator/mongoid.rb +0 -15
@@ -1,36 +1,38 @@
1
- class Fabrication::Generator::Sequel < Fabrication::Generator::Base
2
-
3
- def initialize(klass)
4
- super
5
- load_instance_hooks
6
- end
1
+ module Fabrication
2
+ module Generator
3
+ class Sequel < Fabrication::Generator::Base
4
+ def initialize(klass)
5
+ super
6
+ load_instance_hooks
7
+ end
7
8
 
8
- def self.supports?(klass)
9
- defined?(Sequel) && klass.ancestors.include?(Sequel::Model)
10
- end
9
+ def self.supports?(klass)
10
+ defined?(::Sequel) && defined?(::Sequel::Model) && klass.ancestors.include?(::Sequel::Model)
11
+ end
11
12
 
12
- def set_attributes
13
- _attributes.each do |key, value|
14
- if (reflection = _klass.association_reflections[key]) && value.is_a?(Array)
15
- _instance.associations[key] = value
16
- _instance.after_save_hook do
17
- value.each { |o| _instance.send(reflection.add_method, o) }
13
+ def set_attributes
14
+ _attributes.each do |key, value|
15
+ if (reflection = _klass.association_reflections[key]) && value.is_a?(Array)
16
+ _instance.associations[key] = value
17
+ _instance.after_save_hook do
18
+ value.each { |o| _instance.send(reflection.add_method, o) }
19
+ end
20
+ else
21
+ _instance.send("#{key}=", value)
22
+ end
18
23
  end
19
- else
20
- _instance.send("#{key}=", value)
21
24
  end
22
- end
23
- end
24
25
 
25
- def persist
26
- _instance.save(raise_on_failure: true)
27
- end
26
+ def persist
27
+ _instance.save(raise_on_failure: true)
28
+ end
28
29
 
29
- private
30
+ private
30
31
 
31
- def load_instance_hooks
32
- klass = _klass.respond_to?(:cti_base_model) ? _klass.cti_models.first : _klass
33
- klass.plugin :instance_hooks unless klass.new.respond_to? :after_save_hook
32
+ def load_instance_hooks
33
+ klass = _klass.respond_to?(:cti_base_model) ? _klass.cti_models.first : _klass
34
+ klass.plugin :instance_hooks unless klass.new.respond_to? :after_save_hook
35
+ end
36
+ end
34
37
  end
35
-
36
38
  end
@@ -9,9 +9,7 @@ module Fabrication
9
9
  config.generators
10
10
  end
11
11
 
12
- unless generators.rails.has_key?(:fixture_replacement)
13
- generators.fixture_replacement :fabrication
14
- end
12
+ generators.fixture_replacement :fabrication unless generators.rails.key?(:fixture_replacement)
15
13
  end
16
14
  end
17
15
  end
@@ -1,65 +1,72 @@
1
- class Fabrication::Schematic::Attribute
2
-
3
- attr_accessor :klass, :name, :value
4
- attr_writer :params
5
-
6
- def initialize(klass, name, value, params={}, &block)
7
- self.klass = klass
8
- self.name = name
9
- self.params = params
10
- self.value = value.nil? ? block : value
11
- end
12
-
13
- def params
14
- @params ||= {}
15
- end
16
-
17
- def transient!
18
- params[:transient] = true
19
- end
20
-
21
- def transient?
22
- params[:transient]
23
- end
24
-
25
- def processed_value(processed_attributes)
26
- if process_count
27
- (1..process_count).map { |i| execute(processed_attributes, i, &value) }
28
- elsif value_proc?
29
- execute(processed_attributes, &value)
30
- else
31
- value
1
+ module Fabrication
2
+ module Schematic
3
+ class Attribute
4
+ attr_accessor :klass, :name, :value
5
+ attr_writer :params
6
+
7
+ def initialize(klass, name, value, params = {}, &block)
8
+ self.klass = klass
9
+ self.name = name
10
+ self.params = params
11
+ self.value = value.nil? ? block : value
12
+ end
13
+
14
+ def params
15
+ @params ||= {}
16
+ end
17
+
18
+ def transient!
19
+ params[:transient] = true
20
+ end
21
+
22
+ def transient?
23
+ params[:transient]
24
+ end
25
+
26
+ def processed_value(processed_attributes)
27
+ if process_count
28
+ (1..process_count).map { |i| execute(processed_attributes, i, &value) }
29
+ elsif value_proc?
30
+ execute(processed_attributes, &value)
31
+ else
32
+ value
33
+ end
34
+ end
35
+
36
+ def value_static?
37
+ !value_proc?
38
+ end
39
+
40
+ def value_proc?
41
+ value.is_a?(Proc)
42
+ end
43
+
44
+ private
45
+
46
+ def execute(*args, &block)
47
+ Fabrication::Schematic::Runner.new(klass).instance_exec(*args, &block)
48
+ end
49
+
50
+ def process_count
51
+ count || rand || rand_range
52
+ end
53
+
54
+ def count
55
+ params[:count]
56
+ end
57
+
58
+ def rand
59
+ return unless params[:rand]
60
+
61
+ range = params[:rand]
62
+ range = 1..range unless range.is_a? Range
63
+
64
+ Kernel.rand(range)
65
+ end
66
+
67
+ def rand_range
68
+ Kernel.rand((params[:start_range]..params[:end_range])) if params[:start_range] && params[:end_range]
69
+ end
32
70
  end
33
71
  end
34
-
35
- def value_static?; !value_proc? end
36
- def value_proc?; Proc === value end
37
-
38
- private
39
-
40
- def execute(*args, &block)
41
- Fabrication::Schematic::Runner.new(klass).instance_exec(*args, &block)
42
- end
43
-
44
- def process_count
45
- count || rand || rand_range
46
- end
47
-
48
- def count
49
- params[:count]
50
- end
51
-
52
- def rand
53
- return unless params[:rand]
54
-
55
- range = params[:rand]
56
- range = 1..range unless range.is_a? Range
57
-
58
- Kernel.rand(range)
59
- end
60
-
61
- def rand_range
62
- Kernel.rand((params[:start_range]..params[:end_range])) if params[:start_range] && params[:end_range]
63
- end
64
-
65
72
  end
@@ -1,164 +1,169 @@
1
- class Fabrication::Schematic::Definition
2
-
3
- GENERATORS = [
4
- Fabrication::Generator::ActiveRecord,
5
- Fabrication::Generator::DataMapper,
6
- Fabrication::Generator::Sequel,
7
- Fabrication::Generator::Mongoid,
8
- Fabrication::Generator::Base
9
- ]
10
-
11
- attr_accessor :name, :options, :block
12
- def initialize(name, options={}, &block)
13
- self.name = name
14
- self.options = options
15
- self.block = block
16
- end
1
+ module Fabrication
2
+ module Schematic
3
+ class Definition
4
+ GENERATORS = [
5
+ Fabrication::Generator::ActiveRecord,
6
+ Fabrication::Generator::Sequel,
7
+ Fabrication::Generator::Base
8
+ ].freeze
9
+
10
+ attr_accessor :name, :options, :block
11
+
12
+ def initialize(name, options = {}, &block)
13
+ self.name = name
14
+ self.options = options
15
+ self.block = block
16
+ end
17
17
 
18
- def process_block(&block)
19
- Fabrication::Schematic::Evaluator.new.process(self, &block) if block_given?
20
- end
18
+ def process_block(&block)
19
+ Fabrication::Schematic::Evaluator.new.process(self, &block) if block_given?
20
+ end
21
21
 
22
- def attribute(name)
23
- attributes.detect { |a| a.name == name }
24
- end
22
+ def attribute(name)
23
+ attributes.detect { |a| a.name == name }
24
+ end
25
25
 
26
- def append_or_update_attribute(attribute_name, value, params={}, &block)
27
- attribute = Fabrication::Schematic::Attribute.new(klass, attribute_name, value, params, &block)
28
- if index = attributes.index { |a| a.name == attribute.name }
29
- attribute.transient! if attributes[index].transient?
30
- attributes[index] = attribute
31
- else
32
- attributes << attribute
33
- end
34
- end
26
+ def append_or_update_attribute(attribute_name, value, params = {}, &block)
27
+ attribute = Fabrication::Schematic::Attribute.new(klass, attribute_name, value, params, &block)
28
+ index = attributes.index { |a| a.name == attribute.name }
35
29
 
36
- attr_writer :attributes
37
- def attributes
38
- load_body
39
- @attributes ||= []
40
- end
30
+ if index
31
+ attribute.transient! if attributes[index].transient?
32
+ attributes[index] = attribute
33
+ else
34
+ attributes << attribute
35
+ end
36
+ end
41
37
 
42
- attr_writer :callbacks
43
- def callbacks
44
- load_body
45
- @callbacks ||= {}
46
- end
38
+ attr_writer :attributes, :callbacks
47
39
 
48
- def generator
49
- @generator ||= Fabrication::Config.generator_for(GENERATORS, klass)
50
- end
40
+ def attributes
41
+ load_body
42
+ @attributes ||= []
43
+ end
51
44
 
52
- def sorted_attributes
53
- attributes.select(&:value_static?) + attributes.select(&:value_proc?)
54
- end
45
+ def callbacks
46
+ load_body
47
+ @callbacks ||= {}
48
+ end
55
49
 
56
- def build(overrides={}, &block)
57
- Fabrication.manager.prevent_recursion!
58
- if Fabrication.manager.to_params_stack.any?
59
- to_params(overrides, &block)
60
- else
61
- begin
62
- Fabrication.manager.build_stack << name
63
- merge(overrides, &block).instance_eval do
64
- generator.new(klass).build(sorted_attributes, callbacks)
50
+ def generator
51
+ @generator ||= Fabrication::Config.generator_for(GENERATORS, klass)
52
+ end
53
+
54
+ def sorted_attributes
55
+ attributes.select(&:value_static?) + attributes.select(&:value_proc?)
56
+ end
57
+
58
+ def build(overrides = {}, &block)
59
+ Fabrication.manager.prevent_recursion!
60
+ if Fabrication.manager.to_params_stack.any?
61
+ to_params(overrides, &block)
62
+ else
63
+ begin
64
+ Fabrication.manager.build_stack << name
65
+ merge(overrides, &block).instance_eval do
66
+ generator.new(klass).build(sorted_attributes, callbacks)
67
+ end
68
+ ensure
69
+ Fabrication.manager.build_stack.pop
70
+ end
65
71
  end
66
- ensure
67
- Fabrication.manager.build_stack.pop
68
72
  end
69
- end
70
- end
71
73
 
72
- def fabricate(overrides={}, &block)
73
- Fabrication.manager.prevent_recursion!
74
- if Fabrication.manager.build_stack.any?
75
- build(overrides, &block)
76
- elsif Fabrication.manager.to_params_stack.any?
77
- to_params(overrides, &block)
78
- else
79
- begin
80
- Fabrication.manager.create_stack << name
74
+ def fabricate(overrides = {}, &block)
75
+ Fabrication.manager.prevent_recursion!
76
+ if Fabrication.manager.build_stack.any?
77
+ build(overrides, &block)
78
+ elsif Fabrication.manager.to_params_stack.any?
79
+ to_params(overrides, &block)
80
+ else
81
+ begin
82
+ Fabrication.manager.create_stack << name
83
+ merge(overrides, &block).instance_eval do
84
+ generator.new(klass).create(sorted_attributes, callbacks)
85
+ end
86
+ ensure
87
+ Fabrication.manager.create_stack.pop
88
+ end
89
+ end
90
+ end
91
+
92
+ def to_params(overrides = {}, &block)
93
+ Fabrication.manager.prevent_recursion!
94
+ Fabrication.manager.to_params_stack << name
81
95
  merge(overrides, &block).instance_eval do
82
- generator.new(klass).create(sorted_attributes, callbacks)
96
+ generator.new(klass).to_params(sorted_attributes)
83
97
  end
84
98
  ensure
85
- Fabrication.manager.create_stack.pop
99
+ Fabrication.manager.to_params_stack.pop
86
100
  end
87
- end
88
- end
89
101
 
90
- def to_params(overrides={}, &block)
91
- Fabrication.manager.prevent_recursion!
92
- Fabrication.manager.to_params_stack << name
93
- merge(overrides, &block).instance_eval do
94
- generator.new(klass).to_params(sorted_attributes)
95
- end
96
- ensure
97
- Fabrication.manager.to_params_stack.pop
98
- end
102
+ def to_attributes(overrides = {}, &block)
103
+ merge(overrides, &block).instance_eval do
104
+ generator.new(klass).to_hash(sorted_attributes, callbacks)
105
+ end
106
+ end
99
107
 
100
- def to_attributes(overrides={}, &block)
101
- merge(overrides, &block).instance_eval do
102
- generator.new(klass).to_hash(sorted_attributes, callbacks)
103
- end
104
- end
108
+ def initialize_copy(original)
109
+ self.callbacks = {}
110
+ original.callbacks.each do |type, callbacks|
111
+ self.callbacks[type] = callbacks.clone
112
+ end
105
113
 
106
- def initialize_copy(original)
107
- self.callbacks = {}
108
- original.callbacks.each do |type, callbacks|
109
- self.callbacks[type] = callbacks.clone
110
- end
114
+ self.attributes = original.attributes.clone
115
+ end
111
116
 
112
- self.attributes = original.attributes.clone
113
- end
117
+ def generate_value(name, params)
118
+ if params[:count] || params[:rand]
119
+ name = Fabrication::Support.singularize(name.to_s)
120
+ proc { Fabricate.build(params[:fabricator] || name) }
121
+ else
122
+ proc { Fabricate(params[:fabricator] || name) }
123
+ end
124
+ end
114
125
 
115
- def generate_value(name, params)
116
- if params[:count] || params[:rand]
117
- name = Fabrication::Support.singularize(name.to_s)
118
- proc { Fabricate.build(params[:fabricator] || name) }
119
- else
120
- proc { Fabricate(params[:fabricator] || name) }
121
- end
122
- end
126
+ def merge(overrides = {}, &block)
127
+ clone.tap do |definition|
128
+ definition.process_block(&block)
129
+ overrides.each do |name, value|
130
+ definition.append_or_update_attribute(name.to_sym, value)
131
+ end
132
+ end
133
+ end
123
134
 
124
- def merge(overrides={}, &block)
125
- clone.tap do |definition|
126
- definition.process_block(&block)
127
- overrides.each do |name, value|
128
- definition.append_or_update_attribute(name.to_sym, value)
135
+ def klass
136
+ @klass ||= Fabrication::Support.class_for(
137
+ options[:class_name] ||
138
+ parent&.klass ||
139
+ options[:from] ||
140
+ name
141
+ )
129
142
  end
130
- end
131
- end
132
143
 
133
- def klass
134
- @klass ||= Fabrication::Support.class_for(
135
- options[:class_name] ||
136
- (parent && parent.klass) ||
137
- options[:from] ||
138
- name
139
- )
140
- end
144
+ protected
145
+
146
+ def loaded?
147
+ !!(@loaded ||= nil)
148
+ end
141
149
 
142
- protected
150
+ def load_body
151
+ return if loaded?
143
152
 
144
- def loaded?
145
- !!(@loaded ||= nil)
146
- end
153
+ @loaded = true
147
154
 
148
- def load_body
149
- return if loaded?
150
- @loaded = true
155
+ if parent
156
+ merge_result = parent.merge(&block)
157
+ @attributes = merge_result.attributes
158
+ @callbacks = merge_result.callbacks
159
+ else
160
+ process_block(&block)
161
+ end
162
+ end
151
163
 
152
- if parent
153
- merge_result = parent.merge(&block)
154
- @attributes = merge_result.attributes
155
- @callbacks = merge_result.callbacks
156
- else
157
- process_block(&block)
164
+ def parent
165
+ @parent ||= Fabrication.manager[options[:from].to_s] if options[:from]
166
+ end
158
167
  end
159
168
  end
160
-
161
- def parent
162
- @parent ||= Fabrication.manager[options[:from].to_s] if options[:from]
163
- end
164
169
  end