Sha256: b028979805556033ecf14968c0dee9a6da162b94eb023dc9068463b012c58cd2

Contents?: true

Size: 1.07 KB

Versions: 1

Compression:

Stored size: 1.07 KB

Contents

# typed: strict

module Mocktail
  class RedefinesNew
    extend T::Sig

    sig { void }
    def initialize
      @handles_dry_new_call = T.let(HandlesDryNewCall.new, HandlesDryNewCall)
    end

    sig { params(type: T.any(T::Class[T.anything], Module)).void }
    def redefine(type)
      type_replacement = TopShelf.instance.type_replacement_for(type)

      if type_replacement.replacement_new.nil?
        type_replacement.original_new = type.method(:new)
        type.singleton_class.send(:undef_method, :new)
        handles_dry_new_call = @handles_dry_new_call
        type.define_singleton_method :new, ->(*args, **kwargs, &block) {
          if TopShelf.instance.new_replaced?(type) ||
              (type.is_a?(Class) && TopShelf.instance.of_next_registered?(type))
            handles_dry_new_call.handle(T.cast(type, T::Class[T.all(T, Object)]), args, kwargs, block)
          else
            type_replacement.original_new.call(*args, **kwargs, &block)
          end
        }
        type_replacement.replacement_new = type.singleton_method(:new)
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
mocktail-2.0.0 lib/mocktail/sorbet/mocktail/replaces_type/redefines_new.rb