Class: Bugsnag::MiddlewareStack
- Inherits:
-
Object
- Object
- Bugsnag::MiddlewareStack
- Defined in:
- lib/bugsnag/middleware_stack.rb
Instance Method Summary collapse
- #disable(*middlewares) ⇒ Object
-
#initialize ⇒ MiddlewareStack
constructor
A new instance of MiddlewareStack.
- #insert_after(after, new_middleware) ⇒ Object
- #insert_before(before, new_middleware) ⇒ Object
-
#method_missing(method, *args, &block) ⇒ Object
This allows people to proxy methods to the array if they want to do more complex stuff.
-
#run(notification) ⇒ Object
Runs the middleware stack and calls.
- #use(new_middleware) ⇒ Object
Constructor Details
#initialize ⇒ MiddlewareStack
Returns a new instance of MiddlewareStack.
3 4 5 6 |
# File 'lib/bugsnag/middleware_stack.rb', line 3 def initialize @middlewares = [] @disabled_middleware = [] end |
Dynamic Method Handling
This class handles dynamic methods through the method_missing method
#method_missing(method, *args, &block) ⇒ Object
This allows people to proxy methods to the array if they want to do more complex stuff
49 50 51 |
# File 'lib/bugsnag/middleware_stack.rb', line 49 def method_missing(method, *args, &block) @middlewares.send(method, *args, &block) end |
Instance Method Details
#disable(*middlewares) ⇒ Object
42 43 44 45 46 |
# File 'lib/bugsnag/middleware_stack.rb', line 42 def disable(*middlewares) @disabled_middleware += middlewares @middlewares.delete_if {|m| @disabled_middleware.include?(m)} end |
#insert_after(after, new_middleware) ⇒ Object
14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
# File 'lib/bugsnag/middleware_stack.rb', line 14 def insert_after(after, new_middleware) return if @disabled_middleware.include?(new_middleware) if after.is_a? Array index = @middlewares.rindex {|el| after.include?(el)} else index = @middlewares.rindex(after) end if index.nil? @middlewares << new_middleware else @middlewares.insert index + 1, new_middleware end end |
#insert_before(before, new_middleware) ⇒ Object
30 31 32 33 34 35 36 37 38 39 40 |
# File 'lib/bugsnag/middleware_stack.rb', line 30 def insert_before(before, new_middleware) return if @disabled_middleware.include?(new_middleware) if before.is_a? Array index = @middlewares.index {|el| before.include?(el)} else index = @middlewares.index(before) end @middlewares.insert index || @middlewares.length, new_middleware end |
#run(notification) ⇒ Object
Runs the middleware stack and calls
54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 |
# File 'lib/bugsnag/middleware_stack.rb', line 54 def run(notification) # The final lambda is the termination of the middleware stack. It calls deliver on the notification lambda_has_run = false notify_lambda = lambda do |notification| lambda_has_run = true yield end begin # We reverse them, so we can call "call" on the first middleware middleware_procs.reverse.inject(notify_lambda) { |n,e| e[n] }.call(notification) rescue StandardError => e # KLUDGE: Since we don't re-raise middleware exceptions, this breaks rspec raise if e.class.to_s == "RSpec::Expectations::ExpectationNotMetError" # We dont notify, as we dont want to loop forever in the case of really broken middleware, we will # still send this notify Bugsnag.warn "Bugsnag middleware error: #{e}" Bugsnag.log "Middleware error stacktrace: #{e.backtrace.inspect}" end # Ensure that the deliver has been performed, and no middleware has botched it notify_lambda.call(notification) unless lambda_has_run end |
#use(new_middleware) ⇒ Object
8 9 10 11 12 |
# File 'lib/bugsnag/middleware_stack.rb', line 8 def use(new_middleware) return if @disabled_middleware.include?(new_middleware) @middlewares << new_middleware end |