Class: Dotenv::Merge::MergeResult

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

Overview

Result container for dotenv file merge operations. Inherits from Ast::Merge::MergeResultBase for shared functionality.

Tracks merged content, decisions made during merge, and provides methods to reconstruct the final merged dotenv file.

Examples:

Basic usage

result = MergeResult.new(template_analysis, dest_analysis)
result.add_from_template(0)
result.add_from_destination(1)
merged_content = result.to_s

See Also:

  • Ast::Merge::MergeResultBase

Constant Summary collapse

DECISION_FREEZE_BLOCK =

Decision indicating content was preserved from a freeze block

Returns:

  • (Symbol)
:freeze_block
DECISION_TEMPLATE =

Decision indicating content came from the template

Returns:

  • (Symbol)
:template
DECISION_DESTINATION =

Decision indicating content came from the destination (customization preserved)

Returns:

  • (Symbol)
:destination
DECISION_ADDED =

Decision indicating content was added from template (new in template)

Returns:

  • (Symbol)
:added

Instance Method Summary collapse

Constructor Details

#initialize(template_analysis, dest_analysis) ⇒ MergeResult

Initialize a new merge result

Parameters:

  • template_analysis (FileAnalysis)

    Analysis of the template file

  • dest_analysis (FileAnalysis)

    Analysis of the destination file



38
39
40
# File 'lib/dotenv/merge/merge_result.rb', line 38

def initialize(template_analysis, dest_analysis)
  super(template_analysis: template_analysis, dest_analysis: dest_analysis)
end

Instance Method Details

#add_freeze_block(freeze_node) ⇒ void

This method returns an undefined value.

Add content from a freeze block

Parameters:

  • freeze_node (FreezeNode)

    The freeze block to add



71
72
73
74
75
76
77
78
79
80
81
# File 'lib/dotenv/merge/merge_result.rb', line 71

def add_freeze_block(freeze_node)
  lines = freeze_node.lines.map(&:raw)
  @lines.concat(lines)
  @decisions << {
    decision: DECISION_FREEZE_BLOCK,
    source: :destination,
    start_line: freeze_node.start_line,
    end_line: freeze_node.end_line,
    lines: lines.length,
  }
end

#add_from_destination(index, decision: DECISION_DESTINATION) ⇒ void

This method returns an undefined value.

Add content from the destination at the given statement index

Parameters:

  • index (Integer)

    Statement index in destination

  • decision (Symbol) (defaults to: DECISION_DESTINATION)

    Decision type (default: DECISION_DESTINATION)



59
60
61
62
63
64
65
66
# File 'lib/dotenv/merge/merge_result.rb', line 59

def add_from_destination(index, decision: DECISION_DESTINATION)
  statement = @dest_analysis.statements[index]
  return unless statement

  lines = extract_lines(statement)
  @lines.concat(lines)
  @decisions << {decision: decision, source: :destination, index: index, lines: lines.length}
end

#add_from_template(index, decision: DECISION_TEMPLATE) ⇒ void

This method returns an undefined value.

Add content from the template at the given statement index

Parameters:

  • index (Integer)

    Statement index in template

  • decision (Symbol) (defaults to: DECISION_TEMPLATE)

    Decision type (default: DECISION_TEMPLATE)



46
47
48
49
50
51
52
53
# File 'lib/dotenv/merge/merge_result.rb', line 46

def add_from_template(index, decision: DECISION_TEMPLATE)
  statement = @template_analysis.statements[index]
  return unless statement

  lines = extract_lines(statement)
  @lines.concat(lines)
  @decisions << {decision: decision, source: :template, index: index, lines: lines.length}
end

#add_raw(lines, decision:) ⇒ void

This method returns an undefined value.

Add raw content lines

Parameters:

  • lines (Array<String>)

    Lines to add

  • decision (Symbol)

    Decision type



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

def add_raw(lines, decision:)
  @lines.concat(lines)
  @decisions << {decision: decision, source: :raw, lines: lines.length}
end

#empty?Boolean

Check if any content has been added

Returns:

  • (Boolean)


105
106
107
# File 'lib/dotenv/merge/merge_result.rb', line 105

def empty?
  @lines.empty?
end

#summaryHash

Get summary of merge decisions

Returns:

  • (Hash)

    Summary with counts by decision type



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

def summary
  counts = @decisions.group_by { |d| d[:decision] }.transform_values(&:count)
  {
    total_decisions: @decisions.length,
    total_lines: @lines.length,
    by_decision: counts,
  }
end

#to_sString

Convert the merged result to a string

Returns:

  • (String)

    The merged dotenv content



94
95
96
97
98
99
100
101
# File 'lib/dotenv/merge/merge_result.rb', line 94

def to_s
  return "" if @lines.empty?

  # Join with newlines and ensure file ends with newline
  result = @lines.join("\n")
  result += "\n" unless result.end_with?("\n")
  result
end