Class: Ast::Merge::Text::SmartMerger

Inherits:
SmartMergerBase show all
Defined in:
lib/ast/merge/text/smart_merger.rb

Overview

Smart merger for text-based files.

Provides intelligent merging of two text files using a simple line-based AST where lines are top-level nodes and words are nested nodes.

Examples:

Basic merge (destination customizations preserved)

merger = SmartMerger.new(template_content, dest_content)
result = merger.merge
puts result  # Merged content

Template wins merge

merger = SmartMerger.new(
  template_content,
  dest_content,
  preference: :template,
  add_template_only_nodes: true
)
result = merger.merge

With freeze blocks

template = <<~TEXT
  Line one
  Line two
TEXT

dest = <<~TEXT
  Line one modified
  # text-merge:freeze
  Custom content
  # text-merge:unfreeze
TEXT

merger = SmartMerger.new(template, dest)
result = merger.merge
# => "Line one modified\n# text-merge:freeze\nCustom content\n# text-merge:unfreeze"

With regions (embedded code blocks)

merger = SmartMerger.new(
  template_content,
  dest_content,
  regions: [
    { detector: FencedCodeBlockDetector.ruby, merger_class: SomeRubyMerger }
  ]
)

Constant Summary collapse

DEFAULT_FREEZE_TOKEN =

Default freeze token for text merging

"text-merge"

Constants included from RegionMergeable

RegionMergeable::DEFAULT_PLACEHOLDER_PREFIX, RegionMergeable::DEFAULT_PLACEHOLDER_SUFFIX

Instance Attribute Summary

Attributes inherited from SmartMergerBase

#add_template_only_nodes, #aligner, #dest_analysis, #dest_content, #freeze_token, #match_refiner, #preference, #resolver, #result, #signature_generator, #template_analysis, #template_content

Instance Method Summary collapse

Methods inherited from SmartMergerBase

#merge, #merge_result, #merge_with_debug

Methods included from RegionMergeable

#extract_dest_regions, #extract_template_regions, #regions_configured?, #setup_regions, #substitute_merged_regions

Constructor Details

#initialize(template_content, dest_content, preference: :destination, add_template_only_nodes: false, freeze_token: DEFAULT_FREEZE_TOKEN, signature_generator: nil, regions: nil, region_placeholder: nil) ⇒ SmartMerger

Initialize a new SmartMerger

Parameters:

  • template_content (String)

    Template text content

  • dest_content (String)

    Destination text content

  • preference (Symbol) (defaults to: :destination)

    :destination or :template

  • add_template_only_nodes (Boolean) (defaults to: false)

    Whether to add template-only lines

  • freeze_token (String) (defaults to: DEFAULT_FREEZE_TOKEN)

    Token for freeze block markers

  • signature_generator (Proc, nil) (defaults to: nil)

    Custom signature generator

  • regions (Array<Hash>, nil) (defaults to: nil)

    Region configurations for nested merging

  • region_placeholder (String, nil) (defaults to: nil)

    Custom placeholder for regions



64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
# File 'lib/ast/merge/text/smart_merger.rb', line 64

def initialize(
  template_content,
  dest_content,
  preference: :destination,
  add_template_only_nodes: false,
  freeze_token: DEFAULT_FREEZE_TOKEN,
  signature_generator: nil,
  regions: nil,
  region_placeholder: nil
)
  super(
    template_content,
    dest_content,
    signature_generator: signature_generator,
    preference: preference,
    add_template_only_nodes: add_template_only_nodes,
    freeze_token: freeze_token,
    regions: regions,
    region_placeholder: region_placeholder,
  )
end

Instance Method Details

#statsHash

Get merge statistics

Returns:

  • (Hash)

    Statistics about the merge



89
90
91
92
93
94
95
96
97
# File 'lib/ast/merge/text/smart_merger.rb', line 89

def stats
  merge_result # Ensure merge has run
  {
    template_lines: @template_analysis.statements.count { |s| s.is_a?(LineNode) },
    dest_lines: @dest_analysis.statements.count { |s| s.is_a?(LineNode) },
    result_lines: @result.lines.size,
    decisions: @result.decision_summary,
  }
end