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 |