Kwork est une bibliothèque pour la création de transactions commerciales en Ruby conçues pour:
Kwork::Result
, Dry::Monads::Result
, Dry::Monads::Maybe
...).ROM
, ActiveRecord
...). Ajoutez cette ligne à Gemfile de votre application:
gem 'kwork' , github : 'waiting-for-dev/kwork'
Puis exécuter:
$ bundle install
Utilisation de 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
Vous pouvez tirer parti de la transaction pour utiliser élégamment le modèle de chemin de fer pour la transformation des données ou l'ensemble du flux de travail transactionnel. Pour l'instant, cela ne fonctionne qu'avec 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
Plus souvent qu'autrement, une transaction commerciale doit être enveloppée dans une transaction de base de données. Pour prendre en charge ce cas d'utilisation, KWork vous donne la possibilité d'étendre le rappel des transactions afin que vous puissiez l'envelopper avec votre propre code. Quelques extensions sont expédiées par défaut, mais vous pouvez facilement construire le vôtre.
Vous devez ajouter ROM à votre Gemfile
pour l'utiliser. Lorsque cette extension est utilisée, la transaction KWROWA est enveloppée dans une transaction de base de données, qui est rétablie en cas de renvoi d'une défaillance.
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
Sur une application Rails, vous pouvez utiliser l'extension ActiveRecord. La transaction RAW KWORK sera emballée dans une transaction de base de données, et elle sera annulée en cas de renvoi d'un échec.
require "kwork"
require "kwork/extensions/active_record"
class AddUser
include Kwork [
extension : Kwork :: Extensions :: ActiveRecord
]
# ...
end
Les extensions personnalisées sont tout ce qui répond à #call
en acceptant le rappel des transactions KWork. Vous n'avez qu'à vous assurer de répondre au résultat de l'exécution de ce rappel. Tenez compte du fait que le rappel renvoie une instance de Kwork::Result
, quel que soit l'adaptateur utilisé. Cela garantit pleinement l'opérabilité avec n'importe quel type de résultat.
require "kwork"
MyExtension = lambda do | callback |
callback . ( ) . tap do | result |
do_something if result . success?
end
end
class AddUser
include Kwork [
extension : MyExtension
]
# ...
end
Après avoir vérifié le dépôt, exécutez bin/setup
pour installer des dépendances. Ensuite, exécutez rake spec
pour exécuter les tests. Vous pouvez également exécuter bin/console
pour une invite interactive qui vous permettra d'expérimenter.
Pour installer ce gemme sur votre machine locale, exécutez bundle exec rake install
. Pour publier une nouvelle version, mettez à jour le numéro de version dans version.rb
, puis exécutez bundle exec rake release
, qui créera une balise GIT pour la version, pousse Git Commits et la balise créée, et pousse le fichier .gem
sur RubyGems. org.
Les rapports de bogues et les demandes de traction sont les bienvenus sur GitHub à https://github.com/[USERNAME DBATH / KWORK. Ce projet est destiné à être un espace sûr et accueillant pour la collaboration, et les contributeurs devraient adhérer au code de conduite.
Le GEM est disponible en open source en vertu des termes de la licence MIT.
Tout le monde interagit dans les bases de code, les trackers des problèmes, les salles de discussion et les listes de diffusion du Code de conduite.