class Senv::EnvChangeTracker

Constants

THREAD_SAFE

Public Class Methods

new(env) click to toggle source
# File lib/senv.rb, line 549
def initialize(env)
  @env = env

  @changes = {
    :deleted => [],
    :updated => [],
    :created => [],
  }

  @change_for = proc do |key, val|
    if @env.has_key?(key)
      case
        when val.nil?
          {:type => :deleted, :info => [key, val]}
        when val.to_s != @env[key].to_s
          {:type => :updated, :info => [key, val]}
        else
          nil
      end
    else
      {:type => :created, :info => [key, val]}
    end
  end

  @track_change = proc do |key, val|
    change = @change_for[key, val]

    if change
      @changes[change[:type]].push(change[:info])
    end
  end
end
track(&block) click to toggle source
# File lib/senv.rb, line 627
def EnvChangeTracker.track(&block)
  THREAD_SAFE.synchronize do
    env = EnvChangeTracker.new(::ENV)

    ::Object.send(:remove_const, :ENV)
    ::Object.send(:const_set, :ENV, env)

    begin
      block.call
      env
    ensure
      ::Object.send(:remove_const, :ENV)
      ::Object.send(:const_set, :ENV, env)
    end
  end
end

Public Instance Methods

[]=(key, val) click to toggle source
# File lib/senv.rb, line 590
def []=(key, val)
  @track_change[key, val]
  @env[key] = val
end
apply(env) click to toggle source
# File lib/senv.rb, line 612
def apply(env)
  @changes[:created].each do |k, v|
    env[k] = v
  end
  @changes[:updated].each do |k, v|
    env[k] = v
  end
  @changes[:deleted].each do |k, v|
    env.delete(k)
  end
  @changes
end
changes() click to toggle source
# File lib/senv.rb, line 582
def changes
  @changes
end
delete(key) click to toggle source
# File lib/senv.rb, line 607
def delete(key)
  @track_change[key, nil]
  @env.delete(key)
end
method_missing(method, *args, &block) click to toggle source
# File lib/senv.rb, line 586
def method_missing(method, *args, &block)
  @env.send(method, *args, &block)
end
replace(hash) click to toggle source
# File lib/senv.rb, line 595
def replace(hash)
  hash.each do |key, val|
    @track_change[key, val]
  end
  @env.replace(hash)
end
store(key, val) click to toggle source
# File lib/senv.rb, line 602
def store(key, val)
  @track_change[key, val]
  @env.store(key, val)
end