Module: Hammer::Dotenv

Defined in:
lib/hammer/dotenv.rb

Overview

Tiny built-in .env loader. Kept dependency-free on purpose - the gemspec advertises zero runtime deps.

‘Hammer.cli` calls `Dotenv.load(Dir.pwd)` after evaluating the Hammerfile (unless the Hammerfile said `dotenv false`), so vars from `.env` are available to every command handler.

Semantics:

  • ‘.env` is loaded, then `.env.local` (latter overrides former).

  • Missing files are silently skipped - auto-load must not raise.

  • Existing ‘ENV` always wins (`ENV ||= v`); shell-set values are never clobbered.

  • Supported lines: ‘KEY=value`, `KEY=“value”`, `KEY=’value’‘, optional leading `export `, `#` comments, blank lines.

  • NOT supported: ‘$VAR` interpolation, multiline values, inline comments after a value. Reach for the `dotenv` gem from a `before` hook if you need those.

Class Method Summary collapse

Class Method Details

.load(dir) ⇒ Object



22
23
24
25
26
27
28
# File 'lib/hammer/dotenv.rb', line 22

def self.load(dir)
  FILES.each do |name|
    path = File.join(dir, name)
    next unless File.file?(path)
    parse(File.read(path)).each { |k, v| ENV[k] ||= v }
  end
end

.parse(text) ⇒ Object



30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
# File 'lib/hammer/dotenv.rb', line 30

def self.parse(text)
  out = {}
  text.each_line do |line|
    line = line.strip
    next if line.empty? || line.start_with?('#')
    line = line.sub(/\Aexport\s+/, '')
    key, sep, val = line.partition('=')
    next if sep.empty?
    key = key.strip
    next if key.empty?
    val = val.strip
    if (val.start_with?('"') && val.end_with?('"')) ||
       (val.start_with?("'") && val.end_with?("'"))
      val = val[1..-2]
    end
    out[key] = val
  end
  out
end