class Anyway::Env

Parses environment variables and provides method-like access

Attributes

data[R]
env_container[R]
traces[R]
type_cast[R]

Public Class Methods

from_hash(hash, prefix: nil, memo: {}) click to toggle source
# File lib/anyway/env.rb, line 12
def from_hash(hash, prefix: nil, memo: {})
  hash.each do |key, value|
    prefix_with_key = (prefix && !prefix.empty?) ? "#{prefix}_#{key.to_s.upcase}" : key.to_s.upcase

    if value.is_a?(Hash)
      from_hash(value, prefix: "#{prefix_with_key}_", memo:)
    else
      memo[prefix_with_key] = value.to_s
    end
  end

  memo
end
new(type_cast: AutoCast, env_container: ENV) click to toggle source
# File lib/anyway/env.rb, line 31
def initialize(type_cast: AutoCast, env_container: ENV)
  @type_cast = type_cast
  @data = {}
  @traces = {}
  @env_container = env_container
end

Public Instance Methods

clear() click to toggle source
# File lib/anyway/env.rb, line 38
def clear
  data.clear
  traces.clear
end
fetch(prefix) click to toggle source
# File lib/anyway/env.rb, line 43
def fetch(prefix)
  return data[prefix].deep_dup if data.key?(prefix)

  Tracing.capture do
    data[prefix] = parse_env(prefix)
  end.then do |trace|
    traces[prefix] = trace
  end

  data[prefix].deep_dup
end
fetch_with_trace(prefix) click to toggle source
# File lib/anyway/env.rb, line 55
def fetch_with_trace(prefix)
  [fetch(prefix), traces[prefix]]
end

Private Instance Methods

parse_env(prefix) click to toggle source
# File lib/anyway/env.rb, line 61
def parse_env(prefix)
  match_prefix = prefix.empty? ? prefix : "#{prefix}_"
  env_container.each_pair.with_object({}) do |(key, val), data|
    next unless key.start_with?(match_prefix)

    path = key.sub(/^#{match_prefix}/, "").downcase

    paths = path.split("__")
    trace!(:env, *paths, key:) { data.bury(type_cast.call(val), *paths) }
  end
end