Class: Profiler::EnvOverrideStore

Inherits:
Object
  • Object
show all
Defined in:
lib/profiler/env_override_store.rb

Constant Summary collapse

DELETED_SENTINEL =
"__profiler_deleted__"
RESTORE_SENTINEL =
"__profiler_restore__"

Instance Method Summary collapse

Instance Method Details

#all_overridesObject

Returns active overrides (excludes RESTORE entries — already being reverted)



95
96
97
98
99
100
101
102
103
104
105
# File 'lib/profiler/env_override_store.rb', line 95

def all_overrides
  load_overrides.reject do |_, entry|
    value = entry.is_a?(Hash) ? entry["value"] : entry
    value == RESTORE_SENTINEL
  end.transform_values do |entry|
    entry.is_a?(Hash) ? entry : { "value" => entry, "original" => nil }
  end
rescue => e
  warn "[Profiler] EnvOverrideStore: failed to load overrides: #{e.message}"
  {}
end

#apply!Object



67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
# File 'lib/profiler/env_override_store.rb', line 67

def apply!
  overrides = load_overrides
  restore_keys = []

  overrides.each do |key, entry|
    value    = entry.is_a?(Hash) ? entry["value"]    : entry
    original = entry.is_a?(Hash) ? entry["original"] : nil

    case value
    when DELETED_SENTINEL
      ENV.delete(key)
    when RESTORE_SENTINEL
      original.nil? ? ENV.delete(key) : ENV[key] = original
      restore_keys << key
    else
      ENV[key] = value
    end
  end

  if restore_keys.any?
    restore_keys.each { |k| overrides.delete(k) }
    save_overrides(overrides)
  end
rescue => e
  warn "[Profiler] EnvOverrideStore: failed to apply overrides: #{e.message}"
end

#clearObject



107
108
109
110
111
# File 'lib/profiler/env_override_store.rb', line 107

def clear
  FileUtils.rm_f(override_file_path)
rescue => e
  warn "[Profiler] EnvOverrideStore: failed to clear: #{e.message}"
end

#delete(key) ⇒ Object



25
26
27
28
29
30
31
32
# File 'lib/profiler/env_override_store.rb', line 25

def delete(key)
  overrides = load_overrides
  original = original_for(overrides, key)
  overrides[key] = { "value" => DELETED_SENTINEL, "original" => original }
  save_overrides(overrides)
rescue => e
  warn "[Profiler] EnvOverrideStore: failed to delete #{key}: #{e.message}"
end

#reset(key) ⇒ Object



34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
# File 'lib/profiler/env_override_store.rb', line 34

def reset(key)
  overrides = load_overrides
  entry = overrides[key]
  return unless entry

  original = entry["original"]
  # Keep a RESTORE entry so Sidekiq workers pick it up on next job
  overrides[key] = { "value" => RESTORE_SENTINEL, "original" => original }
  save_overrides(overrides)

  # Apply immediately to the current (web) process
  original.nil? ? ENV.delete(key) : ENV[key] = original
rescue => e
  warn "[Profiler] EnvOverrideStore: failed to reset #{key}: #{e.message}"
end

#reset_allObject



50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
# File 'lib/profiler/env_override_store.rb', line 50

def reset_all
  overrides = load_overrides
  restore_overrides = {}

  overrides.each do |key, entry|
    original = entry.is_a?(Hash) ? entry["original"] : nil
    # Apply immediately to the current (web) process
    original.nil? ? ENV.delete(key) : ENV[key] = original
    # Leave a RESTORE sentinel for Sidekiq workers to pick up
    restore_overrides[key] = { "value" => RESTORE_SENTINEL, "original" => original }
  end

  restore_overrides.empty? ? clear : save_overrides(restore_overrides)
rescue => e
  warn "[Profiler] EnvOverrideStore: failed to reset all: #{e.message}"
end

#set(key, value) ⇒ Object

File format: { “KEY” => { “value” => “…”, “original” => “…” } } Sentinels for “value”:

DELETED_SENTINEL  → ENV.delete(key)
RESTORE_SENTINEL  → restore ENV[key] to "original" (cleaned up after apply!)


16
17
18
19
20
21
22
23
# File 'lib/profiler/env_override_store.rb', line 16

def set(key, value)
  overrides = load_overrides
  original = original_for(overrides, key)
  overrides[key] = { "value" => value.to_s, "original" => original }
  save_overrides(overrides)
rescue => e
  warn "[Profiler] EnvOverrideStore: failed to set #{key}: #{e.message}"
end