rspec-tracer 0.9.1 → 0.9.2
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/CHANGELOG.md +6 -0
- data/README.md +1 -3
- data/lib/rspec_tracer/cache.rb +8 -3
- data/lib/rspec_tracer/html_reporter/reporter.rb +15 -3
- data/lib/rspec_tracer/reporter.rb +27 -4
- data/lib/rspec_tracer/runner.rb +23 -0
- data/lib/rspec_tracer/version.rb +1 -1
- data/lib/rspec_tracer.rb +1 -0
- metadata +3 -3
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA256:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: 3f76c84eee2926bd06511fc4e92112653dd9515a7a486c5c90102e94d1001ba7
         | 
| 4 | 
            +
              data.tar.gz: 8b64c63ba96ade735ec0cd1c2982075ece274fc88e4f76eb0bff2a6bd1c4f545
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: b296c0812b1b223186eb3e3a789cf2eefb9a035216ef83b7b0ebd98828f64f9c358ca435cd68461f2baf96c710d2fe02547e1eb1f25a4219cc92da4bd59ab7c8
         | 
| 7 | 
            +
              data.tar.gz: eb899ae2a04ceb7bd0b6a99af710750a98c03282b431d86e2c038376a76120d1ad794ee917e866638732099a8966a039cbebc5e17514062a262e6ab733700137
         | 
    
        data/CHANGELOG.md
    CHANGED
    
    
    
        data/README.md
    CHANGED
    
    | @@ -28,9 +28,7 @@ recommended to use **simplecov >= 0.12.0**. To use RSpec Tracer **cache on CI**, | |
| 28 28 | 
             
            need to have an **S3 bucket** and **[AWS CLI](https://aws.amazon.com/cli/)**
         | 
| 29 29 | 
             
            installed.
         | 
| 30 30 |  | 
| 31 | 
            -
            You should take some time and go through the **[document](./RSPEC_TRACER.md)**
         | 
| 32 | 
            -
            describing the **intention** and implementation details of **managing dependency**,
         | 
| 33 | 
            -
            **managing flaky tests**, **skipping tests**, and **caching on CI**.
         | 
| 31 | 
            +
            ### You should take some time and go through the **[document](./RSPEC_TRACER.md)** describing the **intention** and implementation details of **managing dependency**, **managing flaky tests**, **skipping tests**, and **caching on CI**.
         | 
| 34 32 |  | 
| 35 33 | 
             
            ## Table of Contents
         | 
| 36 34 |  | 
    
        data/lib/rspec_tracer/cache.rb
    CHANGED
    
    | @@ -2,8 +2,8 @@ | |
| 2 2 |  | 
| 3 3 | 
             
            module RSpecTracer
         | 
| 4 4 | 
             
              class Cache
         | 
| 5 | 
            -
                attr_reader :all_examples, : | 
| 6 | 
            -
                            :all_files, :dependency, :run_id
         | 
| 5 | 
            +
                attr_reader :all_examples, :interrupted_examples, :flaky_examples, :failed_examples,
         | 
| 6 | 
            +
                            :pending_examples, :all_files, :dependency, :run_id
         | 
| 7 7 |  | 
| 8 8 | 
             
                def initialize
         | 
| 9 9 | 
             
                  @run_id = last_run_id
         | 
| @@ -12,6 +12,7 @@ module RSpecTracer | |
| 12 12 | 
             
                  @cached = false
         | 
| 13 13 |  | 
| 14 14 | 
             
                  @all_examples = {}
         | 
| 15 | 
            +
                  @interrupted_examples = Set.new
         | 
| 15 16 | 
             
                  @flaky_examples = Set.new
         | 
| 16 17 | 
             
                  @failed_examples = Set.new
         | 
| 17 18 | 
             
                  @pending_examples = Set.new
         | 
| @@ -74,7 +75,11 @@ module RSpecTracer | |
| 74 75 | 
             
                  end
         | 
| 75 76 |  | 
| 76 77 | 
             
                  @all_examples.each_value do |example|
         | 
| 77 | 
            -
                    example | 
| 78 | 
            +
                    if example.key?(:execution_result)
         | 
| 79 | 
            +
                      example[:execution_result].transform_keys!(&:to_sym)
         | 
| 80 | 
            +
                    else
         | 
| 81 | 
            +
                      @interrupted_examples << example[:example_id]
         | 
| 82 | 
            +
                    end
         | 
| 78 83 |  | 
| 79 84 | 
             
                    example[:run_reason] = nil
         | 
| 80 85 | 
             
                  end
         | 
| @@ -60,7 +60,19 @@ module RSpecTracer | |
| 60 60 | 
             
                        id: example_id,
         | 
| 61 61 | 
             
                        description: example[:full_description],
         | 
| 62 62 | 
             
                        location: example_location(example[:rerun_file_name], example[:rerun_line_number]),
         | 
| 63 | 
            -
                        status: example[:run_reason] || 'Skipped' | 
| 63 | 
            +
                        status: example[:run_reason] || 'Skipped'
         | 
| 64 | 
            +
                      }.merge(example_result(example_id, example))
         | 
| 65 | 
            +
                    end
         | 
| 66 | 
            +
                  end
         | 
| 67 | 
            +
             | 
| 68 | 
            +
                  def example_result(example_id, example)
         | 
| 69 | 
            +
                    if example[:execution_result].nil?
         | 
| 70 | 
            +
                      {
         | 
| 71 | 
            +
                        result: @reporter.example_interrupted?(example_id) ? 'Interrupted' : '_',
         | 
| 72 | 
            +
                        last_run: '_'
         | 
| 73 | 
            +
                      }
         | 
| 74 | 
            +
                    else
         | 
| 75 | 
            +
                      {
         | 
| 64 76 | 
             
                        result: example[:execution_result][:status].capitalize,
         | 
| 65 77 | 
             
                        last_run: example_run_local_time(example[:execution_result][:finished_at])
         | 
| 66 78 | 
             
                      }
         | 
| @@ -176,7 +188,7 @@ module RSpecTracer | |
| 176 188 |  | 
| 177 189 | 
             
                  def example_status_css_class(example_status)
         | 
| 178 190 | 
             
                    case example_status.split.first
         | 
| 179 | 
            -
                    when 'Failed', 'Flaky'
         | 
| 191 | 
            +
                    when 'Failed', 'Flaky', 'Interrupted'
         | 
| 180 192 | 
             
                      'red'
         | 
| 181 193 | 
             
                    when 'Pending'
         | 
| 182 194 | 
             
                      'yellow'
         | 
| @@ -189,7 +201,7 @@ module RSpecTracer | |
| 189 201 | 
             
                    case example_result
         | 
| 190 202 | 
             
                    when 'Passed'
         | 
| 191 203 | 
             
                      'green'
         | 
| 192 | 
            -
                    when 'Failed'
         | 
| 204 | 
            +
                    when 'Failed', 'Interrupted'
         | 
| 193 205 | 
             
                      'red'
         | 
| 194 206 | 
             
                    when 'Pending'
         | 
| 195 207 | 
             
                      'yellow'
         | 
| @@ -2,9 +2,10 @@ | |
| 2 2 |  | 
| 3 3 | 
             
            module RSpecTracer
         | 
| 4 4 | 
             
              class Reporter
         | 
| 5 | 
            -
                attr_reader :all_examples, : | 
| 6 | 
            -
                            : | 
| 7 | 
            -
                            : | 
| 5 | 
            +
                attr_reader :all_examples, :interrupted_examples, :possibly_flaky_examples,
         | 
| 6 | 
            +
                            :flaky_examples, :pending_examples, :all_files, :modified_files,
         | 
| 7 | 
            +
                            :deleted_files, :dependency, :reverse_dependency, :examples_coverage,
         | 
| 8 | 
            +
                            :last_run
         | 
| 8 9 |  | 
| 9 10 | 
             
                def initialize
         | 
| 10 11 | 
             
                  initialize_examples
         | 
| @@ -37,8 +38,21 @@ module RSpecTracer | |
| 37 38 | 
             
                  @all_examples[example_id][:execution_result] = formatted_execution_result(result)
         | 
| 38 39 | 
             
                end
         | 
| 39 40 |  | 
| 41 | 
            +
                def register_interrupted_examples
         | 
| 42 | 
            +
                  @all_examples.each_pair do |example_id, example|
         | 
| 43 | 
            +
                    next if example.key?(:execution_result)
         | 
| 44 | 
            +
             | 
| 45 | 
            +
                    @interrupted_examples << example_id
         | 
| 46 | 
            +
                  end
         | 
| 47 | 
            +
             | 
| 48 | 
            +
                  return if @interrupted_examples.empty?
         | 
| 49 | 
            +
             | 
| 50 | 
            +
                  puts "RSpec tracer is not processing #{@interrupted_examples.count} interrupted examples"
         | 
| 51 | 
            +
                end
         | 
| 52 | 
            +
             | 
| 40 53 | 
             
                def register_deleted_examples(seen_examples)
         | 
| 41 54 | 
             
                  @deleted_examples = seen_examples.keys.to_set - (@skipped_examples | @all_examples.keys)
         | 
| 55 | 
            +
                  @deleted_examples -= @interrupted_examples
         | 
| 42 56 |  | 
| 43 57 | 
             
                  @deleted_examples.select! do |example_id|
         | 
| 44 58 | 
             
                    example = seen_examples[example_id]
         | 
| @@ -63,6 +77,10 @@ module RSpecTracer | |
| 63 77 | 
             
                  @pending_examples << example_id
         | 
| 64 78 | 
             
                end
         | 
| 65 79 |  | 
| 80 | 
            +
                def example_interrupted?(example_id)
         | 
| 81 | 
            +
                  @interrupted_examples.include?(example_id)
         | 
| 82 | 
            +
                end
         | 
| 83 | 
            +
             | 
| 66 84 | 
             
                def example_passed?(example_id)
         | 
| 67 85 | 
             
                  @passed_examples.include?(example_id)
         | 
| 68 86 | 
             
                end
         | 
| @@ -128,6 +146,8 @@ module RSpecTracer | |
| 128 146 |  | 
| 129 147 | 
             
                def generate_reverse_dependency_report
         | 
| 130 148 | 
             
                  @dependency.each_pair do |example_id, files|
         | 
| 149 | 
            +
                    next if @interrupted_examples.include?(example_id)
         | 
| 150 | 
            +
             | 
| 131 151 | 
             
                    example_file = @all_examples[example_id][:rerun_file_name]
         | 
| 132 152 |  | 
| 133 153 | 
             
                    files.each do |file_name|
         | 
| @@ -145,9 +165,11 @@ module RSpecTracer | |
| 145 165 | 
             
                    pid: RSpecTracer.pid,
         | 
| 146 166 | 
             
                    actual_count: RSpec.world.example_count + @skipped_examples.count,
         | 
| 147 167 | 
             
                    example_count: RSpec.world.example_count,
         | 
| 168 | 
            +
                    interrupted_examples: @interrupted_examples.count,
         | 
| 148 169 | 
             
                    failed_examples: @failed_examples.count,
         | 
| 149 170 | 
             
                    skipped_examples: @skipped_examples.count,
         | 
| 150 | 
            -
                    pending_examples: @pending_examples.count
         | 
| 171 | 
            +
                    pending_examples: @pending_examples.count,
         | 
| 172 | 
            +
                    flaky_examples: @flaky_examples.count
         | 
| 151 173 | 
             
                  }
         | 
| 152 174 | 
             
                end
         | 
| 153 175 |  | 
| @@ -182,6 +204,7 @@ module RSpecTracer | |
| 182 204 | 
             
                def initialize_examples
         | 
| 183 205 | 
             
                  @all_examples = {}
         | 
| 184 206 | 
             
                  @duplicate_examples = Hash.new { |examples, example_id| examples[example_id] = [] }
         | 
| 207 | 
            +
                  @interrupted_examples = Set.new
         | 
| 185 208 | 
             
                  @passed_examples = Set.new
         | 
| 186 209 | 
             
                  @possibly_flaky_examples = Set.new
         | 
| 187 210 | 
             
                  @flaky_examples = Set.new
         | 
    
        data/lib/rspec_tracer/runner.rb
    CHANGED
    
    | @@ -8,6 +8,7 @@ module RSpecTracer | |
| 8 8 | 
             
                EXAMPLE_RUN_REASON = {
         | 
| 9 9 | 
             
                  explicit_run: 'Explicit run',
         | 
| 10 10 | 
             
                  no_cache: 'No cache',
         | 
| 11 | 
            +
                  interrupted: 'Interrupted previously',
         | 
| 11 12 | 
             
                  flaky_example: 'Flaky example',
         | 
| 12 13 | 
             
                  failed_example: 'Failed previously',
         | 
| 13 14 | 
             
                  pending_example: 'Pending previously',
         | 
| @@ -59,6 +60,10 @@ module RSpecTracer | |
| 59 60 | 
             
                  @reporter.on_example_pending(example_id, execution_result)
         | 
| 60 61 | 
             
                end
         | 
| 61 62 |  | 
| 63 | 
            +
                def register_interrupted_examples
         | 
| 64 | 
            +
                  @reporter.register_interrupted_examples
         | 
| 65 | 
            +
                end
         | 
| 66 | 
            +
             | 
| 62 67 | 
             
                def register_deleted_examples
         | 
| 63 68 | 
             
                  @reporter.register_deleted_examples(@cache.all_examples)
         | 
| 64 69 | 
             
                end
         | 
| @@ -77,6 +82,7 @@ module RSpecTracer | |
| 77 82 |  | 
| 78 83 | 
             
                  @cache.cached_examples_coverage.each_pair do |example_id, example_coverage|
         | 
| 79 84 | 
             
                    example_coverage.each_pair do |file_path, line_coverage|
         | 
| 85 | 
            +
                      next if @reporter.example_interrupted?(example_id)
         | 
| 80 86 | 
             
                      next unless @reporter.example_skipped?(example_id)
         | 
| 81 87 |  | 
| 82 88 | 
             
                      file_name = RSpecTracer::SourceFile.file_name(file_path)
         | 
| @@ -97,6 +103,8 @@ module RSpecTracer | |
| 97 103 | 
             
                  filtered_files = Set.new
         | 
| 98 104 |  | 
| 99 105 | 
             
                  examples_coverage.each_pair do |example_id, example_coverage|
         | 
| 106 | 
            +
                    next if @reporter.example_interrupted?(example_id)
         | 
| 107 | 
            +
             | 
| 100 108 | 
             
                    register_example_files_dependency(example_id)
         | 
| 101 109 |  | 
| 102 110 | 
             
                    example_coverage.each_key do |file_path|
         | 
| @@ -122,6 +130,8 @@ module RSpecTracer | |
| 122 130 | 
             
                    @reporter.register_source_file(source_file)
         | 
| 123 131 |  | 
| 124 132 | 
             
                    @reporter.all_examples.each_key do |example_id|
         | 
| 133 | 
            +
                      next if @reporter.example_interrupted?(example_id)
         | 
| 134 | 
            +
             | 
| 125 135 | 
             
                      @reporter.register_dependency(example_id, source_file[:file_name])
         | 
| 126 136 | 
             
                    end
         | 
| 127 137 | 
             
                  end
         | 
| @@ -169,6 +179,7 @@ module RSpecTracer | |
| 169 179 | 
             
                end
         | 
| 170 180 |  | 
| 171 181 | 
             
                def filter_by_example_status
         | 
| 182 | 
            +
                  add_previously_interrupted_examples
         | 
| 172 183 | 
             
                  add_previously_flaky_examples
         | 
| 173 184 | 
             
                  add_previously_failed_examples
         | 
| 174 185 | 
             
                  add_previously_pending_examples
         | 
| @@ -183,6 +194,12 @@ module RSpecTracer | |
| 183 194 | 
             
                  end
         | 
| 184 195 | 
             
                end
         | 
| 185 196 |  | 
| 197 | 
            +
                def add_previously_interrupted_examples
         | 
| 198 | 
            +
                  @cache.interrupted_examples.each do |example_id|
         | 
| 199 | 
            +
                    @filtered_examples[example_id] = EXAMPLE_RUN_REASON[:interrupted]
         | 
| 200 | 
            +
                  end
         | 
| 201 | 
            +
                end
         | 
| 202 | 
            +
             | 
| 186 203 | 
             
                def add_previously_flaky_examples
         | 
| 187 204 | 
             
                  @cache.flaky_examples.each do |example_id|
         | 
| 188 205 | 
             
                    @filtered_examples[example_id] = EXAMPLE_RUN_REASON[:flaky_example]
         | 
| @@ -249,6 +266,8 @@ module RSpecTracer | |
| 249 266 | 
             
                end
         | 
| 250 267 |  | 
| 251 268 | 
             
                def register_example_files_dependency(example_id)
         | 
| 269 | 
            +
                  return if @reporter.example_interrupted?(example_id)
         | 
| 270 | 
            +
             | 
| 252 271 | 
             
                  example = @reporter.all_examples[example_id]
         | 
| 253 272 |  | 
| 254 273 | 
             
                  register_example_file_dependency(example_id, example[:file_name])
         | 
| @@ -259,6 +278,8 @@ module RSpecTracer | |
| 259 278 | 
             
                end
         | 
| 260 279 |  | 
| 261 280 | 
             
                def register_example_file_dependency(example_id, file_name)
         | 
| 281 | 
            +
                  return if @reporter.example_interrupted?(example_id)
         | 
| 282 | 
            +
             | 
| 262 283 | 
             
                  source_file = RSpecTracer::SourceFile.from_name(file_name)
         | 
| 263 284 |  | 
| 264 285 | 
             
                  @reporter.register_source_file(source_file)
         | 
| @@ -266,6 +287,8 @@ module RSpecTracer | |
| 266 287 | 
             
                end
         | 
| 267 288 |  | 
| 268 289 | 
             
                def register_file_dependency(example_id, file_path)
         | 
| 290 | 
            +
                  return if @reporter.example_interrupted?(example_id)
         | 
| 291 | 
            +
             | 
| 269 292 | 
             
                  source_file = RSpecTracer::SourceFile.from_path(file_path)
         | 
| 270 293 |  | 
| 271 294 | 
             
                  return false if RSpecTracer.filters.any? { |filter| filter.match?(source_file) }
         | 
    
        data/lib/rspec_tracer/version.rb
    CHANGED
    
    
    
        data/lib/rspec_tracer.rb
    CHANGED
    
    | @@ -196,6 +196,7 @@ module RSpecTracer | |
| 196 196 | 
             
                def process_dependency
         | 
| 197 197 | 
             
                  starting = Process.clock_gettime(Process::CLOCK_MONOTONIC)
         | 
| 198 198 |  | 
| 199 | 
            +
                  runner.register_interrupted_examples
         | 
| 199 200 | 
             
                  runner.register_deleted_examples
         | 
| 200 201 | 
             
                  runner.register_dependency(coverage_reporter.examples_coverage)
         | 
| 201 202 | 
             
                  runner.register_untraced_dependency(@traced_files)
         | 
    
        metadata
    CHANGED
    
    | @@ -1,14 +1,14 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: rspec-tracer
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 0.9. | 
| 4 | 
            +
              version: 0.9.2
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Abhimanyu Singh
         | 
| 8 8 | 
             
            autorequire:
         | 
| 9 9 | 
             
            bindir: bin
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 | 
            -
            date: 2021-09- | 
| 11 | 
            +
            date: 2021-09-30 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies:
         | 
| 13 13 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 14 14 | 
             
              name: docile
         | 
| @@ -113,7 +113,7 @@ licenses: | |
| 113 113 | 
             
            - MIT
         | 
| 114 114 | 
             
            metadata:
         | 
| 115 115 | 
             
              homepage_uri: https://github.com/avmnu-sng/rspec-tracer
         | 
| 116 | 
            -
              source_code_uri: https://github.com/avmnu-sng/rspec-tracer/tree/v0.9. | 
| 116 | 
            +
              source_code_uri: https://github.com/avmnu-sng/rspec-tracer/tree/v0.9.2
         | 
| 117 117 | 
             
              changelog_uri: https://github.com/avmnu-sng/rspec-tracer/blob/main/CHANGELOG.md
         | 
| 118 118 | 
             
              bug_tracker_uri: https://github.com/avmnu-sng/rspec-tracer/issues
         | 
| 119 119 | 
             
            post_install_message:
         |