Kwork - это библиотека для строительства деловых транзакций в Ruby, разработанной для:
Kwork::Result
, Dry::Monads::Result
, Dry::Monads::Maybe
...).ROM
, ActiveRecord
...). Добавьте эту строку в Gemfile вашего приложения:
gem 'kwork' , github : 'waiting-for-dev/kwork'
А затем выполнить:
$ bundle install
Используя dry-auto_inject
и dry-monads
.
require "kwork"
class CheckOutOrder
include Kwork [ adapter : :result ]
include Deps [ :update_line_items , :update_order , :calculate_best_prices , :enqueue_order_completed_email ]
def call ( order_id , attrs )
attrs = step validate ( attrs )
line_items = step update_line_items . ( order_id , attrs [ :line_items ] )
order = step update_order . ( order_id , attrs . except ( :line_items ) )
step calculate_best_prices . ( order : , line_items : )
step enqueue_order_completed_email . ( order )
success ( order )
end
private
def validate ( attrs )
# ...
end
end
include Dry :: Monads [ :result ]
case CheckoutOrder . new
in Success [ message ]
puts message
in Failure [ error ]
puts error
end
Вы можете использовать Trangerableable для элегантного использования железнодорожного шаблона для преобразования данных или всего транзакционного рабочего процесса. На данный момент это работает только с Dry::Monads::Result
:
class CreateUser
include Kwork [ adapter : :result ]
include Deps [ "user_repo" , "validate_user" ]
include Dry :: Monads [ :result ]
DEFAULT_USER_ATTRS = {
country : :us ,
currency : :usd
}
def call ( user_attrs )
user = pipe user_attrs ,
merge ( DEFAULT_USER_ATTRS ) ,
method ( :validate_user )
step create_user ( user )
end
private
def create_user ( user )
Success ( user_repo . create ( user ) )
end
end
Чаще всего бизнес -транзакция должна быть завершена в транзакцию базы данных. Чтобы поддержать этот вариант использования, Kwork дает вам возможность расширить обратный вызов транзакции, чтобы вы могли обернуть его своим собственным кодом. Пара расширений отправляется по умолчанию, но вы можете легко построить свой собственный.
Вам нужно добавить ROM в свой Gemfile
чтобы использовать его. Когда это расширение используется, транзакция Kwork завершена в транзакцию базы данных, которая откатается в случае отказа.
require "kwork"
require "kwork/extensions/rom"
rom = # ROM container
class AddUser
include Kwork [
extension : Kwork :: Extensions :: ROM [ rom , :default ] # :default is the name of the gateway
]
# ...
end
В приложении Rails вы можете использовать расширение Activerecord. Странная транзакция Kwork будет завершена в транзакцию базы данных, и она будет откатана в случае возврата отказа.
require "kwork"
require "kwork/extensions/active_record"
class AddUser
include Kwork [
extension : Kwork :: Extensions :: ActiveRecord
]
# ...
end
Пользовательские расширения - это всего лишь все, что отвечает на #call
принимая обратный вызов транзакции Kwork. Вам нужно только убедиться, что вы ответили на результат выполнения этого обратного вызова. Примите во внимание, что обратный вызов вернет экземпляр Kwork::Result
, независимо от использования адаптера. Это обеспечивает полную работу с любым типом результата.
require "kwork"
MyExtension = lambda do | callback |
callback . ( ) . tap do | result |
do_something if result . success?
end
end
class AddUser
include Kwork [
extension : MyExtension
]
# ...
end
После проверки репо, запустите bin/setup
для установки зависимостей. Затем запустите rake spec
чтобы запустить тесты. Вы также можете запустить bin/console
для интерактивной подсказки, которая позволит вам экспериментировать.
Чтобы установить этот драгоценный камень на локальную машину, запустите bundle exec rake install
. Чтобы выпустить .gem
версию, bundle exec rake release
номер версии в version.rb
. орг
Отчеты об ошибках и запросы на тягу приветствуются на GitHub по адресу https://github.com/tusername]/kwork. Этот проект предназначен для безопасного, гостеприимного места для сотрудничества, и ожидается, что участники будут придерживаться кодекса поведения.
Драгоценный камень доступен в качестве открытого исходного кода в соответствии с условиями лицензии MIT.
Ожидается, что каждый, кто взаимодействует в кодовых базах проекта Kwork, трекеров, зала и списках рассылки, будут следить за кодом поведения.