0.02
The project is in a healthy, maintained state
Write business logic for Ruby/Rails that scales.
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
 Dependencies

Development

~> 2.5

Runtime

 Project Readme

⚛️ Solid::Process

Write business logic for Ruby/Rails that scales.

Ruby Rails

📚 Table of Contents

  • Introduction
  • Installation
  • The Basic Structure
  • Further Reading
  • Development
  • Contributing
  • License
  • Code of Conduct
  • Acknowledgments
  • About

Supported Ruby and Rails

This library is tested (100% coverage) against:

Ruby / Rails 6.0 6.1 7.0 7.1 Edge
2.7
3.0
3.1
3.2
3.3
Head

Introduction

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 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-process reduces 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.

⬆️  back to top

Examples

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.

⬆️  back to top

Installation

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'

⬆️  back to top

The Basic Structure

All Solid::Process requires at least two things: an input and a call method.

  1. The input is a set of attributes needed to perform the work.
  2. The #call method is the entry point and where the work is done.
  • It receives the attributes Hash (symbolized keys), defined by the input.
  • It returns a Success or Failure as the output.
class User::Creation < Solid::Process
  input do
    # Define the attributes needed to perform the work
  end

  def call(attributes)
    # Perform the work and return a Success or Failure as the output
  end
end

Example

class User::Creation < Solid::Process
  input do
    attribute :email
    attribute :password
    attribute :password_confirmation
  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

⬆️  back to top

Calling a Process

To call a process, you can use the call method directly, or instantiate the class and call the #call method.

###############
# Direct call #
###############

User::Creation.call(email: 'john.doe@email.com', password: 'password', password_confirmation: 'password')
# => #<Solid::Output::Success type=:user_created value={:user=>#<User id: 1, ...>}>

########################
# Instantiate and call #
########################

process = User::Creation.new

process.call(email: 'john.doe@email.com', password: 'password', password_confirmation: 'password')

For now, it's essential to know that a process instance is stateful, and because of this, you can call it only once.

process = User::Creation.new

input = {email: 'john.doe@email.com', password: 'password', password_confirmation: 'password'}

process.call(input)

process.call(input)
# The `User::Creation#output` is already set. Use `.output` to access the result or create a new instance to call again. (Solid::Process::Error)

⬆️  back to top

Further Reading

  1. Key Concepts
  2. Basic Usage
  3. Intermediate Usage
  4. Advanced Usage
  5. Error Handling
  6. Testing
  7. Instrumentation / Observability
  8. Rails Integration
  9. Internal libraries
  • Solid::Input
  • Solid::Model
  • Solid::Value
  • ActiveModel validations
  1. Ports and Adapters (Hexagonal Architecture)

⬆️  back to top

Development

After checking out the repo, run bin/setup to install dependencies. Then, run bundle exec rake dev 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.

⬆️  back to top

Contributing

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.

⬆️  back to top

License

The gem is available as open source under the terms of the MIT License.

⬆️  back to top

Code of Conduct

Everyone interacting in the Solid::Process project's codebases, issue trackers, chat rooms and mailing lists is expected to follow the code of conduct.

⬆️  back to top

Acknowledgments

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.

About

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.

⬆️  back to top