class DuckTesting::YARD::Builder

Public Class Methods

new(class_object) click to toggle source

@param class_object [DuckTesting::YARD::ClassObject]

# File lib/duck_testing/yard/builder.rb, line 5
def initialize(class_object)
  @class_object = class_object
end

Public Instance Methods

build(scope = :instance) click to toggle source

Build duck testing for the ‘@class_object`.

@param scope [Symbol] ‘:instance` or `:class` @return [Module] duck testing module of `class_object` in the `scope`.

# File lib/duck_testing/yard/builder.rb, line 13
def build(scope = :instance)
  @building_module = prepare_module
  @class_object.method_objects.each do |method_object|
    next unless method_object.scope == scope
    handle_method_object(method_object)
  end
  @building_module
ensure
  remove_instance_variable :@building_module
end

Private Instance Methods

__dk_test_keyword_parameters(tester, method_object, hash_parameter) click to toggle source
# File lib/duck_testing/yard/builder.rb, line 41
def __dk_test_keyword_parameters(tester, method_object, hash_parameter)
  method_object.keyword_parameters.each do |method_parameter|
    next unless hash_parameter.key?(method_parameter.key_name)
    tester.test_param(
      hash_parameter[method_parameter.key_name],
      method_parameter.expected_types
    )
  end
end
__dk_test_normal_parameters(tester, method_object, parameters) click to toggle source
# File lib/duck_testing/yard/builder.rb, line 32
def __dk_test_normal_parameters(tester, method_object, parameters)
  parameters.each_with_index do |parameter, index|
    tester.test_param(
      parameter,
      method_object.method_parameters[index].expected_types
    )
  end
end
handle_method_object(method_object) click to toggle source

@param method_object [DuckTesting::YARD::MethodObject]

Calls superclass method
# File lib/duck_testing/yard/builder.rb, line 54
def handle_method_object(method_object)
  @building_module.module_eval do
    define_method method_object.name do |*parameters|
      tester = DuckTesting::Tester.new(self, method_object.name)
      if method_object.keyword_parameters.any? && parameters.last.is_a?(Hash)
        __dk_test_normal_parameters(tester, method_object, parameters[0...-1])
        __dk_test_keyword_parameters(tester, method_object, parameters.last)
      else
        __dk_test_normal_parameters(tester, method_object, parameters)
      end
      tester.test_return(super(*parameters), method_object.expected_return_types)
    end
  end
end
prepare_module() click to toggle source

rubocop:disable Lint/NestedMethodDefinition, Metrics/AbcSize

# File lib/duck_testing/yard/builder.rb, line 28
def prepare_module
  Module.new do
    private

    def __dk_test_normal_parameters(tester, method_object, parameters)
      parameters.each_with_index do |parameter, index|
        tester.test_param(
          parameter,
          method_object.method_parameters[index].expected_types
        )
      end
    end

    def __dk_test_keyword_parameters(tester, method_object, hash_parameter)
      method_object.keyword_parameters.each do |method_parameter|
        next unless hash_parameter.key?(method_parameter.key_name)
        tester.test_param(
          hash_parameter[method_parameter.key_name],
          method_parameter.expected_types
        )
      end
    end
  end
end