Class: Dotenv::Merge::FileAnalysis

Inherits:
Object
  • Object
show all
Includes:
Ast::Merge::FileAnalyzable
Defined in:
lib/dotenv/merge/file_analysis.rb

Overview

File analysis for dotenv files. Parses dotenv source and extracts environment variable assignments, comments, and freeze blocks.

Dotenv files follow a simple format:

  • ‘KEY=value` - Environment variable assignment

  • ‘export KEY=value` - Assignment with export prefix

  • ‘# comment` - Comment line

  • Blank lines are preserved

Examples:

Basic usage

analysis = FileAnalysis.new(dotenv_source)
analysis.statements.each do |stmt|
  puts stmt.class
end

With custom freeze token

analysis = FileAnalysis.new(source, freeze_token: "my-merge")
# Looks for: # my-merge:freeze / # my-merge:unfreeze

Constant Summary collapse

DEFAULT_FREEZE_TOKEN =

Default freeze token for identifying freeze blocks

Returns:

  • (String)
"dotenv-merge"

Instance Method Summary collapse

Constructor Details

#initialize(source, freeze_token: DEFAULT_FREEZE_TOKEN, signature_generator: nil) ⇒ FileAnalysis

Initialize file analysis with dotenv parser

Parameters:

  • source (String)

    Dotenv source code to analyze

  • freeze_token (String) (defaults to: DEFAULT_FREEZE_TOKEN)

    Token for freeze block markers (default: “dotenv-merge”)

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

    Custom signature generator



36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
# File 'lib/dotenv/merge/file_analysis.rb', line 36

def initialize(source, freeze_token: DEFAULT_FREEZE_TOKEN, signature_generator: nil)
  @source = source
  @freeze_token = freeze_token
  @signature_generator = signature_generator

  # Parse all lines
  @lines = parse_lines(source)

  # Extract and integrate freeze blocks
  @statements = extract_and_integrate_statements

  DebugLogger.debug("FileAnalysis initialized", {
    signature_generator: signature_generator ? "custom" : "default",
    lines_count: @lines.size,
    statements_count: @statements.size,
    freeze_blocks: freeze_blocks.size,
    assignments: assignment_lines.size,
  })
end

Instance Method Details

#all_assignmentsArray<EnvLine>

Get all assignment lines including those in freeze blocks

Returns:



70
71
72
# File 'lib/dotenv/merge/file_analysis.rb', line 70

def all_assignments
  @lines.select(&:assignment?)
end

#assignment_linesArray<EnvLine>

Get assignment lines (not in freeze blocks)

Returns:



64
65
66
# File 'lib/dotenv/merge/file_analysis.rb', line 64

def assignment_lines
  @statements.select { |stmt| stmt.is_a?(EnvLine) && stmt.assignment? }
end

#compute_node_signature(node) ⇒ Array?

Compute default signature for a node

Parameters:

Returns:

  • (Array, nil)

    Signature array



87
88
89
90
91
92
93
94
# File 'lib/dotenv/merge/file_analysis.rb', line 87

def compute_node_signature(node)
  case node
  when FreezeNode
    node.signature
  when EnvLine
    node.signature
  end
end

#env_var(key) ⇒ EnvLine?

Get environment variable by key

Parameters:

  • key (String)

    The environment variable key

Returns:

  • (EnvLine, nil)

    The assignment line or nil



103
104
105
# File 'lib/dotenv/merge/file_analysis.rb', line 103

def env_var(key)
  @lines.find { |line| line.assignment? && line.key == key }
end

#keysArray<String>

Get all environment variable keys

Returns:

  • (Array<String>)

    List of keys



109
110
111
# File 'lib/dotenv/merge/file_analysis.rb', line 109

def keys
  all_assignments.map(&:key)
end

#line_at(line_number) ⇒ EnvLine?

Get a specific line (1-indexed) Override base to return EnvLine objects instead of raw strings

Parameters:

  • line_number (Integer)

    Line number (1-indexed)

Returns:

  • (EnvLine, nil)

    The line object



78
79
80
81
82
# File 'lib/dotenv/merge/file_analysis.rb', line 78

def line_at(line_number)
  return if line_number < 1

  @lines[line_number - 1]
end

#valid?Boolean

Check if parse was successful (dotenv always succeeds, may have invalid lines)

Returns:

  • (Boolean)


58
59
60
# File 'lib/dotenv/merge/file_analysis.rb', line 58

def valid?
  true
end