lib/roadie/errors.rb in roadie-3.0.5 vs lib/roadie/errors.rb in roadie-3.1.0.rc1

- old
+ new

@@ -36,21 +36,63 @@ attr_reader :css_name # Provider used when finding attr_reader :provider + # Extra message + attr_reader :extra_message + # TODO: Change signature in the next major version of Roadie. def initialize(css_name, extra_message = nil, provider = nil) @css_name = css_name @provider = provider + @extra_message = extra_message super build_message(extra_message) end + protected + def error_row + "#{provider || "Unknown provider"}: #{extra_message || message}" + end + private - def build_message(extra_message) + # Redundant method argument is to keep API compatability without major version bump. + # TODO: Remove argument on version 4.0. + def build_message(extra_message = @extra_message) message = %(Could not find stylesheet "#{css_name}") message << ": #{extra_message}" if extra_message message << "\nUsed provider:\n#{provider}" if provider message + end + end + + class ProvidersFailed < CssNotFound + attr_reader :errors + + def initialize(css_name, provider_list, errors) + @errors = errors + super(css_name, "All providers failed", provider_list) + end + + private + def build_message(extra_message) + message = %(Could not find stylesheet "#{css_name}": #{extra_message}\nUsed providers:\n) + each_error_row(errors) do |row| + message << "\t" << row << "\n" + end + message + end + + def each_error_row(errors) + errors.each do |error| + case error + when ProvidersFailed + each_error_row(error.errors) { |row| yield row } + when CssNotFound + yield error.error_row + else + yield "Unknown provider (#{error.class}): #{error}" + end + end end end end