Class: ArchUnit::Slices::Projection::SliceProjection

Inherits:
Object
  • Object
show all
Defined in:
lib/archunit/slices/projection/slice_projection.rb

Overview

Immutable callable mapper that also exposes the selected internal slice names.

Instance Method Summary collapse

Constructor Details

#initialize(&labeler) ⇒ SliceProjection

Returns a new instance of SliceProjection.

Raises:

  • (ArgumentError)


13
14
15
16
17
18
# File 'lib/archunit/slices/projection/slice_projection.rb', line 13

def initialize(&labeler)
  raise ArgumentError, 'a slice labeler block is required' unless labeler

  @labeler = labeler.freeze
  freeze
end

Instance Method Details

#call(edge) ⇒ Object



20
21
22
23
24
25
26
27
28
29
30
31
32
# File 'lib/archunit/slices/projection/slice_projection.rb', line 20

def call(edge)
  validate_edge(edge)
  return if edge.source == edge.target

  source_label = label_for(edge.source)
  return unless source_label

  target_label = edge.external ? edge.target : label_for(edge.target)
  return unless target_label
  return if !edge.external && source_label == target_label

  Common::Projection::MappedEdge.new(source_label:, target_label:)
end

#label_for(path) ⇒ Object

Raises:

  • (TypeError)


43
44
45
46
47
48
49
50
51
52
53
# File 'lib/archunit/slices/projection/slice_projection.rb', line 43

def label_for(path)
  unless path.is_a?(String) && !path.empty?
    raise ArgumentError, 'path must be a non-empty String'
  end

  label = @labeler.call(Common::PatternMatching.normalize_path(path))
  return if label.nil?
  return label.dup.freeze if label.is_a?(String) && !label.empty?

  raise TypeError, 'slice labelers must return a non-empty String or nil'
end

#slice_labels(graph) ⇒ Object



34
35
36
37
38
39
40
41
# File 'lib/archunit/slices/projection/slice_projection.rb', line 34

def slice_labels(graph)
  labels = []
  each_edge(graph) do |edge|
    labels << label_for(edge.source)
    labels << label_for(edge.target) unless edge.external
  end
  labels.compact.uniq.sort.freeze
end