minitest-heat 0.0.14 → 1.0.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/Gemfile.lock +1 -1
- data/README.md +1 -1
- data/lib/minitest/heat/output/map.rb +39 -26
- data/lib/minitest/heat/output.rb +5 -1
- data/lib/minitest/heat/results.rb +14 -2
- data/lib/minitest/heat/version.rb +1 -1
- metadata +2 -2
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA256:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: 887dc01f3a08341f1e88cb24b539d0843cdce81fdb49246fbce8af875ff00d3f
         | 
| 4 | 
            +
              data.tar.gz: 875d197ab5c65c2cb85b192201375be653ba30da2fc91896b4a3e61702cacefd
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: 6ef73c9df5b91b5950cc444f6ea7a18ccd867bda4fbdb015b8d713eaebe91b925a2cfb48b596a43a0d36af023dcb04f5c8ec0803602ab27bf709372fe6f9b0f3
         | 
| 7 | 
            +
              data.tar.gz: d338944e9d32e8ec326cce9dbe861c5b8bec408bb455e4e984d45567ef9d9c5af9154f4475c2862ddc43778c95d8e58f12beef8757aa37f6b76d91da1b17a4c5
         | 
    
        data/Gemfile.lock
    CHANGED
    
    
    
        data/README.md
    CHANGED
    
    | @@ -1,4 +1,4 @@ | |
| 1 | 
            -
            # Minitest::Heat
         | 
| 1 | 
            +
            # 🔥 Minitest::Heat 🔥
         | 
| 2 2 | 
             
            Minitest::Heat helps you identify problems faster so you can more efficiently resolve test failures. It does this through a few different methods.
         | 
| 3 3 |  | 
| 4 4 | 
             
            It collects failures and inspects backtraces to identify patterns and provide a heat map summary of the files and line numbers that most frequently appear to be the causes of issues.
         | 
| @@ -38,7 +38,7 @@ module Minitest | |
| 38 38 | 
             
                          break unless traces.any?
         | 
| 39 39 |  | 
| 40 40 | 
             
                          # A short summary explaining the details that will follow
         | 
| 41 | 
            -
                          @tokens << [[: | 
| 41 | 
            +
                          @tokens << [[:default, "  Line #{line_number}"], [:muted, ' issues triggered from:']]
         | 
| 42 42 |  | 
| 43 43 | 
             
                          # The last relevant location for each error's backtrace
         | 
| 44 44 | 
             
                          @tokens += origination_sources(traces)
         | 
| @@ -51,23 +51,27 @@ module Minitest | |
| 51 51 | 
             
                    private
         | 
| 52 52 |  | 
| 53 53 | 
             
                    def origination_sources(traces)
         | 
| 54 | 
            -
                      # 1.  | 
| 55 | 
            -
                      # 2.  | 
| 54 | 
            +
                      # 1. Only pull the traces that have proper locations
         | 
| 55 | 
            +
                      # 2. Sort the traces by the most recent line number so they're displayed in numeric order
         | 
| 56 | 
            +
                      # 3. Get the final relevant location from the trace
         | 
| 56 57 | 
             
                      traces.
         | 
| 58 | 
            +
                        select  { |trace| trace.locations.any? }.
         | 
| 57 59 | 
             
                        sort_by { |trace| trace.locations.last.line_number }.
         | 
| 58 60 | 
             
                        map     { |trace| origination_location_token(trace) }
         | 
| 59 61 | 
             
                    end
         | 
| 60 62 |  | 
| 61 63 | 
             
                    def file_summary_tokens(hit)
         | 
| 62 64 | 
             
                      pathname_tokens = pathname(hit)
         | 
| 63 | 
            -
                      line_number_list_tokens =  | 
| 65 | 
            +
                      line_number_list_tokens = line_number_tokens_for_hit(hit)
         | 
| 64 66 |  | 
| 65 67 | 
             
                      [*pathname_tokens, *line_number_list_tokens]
         | 
| 66 68 | 
             
                    end
         | 
| 67 69 |  | 
| 68 70 | 
             
                    def origination_location_token(trace)
         | 
| 69 71 | 
             
                      # The earliest project line from the backtrace—this is probabyl wholly incorrect in terms
         | 
| 70 | 
            -
                      # of what would be the most helpful line to display, but it's a start.
         | 
| 72 | 
            +
                      # of what would be the most helpful line to display, but it's a start. Otherwise, the
         | 
| 73 | 
            +
                      # logic will need to compare all traces for the issue and find the unique origination
         | 
| 74 | 
            +
                      # lines
         | 
| 71 75 | 
             
                      location = trace.locations.last
         | 
| 72 76 |  | 
| 73 77 | 
             
                      [
         | 
| @@ -137,8 +141,10 @@ module Minitest | |
| 137 141 | 
             
                        line_numbers_for_issue_type = hit.issues.fetch(issue_type) { [] }
         | 
| 138 142 |  | 
| 139 143 | 
             
                        # Build the list of tokens representing styled line numbers
         | 
| 140 | 
            -
                        line_numbers_for_issue_type.each do |line_number|
         | 
| 141 | 
            -
                           | 
| 144 | 
            +
                        line_numbers_for_issue_type.uniq.sort.each do |line_number|
         | 
| 145 | 
            +
                          frequency = line_numbers_for_issue_type.count(line_number)
         | 
| 146 | 
            +
             | 
| 147 | 
            +
                          line_number_tokens += line_number_token(issue_type, line_number, frequency)
         | 
| 142 148 | 
             
                        end
         | 
| 143 149 | 
             
                      end
         | 
| 144 150 |  | 
| @@ -151,27 +157,34 @@ module Minitest | |
| 151 157 | 
             
                    # @param line_number [Integer] the affected line number
         | 
| 152 158 | 
             
                    #
         | 
| 153 159 | 
             
                    # @return [Array<Symbol,Integer>] array token representing the line number and issue type
         | 
| 154 | 
            -
                    def line_number_token(style, line_number)
         | 
| 155 | 
            -
                       | 
| 156 | 
            -
             | 
| 157 | 
            -
             | 
| 158 | 
            -
             | 
| 159 | 
            -
             | 
| 160 | 
            -
             | 
| 161 | 
            -
             | 
| 162 | 
            -
                    #
         | 
| 163 | 
            -
                    # @return [Array] the arrays representing the line number tokens to display next to a file
         | 
| 164 | 
            -
                    #   name in the heat map. ex [[:error, 12], [:falure, 13]]
         | 
| 165 | 
            -
                    def sorted_line_number_list(hit)
         | 
| 166 | 
            -
                      # Sort the collected group of line number hits so they're in order
         | 
| 167 | 
            -
                      line_number_tokens_for_hit(hit).sort do |a, b|
         | 
| 168 | 
            -
                        # Ensure the line numbers are integers for sorting (otherwise '100' comes before '12')
         | 
| 169 | 
            -
                        first_line_number = Integer(a[1].strip)
         | 
| 170 | 
            -
                        second_line_number = Integer(b[1].strip)
         | 
| 171 | 
            -
             | 
| 172 | 
            -
                        first_line_number <=> second_line_number
         | 
| 160 | 
            +
                    def line_number_token(style, line_number, frequency)
         | 
| 161 | 
            +
                      if frequency > 1
         | 
| 162 | 
            +
                        [
         | 
| 163 | 
            +
                          [style, "#{line_number}"],
         | 
| 164 | 
            +
                          [:muted, "✕#{frequency} "]
         | 
| 165 | 
            +
                        ]
         | 
| 166 | 
            +
                      else
         | 
| 167 | 
            +
                        [[style, "#{line_number} "]]
         | 
| 173 168 | 
             
                      end
         | 
| 174 169 | 
             
                    end
         | 
| 170 | 
            +
             | 
| 171 | 
            +
                    # # Sorts line number tokens so that line numbers are displayed in order regardless of their
         | 
| 172 | 
            +
                    # #   underlying issue type
         | 
| 173 | 
            +
                    # #
         | 
| 174 | 
            +
                    # # @param hit [Hit] the instance of the hit file details to build the heat map entry
         | 
| 175 | 
            +
                    # #
         | 
| 176 | 
            +
                    # # @return [Array] the arrays representing the line number tokens to display next to a file
         | 
| 177 | 
            +
                    # #   name in the heat map. ex [[:error, 12], [:falure, 13]]
         | 
| 178 | 
            +
                    # def sorted_line_number_list(hit)
         | 
| 179 | 
            +
                    #   # Sort the collected group of line number hits so they're in order
         | 
| 180 | 
            +
                    #   line_number_tokens_for_hit(hit).sort do |a, b|
         | 
| 181 | 
            +
                    #     # Ensure the line numbers are integers for sorting (otherwise '100' comes before '12')
         | 
| 182 | 
            +
                    #     first_line_number = Integer(a[1].strip)
         | 
| 183 | 
            +
                    #     second_line_number = Integer(b[1].strip)
         | 
| 184 | 
            +
             | 
| 185 | 
            +
                    #     first_line_number <=> second_line_number
         | 
| 186 | 
            +
                    #   end
         | 
| 187 | 
            +
                    # end
         | 
| 175 188 | 
             
                  end
         | 
| 176 189 | 
             
                end
         | 
| 177 190 | 
             
              end
         | 
    
        data/lib/minitest/heat/output.rb
    CHANGED
    
    | @@ -57,7 +57,11 @@ module Minitest | |
| 57 57 | 
             
                      # suppress them until the more critical issues are resolved.
         | 
| 58 58 | 
             
                      next unless show?(issue_category, results)
         | 
| 59 59 |  | 
| 60 | 
            -
                      results.send(issue_category) | 
| 60 | 
            +
                      issues = results.send(issue_category)
         | 
| 61 | 
            +
             | 
| 62 | 
            +
                      issues
         | 
| 63 | 
            +
                        .sort_by { |issue| issue.locations.most_relevant.to_a }
         | 
| 64 | 
            +
                        .each { |issue| issue_details(issue) }
         | 
| 61 65 | 
             
                    end
         | 
| 62 66 | 
             
                  rescue StandardError => e
         | 
| 63 67 | 
             
                    message = "Sorry, but Minitest Heat couldn't display the details of any failures."
         | 
| @@ -30,8 +30,20 @@ module Minitest | |
| 30 30 | 
             
                    # For heat map purposes, only the project backtrace lines are interesting
         | 
| 31 31 | 
             
                    pathname, line_number = issue.locations.project.to_a
         | 
| 32 32 |  | 
| 33 | 
            -
                    #  | 
| 34 | 
            -
                     | 
| 33 | 
            +
                    # A backtrace is only relevant for exception-generating issues (i.e. errors), not slows or skips
         | 
| 34 | 
            +
                    # However, while assertion failures won't have a backtrace, there can still be repeated line
         | 
| 35 | 
            +
                    # numbers if the tests reference a shared method with an assertion in it. So in those cases,
         | 
| 36 | 
            +
                    # the backtrace is simply the test definition
         | 
| 37 | 
            +
                    backtrace = if issue.error?
         | 
| 38 | 
            +
                      # With errors, we have a backtrace
         | 
| 39 | 
            +
                      issue.locations.backtrace.project_locations
         | 
| 40 | 
            +
                    else
         | 
| 41 | 
            +
                      # With failures, the test definition is the most granular backtrace equivalent
         | 
| 42 | 
            +
                      location = issue.locations.test_definition
         | 
| 43 | 
            +
                      location.raw_container = issue.test_identifier
         | 
| 44 | 
            +
             | 
| 45 | 
            +
                      [location]
         | 
| 46 | 
            +
                    end
         | 
| 35 47 |  | 
| 36 48 | 
             
                    @heat_map.add(pathname, line_number, issue.type, backtrace: backtrace)
         | 
| 37 49 | 
             
                  end
         | 
    
        metadata
    CHANGED
    
    | @@ -1,14 +1,14 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: minitest-heat
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 0.0 | 
| 4 | 
            +
              version: 1.0.0
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Garrett Dimon
         | 
| 8 8 | 
             
            autorequire:
         | 
| 9 9 | 
             
            bindir: exe
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 | 
            -
            date: 2021- | 
| 11 | 
            +
            date: 2021-12-01 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies:
         | 
| 13 13 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 14 14 | 
             
              name: minitest
         |