Sha256: 83dbe814cfbe112ed7094b44527238fd44b2844dcde116067ad406d4c0b5a24d

Contents?: true

Size: 1.35 KB

Versions: 1

Compression:

Stored size: 1.35 KB

Contents

#!/usr/bin/env ruby
# frozen_string_literal: true

require "bundler/setup"
require "minitest/keyword"

aliases = Hash.new { |hash, key| hash[key] = key }
aliases.merge!(Minitest::Keyword::ALIASES)

source = Minitest::Assertions
source.instance_methods.grep(/^(assert|refute)/).sort.each do |method_name|
  method = source.instance_method(method_name)
  parameters = method.parameters

  next if parameters.empty? || method_name == :assert_send

  iseq = RubyVM::InstructionSequence.of(method).to_a
  opt_index = 0

  values =
    parameters.map do |(parameter_type, parameter_name)|
      name = aliases[parameter_name]

      case parameter_type
      in :req
        "#{name}:"
      in :opt
        stack = []
        iseq[13][iseq[13].index(iseq[11][:opt][opt_index])..].each do |insn|
          case insn
          in Symbol | Integer
            next
          in [:opt_getconstant_path, path]
            stack << path.join("::")
          in [:putobject, object]
            stack << object.inspect
          in [:putnil]
            stack << "nil"
          in [/^setlocal/, Integer]
            break
          end
        end

        opt_index += 1
        "#{name}: #{stack.pop}"
      in :key
        "#{name}: #{iseq[11][:keyword].assoc(parameter_name)[1]}"
      in :rest
        "#{name}: []"
      end
    end

  puts "%-18s %s" % [method_name, values.join(", ")]
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
minitest-keyword-2.0.0 bin/readme