Class: Canon::Diff::DiffContextBuilder

Inherits:
Object
  • Object
show all
Defined in:
lib/canon/diff/diff_context_builder.rb

Overview

Builds DiffContexts from DiffBlocks Groups nearby blocks and adds surrounding context lines

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(diff_blocks, all_lines, context_lines, grouping_lines) ⇒ DiffContextBuilder

Returns a new instance of DiffContextBuilder.



22
23
24
25
26
27
# File 'lib/canon/diff/diff_context_builder.rb', line 22

def initialize(diff_blocks, all_lines, context_lines, grouping_lines)
  @diff_blocks = diff_blocks
  @all_lines = all_lines
  @context_lines = context_lines
  @grouping_lines = grouping_lines
end

Class Method Details

.build_contexts(diff_blocks, all_lines, context_lines: 3, grouping_lines: nil) ⇒ Array<DiffContext>

Build contexts from diff blocks

Parameters:

  • diff_blocks (Array<DiffBlock>)

    The diff blocks to group

  • all_lines (Array<DiffLine>)

    All diff lines (for context)

  • context_lines (Integer) (defaults to: 3)

    Number of context lines to show

  • grouping_lines (Integer, nil) (defaults to: nil)

    Max lines between blocks to group them

Returns:

  • (Array<DiffContext>)

    Grouped contexts with context lines



17
18
19
20
# File 'lib/canon/diff/diff_context_builder.rb', line 17

def self.build_contexts(diff_blocks, all_lines, context_lines: 3,
grouping_lines: nil)
  new(diff_blocks, all_lines, context_lines, grouping_lines).build
end

Instance Method Details

#buildObject



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
# File 'lib/canon/diff/diff_context_builder.rb', line 29

def build
  return [] if @diff_blocks.empty?

  # Group nearby blocks if grouping_lines is specified
  grouped_blocks = if @grouping_lines
                     group_nearby_blocks(@diff_blocks, @grouping_lines)
                   else
                     @diff_blocks.zip
                   end

  # Create contexts with context lines
  contexts = grouped_blocks.map do |block_group|
    create_context_for_blocks(block_group)
  end

  # Merge overlapping contexts to avoid duplicate line display
  contexts = merge_overlapping_contexts(contexts)

  # Filter out all-informative contexts if show_diffs was :normative
  # Note: The filtering based on show_diffs happens at the block level
  # in DiffBlockBuilder, so we don't need to re-filter here.
  # However, we should filter out contexts that have NO blocks
  # (which could happen if all blocks were filtered out)
  contexts.reject { |ctx| ctx.blocks.empty? }
end