convenient_service 0.16.0 → 0.17.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 +30 -0
- data/README.md +1 -1
- data/convenient_service.gemspec +24 -5
- data/lib/convenient_service/common/plugins/can_have_user_provided_entity/commands/find_or_create_entity.rb +7 -2
- data/lib/convenient_service/common/plugins/can_have_user_provided_entity/exceptions.rb +4 -4
- data/lib/convenient_service/common/plugins/has_around_callbacks/exceptions.rb +2 -2
- data/lib/convenient_service/common/plugins/has_around_callbacks/middleware.rb +2 -2
- data/lib/convenient_service/common/plugins/has_instance_proxy/commands/create_instance_proxy_class.rb +83 -0
- data/lib/convenient_service/common/plugins/has_instance_proxy/commands.rb +3 -0
- data/lib/convenient_service/common/plugins/has_instance_proxy/concern.rb +22 -0
- data/lib/convenient_service/common/plugins/has_instance_proxy/entities/instance_proxy.rb +76 -0
- data/lib/convenient_service/common/plugins/has_instance_proxy/entities.rb +3 -0
- data/lib/convenient_service/common/plugins/has_instance_proxy/middleware.rb +20 -0
- data/lib/convenient_service/common/plugins/has_instance_proxy.rb +6 -0
- data/lib/convenient_service/common/plugins.rb +1 -0
- data/lib/convenient_service/core/concern/class_methods.rb +7 -2
- data/lib/convenient_service/core/concern/instance_methods.rb +7 -2
- data/lib/convenient_service/core/entities/config/commands/track_method_missing_commit_trigger.rb +1 -1
- data/lib/convenient_service/core/entities/config/entities/method_middlewares/entities/caller/commands/define_method_middlewares_caller.rb +2 -2
- data/lib/convenient_service/core/entities/config/entities/method_middlewares/entities/middlewares/base/commands/create_observable_middleware.rb +3 -0
- data/lib/convenient_service/core/entities/config/exceptions.rb +4 -4
- data/lib/convenient_service/core/entities/config.rb +1 -1
- data/lib/convenient_service/dependencies/extractions/active_support_backtrace_cleaner/backtrace_cleaner.rb +28 -8
- data/lib/convenient_service/dependencies/extractions/active_support_backtrace_cleaner.rb +3 -3
- data/lib/convenient_service/dependencies/extractions/b.rb +2 -0
- data/lib/convenient_service/dependencies/extractions/ce.rb +16 -0
- data/lib/convenient_service/dependencies/extractions.rb +1 -0
- data/lib/convenient_service/dependencies.rb +6 -1
- data/lib/convenient_service/examples/standard/request_params.rb +0 -1
- data/lib/convenient_service/examples/standard/v1/request_params.rb +0 -1
- data/lib/convenient_service/exception.rb +98 -10
- data/lib/convenient_service/feature/configs/standard.rb +8 -0
- data/lib/convenient_service/feature/plugins/can_have_entries/commands/define_entries.rb +49 -0
- data/lib/convenient_service/feature/plugins/can_have_entries/commands/define_entry.rb +18 -4
- data/lib/convenient_service/feature/plugins/can_have_entries/commands.rb +1 -0
- data/lib/convenient_service/feature/plugins/can_have_entries/concern.rb +13 -4
- data/lib/convenient_service/feature/plugins/can_have_entries/exceptions.rb +14 -4
- data/lib/convenient_service/logger.rb +4 -1
- data/lib/convenient_service/rspec/helpers/classes/stub_service/entities/result_spec.rb +0 -8
- data/lib/convenient_service/rspec/helpers/classes/wrap_method/entities/wrapped_method.rb +5 -5
- data/lib/convenient_service/rspec/helpers/classes/wrap_method/exceptions.rb +2 -2
- data/lib/convenient_service/rspec/matchers/classes/results/base/entities/validator/commands/validate_result_step.rb +1 -1
- data/lib/convenient_service/rspec/matchers/classes/results/base/exceptions.rb +2 -2
- data/lib/convenient_service/rspec/primitive_helpers/classes/ignoring_exception/exceptions.rb +2 -2
- data/lib/convenient_service/rspec/primitive_helpers/classes/ignoring_exception.rb +1 -1
- data/lib/convenient_service/rspec/primitive_matchers/classes/delegate_to/entities/matcher/entities/chainings/sub_matchers/arguments/commands/apply_stub_to_track_delegations.rb +4 -0
- data/lib/convenient_service/rspec/primitive_matchers/classes/delegate_to/entities/matcher/entities/chainings_collection/exceptions.rb +7 -7
- data/lib/convenient_service/rspec/primitive_matchers/classes/delegate_to/entities/matcher/entities/chainings_collection.rb +3 -3
- data/lib/convenient_service/service/plugins/can_have_fallbacks/concern.rb +2 -2
- data/lib/convenient_service/service/plugins/can_have_fallbacks/exceptions.rb +4 -4
- data/lib/convenient_service/service/plugins/can_have_fallbacks/middleware.rb +1 -1
- data/lib/convenient_service/service/plugins/can_have_steps/concern.rb +3 -3
- data/lib/convenient_service/service/plugins/can_have_steps/entities/method/commands/define_method_in_container.rb +2 -2
- data/lib/convenient_service/service/plugins/can_have_steps/entities/method/concern/instance_methods.rb +1 -1
- data/lib/convenient_service/service/plugins/can_have_steps/entities/method/entities/callers/alias.rb +2 -2
- data/lib/convenient_service/service/plugins/can_have_steps/entities/method/entities/callers/proc.rb +1 -1
- data/lib/convenient_service/service/plugins/can_have_steps/entities/method/entities/callers/raw.rb +1 -1
- data/lib/convenient_service/service/plugins/can_have_steps/entities/method/entities/callers/reassignment.rb +2 -2
- data/lib/convenient_service/service/plugins/can_have_steps/entities/method/entities/callers/usual.rb +2 -2
- data/lib/convenient_service/service/plugins/can_have_steps/entities/method/entities/directions/input.rb +2 -2
- data/lib/convenient_service/service/plugins/can_have_steps/entities/method/entities/directions/output.rb +1 -1
- data/lib/convenient_service/service/plugins/can_have_steps/entities/method/exceptions.rb +26 -26
- data/lib/convenient_service/service/plugins/can_have_steps/entities/step/concern/instance_methods.rb +1 -1
- data/lib/convenient_service/service/plugins/can_have_steps/entities/step/exceptions.rb +2 -2
- data/lib/convenient_service/service/plugins/can_have_steps/entities/step/plugins/can_be_result_step/can_be_executed/exceptions.rb +2 -2
- data/lib/convenient_service/service/plugins/can_have_steps/entities/step/plugins/can_be_result_step/can_be_executed/middleware.rb +1 -1
- data/lib/convenient_service/service/plugins/can_have_steps/entities/step/plugins/raises_on_not_result_return_value/exceptions.rb +2 -2
- data/lib/convenient_service/service/plugins/can_have_steps/entities/step/plugins/raises_on_not_result_return_value/middleware.rb +1 -1
- data/lib/convenient_service/service/plugins/has_inspect/concern.rb +0 -1
- data/lib/convenient_service/service/plugins/has_j_send_result/entities/result/plugins/has_j_send_status_and_attributes/concern/instance_methods.rb +7 -0
- data/lib/convenient_service/service/plugins/has_j_send_result/entities/result/plugins/has_j_send_status_and_attributes/entities/data/concern/instance_methods.rb +1 -1
- data/lib/convenient_service/service/plugins/has_j_send_result/entities/result/plugins/has_j_send_status_and_attributes/entities/status/concern/instance_methods.rb +14 -0
- data/lib/convenient_service/service/plugins/has_j_send_result/entities/result/plugins/has_j_send_status_and_attributes/exceptions.rb +2 -2
- data/lib/convenient_service/service/plugins/has_j_send_result/entities/result/plugins/raises_on_not_checked_result_status/exceptions.rb +2 -2
- data/lib/convenient_service/service/plugins/has_j_send_result/entities/result/plugins/raises_on_not_checked_result_status/middleware.rb +1 -1
- data/lib/convenient_service/service/plugins/has_j_send_result/exceptions.rb +2 -2
- data/lib/convenient_service/service/plugins/has_j_send_result.rb +39 -0
- data/lib/convenient_service/service/plugins/has_j_send_result_short_syntax/error/exceptions.rb +6 -6
- data/lib/convenient_service/service/plugins/has_j_send_result_short_syntax/error/middleware.rb +3 -3
- data/lib/convenient_service/service/plugins/has_j_send_result_short_syntax/failure/exceptions.rb +6 -6
- data/lib/convenient_service/service/plugins/has_j_send_result_short_syntax/failure/middleware.rb +3 -3
- data/lib/convenient_service/service/plugins/has_j_send_result_short_syntax/success/commands/refute_kwargs_contain_j_send_and_extra_keys.rb +1 -1
- data/lib/convenient_service/service/plugins/has_j_send_result_short_syntax/success/exceptions.rb +2 -2
- data/lib/convenient_service/service/plugins/has_j_send_result_status_check_short_syntax/concern.rb +0 -8
- data/lib/convenient_service/service/plugins/has_result/concern.rb +1 -1
- data/lib/convenient_service/service/plugins/has_result/exceptions.rb +2 -2
- data/lib/convenient_service/service/plugins/raises_on_double_result/exceptions.rb +2 -2
- data/lib/convenient_service/service/plugins/raises_on_double_result/middleware.rb +1 -1
- data/lib/convenient_service/service/plugins/raises_on_not_result_return_value/exceptions.rb +2 -2
- data/lib/convenient_service/service/plugins/raises_on_not_result_return_value/middleware.rb +1 -1
- data/lib/convenient_service/support/abstract_method/exceptions.rb +2 -2
- data/lib/convenient_service/support/abstract_method.rb +1 -1
- data/lib/convenient_service/support/backtrace_cleaner.rb +123 -0
- data/lib/convenient_service/support/cache/exceptions.rb +2 -2
- data/lib/convenient_service/support/cache.rb +1 -1
- data/lib/convenient_service/support/castable/exceptions.rb +4 -4
- data/lib/convenient_service/support/castable.rb +1 -1
- data/lib/convenient_service/support/command.rb +3 -3
- data/lib/convenient_service/support/counter.rb +6 -6
- data/lib/convenient_service/support/dependency_container/commands/assert_valid_container.rb +1 -1
- data/lib/convenient_service/support/dependency_container/commands/assert_valid_method.rb +1 -1
- data/lib/convenient_service/support/dependency_container/commands/assert_valid_scope.rb +1 -1
- data/lib/convenient_service/support/dependency_container/exceptions.rb +8 -8
- data/lib/convenient_service/support/dependency_container/export.rb +1 -1
- data/lib/convenient_service/support/finite_loop.rb +6 -6
- data/lib/convenient_service/support.rb +1 -0
- data/lib/convenient_service/utils/array/exceptions.rb +2 -2
- data/lib/convenient_service/utils/array/merge.rb +1 -1
- data/lib/convenient_service/utils/hash/assert_valid_keys.rb +1 -1
- data/lib/convenient_service/version.rb +1 -1
- data/lib/convenient_service.rb +98 -0
- metadata +22 -41
- data/lib/convenient_service/examples/standard/v1/gemfile/services/print_shell_command.rb +0 -47
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f24d02cddcb69e9108cf7d810c85f4ccf338201b8a31bbc7da0be1ef92bd91a9
|
4
|
+
data.tar.gz: 89c019fa64f6fe8194c9b74a676d367e390cc5cb33efef361a4fcb448cd72d17
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a53a4a7fee700e8128eeea830ac57cee73e6a6034d36e61dd224584e06f08ef4d944cdc513bfbac17187866b09969a4f63f31e316745546de032a24965bad6dd
|
7
|
+
data.tar.gz: 47a180d8079468f98eadcfbddc2654323fabeae0d7f8b47febc7c13f80d43d30a30583d7104d60d486b02f6e024155487fe3ce5c20bd1eea39f214ee326dc9ff
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,35 @@
|
|
1
1
|
# Changelog
|
2
2
|
|
3
|
+
## [0.17.0](https://github.com/marian13/convenient_service/compare/v0.16.0...v0.17.0) (2024-01-14)
|
4
|
+
|
5
|
+
|
6
|
+
### Features
|
7
|
+
|
8
|
+
* **backtrace_cleaner:** introduce add_convenient_service_silencer ([07ce10f](https://github.com/marian13/convenient_service/commit/07ce10fbd96c7e6b3074922d0ca8af6547416725))
|
9
|
+
* **backtrace_cleaner:** upgrade to Rails 7.1.2 Backtrace Cleaner ([6416691](https://github.com/marian13/convenient_service/commit/6416691d99d3b22544b78ea81aed5a3a4aa513fe))
|
10
|
+
* **core:** clean backtrace in method_missing ([0642198](https://github.com/marian13/convenient_service/commit/06421981ccf39d2d0b07f2bce30284c604bba950))
|
11
|
+
* **core:** clean backtrace in method_missing ([81d0531](https://github.com/marian13/convenient_service/commit/81d05317d842d9afa2ef7034b34b850034a8f1dd))
|
12
|
+
* **core:** clean backtrace in method_missing ([f07c354](https://github.com/marian13/convenient_service/commit/f07c354e8fc14f1062df68f938b9d4b9fa8484c5))
|
13
|
+
* **entry:** allow to define multiple entries at once ([a9bca88](https://github.com/marian13/convenient_service/commit/a9bca880da4849866f6afc30b3f099be88834f64))
|
14
|
+
* **exception:** allow to pass message or kwargs or no arguments ([a92a040](https://github.com/marian13/convenient_service/commit/a92a04002687c878618479804d0176e69b3d4fa4))
|
15
|
+
* **exceptions:** use backtrace_cleaner ([7bc566e](https://github.com/marian13/convenient_service/commit/7bc566e78cfa3fcc28b6b2318ca955ff4d797ce8))
|
16
|
+
* **exceptions:** use backtrace_cleaner ([b8d87a5](https://github.com/marian13/convenient_service/commit/b8d87a56cb4afda043ba0de6c1ba3cd967d2aa7c))
|
17
|
+
* **feature:** allow to use middlewares for all entries at once ([a2025dc](https://github.com/marian13/convenient_service/commit/a2025dccbf660cdc313f9db7df155ccd7a4cd3b8))
|
18
|
+
* **has_instance_proxy:** delegate to target missing proxy methods ([6be8d3b](https://github.com/marian13/convenient_service/commit/6be8d3b6bf556bc2af9ff29a7b0782b352a8effb))
|
19
|
+
* **has_instance_proxy:** introduce #inspect ([078d219](https://github.com/marian13/convenient_service/commit/078d21927b1b523b266e85d945f87aa3030de0f4))
|
20
|
+
* **has_j_send_result:** expose result? ([f4d5f7f](https://github.com/marian13/convenient_service/commit/f4d5f7fb9afde955295602db022d12f084f60d9e))
|
21
|
+
* **has_j_send_status_and_attributes:** introduce #to_bool ([ec5ee1e](https://github.com/marian13/convenient_service/commit/ec5ee1ec0f4a540a109f80e3ffafa1b937d1af60))
|
22
|
+
* **root:** introduce ConvenientService.raise and ConvenientService.reraise ([65f0148](https://github.com/marian13/convenient_service/commit/65f0148d052c31c3e305470b2b9daee5c746794e))
|
23
|
+
* **root:** introduce ConvenientService.root ([dc5af36](https://github.com/marian13/convenient_service/commit/dc5af365374a76d615fa09613b59bb9cd080bc1b))
|
24
|
+
* **support:** add initial backtrace cleaner ([14733f3](https://github.com/marian13/convenient_service/commit/14733f3d5b622c08aec1fe0b80a2b7c5699b4d4f))
|
25
|
+
|
26
|
+
|
27
|
+
### Bug Fixes
|
28
|
+
|
29
|
+
* **backtrace_cleaner:** resolve JRuby incompatibilites ([3ff9055](https://github.com/marian13/convenient_service/commit/3ff90555a0f78f1ba51fa7c538cc84c7c4e69bdb))
|
30
|
+
* **rescues_result_unhandled_exceptions:** fix false-positive test ([e792c01](https://github.com/marian13/convenient_service/commit/e792c01613a74da529f2f7833248527c40f1ac7b))
|
31
|
+
* **specs:** remove did_you_mean flakiness ([709faf6](https://github.com/marian13/convenient_service/commit/709faf6c8ac9eb28451f3ea734d5588159481648))
|
32
|
+
|
3
33
|
## [0.16.0](https://github.com/marian13/convenient_service/compare/v0.15.0...v0.16.0) (2023-12-05)
|
4
34
|
|
5
35
|
|
data/README.md
CHANGED
@@ -49,7 +49,7 @@ This library is under heavy development. Public API may be subject to change. Th
|
|
49
49
|
|
50
50
|
- Visit the [All-in-One Presentation](https://marian13.github.io/static_content/convenient_service/presentations/all_in_one) to get a quick overview.
|
51
51
|
|
52
|
-
- Check out [Convenient Service Official User Docs](https://
|
52
|
+
- Check out [Convenient Service Official User Docs](https://userdocs.convenientservice.org/) for installation, requirements, and usage guides.
|
53
53
|
|
54
54
|
- Read [the API docs](https://marian13.github.io/convenient_service) to get familiar with the newest functionality that is not documented yet.
|
55
55
|
|
data/convenient_service.gemspec
CHANGED
@@ -72,10 +72,15 @@ Gem::Specification.new do |spec|
|
|
72
72
|
spec.add_development_dependency "byebug", "~> 10.0" unless ConvenientService::Support::Ruby.jruby?
|
73
73
|
|
74
74
|
##
|
75
|
+
# Used for parsing Markdown in YARD docs.
|
76
|
+
# - https://github.com/gjtorikian/commonmarker
|
77
|
+
#
|
75
78
|
# NOTE: `commonmarker` has C extensions, that is why it is NOT supported in JRuby.
|
76
79
|
# - https://github.com/gjtorikian/commonmarker/tree/main/ext/commonmarker
|
77
80
|
#
|
78
|
-
|
81
|
+
# TODO: `commonmarker` v1 does NOT work with `yard-junk`.
|
82
|
+
#
|
83
|
+
spec.add_development_dependency "commonmarker", "~> 0.23.10" unless ConvenientService::Support::Ruby.jruby?
|
79
84
|
|
80
85
|
##
|
81
86
|
# Used for debugging CRuby code.
|
@@ -122,8 +127,13 @@ Gem::Specification.new do |spec|
|
|
122
127
|
# - https://github.com/mbj/mutant/blob/main/docs/mutant-rspec.md
|
123
128
|
# - https://github.com/mbj/mutant/blob/main/docs/incremental.md
|
124
129
|
#
|
125
|
-
|
126
|
-
|
130
|
+
# NOTE: How to get a licence key?
|
131
|
+
# - https://github.com/mbj/mutant/issues/1396
|
132
|
+
#
|
133
|
+
if ::ENV["CONVENIENT_SERVICE_MUTANT_LICENCE_KEY"]
|
134
|
+
spec.add_development_dependency "mutant", "~> 0.11.21"
|
135
|
+
spec.add_development_dependency "mutant-rspec", "~> 0.11.21"
|
136
|
+
end
|
127
137
|
|
128
138
|
##
|
129
139
|
# Used for coloring logs.
|
@@ -190,9 +200,18 @@ Gem::Specification.new do |spec|
|
|
190
200
|
|
191
201
|
spec.add_development_dependency "webrick"
|
192
202
|
|
193
|
-
|
203
|
+
##
|
204
|
+
# Used for generation of API docs for Ruby code.
|
205
|
+
# - https://github.com/lsegal/yard
|
206
|
+
# - https://yardoc.org
|
207
|
+
#
|
208
|
+
spec.add_development_dependency "yard", "~> 0.9.34"
|
194
209
|
|
195
|
-
|
210
|
+
##
|
211
|
+
# Used for linting YARD docs.
|
212
|
+
# - https://github.com/zverok/yard-junk
|
213
|
+
#
|
214
|
+
spec.add_development_dependency "yard-junk", "~> 0.0.9"
|
196
215
|
|
197
216
|
##
|
198
217
|
# The following gems are Convenient Service alternatives.
|
@@ -32,8 +32,8 @@ module ConvenientService
|
|
32
32
|
# @return [void]
|
33
33
|
#
|
34
34
|
def call
|
35
|
-
raise Exceptions::ProtoEntityHasNoName.new(proto_entity: proto_entity) unless proto_entity_name
|
36
|
-
raise Exceptions::ProtoEntityHasNoConcern.new(proto_entity: proto_entity) unless proto_entity_concern
|
35
|
+
::ConvenientService.raise Exceptions::ProtoEntityHasNoName.new(proto_entity: proto_entity) unless proto_entity_name
|
36
|
+
::ConvenientService.raise Exceptions::ProtoEntityHasNoConcern.new(proto_entity: proto_entity) unless proto_entity_concern
|
37
37
|
|
38
38
|
entity.include Core
|
39
39
|
|
@@ -71,6 +71,11 @@ module ConvenientService
|
|
71
71
|
#
|
72
72
|
entity.class_exec(proto_entity) do |proto_entity|
|
73
73
|
define_singleton_method(:proto_entity) { proto_entity }
|
74
|
+
|
75
|
+
##
|
76
|
+
# @internal
|
77
|
+
# TODO: Try `self.proto_entity == other.proto_entity if self < proto_entity_concern`.
|
78
|
+
#
|
74
79
|
define_singleton_method(:==) { |other| self.proto_entity == other.proto_entity if other.respond_to?(:proto_entity) }
|
75
80
|
|
76
81
|
##
|
@@ -6,7 +6,7 @@ module ConvenientService
|
|
6
6
|
module CanHaveUserProvidedEntity
|
7
7
|
module Exceptions
|
8
8
|
class ProtoEntityHasNoName < ::ConvenientService::Exception
|
9
|
-
def
|
9
|
+
def initialize_with_kwargs(proto_entity:)
|
10
10
|
message = <<~TEXT
|
11
11
|
Proto entity `#{proto_entity}` has no name.
|
12
12
|
|
@@ -18,12 +18,12 @@ module ConvenientService
|
|
18
18
|
NOTE: Anonymous classes do NOT have names. Are you passing an anonymous class?
|
19
19
|
TEXT
|
20
20
|
|
21
|
-
|
21
|
+
initialize(message)
|
22
22
|
end
|
23
23
|
end
|
24
24
|
|
25
25
|
class ProtoEntityHasNoConcern < ::ConvenientService::Exception
|
26
|
-
def
|
26
|
+
def initialize_with_kwargs(proto_entity:)
|
27
27
|
message = <<~TEXT
|
28
28
|
Proto entity `#{proto_entity}` has no concern.
|
29
29
|
|
@@ -32,7 +32,7 @@ module ConvenientService
|
|
32
32
|
It is an example of a valid proto entity.
|
33
33
|
TEXT
|
34
34
|
|
35
|
-
|
35
|
+
initialize(message)
|
36
36
|
end
|
37
37
|
end
|
38
38
|
end
|
@@ -6,7 +6,7 @@ module ConvenientService
|
|
6
6
|
module HasAroundCallbacks
|
7
7
|
module Exceptions
|
8
8
|
class AroundCallbackChainIsNotContinued < ::ConvenientService::Exception
|
9
|
-
def
|
9
|
+
def initialize_with_kwargs(callback:)
|
10
10
|
message = <<~TEXT
|
11
11
|
Around callback chain is NOT continued from `#{callback.block.source_location}`.
|
12
12
|
|
@@ -19,7 +19,7 @@ module ConvenientService
|
|
19
19
|
end
|
20
20
|
TEXT
|
21
21
|
|
22
|
-
|
22
|
+
initialize(message)
|
23
23
|
end
|
24
24
|
end
|
25
25
|
end
|
@@ -123,12 +123,12 @@ module ConvenientService
|
|
123
123
|
##
|
124
124
|
#
|
125
125
|
#
|
126
|
-
raise Exceptions::AroundCallbackChainIsNotContinued.new(callback: Utils::Array.find_last(around_callbacks, &:called?)) if around_callbacks.any?(&:not_called?)
|
126
|
+
::ConvenientService.raise Exceptions::AroundCallbackChainIsNotContinued.new(callback: Utils::Array.find_last(around_callbacks, &:called?)) if around_callbacks.any?(&:not_called?)
|
127
127
|
|
128
128
|
##
|
129
129
|
#
|
130
130
|
#
|
131
|
-
raise Exceptions::AroundCallbackChainIsNotContinued.new(callback: around_callbacks.last) if initial_around_callback.not_called?
|
131
|
+
::ConvenientService.raise Exceptions::AroundCallbackChainIsNotContinued.new(callback: around_callbacks.last) if initial_around_callback.not_called?
|
132
132
|
|
133
133
|
original_value
|
134
134
|
end
|
@@ -0,0 +1,83 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ConvenientService
|
4
|
+
module Common
|
5
|
+
module Plugins
|
6
|
+
module HasInstanceProxy
|
7
|
+
module Commands
|
8
|
+
class CreateInstanceProxyClass < Support::Command
|
9
|
+
##
|
10
|
+
# @!attribute [r] target_class
|
11
|
+
# @return [Class]
|
12
|
+
#
|
13
|
+
attr_reader :target_class
|
14
|
+
|
15
|
+
##
|
16
|
+
# @param target_class [Class]
|
17
|
+
# @return [void]
|
18
|
+
#
|
19
|
+
def initialize(target_class:)
|
20
|
+
@target_class = target_class
|
21
|
+
end
|
22
|
+
|
23
|
+
##
|
24
|
+
# @return [void]
|
25
|
+
#
|
26
|
+
def call
|
27
|
+
klass = ::Class.new(Entities::InstanceProxy)
|
28
|
+
|
29
|
+
##
|
30
|
+
# @example Result for feature.
|
31
|
+
#
|
32
|
+
# klass = ConvenientService::Common::Plugins::HasInstanceProxy::Commands::CreateInstanceProxyClass.call(
|
33
|
+
# target_class: SomeFeature
|
34
|
+
# )
|
35
|
+
#
|
36
|
+
# ##
|
37
|
+
# # `klass` is something like:
|
38
|
+
# #
|
39
|
+
# # class InstanceProxy < ConvenientService::Service::Plugins::HasInstanceProxy::Entities::InstanceProxy
|
40
|
+
# # class << self
|
41
|
+
# # def target_class
|
42
|
+
# # ##
|
43
|
+
# # # NOTE: Returns `target_class` passed to `CreateInstanceProxyClass`.
|
44
|
+
# # #
|
45
|
+
# # target_class
|
46
|
+
# # end
|
47
|
+
# #
|
48
|
+
# # def ==(other)
|
49
|
+
# # return unless other.respond_to?(:target_class)
|
50
|
+
# #
|
51
|
+
# # self.target_class == other.target_class
|
52
|
+
# # end
|
53
|
+
# # end
|
54
|
+
# # end
|
55
|
+
#
|
56
|
+
klass.class_exec(target_class) do |target_class|
|
57
|
+
##
|
58
|
+
# @return [Class]
|
59
|
+
#
|
60
|
+
define_singleton_method(:target_class) { target_class }
|
61
|
+
|
62
|
+
##
|
63
|
+
# @return [Boolean, nil]
|
64
|
+
#
|
65
|
+
# @internal
|
66
|
+
# TODO: Try `self.target_class == other.target_class if self < ::ConvenientService::Common::Plugins::HasInstanceProxy::Entities::InstanceProxy`.
|
67
|
+
#
|
68
|
+
define_singleton_method(:==) { |other| self.target_class == other.target_class if other.respond_to?(:target_class) }
|
69
|
+
|
70
|
+
##
|
71
|
+
# @return [String]
|
72
|
+
#
|
73
|
+
define_singleton_method(:inspect) { "#{target_class}::InstanceProxy" }
|
74
|
+
end
|
75
|
+
|
76
|
+
klass
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ConvenientService
|
4
|
+
module Common
|
5
|
+
module Plugins
|
6
|
+
module HasInstanceProxy
|
7
|
+
module Concern
|
8
|
+
include Support::Concern
|
9
|
+
|
10
|
+
class_methods do
|
11
|
+
##
|
12
|
+
# @return [Class] Can be any type.
|
13
|
+
#
|
14
|
+
def instance_proxy_class
|
15
|
+
@instance_proxy_class ||= Commands::CreateInstanceProxyClass[target_class: self]
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,76 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ConvenientService
|
4
|
+
module Common
|
5
|
+
module Plugins
|
6
|
+
module HasInstanceProxy
|
7
|
+
module Entities
|
8
|
+
class InstanceProxy
|
9
|
+
##
|
10
|
+
# @api private
|
11
|
+
#
|
12
|
+
# @param target [Object] Can be any type.
|
13
|
+
# @return [void]
|
14
|
+
#
|
15
|
+
def initialize(target:)
|
16
|
+
@__convenient_service_instance_proxy_target__ = target
|
17
|
+
end
|
18
|
+
|
19
|
+
##
|
20
|
+
# @api public
|
21
|
+
#
|
22
|
+
# @return [Object] Can be any type.
|
23
|
+
#
|
24
|
+
def instance_proxy_target
|
25
|
+
@__convenient_service_instance_proxy_target__
|
26
|
+
end
|
27
|
+
|
28
|
+
##
|
29
|
+
# @api public
|
30
|
+
#
|
31
|
+
# @param other [Object] Can be any type.
|
32
|
+
# @return [Boolean, nil]
|
33
|
+
#
|
34
|
+
# @internal
|
35
|
+
# TODO: Direct Specs.
|
36
|
+
#
|
37
|
+
def ==(other)
|
38
|
+
return unless other.instance_of?(self.class)
|
39
|
+
|
40
|
+
return false if instance_proxy_target != other.instance_proxy_target
|
41
|
+
|
42
|
+
true
|
43
|
+
end
|
44
|
+
|
45
|
+
private
|
46
|
+
|
47
|
+
##
|
48
|
+
# @see https://thoughtbot.com/blog/always-define-respond-to-missing-when-overriding
|
49
|
+
# @see https://blog.marc-andre.ca/2010/11/15/methodmissing-politely
|
50
|
+
# @see https://stackoverflow.com/a/3304683/12201472
|
51
|
+
#
|
52
|
+
# @param method_name [Symbol, String]
|
53
|
+
# @param include_private [Boolean]
|
54
|
+
# @return [Boolean]
|
55
|
+
#
|
56
|
+
# @internal
|
57
|
+
# IMPORTANT: `respond_to_missing?` is like `initialize`. It is always `private`.
|
58
|
+
# - https://ruby-doc.org/core-2.7.0/Object.html#method-i-respond_to_missing-3F
|
59
|
+
# - https://github.com/ruby/spec/blob/master/language/def_spec.rb#L65
|
60
|
+
#
|
61
|
+
def respond_to_missing?(method_name, include_private = false)
|
62
|
+
instance_proxy_target.respond_to?(method_name, include_private)
|
63
|
+
end
|
64
|
+
|
65
|
+
##
|
66
|
+
# @return [Object] Can be any type.
|
67
|
+
#
|
68
|
+
def method_missing(...)
|
69
|
+
instance_proxy_target.public_send(...)
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ConvenientService
|
4
|
+
module Common
|
5
|
+
module Plugins
|
6
|
+
module HasInstanceProxy
|
7
|
+
class Middleware < MethodChainMiddleware
|
8
|
+
intended_for :new, scope: :class, entity: any_entity
|
9
|
+
|
10
|
+
##
|
11
|
+
# @return [ConvenientService::Common::Plugins::HasInstanceProxy::Entities::InstanceProxy]
|
12
|
+
#
|
13
|
+
def next(...)
|
14
|
+
entity.instance_proxy_class.new(target: chain.next(...))
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -14,6 +14,7 @@ require_relative "plugins/has_around_callbacks"
|
|
14
14
|
require_relative "plugins/has_constructor"
|
15
15
|
require_relative "plugins/has_constructor_without_initialize"
|
16
16
|
require_relative "plugins/has_internals"
|
17
|
+
require_relative "plugins/has_instance_proxy"
|
17
18
|
require_relative "plugins/has_j_send_result_duck_short_syntax"
|
18
19
|
|
19
20
|
require_relative "plugins/aliases"
|
@@ -70,6 +70,7 @@ module ConvenientService
|
|
70
70
|
|
71
71
|
##
|
72
72
|
# @see https://thoughtbot.com/blog/always-define-respond-to-missing-when-overriding
|
73
|
+
# @see https://blog.marc-andre.ca/2010/11/15/methodmissing-politely
|
73
74
|
# @see https://stackoverflow.com/a/3304683/12201472
|
74
75
|
#
|
75
76
|
# @param method_name [Symbol, String]
|
@@ -112,12 +113,16 @@ module ConvenientService
|
|
112
113
|
#
|
113
114
|
# TODO: Include `method` into trigger metadata.
|
114
115
|
#
|
116
|
+
# IMPORTANT: Ruby 2.7 and Ruby 3.0+ invoke this `method_missing` differently, check the following files/links:
|
117
|
+
# - `lib/convenient_service/core/entities/config/entities/method_middlewares/entities/caller/commands/define_method_middlewares_caller.rb`
|
118
|
+
# - https://gist.github.com/marian13/9c25041f835564e945d978839097d419
|
119
|
+
#
|
115
120
|
def method_missing(method, *args, **kwargs, &block)
|
116
121
|
commit_config!(trigger: Constants::Triggers::CLASS_METHOD_MISSING)
|
117
122
|
|
118
|
-
return super unless Utils::Module.class_method_defined?(self, method, public: true, protected: false, private: false)
|
123
|
+
return ::ConvenientService.reraise { super } unless Utils::Module.class_method_defined?(self, method, public: true, protected: false, private: false)
|
119
124
|
|
120
|
-
return super if middlewares(method, scope: :class).defined_without_super_method?
|
125
|
+
return ::ConvenientService.reraise { super } if middlewares(method, scope: :class).defined_without_super_method?
|
121
126
|
|
122
127
|
ConvenientService.logger.debug { "[Core] Committed config for `#{self}` | Triggered by `method_missing` | Method: `.#{method}`" }
|
123
128
|
|
@@ -17,6 +17,7 @@ module ConvenientService
|
|
17
17
|
|
18
18
|
##
|
19
19
|
# @see https://thoughtbot.com/blog/always-define-respond-to-missing-when-overriding
|
20
|
+
# @see https://blog.marc-andre.ca/2010/11/15/methodmissing-politely
|
20
21
|
# @see https://stackoverflow.com/a/3304683/12201472
|
21
22
|
#
|
22
23
|
# @param method_name [Symbol, String]
|
@@ -59,12 +60,16 @@ module ConvenientService
|
|
59
60
|
#
|
60
61
|
# TODO: Include `method` into trigger metadata.
|
61
62
|
#
|
63
|
+
# IMPORTANT: Ruby 2.7 and Ruby 3.0+ invoke this `method_missing` differently, check the following files/links:
|
64
|
+
# - `lib/convenient_service/core/entities/config/entities/method_middlewares/entities/caller/commands/define_method_middlewares_caller.rb`
|
65
|
+
# - https://gist.github.com/marian13/9c25041f835564e945d978839097d419
|
66
|
+
#
|
62
67
|
def method_missing(method, *args, **kwargs, &block)
|
63
68
|
self.class.commit_config!(trigger: Constants::Triggers::INSTANCE_METHOD_MISSING)
|
64
69
|
|
65
|
-
return super unless Utils::Module.instance_method_defined?(self.class, method, public: true, protected: false, private: false)
|
70
|
+
return ::ConvenientService.reraise { super } unless Utils::Module.instance_method_defined?(self.class, method, public: true, protected: false, private: false)
|
66
71
|
|
67
|
-
return super if self.class.middlewares(method, scope: :instance).defined_without_super_method?
|
72
|
+
return ::ConvenientService.reraise { super } if self.class.middlewares(method, scope: :instance).defined_without_super_method?
|
68
73
|
|
69
74
|
ConvenientService.logger.debug { "[Core] Committed config for `#{self.class}` | Triggered by `method_missing` | Method: `##{method}`" }
|
70
75
|
|
data/lib/convenient_service/core/entities/config/commands/track_method_missing_commit_trigger.rb
CHANGED
@@ -35,7 +35,7 @@ module ConvenientService
|
|
35
35
|
return unless method_missing_trigger_valid?
|
36
36
|
return if method_missing_commits_counter_incremented?
|
37
37
|
|
38
|
-
raise Exceptions::TooManyCommitsFromMethodMissing.new(config: config)
|
38
|
+
::ConvenientService.raise Exceptions::TooManyCommitsFromMethodMissing.new(config: config)
|
39
39
|
end
|
40
40
|
|
41
41
|
##
|
@@ -90,9 +90,9 @@ module ConvenientService
|
|
90
90
|
# prefix = "#{prefix}"
|
91
91
|
#
|
92
92
|
# NOTE: Check the following link in order to get an idea why two versions of `define_method_middlewares_caller` exist.
|
93
|
-
# https://gist.github.com/marian13/9c25041f835564e945d978839097d419
|
93
|
+
# - https://gist.github.com/marian13/9c25041f835564e945d978839097d419
|
94
94
|
#
|
95
|
-
if
|
95
|
+
if Dependencies.ruby.version >= 3.0
|
96
96
|
def define_method_middlewares_caller
|
97
97
|
<<~RUBY.tap { |code| methods_middlewares_callers.module_eval(code, __FILE__, __LINE__ + 1) }
|
98
98
|
def #{method}(*args, **kwargs, &block)
|
@@ -39,6 +39,9 @@ module ConvenientService
|
|
39
39
|
# @param other [Object] Can be any type.
|
40
40
|
# @return [Boolean, nil]
|
41
41
|
#
|
42
|
+
# @internal
|
43
|
+
# TODO: Try `self.middleware == other.middleware if self < ::ConvenientService::Core::Entities::Config::Entities::MethodMiddlewares::Entities::Middlewares::Base`.
|
44
|
+
#
|
42
45
|
define_singleton_method(:==) { |other| self.middleware == other.middleware if other.respond_to?(:middleware) }
|
43
46
|
|
44
47
|
##
|
@@ -10,14 +10,14 @@ module ConvenientService
|
|
10
10
|
# @param config [ConvenientService::Core::Entities::Config]
|
11
11
|
# @return [void]
|
12
12
|
#
|
13
|
-
def
|
13
|
+
def initialize_with_kwargs(config:)
|
14
14
|
message = <<~TEXT
|
15
15
|
Config for `#{config.klass}` is already committed. Only uncommitted configs can be modified.
|
16
16
|
|
17
17
|
Did you accidentally call `concerns(&configuration_block)` or `middlewares(method, scope: scope, &configuration_block)` after using any plugin, after calling `commit_config!`?
|
18
18
|
TEXT
|
19
19
|
|
20
|
-
|
20
|
+
initialize(message)
|
21
21
|
end
|
22
22
|
end
|
23
23
|
|
@@ -30,7 +30,7 @@ module ConvenientService
|
|
30
30
|
# TODO: Create a troubleshooting page with possible reasons (preliminary RSpec mocks etc).
|
31
31
|
# Append a link to it to the error message.
|
32
32
|
#
|
33
|
-
def
|
33
|
+
def initialize_with_kwargs(config:)
|
34
34
|
message = <<~TEXT
|
35
35
|
`#{config.klass}` config is committed too many times from `method_missing`.
|
36
36
|
|
@@ -54,7 +54,7 @@ module ConvenientService
|
|
54
54
|
end
|
55
55
|
TEXT
|
56
56
|
|
57
|
-
|
57
|
+
initialize(message)
|
58
58
|
end
|
59
59
|
end
|
60
60
|
end
|