mirror of
https://gh.wpcy.net/https://github.com/discourse/discourse.git
synced 2026-05-03 10:06:05 +08:00
The `base.rb` file (640+ lines) contained 9 step classes, the `Context` class, and the `StepsHelpers` DSL module alongside the core concern. Each is now in its own file under `lib/service/base/`, following the existing `lib/service.rb` + `lib/service/*.rb` pattern. Also: - Update stale inline documentation in `lib/service.rb` - Use `NotImplementedError` instead of generic raise in `PolicyBase` and `ActionBase` - Move YARD DSL docs to a `@!parse` block at the top of `base.rb`
44 lines
1.1 KiB
Ruby
44 lines
1.1 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
module Service
|
|
module Base
|
|
# @!visibility private
|
|
class TryStep < Step
|
|
module FilteredBacktrace
|
|
def filtered_backtrace
|
|
Array
|
|
.wrap(backtrace)
|
|
.chunk { it.match?(%r{/(gems|lib/service|ruby)/}) }
|
|
.flat_map do |excluded, lines|
|
|
next "(#{lines.size} framework line(s) excluded)" if excluded
|
|
lines
|
|
end
|
|
end
|
|
end
|
|
|
|
include StepsHelpers
|
|
|
|
attr_reader :steps, :exceptions
|
|
|
|
def initialize(exceptions, &block)
|
|
super("default")
|
|
@steps = []
|
|
@exceptions = exceptions.presence || [StandardError]
|
|
instance_exec(&block)
|
|
end
|
|
|
|
def run_step
|
|
steps.each do |step|
|
|
@current_step = step
|
|
step.call(instance, context)
|
|
end
|
|
rescue *exceptions => e
|
|
raise e if e.is_a?(Failure)
|
|
e.singleton_class.prepend(FilteredBacktrace)
|
|
context[@current_step.result_key].fail(raised_exception?: true, exception: e)
|
|
context[result_key][:exception] = e
|
|
context.fail!
|
|
end
|
|
end
|
|
end
|
|
end
|