Class: Psych::Merge::MergeResult

Inherits:
Ast::Merge::MergeResultBase
  • Object
show all
Includes:
Ast::Merge::StructuredReviewApplySupport
Defined in:
lib/psych/merge/merge_result.rb

Overview

Tracks the result of a merge operation, including the merged content, decisions made, and statistics.

Inherits decision constants and base functionality from Ast::Merge::MergeResultBase.

Examples:

Basic usage

result = MergeResult.new
result.add_line("key: value", decision: :kept_template, source: :template)
result.to_yaml # => "key: value\n"

Constant Summary collapse

DECISION_KEPT_TEMPLATE =

Inherit decision constants from base class

Ast::Merge::MergeResultBase::DECISION_KEPT_TEMPLATE
DECISION_KEPT_DEST =
Ast::Merge::MergeResultBase::DECISION_KEPT_DEST
DECISION_MERGED =
Ast::Merge::MergeResultBase::DECISION_MERGED
DECISION_ADDED =
Ast::Merge::MergeResultBase::DECISION_ADDED
DECISION_FREEZE_BLOCK =
Ast::Merge::MergeResultBase::DECISION_FREEZE_BLOCK

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(**options) ⇒ MergeResult

Initialize a new merge result



29
30
31
32
33
34
35
36
37
38
# File 'lib/psych/merge/merge_result.rb', line 29

def initialize(**options)
  super(**options)
  @statistics = {
    template_lines: 0,
    dest_lines: 0,
    merged_lines: 0,
    freeze_preserved_lines: 0,
    total_decisions: 0
  }
end

Instance Attribute Details

#statistics ⇒ Hash (readonly)



25
26
27
# File 'lib/psych/merge/merge_result.rb', line 25

def statistics
  @statistics
end

Instance Method Details

#add_blank_line(decision: DECISION_MERGED, source: :merged) ⇒ Object

Add a blank line



88
89
90
# File 'lib/psych/merge/merge_result.rb', line 88

def add_blank_line(decision: DECISION_MERGED, source: :merged)
  add_line('', decision: decision, source: source)
end

#add_freeze_block(freeze_node) ⇒ Object

Add content from a freeze block



95
96
97
98
99
100
101
102
103
104
# File 'lib/psych/merge/merge_result.rb', line 95

def add_freeze_block(freeze_node)
  freeze_node.lines.each_with_index do |line, idx|
    add_line(
      line.chomp,
      decision: DECISION_FREEZE_BLOCK,
      source: :destination,
      original_line: freeze_node.start_line + idx
    )
  end
end

#add_line(line, decision:, source:, original_line: nil) ⇒ Object

Add a single line to the result



46
47
48
49
50
51
52
53
54
55
56
# File 'lib/psych/merge/merge_result.rb', line 46

def add_line(line, decision:, source:, original_line: nil)
  @lines << {
    content: line,
    decision: decision,
    source: source,
    original_line: original_line
  }

  track_statistics(decision, source)
  track_decision(decision, source, line: original_line)
end

#add_lines(lines, decision:, source:, start_line: nil) ⇒ Object

Add multiple lines to the result



64
65
66
67
68
69
# File 'lib/psych/merge/merge_result.rb', line 64

def add_lines(lines, decision:, source:, start_line: nil)
  lines.each_with_index do |line, idx|
    original_line = start_line ? start_line + idx : nil
    add_line(line, decision: decision, source: source, original_line: original_line)
  end
end

#add_lines_from(lines, decision:, source:, start_line: nil) ⇒ Object

Add lines from an array, preserving trailing newlines



77
78
79
80
81
82
# File 'lib/psych/merge/merge_result.rb', line 77

def add_lines_from(lines, decision:, source:, start_line: nil)
  lines.each_with_index do |line, idx|
    original_line = start_line ? start_line + idx : nil
    add_line(line, decision: decision, source: source, original_line: original_line)
  end
end

#add_mapping_entry(entry, decision:, source:) ⇒ Object

Add content from a mapping entry



111
112
113
114
115
116
117
118
119
120
# File 'lib/psych/merge/merge_result.rb', line 111

def add_mapping_entry(entry, decision:, source:)
  return unless entry.start_line && entry.end_line

  (entry.start_line..entry.end_line).each do |line_num|
    line = entry.lines[line_num - 1]
    next unless line

    add_line(line.chomp, decision: decision, source: source, original_line: line_num)
  end
end

#content ⇒ String

Alias for to_yaml



134
135
136
# File 'lib/psych/merge/merge_result.rb', line 134

def content
  to_yaml
end

#to_yaml ⇒ String

Get the merged content as a YAML string



125
126
127
128
129
130
# File 'lib/psych/merge/merge_result.rb', line 125

def to_yaml
  content = @lines.map { |l| l[:content] }.join("\n")
  # Ensure trailing newline
  content += "\n" unless content.end_with?("\n") || content.empty?
  content
end