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
|