Class: ArchUnit::Slices::Projection::SliceProjection
- Inherits:
-
Object
- Object
- ArchUnit::Slices::Projection::SliceProjection
- 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
- #call(edge) ⇒ Object
-
#initialize(&labeler) ⇒ SliceProjection
constructor
A new instance of SliceProjection.
- #label_for(path) ⇒ Object
- #slice_labels(graph) ⇒ Object
Constructor Details
#initialize(&labeler) ⇒ SliceProjection
Returns a new instance of SliceProjection.
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
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 |