Class: Canon::Diff::DiffContextBuilder
- Inherits:
-
Object
- Object
- Canon::Diff::DiffContextBuilder
- 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
-
.build_contexts(diff_blocks, all_lines, context_lines: 3, grouping_lines: nil) ⇒ Array<DiffContext>
Build contexts from diff blocks.
Instance Method Summary collapse
- #build ⇒ Object
-
#initialize(diff_blocks, all_lines, context_lines, grouping_lines) ⇒ DiffContextBuilder
constructor
A new instance of DiffContextBuilder.
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
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
#build ⇒ Object
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 |