KWork es una biblioteca para construir transacciones comerciales en Ruby diseñadas para:
Kwork::Result
, Dry::Monads::Result
, Dry::Monads::Maybe
...).ROM
, ActiveRecord
...). Agregue esta línea al archivo gem de su aplicación:
gem 'kwork' , github : 'waiting-for-dev/kwork'
Y luego ejecutar:
$ bundle install
Usando dry-auto_inject
y 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
Puede aprovechar el transacible para usar elegantemente el patrón ferroviario para la transformación de datos o todo el flujo de trabajo transaccional. Por ahora, solo funciona con 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
La mayoría de las veces, una transacción comercial debe envolverse dentro de una transacción de base de datos. Para respaldar este caso de uso, KWork le brinda la capacidad de extender la devolución de llamada de transacción para que pueda envolverla con su propio código. Un par de extensiones se envían de forma predeterminada, pero puede construir fácilmente la suya.
Debe agregar ROM a su Gemfile
para usarlo. Cuando se usa esta extensión, la transacción KWork está envuelta dentro de una transacción de la base de datos, que se remonta en el caso de devolver una falla.
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
En una aplicación Rails, puede usar la extensión de Activerecord. La transacción KWork sin procesar se envolverá dentro de una transacción de base de datos, y se volverá a rodar en caso de devolver una falla.
require "kwork"
require "kwork/extensions/active_record"
class AddUser
include Kwork [
extension : Kwork :: Extensions :: ActiveRecord
]
# ...
end
Las extensiones personalizadas son cualquier cosa que responda a #call
que acepta la devolución de llamada de la transacción KWork. Solo necesita asegurarse de responder el resultado de ejecutar esa devolución de llamada. Tenga en cuenta que la devolución de llamada devolverá una instancia de Kwork::Result
, independientemente del adaptador en uso. Eso garantiza la operación total con cualquier tipo de resultado.
require "kwork"
MyExtension = lambda do | callback |
callback . ( ) . tap do | result |
do_something if result . success?
end
end
class AddUser
include Kwork [
extension : MyExtension
]
# ...
end
Después de revisar el repositorio, ejecute bin/setup
para instalar dependencias. Luego, ejecute rake spec
para ejecutar las pruebas. También puede ejecutar bin/console
para un mensaje interactivo que le permitirá experimentar.
Para instalar esta gema en su máquina local, ejecute bundle exec rake install
. Para lanzar una nueva versión, actualice el número de versión en version.rb
y luego ejecute bundle exec rake release
, que creará una etiqueta GIT para la versión, Push Git Commits y la etiqueta creada, y empujará el archivo .gem
a RubyGems. org.
Los informes de errores y las solicitudes de extracción son bienvenidas en GitHub en https://github.com/•usernamefont>/kwork. Este proyecto pretende ser un espacio seguro y acogedor para la colaboración, y se espera que los contribuyentes se adhieran al Código de Conducta.
La gema está disponible como código abierto bajo los términos de la licencia MIT.
Se espera que todos los que interactúen en las bases de código del proyecto KWORK, rastreadores de problemas, salas de chat y listas de correo sigan el código de conducta.