Module: RailsSemanticLogging::RSpec::CaptureAppender

Defined in:
lib/rails_semantic_logging/rspec/matchers.rb

Overview

Shared capture plumbing for the block matchers. Opens the logger gate to :trace so every event reaches the in-memory capture appender, while pinning the pre-existing appenders to the previously visible threshold (default_level, or an active SemanticLogger.silence override such as the LOG env var hook) so widening the gate does not spill every captured event to stdout.

Class Method Summary collapse

Class Method Details

.pin_live_appenders(level) ⇒ Object

Pins every live appender to level, returning the [appender, original_level] pairs needed to restore them afterwards.



49
50
51
52
53
54
55
# File 'lib/rails_semantic_logging/rspec/matchers.rb', line 49

def pin_live_appenders(level)
  ::SemanticLogger.appenders.to_a.map do |appender|
    original = appender.level
    appender.level = level
    [appender, original]
  end
end

.visible_level(default_level) ⇒ Object

The threshold actually in effect before the matcher widened the gate: a SemanticLogger.silence override (stored as a level index in a thread-local by both semantic_logger 4.x and 5.x) wins over default_level.



60
61
62
63
# File 'lib/rails_semantic_logging/rspec/matchers.rb', line 60

def visible_level(default_level)
  silence_index = Thread.current[:semantic_logger_silence]
  silence_index ? ::SemanticLogger::Levels::LEVELS[silence_index] : default_level
end

.with_capture_appender(capture) ⇒ Object



34
35
36
37
38
39
40
41
42
43
44
45
# File 'lib/rails_semantic_logging/rspec/matchers.rb', line 34

def with_capture_appender(capture)
  previous_level = ::SemanticLogger.default_level
  pinned = pin_live_appenders(visible_level(previous_level))
  ::SemanticLogger.add_appender(appender: capture)
  ::SemanticLogger.default_level = :trace
  yield
  ::SemanticLogger.flush
ensure
  ::SemanticLogger.default_level = previous_level
  pinned&.each { |appender, level| appender.level = level }
  ::SemanticLogger.remove_appender(capture)
end