Class: Markdown::Merge::MergeResult

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

Overview

Represents the result of a Markdown merge operation.

Inherits from Ast::Merge::MergeResultBase to provide consistent result handling across all merge gems. Contains the merged content along with metadata about conflicts, frozen sections, and changes made.

Examples:

Successful merge

result = SmartMerger.merge(source_a, source_b)
if result.success?
  File.write("merged.md", result.content)
end

Handling conflicts

result = SmartMerger.merge(source_a, source_b)
if result.conflicts?
  result.conflicts.each do |conflict|
    puts "Conflict at: #{conflict[:location]}"
  end
end

Checking for document problems

result = SmartMerger.merge(source_a, source_b, normalize_whitespace: true)
result.problems.by_category(:excessive_whitespace).each do |problem|
  puts "Whitespace issue at line #{problem.details[:line]}"
end

See Also:

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(content:, raw_content: nil, conflicts: [], frozen_blocks: [], stats: {}, problems: nil, **options) ⇒ MergeResult

Initialize a new MergeResult

Parameters:

  • content (String, nil)

    Merged content (nil if merge failed)

  • conflicts (Array<Hash>) (defaults to: [])

    Conflict descriptions

  • frozen_blocks (Array<Hash>) (defaults to: [])

    Preserved frozen block info

  • stats (Hash) (defaults to: {})

    Merge statistics

  • problems (DocumentProblems, nil) (defaults to: nil)

    Document problems found

  • options (Hash)

    Additional options for forward compatibility



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

def initialize(content:, raw_content: nil, conflicts: [], frozen_blocks: [], stats: {}, problems: nil, **options)
  super(
    conflicts: conflicts,
    frozen_blocks: frozen_blocks,
    stats: default_stats.merge(stats),
    **options
  )
  @content_raw = content
  @raw_content = raw_content || content
  @problems = problems || DocumentProblems.new
end

Instance Attribute Details

#problemsDocumentProblems (readonly)

Returns Problems found during merge.

Returns:



37
38
39
# File 'lib/markdown/merge/merge_result.rb', line 37

def problems
  @problems
end

Instance Method Details

#apply_unresolved_resolutions!(resolutions) ⇒ Object



163
164
165
166
167
168
169
170
# File 'lib/markdown/merge/merge_result.rb', line 163

def apply_unresolved_resolutions!(resolutions)
  normalized = normalize_unresolved_resolutions(resolutions)
  handled_case_ids = apply_grouped_delegated_resolutions!(normalized)
  remaining = normalized.reject { |case_id, _| handled_case_ids.include?(case_id) }
  apply_output_range_resolutions_descending!(remaining)
  fallback = remaining.reject { |case_id, _| handled_case_ids.include?(case_id) }
  super(fallback)
end

#conflicts?Boolean

Check if there are unresolved conflicts

Returns:

  • (Boolean)

    True if conflicts exist



92
93
94
# File 'lib/markdown/merge/merge_result.rb', line 92

def conflicts?
  !conflicts.empty?
end

#contentString?

Get the merged content as a string. Overrides base class to return string content directly.

Returns:

  • (String, nil)

    The merged Markdown content



63
64
65
# File 'lib/markdown/merge/merge_result.rb', line 63

def content
  @content_raw
end

#content?Boolean

Check if content has been set (not nil). Overrides base class for string-based content.

Returns:

  • (Boolean)


71
72
73
# File 'lib/markdown/merge/merge_result.rb', line 71

def content?
  !@content_raw.nil?
end

#content_stringString?

Get content as a string (alias for content in this class).

Returns:

  • (String, nil)

    The merged content



78
79
80
# File 'lib/markdown/merge/merge_result.rb', line 78

def content_string
  @content_raw
end

#frozen_countInteger

Get count of frozen blocks preserved

Returns:

  • (Integer)

    Number of frozen blocks



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

def frozen_count
  frozen_blocks.size
end

#has_frozen_blocks?Boolean

Check if any frozen blocks were preserved

Returns:

  • (Boolean)

    True if frozen blocks were preserved



99
100
101
# File 'lib/markdown/merge/merge_result.rb', line 99

def has_frozen_blocks?
  !frozen_blocks.empty?
end

#inspectString

String representation for debugging

Returns:

  • (String)

    Debug representation



141
142
143
144
145
# File 'lib/markdown/merge/merge_result.rb', line 141

def inspect
  status = success? ? 'success' : 'failed'
  "#<#{self.class.name} #{status} conflicts=#{conflicts.size} frozen=#{frozen_blocks.size} " \
    "added=#{nodes_added} removed=#{nodes_removed} modified=#{nodes_modified}>"
end

#merge_time_msFloat?

Get merge duration in milliseconds

Returns:

  • (Float, nil)

    Merge time in milliseconds



127
128
129
# File 'lib/markdown/merge/merge_result.rb', line 127

def merge_time_ms
  stats[:merge_time_ms]
end

#nodes_addedInteger

Get count of nodes added during merge

Returns:

  • (Integer)

    Number of nodes added



106
107
108
# File 'lib/markdown/merge/merge_result.rb', line 106

def nodes_added
  stats[:nodes_added] || 0
end

#nodes_modifiedInteger

Get count of nodes modified during merge

Returns:

  • (Integer)

    Number of nodes modified



120
121
122
# File 'lib/markdown/merge/merge_result.rb', line 120

def nodes_modified
  stats[:nodes_modified] || 0
end

#nodes_removedInteger

Get count of nodes removed during merge

Returns:

  • (Integer)

    Number of nodes removed



113
114
115
# File 'lib/markdown/merge/merge_result.rb', line 113

def nodes_removed
  stats[:nodes_removed] || 0
end

#success?Boolean

Check if merge was successful (no unresolved conflicts)

Returns:

  • (Boolean)

    True if merge succeeded



85
86
87
# File 'lib/markdown/merge/merge_result.rb', line 85

def success?
  conflicts.empty? && content?
end

#to_sString

Convert to string (returns merged content)

Returns:

  • (String)

    The merged content or empty string



150
151
152
# File 'lib/markdown/merge/merge_result.rb', line 150

def to_s
  content || ''
end

#to_unresolved_review_state(selections: {}, metadata: {}) ⇒ Object



154
155
156
157
158
159
160
161
# File 'lib/markdown/merge/merge_result.rb', line 154

def to_unresolved_review_state(selections: {}, metadata: {})
  normalized_selections = normalize_unresolved_resolutions(selections)
  Ast::Merge::UnresolvedReviewState.new(
    cases: serializable_unresolved_cases,
    selections: delegated_applied_selections.merge(normalized_selections),
    metadata: (, normalized_selections)
  )
end