From 24d9e21f84eced634b3e443ada2a57621b2b4b9b Mon Sep 17 00:00:00 2001 From: Stan Lo Date: Fri, 7 Jul 2023 18:27:14 +0100 Subject: [PATCH] [ruby/reline] Reduce direct references to `Reline::IOGate` (https://github.com/ruby/reline/pull/566) * Avoid referencing IOGate from IOGate classes The only time those classes being used is when themselves being the IOGate. So when referencing to IOGate, it's better to use `self` instead. * Avoid referencing to IOGate from LineEditor directly * Avoid referencing to IOGate from Core directly * Reference to Reline.core directly * Replace Reline::IOGate with Reline.core.io_gate --- lib/reline.rb | 60 +++++++++++---------- lib/reline/ansi.rb | 2 +- lib/reline/line_editor.rb | 4 ++ test/reline/helper.rb | 4 +- test/reline/test_ansi_with_terminfo.rb | 2 +- test/reline/test_ansi_without_terminfo.rb | 2 +- test/reline/test_config.rb | 4 +- test/reline/test_history.rb | 2 +- test/reline/test_key_actor_emacs.rb | 6 +-- test/reline/test_key_actor_vi.rb | 2 +- test/reline/test_macro.rb | 2 +- test/reline/test_reline.rb | 10 ++-- test/reline/test_string_processing.rb | 2 +- test/reline/test_within_pipe.rb | 6 +-- test/reline/yamatanooroti/test_rendering.rb | 4 +- 15 files changed, 60 insertions(+), 52 deletions(-) diff --git a/lib/reline.rb b/lib/reline.rb index 8da614aa2b6eba..0a2dba4f0d23f3 100644 --- a/lib/reline.rb +++ b/lib/reline.rb @@ -83,8 +83,12 @@ def initialize @bracketed_paste_finished = false end + def io_gate + Reline::IOGate + end + def encoding - Reline::IOGate.encoding + io_gate.encoding end def completion_append_character=(val) @@ -181,16 +185,16 @@ def dialog_proc(name_sym) def input=(val) raise TypeError unless val.respond_to?(:getc) or val.nil? - if val.respond_to?(:getc) && Reline::IOGate.respond_to?(:input=) - Reline::IOGate.input = val + if val.respond_to?(:getc) && io_gate.respond_to?(:input=) + io_gate.input = val end end def output=(val) raise TypeError unless val.respond_to?(:write) or val.nil? @output = val - if Reline::IOGate.respond_to?(:output=) - Reline::IOGate.output = val + if io_gate.respond_to?(:output=) + io_gate.output = val end end @@ -213,7 +217,7 @@ def emacs_editing_mode? end def get_screen_size - Reline::IOGate.get_screen_size + io_gate.get_screen_size end Reline::DEFAULT_DIALOG_PROC_AUTOCOMPLETE = ->() { @@ -267,7 +271,7 @@ def get_screen_size def readmultiline(prompt = '', add_hist = false, &confirm_multiline_termination) Reline.update_iogate - Reline::IOGate.with_raw_input do + io_gate.with_raw_input do unless confirm_multiline_termination raise ArgumentError.new('#readmultiline needs block to confirm multiline termination') end @@ -300,7 +304,7 @@ def readline(prompt = '', add_hist = false) private def inner_readline(prompt, add_hist, multiline, &confirm_multiline_termination) if ENV['RELINE_STDERR_TTY'] - if Reline::IOGate.win? + if io_gate.win? $stderr = File.open(ENV['RELINE_STDERR_TTY'], 'a') else $stderr.reopen(ENV['RELINE_STDERR_TTY'], 'w') @@ -308,7 +312,7 @@ def readline(prompt = '', add_hist = false) $stderr.sync = true $stderr.puts "Reline is used by #{Process.pid}" end - otio = Reline::IOGate.prep + otio = io_gate.prep may_req_ambiguous_char_width line_editor.reset(prompt, encoding: encoding) @@ -335,7 +339,7 @@ def readline(prompt = '', add_hist = false) unless config.test_mode config.read config.reset_default_key_bindings - Reline::IOGate.set_default_key_bindings(config) + io_gate.set_default_key_bindings(config) end line_editor.rerender @@ -344,9 +348,9 @@ def readline(prompt = '', add_hist = false) line_editor.set_signal_handlers prev_pasting_state = false loop do - prev_pasting_state = Reline::IOGate.in_pasting? + prev_pasting_state = io_gate.in_pasting? read_io(config.keyseq_timeout) { |inputs| - line_editor.set_pasting_state(Reline::IOGate.in_pasting?) + line_editor.set_pasting_state(io_gate.in_pasting?) inputs.each { |c| line_editor.input_key(c) line_editor.rerender @@ -356,29 +360,29 @@ def readline(prompt = '', add_hist = false) @bracketed_paste_finished = false end } - if prev_pasting_state == true and not Reline::IOGate.in_pasting? and not line_editor.finished? + if prev_pasting_state == true and not io_gate.in_pasting? and not line_editor.finished? line_editor.set_pasting_state(false) prev_pasting_state = false line_editor.rerender_all end break if line_editor.finished? end - Reline::IOGate.move_cursor_column(0) + io_gate.move_cursor_column(0) rescue Errno::EIO # Maybe the I/O has been closed. rescue StandardError => e line_editor.finalize - Reline::IOGate.deprep(otio) + io_gate.deprep(otio) raise e rescue Exception # Including Interrupt line_editor.finalize - Reline::IOGate.deprep(otio) + io_gate.deprep(otio) raise end line_editor.finalize - Reline::IOGate.deprep(otio) + io_gate.deprep(otio) end # GNU Readline waits for "keyseq-timeout" milliseconds to see if the ESC @@ -393,7 +397,7 @@ def readline(prompt = '', add_hist = false) private def read_io(keyseq_timeout, &block) buffer = [] loop do - c = Reline::IOGate.getc + c = io_gate.getc if c == -1 result = :unmatched @bracketed_paste_finished = true @@ -433,7 +437,7 @@ def readline(prompt = '', add_hist = false) begin succ_c = nil Timeout.timeout(keyseq_timeout / 1000.0) { - succ_c = Reline::IOGate.getc + succ_c = io_gate.getc } rescue Timeout::Error # cancel matching only when first byte block.([Reline::Key.new(c, c, false)]) @@ -448,7 +452,7 @@ def readline(prompt = '', add_hist = false) end return :break when :matching - Reline::IOGate.ungetc(succ_c) + io_gate.ungetc(succ_c) return :next when :matched buffer << succ_c @@ -465,7 +469,7 @@ def readline(prompt = '', add_hist = false) begin escaped_c = nil Timeout.timeout(keyseq_timeout / 1000.0) { - escaped_c = Reline::IOGate.getc + escaped_c = io_gate.getc } rescue Timeout::Error # independent ESC block.([Reline::Key.new(c, c, false)]) @@ -488,19 +492,19 @@ def ambiguous_width end private def may_req_ambiguous_char_width - @ambiguous_width = 2 if Reline::IOGate == Reline::GeneralIO or !STDOUT.tty? + @ambiguous_width = 2 if io_gate == Reline::GeneralIO or !STDOUT.tty? return if defined? @ambiguous_width - Reline::IOGate.move_cursor_column(0) + io_gate.move_cursor_column(0) begin output.write "\u{25bd}" rescue Encoding::UndefinedConversionError # LANG=C @ambiguous_width = 1 else - @ambiguous_width = Reline::IOGate.cursor_pos.x + @ambiguous_width = io_gate.cursor_pos.x end - Reline::IOGate.move_cursor_column(0) - Reline::IOGate.erase_after_cursor + io_gate.move_cursor_column(0) + io_gate.erase_after_cursor end end @@ -576,7 +580,7 @@ def self.core end def self.ungetc(c) - Reline::IOGate.ungetc(c) + core.io_gate.ungetc(c) end def self.line_editor @@ -588,7 +592,7 @@ def self.update_iogate # Need to change IOGate when `$stdout.tty?` change from false to true by `$stdout.reopen` # Example: rails/spring boot the application in non-tty, then run console in tty. - if ENV['TERM'] != 'dumb' && Reline::IOGate == Reline::GeneralIO && $stdout.tty? + if ENV['TERM'] != 'dumb' && core.io_gate == Reline::GeneralIO && $stdout.tty? require 'reline/ansi' remove_const(:IOGate) const_set(:IOGate, Reline::ANSI) diff --git a/lib/reline/ansi.rb b/lib/reline/ansi.rb index 06ea9efd09c68d..1e018d4e82b132 100644 --- a/lib/reline/ansi.rb +++ b/lib/reline/ansi.rb @@ -206,7 +206,7 @@ def self.getc end def self.in_pasting? - @@in_bracketed_paste_mode or (not Reline::IOGate.empty_buffer?) + @@in_bracketed_paste_mode or (not empty_buffer?) end def self.empty_buffer? diff --git a/lib/reline/line_editor.rb b/lib/reline/line_editor.rb index 404a595f9c73cf..40309021392509 100644 --- a/lib/reline/line_editor.rb +++ b/lib/reline/line_editor.rb @@ -60,6 +60,10 @@ def initialize(config, encoding) reset_variables(encoding: encoding) end + def io_gate + Reline::IOGate + end + def set_pasting_state(in_pasting) @in_pasting = in_pasting end diff --git a/test/reline/helper.rb b/test/reline/helper.rb index b8751ff16e0baf..bb2389318739aa 100644 --- a/test/reline/helper.rb +++ b/test/reline/helper.rb @@ -29,8 +29,8 @@ def test_mode(ansi: false) encoding = Encoding::UTF_8 end Reline::GeneralIO.reset(encoding: encoding) unless ansi - send(:core).config.instance_variable_set(:@test_mode, true) - send(:core).config.reset + core.config.instance_variable_set(:@test_mode, true) + core.config.reset end def test_reset diff --git a/test/reline/test_ansi_with_terminfo.rb b/test/reline/test_ansi_with_terminfo.rb index d7f61806a6ed77..1f60f81bd8db48 100644 --- a/test/reline/test_ansi_with_terminfo.rb +++ b/test/reline/test_ansi_with_terminfo.rb @@ -5,7 +5,7 @@ class Reline::ANSI::TestWithTerminfo < Reline::TestCase def setup Reline.send(:test_mode, ansi: true) @config = Reline::Config.new - Reline::IOGate.set_default_key_bindings(@config, allow_terminfo: true) + Reline.core.io_gate.set_default_key_bindings(@config, allow_terminfo: true) end def teardown diff --git a/test/reline/test_ansi_without_terminfo.rb b/test/reline/test_ansi_without_terminfo.rb index 28b929849bbc1f..e3239cf5d889bb 100644 --- a/test/reline/test_ansi_without_terminfo.rb +++ b/test/reline/test_ansi_without_terminfo.rb @@ -5,7 +5,7 @@ class Reline::ANSI::TestWithoutTerminfo < Reline::TestCase def setup Reline.send(:test_mode, ansi: true) @config = Reline::Config.new - Reline::IOGate.set_default_key_bindings(@config, allow_terminfo: false) + Reline.core.io_gate.set_default_key_bindings(@config, allow_terminfo: false) end def teardown diff --git a/test/reline/test_config.rb b/test/reline/test_config.rb index c08d7ba498d3d1..b16aed720a9542 100644 --- a/test/reline/test_config.rb +++ b/test/reline/test_config.rb @@ -85,7 +85,7 @@ def test_string_value_with_parens_and_quotes def test_encoding_is_ascii @config.reset - Reline::IOGate.reset(encoding: Encoding::US_ASCII) + Reline.core.io_gate.reset(encoding: Encoding::US_ASCII) @config = Reline::Config.new assert_equal true, @config.convert_meta @@ -93,7 +93,7 @@ def test_encoding_is_ascii def test_encoding_is_not_ascii @config.reset - Reline::IOGate.reset(encoding: Encoding::UTF_8) + Reline.core.io_gate.reset(encoding: Encoding::UTF_8) @config = Reline::Config.new assert_equal nil, @config.convert_meta diff --git a/test/reline/test_history.rb b/test/reline/test_history.rb index 53360409bc66eb..ddf8fb14726b3b 100644 --- a/test/reline/test_history.rb +++ b/test/reline/test_history.rb @@ -297,7 +297,7 @@ def assert_external_string_equal(expected, actual) end def get_default_internal_encoding - if encoding = Reline::IOGate.encoding + if encoding = Reline.core.encoding encoding elsif RUBY_PLATFORM =~ /mswin|mingw/ Encoding.default_internal || Encoding::UTF_8 diff --git a/test/reline/test_key_actor_emacs.rb b/test/reline/test_key_actor_emacs.rb index 18a2448539997a..4575e51eb20079 100644 --- a/test/reline/test_key_actor_emacs.rb +++ b/test/reline/test_key_actor_emacs.rb @@ -8,7 +8,7 @@ def setup @config.autocompletion = false Reline::HISTORY.instance_variable_set(:@config, @config) Reline::HISTORY.clear - @encoding = Reline::IOGate.encoding + @encoding = Reline.core.encoding @line_editor = Reline::LineEditor.new(@config, @encoding) @line_editor.reset(@prompt, encoding: @encoding) end @@ -2167,7 +2167,7 @@ def test_ed_search_next_history_with_empty # Unicode emoji test def test_ed_insert_for_include_zwj_emoji - omit "This test is for UTF-8 but the locale is #{Reline::IOGate.encoding}" if Reline::IOGate.encoding != Encoding::UTF_8 + omit "This test is for UTF-8 but the locale is #{Reline.core.encoding}" if Reline.core.encoding != Encoding::UTF_8 # U+1F468 U+200D U+1F469 U+200D U+1F467 U+200D U+1F466 is family: man, woman, girl, boy "๐Ÿ‘จโ€๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ฆ" input_keys("\u{1F468}") # U+1F468 is man "๐Ÿ‘จ" assert_line("\u{1F468}") @@ -2213,7 +2213,7 @@ def test_ed_insert_for_include_zwj_emoji end def test_ed_insert_for_include_valiation_selector - omit "This test is for UTF-8 but the locale is #{Reline::IOGate.encoding}" if Reline::IOGate.encoding != Encoding::UTF_8 + omit "This test is for UTF-8 but the locale is #{Reline.core.encoding}" if Reline.core.encoding != Encoding::UTF_8 # U+0030 U+FE00 is DIGIT ZERO + VARIATION SELECTOR-1 "0๏ธ€" input_keys("\u0030") # U+0030 is DIGIT ZERO assert_line("\u0030") diff --git a/test/reline/test_key_actor_vi.rb b/test/reline/test_key_actor_vi.rb index 6e1d9dbbdabeaa..20630e5809783c 100644 --- a/test/reline/test_key_actor_vi.rb +++ b/test/reline/test_key_actor_vi.rb @@ -8,7 +8,7 @@ def setup @config.read_lines(<<~LINES.split(/(?<=\n)/)) set editing-mode vi LINES - @encoding = Reline::IOGate.encoding + @encoding = Reline.core.encoding @line_editor = Reline::LineEditor.new(@config, @encoding) @line_editor.reset(@prompt, encoding: @encoding) end diff --git a/test/reline/test_macro.rb b/test/reline/test_macro.rb index 76a677c8346fd7..3096930830ef96 100644 --- a/test/reline/test_macro.rb +++ b/test/reline/test_macro.rb @@ -4,7 +4,7 @@ class Reline::MacroTest < Reline::TestCase def setup Reline.send(:test_mode) @config = Reline::Config.new - @encoding = Reline::IOGate.encoding + @encoding = Reline.core.encoding @line_editor = Reline::LineEditor.new(@config, @encoding) @line_editor.instance_variable_set(:@screen_size, [24, 80]) @output = @line_editor.output = File.open(IO::NULL, "w") diff --git a/test/reline/test_reline.rb b/test/reline/test_reline.rb index 33387231b46d0c..40c880c11f312c 100644 --- a/test/reline/test_reline.rb +++ b/test/reline/test_reline.rb @@ -285,7 +285,7 @@ def test_set_input_and_output input, to_write = IO.pipe to_read, output = IO.pipe unless Reline.__send__(:input=, input) - omit "Setting to input is not effective on #{Reline::IOGate}" + omit "Setting to input is not effective on #{Reline.core.io_gate}" end Reline.output = output @@ -303,12 +303,12 @@ def test_set_input_and_output def test_vi_editing_mode Reline.vi_editing_mode - assert_equal(Reline::KeyActor::ViInsert, Reline.send(:core).config.editing_mode.class) + assert_equal(Reline::KeyActor::ViInsert, Reline.core.config.editing_mode.class) end def test_emacs_editing_mode Reline.emacs_editing_mode - assert_equal(Reline::KeyActor::Emacs, Reline.send(:core).config.editing_mode.class) + assert_equal(Reline::KeyActor::Emacs, Reline.core.config.editing_mode.class) end def test_add_dialog_proc @@ -374,12 +374,12 @@ def test_read_io def test_dumb_terminal lib = File.expand_path("../../lib", __dir__) - out = IO.popen([{"TERM"=>"dumb"}, Reline.test_rubybin, "-I#{lib}", "-rreline", "-e", "p Reline::IOGate"], &:read) + out = IO.popen([{"TERM"=>"dumb"}, Reline.test_rubybin, "-I#{lib}", "-rreline", "-e", "p Reline.core.io_gate"], &:read) assert_equal("Reline::GeneralIO", out.chomp) end def get_reline_encoding - if encoding = Reline::IOGate.encoding + if encoding = Reline.core.encoding encoding elsif RUBY_PLATFORM =~ /mswin|mingw/ Encoding::UTF_8 diff --git a/test/reline/test_string_processing.rb b/test/reline/test_string_processing.rb index 5db97545da3113..2e5d27dc4fd193 100644 --- a/test/reline/test_string_processing.rb +++ b/test/reline/test_string_processing.rb @@ -6,7 +6,7 @@ def setup @prompt = '> ' @config = Reline::Config.new Reline::HISTORY.instance_variable_set(:@config, @config) - @encoding = Reline::IOGate.encoding + @encoding = Reline.core.encoding @line_editor = Reline::LineEditor.new(@config, @encoding) @line_editor.reset(@prompt, encoding: @encoding) end diff --git a/test/reline/test_within_pipe.rb b/test/reline/test_within_pipe.rb index 930f99c32d818c..a42ca755fce606 100644 --- a/test/reline/test_within_pipe.rb +++ b/test/reline/test_within_pipe.rb @@ -3,14 +3,14 @@ class Reline::WithinPipeTest < Reline::TestCase def setup Reline.send(:test_mode) - @encoding = Reline::IOGate.encoding + @encoding = Reline.core.encoding @input_reader, @writer = IO.pipe(@encoding) Reline.input = @input_reader @reader, @output_writer = IO.pipe(@encoding) @output = Reline.output = @output_writer - @config = Reline.send(:core).config + @config = Reline.core.config @config.keyseq_timeout *= 600 if defined?(RubyVM::RJIT) && RubyVM::RJIT.enabled? # for --jit-wait CI - @line_editor = Reline.send(:core).line_editor + @line_editor = Reline.core.line_editor end def teardown diff --git a/test/reline/yamatanooroti/test_rendering.rb b/test/reline/yamatanooroti/test_rendering.rb index b1a7bf7cdc9428..def14edbe4dc96 100644 --- a/test/reline/yamatanooroti/test_rendering.rb +++ b/test/reline/yamatanooroti/test_rendering.rb @@ -490,7 +490,7 @@ def test_no_escape_sequence_passed_to_dynamic_prompt end def test_enable_bracketed_paste - omit if Reline::IOGate.win? + omit if Reline.core.io_gate.win? write_inputrc <<~LINES set enable-bracketed-paste on LINES @@ -877,7 +877,7 @@ def test_force_enter end def test_with_newline - omit if Reline::IOGate.win? + omit if Reline.core.io_gate.win? cmd = %Q{ruby -e 'print(%Q{abc def \\e\\r})' | ruby -I#{@pwd}/lib -rreline -e 'p Reline.readline(%{> })'} start_terminal(40, 50, ['bash', '-c', cmd]) sleep 1