Class: RaceGuard::Configuration
- Inherits:
-
Object
- Object
- RaceGuard::Configuration
- Defined in:
- lib/race_guard/configuration.rb
Overview
Per-process configuration. Mutations are protected by a Mutex.
Constant Summary collapse
- DEFAULT_ENVIRONMENTS =
%i[development test].freeze
- DEFAULT_SEVERITY =
:info
Instance Method Summary collapse
- #active? ⇒ Boolean
- #add_protect_detector(detector) ⇒ Object
- #add_reporter(reporter) ⇒ Object
- #clear_protect_detectors ⇒ Object
- #clear_reporters ⇒ Object
- #current_environment ⇒ Object
-
#db_lock_read_modify_write_models(*klasses) ⇒ Object
Classes (e.g. ActiveRecord models) to audit for read-modify-write patterns (Epic 4.1).
- #db_lock_read_modify_write_tracks?(klass) ⇒ Boolean
- #disable(name) ⇒ Object
- #disable_rule(name) ⇒ Object
- #enable(name) ⇒ Object
- #enable_rule(name) ⇒ Object
- #enabled?(name) ⇒ Boolean
- #enabled_rule?(name) ⇒ Boolean
- #environments(*names) ⇒ Object
-
#initialize ⇒ Configuration
constructor
A new instance of Configuration.
- #protect_detectors ⇒ Object
- #remove_protect_detector(detector) ⇒ Object
- #remove_reporter(reporter) ⇒ Object
- #reporters ⇒ Object
- #severity(*args) ⇒ Object
- #severity_for(name) ⇒ Object
-
#shared_state_memo_globs(*patterns) ⇒ Object
Glob patterns (e.g. lib/*/.rb) scanned for @ivar ||= memoization (Epic 6.4).
- #to_h ⇒ Object
- #watch_commit_safety(name, &block) ⇒ Object
Constructor Details
#initialize ⇒ Configuration
Returns a new instance of Configuration.
14 15 16 17 18 19 20 21 22 23 24 25 |
# File 'lib/race_guard/configuration.rb', line 14 def initialize @mutex = Mutex.new @enabled = Set.new @enabled_rules = Set.new @default_severity = DEFAULT_SEVERITY @severities = {} @environments = DEFAULT_ENVIRONMENTS.dup @reporters = [] @protect_detectors = [] @db_lock_read_modify_write_classes = Set.new @shared_state_memo_globs = [] end |
Instance Method Details
#active? ⇒ Boolean
86 87 88 |
# File 'lib/race_guard/configuration.rb', line 86 def active? @mutex.synchronize { @environments.include?(current_environment) } end |
#add_protect_detector(detector) ⇒ Object
109 110 111 112 |
# File 'lib/race_guard/configuration.rb', line 109 def add_protect_detector(detector) @mutex.synchronize { @protect_detectors << detector } self end |
#add_reporter(reporter) ⇒ Object
90 91 92 93 |
# File 'lib/race_guard/configuration.rb', line 90 def add_reporter(reporter) @mutex.synchronize { @reporters << reporter } self end |
#clear_protect_detectors ⇒ Object
119 120 121 122 |
# File 'lib/race_guard/configuration.rb', line 119 def clear_protect_detectors @mutex.synchronize { @protect_detectors.clear } self end |
#clear_reporters ⇒ Object
100 101 102 103 |
# File 'lib/race_guard/configuration.rb', line 100 def clear_reporters @mutex.synchronize { @reporters.clear } self end |
#current_environment ⇒ Object
174 175 176 177 |
# File 'lib/race_guard/configuration.rb', line 174 def current_environment raw = ENV['RACK_ENV'] || ENV['RAILS_ENV'] || 'development' raw.downcase.to_sym end |
#db_lock_read_modify_write_models(*klasses) ⇒ Object
Classes (e.g. ActiveRecord models) to audit for read-modify-write patterns (Epic 4.1). Empty by default: no read tracking / write correlation.
141 142 143 144 145 146 147 148 149 150 151 |
# File 'lib/race_guard/configuration.rb', line 141 def db_lock_read_modify_write_models(*klasses) if klasses.compact.empty? return @mutex.synchronize do @db_lock_read_modify_write_classes.to_a end end flat = klasses.length == 1 && klasses.first.is_a?(Array) ? klasses.first : klasses @mutex.synchronize { @db_lock_read_modify_write_classes = Set.new(flat.compact) } self end |
#db_lock_read_modify_write_tracks?(klass) ⇒ Boolean
153 154 155 156 157 158 |
# File 'lib/race_guard/configuration.rb', line 153 def db_lock_read_modify_write_tracks?(klass) k = klass return false unless k.is_a?(Class) @mutex.synchronize { @db_lock_read_modify_write_classes.include?(k) } end |
#disable(name) ⇒ Object
33 34 35 36 37 |
# File 'lib/race_guard/configuration.rb', line 33 def disable(name) sym = name.to_sym @mutex.synchronize { @enabled.delete(sym) } self end |
#disable_rule(name) ⇒ Object
54 55 56 57 58 |
# File 'lib/race_guard/configuration.rb', line 54 def disable_rule(name) sym = name.to_sym @mutex.synchronize { @enabled_rules.delete(sym) } self end |
#enable(name) ⇒ Object
27 28 29 30 31 |
# File 'lib/race_guard/configuration.rb', line 27 def enable(name) sym = name.to_sym @mutex.synchronize { @enabled.add(sym) } self end |
#enable_rule(name) ⇒ Object
48 49 50 51 52 |
# File 'lib/race_guard/configuration.rb', line 48 def enable_rule(name) sym = name.to_sym @mutex.synchronize { @enabled_rules.add(sym) } self end |
#enabled?(name) ⇒ Boolean
39 40 41 42 43 44 45 46 |
# File 'lib/race_guard/configuration.rb', line 39 def enabled?(name) sym = name.to_sym @mutex.synchronize do return false unless @environments.include?(current_environment) @enabled.include?(sym) end end |
#enabled_rule?(name) ⇒ Boolean
60 61 62 63 64 65 66 67 |
# File 'lib/race_guard/configuration.rb', line 60 def enabled_rule?(name) sym = name.to_sym @mutex.synchronize do return false unless @environments.include?(current_environment) @enabled_rules.include?(sym) end end |
#environments(*names) ⇒ Object
79 80 81 82 83 84 |
# File 'lib/race_guard/configuration.rb', line 79 def environments(*names) return @mutex.synchronize { @environments.dup } if names.empty? @mutex.synchronize { @environments = names.map(&:to_sym).freeze } self end |
#protect_detectors ⇒ Object
124 125 126 |
# File 'lib/race_guard/configuration.rb', line 124 def protect_detectors @mutex.synchronize { @protect_detectors.dup } end |
#remove_protect_detector(detector) ⇒ Object
114 115 116 117 |
# File 'lib/race_guard/configuration.rb', line 114 def remove_protect_detector(detector) @mutex.synchronize { @protect_detectors.delete(detector) } self end |
#remove_reporter(reporter) ⇒ Object
95 96 97 98 |
# File 'lib/race_guard/configuration.rb', line 95 def remove_reporter(reporter) @mutex.synchronize { @reporters.delete(reporter) } self end |
#reporters ⇒ Object
105 106 107 |
# File 'lib/race_guard/configuration.rb', line 105 def reporters @mutex.synchronize { @reporters.dup } end |
#severity(*args) ⇒ Object
69 70 71 72 |
# File 'lib/race_guard/configuration.rb', line 69 def severity(*args) @mutex.synchronize { apply_severity_args(args) } self end |
#severity_for(name) ⇒ Object
74 75 76 77 |
# File 'lib/race_guard/configuration.rb', line 74 def severity_for(name) sym = name.to_sym @mutex.synchronize { @severities[sym] || @default_severity } end |
#shared_state_memo_globs(*patterns) ⇒ Object
Glob patterns (e.g. lib/*/.rb) scanned for @ivar ||= memoization (Epic 6.4). Empty by default: memo reports are disabled until patterns are set.
162 163 164 165 166 167 168 |
# File 'lib/race_guard/configuration.rb', line 162 def shared_state_memo_globs(*patterns) return @mutex.synchronize { @shared_state_memo_globs.dup } if patterns.empty? flat = patterns.length == 1 && patterns.first.is_a?(Array) ? patterns.first : patterns @mutex.synchronize { @shared_state_memo_globs = flat.compact.map(&:to_s).freeze } self end |
#to_h ⇒ Object
170 171 172 |
# File 'lib/race_guard/configuration.rb', line 170 def to_h @mutex.synchronize { to_h_unsafe } end |
#watch_commit_safety(name, &block) ⇒ Object
128 129 130 131 132 133 134 135 136 137 |
# File 'lib/race_guard/configuration.rb', line 128 def watch_commit_safety(name, &block) raise ArgumentError, 'watch_commit_safety requires a block' unless block sym = name.to_sym @mutex.synchronize do dsl = CommitSafety::WatcherDSL.new(sym) block.call(dsl) end self end |