convenient_service 0.5.0 → 0.7.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +49 -0
- data/LICENSE.txt +1 -1
- data/README.md +1 -1
- data/ROADMAP.md +26 -4
- data/Taskfile.yml +30 -0
- data/convenient_service.gemspec +5 -2
- data/lib/convenient_service/aliases.rb +2 -0
- data/lib/convenient_service/common/plugins/assigns_attributes_in_constructor/using_active_model_attribute_assignment/concern.rb +0 -2
- data/lib/convenient_service/common/plugins/assigns_attributes_in_constructor/using_dry_initializer/concern.rb +0 -2
- data/lib/convenient_service/common/plugins/has_around_callbacks/middleware.rb +24 -4
- data/lib/convenient_service/common/plugins/has_callbacks/container.rb +17 -0
- data/lib/convenient_service/common/plugins/has_callbacks/entities/callback.rb +98 -5
- data/lib/convenient_service/common/plugins/has_callbacks/middleware.rb +25 -4
- data/lib/convenient_service/common/plugins/has_callbacks.rb +1 -0
- data/lib/convenient_service/common/plugins.rb +1 -1
- data/lib/convenient_service/configs/standard.rb +25 -12
- data/lib/convenient_service/core/entities/config/entities/method_middlewares/entities/container/commands/resolve_methods_middlewares_callers.rb +1 -24
- data/lib/convenient_service/dependencies.rb +19 -0
- data/lib/convenient_service/examples/dry/gemfile/dry_service/config.rb +4 -2
- data/lib/convenient_service/examples/rails/gemfile/rails_service/config.rb +4 -2
- data/lib/convenient_service/examples/rails/gemfile/services/format.rb +35 -6
- data/lib/convenient_service/examples/rails/gemfile/services/format_header.rb +1 -2
- data/lib/convenient_service/examples/rails/gemfile/services/merge_sections.rb +25 -0
- data/lib/convenient_service/examples/rails/gemfile/services/replace_file_content.rb +37 -0
- data/lib/convenient_service/examples/rails/gemfile/services.rb +8 -4
- data/lib/convenient_service/examples/standard/gemfile/services/format.rb +45 -6
- data/lib/convenient_service/examples/standard/gemfile/services/merge_sections.rb +52 -0
- data/lib/convenient_service/examples/standard/gemfile/services/replace_file_content.rb +48 -0
- data/lib/convenient_service/examples/standard/gemfile/services.rb +8 -4
- data/lib/convenient_service/examples/standard/request_params/constants.rb +15 -0
- data/lib/convenient_service/examples/standard/request_params/entities/description.rb +40 -0
- data/lib/convenient_service/examples/standard/request_params/entities/format.rb +40 -0
- data/lib/convenient_service/examples/standard/request_params/entities/id.rb +47 -0
- data/lib/convenient_service/examples/standard/request_params/entities/logger.rb +21 -0
- data/lib/convenient_service/examples/standard/request_params/entities/request.rb +23 -0
- data/lib/convenient_service/examples/standard/request_params/entities/source.rb +40 -0
- data/lib/convenient_service/examples/standard/request_params/entities/tag.rb +40 -0
- data/lib/convenient_service/examples/standard/request_params/entities/title.rb +40 -0
- data/lib/convenient_service/examples/standard/request_params/entities.rb +11 -0
- data/lib/convenient_service/examples/standard/request_params/services/apply_default_param_values.rb +26 -0
- data/lib/convenient_service/examples/standard/request_params/services/cast_params.rb +38 -0
- data/lib/convenient_service/examples/standard/request_params/services/extract_params_from_body.rb +70 -0
- data/lib/convenient_service/examples/standard/request_params/services/extract_params_from_path.rb +62 -0
- data/lib/convenient_service/examples/standard/request_params/services/filter_out_unpermitted_params.rb +26 -0
- data/lib/convenient_service/examples/standard/request_params/services/log_request_params.rb +54 -0
- data/lib/convenient_service/examples/standard/request_params/services/merge_params.rb +26 -0
- data/lib/convenient_service/examples/standard/request_params/services/prepare.rb +65 -0
- data/lib/convenient_service/examples/standard/request_params/services/validate_casted_params.rb +94 -0
- data/lib/convenient_service/examples/standard/request_params/services/validate_uncasted_params.rb +72 -0
- data/lib/convenient_service/examples/standard/request_params/services.rb +13 -0
- data/lib/convenient_service/examples/standard/request_params/utils/array/wrap.rb +46 -0
- data/lib/convenient_service/examples/standard/request_params/utils/array.rb +21 -0
- data/lib/convenient_service/examples/standard/request_params/utils/http/request/parse_body.rb +42 -0
- data/lib/convenient_service/examples/standard/request_params/utils/http/request/parse_path.rb +40 -0
- data/lib/convenient_service/examples/standard/request_params/utils/http/request.rb +28 -0
- data/lib/convenient_service/examples/standard/request_params/utils/http.rb +3 -0
- data/lib/convenient_service/examples/standard/request_params/utils/integer/safe_parse.rb +31 -0
- data/lib/convenient_service/examples/standard/request_params/utils/integer.rb +25 -0
- data/lib/convenient_service/examples/standard/request_params/utils/json/safe_parse.rb +40 -0
- data/lib/convenient_service/examples/standard/request_params/utils/json.rb +21 -0
- data/lib/convenient_service/examples/standard/request_params/utils/object/blank.rb +34 -0
- data/lib/convenient_service/examples/standard/request_params/utils/object/present.rb +31 -0
- data/lib/convenient_service/examples/standard/request_params/utils/object.rb +26 -0
- data/lib/convenient_service/examples/standard/request_params/utils.rb +7 -0
- data/lib/convenient_service/examples/standard/request_params.rb +48 -0
- data/lib/convenient_service/factories/arguments.rb +43 -0
- data/lib/convenient_service/factories/results.rb +214 -0
- data/lib/convenient_service/factories/services.rb +189 -0
- data/lib/convenient_service/factories/step/instance.rb +32 -0
- data/lib/convenient_service/factories/step.rb +3 -0
- data/lib/convenient_service/factories/steps.rb +126 -0
- data/lib/convenient_service/factories.rb +22 -0
- data/lib/convenient_service/factory.rb +21 -0
- data/lib/convenient_service/rspec/matchers/custom/be_descendant_of.rb +2 -2
- data/lib/convenient_service/rspec/matchers/custom/be_direct_descendant_of.rb +2 -2
- data/lib/convenient_service/rspec/matchers/custom/delegate_to/entities/matcher/commands/generate_printable_method.rb +50 -0
- data/lib/convenient_service/rspec/matchers/custom/delegate_to/entities/matcher/commands.rb +3 -0
- data/lib/convenient_service/rspec/matchers/custom/delegate_to/entities/matcher/entities/chainings/sub_matchers/arguments/commands/apply_stub_to_track_delegations.rb +78 -0
- data/lib/convenient_service/rspec/matchers/custom/delegate_to/entities/matcher/entities/chainings/sub_matchers/arguments/commands/generate_printable_arguments.rb +100 -0
- data/lib/convenient_service/rspec/matchers/custom/delegate_to/entities/matcher/entities/chainings/sub_matchers/arguments/commands.rb +4 -0
- data/lib/convenient_service/rspec/matchers/custom/delegate_to/entities/matcher/entities/chainings/sub_matchers/arguments.rb +95 -0
- data/lib/convenient_service/rspec/matchers/custom/delegate_to/entities/matcher/entities/chainings/sub_matchers/base.rb +87 -0
- data/lib/convenient_service/rspec/matchers/custom/delegate_to/entities/matcher/entities/chainings/sub_matchers/return_its_value.rb +129 -0
- data/lib/convenient_service/rspec/matchers/custom/delegate_to/entities/matcher/entities/chainings/sub_matchers/with_any_arguments.rb +37 -0
- data/lib/convenient_service/rspec/matchers/custom/delegate_to/entities/matcher/entities/chainings/sub_matchers/with_concrete_arguments.rb +37 -0
- data/lib/convenient_service/rspec/matchers/custom/delegate_to/entities/matcher/entities/chainings/sub_matchers/without_arguments.rb +37 -0
- data/lib/convenient_service/rspec/matchers/custom/delegate_to/entities/matcher/entities/chainings/values/base.rb +41 -0
- data/lib/convenient_service/rspec/matchers/custom/delegate_to/entities/matcher/entities/chainings/values/with_calling_original.rb +30 -0
- data/lib/convenient_service/rspec/matchers/custom/delegate_to/entities/matcher/entities/chainings/values/without_calling_original.rb +30 -0
- data/lib/convenient_service/rspec/matchers/custom/delegate_to/entities/matcher/entities/chainings.rb +12 -0
- data/lib/convenient_service/rspec/matchers/custom/delegate_to/entities/matcher/entities/chainings_collection/errors.rb +57 -0
- data/lib/convenient_service/rspec/matchers/custom/delegate_to/entities/matcher/entities/chainings_collection.rb +171 -0
- data/lib/convenient_service/rspec/matchers/custom/delegate_to/entities/matcher/entities/delegation.rb +79 -0
- data/lib/convenient_service/rspec/matchers/custom/delegate_to/entities/matcher/entities.rb +5 -0
- data/lib/convenient_service/rspec/matchers/custom/delegate_to/entities/matcher.rb +276 -0
- data/lib/convenient_service/rspec/matchers/custom/delegate_to/entities.rb +3 -0
- data/lib/convenient_service/rspec/matchers/custom/delegate_to.rb +66 -233
- data/lib/convenient_service/rspec/matchers/custom/results/base/commands/find_result_method_step.rb +74 -0
- data/lib/convenient_service/rspec/matchers/custom/results/base/commands/find_result_result_method_step.rb +66 -0
- data/lib/convenient_service/rspec/matchers/custom/results/base/commands/find_result_service_step.rb +48 -0
- data/lib/convenient_service/rspec/matchers/custom/results/base/commands/generate_expected_step_part.rb +42 -0
- data/lib/convenient_service/rspec/matchers/custom/results/base/commands/generate_got_step_part.rb +42 -0
- data/lib/convenient_service/rspec/matchers/custom/results/base/commands/match_result_step.rb +89 -0
- data/lib/convenient_service/rspec/matchers/custom/results/base/commands.rb +10 -0
- data/lib/convenient_service/rspec/matchers/custom/results/base/errors.rb +35 -0
- data/lib/convenient_service/rspec/matchers/custom/results/base.rb +73 -12
- data/lib/convenient_service/rspec/matchers/custom/singleton_prepend_module.rb +79 -0
- data/lib/convenient_service/rspec/matchers/custom.rb +1 -0
- data/lib/convenient_service/rspec/matchers/singleton_prepend_module.rb +13 -0
- data/lib/convenient_service/rspec/matchers.rb +2 -0
- data/lib/convenient_service/service/plugins/has_result/entities/result/plugins/can_have_parent_result/concern.rb +85 -0
- data/lib/convenient_service/service/plugins/has_result/entities/result/plugins/can_have_parent_result/initialize/middleware.rb +27 -0
- data/lib/convenient_service/service/plugins/has_result/entities/result/plugins/can_have_parent_result/initialize.rb +3 -0
- data/lib/convenient_service/service/plugins/has_result/entities/result/plugins/can_have_parent_result/to_kwargs/middleware.rb +25 -0
- data/lib/convenient_service/service/plugins/has_result/entities/result/plugins/can_have_parent_result/to_kwargs.rb +3 -0
- data/lib/convenient_service/service/plugins/has_result/entities/result/plugins/can_have_parent_result.rb +5 -0
- data/lib/convenient_service/service/plugins/has_result/entities/result/plugins/has_jsend_status_and_attributes/concern/instance_methods.rb +7 -1
- data/lib/convenient_service/service/plugins/has_result/entities/result/plugins/has_jsend_status_and_attributes/entities/data.rb +4 -0
- data/lib/convenient_service/service/plugins/has_result/entities/result/plugins/has_step/concern.rb +27 -0
- data/lib/convenient_service/service/plugins/has_result/entities/result/plugins/has_step/initialize/middleware.rb +27 -0
- data/lib/convenient_service/service/plugins/has_result/entities/result/plugins/has_step/initialize.rb +3 -0
- data/lib/convenient_service/service/plugins/has_result/entities/result/plugins/has_step/to_kwargs/middleware.rb +25 -0
- data/lib/convenient_service/service/plugins/has_result/entities/result/plugins/has_step/to_kwargs.rb +3 -0
- data/lib/convenient_service/service/plugins/has_result/entities/result/plugins/has_step.rb +5 -0
- data/lib/convenient_service/service/plugins/has_result/entities/result/plugins.rb +2 -0
- data/lib/convenient_service/service/plugins/has_result_method_steps.rb +0 -2
- data/lib/convenient_service/service/plugins/has_result_steps/concern.rb +40 -4
- data/lib/convenient_service/service/plugins/has_result_steps/entities/method/commands/cast_method.rb +3 -0
- data/lib/convenient_service/service/plugins/has_result_steps/entities/method/commands/cast_method_caller.rb +8 -1
- data/lib/convenient_service/service/plugins/has_result_steps/entities/method/commands/cast_method_direction.rb +3 -0
- data/lib/convenient_service/service/plugins/has_result_steps/entities/method/commands/cast_method_key.rb +8 -1
- data/lib/convenient_service/service/plugins/has_result_steps/entities/method/commands/cast_method_name.rb +9 -5
- data/lib/convenient_service/service/plugins/has_result_steps/entities/method/commands/define_method_in_container.rb +2 -2
- data/lib/convenient_service/service/plugins/has_result_steps/entities/method/concern/instance_methods.rb +4 -0
- data/lib/convenient_service/service/plugins/has_result_steps/entities/method/entities/callers/base.rb +4 -0
- data/lib/convenient_service/service/plugins/has_result_steps/entities/method/entities/callers/reassignment/commands/define_method_in_container.rb +74 -0
- data/lib/convenient_service/service/plugins/has_result_steps/entities/method/entities/callers/reassignment/commands.rb +3 -0
- data/lib/convenient_service/service/plugins/has_result_steps/entities/method/entities/callers/reassignment.rb +50 -0
- data/lib/convenient_service/service/plugins/has_result_steps/entities/method/entities/callers.rb +1 -0
- data/lib/convenient_service/service/plugins/has_result_steps/entities/method/entities/values/reassignment.rb +43 -0
- data/lib/convenient_service/service/plugins/has_result_steps/entities/method/entities/values.rb +3 -0
- data/lib/convenient_service/service/plugins/has_result_steps/entities/method/entities.rb +1 -0
- data/lib/convenient_service/service/plugins/has_result_steps/entities/method/errors.rb +22 -0
- data/lib/convenient_service/service/plugins/has_result_steps/entities/step/concern/instance_methods.rb +39 -3
- data/lib/convenient_service/service/plugins/has_result_steps/entities/step/plugins/can_have_parent_result/middleware.rb +23 -0
- data/lib/convenient_service/service/plugins/has_result_steps/entities/step/plugins/can_have_parent_result.rb +3 -0
- data/lib/convenient_service/service/plugins/has_result_steps/entities/step/plugins.rb +1 -0
- data/lib/convenient_service/service/plugins/has_result_steps/entities/step_collection.rb +13 -0
- data/lib/convenient_service/service/plugins/has_result_steps/middleware.rb +18 -4
- data/lib/convenient_service/services/run_method_in_organizer.rb +28 -0
- data/lib/convenient_service/services/run_own_method_in_organizer.rb +64 -0
- data/lib/convenient_service/{service/plugins/has_result_method_steps/services.rb → services.rb} +0 -1
- data/lib/convenient_service/support/arguments/null_arguments.rb +28 -0
- data/lib/convenient_service/support/arguments.rb +87 -0
- data/lib/convenient_service/support/copyable.rb +6 -2
- data/lib/convenient_service/support/dependency_container/commands/assert_valid_scope.rb +32 -0
- data/lib/convenient_service/support/dependency_container/commands/import_method.rb +13 -23
- data/lib/convenient_service/support/dependency_container/commands.rb +1 -0
- data/lib/convenient_service/support/dependency_container/constants.rb +4 -2
- data/lib/convenient_service/support/dependency_container/entities/method.rb +2 -9
- data/lib/convenient_service/support/dependency_container/entities/namespace_collection.rb +0 -9
- data/lib/convenient_service/support/dependency_container/errors.rb +26 -1
- data/lib/convenient_service/support/dependency_container/export.rb +8 -0
- data/lib/convenient_service/support/dependency_container/import.rb +3 -1
- data/lib/convenient_service/support/not_passed.rb +3 -1
- data/lib/convenient_service/support/version/null_version.rb +7 -0
- data/lib/convenient_service/support/version.rb +11 -1
- data/lib/convenient_service/support.rb +1 -0
- data/lib/convenient_service/utils/object/instance_variable_delete.rb +41 -0
- data/lib/convenient_service/utils/object/instance_variable_fetch.rb +4 -0
- data/lib/convenient_service/utils/object.rb +9 -0
- data/lib/convenient_service/utils/proc/display.rb +43 -0
- data/lib/convenient_service/utils/proc.rb +5 -0
- data/lib/convenient_service/version.rb +1 -1
- data/lib/convenient_service.rb +6 -0
- data/logo.png +0 -0
- metadata +154 -10
- data/lib/convenient_service/service/plugins/has_result_method_steps/errors.rb +0 -23
- data/lib/convenient_service/service/plugins/has_result_method_steps/services/method_step_config.rb +0 -55
- data/lib/convenient_service/service/plugins/has_result_method_steps/services/run_method_in_organizer.rb +0 -30
- data/lib/convenient_service/service/plugins/has_result_method_steps/services/run_own_method_in_organizer.rb +0 -52
@@ -3,6 +3,8 @@
|
|
3
3
|
require_relative "plugins/can_recalculate_result"
|
4
4
|
require_relative "plugins/has_jsend_status_and_attributes"
|
5
5
|
require_relative "plugins/has_inspect"
|
6
|
+
require_relative "plugins/has_step"
|
7
|
+
require_relative "plugins/can_have_parent_result"
|
6
8
|
require_relative "plugins/has_result_short_syntax"
|
7
9
|
require_relative "plugins/marks_result_status_as_checked"
|
8
10
|
require_relative "plugins/raises_on_not_checked_result_status"
|
@@ -8,6 +8,9 @@ module ConvenientService
|
|
8
8
|
include Support::Concern
|
9
9
|
|
10
10
|
instance_methods do
|
11
|
+
##
|
12
|
+
# @return [Array<ConvenientService::Service::Plugins::HasResultSteps::Entities::Step>]
|
13
|
+
#
|
11
14
|
def steps
|
12
15
|
internals.cache.fetch(:steps) do
|
13
16
|
self.class
|
@@ -18,21 +21,37 @@ module ConvenientService
|
|
18
21
|
end
|
19
22
|
|
20
23
|
##
|
21
|
-
#
|
24
|
+
# Returns step by index.
|
25
|
+
# Returns `nil` when index is out of range.
|
26
|
+
#
|
27
|
+
# @param index [Integer]
|
28
|
+
# @return [ConvenientService::Service::Plugins::HasResultSteps::Entities::Step]
|
22
29
|
#
|
23
|
-
#
|
24
|
-
#
|
25
|
-
# end
|
30
|
+
# @note This method was initially designed as a hook (callback trigger).
|
31
|
+
# @see ConvenientService::Service::Plugins::HasResultSteps::Middleware#next
|
26
32
|
#
|
33
|
+
def step(index)
|
34
|
+
steps[index]
|
35
|
+
end
|
27
36
|
end
|
28
37
|
|
29
38
|
class_methods do
|
39
|
+
##
|
40
|
+
# Registers a step (step definition).
|
41
|
+
#
|
42
|
+
# @param args [Array]
|
43
|
+
# @param kwargs [Hash]
|
44
|
+
# @return [ConvenientService::Service::Plugins::HasResultSteps::Entities::Step]
|
45
|
+
#
|
30
46
|
def step(*args, **kwargs)
|
31
47
|
step_class.new(*args, **kwargs.merge(container: self))
|
32
48
|
.tap { |step_instance| steps << step_instance }
|
33
49
|
end
|
34
50
|
|
35
51
|
##
|
52
|
+
# @param value [Object] Can be any type.
|
53
|
+
# @return [ConvenientService::Support::RawValue]
|
54
|
+
#
|
36
55
|
# Allows to pass a value to `in` method without its intermediate processing.
|
37
56
|
# @see https://marian13.github.io/convenient_service_docs/basics/step_to_result_translation_table
|
38
57
|
#
|
@@ -41,14 +60,31 @@ module ConvenientService
|
|
41
60
|
# # that is converted to the following service invocation:
|
42
61
|
# AssertFeatureEnabled.result(name: :chat_v2)
|
43
62
|
#
|
63
|
+
# @param value [Object] Can be any type.
|
64
|
+
# @return [ConvenientService::Support::RawValue]
|
65
|
+
#
|
44
66
|
def raw(value)
|
45
67
|
Support::RawValue.wrap(value)
|
46
68
|
end
|
47
69
|
|
70
|
+
##
|
71
|
+
# @param method_name [String, Symbol]
|
72
|
+
# @return [ConvenientService::Service::Plugins::HasResultSteps::Entities::Method::Entities::Values::Reassignment]
|
73
|
+
#
|
74
|
+
def reassign(method_name)
|
75
|
+
Entities::Method::Entities::Values::Reassignment.new(method_name)
|
76
|
+
end
|
77
|
+
|
78
|
+
##
|
79
|
+
# @return [ConvenientService::Service::Plugins::HasResultSteps::Entities::StepCollection]
|
80
|
+
#
|
48
81
|
def steps
|
49
82
|
@steps ||= Entities::StepCollection.new
|
50
83
|
end
|
51
84
|
|
85
|
+
##
|
86
|
+
# @return [ConvenientService::Service::Plugins::HasResultSteps::Entities::Step]
|
87
|
+
#
|
52
88
|
def step_class
|
53
89
|
@step_class ||= Commands::CreateStepClass.call(service_class: self)
|
54
90
|
end
|
@@ -8,7 +8,7 @@ module ConvenientService
|
|
8
8
|
class Method
|
9
9
|
module Commands
|
10
10
|
##
|
11
|
-
# TODO:
|
11
|
+
# TODO: Abstract factory.
|
12
12
|
#
|
13
13
|
class CastMethodCaller < Support::Command
|
14
14
|
attr_reader :other, :options
|
@@ -23,6 +23,7 @@ module ConvenientService
|
|
23
23
|
when ::Symbol then cast_symbol
|
24
24
|
when ::String then cast_string
|
25
25
|
when ::Hash then cast_hash
|
26
|
+
when Entities::Values::Reassignment then cast_reassignment
|
26
27
|
when Method then cast_method
|
27
28
|
end
|
28
29
|
end
|
@@ -37,6 +38,10 @@ module ConvenientService
|
|
37
38
|
Entities::Callers::Usual.new(other)
|
38
39
|
end
|
39
40
|
|
41
|
+
def cast_reassignment
|
42
|
+
Entities::Callers::Reassignment.new(other)
|
43
|
+
end
|
44
|
+
|
40
45
|
def cast_hash
|
41
46
|
return unless other.keys.one?
|
42
47
|
|
@@ -51,6 +56,8 @@ module ConvenientService
|
|
51
56
|
Entities::Callers::Proc.new(value)
|
52
57
|
when Support::RawValue
|
53
58
|
Entities::Callers::Raw.new(value)
|
59
|
+
when Entities::Values::Reassignment
|
60
|
+
Entities::Callers::Reassignment.new(value)
|
54
61
|
end
|
55
62
|
end
|
56
63
|
|
@@ -8,7 +8,7 @@ module ConvenientService
|
|
8
8
|
class Method
|
9
9
|
module Commands
|
10
10
|
##
|
11
|
-
# TODO:
|
11
|
+
# TODO: Abstract factory.
|
12
12
|
#
|
13
13
|
class CastMethodKey < Support::Command
|
14
14
|
attr_reader :other, :options
|
@@ -26,6 +26,7 @@ module ConvenientService
|
|
26
26
|
when ::Symbol then cast_symbol
|
27
27
|
when ::String then cast_string
|
28
28
|
when ::Hash then cast_hash
|
29
|
+
when Entities::Values::Reassignment then cast_reassignment
|
29
30
|
when Method then cast_method
|
30
31
|
end
|
31
32
|
end
|
@@ -40,6 +41,10 @@ module ConvenientService
|
|
40
41
|
Entities::Key.new(other)
|
41
42
|
end
|
42
43
|
|
44
|
+
def cast_reassignment
|
45
|
+
Entities::Key.new(other.to_sym)
|
46
|
+
end
|
47
|
+
|
43
48
|
def cast_hash
|
44
49
|
return unless other.keys.one?
|
45
50
|
|
@@ -55,6 +60,8 @@ module ConvenientService
|
|
55
60
|
Entities::Key.new(key)
|
56
61
|
when Support::RawValue
|
57
62
|
Entities::Key.new(key)
|
63
|
+
when Entities::Values::Reassignment
|
64
|
+
Entities::Key.new(key)
|
58
65
|
end
|
59
66
|
end
|
60
67
|
|
@@ -7,8 +7,8 @@ module ConvenientService
|
|
7
7
|
module Entities
|
8
8
|
class Method
|
9
9
|
module Commands
|
10
|
-
|
11
|
-
# TODO:
|
10
|
+
#
|
11
|
+
# TODO: Abstract factory.
|
12
12
|
#
|
13
13
|
class CastMethodName < Support::Command
|
14
14
|
attr_reader :other, :options
|
@@ -26,6 +26,7 @@ module ConvenientService
|
|
26
26
|
when ::Symbol then cast_symbol
|
27
27
|
when ::String then cast_string
|
28
28
|
when ::Hash then cast_hash
|
29
|
+
when Entities::Values::Reassignment then cast_reassignment
|
29
30
|
when Method then cast_method
|
30
31
|
end
|
31
32
|
end
|
@@ -40,6 +41,10 @@ module ConvenientService
|
|
40
41
|
Entities::Name.new(other)
|
41
42
|
end
|
42
43
|
|
44
|
+
def cast_reassignment
|
45
|
+
Entities::Name.new(other.to_sym)
|
46
|
+
end
|
47
|
+
|
43
48
|
def cast_hash
|
44
49
|
return unless other.keys.one?
|
45
50
|
|
@@ -55,12 +60,11 @@ module ConvenientService
|
|
55
60
|
Entities::Name.new(key)
|
56
61
|
when Support::RawValue
|
57
62
|
Entities::Name.new(key)
|
63
|
+
when Entities::Values::Reassignment
|
64
|
+
Entities::Name.new(value.to_sym)
|
58
65
|
end
|
59
66
|
end
|
60
67
|
|
61
|
-
##
|
62
|
-
# TODO: Specs.
|
63
|
-
#
|
64
68
|
def cast_method
|
65
69
|
other.name.copy
|
66
70
|
end
|
@@ -30,9 +30,9 @@ module ConvenientService
|
|
30
30
|
|
31
31
|
raise #{not_completed_step_error}.new(step: step, method_name: method_name) unless step.completed?
|
32
32
|
|
33
|
-
raise #{not_existing_step_result_data_attribute_error}.new(step: step, key: key) unless step.result.
|
33
|
+
raise #{not_existing_step_result_data_attribute_error}.new(step: step, key: key) unless step.result.unsafe_data.has_attribute?(key)
|
34
34
|
|
35
|
-
step.result.
|
35
|
+
step.result.unsafe_data[key]
|
36
36
|
end
|
37
37
|
RUBY
|
38
38
|
|
@@ -38,6 +38,10 @@ module ConvenientService
|
|
38
38
|
Utils::Bool.to_bool(organizer)
|
39
39
|
end
|
40
40
|
|
41
|
+
def reassignment?(name)
|
42
|
+
caller.reassignment?(name)
|
43
|
+
end
|
44
|
+
|
41
45
|
def validate_as_input_for_container!(container)
|
42
46
|
direction.validate_as_input_for_container!(container, method: self)
|
43
47
|
|
@@ -0,0 +1,74 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ConvenientService
|
4
|
+
module Service
|
5
|
+
module Plugins
|
6
|
+
module HasResultSteps
|
7
|
+
module Entities
|
8
|
+
class Method
|
9
|
+
module Entities
|
10
|
+
module Callers
|
11
|
+
class Reassignment < Callers::Base
|
12
|
+
module Commands
|
13
|
+
class DefineMethodInContainer < Support::Command
|
14
|
+
include Support::Delegate
|
15
|
+
|
16
|
+
attr_reader :method, :container, :index
|
17
|
+
|
18
|
+
delegate :key, :name, to: :method
|
19
|
+
|
20
|
+
def initialize(method:, container:, index:)
|
21
|
+
@method = method
|
22
|
+
@container = container
|
23
|
+
@index = index
|
24
|
+
end
|
25
|
+
|
26
|
+
##
|
27
|
+
# @return [Boolean]
|
28
|
+
#
|
29
|
+
def call
|
30
|
+
##
|
31
|
+
# NOTE: `prepend` is thread-safe.
|
32
|
+
#
|
33
|
+
container.klass.prepend reassigned_methods
|
34
|
+
|
35
|
+
return false if Utils::Module.instance_method_defined?(reassigned_methods, method, private: true)
|
36
|
+
|
37
|
+
<<~RUBY.tap { |code| reassigned_methods.module_eval(code, __FILE__, __LINE__ + 1) }
|
38
|
+
def #{name}
|
39
|
+
step =
|
40
|
+
steps
|
41
|
+
.select { |step| step.has_reassignment?(__method__) }
|
42
|
+
.select(&:completed?)
|
43
|
+
.last
|
44
|
+
|
45
|
+
return super unless step
|
46
|
+
|
47
|
+
key = step.reassignment(__method__).key.to_sym
|
48
|
+
|
49
|
+
step.result.unsafe_data[key]
|
50
|
+
end
|
51
|
+
RUBY
|
52
|
+
|
53
|
+
true
|
54
|
+
end
|
55
|
+
|
56
|
+
private
|
57
|
+
|
58
|
+
##
|
59
|
+
# @return [Module]
|
60
|
+
#
|
61
|
+
def reassigned_methods
|
62
|
+
@reassigned_methods ||= Utils::Module.fetch_own_const(container.klass, :ReassignedMethods) { ::Module.new }
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative "reassignment/commands"
|
4
|
+
|
5
|
+
module ConvenientService
|
6
|
+
module Service
|
7
|
+
module Plugins
|
8
|
+
module HasResultSteps
|
9
|
+
module Entities
|
10
|
+
class Method
|
11
|
+
module Entities
|
12
|
+
module Callers
|
13
|
+
class Reassignment < Callers::Base
|
14
|
+
def reassignment?(name)
|
15
|
+
##
|
16
|
+
# TODO: A better name for `object`. Wrapped object, `target`?
|
17
|
+
#
|
18
|
+
object.to_sym == name.to_sym
|
19
|
+
end
|
20
|
+
|
21
|
+
##
|
22
|
+
# TODO: Separate `in` and `out` methods?
|
23
|
+
#
|
24
|
+
def calculate_value(method)
|
25
|
+
raise Errors::CallerCanNotCalculateReassignment.new(method: method)
|
26
|
+
end
|
27
|
+
|
28
|
+
def validate_as_input_for_container!(container, method:)
|
29
|
+
raise Errors::InputMethodReassignment.new(method: method, container: container)
|
30
|
+
end
|
31
|
+
|
32
|
+
def validate_as_output_for_container!(container, method:)
|
33
|
+
##
|
34
|
+
# TODO: Raise when container has two reassignments with same name.
|
35
|
+
#
|
36
|
+
true
|
37
|
+
end
|
38
|
+
|
39
|
+
def define_output_in_container!(container, index:, method:)
|
40
|
+
Commands::DefineMethodInContainer.call(method: method, container: container, index: index)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ConvenientService
|
4
|
+
module Service
|
5
|
+
module Plugins
|
6
|
+
module HasResultSteps
|
7
|
+
module Entities
|
8
|
+
class Method
|
9
|
+
module Entities
|
10
|
+
module Values
|
11
|
+
##
|
12
|
+
# TODO: Specs.
|
13
|
+
#
|
14
|
+
class Reassignment
|
15
|
+
include Support::Delegate
|
16
|
+
|
17
|
+
attr_reader :value
|
18
|
+
|
19
|
+
delegate :to_s, :to_sym, to: :value
|
20
|
+
|
21
|
+
##
|
22
|
+
# @param value [String, Symbol] Method name to reassign.
|
23
|
+
#
|
24
|
+
def initialize(value)
|
25
|
+
@value = value
|
26
|
+
end
|
27
|
+
|
28
|
+
def ==(other)
|
29
|
+
return unless other.instance_of?(self.class)
|
30
|
+
|
31
|
+
return false if value != other.value
|
32
|
+
|
33
|
+
true
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -87,6 +87,28 @@ module ConvenientService
|
|
87
87
|
end
|
88
88
|
end
|
89
89
|
|
90
|
+
class CallerCanNotCalculateReassignment < ::ConvenientService::Error
|
91
|
+
def initialize(method:)
|
92
|
+
message = <<~TEXT
|
93
|
+
Method caller failed to calculate reassignment for `#{method.name}`.
|
94
|
+
|
95
|
+
Method callers can calculate only `in` methods, while reassignments are always `out` methods.
|
96
|
+
TEXT
|
97
|
+
|
98
|
+
super(message)
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
class InputMethodReassignment < ConvenientService::Error
|
103
|
+
def initialize(method:, container:)
|
104
|
+
message = <<~TEXT
|
105
|
+
Reassignments are not allowed for `in` methods.
|
106
|
+
TEXT
|
107
|
+
|
108
|
+
super(message)
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
90
112
|
class MethodIsNotInputMethod < ConvenientService::Error
|
91
113
|
def initialize(method:, container:)
|
92
114
|
message = <<~TEXT
|
@@ -18,6 +18,12 @@ module ConvenientService
|
|
18
18
|
:not_success?,
|
19
19
|
:not_failure?,
|
20
20
|
:not_error?,
|
21
|
+
:data,
|
22
|
+
:message,
|
23
|
+
:code,
|
24
|
+
:unsafe_data,
|
25
|
+
:unsafe_message,
|
26
|
+
:unsafe_code,
|
21
27
|
to: :result
|
22
28
|
|
23
29
|
delegate \
|
@@ -50,10 +56,18 @@ module ConvenientService
|
|
50
56
|
Utils::Bool.to_bool(organizer)
|
51
57
|
end
|
52
58
|
|
59
|
+
def has_reassignment?(name)
|
60
|
+
outputs.any? { |output| output.reassignment?(name) }
|
61
|
+
end
|
62
|
+
|
53
63
|
def completed?
|
54
64
|
Utils::Bool.to_bool(@completed)
|
55
65
|
end
|
56
66
|
|
67
|
+
def reassignment(name)
|
68
|
+
outputs.find { |output| output.reassignment?(name) }
|
69
|
+
end
|
70
|
+
|
57
71
|
def params
|
58
72
|
@params ||= resolve_params
|
59
73
|
end
|
@@ -66,6 +80,10 @@ module ConvenientService
|
|
66
80
|
@input_values ||= calculate_input_values
|
67
81
|
end
|
68
82
|
|
83
|
+
def original_result
|
84
|
+
@original_result ||= calculate_original_result
|
85
|
+
end
|
86
|
+
|
69
87
|
def result
|
70
88
|
@result ||= calculate_result
|
71
89
|
end
|
@@ -80,6 +98,13 @@ module ConvenientService
|
|
80
98
|
service.klass.to_s
|
81
99
|
end
|
82
100
|
|
101
|
+
##
|
102
|
+
# @return [Class]
|
103
|
+
#
|
104
|
+
def service_class
|
105
|
+
service.klass
|
106
|
+
end
|
107
|
+
|
83
108
|
def validate!
|
84
109
|
inputs.each { |input| input.validate_as_input_for_container!(container) }
|
85
110
|
|
@@ -106,6 +131,10 @@ module ConvenientService
|
|
106
131
|
|
107
132
|
attr_reader :args, :kwargs
|
108
133
|
|
134
|
+
##
|
135
|
+
# @internal
|
136
|
+
# TODO: Commands instead of private methods.
|
137
|
+
#
|
109
138
|
def calculate_input_values
|
110
139
|
assert_has_organizer!
|
111
140
|
|
@@ -113,14 +142,21 @@ module ConvenientService
|
|
113
142
|
end
|
114
143
|
|
115
144
|
##
|
116
|
-
#
|
145
|
+
# @internal
|
146
|
+
# IMPORTANT: `service.result(**input_values)` is the reason, why services should have only kwargs as arguments.
|
117
147
|
#
|
118
|
-
def
|
148
|
+
def calculate_original_result
|
119
149
|
assert_has_organizer!
|
120
150
|
|
151
|
+
result = service.result(**input_values)
|
152
|
+
|
121
153
|
mark_as_completed!
|
122
154
|
|
123
|
-
|
155
|
+
result
|
156
|
+
end
|
157
|
+
|
158
|
+
def calculate_result
|
159
|
+
original_result.copy(overrides: {kwargs: {step: self, service: organizer}})
|
124
160
|
end
|
125
161
|
|
126
162
|
def resolve_params
|
@@ -0,0 +1,23 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ConvenientService
|
4
|
+
module Service
|
5
|
+
module Plugins
|
6
|
+
module HasResultSteps
|
7
|
+
module Entities
|
8
|
+
class Step
|
9
|
+
module Plugins
|
10
|
+
module CanHaveParentResult
|
11
|
+
class Middleware < Core::MethodChainMiddleware
|
12
|
+
def next(...)
|
13
|
+
chain.next(...).copy(overrides: {kwargs: {parent: entity.original_result}})
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -36,6 +36,19 @@ module ConvenientService
|
|
36
36
|
steps.each(&block)
|
37
37
|
end
|
38
38
|
|
39
|
+
##
|
40
|
+
# Returns step by index.
|
41
|
+
#
|
42
|
+
# @param index [Integer]
|
43
|
+
# @return [ConvenientService::Service::Plugins::HasResultSteps::Entities::Step]
|
44
|
+
#
|
45
|
+
# @note Works in a similar way as `Array#[]`.
|
46
|
+
# @see https://ruby-doc.org/core-2.7.0/Array.html#method-i-5B-5D
|
47
|
+
#
|
48
|
+
def [](index)
|
49
|
+
steps[index]
|
50
|
+
end
|
51
|
+
|
39
52
|
def <<(step)
|
40
53
|
steps << step.copy(overrides: {kwargs: {index: next_available_index}})
|
41
54
|
end
|