Write business logic for Ruby/Rails that scales.
- π‘ Introduction
- π¦ Installation
- ποΈ The Basic Structure
- π Getting Started
- ποΈ Documentation
- π οΈ Development
- π€ Contributing
- βοΈ License
- π Code of Conduct
- π Acknowledgments
- π€ About
This library is tested (100% coverage) against:
| Ruby / Rails | 6.0 | 6.1 | 7.0 | 7.1 | 7.2 | 8.0 | 8.1 | Edge |
|---|---|---|---|---|---|---|---|---|
| 2.7 | β | β | β | β | ||||
| 3.0 | β | β | β | β | ||||
| 3.1 | β | β | β | |||||
| 3.2 | β | β | β | β | ||||
| 3.3 | β | β | β | β | β | β | ||
| 3.4 | β | β | β | β | ||||
| 4.x | β | β | ||||||
| Head | β | β |
solid-process is a Ruby/Rails library designed to encapsulate business logic into manageable processes. It simplifies writing, testing, maintaining, and evolving your code, ensuring it remains clear and approachable as your application scales.
Features: (touch to hide/expand)
1οΈβ£ Seamless Rails integration
Designed to complement Ruby on Rails, this library integrates smoothly without conflicting with existing framework conventions and features.
2οΈβ£ Support progressive mastery
Offers an intuitive entry point for novices while providing robust, advanced features that cater to experienced developers.
3οΈβ£ Promote conceptual integrity and rapid onboarding
By maintaining a consistent design philosophy,
solid-processreduces the learning curve for new developers, allowing them to contribute more effectively and quickly to a codebase.
4οΈβ£ Enhanced observability
Equipped with sophisticated instrumentation mechanisms, the library enables detailed logging and tracing without compromising code readability, even when processes are nested.
Check out Solid Rails App for a complete example of how to use solid-process in a Rails application. Twelve versions (branches) show how the gem can be incrementally integrated, access it to see from simple services/form objects to implementing the ports and adapters (hexagonal) architectural pattern.
You can also check the examples directory for more simple examples of how to use the gem.
Install the gem and add to the application's Gemfile by executing:
$ bundle add solid-process
If bundler is not being used to manage dependencies, install the gem by executing:
$ gem install solid-process
And require it in your code:
require 'solid/process'
Every Solid::Process requires an input block (defining attributes) and a call method (returning Success or Failure):
class User::Creation < Solid::Process
input do
attribute :email
attribute :password
end
def call(attributes)
user = User.create(attributes)
if user.persisted?
Success(:user_created, user: user)
else
Failure(:user_not_created, user: user)
end
end
end
# Call the process
result = User::Creation.call(email: 'alice@example.com', password: 'password')
result.success? # => true
result.type # => :user_created
result[:user] # => #<User id: 1, ...>Note: For validation including password confirmation, see the Reference Guide.
New to Solid::Process? The comprehensive Reference Guide covers everything you need to know:
- β Step-by-step tutorial from basics to advanced
- β Real-world examples (User Registration system)
- β All features explained with working code
- β Perfect for developers AND AI coding agents
Tip
Full Reference β β Complete guide covering every feature with detailed examples.
AI-Powered Wiki β β Visual diagrams, architecture flows, and interactive Q&A beyond the official docs.
Quick Overview β Bite-sized guides for each topic:
| # | Topic |
|---|---|
| 1 | Key Concepts β Philosophy and principles |
| 2 | Basic Usage β Input, call, Success/Failure |
| 3 | Intermediate Usage β Steps DSL |
| 4 | Advanced Usage β Dependencies, composition |
| 5 | Error Handling β rescue_from and inline rescue |
| 6 | Testing β Testing with dependency injection |
| 7 | Instrumentation β Logging and observability |
| 8 | Rails Integration β Rails-specific tips |
| 9 | Internal Libraries β Solid::Model, Value, Input |
| 10 | Ports and Adapters β Hexagonal architecture |
After checking out the repo, run bin/setup to install dependencies. Then, run bundle exec rake matrix to run the tests. You can also run bin/console for an interactive prompt that will allow you to experiment.
# Run full test suite for current Ruby version
bin/rake matrix
# Run tests for a specific Rails version
bundle exec appraisal rails-8-1 rake test
# Run a single test file
bundle exec appraisal rails-8-1 ruby -Ilib:test test/solid/process/result_test.rb
# Lint (Ruby 3.4+)
bin/rake standard
# Clean install + full test suite (useful when switching Ruby versions)
# asdf set ruby <version>
bin/matrixTo 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.
Bug reports and pull requests are welcome on GitHub at https://github.com/solid-process/solid-process. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the code of conduct.
The gem is available as open source under the terms of the MIT License.
Everyone interacting in the Solid::Process project's codebases, issue trackers, chat rooms and mailing lists is expected to follow the code of conduct.
I want to thank some people who helped me by testing and giving feedback as this project took shape, they are:
- Diego Linhares and Ralf Schmitz Bongiolo they were the brave ones who worked for a few months with the first versions of the ecosystem (it was called B/CDD). Their feedback was essential for improving DX and helped me to pivot some core decisions.
- Vitor Avelino, TomΓ‘s CoΓͺlho, Haroldo Furtado (I could repeat Ralf and Diego again) for the various feedbacks, documentation, API, support and words of encouragement.
Rodrigo Serradura created this project. He is the Solid Process creator and has already made similar gems like the u-case and kind. This gem can be used independently, but it also contains essential features that facilitate the adoption of Solid Process (the method) in code.