1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
|
require "climate_control/errors"
require "climate_control/version"
require "monitor"
module ClimateControl
extend self
extend Gem::Deprecate
SEMAPHORE = Monitor.new
private_constant :SEMAPHORE
def modify(environment_overrides = {}, &block)
environment_overrides = environment_overrides.transform_keys(&:to_s)
SEMAPHORE.synchronize do
previous = ENV.to_hash
begin
copy environment_overrides
ensure
middle = ENV.to_hash
end
block.call
ensure
after = ENV
(previous.keys | middle.keys | after.keys).each do |key|
if previous[key] != after[key] && middle[key] == after[key]
ENV[key] = previous[key]
end
end
end
end
def unsafe_modify(environment_overrides = {}, &block)
environment_overrides = environment_overrides.transform_keys(&:to_s)
previous = ENV.to_hash
begin
copy environment_overrides
ensure
middle = ENV.to_hash
end
block.call
ensure
after = ENV
(previous.keys | middle.keys | after.keys).each do |key|
if previous[key] != after[key] && middle[key] == after[key]
ENV[key] = previous[key]
end
end
end
def env
ENV
end
deprecate :env, "ENV", 2022, 10
private
def copy(overrides)
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
end
|