This is an automated email from the ASF dual-hosted git repository.

vjasani pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/hbase.git


The following commit(s) were added to refs/heads/master by this push:
     new b316753e184 HBASE-30065: Address existing Rubocop errors/warning 
(#8041)
b316753e184 is described below

commit b316753e1844a22bc40fb40b3bf241c0da320d37
Author: Hari Krishna Dara <[email protected]>
AuthorDate: Thu Apr 9 21:04:30 2026 +0530

    HBASE-30065: Address existing Rubocop errors/warning (#8041)
    
    Signed-off-by: Viraj Jasani <[email protected]>
---
 hbase-shell/src/main/ruby/hbase/hbase.rb           |  10 +-
 hbase-shell/src/main/ruby/hbase_constants.rb       | 156 +++++++++++----------
 hbase-shell/src/main/ruby/irb/hirb.rb              |   4 +-
 hbase-shell/src/main/ruby/jar-bootstrap.rb         |   4 +-
 hbase-shell/src/main/ruby/shell.rb                 | 113 ++++++++-------
 hbase-shell/src/main/ruby/shell/commands.rb        |  76 +++++-----
 .../src/test/ruby/shell/general_test_cluster.rb    |   2 +-
 .../test/ruby/shell/noninteractive_test_cluster.rb |   2 +-
 hbase-shell/src/test/ruby/test_helper.rb           |   2 +-
 9 files changed, 191 insertions(+), 178 deletions(-)

diff --git a/hbase-shell/src/main/ruby/hbase/hbase.rb 
b/hbase-shell/src/main/ruby/hbase/hbase.rb
index a9b35ed1de2..3c4b3ea42c8 100644
--- a/hbase-shell/src/main/ruby/hbase/hbase.rb
+++ b/hbase-shell/src/main/ruby/hbase/hbase.rb
@@ -17,10 +17,6 @@
 # limitations under the License.
 #
 
-include Java
-java_import org.apache.hadoop.hbase.client.ConnectionFactory
-java_import org.apache.hadoop.hbase.HBaseConfiguration
-
 require 'hbase/admin'
 require 'hbase/table'
 require 'hbase/taskmonitor'
@@ -28,7 +24,13 @@ require 'hbase/quotas'
 require 'hbase/security'
 require 'hbase/visibility_labels'
 
+# HBase module containing the main connection and admin classes
 module Hbase
+  include Java
+  java_import org.apache.hadoop.hbase.client.ConnectionFactory
+  java_import org.apache.hadoop.hbase.HBaseConfiguration
+
+  # Main HBase class for connection and admin operations
   class Hbase
     attr_accessor :configuration
 
diff --git a/hbase-shell/src/main/ruby/hbase_constants.rb 
b/hbase-shell/src/main/ruby/hbase_constants.rb
index d4df1f8f582..0f328257508 100644
--- a/hbase-shell/src/main/ruby/hbase_constants.rb
+++ b/hbase-shell/src/main/ruby/hbase_constants.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #
 #
 # Licensed to the Apache Software Foundation (ASF) under one
@@ -25,89 +27,92 @@
 # the hirb.rb HBase Shell script; they don't make much sense elsewhere.
 # For example, the exists method on Admin class prints to the formatter
 # whether the table exists and returns nil regardless.
-include Java
-
-java_import('java.lang.Integer') { |_package, name| "J#{name}" }
-java_import('java.lang.Long') { |_package, name| "J#{name}" }
-java_import('java.lang.Boolean') { |_package, name| "J#{name}" }
 
+# HBase constants module providing access to HBase Java constants and
+# dynamically loading column family and table descriptor constants
 module HBaseConstants
-  ALLOW_PARTIAL_RESULTS = 'ALLOW_PARTIAL_RESULTS'.freeze
-  ALL_METRICS = 'ALL_METRICS'.freeze
-  ATTRIBUTES = 'ATTRIBUTES'.freeze
-  AUTHORIZATIONS = 'AUTHORIZATIONS'.freeze
-  BATCH = 'BATCH'.freeze
-  CACHE = 'CACHE'.freeze
-  CACHE_BLOCKS = 'CACHE_BLOCKS'.freeze
-  CLASSNAME = 'CLASSNAME'.freeze
-  CLONE_SFT = 'CLONE_SFT'.freeze
-  CLUSTER_KEY = 'CLUSTER_KEY'.freeze
-  COLUMN = 'COLUMN'.freeze
-  COLUMNS = 'COLUMNS'.freeze
-  CONFIG = 'CONFIG'.freeze
+  include Java
+
+  java_import('java.lang.Integer') { |_package, name| "J#{name}" }
+  java_import('java.lang.Long') { |_package, name| "J#{name}" }
+  java_import('java.lang.Boolean') { |_package, name| "J#{name}" }
+
+  ALLOW_PARTIAL_RESULTS = 'ALLOW_PARTIAL_RESULTS'
+  ALL_METRICS = 'ALL_METRICS'
+  ATTRIBUTES = 'ATTRIBUTES'
+  AUTHORIZATIONS = 'AUTHORIZATIONS'
+  BATCH = 'BATCH'
+  CACHE = 'CACHE'
+  CACHE_BLOCKS = 'CACHE_BLOCKS'
+  CLASSNAME = 'CLASSNAME'
+  CLONE_SFT = 'CLONE_SFT'
+  CLUSTER_KEY = 'CLUSTER_KEY'
+  COLUMN = 'COLUMN'
+  COLUMNS = 'COLUMNS'
+  CONFIG = 'CONFIG'
   CONFIGURATION = org.apache.hadoop.hbase.HConstants::CONFIGURATION
-  CONSISTENCY = 'CONSISTENCY'.freeze
-  COPROCESSOR = 'COPROCESSOR'.freeze
-  DATA = 'DATA'.freeze
-  ENDPOINT_CLASSNAME = 'ENDPOINT_CLASSNAME'.freeze
-  FILTER = 'FILTER'.freeze
+  CONSISTENCY = 'CONSISTENCY'
+  COPROCESSOR = 'COPROCESSOR'
+  DATA = 'DATA'
+  ENDPOINT_CLASSNAME = 'ENDPOINT_CLASSNAME'
+  FILTER = 'FILTER'
   FOREVER = org.apache.hadoop.hbase.HConstants::FOREVER
-  FORMATTER = 'FORMATTER'.freeze
-  FORMATTER_CLASS = 'FORMATTER_CLASS'.freeze
-  INTERVAL = 'INTERVAL'.freeze
+  FORMATTER = 'FORMATTER'
+  FORMATTER_CLASS = 'FORMATTER_CLASS'
+  INTERVAL = 'INTERVAL'
   IN_MEMORY = org.apache.hadoop.hbase.HConstants::IN_MEMORY
   IN_MEMORY_COMPACTION = 
org.apache.hadoop.hbase.client.ColumnFamilyDescriptorBuilder::IN_MEMORY_COMPACTION
-  ISOLATION_LEVEL = 'ISOLATION_LEVEL'.freeze
-  IS_ROOT = 'IS_ROOT'.freeze
-  JAR_PATH = 'JAR_PATH'.freeze
-  LIMIT = 'LIMIT'.freeze
-  LOCALITY_THRESHOLD = 'LOCALITY_THRESHOLD'.freeze
-  MAXLENGTH = 'MAXLENGTH'.freeze
-  MAX_RESULT_SIZE = 'MAX_RESULT_SIZE'.freeze
+  ISOLATION_LEVEL = 'ISOLATION_LEVEL'
+  IS_ROOT = 'IS_ROOT'
+  JAR_PATH = 'JAR_PATH'
+  LIMIT = 'LIMIT'
+  LOCALITY_THRESHOLD = 'LOCALITY_THRESHOLD'
+  MAXLENGTH = 'MAXLENGTH'
+  MAX_RESULT_SIZE = 'MAX_RESULT_SIZE'
   METADATA = org.apache.hadoop.hbase.HConstants::METADATA
-  METHOD = 'METHOD'.freeze
-  METRICS = 'METRICS'.freeze
+  METHOD = 'METHOD'
+  METRICS = 'METRICS'
   NAME = org.apache.hadoop.hbase.HConstants::NAME
-  NAMESPACE = 'NAMESPACE'.freeze
-  NAMESPACES = 'NAMESPACES'.freeze
-  NONE = 'NONE'.freeze
-  NUMREGIONS = 'NUMREGIONS'.freeze
-  POLICY = 'POLICY'.freeze
-  PRIORITY = 'PRIORITY'.freeze
-  PROPERTIES = 'PROPERTIES'.freeze
-  RAW = 'RAW'.freeze
-  READ_TYPE = 'READ_TYPE'.freeze
-  REGEX = 'REGEX'.freeze
-  REGIONSERVER = 'REGIONSERVER'.freeze
-  REGION_REPLICATION = 'REGION_REPLICATION'.freeze
-  REGION_REPLICA_ID = 'REGION_REPLICA_ID'.freeze
-  REMOTE_WAL_DIR = 'REMOTE_WAL_DIR'.freeze
-  REPLICATION_SCOPE = 'REPLICATION_SCOPE'.freeze
+  NAMESPACE = 'NAMESPACE'
+  NAMESPACES = 'NAMESPACES'
+  NONE = 'NONE'
+  NUMREGIONS = 'NUMREGIONS'
+  POLICY = 'POLICY'
+  PRIORITY = 'PRIORITY'
+  PROPERTIES = 'PROPERTIES'
+  RAW = 'RAW'
+  READ_TYPE = 'READ_TYPE'
+  REGEX = 'REGEX'
+  REGIONSERVER = 'REGIONSERVER'
+  REGION_REPLICATION = 'REGION_REPLICATION'
+  REGION_REPLICA_ID = 'REGION_REPLICA_ID'
+  REMOTE_WAL_DIR = 'REMOTE_WAL_DIR'
+  REPLICATION_SCOPE = 'REPLICATION_SCOPE'
   REPLICATION_SCOPE_BYTES = 
org.apache.hadoop.hbase.client.ColumnFamilyDescriptor::REPLICATION_SCOPE_BYTES
-  RESTORE_ACL = 'RESTORE_ACL'.freeze
-  REVERSED = 'REVERSED'.freeze
-  ROWPREFIXFILTER = 'ROWPREFIXFILTER'.freeze
-  SERIAL = 'SERIAL'.freeze
-  SERVER_NAME = 'SERVER_NAME'.freeze
-  SKIP_FLUSH = 'SKIP_FLUSH'.freeze
-  SPLITALGO = 'SPLITALGO'.freeze
-  SPLITS = 'SPLITS'.freeze
-  SPLITS_FILE = 'SPLITS_FILE'.freeze
-  STARTROW = 'STARTROW'.freeze
-  STATE = 'STATE'.freeze
-  STOPROW = 'STOPROW'.freeze
-  TABLE = 'TABLE'.freeze
-  TABLE_CFS = 'TABLE_CFS'.freeze
-  TABLE_NAME = 'TABLE_NAME'.freeze
-  TABLE_NAMES = 'TABLE_NAMES'.freeze
-  TIMERANGE = 'TIMERANGE'.freeze
-  TIMESTAMP = 'TIMESTAMP'.freeze
-  TYPE = 'TYPE'.freeze
-  USER = 'USER'.freeze
-  VALUE = 'VALUE'.freeze
+  RESTORE_ACL = 'RESTORE_ACL'
+  REVERSED = 'REVERSED'
+  ROWPREFIXFILTER = 'ROWPREFIXFILTER'
+  SERIAL = 'SERIAL'
+  SERVER_NAME = 'SERVER_NAME'
+  SKIP_FLUSH = 'SKIP_FLUSH'
+  SPLITALGO = 'SPLITALGO'
+  SPLITS = 'SPLITS'
+  SPLITS_FILE = 'SPLITS_FILE'
+  STARTROW = 'STARTROW'
+  STATE = 'STATE'
+  STOPROW = 'STOPROW'
+  TABLE = 'TABLE'
+  TABLE_CFS = 'TABLE_CFS'
+  TABLE_NAME = 'TABLE_NAME'
+  TABLE_NAMES = 'TABLE_NAMES'
+  TIMERANGE = 'TIMERANGE'
+  TIMESTAMP = 'TIMESTAMP'
+  TYPE = 'TYPE'
+  USER = 'USER'
+  VALUE = 'VALUE'
   VERSIONS = org.apache.hadoop.hbase.HConstants::VERSIONS
-  VISIBILITY = 'VISIBILITY'.freeze
-  REOPEN_REGIONS = 'REOPEN_REGIONS'.freeze
+  VISIBILITY = 'VISIBILITY'
+  REOPEN_REGIONS = 'REOPEN_REGIONS'
 
   # aliases
   ENDKEY = STOPROW
@@ -119,8 +124,9 @@ module HBaseConstants
     # The constants to import are all in uppercase
     constants.each do |c|
       next if c =~ /DEFAULT_.*/ || c != c.upcase
-      next if eval("defined?(#{c})")
-      eval("#{c} = '#{c}'")
+      next if const_defined?(c)
+
+      const_set(c, c.to_s)
     end
   end
 
diff --git a/hbase-shell/src/main/ruby/irb/hirb.rb 
b/hbase-shell/src/main/ruby/irb/hirb.rb
index 34638f228a9..a77c1b1feef 100644
--- a/hbase-shell/src/main/ruby/irb/hirb.rb
+++ b/hbase-shell/src/main/ruby/irb/hirb.rb
@@ -72,7 +72,7 @@ module IRB
       super(omit) unless @context.last_value.nil?
     end
 
-    # Copied from https://github.com/ruby/irb/blob/v1.4.2/lib/irb.rb 
+    # Copied from https://github.com/ruby/irb/blob/v1.4.2/lib/irb.rb
     # We override the rescue Exception block so the
     # Shell::exception_handler can deal with the exceptions.
     def eval_input
@@ -186,7 +186,7 @@ module IRB
                 warn "WARN: '#{var}' is a reserved HBase command. Local 
variable assignment ignored."
               end
 
-              new_binding = @context.workspace.main.get_binding
+              new_binding = @context.workspace.main.to_binding
               (workspace_binding.local_variables - shadowing_vars).each do 
|var|
                 new_binding.local_variable_set(var, 
workspace_binding.local_variable_get(var))
               end
diff --git a/hbase-shell/src/main/ruby/jar-bootstrap.rb 
b/hbase-shell/src/main/ruby/jar-bootstrap.rb
index e9844cfb223..06779a07d94 100644
--- a/hbase-shell/src/main/ruby/jar-bootstrap.rb
+++ b/hbase-shell/src/main/ruby/jar-bootstrap.rb
@@ -172,7 +172,7 @@ require 'shell/formatter'
 @hbase = conf_from_cli.nil? ? Hbase::Hbase.new : 
Hbase::Hbase.new(conf_from_cli)
 
 # Setup console
-@shell = Shell::Shell.new(@hbase, interactive)
+@shell = Shell::Shell.new(@hbase, interactive: interactive)
 @shell.debug = @shell_debug
 
 ##
@@ -227,7 +227,7 @@ IRB.conf[:USE_AUTOCOMPLETE] = autocomplete
 IRB.conf[:USE_COLORIZE] = colorize
 
 # Create a workspace we'll use across sessions.
-workspace = @shell.get_workspace
+workspace = @shell.workspace
 
 # If script2run, try running it.  If we're in interactive mode, will go on to 
run the shell unless
 # script calls 'exit' or 'exit 0' or 'exit errcode'.
diff --git a/hbase-shell/src/main/ruby/shell.rb 
b/hbase-shell/src/main/ruby/shell.rb
index 81baaf76d30..5774ff3073b 100644
--- a/hbase-shell/src/main/ruby/shell.rb
+++ b/hbase-shell/src/main/ruby/shell.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #
 #
 # Licensed to the Apache Software Foundation (ASF) under one
@@ -24,7 +26,8 @@ require 'irb/workspace'
 # in our HBase shell. This will hold all the commands we want in our shell.
 #
 class HBaseReceiver < Object
-  def get_binding
+  # Returns the binding context for this receiver object
+  def to_binding
     binding
   end
 end
@@ -39,38 +42,37 @@ module HBaseIOExtensions
   end
 end
 
-
 # Shell commands module
 module Shell
-  @@commands = {}
-  def self.commands
-    @@commands
+  class << self
+    attr_accessor :commands, :command_groups
   end
 
-  @@command_groups = {}
-  def self.command_groups
-    @@command_groups
-  end
+  @commands = {}
+  @command_groups = {}
 
+  # rubocop:disable Metrics/AbcSize
   def self.load_command(name, group, aliases = [])
     return if commands[name]
 
     # Register command in the group
     raise ArgumentError, "Unknown group: #{group}" unless command_groups[group]
+
     command_groups[group][:commands] << name
 
     # Load command
     begin
       require "shell/commands/#{name}"
       klass_name = name.to_s.gsub(/(?:^|_)(.)/) { Regexp.last_match(1).upcase 
} # camelize
-      commands[name] = eval("Commands::#{klass_name}")
+      commands[name] = Commands.const_get(klass_name)
       aliases.each do |an_alias|
         commands[an_alias] = commands[name]
       end
-    rescue => e
+    rescue StandardError => e
       raise "Can't load hbase shell command: #{name}. Error: 
#{e}\n#{e.backtrace.join("\n")}"
     end
   end
+  # rubocop:enable Metrics/AbcSize
 
   def self.load_command_group(group, opts)
     raise ArgumentError, "No :commands for group #{group}" unless 
opts[:commands]
@@ -93,17 +95,9 @@ module Shell
   #----------------------------------------------------------------------
   # rubocop:disable Metrics/ClassLength
   class Shell
-    attr_accessor :hbase
-    attr_accessor :interactive
+    attr_accessor :hbase, :interactive, :debug, :exit_code
     alias interactive? interactive
 
-    @debug = false
-    attr_accessor :debug
-
-    # keep track of the passed exit code. nil means never called.
-    @exit_code = nil
-    attr_accessor :exit_code
-
     alias __exit__ exit
     # exit the interactive shell and save that this
     # happend via a call to exit
@@ -112,7 +106,7 @@ module Shell
       IRB.irb_exit(IRB.CurrentContext.irb, ret)
     end
 
-    def initialize(hbase, interactive = true)
+    def initialize(hbase, interactive: true)
       self.hbase = hbase
       self.interactive = interactive
     end
@@ -147,7 +141,7 @@ module Shell
     end
 
     def hbase_rsgroup_admin
-      @rsgroup_admin ||= hbase.rsgroup_admin
+      @hbase_rsgroup_admin ||= hbase.rsgroup_admin
     end
 
     ##
@@ -161,7 +155,7 @@ module Shell
       shell_inst = self
       # Define each method as a lambda. We need to use a lambda (rather than a 
Proc or block) for
       # its properties: preservation of local variables and return
-      ::Shell.commands.keys.each do |cmd|
+      ::Shell.commands.each_key do |cmd|
         target.send :define_singleton_method, cmd.to_sym, lambda { |*args|
           ret = shell_inst.command(cmd.to_s, *args)
           puts
@@ -245,10 +239,12 @@ module Shell
       nil
     end
 
+    # rubocop:disable Metrics/AbcSize
     def help(command = nil)
       if command
         return help_command(command) if ::Shell.commands[command.to_s]
         return help_group(command) if ::Shell.command_groups[command.to_s]
+
         puts "ERROR: Invalid command or command group name: #{command}"
         puts
       end
@@ -257,8 +253,8 @@ module Shell
       puts
       puts 'COMMAND GROUPS:'
       ::Shell.command_groups.each do |name, group|
-        puts '  Group name: ' + name
-        puts '  Commands: ' + group[:command_names].sort.join(', ')
+        puts "  Group name: #{name}"
+        puts "  Commands: #{group[:command_names].sort.join(', ')}"
         puts
       end
       unless command
@@ -267,14 +263,19 @@ module Shell
       end
       nil
     end
+    # rubocop:enable Metrics/AbcSize
 
+    # rubocop:disable Metrics/AbcSize
     def help_header
       "HBase Shell, version 
#{org.apache.hadoop.hbase.util.VersionInfo.getVersion}, " \
-             "r#{org.apache.hadoop.hbase.util.VersionInfo.getRevision}, " \
-             "#{org.apache.hadoop.hbase.util.VersionInfo.getDate}" + "\n" \
-             "Type 'help \"COMMAND\"', (e.g. 'help \"get\"' -- the quotes are 
necessary) for help on a specific command.\n" \
-             "Commands are grouped. Type 'help \"COMMAND_GROUP\"', (e.g. 'help 
\"general\"') for help on a command group."
+        "r#{org.apache.hadoop.hbase.util.VersionInfo.getRevision}, " \
+        "#{org.apache.hadoop.hbase.util.VersionInfo.getDate}\n" \
+        "Type 'help \"COMMAND\"', (e.g. 'help \"get\"' -- the quotes are 
necessary) " \
+        "for help on a specific command.\n" \
+        "Commands are grouped. Type 'help \"COMMAND_GROUP\"', " \
+        "(e.g. 'help \"general\"') for help on a command group."
     end
+    # rubocop:enable Metrics/AbcSize
 
     def help_footer
       puts <<-HERE
@@ -302,10 +303,9 @@ For more on the HBase Shell, see 
https://hbase.apache.org/docs
       HERE
     end
 
-    @irb_workspace = nil
     ##
     # Returns an IRB Workspace for this shell instance with all the IRB and 
HBase commands installed
-    def get_workspace
+    def workspace
       return @irb_workspace unless @irb_workspace.nil?
 
       hbase_receiver = HBaseReceiver.new
@@ -320,12 +320,11 @@ For more on the HBase Shell, see 
https://hbase.apache.org/docs
       }
       at_exit do
         # Non-deamon Netty threadpool in ZK ClientCnxnSocketNetty cannot be 
shut down otherwise
-        begin
-          hbase.shutdown
-        rescue Exception
-        end
+        hbase.shutdown
+      rescue StandardError
+        # Intentionally suppressed - cleanup on exit, allow system signals to 
propagate
       end
-      ::IRB::WorkSpace.new(hbase_receiver.get_binding)
+      ::IRB::WorkSpace.new(hbase_receiver.to_binding)
     end
 
     ##
@@ -334,24 +333,21 @@ For more on the HBase Shell, see 
https://hbase.apache.org/docs
     # @param [Boolean] hide_traceback if true, Exceptions will be converted to
     #   a SystemExit so that the traceback is not printed
     def self.exception_handler(hide_traceback)
-      begin
-        yield
-      rescue Exception => e
-        message = e.to_s
-        # exception unwrapping in shell means we'll have to handle Java 
exceptions
-        # as a special case in order to format them properly.
-        if e.is_a? java.lang.Exception
-          warn 'java exception'
-          message = e.get_message
-        end
-        # Include the 'ERROR' string to try to make transition easier for 
scripts that
-        # may have already been relying on grepping output.
-        puts "ERROR #{e.class}: #{message}"
-        raise e unless hide_traceback
-
-        exit 1
+      yield
+    rescue StandardError => e
+      message = e.to_s
+      # exception unwrapping in shell means we'll have to handle Java 
exceptions
+      # as a special case in order to format them properly.
+      if e.is_a? java.lang.Exception
+        warn 'java exception'
+        message = e.get_message
       end
-      nil
+      # Include the 'ERROR' string to try to make transition easier for 
scripts that
+      # may have already been relying on grepping output.
+      puts "ERROR #{e.class}: #{message}"
+      raise e unless hide_traceback
+
+      exit 1
     end
   end
   # rubocop:enable Metrics/ClassLength
@@ -586,7 +582,8 @@ Shell.load_command_group(
 Shell.load_command_group(
   'security',
   full_name: 'SECURITY TOOLS',
-  comment: 'NOTE: Above commands are only applicable if running with the 
AccessController coprocessor',
+  comment: 'NOTE: Above commands are only applicable if running with the ' \
+           'AccessController coprocessor',
   commands: %w[
     list_security_capabilities
     grant
@@ -607,7 +604,8 @@ Shell.load_command_group(
 Shell.load_command_group(
   'visibility labels',
   full_name: 'VISIBILITY LABEL TOOLS',
-  comment: 'NOTE: Above commands are only applicable if running with the 
VisibilityController coprocessor',
+  comment: 'NOTE: Above commands are only applicable if running with the ' \
+           'VisibilityController coprocessor',
   commands: %w[
     add_labels
     list_labels
@@ -621,8 +619,9 @@ Shell.load_command_group(
 Shell.load_command_group(
   'rsgroup',
   full_name: 'RSGroups',
-  comment: "NOTE: The rsgroup Coprocessor Endpoint must be enabled on the 
Master else commands fail with:
-  UnknownProtocolException: No registered Master Coprocessor Endpoint found 
for RSGroupAdminService",
+  comment: 'NOTE: The rsgroup Coprocessor Endpoint must be enabled on the 
Master else ' \
+           'commands fail with: UnknownProtocolException: No registered Master 
' \
+           'Coprocessor Endpoint found for RSGroupAdminService',
   commands: %w[
     list_rsgroups
     get_rsgroup
diff --git a/hbase-shell/src/main/ruby/shell/commands.rb 
b/hbase-shell/src/main/ruby/shell/commands.rb
index a40f737e790..29405b6df9b 100644
--- a/hbase-shell/src/main/ruby/shell/commands.rb
+++ b/hbase-shell/src/main/ruby/shell/commands.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
 #
 #
 # Licensed to the Apache Software Foundation (ASF) under one
@@ -22,6 +24,7 @@ require 'shell/formatter'
 module Shell
   module Commands
     # rubocop:disable Metrics/ClassLength
+    # Base class for all HBase shell commands
     class Command
       def initialize(shell)
         @shell = shell
@@ -31,15 +34,14 @@ module Shell
 
       def command_name
         klass_name = self.class.name.split('::').last
-        command = klass_name.gsub(/([^\^])([A-Z])/, '\1_\2').downcase
-        command
+        klass_name.gsub(/([^\^])([A-Z])/, '\1_\2').downcase
       end
 
       # wrap an execution of cmd to catch hbase exceptions
       # cmd - command name to execute
       # args - arguments to pass to the command
 
-      # rubocop:disable Metrics/AbcSize
+      # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity
       def command_safe(debug, cmd = :command, *args)
         # Commands can overwrite start_time to skip time used in some kind of 
setup.
         # See count.rb for example.
@@ -47,29 +49,28 @@ module Shell
         # send is internal ruby method to call 'cmd' with *args
         # (everything is a message, so this is just the formal semantics to 
support that idiom)
         translate_hbase_exceptions(*args) { send(cmd, *args) }
-      rescue => e
-        rootCause = e
+      rescue StandardError => e
+        root_cause = e
 
         # JRuby9000 made RubyException respond to cause, ignore it for back 
compat
-        while !rootCause.is_a?(Exception) && rootCause.respond_to?(:cause) && 
!rootCause.cause.nil?
-          rootCause = rootCause.cause
-        end
-        if @shell.interactive?
-          puts
-          puts "ERROR: #{rootCause}"
-          puts "Backtrace: #{rootCause.backtrace.join("\n           ")}" if 
debug
-          puts
-          puts "For usage try 'help \"#{command_name}\"'"
-          puts
-        else
-          raise rootCause
+        while !root_cause.is_a?(Exception) && root_cause.respond_to?(:cause) &&
+              !root_cause.cause.nil?
+          root_cause = root_cause.cause
         end
+        return raise root_cause unless @shell.interactive?
+
+        puts
+        puts "ERROR: #{root_cause}"
+        puts "Backtrace: #{root_cause.backtrace.join("\n           ")}" if 
debug
+        puts
+        puts "For usage try 'help \"#{command_name}\"'"
+        puts
       ensure
         # If end_time is not already set by the command, use current time.
         @end_time ||= Time.now
         formatter.output_str(format('Took %.4f seconds', @end_time - 
@start_time))
       end
-      # rubocop:enable Metrics/AbcSize
+      # rubocop:enable Metrics/AbcSize, Metrics/CyclomaticComplexity
 
       # Convenience functions to get different admins
       # Returns HBase::Admin ruby class.
@@ -112,22 +113,22 @@ module Shell
       end
 
       # for testing purposes to catch the output of the commands
-      def set_formatter(formatter)
-        @formatter = formatter
-      end
+      attr_writer :formatter
 
-      # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity
-      # rubocop:disable Metrics/MethodLength, Metrics/PerceivedComplexity
+      # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, 
Metrics/PerceivedComplexity
       def translate_hbase_exceptions(*args)
         yield
-      rescue => cause
+      rescue StandardError => e
+        cause = e
         # let individual command handle exceptions first
         cause = cause.getCause if cause.is_a? java.io.UncheckedIOException
+
         handle_exceptions(cause, *args) if respond_to?(:handle_exceptions)
         # Global HBase exception handling below if not handled by respective 
command above
         if cause.is_a?(org.apache.hadoop.hbase.TableNotFoundException)
           strs = cause.to_s.split(' ')
           raise "Unknown table #{strs[0]}!" if strs.size == 1
+
           raise "Unknown table #{args.first}!"
         end
         if cause.is_a?(org.apache.hadoop.hbase.TableNotEnabledException)
@@ -136,32 +137,38 @@ module Shell
         if cause.is_a?(org.apache.hadoop.hbase.TableNotDisabledException)
           raise "Table #{cause.message} should be disabled!"
         end
-        if cause.is_a?(org.apache.hadoop.hbase.UnknownRegionException)
-          raise cause.message
-        end
+
+        raise cause.message if 
cause.is_a?(org.apache.hadoop.hbase.UnknownRegionException)
+
         if cause.is_a?(org.apache.hadoop.hbase.exceptions.MergeRegionException)
           strs = cause.message.split("\n")
-          raise(strs[0]).to_s unless strs.empty?
+          raise strs[0].to_s unless strs.empty?
         end
+
         if cause.is_a?(org.apache.hadoop.hbase.NamespaceNotFoundException)
           s = /.*NamespaceNotFoundException: 
(?<namespace>[^\n]+).*/.match(cause.message)
+
           raise "Unknown namespace #{s['namespace']}!"
         end
         if 
cause.is_a?(org.apache.hadoop.hbase.snapshot.SnapshotDoesNotExistException)
           raise "Unknown snapshot #{args.first}!"
         end
+
         if 
cause.is_a?(org.apache.hadoop.hbase.client.RetriesExhaustedWithDetailsException)
           exceptions = cause.getCauses
           exceptions.each do |exception|
-            if 
exception.is_a?(org.apache.hadoop.hbase.regionserver.NoSuchColumnFamilyException)
-              valid_cols = table(args.first).get_all_columns.map { |c| c + '*' 
}
-              raise "Unknown column family! Valid column names: 
#{valid_cols.join(', ')}"
-            end
+            next unless exception.is_a?(
+              org.apache.hadoop.hbase.regionserver.NoSuchColumnFamilyException
+            )
+
+            valid_cols = table(args.first).get_all_columns.map { |c| "#{c}*" }
+            raise "Unknown column family! Valid column names: 
#{valid_cols.join(', ')}"
           end
         end
         if cause.is_a?(org.apache.hadoop.hbase.TableExistsException)
           strs = cause.to_s.split(' ')
           raise "Table already exists: #{strs[0]}!" if strs.size == 1
+
           raise "Table already exists: #{args.first}!"
         end
         # To be safe, here only AccessDeniedException is considered. In future
@@ -171,7 +178,7 @@ module Shell
           # Error message is merged with stack trace, reference 
StringUtils.stringifyException
           # This is to parse and get the error message from the whole.
           strs = str.split("\n")
-          raise (strs[0]).to_s unless strs.empty?
+          raise strs[0].to_s unless strs.empty?
         end
         if cause.is_a?(org.apache.hadoop.hbase.quotas.SpaceLimitingException)
           strs = cause.message.split("\n")
@@ -193,8 +200,7 @@ module Shell
         # Throw the other exception which hasn't been handled above
         raise cause
       end
-      # rubocop:enable Metrics/AbcSize, Metrics/CyclomaticComplexity
-      # rubocop:enable Metrics/MethodLength, Metrics/PerceivedComplexity
+      # rubocop:enable Metrics/AbcSize, Metrics/CyclomaticComplexity, 
Metrics/PerceivedComplexity
     end
     # rubocop:enable Metrics/ClassLength
   end
diff --git a/hbase-shell/src/test/ruby/shell/general_test_cluster.rb 
b/hbase-shell/src/test/ruby/shell/general_test_cluster.rb
index e49dd6e2aaf..8c1687dea01 100644
--- a/hbase-shell/src/test/ruby/shell/general_test_cluster.rb
+++ b/hbase-shell/src/test/ruby/shell/general_test_cluster.rb
@@ -174,7 +174,7 @@ class ShellTest < Test::Unit::TestCase
   end
 
   define_test 'Shell::Shell should prevent HBase commands from being shadowed 
by local variables (HBASE-28660)' do
-    workspace = @shell.get_workspace
+    workspace = @shell.workspace
     IRB.setup(__FILE__) unless IRB.conf[:IRB_NAME]
 
     lines = [
diff --git a/hbase-shell/src/test/ruby/shell/noninteractive_test_cluster.rb 
b/hbase-shell/src/test/ruby/shell/noninteractive_test_cluster.rb
index fa8dd333be0..6a0b28a4dbd 100644
--- a/hbase-shell/src/test/ruby/shell/noninteractive_test_cluster.rb
+++ b/hbase-shell/src/test/ruby/shell/noninteractive_test_cluster.rb
@@ -20,7 +20,7 @@ require 'hbase_shell'
 class NonInteractiveTest < Test::Unit::TestCase
   def setup
     @hbase = ::Hbase::Hbase.new($TEST_CLUSTER.getConfiguration)
-    @shell = Shell::Shell.new(@hbase, false)
+    @shell = Shell::Shell.new(@hbase, interactive: false)
   end
 
   define_test "Shell::Shell noninteractive mode should throw" do
diff --git a/hbase-shell/src/test/ruby/test_helper.rb 
b/hbase-shell/src/test/ruby/test_helper.rb
index db014f50278..a2559451429 100644
--- a/hbase-shell/src/test/ruby/test_helper.rb
+++ b/hbase-shell/src/test/ruby/test_helper.rb
@@ -43,7 +43,7 @@ module Hbase
 
     def setup_hbase
       hbase = ::Hbase::Hbase.new($TEST_CLUSTER.getConfiguration)
-      @shell = ::Shell::Shell.new(hbase, interactive = false)
+      @shell = ::Shell::Shell.new(hbase, interactive: false)
     end
     
     def shutdown

Reply via email to