зеркало из https://github.com/github/ruby.git
[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:
Родитель
73a7e51535
Коммит
4349c7909f
|
@ -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
|
||||
|
|
Загрузка…
Ссылка в новой задаче