Module: ArchUnit::Metrics::Assertion

Defined in:
lib/archunit/metrics/assertion/metric_zone.rb,
lib/archunit/metrics/assertion/custom_metric.rb,
lib/archunit/metrics/assertion/metric_predicate.rb,
lib/archunit/metrics/assertion/metric_threshold.rb

Overview

Pure metric threshold assertions and structured violation data.

Defined Under Namespace

Classes: CustomMetricViolation, MetricPredicateViolation, MetricThresholdViolation, MetricZoneViolation

Class Method Summary collapse

Class Method Details

.gather_custom_metric_violations(class_infos, metric, predicate) ⇒ Object



46
47
48
49
50
51
52
53
54
55
56
57
# File 'lib/archunit/metrics/assertion/custom_metric.rb', line 46

def gather_custom_metric_violations(class_infos, metric, predicate)
  validate_custom_metric_arguments(class_infos, metric, predicate)
  class_infos.filter_map do |class_info|
    value = metric.calculate(class_info)
    next if predicate.call(value, class_info)

    CustomMetricViolation.new(
      class_info:, metric_name: metric.name,
      description: metric.description, value:
    )
  end
end

.gather_metric_predicate_violations(subjects, metric, predicate) ⇒ Object



42
43
44
45
46
47
48
49
50
# File 'lib/archunit/metrics/assertion/metric_predicate.rb', line 42

def gather_metric_predicate_violations(subjects, metric, predicate)
  validate_predicate_assertion(subjects, metric, predicate)
  subjects.filter_map do |subject|
    value = metric.calculate(subject)
    next if predicate.call(value, subject)

    MetricPredicateViolation.new(subject:, metric_name: metric.name, value:)
  end
end

.gather_metric_threshold_violations(subjects, metric, comparison, threshold) ⇒ Object



54
55
56
57
58
59
60
61
62
63
64
65
66
# File 'lib/archunit/metrics/assertion/metric_threshold.rb', line 54

def gather_metric_threshold_violations(subjects, metric, comparison, threshold)
  validate_metric_assertion(subjects, metric)
  threshold = validate_threshold(comparison, threshold)

  subjects.filter_map do |subject|
    value = metric.calculate(subject)
    next if threshold_satisfied?(value, comparison, threshold)

    MetricThresholdViolation.new(
      subject:, metric_name: metric.name, value:, threshold:, comparison:
    )
  end
end

.gather_metric_zone_violations(distance_infos, zone) ⇒ Object



41
42
43
44
45
46
47
48
49
50
51
52
53
54
# File 'lib/archunit/metrics/assertion/metric_zone.rb', line 41

def gather_metric_zone_violations(distance_infos, zone)
  unless distance_infos.is_a?(Array) && distance_infos.all?(Extraction::DistanceInfo)
    raise ArgumentError, 'distance_infos must be an Array of DistanceInfo values'
  end
  unless MetricZoneViolation::ZONES.include?(zone)
    raise ArgumentError, "unknown architectural zone: #{zone.inspect}"
  end

  distance_infos.filter_map do |distance_info|
    next unless Calculation::Distance.in_zone?(distance_info, zone)

    MetricZoneViolation.new(distance_info:, zone:)
  end
end