File: metadata_helpers.rb

package info (click to toggle)
ruby-test-prof 0.12.2%2Bdfsg-1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm, bullseye, forky, sid, trixie
  • size: 508 kB
  • sloc: ruby: 4,075; makefile: 4
file content (67 lines) | stat: -rw-r--r-- 2,256 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
# frozen_string_literal: true

module RuboCop
  module Cop
    module RSpec
      class AggregateExamples < ::RuboCop::Cop::Cop
        # @internal
        #   Support methods for example metadata.
        #   Examples with similar metadata are grouped.
        #
        #   Depending on the configuration, `aggregate_failures` metadata
        #   is added to aggregated examples.
        module MetadataHelpers
          private

          def metadata_for_aggregated_example(metadata)
            metadata_to_add = metadata.compact.map(&:source)
            if add_aggregate_failures_metadata?
              metadata_to_add.unshift(":aggregate_failures")
            end
            if metadata_to_add.any?
              "(#{metadata_to_add.join(", ")})"
            else
              ""
            end
          end

          # Used to group examples for aggregation. `aggregate_failures`
          # and `aggregate_failures: true` metadata are not taken in
          # consideration, as it is dynamically set basing on cofiguration.
          # If `aggregate_failures: false` is set on the example, it's
          # preserved and is treated as regular metadata.
          def metadata_without_aggregate_failures(example)
            metadata = example_metadata(example) || []

            symbols = metadata_symbols_without_aggregate_failures(metadata)
            pairs = metadata_pairs_without_aggegate_failures(metadata)

            [*symbols, pairs].flatten.compact
          end

          def example_metadata(example)
            example.send_node.arguments
          end

          def metadata_symbols_without_aggregate_failures(metadata)
            metadata
              .select(&:sym_type?)
              .reject { |item| item.value == :aggregate_failures }
          end

          def metadata_pairs_without_aggegate_failures(metadata)
            map = metadata.find(&:hash_type?)
            pairs = map&.pairs || []
            pairs.reject do |pair|
              pair.key.value == :aggregate_failures && pair.value.true_type?
            end
          end

          def add_aggregate_failures_metadata?
            cop_config.fetch("AddAggregateFailuresMetadata", false)
          end
        end
      end
    end
  end
end