ruby-shell 3.4.7 → 3.4.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/bin/rsh +78 -65
- metadata +3 -4
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA256:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: 35dd4b1b6792ae0a66b0da2efd24bf78af5f2ba268fd933bd0af2b43e7fb0b23
         | 
| 4 | 
            +
              data.tar.gz: 6c1f6026a8870e178788190f702de82f3845364ebaa4e42a9952a8f9b61d9d0e
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: e9a950baff3af17ae641fe67a9782b5888c4e1ce93a94354558ec39adecbbe9254710a5719a000254c326eb71d9b91b098edea77dcdedcf773baff269448fa5c
         | 
| 7 | 
            +
              data.tar.gz: a84ce4e143a9237549affdb6befd894adf032737ae949edd4e326fe8858a127158f976760bfb43e41b6e51f8b58cf62e0271ebfec1cfa41e6b8f67763ecbe957
         | 
    
        data/bin/rsh
    CHANGED
    
    | @@ -8,7 +8,7 @@ | |
| 8 8 | 
             
            # Web_site:   http://isene.com/
         | 
| 9 9 | 
             
            # Github:     https://github.com/isene/rsh
         | 
| 10 10 | 
             
            # License:    Public domain
         | 
| 11 | 
            -
            @version    = "3.4. | 
| 11 | 
            +
            @version    = "3.4.8" # Code refactoring: DRY helpers, nick/gnick feedback, bug fixes
         | 
| 12 12 |  | 
| 13 13 | 
             
            # MODULES, CLASSES AND EXTENSIONS
         | 
| 14 14 | 
             
            class String # Add coloring to strings (with escaping for Readline)
         | 
| @@ -1077,6 +1077,16 @@ def suggest_command(cmd) # Smart command suggestions for typos | |
| 1077 1077 | 
             
              candidates.sort_by! { |c| levenshtein_distance(cmd, c) }
         | 
| 1078 1078 | 
             
              candidates.first(3)
         | 
| 1079 1079 | 
             
            end
         | 
| 1080 | 
            +
            def ensure_type(var_name, type, default) # Helper to ensure instance variable has correct type
         | 
| 1081 | 
            +
              var = instance_variable_get(var_name)
         | 
| 1082 | 
            +
              instance_variable_set(var_name, default) unless var.is_a?(type)
         | 
| 1083 | 
            +
            end
         | 
| 1084 | 
            +
            def persist_var(conf, var_name, value, condition = true) # Helper to persist variable to config
         | 
| 1085 | 
            +
              return conf unless condition
         | 
| 1086 | 
            +
              conf.sub!(/^#{Regexp.escape(var_name)}.*(\n|$)/, "")
         | 
| 1087 | 
            +
              conf += "#{var_name} = #{value.inspect}\n"
         | 
| 1088 | 
            +
              conf
         | 
| 1089 | 
            +
            end
         | 
| 1080 1090 | 
             
            def hist_clean # Clean up @history
         | 
| 1081 1091 | 
             
              @history.compact!
         | 
| 1082 1092 | 
             
              @history.delete("")
         | 
| @@ -1378,31 +1388,19 @@ def rshrc # Write user configuration to .rshrc (portable between machines) | |
| 1378 1388 | 
             
                conf = ""
         | 
| 1379 1389 | 
             
              end
         | 
| 1380 1390 |  | 
| 1381 | 
            -
              #  | 
| 1382 | 
            -
              conf | 
| 1383 | 
            -
              conf  | 
| 1384 | 
            -
              conf | 
| 1385 | 
            -
              conf  | 
| 1386 | 
            -
              conf | 
| 1387 | 
            -
              conf  | 
| 1388 | 
            -
              conf | 
| 1389 | 
            -
              conf  | 
| 1390 | 
            -
              conf | 
| 1391 | 
            -
              conf  | 
| 1392 | 
            -
              conf | 
| 1393 | 
            -
              conf  | 
| 1394 | 
            -
              conf.sub!(/^@auto_correct.*(\n|$)/, "")
         | 
| 1395 | 
            -
              conf += "@auto_correct = #{@auto_correct}\n" if @auto_correct
         | 
| 1396 | 
            -
              conf.sub!(/^@slow_command_threshold.*(\n|$)/, "")
         | 
| 1397 | 
            -
              conf += "@slow_command_threshold = #{@slow_command_threshold}\n" if @slow_command_threshold && @slow_command_threshold > 0
         | 
| 1398 | 
            -
              conf.sub!(/^@completion_learning.*(\n|$)/, "")
         | 
| 1399 | 
            -
              conf += "@completion_learning = #{@completion_learning}\n" unless @completion_learning
         | 
| 1400 | 
            -
              conf.sub!(/^@completion_show_metadata.*(\n|$)/, "")
         | 
| 1401 | 
            -
              conf += "@completion_show_metadata = #{@completion_show_metadata}\n" if @completion_show_metadata
         | 
| 1402 | 
            -
              conf.sub!(/^@plugin_enabled.*(\n|$)/, "")
         | 
| 1403 | 
            -
              conf += "@plugin_enabled = #{@plugin_enabled}\n" unless @plugin_enabled.empty?
         | 
| 1404 | 
            -
              conf.sub!(/^@validation_rules.*(\n|$)/, "")
         | 
| 1405 | 
            -
              conf += "@validation_rules = #{@validation_rules}\n" unless @validation_rules.empty?
         | 
| 1391 | 
            +
              # Persist user-editable configuration using helper
         | 
| 1392 | 
            +
              conf = persist_var(conf, '@nick', @nick)
         | 
| 1393 | 
            +
              conf = persist_var(conf, '@gnick', @gnick)
         | 
| 1394 | 
            +
              conf = persist_var(conf, '@bookmarks', @bookmarks, !@bookmarks.empty?)
         | 
| 1395 | 
            +
              conf = persist_var(conf, '@defuns', @defuns, !@defuns.empty?)
         | 
| 1396 | 
            +
              conf = persist_var(conf, '@history_dedup', @history_dedup, @history_dedup && @history_dedup != 'smart')
         | 
| 1397 | 
            +
              conf = persist_var(conf, '@session_autosave', @session_autosave, @session_autosave && @session_autosave > 0)
         | 
| 1398 | 
            +
              conf = persist_var(conf, '@auto_correct', @auto_correct, @auto_correct)
         | 
| 1399 | 
            +
              conf = persist_var(conf, '@slow_command_threshold', @slow_command_threshold, @slow_command_threshold && @slow_command_threshold > 0)
         | 
| 1400 | 
            +
              conf = persist_var(conf, '@completion_learning', @completion_learning, !@completion_learning)
         | 
| 1401 | 
            +
              conf = persist_var(conf, '@completion_show_metadata', @completion_show_metadata, @completion_show_metadata)
         | 
| 1402 | 
            +
              conf = persist_var(conf, '@plugin_disabled', @plugin_disabled, !@plugin_disabled.empty?)
         | 
| 1403 | 
            +
              conf = persist_var(conf, '@validation_rules', @validation_rules, !@validation_rules.empty?)
         | 
| 1406 1404 |  | 
| 1407 1405 | 
             
              File.write(Dir.home+'/.rshrc', conf)
         | 
| 1408 1406 | 
             
              rshstate  # Also save runtime state
         | 
| @@ -1562,6 +1560,8 @@ def help | |
| 1562 1560 | 
             
              col3 << ":help        This help"
         | 
| 1563 1561 | 
             
              col3 << ":info        About rsh"
         | 
| 1564 1562 | 
             
              col3 << ":version     Version info"
         | 
| 1563 | 
            +
              col3 << ":history     Show history"
         | 
| 1564 | 
            +
              col3 << ":rehash      Rebuild cache"
         | 
| 1565 1565 |  | 
| 1566 1566 | 
             
              # Pad columns to same length
         | 
| 1567 1567 | 
             
              max_lines = [col1.length, col2.length, col3.length].max
         | 
| @@ -1622,12 +1622,17 @@ def nick(nick_str = nil)  # Define a new nick like this: `:nick "ls = ls --color | |
| 1622 1622 | 
             
                puts
         | 
| 1623 1623 | 
             
              elsif nick_str.match(/^\s*-/)
         | 
| 1624 1624 | 
             
                source = nick_str.sub(/^\s*-/, '')
         | 
| 1625 | 
            -
                @nick.delete(source)
         | 
| 1626 | 
            -
             | 
| 1625 | 
            +
                if @nick.delete(source)
         | 
| 1626 | 
            +
                  puts "Nick '#{source}' deleted"
         | 
| 1627 | 
            +
                  rshrc
         | 
| 1628 | 
            +
                else
         | 
| 1629 | 
            +
                  puts "Nick '#{source}' not found"
         | 
| 1630 | 
            +
                end
         | 
| 1627 1631 | 
             
              else
         | 
| 1628 1632 | 
             
                source = nick_str.sub(/ =.*/, '')
         | 
| 1629 1633 | 
             
                target = nick_str.sub(/.*= /, '')
         | 
| 1630 1634 | 
             
                @nick[source] = target
         | 
| 1635 | 
            +
                puts "Nick '#{source}' → '#{target}'"
         | 
| 1631 1636 | 
             
                rshrc
         | 
| 1632 1637 | 
             
              end
         | 
| 1633 1638 | 
             
            end
         | 
| @@ -1643,12 +1648,17 @@ def gnick(nick_str = nil) # Define a generic/global nick to match not only comma | |
| 1643 1648 | 
             
                puts
         | 
| 1644 1649 | 
             
              elsif nick_str.match(/^\s*-/)
         | 
| 1645 1650 | 
             
                source = nick_str.sub(/^\s*-/, '')
         | 
| 1646 | 
            -
                @gnick.delete(source)
         | 
| 1647 | 
            -
             | 
| 1651 | 
            +
                if @gnick.delete(source)
         | 
| 1652 | 
            +
                  puts "Gnick '#{source}' deleted"
         | 
| 1653 | 
            +
                  rshrc
         | 
| 1654 | 
            +
                else
         | 
| 1655 | 
            +
                  puts "Gnick '#{source}' not found"
         | 
| 1656 | 
            +
                end
         | 
| 1648 1657 | 
             
              else
         | 
| 1649 1658 | 
             
                source = nick_str.sub(/ =.*/, '')
         | 
| 1650 1659 | 
             
                target = nick_str.sub(/.*= /, '')
         | 
| 1651 1660 | 
             
                @gnick[source] = target
         | 
| 1661 | 
            +
                puts "Gnick '#{source}' → '#{target}'"
         | 
| 1652 1662 | 
             
                rshrc
         | 
| 1653 1663 | 
             
              end
         | 
| 1654 1664 | 
             
            end
         | 
| @@ -3055,26 +3065,26 @@ def load_rshrc_safe | |
| 3055 3065 | 
             
                # Try to load the .rshrc file
         | 
| 3056 3066 | 
             
                load(Dir.home+'/.rshrc')
         | 
| 3057 3067 |  | 
| 3058 | 
            -
                # Validate critical variables
         | 
| 3059 | 
            -
                 | 
| 3060 | 
            -
                 | 
| 3061 | 
            -
                 | 
| 3062 | 
            -
                 | 
| 3063 | 
            -
                 | 
| 3064 | 
            -
                 | 
| 3065 | 
            -
                 | 
| 3066 | 
            -
                 | 
| 3067 | 
            -
                 | 
| 3068 | 
            -
                 | 
| 3069 | 
            -
                 | 
| 3070 | 
            -
                 | 
| 3071 | 
            -
                 | 
| 3072 | 
            -
                 | 
| 3073 | 
            -
                 | 
| 3074 | 
            -
                 | 
| 3068 | 
            +
                # Validate critical variables using helper
         | 
| 3069 | 
            +
                ensure_type(:@history, Array, [])
         | 
| 3070 | 
            +
                ensure_type(:@nick, Hash, {})
         | 
| 3071 | 
            +
                ensure_type(:@gnick, Hash, {})
         | 
| 3072 | 
            +
                ensure_type(:@cmd_frequency, Hash, {})
         | 
| 3073 | 
            +
                ensure_type(:@cmd_stats, Hash, {})
         | 
| 3074 | 
            +
                ensure_type(:@bookmarks, Hash, {})
         | 
| 3075 | 
            +
                ensure_type(:@defuns, Hash, {})
         | 
| 3076 | 
            +
                ensure_type(:@history_dedup, String, 'smart')
         | 
| 3077 | 
            +
                ensure_type(:@session_autosave, Integer, 0)
         | 
| 3078 | 
            +
                ensure_type(:@slow_command_threshold, Integer, 0)
         | 
| 3079 | 
            +
                ensure_type(:@plugin_disabled, Array, [])  # FIXED: was @plugin_enabled
         | 
| 3080 | 
            +
                ensure_type(:@plugins, Array, [])
         | 
| 3081 | 
            +
                ensure_type(:@plugin_commands, Hash, {})
         | 
| 3082 | 
            +
                ensure_type(:@validation_rules, Array, [])
         | 
| 3083 | 
            +
                ensure_type(:@completion_weights, Hash, {})
         | 
| 3084 | 
            +
                ensure_type(:@recording, Hash, {active: false, name: nil, commands: []})
         | 
| 3085 | 
            +
                ensure_type(:@recordings, Hash, {})
         | 
| 3086 | 
            +
                @auto_correct = false unless [true, false].include?(@auto_correct)
         | 
| 3075 3087 | 
             
                @completion_learning = true if @completion_learning.nil?
         | 
| 3076 | 
            -
                @recording = {active: false, name: nil, commands: []} unless @recording.is_a?(Hash)
         | 
| 3077 | 
            -
                @recordings = {} unless @recordings.is_a?(Hash)
         | 
| 3078 3088 |  | 
| 3079 3089 | 
             
                # Restore defuns from .rshrc
         | 
| 3080 3090 | 
             
                if @defuns && !@defuns.empty?
         | 
| @@ -3205,31 +3215,34 @@ def auto_heal_rshrc | |
| 3205 3215 | 
             
            end
         | 
| 3206 3216 |  | 
| 3207 3217 | 
             
            def load_defaults
         | 
| 3208 | 
            -
               | 
| 3209 | 
            -
               | 
| 3210 | 
            -
               | 
| 3218 | 
            +
              # Use ensure_type for consistency
         | 
| 3219 | 
            +
              ensure_type(:@history, Array, [])
         | 
| 3220 | 
            +
              ensure_type(:@nick, Hash, {"ls" => "ls --color -F"})
         | 
| 3221 | 
            +
              ensure_type(:@gnick, Hash, {})
         | 
| 3222 | 
            +
              ensure_type(:@cmd_frequency, Hash, {})
         | 
| 3223 | 
            +
              ensure_type(:@cmd_stats, Hash, {})
         | 
| 3224 | 
            +
              ensure_type(:@bookmarks, Hash, {})
         | 
| 3225 | 
            +
              ensure_type(:@defuns, Hash, {})
         | 
| 3226 | 
            +
              ensure_type(:@switch_cache, Hash, {})
         | 
| 3227 | 
            +
              ensure_type(:@switch_cache_time, Hash, {})
         | 
| 3228 | 
            +
              ensure_type(:@plugin_disabled, Array, [])  # FIXED: was @plugin_enabled
         | 
| 3229 | 
            +
              ensure_type(:@plugins, Array, [])
         | 
| 3230 | 
            +
              ensure_type(:@plugin_commands, Hash, {})
         | 
| 3231 | 
            +
              ensure_type(:@validation_rules, Array, [])
         | 
| 3232 | 
            +
              ensure_type(:@completion_weights, Hash, {})
         | 
| 3233 | 
            +
              ensure_type(:@recording, Hash, {active: false, name: nil, commands: []})
         | 
| 3234 | 
            +
              ensure_type(:@recordings, Hash, {})
         | 
| 3235 | 
            +
             | 
| 3211 3236 | 
             
              @completion_limit ||= 10
         | 
| 3212 3237 | 
             
              @completion_case_sensitive ||= false
         | 
| 3213 3238 | 
             
              @completion_show_descriptions ||= false
         | 
| 3214 3239 | 
             
              @completion_fuzzy ||= true
         | 
| 3215 | 
            -
              @cmd_frequency ||= {}
         | 
| 3216 | 
            -
              @cmd_stats ||= {}
         | 
| 3217 | 
            -
              @bookmarks ||= {}
         | 
| 3218 | 
            -
              @defuns ||= {}
         | 
| 3219 | 
            -
              @switch_cache ||= {}
         | 
| 3220 | 
            -
              @switch_cache_time ||= {}
         | 
| 3221 3240 | 
             
              @history_dedup ||= 'smart'
         | 
| 3222 3241 | 
             
              @session_autosave ||= 0
         | 
| 3223 3242 | 
             
              @auto_correct ||= false
         | 
| 3224 3243 | 
             
              @slow_command_threshold ||= 0
         | 
| 3225 | 
            -
              @plugin_enabled ||= []
         | 
| 3226 | 
            -
              @plugins ||= []
         | 
| 3227 | 
            -
              @plugin_commands ||= {}
         | 
| 3228 | 
            -
              @validation_rules ||= []
         | 
| 3229 | 
            -
              @completion_weights ||= {}
         | 
| 3230 3244 | 
             
              @completion_learning = true if @completion_learning.nil?
         | 
| 3231 | 
            -
             | 
| 3232 | 
            -
              @recordings ||= {}
         | 
| 3245 | 
            +
             | 
| 3233 3246 | 
             
              puts "Loaded with default configuration."
         | 
| 3234 3247 | 
             
            end
         | 
| 3235 3248 |  | 
    
        metadata
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: ruby-shell
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 3.4. | 
| 4 | 
            +
              version: 3.4.8
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Geir Isene
         | 
| @@ -12,9 +12,8 @@ date: 2025-10-29 00:00:00.000000000 Z | |
| 12 12 | 
             
            dependencies: []
         | 
| 13 13 | 
             
            description: 'A shell written in Ruby with extensive tab completions, aliases/nicks,
         | 
| 14 14 | 
             
              history, syntax highlighting, theming, auto-cd, auto-opening files and more. UPDATE
         | 
| 15 | 
            -
              v3.4. | 
| 16 | 
            -
               | 
| 17 | 
            -
              by default!'
         | 
| 15 | 
            +
              v3.4.8: Code refactoring with DRY helpers (ensure_type, persist_var), nick/gnick
         | 
| 16 | 
            +
              feedback messages, fixed @plugin_enabled bug. Cleaner, more maintainable codebase!'
         | 
| 18 17 | 
             
            email: g@isene.com
         | 
| 19 18 | 
             
            executables:
         | 
| 20 19 | 
             
            - rsh
         |