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 +4 -4
- data/lib/fabricate.rb +5 -11
- data/lib/fabrication/config.rb +10 -35
- data/lib/fabrication/cucumber/step_fabricator.rb +5 -13
- data/lib/fabrication/generator/active_record.rb +5 -5
- data/lib/fabrication/generator/base.rb +14 -39
- data/lib/fabrication/generator/mongoid.rb +3 -3
- data/lib/fabrication/generator/sequel.rb +9 -21
- data/lib/fabrication/schematic/attribute.rb +2 -2
- data/lib/fabrication/schematic/definition.rb +1 -2
- data/lib/fabrication/schematic/manager.rb +5 -7
- data/lib/fabrication/sequencer.rb +5 -18
- data/lib/fabrication/support.rb +57 -52
- data/lib/fabrication/transform.rb +16 -18
- data/lib/fabrication/version.rb +1 -1
- data/lib/fabrication.rb +8 -6
- data/lib/rails/generators/fabrication/cucumber_steps/cucumber_steps_generator.rb +1 -1
- data/lib/rails/generators/fabrication/cucumber_steps/templates/fabrication_steps.rb +1 -3
- data/lib/rails/generators/fabrication/model/model_generator.rb +1 -3
- metadata +9 -17
- data/lib/fabrication/generator/data_mapper.rb +0 -19
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 20a02618a5107ba5850de6da2bd58ae428d33d8163ab3c71f9233574780998df
|
4
|
+
data.tar.gz: 33bac0b9d796da2d94adf3a8eb8940ff8766c36c9435429a03a1da0dd1efb8ad
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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
|
-
|
3
|
+
count.times.map { Fabricate(name, overrides, &block) }
|
4
4
|
end
|
5
5
|
|
6
6
|
def self.build_times(count, name, overrides = {}, &block)
|
7
|
-
|
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
|
-
|
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.
|
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)
|
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)
|
data/lib/fabrication/config.rb
CHANGED
@@ -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
|
-
|
34
|
-
|
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
|
-
|
44
|
-
|
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
|
-
|
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
|
-
|
91
|
-
include Singleton
|
92
|
-
|
88
|
+
module Fabrications
|
93
89
|
def self.fabrications
|
94
|
-
|
90
|
+
@fabrications ||= {}
|
95
91
|
end
|
96
92
|
|
97
93
|
def self.[](fabricator)
|
98
|
-
|
94
|
+
fabrications[fabricator.to_sym]
|
99
95
|
end
|
100
96
|
|
101
97
|
def self.[]=(fabricator, fabrication)
|
102
|
-
|
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
|
-
|
10
|
-
klass.ancestors.include?(::ActiveRecord::Base)
|
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
|
15
|
-
|
14
|
+
self._instance = if _klass.respond_to?(:protected_attributes)
|
15
|
+
_klass.new(_attributes, without_protection: true)
|
16
16
|
else
|
17
|
-
|
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?(
|
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
|
-
|
28
|
-
|
29
|
-
|
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
|
-
|
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 =
|
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 =
|
62
|
+
self._instance = _klass.new(*callback.call)
|
77
63
|
set_attributes
|
78
64
|
end
|
79
65
|
|
80
66
|
def build_instance
|
81
|
-
self._instance =
|
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(
|
92
|
-
self.
|
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 :
|
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.
|
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
|
10
|
-
|
9
|
+
self._instance = if _klass.respond_to?(:protected_attributes)
|
10
|
+
_klass.new(_attributes, without_protection: true)
|
11
11
|
else
|
12
|
-
|
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) &&
|
10
|
+
defined?(::Sequel) && klass.ancestors.include?(::Sequel::Model)
|
11
11
|
end
|
12
12
|
|
13
13
|
def set_attributes
|
14
|
-
_attributes.each do |
|
15
|
-
if value.is_a?(Array)
|
16
|
-
|
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
|
-
|
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 =
|
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
|
@@ -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
|
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 |
|
59
|
-
|
60
|
-
load
|
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
|
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]
|
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
|
data/lib/fabrication/support.rb
CHANGED
@@ -1,68 +1,73 @@
|
|
1
1
|
module Fabrication
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
end
|
2
|
+
class Support
|
3
|
+
class << self
|
4
|
+
def fabricatable?(name)
|
5
|
+
Fabrication.manager[name] || class_for(name)
|
6
|
+
end
|
8
7
|
|
9
|
-
|
10
|
-
|
11
|
-
|
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
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
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
|
-
|
20
|
-
|
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
|
-
|
23
|
-
|
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
|
-
|
35
|
-
|
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
|
-
|
44
|
-
|
45
|
-
|
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
|
-
|
48
|
-
|
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
|
-
|
51
|
-
|
52
|
-
|
54
|
+
def hash_class
|
55
|
+
@hash_class ||= defined?(HashWithIndifferentAccess) ? HashWithIndifferentAccess : Hash
|
56
|
+
end
|
53
57
|
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
58
|
+
def singularize(string)
|
59
|
+
string.singularize
|
60
|
+
rescue StandardError
|
61
|
+
string.end_with?('s') ? string[0..-2] : string
|
62
|
+
end
|
59
63
|
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
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 =>
|
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
|
-
|
15
|
-
|
10
|
+
@transforms = nil
|
11
|
+
@overrides = nil
|
16
12
|
end
|
17
13
|
|
18
14
|
def define(attribute, transform)
|
19
|
-
|
15
|
+
transforms[attribute] = transform
|
20
16
|
end
|
21
17
|
|
22
18
|
def only_for(schematic, attribute, transform)
|
23
|
-
|
19
|
+
overrides[schematic] = (overrides[schematic] || {}).merge!(attribute => transform)
|
24
20
|
end
|
25
|
-
end
|
26
21
|
|
27
|
-
|
28
|
-
@overrides ||= {}
|
29
|
-
end
|
22
|
+
private
|
30
23
|
|
31
|
-
|
32
|
-
|
33
|
-
|
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
|
-
|
36
|
-
|
32
|
+
def transforms
|
33
|
+
@transforms ||= Hash.new(->(value) { value })
|
34
|
+
end
|
37
35
|
end
|
38
36
|
end
|
39
37
|
end
|
data/lib/fabrication/version.rb
CHANGED
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 :
|
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
|
-
|
55
|
-
|
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
|
|
@@ -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:
|
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:
|
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
|
-
|
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:
|
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:
|
70
|
+
version: 1.3.1
|
79
71
|
requirements: []
|
80
|
-
rubygems_version: 3.4
|
72
|
+
rubygems_version: 3.1.4
|
81
73
|
signing_key:
|
82
74
|
specification_version: 4
|
83
|
-
summary:
|
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
|