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
         |