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, **options) ⇒ 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

  • options (Hash)

    Additional options (forward compatibility - ignored by FileAnalysis)



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

def initialize(source, freeze_token: DEFAULT_FREEZE_TOKEN, signature_generator: nil, **options)
  @source = source
  @freeze_token = freeze_token
  @signature_generator = signature_generator
  # **options captures any additional parameters (e.g., node_typing) for forward compatibility

  # 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:



72
73
74
# File 'lib/dotenv/merge/file_analysis.rb', line 72

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

#assignment_linesArray<EnvLine>

Get assignment lines (not in freeze blocks)

Returns:



66
67
68
# File 'lib/dotenv/merge/file_analysis.rb', line 66

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



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

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



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

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



111
112
113
# File 'lib/dotenv/merge/file_analysis.rb', line 111

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



80
81
82
83
84
# File 'lib/dotenv/merge/file_analysis.rb', line 80

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)


60
61
62
# File 'lib/dotenv/merge/file_analysis.rb', line 60

def valid?
  true
end