class ClimateControl::Modifier

Public Class Methods

new(env, environment_overrides = {}, &block) click to toggle source
# File lib/climate_control/modifier.rb, line 3
def initialize(env, environment_overrides = {}, &block)
  @environment_overrides = stringify_keys(environment_overrides)
  @block = block
  @env = env
end

Public Instance Methods

process() click to toggle source
# File lib/climate_control/modifier.rb, line 9
def process
  @env.synchronize do
    prepare_environment_for_block
    run_block
  ensure
    cache_environment_after_block
    delete_keys_that_do_not_belong
    revert_changed_keys
  end
end

Private Instance Methods

cache_environment_after_block() click to toggle source
# File lib/climate_control/modifier.rb, line 49
def cache_environment_after_block
  @env_after_block = clone_environment
end
clone_environment() click to toggle source
# File lib/climate_control/modifier.rb, line 63
def clone_environment
  @env.to_hash
end
copy_overrides_to_environment() click to toggle source
# File lib/climate_control/modifier.rb, line 32
def copy_overrides_to_environment
  @environment_overrides.each do |key, value|
    @env[key] = value
  rescue TypeError => e
    raise UnassignableValueError,
      "attempted to assign #{value} to #{key} but failed (#{e.message})"
  end
end
delete_keys_that_do_not_belong() click to toggle source
# File lib/climate_control/modifier.rb, line 53
def delete_keys_that_do_not_belong
  (keys_to_remove - keys_changed_by_block).each { |key| @env.delete(key) }
end
keys_changed_by_block() click to toggle source
# File lib/climate_control/modifier.rb, line 45
def keys_changed_by_block
  @keys_changed_by_block ||= OverlappingKeysWithChangedValues.new(@env_with_overrides_before_block, @env_after_block).keys
end
keys_to_remove() click to toggle source
# File lib/climate_control/modifier.rb, line 41
def keys_to_remove
  @environment_overrides.keys
end
prepare_environment_for_block() click to toggle source
# File lib/climate_control/modifier.rb, line 22
def prepare_environment_for_block
  @original_env = clone_environment
  copy_overrides_to_environment
  @env_with_overrides_before_block = clone_environment
end
revert_changed_keys() click to toggle source
# File lib/climate_control/modifier.rb, line 57
def revert_changed_keys
  (@original_env.keys - keys_changed_by_block).each do |key|
    @env[key] = @original_env[key]
  end
end
run_block() click to toggle source
# File lib/climate_control/modifier.rb, line 28
def run_block
  @block.call
end
stringify_keys(env) click to toggle source
# File lib/climate_control/modifier.rb, line 67
def stringify_keys(env)
  env.each_with_object({}) do |(key, value), hash|
    hash[key.to_s] = value
  end
end