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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: df854c441daf0accdb476682c98e8dcc2fab18fe239d182ccfe2946e16995921
4
- data.tar.gz: d6cf1bfa72594c9255243643eed956f97af1fd976bb8768fe458410f54e4d1dd
3
+ metadata.gz: c81aec7d3bdf1fd43d6b18d57edeb83b408f099eb403eb31b2caa17c715fa32e
4
+ data.tar.gz: 5945e9f77ced15f5de56749ae48c3b6f121ae4e3d941784ada4640d774957a08
5
5
  SHA512:
6
- metadata.gz: 4783af273421b7799092a0bcc75c86a66d8f85f22a98d18354935010ccabc4a8fd32aa0eef5c814bab7257ff29cfef8db3e58160016d04a6f77b1480b92a80f9
7
- data.tar.gz: 6fdec94bac094143b78d8135b56219c8e2faaa9136035fc1dcd309e0d7b44978991c12664ae422722debadb13ffe4c2396cde01e3e384c495d08d29fb869fa8b
6
+ metadata.gz: 85ae12f9d4e95529411053591e8b80792afd639a32c9de705859f259e3c97725bb3b146c736381ec00a9b1daa16dd678466babc883e2eba797f50322deeac20b
7
+ data.tar.gz: cb07e8bf44438241f9500654755f2b350b5646b8e4fbf24b1d840147ffb074103e11bf230ca7e03d92f77c1d2c26d30ab292b70f96186e11a8098f7c230595f8
@@ -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
- puts 'DEPRECATION WARNING: Fabrication::Config.fabricator_dir has been ' \
24
- 'replaced by Fabrication::Config.fabricator_path'
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
- puts 'DEPRECATION WARNING: Fabrication::Config.fabricator_dir has been ' \
34
- 'replaced by Fabrication::Config.fabricator_path'
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
- puts 'DEPRECATION WARNING: Fabrication::Config.register_with_steps has been ' \
71
- 'deprecated. Please regenerate your cucumber steps with `rails g fabrication:cucumber_steps'
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
- module Fabrications
90
+ class Fabrications
91
+ include Singleton
92
+
89
93
  def self.fabrications
90
- @fabrications ||= {}
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 _klass.respond_to?(:protected_attributes)
15
- _klass.new(_attributes, without_protection: true)
14
+ self._instance = if resolved_class.respond_to?(:protected_attributes)
15
+ resolved_class.new(_attributes, without_protection: true)
16
16
  else
17
- _klass.new(_attributes)
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?(_klass)
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 = _klass.new(*callback.call(_transient_attributes))
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 = _klass.new
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(klass)
78
- self._klass = klass
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 :_klass, :_instance, :_transient_attributes
99
+ attr_accessor :resolved_class, :_instance, :_transient_attributes
92
100
 
93
101
  def _attributes
94
102
  @_attributes ||= {}
@@ -6,7 +6,7 @@ module Fabrication
6
6
  end
7
7
 
8
8
  def build_instance
9
- self._instance = _klass.new(_attributes)
9
+ self._instance = resolved_class.new(_attributes)
10
10
  end
11
11
 
12
12
  protected
@@ -6,10 +6,10 @@ module Fabrication
6
6
  end
7
7
 
8
8
  def build_instance
9
- self._instance = if _klass.respond_to?(:protected_attributes)
10
- _klass.new(_attributes, without_protection: true)
9
+ self._instance = if resolved_class.respond_to?(:protected_attributes)
10
+ resolved_class.new(_attributes, without_protection: true)
11
11
  else
12
- _klass.new(_attributes)
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 = _klass.association_reflections[key]) && value.is_a?(Array)
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 = _klass.respond_to?(:cti_base_model) ? _klass.cti_models.first : _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
@@ -43,8 +43,8 @@ module Fabrication
43
43
 
44
44
  private
45
45
 
46
- def execute(*args, &block)
47
- Fabrication::Schematic::Runner.new(klass).instance_exec(*args, &block)
46
+ def execute(...)
47
+ Fabrication::Schematic::Runner.new(klass).instance_exec(...)
48
48
  end
49
49
 
50
50
  def process_count
@@ -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 self.sequences
29
+ def sequences
17
30
  @sequences ||= {}
18
31
  end
19
32
 
20
- def self.sequence_blocks
33
+ def sequence_blocks
21
34
  @sequence_blocks ||= {}
22
35
  end
23
36
 
24
- def self.reset
37
+ def reset
25
38
  Fabrication::Config.sequence_start = nil
26
39
  @sequences = nil
27
40
  @sequence_blocks = nil
@@ -1,79 +1,68 @@
1
1
  module Fabrication
2
- class Support
3
- class << self
4
- def fabricatable?(name)
5
- Fabrication.manager[name] || class_for(name)
6
- end
2
+ module Support
3
+ extend self
7
4
 
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
5
+ def fabricatable?(name)
6
+ Fabrication.manager[name] || class_for(name)
7
+ end
14
8
 
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)
9
+ def log_deprecation(message)
10
+ Config.logger.warn("[DEPRECATION][fabrication] #{message}")
11
+ end
26
12
 
27
- constant = constant.ancestors.inject do |const, ancestor|
28
- break const if ancestor == Object
29
- break ancestor if ancestor.const_defined?(name, false)
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
- const
32
- end
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
- def extract_options!(args)
39
- args.last.is_a?(::Hash) ? args.pop : {}
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
- def variable_name_to_class_name(name)
43
- name_string = name.to_s
27
+ def extract_options!(args)
28
+ args.last.is_a?(::Hash) ? args.pop : {}
29
+ end
44
30
 
45
- if name_string.respond_to?(:camelize)
46
- name_string.camelize
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
- def find_definitions
55
- puts 'DEPRECATION WARNING: Fabrication::Support.find_definitions has been replaced ' \
56
- 'by Fabrication.manager.load_definitions and will be removed in 3.0.0.'
57
- Fabrication.manager.load_definitions
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
- def hash_class
61
- @hash_class ||= defined?(HashWithIndifferentAccess) ? HashWithIndifferentAccess : Hash
62
- end
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
- def singularize(string)
65
- string.singularize
66
- rescue StandardError
67
- string.end_with?('s') ? string[0..-2] : string
68
- end
47
+ Fabrication.manager.load_definitions
48
+ end
69
49
 
70
- def underscore(string)
71
- string.gsub(/::/, '/')
72
- .gsub(/([A-Z]+)([A-Z][a-z])/, '\1_\2')
73
- .gsub(/([a-z\d])([A-Z])/, '\1_\2')
74
- .tr('-', '_')
75
- .downcase
76
- end
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
- @transforms = nil
11
- @overrides = nil
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
- private
23
-
24
- def overrides
25
- @overrides ||= {}
26
- end
27
+ def overrides
28
+ @overrides ||= {}
29
+ end
27
30
 
28
- def apply_transform(schematic, attribute, value)
29
- overrides.fetch(schematic, transforms)[attribute].call(value)
30
- end
31
+ def apply_transform(schematic, attribute, value)
32
+ overrides.fetch(schematic, transforms)[attribute].call(value)
33
+ end
31
34
 
32
- def transforms
33
- @transforms ||= Hash.new(->(value) { value })
34
- end
35
+ def transforms
36
+ @transforms ||= Hash.new(->(value) { value })
35
37
  end
36
38
  end
37
39
  end
@@ -1,3 +1,3 @@
1
1
  module Fabrication
2
- VERSION = '2.28.0'.freeze
2
+ VERSION = '2.29.0'.freeze
3
3
  end
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.sequences.clear
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
- @manager ||= Fabrication::Schematic::Manager.instance
50
+ Fabrication::Schematic::Manager.instance
52
51
  end
53
52
 
54
53
  def self.schematics
55
- puts 'DEPRECATION WARNING: Fabrication.schematics has been replaced by '\
56
- 'Fabrication.manager and will be removed in 3.0.0.'
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
@@ -8,7 +8,7 @@ module Fabrication
8
8
  end
9
9
 
10
10
  def self.source_root
11
- @source_root ||= File.expand_path(File.join(File.dirname(__FILE__), 'templates'))
11
+ File.expand_path(File.join(File.dirname(__FILE__), 'templates'))
12
12
  end
13
13
  end
14
14
  end
@@ -19,7 +19,7 @@ module Fabrication
19
19
  end
20
20
 
21
21
  def self.source_root
22
- @source_root ||= File.expand_path(File.join(File.dirname(__FILE__), 'templates'))
22
+ File.expand_path(File.join(File.dirname(__FILE__), 'templates'))
23
23
  end
24
24
 
25
25
  private
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.28.0
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-03-29 00:00:00.000000000 Z
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.6.0
73
+ version: 2.7.0
74
74
  required_rubygems_version: !ruby/object:Gem::Requirement
75
75
  requirements:
76
76
  - - ">="