ruby_jard 0.2.3 → 0.3.0
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/.github/FUNDING.yml +3 -0
- data/.github/workflows/documentation.yml +65 -0
- data/.github/workflows/{ruby.yml → rspec.yml} +22 -11
- data/.rubocop.yml +6 -0
- data/CHANGELOG.md +15 -3
- data/Gemfile +9 -2
- data/README.md +52 -332
- data/benchmark/path_filter_bench.rb +58 -0
- data/lib/ruby_jard.rb +15 -5
- data/lib/ruby_jard/color_schemes.rb +9 -1
- data/lib/ruby_jard/color_schemes/256_color_scheme.rb +21 -35
- data/lib/ruby_jard/color_schemes/256_light_color_scheme.rb +23 -35
- data/lib/ruby_jard/color_schemes/deep_space_color_scheme.rb +20 -34
- data/lib/ruby_jard/color_schemes/gruvbox_color_scheme.rb +20 -34
- data/lib/ruby_jard/color_schemes/one_half_dark_color_scheme.rb +20 -34
- data/lib/ruby_jard/color_schemes/one_half_light_color_scheme.rb +21 -34
- data/lib/ruby_jard/commands/color_helpers.rb +32 -0
- data/lib/ruby_jard/commands/frame_command.rb +2 -2
- data/lib/ruby_jard/commands/jard/color_scheme_command.rb +25 -3
- data/lib/ruby_jard/commands/jard/filter_command.rb +136 -0
- data/lib/ruby_jard/commands/jard/output_command.rb +13 -5
- data/lib/ruby_jard/commands/jard_command.rb +3 -1
- data/lib/ruby_jard/config.rb +9 -2
- data/lib/ruby_jard/decorators/array_decorator.rb +79 -0
- data/lib/ruby_jard/decorators/attributes_decorator.rb +172 -0
- data/lib/ruby_jard/decorators/color_decorator.rb +12 -5
- data/lib/ruby_jard/decorators/hash_decorator.rb +74 -0
- data/lib/ruby_jard/decorators/inspection_decorator.rb +91 -58
- data/lib/ruby_jard/decorators/object_decorator.rb +122 -0
- data/lib/ruby_jard/decorators/path_decorator.rb +55 -72
- data/lib/ruby_jard/decorators/rails_decorator.rb +194 -0
- data/lib/ruby_jard/decorators/string_decorator.rb +41 -0
- data/lib/ruby_jard/decorators/struct_decorator.rb +79 -0
- data/lib/ruby_jard/frame.rb +23 -10
- data/lib/ruby_jard/keys.rb +1 -0
- data/lib/ruby_jard/layouts/narrow_horizontal_layout.rb +4 -0
- data/lib/ruby_jard/layouts/tiny_layout.rb +4 -0
- data/lib/ruby_jard/pager.rb +21 -5
- data/lib/ruby_jard/path_classifier.rb +133 -0
- data/lib/ruby_jard/path_filter.rb +125 -0
- data/lib/ruby_jard/reflection.rb +97 -0
- data/lib/ruby_jard/repl_processor.rb +71 -38
- data/lib/ruby_jard/row_renderer.rb +5 -3
- data/lib/ruby_jard/screen.rb +2 -2
- data/lib/ruby_jard/screen_manager.rb +13 -36
- data/lib/ruby_jard/screen_renderer.rb +1 -1
- data/lib/ruby_jard/screens/backtrace_screen.rb +55 -39
- data/lib/ruby_jard/screens/menu_screen.rb +30 -30
- data/lib/ruby_jard/screens/source_screen.rb +46 -62
- data/lib/ruby_jard/screens/threads_screen.rb +59 -72
- data/lib/ruby_jard/screens/variables_screen.rb +168 -124
- data/lib/ruby_jard/session.rb +120 -16
- data/lib/ruby_jard/thread_info.rb +69 -0
- data/lib/ruby_jard/version.rb +1 -1
- data/ruby_jard.gemspec +3 -1
- metadata +20 -39
- data/.travis.yml +0 -6
- data/CNAME +0 -1
- data/_config.yml +0 -1
- data/docs/_config.yml +0 -8
- data/docs/color_schemes/256-light.png +0 -0
- data/docs/color_schemes/256.png +0 -0
- data/docs/color_schemes/deep-space.png +0 -0
- data/docs/color_schemes/gruvbox.png +0 -0
- data/docs/color_schemes/one-half-dark.png +0 -0
- data/docs/color_schemes/one-half-light.png +0 -0
- data/docs/demo.png +0 -0
- data/docs/guide-ui.png +0 -0
- data/docs/index.md +0 -238
- data/docs/logo.jpg +0 -0
- data/docs/screen-backtrace.png +0 -0
- data/docs/screen-repl.png +0 -0
- data/docs/screen-source.png +0 -0
- data/docs/screen-threads.png +0 -0
- data/docs/screen-variables.png +0 -0
- data/images/bg_hr.png +0 -0
- data/images/blacktocat.png +0 -0
- data/images/body-bg.jpg +0 -0
- data/images/download-button.png +0 -0
- data/images/github-button.png +0 -0
- data/images/header-bg.jpg +0 -0
- data/images/highlight-bg.jpg +0 -0
- data/images/icon_download.png +0 -0
- data/images/sidebar-bg.jpg +0 -0
- data/images/sprite_download.png +0 -0
- data/javascripts/main.js +0 -1
- data/stylesheets/github-light.css +0 -130
- data/stylesheets/normalize.css +0 -424
- data/stylesheets/print.css +0 -228
- data/stylesheets/stylesheet.css +0 -245
| @@ -20,40 +20,27 @@ module RubyJard | |
| 20 20 |  | 
| 21 21 | 
             
                  BACKGROUND = WHITE
         | 
| 22 22 | 
             
                  STYLES = {
         | 
| 23 | 
            -
                    background: | 
| 24 | 
            -
                    border: | 
| 25 | 
            -
                    title: | 
| 26 | 
            -
                    title_highlighted: | 
| 27 | 
            -
                    title_secondary: | 
| 28 | 
            -
                    title_background: | 
| 29 | 
            -
                     | 
| 30 | 
            -
                     | 
| 31 | 
            -
                     | 
| 32 | 
            -
                     | 
| 33 | 
            -
                     | 
| 34 | 
            -
                     | 
| 35 | 
            -
                     | 
| 36 | 
            -
                     | 
| 37 | 
            -
                     | 
| 38 | 
            -
                     | 
| 39 | 
            -
                     | 
| 40 | 
            -
                     | 
| 41 | 
            -
                     | 
| 42 | 
            -
                     | 
| 43 | 
            -
                     | 
| 44 | 
            -
                    variable_assignment:   [GRAY5, BACKGROUND],
         | 
| 45 | 
            -
                    source_line_mark:      [YELLOW, BACKGROUND],
         | 
| 46 | 
            -
                    source_lineno:         [GRAY4, BACKGROUND],
         | 
| 47 | 
            -
                    keyword:               [PURPLE, BACKGROUND],
         | 
| 48 | 
            -
                    method:                [BLUE, BACKGROUND],
         | 
| 49 | 
            -
                    comment:               [GRAY4, BACKGROUND],
         | 
| 50 | 
            -
                    literal:               [YELLOW, BACKGROUND],
         | 
| 51 | 
            -
                    string:                [GREEN, BACKGROUND],
         | 
| 52 | 
            -
                    local_variable:        [RED, BACKGROUND],
         | 
| 53 | 
            -
                    instance_variable:     [RED, BACKGROUND],
         | 
| 54 | 
            -
                    constant:              [YELLOW, BACKGROUND],
         | 
| 55 | 
            -
                    normal_token:          [GRAY5, BACKGROUND],
         | 
| 56 | 
            -
                    object:                [YELLOW, BACKGROUND]
         | 
| 23 | 
            +
                    background:        [GRAY5, BACKGROUND],
         | 
| 24 | 
            +
                    border:            [GRAY3, BACKGROUND],
         | 
| 25 | 
            +
                    title:             [WHITE, GREEN],
         | 
| 26 | 
            +
                    title_highlighted: [WHITE, YELLOW],
         | 
| 27 | 
            +
                    title_secondary:   [GRAY5, GRAY2],
         | 
| 28 | 
            +
                    title_background:  [GRAY3, BACKGROUND],
         | 
| 29 | 
            +
                    text_primary:      [GRAY5, BACKGROUND],
         | 
| 30 | 
            +
                    text_dim:          [GRAY4, BACKGROUND],
         | 
| 31 | 
            +
                    text_highlighted:  [BLUE, BACKGROUND],
         | 
| 32 | 
            +
                    text_special:      [RED, BACKGROUND],
         | 
| 33 | 
            +
                    text_selected:     [GREEN, BACKGROUND],
         | 
| 34 | 
            +
                    keyword:           [PURPLE, BACKGROUND],
         | 
| 35 | 
            +
                    method:            [BLUE, BACKGROUND],
         | 
| 36 | 
            +
                    comment:           [GRAY4, BACKGROUND],
         | 
| 37 | 
            +
                    literal:           [YELLOW, BACKGROUND],
         | 
| 38 | 
            +
                    string:            [GREEN, BACKGROUND],
         | 
| 39 | 
            +
                    local_variable:    [RED, BACKGROUND],
         | 
| 40 | 
            +
                    instance_variable: [RED, BACKGROUND],
         | 
| 41 | 
            +
                    constant:          [YELLOW, BACKGROUND],
         | 
| 42 | 
            +
                    normal_token:      [GRAY5, BACKGROUND],
         | 
| 43 | 
            +
                    object:            [YELLOW, BACKGROUND]
         | 
| 57 44 | 
             
                  }.freeze
         | 
| 58 45 | 
             
                end
         | 
| 59 46 | 
             
              end
         | 
| @@ -0,0 +1,32 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            module RubyJard
         | 
| 4 | 
            +
              module Commands
         | 
| 5 | 
            +
                ##
         | 
| 6 | 
            +
                # Helper to dedocrate command output
         | 
| 7 | 
            +
                module ColorHelpers
         | 
| 8 | 
            +
                  def special(content)
         | 
| 9 | 
            +
                    color_decorator.decorate(:text_special, content)
         | 
| 10 | 
            +
                  end
         | 
| 11 | 
            +
             | 
| 12 | 
            +
                  def secondary(content)
         | 
| 13 | 
            +
                    color_decorator.decorate(:text_primary, content)
         | 
| 14 | 
            +
                  end
         | 
| 15 | 
            +
             | 
| 16 | 
            +
                  def highlight(content)
         | 
| 17 | 
            +
                    color_decorator.decorate(:text_highlighted, content)
         | 
| 18 | 
            +
                  end
         | 
| 19 | 
            +
             | 
| 20 | 
            +
                  def pick_color_scheme
         | 
| 21 | 
            +
                    (
         | 
| 22 | 
            +
                      RubyJard::ColorSchemes[RubyJard.config.color_scheme] ||
         | 
| 23 | 
            +
                      RubyJard::ColorSchemes[RubyJard::Config::DEFAULT_COLOR_SCHEME]
         | 
| 24 | 
            +
                    ).new
         | 
| 25 | 
            +
                  end
         | 
| 26 | 
            +
             | 
| 27 | 
            +
                  def color_decorator
         | 
| 28 | 
            +
                    @color_decorator ||= RubyJard::Decorators::ColorDecorator.new(pick_color_scheme)
         | 
| 29 | 
            +
                  end
         | 
| 30 | 
            +
                end
         | 
| 31 | 
            +
              end
         | 
| 32 | 
            +
            end
         | 
| @@ -22,13 +22,13 @@ module RubyJard | |
| 22 22 |  | 
| 23 23 | 
             
                  def initialize(context = {})
         | 
| 24 24 | 
             
                    super(context)
         | 
| 25 | 
            -
                    @ | 
| 25 | 
            +
                    @current_backtrace = (context[:session] || RubyJard::Session).current_backtrace
         | 
| 26 26 | 
             
                  end
         | 
| 27 27 |  | 
| 28 28 | 
             
                  def process
         | 
| 29 29 | 
             
                    frame = validate_present!(args.first)
         | 
| 30 30 | 
             
                    frame = validate_non_negative_integer!(frame)
         | 
| 31 | 
            -
                    frame = validate_range!(frame, 0, @ | 
| 31 | 
            +
                    frame = validate_range!(frame, 0, @current_backtrace.map(&:virtual_pos).compact.max)
         | 
| 32 32 | 
             
                    RubyJard::ControlFlow.dispatch(:frame, frame: frame)
         | 
| 33 33 | 
             
                  end
         | 
| 34 34 | 
             
                end
         | 
| @@ -4,6 +4,8 @@ module RubyJard | |
| 4 4 | 
             
              module Commands
         | 
| 5 5 | 
             
                # Command used to explore stacktrace.
         | 
| 6 6 | 
             
                class ColorSchemeCommand < Pry::ClassCommand
         | 
| 7 | 
            +
                  include RubyJard::Commands::ColorHelpers
         | 
| 8 | 
            +
             | 
| 7 9 | 
             
                  group 'RubyJard'
         | 
| 8 10 | 
             
                  description 'Control the color scheme used in Jard'
         | 
| 9 11 |  | 
| @@ -29,24 +31,44 @@ module RubyJard | |
| 29 31 | 
             
                      if @color_schemes.names.empty?
         | 
| 30 32 | 
             
                        pry_instance.output.puts 'No loaded color schemes'
         | 
| 31 33 | 
             
                      else
         | 
| 32 | 
            -
                         | 
| 34 | 
            +
                        print_color_schemes
         | 
| 33 35 | 
             
                      end
         | 
| 34 36 | 
             
                    else
         | 
| 35 37 | 
             
                      color_scheme = args.first.to_s.strip
         | 
| 36 38 | 
             
                      if color_scheme.empty?
         | 
| 37 39 | 
             
                        raise Pry::CommandError,
         | 
| 38 | 
            -
                              'You must provide a color scheme name.  | 
| 40 | 
            +
                              'You must provide a color scheme name. '\
         | 
| 41 | 
            +
                              "Please use `#{highlight('jard color-scheme -l')}` to list all color schemes."
         | 
| 39 42 | 
             
                      end
         | 
| 40 43 |  | 
| 41 44 | 
             
                      if @color_schemes[color_scheme].nil?
         | 
| 42 45 | 
             
                        raise Pry::CommandError,
         | 
| 43 | 
            -
                              "Color scheme `#{color_scheme}` not found.  | 
| 46 | 
            +
                              "Color scheme `#{secondary(color_scheme)}` not found. "\
         | 
| 47 | 
            +
                              "Please use `#{highlight('jard color-scheme -l')}` to list all color schemes."
         | 
| 44 48 | 
             
                      end
         | 
| 45 49 |  | 
| 46 50 | 
             
                      @config.color_scheme = color_scheme
         | 
| 47 51 | 
             
                      RubyJard::ControlFlow.dispatch(:list)
         | 
| 48 52 | 
             
                    end
         | 
| 49 53 | 
             
                  end
         | 
| 54 | 
            +
             | 
| 55 | 
            +
                  private
         | 
| 56 | 
            +
             | 
| 57 | 
            +
                  def print_color_schemes
         | 
| 58 | 
            +
                    pry_instance.output.puts
         | 
| 59 | 
            +
                    pry_instance.output.puts highlight("#{@color_schemes.names.length} available color schemes")
         | 
| 60 | 
            +
                    pry_instance.output.puts
         | 
| 61 | 
            +
                    padding = @color_schemes.names.map(&:length).max
         | 
| 62 | 
            +
                    @color_schemes.names.each do |name|
         | 
| 63 | 
            +
                      scheme = @color_schemes[name]
         | 
| 64 | 
            +
                      decorator = RubyJard::Decorators::ColorDecorator.new(scheme.new)
         | 
| 65 | 
            +
                      pallete = scheme.const_get(:STYLES).keys.map do |style|
         | 
| 66 | 
            +
                        decorator.decorate(style, '⬤ ')
         | 
| 67 | 
            +
                      end.join(' ')
         | 
| 68 | 
            +
                      pry_instance.output.puts "#{name.ljust(padding)} #{pallete}"
         | 
| 69 | 
            +
                      pry_instance.output.puts
         | 
| 70 | 
            +
                    end
         | 
| 71 | 
            +
                  end
         | 
| 50 72 | 
             
                end
         | 
| 51 73 | 
             
              end
         | 
| 52 74 | 
             
            end
         | 
| @@ -0,0 +1,136 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            module RubyJard
         | 
| 4 | 
            +
              module Commands
         | 
| 5 | 
            +
                ##
         | 
| 6 | 
            +
                # Control filter, included and excluded
         | 
| 7 | 
            +
                class FilterCommand < Pry::ClassCommand
         | 
| 8 | 
            +
                  include RubyJard::Commands::ColorHelpers
         | 
| 9 | 
            +
             | 
| 10 | 
            +
                  group 'RubyJard'
         | 
| 11 | 
            +
                  description 'Filter to keep only relevant location when you debugging'
         | 
| 12 | 
            +
             | 
| 13 | 
            +
                  match 'filter'
         | 
| 14 | 
            +
             | 
| 15 | 
            +
                  banner <<-BANNER
         | 
| 16 | 
            +
                    Usage:
         | 
| 17 | 
            +
                      jard filter
         | 
| 18 | 
            +
                      jard filter [everything, gems, application, source_tree]
         | 
| 19 | 
            +
                      jard filter [include, exclude] pattern
         | 
| 20 | 
            +
                      jard filter clear
         | 
| 21 | 
            +
             | 
| 22 | 
            +
                    Ruby Jard has a strong filtering system. This system consists of a filter mode, included list, and excluded list. Filter mode is how Ruby Jard reacts to control flow commands. See https://rubyjard.org/docs/guides/filter for more information.
         | 
| 23 | 
            +
             | 
| 24 | 
            +
                    Examples:
         | 
| 25 | 
            +
             | 
| 26 | 
            +
                      jard filter # Show filter status
         | 
| 27 | 
            +
             | 
| 28 | 
            +
                      jard filter application # Switch to application mode
         | 
| 29 | 
            +
                      jard filter gems # Switch to gems mode
         | 
| 30 | 
            +
                      jard filter everything # Switch to everything mode
         | 
| 31 | 
            +
                      jard filter source_tree # Switch to source tree mode
         | 
| 32 | 
            +
             | 
| 33 | 
            +
                      jard filter include sidekiq # Include sidekiq pattern
         | 
| 34 | 
            +
                      jard filter include aws-*
         | 
| 35 | 
            +
                      jard filter include aws-* active* action* # Multiple patterns separated by <space>
         | 
| 36 | 
            +
                      jard filter include lib/**/*.erb
         | 
| 37 | 
            +
                      jard filter include ~/home/lib/**/*.rb
         | 
| 38 | 
            +
             | 
| 39 | 
            +
                      jard filter exclude sidekiq # exclude sidekiq pattern
         | 
| 40 | 
            +
                      jard filter exclude aws-*
         | 
| 41 | 
            +
                      jard filter exclude aws-* active* action* # Multiple patterns separated by <space>
         | 
| 42 | 
            +
                      jard filter exclude lib/**/*.erb
         | 
| 43 | 
            +
                      jard filter exclude ~/home/lib/**/*.rb
         | 
| 44 | 
            +
             | 
| 45 | 
            +
                      jard filter clear # Clear filter
         | 
| 46 | 
            +
                  BANNER
         | 
| 47 | 
            +
             | 
| 48 | 
            +
                  def initialize(*args)
         | 
| 49 | 
            +
                    super(*args)
         | 
| 50 | 
            +
                    @filters = RubyJard::PathFilter::FILTERS
         | 
| 51 | 
            +
                    @config = context[:config] || RubyJard.config
         | 
| 52 | 
            +
                  end
         | 
| 53 | 
            +
             | 
| 54 | 
            +
                  def process
         | 
| 55 | 
            +
                    if args.empty?
         | 
| 56 | 
            +
                      print_current_filter
         | 
| 57 | 
            +
                      return
         | 
| 58 | 
            +
                    end
         | 
| 59 | 
            +
             | 
| 60 | 
            +
                    sub_command = args.shift.to_sym
         | 
| 61 | 
            +
             | 
| 62 | 
            +
                    case sub_command
         | 
| 63 | 
            +
                    when *@filters
         | 
| 64 | 
            +
                      @config.filter = sub_command
         | 
| 65 | 
            +
                      RubyJard::ControlFlow.dispatch(:list)
         | 
| 66 | 
            +
                    when :include
         | 
| 67 | 
            +
                      handle_included
         | 
| 68 | 
            +
                    when :exclude
         | 
| 69 | 
            +
                      handle_excluded
         | 
| 70 | 
            +
                    when :clear
         | 
| 71 | 
            +
                      handle_clear
         | 
| 72 | 
            +
                    else
         | 
| 73 | 
            +
                      raise Pry::CommandError,
         | 
| 74 | 
            +
                            "Invalid filter '#{secondary(sub_command)}'."\
         | 
| 75 | 
            +
                            "Please type `#{highlight('jard filter --help')}` for more information"
         | 
| 76 | 
            +
                    end
         | 
| 77 | 
            +
                  end
         | 
| 78 | 
            +
             | 
| 79 | 
            +
                  private
         | 
| 80 | 
            +
             | 
| 81 | 
            +
                  def print_current_filter
         | 
| 82 | 
            +
                    pry_instance.output.puts
         | 
| 83 | 
            +
                    pry_instance.output.puts highlight('Filter mode')
         | 
| 84 | 
            +
                    pry_instance.output.puts "  #{@config.filter}"
         | 
| 85 | 
            +
                    pry_instance.output.puts highlight("Included (#{@config.filter_included.length})")
         | 
| 86 | 
            +
                    @config.filter_included.each do |included|
         | 
| 87 | 
            +
                      pry_instance.output.puts "  +#{included}"
         | 
| 88 | 
            +
                    end
         | 
| 89 | 
            +
             | 
| 90 | 
            +
                    pry_instance.output.puts highlight("Excluded (#{@config.filter_excluded.length})")
         | 
| 91 | 
            +
                    @config.filter_excluded.each do |excluded|
         | 
| 92 | 
            +
                      pry_instance.output.puts "  -#{excluded}"
         | 
| 93 | 
            +
                    end
         | 
| 94 | 
            +
                    pry_instance.output.puts
         | 
| 95 | 
            +
                    pry_instance.output.puts "Please type `#{highlight('jard filter --help')}` for more information"
         | 
| 96 | 
            +
                    pry_instance.output.puts
         | 
| 97 | 
            +
                  end
         | 
| 98 | 
            +
             | 
| 99 | 
            +
                  def handle_included
         | 
| 100 | 
            +
                    if args.empty?
         | 
| 101 | 
            +
                      raise Pry::CommandError,
         | 
| 102 | 
            +
                            'Wrong number of arguments! '\
         | 
| 103 | 
            +
                            "Please type `#{highlight('jard filter --help')}` for more information"
         | 
| 104 | 
            +
                    end
         | 
| 105 | 
            +
                    filters = args.map(&:strip)
         | 
| 106 | 
            +
                    @config.filter_included.append(*filters)
         | 
| 107 | 
            +
                    @config.filter_included.uniq!
         | 
| 108 | 
            +
                    filters.each do |filter|
         | 
| 109 | 
            +
                      @config.filter_excluded.delete(filter) if @config.filter_excluded.include?(filter)
         | 
| 110 | 
            +
                    end
         | 
| 111 | 
            +
                    RubyJard::ControlFlow.dispatch(:list)
         | 
| 112 | 
            +
                  end
         | 
| 113 | 
            +
             | 
| 114 | 
            +
                  def handle_excluded
         | 
| 115 | 
            +
                    if args.empty?
         | 
| 116 | 
            +
                      raise Pry::CommandError,
         | 
| 117 | 
            +
                            'Wrong number of arguments!'\
         | 
| 118 | 
            +
                            "Please type `#{highlight('jard filter --help')}` for more information"
         | 
| 119 | 
            +
                    end
         | 
| 120 | 
            +
                    filters = args.map(&:strip)
         | 
| 121 | 
            +
                    @config.filter_excluded.append(*filters)
         | 
| 122 | 
            +
                    @config.filter_excluded.uniq!
         | 
| 123 | 
            +
                    filters.each do |filter|
         | 
| 124 | 
            +
                      @config.filter_included.delete(filter) if @config.filter_included.include?(filter)
         | 
| 125 | 
            +
                    end
         | 
| 126 | 
            +
                    RubyJard::ControlFlow.dispatch(:list)
         | 
| 127 | 
            +
                  end
         | 
| 128 | 
            +
             | 
| 129 | 
            +
                  def handle_clear
         | 
| 130 | 
            +
                    @config.filter_excluded.clear
         | 
| 131 | 
            +
                    @config.filter_included.clear
         | 
| 132 | 
            +
                    RubyJard::ControlFlow.dispatch(:list)
         | 
| 133 | 
            +
                  end
         | 
| 134 | 
            +
                end
         | 
| 135 | 
            +
              end
         | 
| 136 | 
            +
            end
         | 
| @@ -13,14 +13,22 @@ module RubyJard | |
| 13 13 | 
             
                    Usage: output
         | 
| 14 14 | 
             
                  BANNER
         | 
| 15 15 |  | 
| 16 | 
            -
                  def  | 
| 17 | 
            -
                     | 
| 16 | 
            +
                  def initialize(*args)
         | 
| 17 | 
            +
                    super(*args)
         | 
| 18 | 
            +
                    @session = (context[:session] || RubyJard::Session)
         | 
| 18 19 | 
             
                  end
         | 
| 19 20 |  | 
| 20 21 | 
             
                  def process
         | 
| 21 | 
            -
                    pry_instance.pager.open( | 
| 22 | 
            -
                       | 
| 23 | 
            -
                       | 
| 22 | 
            +
                    pry_instance.pager.open(
         | 
| 23 | 
            +
                      force_open: true,
         | 
| 24 | 
            +
                      pager_start_at_the_end: true,
         | 
| 25 | 
            +
                      prompt: 'Program output'
         | 
| 26 | 
            +
                    ) do |pager|
         | 
| 27 | 
            +
                      @session.output_buffer.each do |string|
         | 
| 28 | 
            +
                        string.each do |s|
         | 
| 29 | 
            +
                          pager.write(s)
         | 
| 30 | 
            +
                        end
         | 
| 31 | 
            +
                      end
         | 
| 24 32 | 
             
                    end
         | 
| 25 33 | 
             
                  end
         | 
| 26 34 | 
             
                end
         | 
| @@ -4,6 +4,7 @@ require 'ruby_jard/commands/jard/show_command' | |
| 4 4 | 
             
            require 'ruby_jard/commands/jard/hide_command'
         | 
| 5 5 | 
             
            require 'ruby_jard/commands/jard/color_scheme_command'
         | 
| 6 6 | 
             
            require 'ruby_jard/commands/jard/output_command'
         | 
| 7 | 
            +
            require 'ruby_jard/commands/jard/filter_command'
         | 
| 7 8 |  | 
| 8 9 | 
             
            module RubyJard
         | 
| 9 10 | 
             
              module Commands
         | 
| @@ -22,7 +23,8 @@ module RubyJard | |
| 22 23 | 
             
                    'show' => RubyJard::Commands::ShowCommand,
         | 
| 23 24 | 
             
                    'hide' => RubyJard::Commands::HideCommand,
         | 
| 24 25 | 
             
                    'color-scheme' => RubyJard::Commands::ColorSchemeCommand,
         | 
| 25 | 
            -
                    'output' => RubyJard::Commands::OutputCommand
         | 
| 26 | 
            +
                    'output' => RubyJard::Commands::OutputCommand,
         | 
| 27 | 
            +
                    'filter' => RubyJard::Commands::FilterCommand
         | 
| 26 28 | 
             
                  }.freeze
         | 
| 27 29 |  | 
| 28 30 | 
             
                  def subcommands(cmd)
         | 
    
        data/lib/ruby_jard/config.rb
    CHANGED
    
    | @@ -31,13 +31,17 @@ module RubyJard | |
| 31 31 | 
             
                  end
         | 
| 32 32 | 
             
                end
         | 
| 33 33 |  | 
| 34 | 
            -
                attr_accessor :color_scheme, :alias_to_debugger, :layout, :enabled_screens
         | 
| 34 | 
            +
                attr_accessor :color_scheme, :alias_to_debugger, :layout, :enabled_screens,
         | 
| 35 | 
            +
                              :filter, :filter_included, :filter_excluded
         | 
| 35 36 |  | 
| 36 37 | 
             
                CONFIG_FILE_NAME = '.jardrc'
         | 
| 37 38 | 
             
                DEFAULTS = [
         | 
| 38 39 | 
             
                  DEFAULT_COLOR_SCHEME = '256',
         | 
| 39 40 | 
             
                  DEFAULT_ALIAS_TO_DEBUGGER = false,
         | 
| 40 | 
            -
                  DEFAULT_LAYOUT = nil # Pick layout automatically
         | 
| 41 | 
            +
                  DEFAULT_LAYOUT = nil, # Pick layout automatically
         | 
| 42 | 
            +
                  DEFAULT_FILTER = RubyJard::PathFilter::FILTER_APPLICATION,
         | 
| 43 | 
            +
                  DEFAULT_FILTER_INCLUDED = [].freeze,
         | 
| 44 | 
            +
                  DEFAULT_FILTER_EXCLUDED = [].freeze
         | 
| 41 45 | 
             
                ].freeze
         | 
| 42 46 |  | 
| 43 47 | 
             
                def initialize
         | 
| @@ -45,6 +49,9 @@ module RubyJard | |
| 45 49 | 
             
                  @alias_to_debugger = DEFAULT_ALIAS_TO_DEBUGGER
         | 
| 46 50 | 
             
                  @layout = DEFAULT_LAYOUT
         | 
| 47 51 | 
             
                  @enabled_screens = RubyJard::Screens.names
         | 
| 52 | 
            +
                  @filter = DEFAULT_FILTER
         | 
| 53 | 
            +
                  @filter_included = DEFAULT_FILTER_INCLUDED.dup
         | 
| 54 | 
            +
                  @filter_excluded = DEFAULT_FILTER_EXCLUDED.dup
         | 
| 48 55 | 
             
                end
         | 
| 49 56 |  | 
| 50 57 | 
             
                def config
         | 
| @@ -0,0 +1,79 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            module RubyJard
         | 
| 4 | 
            +
              module Decorators
         | 
| 5 | 
            +
                ##
         | 
| 6 | 
            +
                # Decorate Array data structure, supports singleline and multiline form.
         | 
| 7 | 
            +
                class ArrayDecorator
         | 
| 8 | 
            +
                  def initialize(generic_decorator)
         | 
| 9 | 
            +
                    @generic_decorator = generic_decorator
         | 
| 10 | 
            +
                    @attributes_decorator = RubyJard::Decorators::AttributesDecorator.new(generic_decorator)
         | 
| 11 | 
            +
                  end
         | 
| 12 | 
            +
             | 
| 13 | 
            +
                  def match?(variable)
         | 
| 14 | 
            +
                    RubyJard::Reflection.call_is_a?(variable, Array)
         | 
| 15 | 
            +
                  end
         | 
| 16 | 
            +
             | 
| 17 | 
            +
                  def decorate_singleline(variable, line_limit:, depth: 0)
         | 
| 18 | 
            +
                    spans = []
         | 
| 19 | 
            +
                    spans << RubyJard::Span.new(content: '[', styles: :text_primary)
         | 
| 20 | 
            +
                    spans += @attributes_decorator.inline_values(
         | 
| 21 | 
            +
                      variable.each_with_index, total: variable.length, line_limit: line_limit - 2, depth: depth + 1
         | 
| 22 | 
            +
                    )
         | 
| 23 | 
            +
                    spans << RubyJard::Span.new(content: ']', styles: :text_primary)
         | 
| 24 | 
            +
             | 
| 25 | 
            +
                    spans
         | 
| 26 | 
            +
                  end
         | 
| 27 | 
            +
             | 
| 28 | 
            +
                  def decorate_multiline(variable, first_line_limit:, lines:, line_limit:, depth: 0)
         | 
| 29 | 
            +
                    if variable.length > lines * 2
         | 
| 30 | 
            +
                      return do_decorate_multiline(variable, lines: lines, line_limit: line_limit, depth: depth)
         | 
| 31 | 
            +
                    end
         | 
| 32 | 
            +
             | 
| 33 | 
            +
                    singleline = decorate_singleline(variable, line_limit: first_line_limit, depth: depth)
         | 
| 34 | 
            +
                    if (singleline.map(&:content_length).sum < line_limit && same_type?(variable, lines)) || variable.length <= 1
         | 
| 35 | 
            +
                      [singleline]
         | 
| 36 | 
            +
                    else
         | 
| 37 | 
            +
                      do_decorate_multiline(variable, lines: lines, line_limit: line_limit, depth: depth)
         | 
| 38 | 
            +
                    end
         | 
| 39 | 
            +
                  end
         | 
| 40 | 
            +
             | 
| 41 | 
            +
                  private
         | 
| 42 | 
            +
             | 
| 43 | 
            +
                  def same_type?(variable, sample)
         | 
| 44 | 
            +
                    variable.first(sample).map { |item| RubyJard::Reflection.call_class(item) }.uniq.length <= 1
         | 
| 45 | 
            +
                  end
         | 
| 46 | 
            +
             | 
| 47 | 
            +
                  def do_decorate_multiline(variable, lines:, line_limit:, depth: 0)
         | 
| 48 | 
            +
                    spans = [[RubyJard::Span.new(content: '[', styles: :text_primary)]]
         | 
| 49 | 
            +
             | 
| 50 | 
            +
                    item_count = 0
         | 
| 51 | 
            +
                    variable.each_with_index do |value, index|
         | 
| 52 | 
            +
                      spans << @attributes_decorator.value(value, line_limit: line_limit, depth: depth + 1)
         | 
| 53 | 
            +
             | 
| 54 | 
            +
                      item_count += 1
         | 
| 55 | 
            +
                      break if index >= lines - 2
         | 
| 56 | 
            +
                    end
         | 
| 57 | 
            +
             | 
| 58 | 
            +
                    spans << last_line(variable.length, item_count)
         | 
| 59 | 
            +
                  end
         | 
| 60 | 
            +
             | 
| 61 | 
            +
                  def last_line(total, item_count)
         | 
| 62 | 
            +
                    if total > item_count
         | 
| 63 | 
            +
                      [
         | 
| 64 | 
            +
                        RubyJard::Span.new(
         | 
| 65 | 
            +
                          content: "▸ #{total - item_count} more...",
         | 
| 66 | 
            +
                          margin_left: 2, styles: :text_dim
         | 
| 67 | 
            +
                        ),
         | 
| 68 | 
            +
                        RubyJard::Span.new(
         | 
| 69 | 
            +
                          content: ']',
         | 
| 70 | 
            +
                          styles: :text_primary
         | 
| 71 | 
            +
                        )
         | 
| 72 | 
            +
                      ]
         | 
| 73 | 
            +
                    else
         | 
| 74 | 
            +
                      [RubyJard::Span.new(content: ']', styles: :text_primary)]
         | 
| 75 | 
            +
                    end
         | 
| 76 | 
            +
                  end
         | 
| 77 | 
            +
                end
         | 
| 78 | 
            +
              end
         | 
| 79 | 
            +
            end
         |