Project

teckel

0.0
No commit activity in last 3 years
No release in over 3 years
Wrap your business logic into a common interface with enforced input, output and error data structures
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
 Dependencies

Development

~> 2.0
>= 10.0
~> 3.0
>= 0
 Project Readme

Teckel

Ruby service classes with enforced1 input, output and error data structure definition.

Gem Version Build Status Maintainability Test Coverage API Documentation Coverage

Installation

Add this line to your application's Gemfile:

gem 'teckel'

And then execute:

$ bundle

Or install it yourself as:

$ gem install teckel

Motivation

Working with Interactor, Trailblazer's Operation and Dry-rb's Transaction and probably a hand full of inconsistent "service objects", I missed a system that:

  1. provides and enforces well defined input, output and error structures
  2. makes chaining multiple operation easy and reliable
  3. is easy to debug

Usage

For a full overview please see the Docs:

class CreateUser
  include Teckel::Operation

  # DSL style declaration
  input Struct.new(:name, :age, keyword_init: true)

  # Constant style declaration
  Output = ::User

  # Well, also Constant style, but using classic `class` notation
  class Error
    def initialize(message:, status_code:, meta:)
      @message, @status_code, @meta = message, status_code, meta
    end
    attr_reader :message, :status_code, :meta
  end
  error_constructor :new

  def call(input)
    user = User.new(name: input.name, age: input.age)
    if user.save
      success!(user)
    else
      fail!(
        message: "Could not create User",
        status_code: 400,
        meta: { validation: user.errors }
      )
    end
  end
end

CreateUser.call(name: "Bob", age: 23) #=> #<User @age=23, @name="Bob">

CreateUser.call(name: "Bob", age: 5)  #=> #<CreateUser::Error @message="Could not create User", @meta={:validation=>[{:age=>"underage"}]}, @status_code=400>

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.

Contributing

Bug reports and pull requests are welcome on GitHub at https://github.com/fnordfish/teckel. Feature requests should provide a detailed explanation of the missing or changed behavior, if possible including some sample code.

Please also see DEVELOPMENT.md for planned features and general guidelines.

Footnotes

  • 1: Obviously, it's still Ruby and you can cheat. Don’t! ↩