Module: Ast::Merge::Detector::Mergeable

Included in:
SmartMergerBase
Defined in:
lib/ast/merge/detector/mergeable.rb

Overview

Mixin for adding region support to SmartMerger classes.

This module provides functionality for detecting and handling regions within documents that should be merged with different strategies. Regions are portions of a document (like YAML frontmatter or fenced code blocks) that may require specialized merging.

Examples:

Basic region configuration

class SmartMerger
  include Detector::Mergeable

  def initialize(template, dest, regions: [], region_placeholder: nil)
    @template_content = template
    @dest_content = dest
    setup_regions(regions: regions, region_placeholder: region_placeholder)
  end
end

With YAML frontmatter regions

merger = SmartMerger.new(
  template,
  dest,
  regions: [
    {
      detector: Detector::YamlFrontmatter.new,
      merger_class: SomeYamlMerger,
      merger_options: { preserve_order: true }
    }
  ]
)

With nested regions (code blocks in markdown)

merger = SmartMerger.new(
  template,
  dest,
  regions: [
    {
      detector: Detector::FencedCodeBlock.ruby,
      merger_class: Prism::Merge::SmartMerger,
      regions: [...]  # Nested regions!
    }
  ]
)

See Also:

Defined Under Namespace

Classes: Config, ExtractedRegion

Constant Summary collapse

DEFAULT_PLACEHOLDER_PREFIX =

Default placeholder prefix for extracted regions

'<<<AST_MERGE_REGION_'
DEFAULT_PLACEHOLDER_SUFFIX =

Default placeholder suffix for extracted regions.

'>>>'

Instance Method Summary collapse

Instance Method Details

#extract_dest_regions(content) ⇒ String

Extract regions from the destination content, replacing with placeholders.

Parameters:

  • content (String)

    Destination content

Returns:

  • (String)

    Content with regions replaced by placeholders

Raises:



132
133
134
135
136
# File 'lib/ast/merge/detector/mergeable.rb', line 132

def extract_dest_regions(content)
  return content unless regions_configured?

  extract_regions(content, @extracted_dest_regions)
end

#extract_template_regions(content) ⇒ String

Extract regions from the template content, replacing with placeholders.

Parameters:

  • content (String)

    Template content

Returns:

  • (String)

    Content with regions replaced by placeholders

Raises:



119
120
121
122
123
# File 'lib/ast/merge/detector/mergeable.rb', line 119

def extract_template_regions(content)
  return content unless regions_configured?

  extract_regions(content, @extracted_template_regions)
end

#regions_configured?Boolean

Check if this merger has region configurations.

Returns:

  • (Boolean)

    true if regions are configured



108
109
110
# File 'lib/ast/merge/detector/mergeable.rb', line 108

def regions_configured?
  @region_configs && !@region_configs.empty?
end

#setup_regions(regions:, region_placeholder: nil) ⇒ Object

Set up region handling for this merger instance.

Parameters:

  • regions (Array<Hash>)

    Array of region configurations

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

    Custom placeholder prefix (optional)

Raises:

  • (ArgumentError)

    if regions configuration is invalid



96
97
98
99
100
101
# File 'lib/ast/merge/detector/mergeable.rb', line 96

def setup_regions(regions:, region_placeholder: nil)
  @region_configs = build_region_configs(regions)
  @region_placeholder_prefix = region_placeholder || DEFAULT_PLACEHOLDER_PREFIX
  @extracted_template_regions = []
  @extracted_dest_regions = []
end

#substitute_merged_regions(merged_content) ⇒ String

Merge extracted regions and substitute them back into the merged content.

Parameters:

  • merged_content (String)

    The merged content with placeholders

Returns:

  • (String)

    Content with placeholders replaced by merged regions



144
145
146
147
148
149
150
151
152
# File 'lib/ast/merge/detector/mergeable.rb', line 144

def substitute_merged_regions(merged_content)
  return merged_content unless regions_configured?

  result = merged_content

  # Process regions in reverse order of extraction to handle nested placeholders
  # We need to merge template and dest regions by their placeholder index
  merge_and_substitute_regions(result)
end