fabrication 2.28.0 → 2.29.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.
- checksums.yaml +4 -4
- data/lib/fabrication/config.rb +18 -8
- data/lib/fabrication/cucumber/step_fabricator.rb +12 -4
- data/lib/fabrication/generator/active_record.rb +3 -3
- data/lib/fabrication/generator/base.rb +14 -6
- data/lib/fabrication/generator/data_mapper.rb +1 -1
- data/lib/fabrication/generator/mongoid.rb +3 -3
- data/lib/fabrication/generator/sequel.rb +2 -2
- data/lib/fabrication/schematic/attribute.rb +2 -2
- data/lib/fabrication/sequencer.rb +16 -3
- data/lib/fabrication/support.rb +51 -62
- data/lib/fabrication/transform.rb +18 -16
- data/lib/fabrication/version.rb +1 -1
- data/lib/fabrication.rb +4 -5
- data/lib/rails/generators/fabrication/cucumber_steps/cucumber_steps_generator.rb +1 -1
- data/lib/rails/generators/fabrication/model/model_generator.rb +1 -1
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c81aec7d3bdf1fd43d6b18d57edeb83b408f099eb403eb31b2caa17c715fa32e
|
4
|
+
data.tar.gz: 5945e9f77ced15f5de56749ae48c3b6f121ae4e3d941784ada4640d774957a08
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 85ae12f9d4e95529411053591e8b80792afd639a32c9de705859f259e3c97725bb3b146c736381ec00a9b1daa16dd678466babc883e2eba797f50322deeac20b
|
7
|
+
data.tar.gz: cb07e8bf44438241f9500654755f2b350b5646b8e4fbf24b1d840147ffb074103e11bf230ca7e03d92f77c1d2c26d30ab292b70f96186e11a8098f7c230595f8
|
data/lib/fabrication/config.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'logger'
|
2
|
+
|
1
3
|
module Fabrication
|
2
4
|
module Config
|
3
5
|
extend self
|
@@ -14,14 +16,22 @@ module Fabrication
|
|
14
16
|
nil
|
15
17
|
end
|
16
18
|
|
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
|
+
|
17
27
|
def fabricator_path
|
18
28
|
@fabricator_path ||= ['test/fabricators', 'spec/fabricators']
|
19
29
|
end
|
20
30
|
alias fabricator_paths fabricator_path
|
21
31
|
|
22
32
|
def fabricator_dir
|
23
|
-
|
24
|
-
|
33
|
+
Support.log_deprecation('Fabrication::Config.fabricator_dir has been ' \
|
34
|
+
'replaced by Fabrication::Config.fabricator_path')
|
25
35
|
fabricator_path
|
26
36
|
end
|
27
37
|
|
@@ -30,13 +40,11 @@ module Fabrication
|
|
30
40
|
end
|
31
41
|
|
32
42
|
def fabricator_dir=(folders)
|
33
|
-
|
34
|
-
|
43
|
+
Support.log_deprecation('Fabrication::Config.fabricator_dir has been ' \
|
44
|
+
'replaced by Fabrication::Config.fabricator_path')
|
35
45
|
self.fabricator_path = folders
|
36
46
|
end
|
37
47
|
|
38
|
-
attr_writer :sequence_start
|
39
|
-
|
40
48
|
def sequence_start
|
41
49
|
@sequence_start ||= 0
|
42
50
|
end
|
@@ -67,8 +75,10 @@ module Fabrication
|
|
67
75
|
end
|
68
76
|
|
69
77
|
def register_with_steps=(value)
|
70
|
-
|
71
|
-
|
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
|
+
)
|
72
82
|
|
73
83
|
return unless value
|
74
84
|
|
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'singleton'
|
2
|
+
|
1
3
|
module Fabrication
|
2
4
|
module Cucumber
|
3
5
|
class StepFabricator
|
@@ -85,17 +87,23 @@ module Fabrication
|
|
85
87
|
end
|
86
88
|
end
|
87
89
|
|
88
|
-
|
90
|
+
class Fabrications
|
91
|
+
include Singleton
|
92
|
+
|
89
93
|
def self.fabrications
|
90
|
-
|
94
|
+
instance.fabrications
|
91
95
|
end
|
92
96
|
|
93
97
|
def self.[](fabricator)
|
94
|
-
fabrications[fabricator.to_sym]
|
98
|
+
instance.fabrications[fabricator.to_sym]
|
95
99
|
end
|
96
100
|
|
97
101
|
def self.[]=(fabricator, fabrication)
|
98
|
-
fabrications[fabricator.to_sym] = fabrication
|
102
|
+
instance.fabrications[fabricator.to_sym] = fabrication
|
103
|
+
end
|
104
|
+
|
105
|
+
def fabrications
|
106
|
+
@fabrications ||= {}
|
99
107
|
end
|
100
108
|
end
|
101
109
|
end
|
@@ -11,10 +11,10 @@ module Fabrication
|
|
11
11
|
end
|
12
12
|
|
13
13
|
def build_instance
|
14
|
-
self._instance = if
|
15
|
-
|
14
|
+
self._instance = if resolved_class.respond_to?(:protected_attributes)
|
15
|
+
resolved_class.new(_attributes, without_protection: true)
|
16
16
|
else
|
17
|
-
|
17
|
+
resolved_class.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?(_resolved_class)
|
5
5
|
true
|
6
6
|
end
|
7
7
|
|
@@ -59,12 +59,12 @@ module Fabrication
|
|
59
59
|
end
|
60
60
|
|
61
61
|
def build_instance_with_init_callback(callback)
|
62
|
-
self._instance =
|
62
|
+
self._instance = resolved_class.new(*callback.call(_transient_attributes))
|
63
63
|
set_attributes
|
64
64
|
end
|
65
65
|
|
66
66
|
def build_instance
|
67
|
-
self._instance =
|
67
|
+
self._instance = resolved_class.new
|
68
68
|
set_attributes
|
69
69
|
end
|
70
70
|
|
@@ -74,8 +74,8 @@ module Fabrication
|
|
74
74
|
end
|
75
75
|
end
|
76
76
|
|
77
|
-
def initialize(
|
78
|
-
self.
|
77
|
+
def initialize(resolved_class)
|
78
|
+
self.resolved_class = resolved_class
|
79
79
|
end
|
80
80
|
|
81
81
|
def respond_to_missing?(method_name, _include_private = false)
|
@@ -86,9 +86,17 @@ module Fabrication
|
|
86
86
|
_attributes.fetch(method_name) { super }
|
87
87
|
end
|
88
88
|
|
89
|
+
def _klass
|
90
|
+
Fabrication::Support.log_deprecation(
|
91
|
+
'The `_klass` method in fabricator definitions has been replaced by `resolved_class`'
|
92
|
+
)
|
93
|
+
|
94
|
+
resolved_class
|
95
|
+
end
|
96
|
+
|
89
97
|
protected
|
90
98
|
|
91
|
-
attr_accessor :
|
99
|
+
attr_accessor :resolved_class, :_instance, :_transient_attributes
|
92
100
|
|
93
101
|
def _attributes
|
94
102
|
@_attributes ||= {}
|
@@ -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 resolved_class.respond_to?(:protected_attributes)
|
10
|
+
resolved_class.new(_attributes, without_protection: true)
|
11
11
|
else
|
12
|
-
|
12
|
+
resolved_class.new(_attributes)
|
13
13
|
end
|
14
14
|
end
|
15
15
|
end
|
@@ -12,7 +12,7 @@ module Fabrication
|
|
12
12
|
|
13
13
|
def set_attributes
|
14
14
|
_attributes.each do |key, value|
|
15
|
-
if (reflection =
|
15
|
+
if (reflection = resolved_class.association_reflections[key]) && value.is_a?(Array)
|
16
16
|
_instance.associations[key] = value
|
17
17
|
_instance.after_save_hook do
|
18
18
|
value.each { |o| _instance.send(reflection.add_method, o) }
|
@@ -30,7 +30,7 @@ module Fabrication
|
|
30
30
|
private
|
31
31
|
|
32
32
|
def load_instance_hooks
|
33
|
-
klass =
|
33
|
+
klass = resolved_class.respond_to?(:cti_base_model) ? resolved_class.cti_models.first : resolved_class
|
34
34
|
klass.plugin :instance_hooks unless klass.new.respond_to? :after_save_hook
|
35
35
|
end
|
36
36
|
end
|
@@ -1,8 +1,21 @@
|
|
1
|
+
require 'singleton'
|
2
|
+
|
1
3
|
module Fabrication
|
2
4
|
class Sequencer
|
5
|
+
include Singleton
|
6
|
+
|
3
7
|
DEFAULT = :_default
|
4
8
|
|
5
9
|
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)
|
6
19
|
idx = sequences[name] ||= start || Fabrication::Config.sequence_start
|
7
20
|
if block
|
8
21
|
sequence_blocks[name] = block.to_proc
|
@@ -13,15 +26,15 @@ module Fabrication
|
|
13
26
|
end
|
14
27
|
end
|
15
28
|
|
16
|
-
def
|
29
|
+
def sequences
|
17
30
|
@sequences ||= {}
|
18
31
|
end
|
19
32
|
|
20
|
-
def
|
33
|
+
def sequence_blocks
|
21
34
|
@sequence_blocks ||= {}
|
22
35
|
end
|
23
36
|
|
24
|
-
def
|
37
|
+
def reset
|
25
38
|
Fabrication::Config.sequence_start = nil
|
26
39
|
@sequences = nil
|
27
40
|
@sequence_blocks = nil
|
data/lib/fabrication/support.rb
CHANGED
@@ -1,79 +1,68 @@
|
|
1
1
|
module Fabrication
|
2
|
-
|
3
|
-
|
4
|
-
def fabricatable?(name)
|
5
|
-
Fabrication.manager[name] || class_for(name)
|
6
|
-
end
|
2
|
+
module Support
|
3
|
+
extend self
|
7
4
|
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
rescue NameError => e
|
12
|
-
raise Fabrication::UnfabricatableError.new(class_or_to_s, e)
|
13
|
-
end
|
5
|
+
def fabricatable?(name)
|
6
|
+
Fabrication.manager[name] || class_for(name)
|
7
|
+
end
|
14
8
|
|
15
|
-
|
16
|
-
|
17
|
-
|
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)
|
9
|
+
def log_deprecation(message)
|
10
|
+
Config.logger.warn("[DEPRECATION][fabrication] #{message}")
|
11
|
+
end
|
26
12
|
|
27
|
-
|
28
|
-
|
29
|
-
|
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
|
30
18
|
|
31
|
-
|
32
|
-
|
33
|
-
constant.const_get(name, false)
|
34
|
-
end
|
35
|
-
end
|
36
|
-
end
|
19
|
+
def constantize(camel_cased_word)
|
20
|
+
return camel_cased_word if camel_cased_word.is_a?(Class)
|
37
21
|
|
38
|
-
|
39
|
-
|
22
|
+
camel_cased_word.to_s.split('::').reduce(Object) do |resolved_class, class_part|
|
23
|
+
resolved_class.const_get(class_part)
|
40
24
|
end
|
25
|
+
end
|
41
26
|
|
42
|
-
|
43
|
-
|
27
|
+
def extract_options!(args)
|
28
|
+
args.last.is_a?(::Hash) ? args.pop : {}
|
29
|
+
end
|
44
30
|
|
45
|
-
|
46
|
-
|
47
|
-
else
|
48
|
-
name_string.gsub(%r{/(.?)}) do
|
49
|
-
"::#{Regexp.last_match(1).upcase}"
|
50
|
-
end.gsub(/(?:^|_)(.)/) { Regexp.last_match(1).upcase }
|
51
|
-
end
|
52
|
-
end
|
31
|
+
def variable_name_to_class_name(name)
|
32
|
+
name_string = name.to_s
|
53
33
|
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
34
|
+
if name_string.respond_to?(:camelize)
|
35
|
+
name_string.camelize
|
36
|
+
else
|
37
|
+
name_string.gsub(%r{/(.?)}) do
|
38
|
+
"::#{Regexp.last_match(1).upcase}"
|
39
|
+
end.gsub(/(?:^|_)(.)/) { Regexp.last_match(1).upcase }
|
58
40
|
end
|
41
|
+
end
|
59
42
|
|
60
|
-
|
61
|
-
|
62
|
-
|
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.')
|
63
46
|
|
64
|
-
|
65
|
-
|
66
|
-
rescue StandardError
|
67
|
-
string.end_with?('s') ? string[0..-2] : string
|
68
|
-
end
|
47
|
+
Fabrication.manager.load_definitions
|
48
|
+
end
|
69
49
|
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
50
|
+
def hash_class
|
51
|
+
@hash_class ||= defined?(HashWithIndifferentAccess) ? HashWithIndifferentAccess : Hash
|
52
|
+
end
|
53
|
+
|
54
|
+
def singularize(string)
|
55
|
+
string.singularize
|
56
|
+
rescue StandardError
|
57
|
+
string.end_with?('s') ? string[0..-2] : string
|
58
|
+
end
|
59
|
+
|
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
|
77
66
|
end
|
78
67
|
end
|
79
68
|
end
|
@@ -1,37 +1,39 @@
|
|
1
|
+
require 'singleton'
|
2
|
+
|
1
3
|
module Fabrication
|
2
4
|
class Transform
|
5
|
+
include Singleton
|
6
|
+
|
3
7
|
class << self
|
4
8
|
def apply_to(schematic, attributes_hash)
|
5
9
|
Fabrication.manager.load_definitions if Fabrication.manager.empty?
|
6
|
-
attributes_hash.inject({}) { |h, (k, v)| h.update(k => apply_transform(schematic, k, v)) }
|
10
|
+
attributes_hash.inject({}) { |h, (k, v)| h.update(k => instance.apply_transform(schematic, k, v)) }
|
7
11
|
end
|
8
12
|
|
9
13
|
def clear_all
|
10
|
-
|
11
|
-
|
14
|
+
instance.transforms.clear
|
15
|
+
instance.overrides.clear
|
12
16
|
end
|
13
17
|
|
14
18
|
def define(attribute, transform)
|
15
|
-
transforms[attribute] = transform
|
19
|
+
instance.transforms[attribute] = transform
|
16
20
|
end
|
17
21
|
|
18
22
|
def only_for(schematic, attribute, transform)
|
19
|
-
overrides[schematic] = (overrides[schematic] || {}).merge!(attribute => transform)
|
23
|
+
instance.overrides[schematic] = (instance.overrides[schematic] || {}).merge!(attribute => transform)
|
20
24
|
end
|
25
|
+
end
|
21
26
|
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
@overrides ||= {}
|
26
|
-
end
|
27
|
+
def overrides
|
28
|
+
@overrides ||= {}
|
29
|
+
end
|
27
30
|
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
+
def apply_transform(schematic, attribute, value)
|
32
|
+
overrides.fetch(schematic, transforms)[attribute].call(value)
|
33
|
+
end
|
31
34
|
|
32
|
-
|
33
|
-
|
34
|
-
end
|
35
|
+
def transforms
|
36
|
+
@transforms ||= Hash.new(->(value) { value })
|
35
37
|
end
|
36
38
|
end
|
37
39
|
end
|
data/lib/fabrication/version.rb
CHANGED
data/lib/fabrication.rb
CHANGED
@@ -31,7 +31,6 @@ module Fabrication
|
|
31
31
|
|
32
32
|
module Generator
|
33
33
|
autoload :ActiveRecord, 'fabrication/generator/active_record'
|
34
|
-
autoload :ActiveRecord4, 'fabrication/generator/active_record_4'
|
35
34
|
autoload :DataMapper, 'fabrication/generator/data_mapper'
|
36
35
|
autoload :Mongoid, 'fabrication/generator/mongoid'
|
37
36
|
autoload :Sequel, 'fabrication/generator/sequel'
|
@@ -40,7 +39,7 @@ module Fabrication
|
|
40
39
|
|
41
40
|
def self.clear_definitions
|
42
41
|
manager.clear
|
43
|
-
Sequencer.
|
42
|
+
Sequencer.clear
|
44
43
|
end
|
45
44
|
|
46
45
|
def self.configure(&block)
|
@@ -48,12 +47,12 @@ module Fabrication
|
|
48
47
|
end
|
49
48
|
|
50
49
|
def self.manager
|
51
|
-
|
50
|
+
Fabrication::Schematic::Manager.instance
|
52
51
|
end
|
53
52
|
|
54
53
|
def self.schematics
|
55
|
-
|
56
|
-
|
54
|
+
Support.log_deprecation('Fabrication.schematics has been replaced by '\
|
55
|
+
'Fabrication.manager and will be removed in 3.0.0.')
|
57
56
|
manager
|
58
57
|
end
|
59
58
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fabrication
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.29.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Paul Elliott
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-
|
11
|
+
date: 2022-06-22 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: Fabrication is an object generation framework for ActiveRecord, Mongoid,
|
14
14
|
DataMapper, Sequel, or any other Ruby object.
|
@@ -70,7 +70,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
70
70
|
requirements:
|
71
71
|
- - ">="
|
72
72
|
- !ruby/object:Gem::Version
|
73
|
-
version: 2.
|
73
|
+
version: 2.7.0
|
74
74
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
75
75
|
requirements:
|
76
76
|
- - ">="
|