Skip to content

Commit

Permalink
refactor(can_have_steps): remove step_result middlewares
Browse files Browse the repository at this point in the history
  • Loading branch information
marian13 committed Jan 26, 2024
1 parent 57b0154 commit 25bfd0a
Show file tree
Hide file tree
Showing 20 changed files with 155 additions and 188 deletions.
41 changes: 41 additions & 0 deletions lib/convenient_service/rspec/matchers/classes/call_chain_next.rb
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,13 @@ module Classes
# .with_arguments(*args, **kwargs, &block)
# .and_return_its_value
#
# @internal
# TODO:
# expect { method.call }
# .to call_chain_next.on(method)
# .with_arguments(*args, **kwargs, &block)
# .and_return { |chain_value| chain_value.copy(kwargs: {overrides: {foo: :bar}})}
#
class CallChainNext
include ::RSpec::Expectations
include ::RSpec::Matchers
Expand Down Expand Up @@ -45,6 +52,10 @@ def matches?(block_expectation)
expect(value).to eq(method.chain_value)
end

if used_and_return?
expect(value).to eq(return_block.call(method.chain_value))
end

true
end

Expand Down Expand Up @@ -88,6 +99,10 @@ def does_not_match?(block_expectation)
expect(value).not_to eq(method.chain_value)
end

if used_and_return?
expect(value).not_to eq(return_block.call(method.chain_value))
end

true
end

Expand Down Expand Up @@ -170,6 +185,18 @@ def and_return_its_value
self
end

##
# @param value[Object, ConvenientService::Support::NOT_PASSED]
# @param block [Proc, nil]
#
# @return [ConvenientService::RSpec::Matchers::Classes::CallChainNext]
#
def and_return(value = Support::NOT_PASSED, &block)
chain[:and_return] = (value == Support::NOT_PASSED) ? block : proc { value }

self
end

private

##
Expand All @@ -192,6 +219,13 @@ def used_and_return_its_value?
chain.key?(:and_return_its_value)
end

##
# @return [Boolean]
#
def used_and_return?
chain.key?(:and_return)
end

##
# @return [Hash{Symbol => Object}]
#
Expand Down Expand Up @@ -242,6 +276,13 @@ def block
@block = chain.dig(:with_arguments, :block)
end

##
# @return [Proc]
#
def return_block
@return_block ||= chain[:and_return]
end

##
# @return [Proc, nil]
#
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,9 @@ class DelegateTo
#
# @internal
# TODO: `overload do`?
# TODO: Raise when object is an immediate value.
# TODO: Raise when object already has a stub.
# TODO: `and_return`.
#
def initialize(object = nil, method = nil, matcher: nil)
@matcher = matcher || Entities::Matcher.new(object, method)
Expand Down
13 changes: 4 additions & 9 deletions lib/convenient_service/service/configs/minimal.rb
Original file line number Diff line number Diff line change
Expand Up @@ -226,25 +226,20 @@ class self::Step
end

##
# TODO: Move to `result`. Remove `service_result` middlewares completely.
# TODO: Simple debug for middlewares. For one service only.
#
middlewares :service_result do
middlewares :result do
use ConvenientService::Plugins::Common::NormalizesEnv::Middleware
use ConvenientService::Plugins::Common::CachesReturnValue::Middleware

use ConvenientService::Plugins::Step::HasResult::Middleware

use ConvenientService::Plugins::Step::RaisesOnNotResultReturnValue::Middleware

use ConvenientService::Plugins::Step::CanBeResultStep::CanBeExecuted::Middleware
use ConvenientService::Plugins::Step::CanBeMethodStep::CanBeExecuted::Middleware
end

middlewares :result do
use ConvenientService::Plugins::Common::NormalizesEnv::Middleware
use ConvenientService::Plugins::Common::CachesReturnValue::Middleware

use ConvenientService::Plugins::Step::HasResult::Middleware
end

##
# TODO: Rename.
#
Expand Down
5 changes: 4 additions & 1 deletion lib/convenient_service/service/configs/standard.rb
Original file line number Diff line number Diff line change
Expand Up @@ -180,7 +180,10 @@ class self::Step

middlewares :result do
use ConvenientService::Plugins::Step::CanHaveFallbacks::Middleware.with(fallback_true_status: :failure)
use ConvenientService::Plugins::Step::CanHaveParentResult::Middleware

insert_after \
ConvenientService::Plugins::Step::HasResult::Middleware,
ConvenientService::Plugins::Step::CanHaveParentResult::Middleware
end
end

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -213,7 +213,7 @@ def output_values
# @internal
# IMPORTANT: `service.result(**input_values)` is the reason, why services should have only kwargs as arguments.
#
# NOTE: `service_result` returns a foreign result that is later converted to own result by `convert_to_step_result` in `result`.
# NOTE: `service_result` returns a foreign result that is later converted to own result by `HasResult` middleware.
#
def service_result
service.klass.result(**input_values)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ module Plugins
module CanBeMethodStep
module CanBeExecuted
class Middleware < MethodChainMiddleware
intended_for :service_result, entity: :step
intended_for :result, entity: :step

##
# @return [ConvenientService::Service::Plugins::HasJSendResult::Entities::Result]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ module Plugins
module CanBeResultStep
module CanBeExecuted
class Middleware < MethodChainMiddleware
intended_for :service_result, entity: :step
intended_for :result, entity: :step

##
# @return [ConvenientService::Service::Plugins::HasJSendResult::Entities::Result]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,20 @@ module CanHaveParentResult
class Middleware < MethodChainMiddleware
intended_for :result, entity: :step

##
# @return [ConvenientService::Service::Plugins::HasJSendResult::Entities::Result]
# @raise [ConvenientService::Service::Plugins::CanHaveSteps::Entities::Step::Exceptions::StepHasNoOrganizer]
#
# @internal
# IMPORTANT: `CanHaveParentResult` middleware MUST be placed after `HasResult` middleware.
#
# NOTE: `result` at the moment of this middleware is still a `service_result` (or `method_result`). It is only later converted to `step_result` by `HasResult` middleware.
# That is why `result` is used as `parent` here.
#
def next(...)
chain.next(...).copy(overrides: {kwargs: {parent: entity.service_result}})
result = chain.next(...)

result.copy(overrides: {kwargs: {parent: result}})
end
end
end
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -490,30 +490,17 @@
end
end

example_group "#service_result middlewares" do
let(:service_result_middlewares) do
[
ConvenientService::Common::Plugins::NormalizesEnv::Middleware,
ConvenientService::Common::Plugins::CachesReturnValue::Middleware,
ConvenientService::Service::Plugins::CanHaveSteps::Entities::Step::Plugins::RaisesOnNotResultReturnValue::Middleware,
ConvenientService::Service::Plugins::CanHaveSteps::Entities::Step::Plugins::CanBeResultStep::CanBeExecuted::Middleware,
ConvenientService::Service::Plugins::CanHaveSteps::Entities::Step::Plugins::CanBeMethodStep::CanBeExecuted::Middleware
]
end

it "sets service step middlewares for `#service_result`" do
expect(service_class::Step.middlewares(:service_result).to_a).to eq(service_result_middlewares)
end
end

example_group "#result middlewares" do
let(:result_middlewares) do
[
ConvenientService::Common::Plugins::NormalizesEnv::Middleware,
ConvenientService::Common::Plugins::CachesReturnValue::Middleware,
ConvenientService::Service::Plugins::CanHaveSteps::Entities::Step::Plugins::HasResult::Middleware,
ConvenientService::Service::Plugins::CanHaveSteps::Entities::Step::Plugins::CanHaveFallbacks::Middleware.with(fallback_true_status: :failure),
ConvenientService::Service::Plugins::CanHaveSteps::Entities::Step::Plugins::CanHaveParentResult::Middleware
ConvenientService::Service::Plugins::CanHaveSteps::Entities::Step::Plugins::CanHaveParentResult::Middleware,
ConvenientService::Service::Plugins::CanHaveSteps::Entities::Step::Plugins::RaisesOnNotResultReturnValue::Middleware,
ConvenientService::Service::Plugins::CanHaveSteps::Entities::Step::Plugins::CanBeResultStep::CanBeExecuted::Middleware,
ConvenientService::Service::Plugins::CanHaveSteps::Entities::Step::Plugins::CanBeMethodStep::CanBeExecuted::Middleware,
ConvenientService::Service::Plugins::CanHaveSteps::Entities::Step::Plugins::CanHaveFallbacks::Middleware.with(fallback_true_status: :failure)
]
end

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -437,28 +437,15 @@
end
end

example_group "#service_result middlewares" do
let(:service_result_middlewares) do
[
ConvenientService::Common::Plugins::NormalizesEnv::Middleware,
ConvenientService::Common::Plugins::CachesReturnValue::Middleware,
ConvenientService::Service::Plugins::CanHaveSteps::Entities::Step::Plugins::RaisesOnNotResultReturnValue::Middleware,
ConvenientService::Service::Plugins::CanHaveSteps::Entities::Step::Plugins::CanBeResultStep::CanBeExecuted::Middleware,
ConvenientService::Service::Plugins::CanHaveSteps::Entities::Step::Plugins::CanBeMethodStep::CanBeExecuted::Middleware
]
end

it "sets service step middlewares for `#service_result`" do
expect(service_class::Step.middlewares(:service_result).to_a).to eq(service_result_middlewares)
end
end

example_group "#result middlewares" do
let(:result_middlewares) do
[
ConvenientService::Common::Plugins::NormalizesEnv::Middleware,
ConvenientService::Common::Plugins::CachesReturnValue::Middleware,
ConvenientService::Service::Plugins::CanHaveSteps::Entities::Step::Plugins::HasResult::Middleware,
ConvenientService::Service::Plugins::CanHaveSteps::Entities::Step::Plugins::RaisesOnNotResultReturnValue::Middleware,
ConvenientService::Service::Plugins::CanHaveSteps::Entities::Step::Plugins::CanBeResultStep::CanBeExecuted::Middleware,
ConvenientService::Service::Plugins::CanHaveSteps::Entities::Step::Plugins::CanBeMethodStep::CanBeExecuted::Middleware,
ConvenientService::Service::Plugins::CanHaveSteps::Entities::Step::Plugins::CanHaveParentResult::Middleware
]
end
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -492,30 +492,17 @@
end
end

example_group "#service_result middlewares" do
let(:service_result_middlewares) do
[
ConvenientService::Common::Plugins::NormalizesEnv::Middleware,
ConvenientService::Common::Plugins::CachesReturnValue::Middleware,
ConvenientService::Service::Plugins::CanHaveSteps::Entities::Step::Plugins::RaisesOnNotResultReturnValue::Middleware,
ConvenientService::Service::Plugins::CanHaveSteps::Entities::Step::Plugins::CanBeResultStep::CanBeExecuted::Middleware,
ConvenientService::Service::Plugins::CanHaveSteps::Entities::Step::Plugins::CanBeMethodStep::CanBeExecuted::Middleware
]
end

it "sets service step middlewares for `#service_result`" do
expect(service_class::Step.middlewares(:service_result).to_a).to eq(service_result_middlewares)
end
end

example_group "#result middlewares" do
let(:result_middlewares) do
[
ConvenientService::Common::Plugins::NormalizesEnv::Middleware,
ConvenientService::Common::Plugins::CachesReturnValue::Middleware,
ConvenientService::Service::Plugins::CanHaveSteps::Entities::Step::Plugins::HasResult::Middleware,
ConvenientService::Service::Plugins::CanHaveSteps::Entities::Step::Plugins::CanHaveFallbacks::Middleware.with(fallback_true_status: :failure),
ConvenientService::Service::Plugins::CanHaveSteps::Entities::Step::Plugins::CanHaveParentResult::Middleware
ConvenientService::Service::Plugins::CanHaveSteps::Entities::Step::Plugins::CanHaveParentResult::Middleware,
ConvenientService::Service::Plugins::CanHaveSteps::Entities::Step::Plugins::RaisesOnNotResultReturnValue::Middleware,
ConvenientService::Service::Plugins::CanHaveSteps::Entities::Step::Plugins::CanBeResultStep::CanBeExecuted::Middleware,
ConvenientService::Service::Plugins::CanHaveSteps::Entities::Step::Plugins::CanBeMethodStep::CanBeExecuted::Middleware,
ConvenientService::Service::Plugins::CanHaveSteps::Entities::Step::Plugins::CanHaveFallbacks::Middleware.with(fallback_true_status: :failure)
]
end

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -439,28 +439,15 @@
end
end

example_group "#service_result middlewares" do
let(:service_result_middlewares) do
[
ConvenientService::Common::Plugins::NormalizesEnv::Middleware,
ConvenientService::Common::Plugins::CachesReturnValue::Middleware,
ConvenientService::Service::Plugins::CanHaveSteps::Entities::Step::Plugins::RaisesOnNotResultReturnValue::Middleware,
ConvenientService::Service::Plugins::CanHaveSteps::Entities::Step::Plugins::CanBeResultStep::CanBeExecuted::Middleware,
ConvenientService::Service::Plugins::CanHaveSteps::Entities::Step::Plugins::CanBeMethodStep::CanBeExecuted::Middleware
]
end

it "sets service step middlewares for `#service_result`" do
expect(service_class::Step.middlewares(:service_result).to_a).to eq(service_result_middlewares)
end
end

example_group "#result middlewares" do
let(:result_middlewares) do
[
ConvenientService::Common::Plugins::NormalizesEnv::Middleware,
ConvenientService::Common::Plugins::CachesReturnValue::Middleware,
ConvenientService::Service::Plugins::CanHaveSteps::Entities::Step::Plugins::HasResult::Middleware,
ConvenientService::Service::Plugins::CanHaveSteps::Entities::Step::Plugins::RaisesOnNotResultReturnValue::Middleware,
ConvenientService::Service::Plugins::CanHaveSteps::Entities::Step::Plugins::CanBeResultStep::CanBeExecuted::Middleware,
ConvenientService::Service::Plugins::CanHaveSteps::Entities::Step::Plugins::CanBeMethodStep::CanBeExecuted::Middleware,
ConvenientService::Service::Plugins::CanHaveSteps::Entities::Step::Plugins::CanHaveParentResult::Middleware
]
end
Expand Down
19 changes: 3 additions & 16 deletions spec/lib/convenient_service/service/configs/minimal_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -386,31 +386,18 @@
end
end

example_group "#service_result middlewares" do
let(:service_result_middlewares) do
example_group "#result middlewares" do
let(:result_middlewares) do
[
ConvenientService::Common::Plugins::NormalizesEnv::Middleware,
ConvenientService::Common::Plugins::CachesReturnValue::Middleware,
ConvenientService::Service::Plugins::CanHaveSteps::Entities::Step::Plugins::HasResult::Middleware,
ConvenientService::Service::Plugins::CanHaveSteps::Entities::Step::Plugins::RaisesOnNotResultReturnValue::Middleware,
ConvenientService::Service::Plugins::CanHaveSteps::Entities::Step::Plugins::CanBeResultStep::CanBeExecuted::Middleware,
ConvenientService::Service::Plugins::CanHaveSteps::Entities::Step::Plugins::CanBeMethodStep::CanBeExecuted::Middleware
]
end

it "sets service step middlewares for `#service_result`" do
expect(service_class::Step.middlewares(:service_result).to_a).to eq(service_result_middlewares)
end
end

example_group "#result middlewares" do
let(:result_middlewares) do
[
ConvenientService::Common::Plugins::NormalizesEnv::Middleware,
ConvenientService::Common::Plugins::CachesReturnValue::Middleware,
ConvenientService::Service::Plugins::CanHaveSteps::Entities::Step::Plugins::HasResult::Middleware
]
end

it "sets service step middlewares for `#result`" do
expect(service_class::Step.middlewares(:result).to_a).to eq(result_middlewares)
end
Expand Down
19 changes: 3 additions & 16 deletions spec/lib/convenient_service/service/configs/standard/v1_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -432,28 +432,15 @@
end
end

example_group "#service_result middlewares" do
let(:service_result_middlewares) do
[
ConvenientService::Common::Plugins::NormalizesEnv::Middleware,
ConvenientService::Common::Plugins::CachesReturnValue::Middleware,
ConvenientService::Service::Plugins::CanHaveSteps::Entities::Step::Plugins::RaisesOnNotResultReturnValue::Middleware,
ConvenientService::Service::Plugins::CanHaveSteps::Entities::Step::Plugins::CanBeResultStep::CanBeExecuted::Middleware,
ConvenientService::Service::Plugins::CanHaveSteps::Entities::Step::Plugins::CanBeMethodStep::CanBeExecuted::Middleware
]
end

it "sets service step middlewares for `#service_result`" do
expect(service_class::Step.middlewares(:service_result).to_a).to eq(service_result_middlewares)
end
end

example_group "#result middlewares" do
let(:result_middlewares) do
[
ConvenientService::Common::Plugins::NormalizesEnv::Middleware,
ConvenientService::Common::Plugins::CachesReturnValue::Middleware,
ConvenientService::Service::Plugins::CanHaveSteps::Entities::Step::Plugins::HasResult::Middleware,
ConvenientService::Service::Plugins::CanHaveSteps::Entities::Step::Plugins::RaisesOnNotResultReturnValue::Middleware,
ConvenientService::Service::Plugins::CanHaveSteps::Entities::Step::Plugins::CanBeResultStep::CanBeExecuted::Middleware,
ConvenientService::Service::Plugins::CanHaveSteps::Entities::Step::Plugins::CanBeMethodStep::CanBeExecuted::Middleware,
ConvenientService::Service::Plugins::CanHaveSteps::Entities::Step::Plugins::CanHaveParentResult::Middleware
]
end
Expand Down
Loading

0 comments on commit 25bfd0a

Please sign in to comment.