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
Transactableを活用して、データ変換またはトランザクションワークフロー全体に鉄道パターンをエレガントに使用できます。今のところ、それはDry::Monads::Result
adapterでのみ動作します:
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はトランザクションコールバックを拡張して、独自のコードでラップできるようにすることができます。デフォルトではいくつかの拡張機能が出荷されますが、簡単に独自に作成できます。
Gemfile
にROMを追加して使用する必要があります。この拡張機能を使用すると、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アプリケーションでは、ActiverCord拡張機能を使用できます。 RAW 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
実行します。新しいバージョンをリリースするには、 version.rb
のバージョン番号を更新してから、バージョンのgitタグを作成し、Git Commitsと作成したタグをプッシュし、 .gem
ファイルbundle exec rake release
Rubygemsにプッシュします。組織。
バグレポートとプルリクエストは、https://github.com/_username]/kworkのGithubで大歓迎です。このプロジェクトは、コラボレーションのための安全で居心地の良いスペースであることを目的としており、貢献者は行動規範を遵守することが期待されています。
宝石は、MITライセンスの条件の下でオープンソースとして利用できます。
KWORKプロジェクトのコードベース、発行トラッカー、チャットルーム、メーリングリストで対話する全員が、行動規範に従うことが期待されています。