fabrication 2.31.0 → 3.0.0.beta.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3efaba7356d0a3fcade7fe08a68719f8d0f452bc8cd72a88e087c10434931745
4
- data.tar.gz: 1beb71f4903b74255a06c46ee6ca15e464d3ed6b0400a02ba01cd65cefd205a7
3
+ metadata.gz: 20a02618a5107ba5850de6da2bd58ae428d33d8163ab3c71f9233574780998df
4
+ data.tar.gz: 33bac0b9d796da2d94adf3a8eb8940ff8766c36c9435429a03a1da0dd1efb8ad
5
5
  SHA512:
6
- metadata.gz: 04bd08bc59c91ff463cac12869d0a4211b969f50635748e830842e62198c9f9ec7dad7bebbc1db32d6e65fd46d76559041da27c689d067d65835978ade6fb86d
7
- data.tar.gz: 6a4259285d0c8f8787df5a8a6d9dcfe823de65282a50873e06d0660b94bd3f0051a0bfd5e64f6fe6b809637782404646e55c0889a793fd9f70dd7b19ef43a70c
6
+ metadata.gz: e0d2aa56f7153981b3be287dde1204a1050b964e5bdba14314d7f7cda4d7af7a4960cb2670bd2c58b7615768fdea84c4dbd15da2d1db95b5b4371e86091b336d
7
+ data.tar.gz: a182aecb4c3d38e36cd0e8f282dfd575b7234427a15e7f575cdbc84ca090848f162de9becc0989cef3baaa76c986a946c467b53adb937c5011932af774735b25
data/lib/fabricate.rb CHANGED
@@ -1,14 +1,14 @@
1
1
  class Fabricate
2
2
  def self.times(count, name, overrides = {}, &block)
3
- Array.new(count).map { Fabricate(name, overrides, &block) }
3
+ count.times.map { Fabricate(name, overrides, &block) }
4
4
  end
5
5
 
6
6
  def self.build_times(count, name, overrides = {}, &block)
7
- Array.new(count).map { Fabricate.build(name, overrides, &block) }
7
+ count.times.map { Fabricate.build(name, overrides, &block) }
8
8
  end
9
9
 
10
10
  def self.attributes_for_times(count, name, overrides = {}, &block)
11
- Array.new(count).map { Fabricate.attributes_for(name, overrides, &block) }
11
+ count.times.map { Fabricate.attributes_for(name, overrides, &block) }
12
12
  end
13
13
 
14
14
  def self.attributes_for(name, overrides = {}, &block)
@@ -24,19 +24,13 @@ class Fabricate
24
24
  def self.build(name, overrides = {}, &block)
25
25
  fail_if_initializing(name)
26
26
  schematic(name).build(overrides, &block).tap do |object|
27
- Fabrication::Config.notifiers.each do |notifier|
28
- notifier.call(name, object)
29
- end
27
+ Fabrication::Cucumber::Fabrications[name] = object if Fabrication::Config.register_with_steps?
30
28
  end
31
29
  end
32
30
 
33
31
  def self.create(name, overrides = {}, &block)
34
32
  fail_if_initializing(name)
35
- schematic(name).fabricate(overrides, &block).tap do |object|
36
- Fabrication::Config.notifiers.each do |notifier|
37
- notifier.call(name, object)
38
- end
39
- end
33
+ schematic(name).fabricate(overrides, &block)
40
34
  end
41
35
 
42
36
  def self.sequence(name = Fabrication::Sequencer::DEFAULT, start = nil, &block)
@@ -1,5 +1,3 @@
1
- require 'logger'
2
-
3
1
  module Fabrication
4
2
  module Config
5
3
  extend self
@@ -16,22 +14,14 @@ module Fabrication
16
14
  nil
17
15
  end
18
16
 
19
- attr_writer :logger, :sequence_start
20
-
21
- def logger
22
- @logger ||= Logger.new($stdout).tap do |logger|
23
- logger.level = Logger::WARN
24
- end
25
- end
26
-
27
17
  def fabricator_path
28
18
  @fabricator_path ||= ['test/fabricators', 'spec/fabricators']
29
19
  end
30
20
  alias fabricator_paths fabricator_path
31
21
 
32
22
  def fabricator_dir
33
- Support.log_deprecation('Fabrication::Config.fabricator_dir has been ' \
34
- 'replaced by Fabrication::Config.fabricator_path')
23
+ puts 'DEPRECATION WARNING: Fabrication::Config.fabricator_dir has been ' \
24
+ 'replaced by Fabrication::Config.fabricator_path'
35
25
  fabricator_path
36
26
  end
37
27
 
@@ -40,11 +30,13 @@ module Fabrication
40
30
  end
41
31
 
42
32
  def fabricator_dir=(folders)
43
- Support.log_deprecation('Fabrication::Config.fabricator_dir has been ' \
44
- 'replaced by Fabrication::Config.fabricator_path')
33
+ puts 'DEPRECATION WARNING: Fabrication::Config.fabricator_dir has been ' \
34
+ 'replaced by Fabrication::Config.fabricator_path'
45
35
  self.fabricator_path = folders
46
36
  end
47
37
 
38
+ attr_writer :sequence_start, :register_with_steps
39
+
48
40
  def sequence_start
49
41
  @sequence_start ||= 0
50
42
  end
@@ -58,6 +50,10 @@ module Fabrication
58
50
  end
59
51
  alias path_prefixes path_prefix
60
52
 
53
+ def register_with_steps?
54
+ @register_with_steps ||= nil
55
+ end
56
+
61
57
  def generators
62
58
  @generators ||= []
63
59
  end
@@ -73,26 +69,5 @@ module Fabrication
73
69
  def recursion_limit=(limit)
74
70
  @recursion_limit = limit
75
71
  end
76
-
77
- def register_with_steps=(value)
78
- Support.log_deprecation(
79
- 'Fabrication::Config.register_with_steps has been deprecated. ' \
80
- 'Please regenerate your cucumber steps with `rails g fabrication:cucumber_steps'
81
- )
82
-
83
- return unless value
84
-
85
- register_notifier do |name, object|
86
- Fabrication::Cucumber::Fabrications[name] = object
87
- end
88
- end
89
-
90
- def notifiers
91
- @notifiers ||= []
92
- end
93
-
94
- def register_notifier(&block)
95
- notifiers.push(block)
96
- end
97
72
  end
98
73
  end
@@ -1,5 +1,3 @@
1
- require 'singleton'
2
-
3
1
  module Fabrication
4
2
  module Cucumber
5
3
  class StepFabricator
@@ -22,7 +20,7 @@ module Fabrication
22
20
  end
23
21
 
24
22
  def n(count, attrs = {})
25
- Array.new(count).map { make(attrs) }.tap { |o| remember(o) }
23
+ count.times.map { make(attrs) }.tap { |o| remember(o) }
26
24
  end
27
25
 
28
26
  # rubocop:disable Naming/PredicateName
@@ -87,23 +85,17 @@ module Fabrication
87
85
  end
88
86
  end
89
87
 
90
- class Fabrications
91
- include Singleton
92
-
88
+ module Fabrications
93
89
  def self.fabrications
94
- instance.fabrications
90
+ @fabrications ||= {}
95
91
  end
96
92
 
97
93
  def self.[](fabricator)
98
- instance.fabrications[fabricator.to_sym]
94
+ fabrications[fabricator.to_sym]
99
95
  end
100
96
 
101
97
  def self.[]=(fabricator, fabrication)
102
- instance.fabrications[fabricator.to_sym] = fabrication
103
- end
104
-
105
- def fabrications
106
- @fabrications ||= {}
98
+ fabrications[fabricator.to_sym] = fabrication
107
99
  end
108
100
  end
109
101
  end
@@ -6,15 +6,15 @@ module Fabrication
6
6
  # so we can't assume because we have the ActiveRecord module that we also
7
7
  # have ActiveRecord::Base. Because defined? can return nil we ensure that nil
8
8
  # becomes false.
9
- (defined?(::ActiveRecord) && defined?(::ActiveRecord::Base) &&
10
- klass.ancestors.include?(::ActiveRecord::Base)) || false
9
+ defined?(::ActiveRecord) && defined?(::ActiveRecord::Base) &&
10
+ klass.ancestors.include?(::ActiveRecord::Base) || false
11
11
  end
12
12
 
13
13
  def build_instance
14
- self._instance = if resolved_class.respond_to?(:protected_attributes)
15
- resolved_class.new(_attributes, without_protection: true)
14
+ self._instance = if _klass.respond_to?(:protected_attributes)
15
+ _klass.new(_attributes, without_protection: true)
16
16
  else
17
- resolved_class.new(_attributes)
17
+ _klass.new(_attributes)
18
18
  end
19
19
  end
20
20
  end
@@ -1,7 +1,7 @@
1
1
  module Fabrication
2
2
  module Generator
3
3
  class Base
4
- def self.supports?(_resolved_class)
4
+ def self.supports?(_klass)
5
5
  true
6
6
  end
7
7
 
@@ -11,9 +11,6 @@ module Fabrication
11
11
  if callbacks[:initialize_with]
12
12
  build_instance_with_constructor_override(callbacks[:initialize_with])
13
13
  elsif callbacks[:on_init]
14
- Fabrication::Support.log_deprecation(
15
- 'The on_init callback has been replaced by initialize_with. Please see the documentation for usage'
16
- )
17
14
  build_instance_with_init_callback(callbacks[:on_init])
18
15
  else
19
16
  build_instance
@@ -22,29 +19,18 @@ module Fabrication
22
19
  _instance
23
20
  end
24
21
 
25
- def create(attributes = [], callbacks = {})
22
+ def create(attributes = [], callbacks = [])
26
23
  build(attributes, callbacks)
27
- execute_deprecated_callbacks(callbacks, :before_validation, :before_create)
28
- execute_deprecated_callbacks(callbacks, :after_validation, :before_create)
29
- execute_deprecated_callbacks(callbacks, :before_save, :before_create)
24
+ execute_callbacks(callbacks[:before_validation])
25
+ execute_callbacks(callbacks[:after_validation])
26
+ execute_callbacks(callbacks[:before_save])
30
27
  execute_callbacks(callbacks[:before_create])
31
28
  persist
32
29
  execute_callbacks(callbacks[:after_create])
33
- execute_deprecated_callbacks(callbacks, :after_save, :after_create)
30
+ execute_callbacks(callbacks[:after_save])
34
31
  _instance
35
32
  end
36
33
 
37
- def execute_deprecated_callbacks(callbacks, callback_type, replacement_callback)
38
- if callbacks[callback_type]
39
- Fabrication::Support.log_deprecation(
40
- "Using #{callback_type} is deprecated but you can replace it " \
41
- "with #{replacement_callback} with the same result."
42
- )
43
- end
44
-
45
- execute_callbacks(callbacks[callback_type])
46
- end
47
-
48
34
  def execute_callbacks(callbacks)
49
35
  callbacks&.each { |callback| _instance.instance_exec(_instance, _transient_attributes, &callback) }
50
36
  end
@@ -68,17 +54,17 @@ module Fabrication
68
54
  end
69
55
 
70
56
  def build_instance_with_constructor_override(callback)
71
- self._instance = instance_exec(_transient_attributes, &callback)
57
+ self._instance = instance_eval(&callback)
72
58
  set_attributes
73
59
  end
74
60
 
75
61
  def build_instance_with_init_callback(callback)
76
- self._instance = resolved_class.new(*callback.call(_transient_attributes))
62
+ self._instance = _klass.new(*callback.call)
77
63
  set_attributes
78
64
  end
79
65
 
80
66
  def build_instance
81
- self._instance = resolved_class.new
67
+ self._instance = _klass.new
82
68
  set_attributes
83
69
  end
84
70
 
@@ -88,8 +74,8 @@ module Fabrication
88
74
  end
89
75
  end
90
76
 
91
- def initialize(resolved_class)
92
- self.resolved_class = resolved_class
77
+ def initialize(klass)
78
+ self._klass = klass
93
79
  end
94
80
 
95
81
  def respond_to_missing?(method_name, _include_private = false)
@@ -100,36 +86,25 @@ module Fabrication
100
86
  _attributes.fetch(method_name) { super }
101
87
  end
102
88
 
103
- def _klass
104
- Fabrication::Support.log_deprecation(
105
- 'The `_klass` method in fabricator definitions has been replaced by `resolved_class`'
106
- )
107
-
108
- resolved_class
109
- end
110
-
111
89
  protected
112
90
 
113
- attr_accessor :resolved_class, :_instance
91
+ attr_accessor :_klass, :_instance, :_transient_attributes
114
92
 
115
93
  def _attributes
116
94
  @_attributes ||= {}
117
95
  end
118
96
 
119
- def _transient_attributes
120
- @_transient_attributes ||= {}
121
- end
122
-
123
97
  def persist
124
98
  _instance.save! if _instance.respond_to?(:save!)
125
99
  end
126
100
 
127
101
  def process_attributes(attributes)
102
+ self._transient_attributes = ({})
128
103
  attributes.each do |attribute|
129
104
  _attributes[attribute.name] = attribute.processed_value(_attributes)
130
105
  _transient_attributes[attribute.name] = _attributes[attribute.name] if attribute.transient?
131
106
  end
132
- _attributes.reject! { |k| _transient_attributes.key?(k) }
107
+ _attributes.reject! { |k| _transient_attributes.keys.include?(k) }
133
108
  end
134
109
  end
135
110
  end
@@ -6,10 +6,10 @@ module Fabrication
6
6
  end
7
7
 
8
8
  def build_instance
9
- self._instance = if resolved_class.respond_to?(:protected_attributes)
10
- resolved_class.new(_attributes, without_protection: true)
9
+ self._instance = if _klass.respond_to?(:protected_attributes)
10
+ _klass.new(_attributes, without_protection: true)
11
11
  else
12
- resolved_class.new(_attributes)
12
+ _klass.new(_attributes)
13
13
  end
14
14
  end
15
15
  end
@@ -7,15 +7,18 @@ module Fabrication
7
7
  end
8
8
 
9
9
  def self.supports?(klass)
10
- defined?(::Sequel) && defined?(::Sequel::Model) && klass.ancestors.include?(::Sequel::Model)
10
+ defined?(::Sequel) && klass.ancestors.include?(::Sequel::Model)
11
11
  end
12
12
 
13
13
  def set_attributes
14
- _attributes.each do |field_name, value|
15
- if value.is_a?(Array) && (association = association_for(field_name))
16
- set_association(association, field_name, value)
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
17
20
  else
18
- set_attribute(field_name, value)
21
+ _instance.send("#{key}=", value)
19
22
  end
20
23
  end
21
24
  end
@@ -26,23 +29,8 @@ module Fabrication
26
29
 
27
30
  private
28
31
 
29
- def association_for(field_name)
30
- resolved_class.association_reflections[field_name]
31
- end
32
-
33
- def set_attribute(field_name, value)
34
- _instance.send("#{field_name}=", value)
35
- end
36
-
37
- def set_association(association, field_name, value)
38
- _instance.associations[field_name] = value
39
- _instance.after_save_hook do
40
- value.each { |o| _instance.send(association.add_method, o) }
41
- end
42
- end
43
-
44
32
  def load_instance_hooks
45
- klass = resolved_class.respond_to?(:cti_base_model) ? resolved_class.cti_models.first : resolved_class
33
+ klass = _klass.respond_to?(:cti_base_model) ? _klass.cti_models.first : _klass
46
34
  klass.plugin :instance_hooks unless klass.new.respond_to? :after_save_hook
47
35
  end
48
36
  end
@@ -43,8 +43,8 @@ module Fabrication
43
43
 
44
44
  private
45
45
 
46
- def execute(...)
47
- Fabrication::Schematic::Runner.new(klass).instance_exec(...)
46
+ def execute(*args, &block)
47
+ Fabrication::Schematic::Runner.new(klass).instance_exec(*args, &block)
48
48
  end
49
49
 
50
50
  def process_count
@@ -3,7 +3,6 @@ module Fabrication
3
3
  class Definition
4
4
  GENERATORS = [
5
5
  Fabrication::Generator::ActiveRecord,
6
- Fabrication::Generator::DataMapper,
7
6
  Fabrication::Generator::Sequel,
8
7
  Fabrication::Generator::Mongoid,
9
8
  Fabrication::Generator::Base
@@ -18,7 +17,7 @@ module Fabrication
18
17
  end
19
18
 
20
19
  def process_block(&block)
21
- Fabrication::Schematic::Evaluator.new.process(self, &block) if block
20
+ Fabrication::Schematic::Evaluator.new.process(self, &block) if block_given?
22
21
  end
23
22
 
24
23
  def attribute(name)
@@ -55,16 +55,14 @@ module Fabrication
55
55
  def load_definitions
56
56
  preinitialize
57
57
  Fabrication::Config.path_prefixes.each do |prefix|
58
- Fabrication::Config.fabricator_paths.each do |path|
59
- if File.file?(path)
60
- load path
61
- else
62
- Dir.glob(File.join(prefix.to_s, path, '**', '*.rb')).each do |file|
63
- load file
64
- end
58
+ Fabrication::Config.fabricator_paths.each do |folder|
59
+ Dir.glob(File.join(prefix.to_s, folder, '**', '*.rb')).sort.each do |file|
60
+ load file
65
61
  end
66
62
  end
67
63
  end
64
+ rescue StandardError => e
65
+ raise e
68
66
  ensure
69
67
  freeze
70
68
  end
@@ -1,40 +1,27 @@
1
- require 'singleton'
2
-
3
1
  module Fabrication
4
2
  class Sequencer
5
- include Singleton
6
-
7
3
  DEFAULT = :_default
8
4
 
9
5
  def self.sequence(name = DEFAULT, start = nil, &block)
10
- instance.sequence(name, start, &block)
11
- end
12
-
13
- def self.clear
14
- instance.sequences.clear
15
- instance.sequence_blocks.clear
16
- end
17
-
18
- def sequence(name = DEFAULT, start = nil, &block)
19
6
  idx = sequences[name] ||= start || Fabrication::Config.sequence_start
20
- if block
7
+ if block_given?
21
8
  sequence_blocks[name] = block.to_proc
22
9
  else
23
10
  sequence_blocks[name] ||= ->(i) { i }
24
11
  end.call(idx).tap do
25
- sequences[name] = idx.succ
12
+ sequences[name] += 1
26
13
  end
27
14
  end
28
15
 
29
- def sequences
16
+ def self.sequences
30
17
  @sequences ||= {}
31
18
  end
32
19
 
33
- def sequence_blocks
20
+ def self.sequence_blocks
34
21
  @sequence_blocks ||= {}
35
22
  end
36
23
 
37
- def reset
24
+ def self.reset
38
25
  Fabrication::Config.sequence_start = nil
39
26
  @sequences = nil
40
27
  @sequence_blocks = nil
@@ -1,68 +1,73 @@
1
1
  module Fabrication
2
- module Support
3
- extend self
4
-
5
- def fabricatable?(name)
6
- Fabrication.manager[name] || class_for(name)
7
- end
2
+ class Support
3
+ class << self
4
+ def fabricatable?(name)
5
+ Fabrication.manager[name] || class_for(name)
6
+ end
8
7
 
9
- def log_deprecation(message)
10
- Config.logger.warn("[DEPRECATION][fabrication] #{message}")
11
- end
8
+ def class_for(class_or_to_s)
9
+ class_name = variable_name_to_class_name(class_or_to_s)
10
+ constantize(class_name)
11
+ rescue NameError => e
12
+ raise Fabrication::UnfabricatableError.new(class_or_to_s, e)
13
+ end
12
14
 
13
- def class_for(class_or_to_s)
14
- constantize(variable_name_to_class_name(class_or_to_s))
15
- rescue NameError => e
16
- raise Fabrication::UnfabricatableError.new(class_or_to_s, e)
17
- end
15
+ def constantize(camel_cased_word)
16
+ names = camel_cased_word.split('::')
17
+ Object.const_get(camel_cased_word) if names.empty?
18
+ names.shift if names.size > 1 && names.first.empty?
19
+ names.inject(Object) do |constant, name|
20
+ if constant == Object
21
+ constant.const_get(name)
22
+ else
23
+ candidate = constant.const_get(name)
24
+ next candidate if constant.const_defined?(name, false)
25
+ next candidate unless Object.const_defined?(name)
18
26
 
19
- def constantize(camel_cased_word)
20
- return camel_cased_word if camel_cased_word.is_a?(Class)
27
+ constant = constant.ancestors.inject do |const, ancestor|
28
+ break const if ancestor == Object
29
+ break ancestor if ancestor.const_defined?(name, false)
21
30
 
22
- camel_cased_word.to_s.split('::').reduce(Object) do |resolved_class, class_part|
23
- resolved_class.const_get(class_part)
31
+ const
32
+ end
33
+ constant.const_get(name, false)
34
+ end
35
+ end
24
36
  end
25
- end
26
-
27
- def extract_options!(args)
28
- args.last.is_a?(::Hash) ? args.pop : {}
29
- end
30
-
31
- def variable_name_to_class_name(name)
32
- name_string = name.to_s
33
37
 
34
- if name_string.respond_to?(:camelize)
35
- name_string.camelize
36
- else
37
- name_string
38
- .gsub(%r{/(.?)}) { "::#{Regexp.last_match(1).upcase}" }
39
- .gsub(/(?:^|_)(.)/) { Regexp.last_match(1).upcase }
38
+ def extract_options!(args)
39
+ args.last.is_a?(::Hash) ? args.pop : {}
40
40
  end
41
- end
42
41
 
43
- def find_definitions
44
- log_deprecation('Fabrication::Support.find_definitions has been replaced by ' \
45
- 'Fabrication.manager.load_definitions and will be removed in 3.0.0.')
42
+ def variable_name_to_class_name(name)
43
+ name.to_s.gsub(%r{/(.?)}) do
44
+ "::#{Regexp.last_match(1).upcase}"
45
+ end.gsub(/(?:^|_)(.)/) { Regexp.last_match(1).upcase }
46
+ end
46
47
 
47
- Fabrication.manager.load_definitions
48
- end
48
+ def find_definitions
49
+ puts 'DEPRECATION WARNING: Fabrication::Support.find_definitions has been replaced ' \
50
+ 'by Fabrication.manager.load_definitions and will be removed in 3.0.0.'
51
+ Fabrication.manager.load_definitions
52
+ end
49
53
 
50
- def hash_class
51
- @hash_class ||= defined?(HashWithIndifferentAccess) ? HashWithIndifferentAccess : Hash
52
- end
54
+ def hash_class
55
+ @hash_class ||= defined?(HashWithIndifferentAccess) ? HashWithIndifferentAccess : Hash
56
+ end
53
57
 
54
- def singularize(string)
55
- string.singularize
56
- rescue StandardError
57
- string.end_with?('s') ? string[0..-2] : string
58
- end
58
+ def singularize(string)
59
+ string.singularize
60
+ rescue StandardError
61
+ string.end_with?('s') ? string[0..-2] : string
62
+ end
59
63
 
60
- def underscore(string)
61
- string.gsub(/::/, '/')
62
- .gsub(/([A-Z]+)([A-Z][a-z])/, '\1_\2')
63
- .gsub(/([a-z\d])([A-Z])/, '\1_\2')
64
- .tr('-', '_')
65
- .downcase
64
+ def underscore(string)
65
+ string.gsub(/::/, '/')
66
+ .gsub(/([A-Z]+)([A-Z][a-z])/, '\1_\2')
67
+ .gsub(/([a-z\d])([A-Z])/, '\1_\2')
68
+ .tr('-', '_')
69
+ .downcase
70
+ end
66
71
  end
67
72
  end
68
73
  end
@@ -1,39 +1,37 @@
1
- require 'singleton'
2
-
3
1
  module Fabrication
4
2
  class Transform
5
- include Singleton
6
-
7
3
  class << self
8
4
  def apply_to(schematic, attributes_hash)
9
5
  Fabrication.manager.load_definitions if Fabrication.manager.empty?
10
- attributes_hash.inject({}) { |h, (k, v)| h.update(k => instance.apply_transform(schematic, k, v)) }
6
+ attributes_hash.inject({}) { |h, (k, v)| h.update(k => apply_transform(schematic, k, v)) }
11
7
  end
12
8
 
13
9
  def clear_all
14
- instance.transforms.clear
15
- instance.overrides.clear
10
+ @transforms = nil
11
+ @overrides = nil
16
12
  end
17
13
 
18
14
  def define(attribute, transform)
19
- instance.transforms[attribute] = transform
15
+ transforms[attribute] = transform
20
16
  end
21
17
 
22
18
  def only_for(schematic, attribute, transform)
23
- instance.overrides[schematic] = (instance.overrides[schematic] || {}).merge!(attribute => transform)
19
+ overrides[schematic] = (overrides[schematic] || {}).merge!(attribute => transform)
24
20
  end
25
- end
26
21
 
27
- def overrides
28
- @overrides ||= {}
29
- end
22
+ private
30
23
 
31
- def apply_transform(schematic, attribute, value)
32
- overrides.fetch(schematic, transforms)[attribute].call(value)
33
- end
24
+ def overrides
25
+ @overrides ||= {}
26
+ end
27
+
28
+ def apply_transform(schematic, attribute, value)
29
+ overrides.fetch(schematic, transforms)[attribute].call(value)
30
+ end
34
31
 
35
- def transforms
36
- @transforms ||= Hash.new(->(value) { value })
32
+ def transforms
33
+ @transforms ||= Hash.new(->(value) { value })
34
+ end
37
35
  end
38
36
  end
39
37
  end
@@ -1,3 +1,3 @@
1
1
  module Fabrication
2
- VERSION = '2.31.0'.freeze
2
+ VERSION = '3.0.0.beta.1'.freeze
3
3
  end
data/lib/fabrication.rb CHANGED
@@ -31,7 +31,7 @@ module Fabrication
31
31
 
32
32
  module Generator
33
33
  autoload :ActiveRecord, 'fabrication/generator/active_record'
34
- autoload :DataMapper, 'fabrication/generator/data_mapper'
34
+ autoload :ActiveRecord4, 'fabrication/generator/active_record_4'
35
35
  autoload :Mongoid, 'fabrication/generator/mongoid'
36
36
  autoload :Sequel, 'fabrication/generator/sequel'
37
37
  autoload :Base, 'fabrication/generator/base'
@@ -39,7 +39,7 @@ module Fabrication
39
39
 
40
40
  def self.clear_definitions
41
41
  manager.clear
42
- Sequencer.clear
42
+ Sequencer.sequences.clear
43
43
  end
44
44
 
45
45
  def self.configure(&block)
@@ -47,12 +47,12 @@ module Fabrication
47
47
  end
48
48
 
49
49
  def self.manager
50
- Fabrication::Schematic::Manager.instance
50
+ @manager ||= Fabrication::Schematic::Manager.instance
51
51
  end
52
52
 
53
53
  def self.schematics
54
- Support.log_deprecation('Fabrication.schematics has been replaced by ' \
55
- 'Fabrication.manager and will be removed in 3.0.0.')
54
+ puts 'DEPRECATION WARNING: Fabrication.schematics has been replaced by '\
55
+ 'Fabrication.manager and will be removed in 3.0.0.'
56
56
  manager
57
57
  end
58
58
  end
@@ -63,7 +63,9 @@ def Fabricator(name, options = {}, &block)
63
63
  end
64
64
 
65
65
  def Fabricate(name, overrides = {}, &block)
66
- Fabricate.create(name, overrides, &block)
66
+ Fabricate.create(name, overrides, &block).tap do |object|
67
+ Fabrication::Cucumber::Fabrications[name] = object if Fabrication::Config.register_with_steps?
68
+ end
67
69
  end
68
70
  # rubocop:enable Naming/MethodName
69
71
 
@@ -8,7 +8,7 @@ module Fabrication
8
8
  end
9
9
 
10
10
  def self.source_root
11
- File.expand_path(File.join(File.dirname(__FILE__), 'templates'))
11
+ @source_root ||= File.expand_path(File.join(File.dirname(__FILE__), 'templates'))
12
12
  end
13
13
  end
14
14
  end
@@ -1,8 +1,6 @@
1
1
  World(FabricationMethods)
2
2
 
3
- Fabrication::Config.register_notifier do |name, object|
4
- Fabrication::Cucumber::Fabrications[name] = object
5
- end
3
+ Fabrication::Config.register_with_steps = true
6
4
 
7
5
  def with_ivars(fabricator)
8
6
  @they = yield fabricator
@@ -19,7 +19,7 @@ module Fabrication
19
19
  end
20
20
 
21
21
  def self.source_root
22
- File.expand_path(File.join(File.dirname(__FILE__), 'templates'))
22
+ @source_root ||= File.expand_path(File.join(File.dirname(__FILE__), 'templates'))
23
23
  end
24
24
 
25
25
  private
@@ -33,8 +33,6 @@ module Fabrication
33
33
  end
34
34
  rescue StandardError
35
35
  # no table? no problem!
36
- rescue LoadError
37
- # cannot find model file. This means it was already destroyed, so just continue.
38
36
  end
39
37
  end
40
38
  end
metadata CHANGED
@@ -1,17 +1,17 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fabrication
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.31.0
4
+ version: 3.0.0.beta.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Paul Elliott
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-11-27 00:00:00.000000000 Z
11
+ date: 2021-04-18 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: Fabrication is an object generation framework for ActiveRecord, Mongoid,
14
- DataMapper, Sequel, or any other Ruby object.
14
+ Sequel, or any other Ruby object.
15
15
  email:
16
16
  - paul@codingfrontier.com
17
17
  executables: []
@@ -32,7 +32,6 @@ files:
32
32
  - lib/fabrication/errors/unknown_fabricator_error.rb
33
33
  - lib/fabrication/generator/active_record.rb
34
34
  - lib/fabrication/generator/base.rb
35
- - lib/fabrication/generator/data_mapper.rb
36
35
  - lib/fabrication/generator/mongoid.rb
37
36
  - lib/fabrication/generator/sequel.rb
38
37
  - lib/fabrication/railtie.rb
@@ -54,14 +53,7 @@ files:
54
53
  homepage: http://fabricationgem.org
55
54
  licenses:
56
55
  - MIT
57
- metadata:
58
- bug_tracker_uri: https://gitlab.com/fabrication-gem/fabrication/-/issues
59
- changelog_uri: https://gitlab.com/fabrication-gem/fabrication/-/blob/master/Changelog.markdown
60
- documentation_uri: https://fabricationgem.org
61
- homepage_uri: https://fabricationgem.org
62
- mailing_list_uri: https://groups.google.com/g/fabricationgem
63
- rubygems_mfa_required: 'true'
64
- source_code_uri: https://gitlab.com/fabrication-gem/fabrication
56
+ metadata: {}
65
57
  post_install_message:
66
58
  rdoc_options: []
67
59
  require_paths:
@@ -70,15 +62,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
70
62
  requirements:
71
63
  - - ">="
72
64
  - !ruby/object:Gem::Version
73
- version: 3.0.0
65
+ version: 2.5.0
74
66
  required_rubygems_version: !ruby/object:Gem::Requirement
75
67
  requirements:
76
- - - ">="
68
+ - - ">"
77
69
  - !ruby/object:Gem::Version
78
- version: '0'
70
+ version: 1.3.1
79
71
  requirements: []
80
- rubygems_version: 3.4.10
72
+ rubygems_version: 3.1.4
81
73
  signing_key:
82
74
  specification_version: 4
83
- summary: Generates object instances for test suites, seed files, etc.
75
+ summary: Implementing the factory pattern in Ruby so you don't have to.
84
76
  test_files: []
@@ -1,19 +0,0 @@
1
- module Fabrication
2
- module Generator
3
- class DataMapper < Fabrication::Generator::Base
4
- def self.supports?(klass)
5
- defined?(::DataMapper) && klass.ancestors.include?(::DataMapper::Hook)
6
- end
7
-
8
- def build_instance
9
- self._instance = resolved_class.new(_attributes)
10
- end
11
-
12
- protected
13
-
14
- def persist
15
- _instance.save
16
- end
17
- end
18
- end
19
- end