[ruby/irb] Memoize helper method instances with Singleton module

(https://github.com/ruby/irb/pull/931)

Some helpers, like Rails console's `app`, requires memoization of the
helper's ivars. To support it IRB needs to memoize helper method instances
as well.

https://github.com/ruby/irb/commit/a96c7a6668
This commit is contained in:
Stan Lo 2024-04-25 02:32:51 +08:00 коммит произвёл git
Родитель 73a7e51535
Коммит 4349c7909f
3 изменённых файлов: 33 добавлений и 4 удалений

Просмотреть файл

@ -1,6 +1,10 @@
require "singleton"
module IRB
module HelperMethod
class Base
include Singleton
class << self
def description(description = nil)
@description = description if description

Просмотреть файл

@ -179,7 +179,7 @@ EOF
def self.install_helper_methods
HelperMethod.helper_methods.each do |name, helper_method_class|
define_method name do |*args, **opts, &block|
helper_method_class.new.execute(*args, **opts, &block)
helper_method_class.instance.execute(*args, **opts, &block)
end unless method_defined?(name)
end
end

Просмотреть файл

@ -97,13 +97,38 @@ module TestIRB
RUBY
output = run_ruby_file do
type <<~INPUT
my_helper
INPUT
type "my_helper"
type "exit"
end
assert_include(output, 'Hello from MyHelper')
end
def test_helper_method_instances_are_memoized
write_ruby <<~RUBY
require "irb/helper_method"
class MyHelper < IRB::HelperMethod::Base
description "This is a test helper"
def execute(val)
@val ||= val
end
end
IRB::HelperMethod.register(:my_helper, MyHelper)
binding.irb
RUBY
output = run_ruby_file do
type "my_helper(100)"
type "my_helper(200)"
type "exit"
end
assert_include(output, '=> 100')
assert_not_include(output, '=> 200')
end
end
end