AwesomeErrors
Easily add errors to your service objects and classes. AwesomeErrors is inspired by the ActiveModel::Errors API, but ensures that each error contains an error code attribute and is not concerned with translating error messages.
Installation
Install from RubyGems by adding it to your Gemfile, then bundling.
# Gemfile
gem 'awesome_errors'Usage
Include AwesomeErrors in your class:
class ApplicationService
include AwesomeErrors
# ...
end
service = ApplicationService.new
service.errors # => []or set up the errors object manually
class ApplicationService
def errors
@errors ||= AwesomeErrors::Errors.new
end
# ...
end
service = ApplicationService.new
service.errors # => []By default, errors are added with the an :invalid code and "is invalid" message:
errors = AwesomeErrors::Errors.new
errors.add(:name)
errors.first.key # => :name
errors.first.code # => :invalid
errors.first.message # => "is invalid"But you can specify a custom code, message and metadata
errors = AwesomeErrors::Errors.new
errors.add(:name, code: :too_long, message: "is too long", metadata: { line: 1, column: 6 })
errors.first.key # => :name
errors.first.code # => :too_long
errors.first.message # => "is too long"
errors.first.metadata # => { line: 1, column: 6 }Example
class SendApiRequest
include AwesomeErrors
def call
if api_response.success?
# do something
else
errors.add(:api, code: :failed_request, message: "failed request")
end
end
endWhy this gem?
I have used ActiveModel::Errors in many service objects and Ruby classes and enjoy its API, but often I am forced to add methods related to the translation of messages that I wouldn't need. Also, ActiveModel::Errors allows you to add errors where the message will be used as the error type, and I wanted to ensure a more consistent experience of always having an error code that is Symbol or an Integer so that services and objects can exchange errors while being able to rely on the code to better construct a user-facing error message.
Development
After checking out the repo, run bin/setup to install dependencies. Then, run rake spec to run the tests. You can also run bin/console for an interactive prompt that will allow you to experiment.
To install this gem onto your local machine, run bundle exec rake install. To release a new version, update the version number in version.rb, and then run bundle exec rake release, which will create a git tag for the version, push git commits and the created tag, and push the .gem file to rubygems.org.
Contributing
Bug reports and pull requests are welcome on GitHub at https://github.com/rodloboz/awesome_errors.
License
The gem is available as open source under the terms of the MIT License.