dry-rb / dry-transaction

Business transaction DSL
http://dry-rb.org/gems/dry-transaction
MIT License
469 stars 55 forks source link

Support usage alongside dry-auto_inject #101

Open timriley opened 6 years ago

timriley commented 6 years ago

Something like this should work:

require "dry-monads"
require "dry-auto_inject"

RSpec.describe "Using dry-auto_inject" do
  let(:transaction) {
    Class.new do
      include Dry::Transaction(container: Test::Container)
      include Test::Inject[:extract_email]

      step :symbolize

      def call(input)
        super(input).bind(extract_email)
      end
    end.new
  }

  before do
    module Test
      Container = {
        symbolize: -> input { Dry::Monads::Right(name: input["name"], email: input["email"]) },
        extract_email: -> input { Dry::Monads::Right(email: input[:email]) },
      }

      Inject = Dry::AutoInject(container: Container)
    end
  end

  it "support auto-injection of dependencies alongside step operations" do
    expect(transaction.("name" => "Jane", "email" => "jane@example.com").value).to eq(email: "jane@example.com")
  end
end

But right now, it doesn't:

  1) Using dry-auto_inject support auto-injection of dependencies alongside step operations
     Failure/Error: end.new
     ArgumentError:
       wrong number of arguments (given 1, expected 0)
     # ./lib/dry/transaction/instance_methods.rb:47:in `initialize'
     # ./lib/dry/transaction/instance_methods.rb:47:in `initialize'
     # ./lib/dry/transaction/operation_resolver.rb:19:in `block (2 levels) in initialize'
     # ./spec/integration/auto_injection_spec.rb:15:in `block (2 levels) in <top (required)>'
     # ./spec/integration/auto_injection_spec.rb:30:in `block (2 levels) in <top (required)>'
GustavoCaso commented 6 years ago

I will try having a look at it! 💎

johnvoon commented 6 years ago

Has this issue been resolved? If no one's working on it at the moment, I'm happy to look into it.

timriley commented 6 years ago

@johnvoon Would love you to look into it, thanks 🙏