convenient_service 0.7.0 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (30) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +18 -0
  3. data/ROADMAP.md +2 -0
  4. data/lib/convenient_service/aliases.rb +9 -0
  5. data/lib/convenient_service/common/plugins/has_constructor_without_initialize/concern.rb +19 -0
  6. data/lib/convenient_service/configs/minimal.rb +176 -0
  7. data/lib/convenient_service/configs/standard.rb +16 -104
  8. data/lib/convenient_service/configs.rb +1 -0
  9. data/lib/convenient_service/dependencies.rb +8 -0
  10. data/lib/convenient_service/examples/dry/gemfile/dry_service/config.rb +5 -5
  11. data/lib/convenient_service/examples/rails/gemfile/rails_service/config.rb +7 -7
  12. data/lib/convenient_service/rspec/helpers/custom/ignoring_error.rb +3 -0
  13. data/lib/convenient_service/rspec/helpers/custom/wrap_method/entities/wrapped_method.rb +29 -3
  14. data/lib/convenient_service/rspec/matchers/custom/results/base.rb +5 -0
  15. data/lib/convenient_service/service/plugins/has_result/concern/class_methods.rb +3 -3
  16. data/lib/convenient_service/service/plugins/has_result/constants.rb +0 -3
  17. data/lib/convenient_service/service/plugins/has_result/entities/result/plugins/has_jsend_status_and_attributes/entities/data.rb +13 -0
  18. data/lib/convenient_service/service/plugins/raises_on_double_result/middleware.rb +37 -2
  19. data/lib/convenient_service/service/plugins/rescues_result_unhandled_exceptions/commands/format_backtrace.rb +80 -0
  20. data/lib/convenient_service/service/plugins/rescues_result_unhandled_exceptions/commands/format_cause.rb +78 -0
  21. data/lib/convenient_service/service/plugins/rescues_result_unhandled_exceptions/commands/format_exception.rb +169 -0
  22. data/lib/convenient_service/service/plugins/rescues_result_unhandled_exceptions/commands/format_line.rb +40 -0
  23. data/lib/convenient_service/service/plugins/rescues_result_unhandled_exceptions/commands.rb +7 -0
  24. data/lib/convenient_service/service/plugins/rescues_result_unhandled_exceptions/constants.rb +13 -0
  25. data/lib/convenient_service/service/plugins/rescues_result_unhandled_exceptions/middleware.rb +58 -0
  26. data/lib/convenient_service/service/plugins/rescues_result_unhandled_exceptions.rb +5 -0
  27. data/lib/convenient_service/support/undefined.rb +9 -0
  28. data/lib/convenient_service/support.rb +2 -0
  29. data/lib/convenient_service/version.rb +1 -1
  30. metadata +12 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 2d49bd8a8f45539edd750ba5388d4cd0dc7ab2e442380a24f38879f17c405944
4
- data.tar.gz: 63adf6692c4989970e4fe1fa2b0c28bfa2c29020f33e9567d3fabbd9284f1944
3
+ metadata.gz: d53f96dab5d2b97b26168f4859dc0daefe41c8768e83e607d13234c2c7d77101
4
+ data.tar.gz: c6d5a9d30e5c3c768f556eb7d84b558099fcbeb96dbff655b7bd2b553435a26a
5
5
  SHA512:
6
- metadata.gz: 199c1e80a8dfeedc2a8d1873f8f75008d510fb48374ab116f7c51f49ef44cf034454280279a5fda2bdc16ccd69e6010cb70291bdf0f10295d3eabddfcc391a6e
7
- data.tar.gz: 2f03ad73249e0f61ee1d2f2b3fde41c82d9bd2089ebcd95f01390df206f6dded8ee5c4880d409065f6df01ba63eec1cbf26caabaf94c4e4a962752bb1f9d967f
6
+ metadata.gz: 9f3fb867003d44c6786446fdb2baac4550bd6ac8f34ee9196ee310912c4eb2084f40dc731dce8a2af7ac8a963d6a3579c6e886ad28251c4bf5a9a08ca290a6d2
7
+ data.tar.gz: e24704e463ac31d3f65a4c9a5777617157bdebb62ab785e92f3f18125d8968e5c3a6d44368553c706c9f8bab0ce7bd8f938ce53ebc1df68585493738533ef2cb
data/CHANGELOG.md CHANGED
@@ -1,5 +1,23 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.8.0](https://github.com/marian13/convenient_service/compare/v0.7.0...v0.8.0) (2023-02-20)
4
+
5
+
6
+ ### Features
7
+
8
+ * **aliases:** expose middlewares ([aacb6fd](https://github.com/marian13/convenient_service/commit/aacb6fda4c63e1d82e33c523885bd61397cfb583))
9
+ * **configs:** introduce Minimal config ([70b0ca8](https://github.com/marian13/convenient_service/commit/70b0ca82679fc89099aee733d91807e371bbed39))
10
+ * **rescues_result_unhandled_exceptions:** introduce rescues_result_unhandled_exceptions ([fd0b444](https://github.com/marian13/convenient_service/commit/fd0b4447e5abf81d971cd93a8333a89b363ef1ff))
11
+ * **rescues_result_unhandled_exceptions:** return original exception in data + formatted exception as message ([45bc55e](https://github.com/marian13/convenient_service/commit/45bc55ec245df1b95769be761337a3cb2558a878))
12
+ * **undefined:** introduce undefined ([2f93bdc](https://github.com/marian13/convenient_service/commit/2f93bdc86d81c9a819bbc1c4a76a0ef291a59b17))
13
+ * **wrap_method:** introduce WrappedMethod#chain_exception ([1db33af](https://github.com/marian13/convenient_service/commit/1db33afc3a0e0713700b0bf5385900085af0a2df))
14
+
15
+
16
+ ### Bug Fixes
17
+
18
+ * **wrapped_method:** define chain value even if chain.next raises an exception ([8c4cf95](https://github.com/marian13/convenient_service/commit/8c4cf9534a07e9614fdc73f0d0c019f9c3f0ea54))
19
+ * **wrapped_method:** reraise rescued exception ([31f7ab6](https://github.com/marian13/convenient_service/commit/31f7ab6df0b34980656942992d3ecf7a67461d06))
20
+
3
21
  ## [0.7.0](https://github.com/marian13/convenient_service/compare/v0.6.0...v0.7.0) (2023-02-13)
4
22
 
5
23
 
data/ROADMAP.md CHANGED
@@ -75,5 +75,7 @@
75
75
  | Low | 🚧 | Rubocop cop that complains when a service name does NOT start with a verb | |
76
76
  | Low | 🚧 | Generator to create a spec default structure | |
77
77
  | Low | 🚧 | Rubocop cop that complains when a service does NOT have its own suite of specs | |
78
+ | High | 🚧 | Add specs for `WrappedMethod#call` | |
79
+ | High | 🚧 | Check whether ignoring error was used properly | |
78
80
 
79
81
  Search for `TODO`s in the codebase for more tasks.
@@ -1,7 +1,16 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ ##
4
+ # @internal
5
+ # NOTE: Aliases hide the full constants path from the end-users in order to increase DX.
6
+ # - https://en.wikipedia.org/wiki/User_experience#Developer_experience
7
+ #
3
8
  module ConvenientService
4
9
  Command = ::ConvenientService::Support::Command
5
10
  Concern = ::ConvenientService::Support::Concern
6
11
  DependencyContainer = ::ConvenientService::Support::DependencyContainer
12
+
13
+ ClassicMiddleware = ::ConvenientService::Core::Entities::ClassicMiddleware
14
+ ConcernMiddleware = ::ConvenientService::Core::Entities::Config::Entities::Concerns::Entities::Middleware
15
+ MethodChainMiddleware = ::ConvenientService::Core::Entities::Config::Entities::MethodMiddlewares::Entities::Middleware
7
16
  end
@@ -13,6 +13,25 @@ module ConvenientService
13
13
  # @since 0.2.0
14
14
  #
15
15
  # @internal
16
+ # NOTE: `allocate` creates an uninitialized object and allocates memory for it.
17
+ #
18
+ # NOTE: Pseudocode for default `new` implementation.
19
+ # def new
20
+ # instance = allocate
21
+ #
22
+ # instance.send(:initialize)
23
+ #
24
+ # instance
25
+ # end
26
+ #
27
+ # NOTE: Code for `new_without_initialize`.
28
+ # def new_without_initialize
29
+ # allocate
30
+ # end
31
+ #
32
+ # NOTE: `create` is used instead of `new` in order to avoid the accidental feeling that `new_without_initialize` is Ruby's built-in method.
33
+ #
34
+ # NOTE: Check the following links for more info.
16
35
  # - https://ruby-doc.org/core-2.5.0/Class.html#method-i-allocate
17
36
  # - https://frontdeveloper.pl/2018/11/ruby-allocate-method/
18
37
  #
@@ -0,0 +1,176 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ConvenientService
4
+ module Configs
5
+ ##
6
+ # Defines minimal configuration that adds a constructor, JSend-inspired result, steps, basic inspects, and internals to services.
7
+ #
8
+ # @note: This config is NOT intented for the end-user usage. Use `Standard` instead.
9
+ #
10
+ # @internal
11
+ # Heavily used in specs to test concerns and middlewares in isolation.
12
+ #
13
+ module Minimal
14
+ include Support::Concern
15
+
16
+ ##
17
+ # @internal
18
+ # IMPORTANT: Order of plugins matters.
19
+ #
20
+ # NOTE: `class_exec` (that is used under the hood by `included`) defines `class Result` in the global namespace.
21
+ # That is why `class self::Result` is used.
22
+ # - https://stackoverflow.com/a/51965126/12201472
23
+ #
24
+ # rubocop:disable Lint/ConstantDefinitionInBlock
25
+ included do
26
+ include Core
27
+
28
+ concerns do
29
+ use Plugins::Common::HasInternals::Concern
30
+
31
+ use Plugins::Service::HasInspect::Concern
32
+
33
+ use Plugins::Common::HasConstructor::Concern
34
+ use Plugins::Common::HasConstructorWithoutInitialize::Concern
35
+
36
+ use Plugins::Service::HasResult::Concern
37
+ use Plugins::Service::HasResultSteps::Concern
38
+ end
39
+
40
+ middlewares :initialize do
41
+ use Plugins::Common::NormalizesEnv::Middleware
42
+ end
43
+
44
+ middlewares :result do
45
+ use Plugins::Common::NormalizesEnv::Middleware
46
+
47
+ use Plugins::Service::HasResult::Middleware
48
+ use Plugins::Service::HasResultSteps::Middleware
49
+ end
50
+
51
+ middlewares :step do
52
+ use Plugins::Common::NormalizesEnv::Middleware
53
+ end
54
+
55
+ middlewares :success do
56
+ use Plugins::Common::NormalizesEnv::Middleware
57
+ end
58
+
59
+ middlewares :failure do
60
+ use Plugins::Common::NormalizesEnv::Middleware
61
+ end
62
+
63
+ middlewares :error do
64
+ use Plugins::Common::NormalizesEnv::Middleware
65
+ end
66
+
67
+ middlewares :result, scope: :class do
68
+ use Plugins::Common::NormalizesEnv::Middleware
69
+ end
70
+
71
+ middlewares :step, scope: :class do
72
+ use Plugins::Common::NormalizesEnv::Middleware
73
+ end
74
+
75
+ class self::Internals
76
+ include Core
77
+
78
+ concerns do
79
+ use Plugins::Internals::HasCache::Concern
80
+ end
81
+ end
82
+
83
+ class self::Result
84
+ include Core
85
+
86
+ concerns do
87
+ use Plugins::Common::HasInternals::Concern
88
+
89
+ use Plugins::Result::HasInspect::Concern
90
+
91
+ use Plugins::Common::HasConstructor::Concern
92
+
93
+ use Plugins::Result::HasJsendStatusAndAttributes::Concern
94
+ end
95
+
96
+ middlewares :initialize do
97
+ use Plugins::Common::NormalizesEnv::Middleware
98
+
99
+ use Plugins::Result::HasJsendStatusAndAttributes::Middleware
100
+ end
101
+
102
+ middlewares :success? do
103
+ use Plugins::Common::NormalizesEnv::Middleware
104
+ end
105
+
106
+ middlewares :failure? do
107
+ use Plugins::Common::NormalizesEnv::Middleware
108
+ end
109
+
110
+ middlewares :error? do
111
+ use Plugins::Common::NormalizesEnv::Middleware
112
+ end
113
+
114
+ middlewares :not_success? do
115
+ use Plugins::Common::NormalizesEnv::Middleware
116
+ end
117
+
118
+ middlewares :not_failure? do
119
+ use Plugins::Common::NormalizesEnv::Middleware
120
+ end
121
+
122
+ middlewares :not_error? do
123
+ use Plugins::Common::NormalizesEnv::Middleware
124
+ end
125
+
126
+ middlewares :data do
127
+ use Plugins::Common::NormalizesEnv::Middleware
128
+ end
129
+
130
+ middlewares :message do
131
+ use Plugins::Common::NormalizesEnv::Middleware
132
+ end
133
+
134
+ middlewares :code do
135
+ use Plugins::Common::NormalizesEnv::Middleware
136
+ end
137
+
138
+ middlewares :to_kwargs do
139
+ use Plugins::Common::NormalizesEnv::Middleware
140
+ end
141
+
142
+ class self::Internals
143
+ include Core
144
+
145
+ concerns do
146
+ use Plugins::Internals::HasCache::Concern
147
+ end
148
+ end
149
+ end
150
+
151
+ class self::Step
152
+ include Core
153
+
154
+ concerns do
155
+ use Plugins::Common::HasInternals::Concern
156
+
157
+ use Plugins::Step::HasInspect::Concern
158
+ end
159
+
160
+ middlewares :calculate_result do
161
+ use Plugins::Common::NormalizesEnv::Middleware
162
+ end
163
+
164
+ class self::Internals
165
+ include Core
166
+
167
+ concerns do
168
+ use Plugins::Internals::HasCache::Concern
169
+ end
170
+ end
171
+ end
172
+ end
173
+ # rubocop:enable Lint/ConstantDefinitionInBlock
174
+ end
175
+ end
176
+ end
@@ -2,54 +2,47 @@
2
2
 
3
3
  module ConvenientService
4
4
  module Configs
5
+ ##
6
+ # Default configuration for the user-defined services.
7
+ #
5
8
  module Standard
6
9
  include Support::Concern
7
10
 
8
11
  ##
9
- # IMPORTANT: Order of plugins matters.
12
+ # @internal
13
+ # IMPORTANT: Order of plugins matters.
10
14
  #
11
- # NOTE: `class_exec` (that is used under the hood by `included`) defines `class Result` in the global namespace.
12
- # That is why `class self::Result` is used.
13
- #
14
- # https://stackoverflow.com/a/51965126/12201472
15
+ # NOTE: `class_exec` (that is used under the hood by `included`) defines `class Result` in the global namespace.
16
+ # That is why `class self::Result` is used.
17
+ # - https://stackoverflow.com/a/51965126/12201472
15
18
  #
16
19
  # rubocop:disable Lint/ConstantDefinitionInBlock
17
20
  included do
18
- include Core
21
+ include Configs::Minimal
19
22
 
20
23
  concerns do
21
- use Plugins::Common::HasInternals::Concern
22
- use Plugins::Common::HasConstructor::Concern
23
- use Plugins::Common::HasConstructorWithoutInitialize::Concern
24
-
25
24
  use Plugins::Common::CachesConstructorParams::Concern
26
25
  use Plugins::Common::CanBeCopied::Concern
27
- use Plugins::Service::HasResult::Concern
28
- use Plugins::Service::HasResultShortSyntax::Concern
29
- use Plugins::Service::HasResultSteps::Concern
30
26
  use Plugins::Service::CanRecalculateResult::Concern
27
+ use Plugins::Service::HasResultShortSyntax::Concern
31
28
  use Plugins::Service::HasResultStatusCheckShortSyntax::Concern
32
29
 
33
30
  use Plugins::Common::HasCallbacks::Concern
34
31
  use Plugins::Common::HasAroundCallbacks::Concern
35
-
36
- use Plugins::Service::HasInspect::Concern
37
32
  end
38
33
 
39
34
  middlewares :initialize do
40
- use Plugins::Common::NormalizesEnv::Middleware
41
-
42
35
  use Plugins::Common::CachesConstructorParams::Middleware
43
36
  end
44
37
 
45
38
  middlewares :result do
46
- use Plugins::Common::NormalizesEnv::Middleware
39
+ insert_before \
40
+ Plugins::Service::HasResult::Middleware,
41
+ Plugins::Common::HasCallbacks::Middleware
47
42
 
48
- use Plugins::Common::HasCallbacks::Middleware
49
- use Plugins::Common::HasAroundCallbacks::Middleware
50
-
51
- use Plugins::Service::HasResult::Middleware
52
- use Plugins::Service::HasResultSteps::Middleware
43
+ insert_after \
44
+ Plugins::Common::HasCallbacks::Middleware,
45
+ Plugins::Common::HasAroundCallbacks::Middleware
53
46
 
54
47
  use Plugins::Service::RaisesOnDoubleResult::Middleware
55
48
 
@@ -57,167 +50,86 @@ module ConvenientService
57
50
  end
58
51
 
59
52
  middlewares :step do
60
- use Plugins::Common::NormalizesEnv::Middleware
61
-
62
53
  use Plugins::Common::HasCallbacks::Middleware
63
54
  use Plugins::Common::HasAroundCallbacks::Middleware
64
55
  end
65
56
 
66
57
  middlewares :success do
67
- use Plugins::Common::NormalizesEnv::Middleware
68
-
69
58
  use Plugins::Service::HasResultShortSyntax::Success::Middleware
70
59
  end
71
60
 
72
61
  middlewares :failure do
73
- use Plugins::Common::NormalizesEnv::Middleware
74
-
75
62
  use Plugins::Service::HasResultShortSyntax::Failure::Middleware
76
63
  end
77
64
 
78
65
  middlewares :error do
79
- use Plugins::Common::NormalizesEnv::Middleware
80
-
81
66
  use Plugins::Service::HasResultShortSyntax::Error::Middleware
82
67
  end
83
68
 
84
- middlewares :result, scope: :class do
85
- use Plugins::Common::NormalizesEnv::Middleware
86
- end
87
-
88
69
  middlewares :step, scope: :class do
89
- use Plugins::Common::NormalizesEnv::Middleware
90
-
91
70
  use Plugins::Service::HasResultMethodSteps::Middleware
92
71
  end
93
72
 
94
- class self::Internals
95
- include Core
96
-
97
- concerns do
98
- use Plugins::Internals::HasCache::Concern
99
- end
100
- end
101
-
102
73
  class self::Result
103
- include Core
104
-
105
74
  concerns do
106
- use Plugins::Common::HasInternals::Concern
107
- use Plugins::Common::HasConstructor::Concern
108
-
109
- use Plugins::Result::HasJsendStatusAndAttributes::Concern
110
-
111
75
  use Plugins::Result::HasResultShortSyntax::Concern
112
76
  use Plugins::Result::CanRecalculateResult::Concern
113
77
 
114
78
  use Plugins::Result::HasStep::Concern
115
79
  use Plugins::Result::CanHaveParentResult::Concern
116
-
117
- use Plugins::Result::HasInspect::Concern
118
80
  end
119
81
 
120
82
  middlewares :initialize do
121
- use Plugins::Common::NormalizesEnv::Middleware
122
-
123
- use Plugins::Result::HasJsendStatusAndAttributes::Middleware
124
-
125
83
  use Plugins::Result::HasStep::Initialize::Middleware
126
84
  use Plugins::Result::CanHaveParentResult::Initialize::Middleware
127
85
  end
128
86
 
129
87
  middlewares :success? do
130
- use Plugins::Common::NormalizesEnv::Middleware
131
-
132
88
  use Plugins::Result::MarksResultStatusAsChecked::Middleware
133
89
  end
134
90
 
135
91
  middlewares :failure? do
136
- use Plugins::Common::NormalizesEnv::Middleware
137
-
138
92
  use Plugins::Result::MarksResultStatusAsChecked::Middleware
139
93
  end
140
94
 
141
95
  middlewares :error? do
142
- use Plugins::Common::NormalizesEnv::Middleware
143
-
144
96
  use Plugins::Result::MarksResultStatusAsChecked::Middleware
145
97
  end
146
98
 
147
99
  middlewares :not_success? do
148
- use Plugins::Common::NormalizesEnv::Middleware
149
-
150
100
  use Plugins::Result::MarksResultStatusAsChecked::Middleware
151
101
  end
152
102
 
153
103
  middlewares :not_failure? do
154
- use Plugins::Common::NormalizesEnv::Middleware
155
-
156
104
  use Plugins::Result::MarksResultStatusAsChecked::Middleware
157
105
  end
158
106
 
159
107
  middlewares :not_error? do
160
- use Plugins::Common::NormalizesEnv::Middleware
161
-
162
108
  use Plugins::Result::MarksResultStatusAsChecked::Middleware
163
109
  end
164
110
 
165
111
  middlewares :data do
166
- use Plugins::Common::NormalizesEnv::Middleware
167
-
168
112
  use Plugins::Result::RaisesOnNotCheckedResultStatus::Middleware
169
113
  end
170
114
 
171
115
  middlewares :message do
172
- use Plugins::Common::NormalizesEnv::Middleware
173
-
174
116
  use Plugins::Result::RaisesOnNotCheckedResultStatus::Middleware
175
117
  end
176
118
 
177
119
  middlewares :code do
178
- use Plugins::Common::NormalizesEnv::Middleware
179
-
180
120
  use Plugins::Result::RaisesOnNotCheckedResultStatus::Middleware
181
121
  end
182
122
 
183
123
  middlewares :to_kwargs do
184
- use Plugins::Common::NormalizesEnv::Middleware
185
-
186
124
  use Plugins::Result::HasStep::ToKwargs::Middleware
187
125
  use Plugins::Result::CanHaveParentResult::ToKwargs::Middleware
188
126
  end
189
-
190
- class self::Internals
191
- include Core
192
-
193
- concerns do
194
- use Plugins::Internals::HasCache::Concern
195
- end
196
- end
197
127
  end
198
128
 
199
129
  class self::Step
200
- include Core
201
-
202
- concerns do
203
- use Plugins::Common::HasInternals::Concern
204
-
205
- use Plugins::Step::HasInspect::Concern
206
- end
207
-
208
130
  middlewares :calculate_result do
209
- use Plugins::Common::NormalizesEnv::Middleware
210
-
211
131
  use Plugins::Step::CanHaveParentResult::Middleware
212
132
  end
213
-
214
- class self::Internals
215
- include Core
216
-
217
- concerns do
218
- use Plugins::Internals::HasCache::Concern
219
- end
220
- end
221
133
  end
222
134
 
223
135
  if Dependencies.rspec.loaded?
@@ -1,5 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require_relative "configs/minimal"
3
4
  require_relative "configs/standard"
4
5
 
5
6
  require_relative "configs/aliases"
@@ -75,6 +75,14 @@ module ConvenientService
75
75
  require_relative "service/plugins/has_result_params_validations/using_dry_validation"
76
76
  end
77
77
 
78
+ ##
79
+ # @return [Boolean]
80
+ # @note Expected to be called from app entry points like `initializers` in Rails.
81
+ #
82
+ def require_rescues_result_unhandled_exceptions
83
+ require_relative "service/plugins/rescues_result_unhandled_exceptions"
84
+ end
85
+
78
86
  ##
79
87
  # @return [Boolean]
80
88
  # @note Expected to be called from `irb`, `pry`, `spec_helper.rb`, etc.
@@ -16,26 +16,26 @@ module ConvenientService
16
16
 
17
17
  included do |service_class|
18
18
  service_class.class_exec do
19
- include Configs::Standard
19
+ include ConvenientService::Standard::Config
20
20
 
21
21
  ##
22
22
  # NOTE: `AssignsAttributesInConstructor::UsingDryInitializer` plugin.
23
23
  #
24
24
  concerns do
25
- use Plugins::Common::AssignsAttributesInConstructor::UsingDryInitializer::Concern
25
+ use ConvenientService::Plugins::Common::AssignsAttributesInConstructor::UsingDryInitializer::Concern
26
26
  end
27
27
 
28
28
  ##
29
29
  # NOTE: `HasResultParamsValidations::UsingDryValidation` plugin.
30
30
  #
31
31
  concerns do
32
- use Plugins::Service::HasResultParamsValidations::UsingDryValidation::Concern
32
+ use ConvenientService::Plugins::Service::HasResultParamsValidations::UsingDryValidation::Concern
33
33
  end
34
34
 
35
35
  middlewares :result do
36
36
  insert_before \
37
- Plugins::Service::HasResult::Middleware,
38
- Plugins::Service::HasResultParamsValidations::UsingDryValidation::Middleware
37
+ ConvenientService::Plugins::Service::HasResult::Middleware,
38
+ ConvenientService::Plugins::Service::HasResultParamsValidations::UsingDryValidation::Middleware
39
39
  end
40
40
  end
41
41
  end
@@ -16,37 +16,37 @@ module ConvenientService
16
16
 
17
17
  included do |service_class|
18
18
  service_class.class_exec do
19
- include Configs::Standard
19
+ include ConvenientService::Standard::Config
20
20
 
21
21
  ##
22
22
  # NOTE: `AssignsAttributesInConstructor::UsingActiveModelAttributeAssignment` plugin.
23
23
  #
24
24
  concerns do
25
- use Plugins::Common::AssignsAttributesInConstructor::UsingActiveModelAttributeAssignment::Concern
25
+ use ConvenientService::Plugins::Common::AssignsAttributesInConstructor::UsingActiveModelAttributeAssignment::Concern
26
26
  end
27
27
 
28
28
  middlewares :initialize do
29
- use Plugins::Common::AssignsAttributesInConstructor::UsingActiveModelAttributeAssignment::Middleware
29
+ use ConvenientService::Plugins::Common::AssignsAttributesInConstructor::UsingActiveModelAttributeAssignment::Middleware
30
30
  end
31
31
 
32
32
  ##
33
33
  # NOTE: `HasAttributes::UsingActiveModelAttributes` plugin.
34
34
  #
35
35
  concerns do
36
- use Plugins::Common::HasAttributes::UsingActiveModelAttributes::Concern
36
+ use ConvenientService::Plugins::Common::HasAttributes::UsingActiveModelAttributes::Concern
37
37
  end
38
38
 
39
39
  ##
40
40
  # NOTE: `HasResultParamsValidations::UsingActiveModelValidations` plugin.
41
41
  #
42
42
  concerns do
43
- use Plugins::Service::HasResultParamsValidations::UsingActiveModelValidations::Concern
43
+ use ConvenientService::Plugins::Service::HasResultParamsValidations::UsingActiveModelValidations::Concern
44
44
  end
45
45
 
46
46
  middlewares :result do
47
47
  insert_before \
48
- Plugins::Service::HasResult::Middleware,
49
- Plugins::Service::HasResultParamsValidations::UsingActiveModelValidations::Middleware
48
+ ConvenientService::Plugins::Service::HasResult::Middleware,
49
+ ConvenientService::Plugins::Service::HasResultParamsValidations::UsingActiveModelValidations::Middleware
50
50
  end
51
51
  end
52
52
  end
@@ -20,6 +20,9 @@ module ConvenientService
20
20
  rescue *errors
21
21
  nil
22
22
  else
23
+ ##
24
+ # TODO: Raise self-explanatory exception.
25
+ #
23
26
  raise
24
27
  end
25
28
  end
@@ -35,9 +35,25 @@ module ConvenientService
35
35
  #
36
36
  stack.use(
37
37
  proc do |env|
38
- entity.__send__(method, *env[:args], **env[:kwargs], &env[:block])
39
- .tap { |value| @chain_value = value }
40
- .tap { @chain_arguments = {args: env[:args], kwargs: env[:kwargs], block: env[:block]} }
38
+ @chain_arguments = {args: env[:args], kwargs: env[:kwargs], block: env[:block]}
39
+
40
+ ##
41
+ # IMPORTANT: Forces Ruby to define `@chain_value` instance variable.
42
+ #
43
+ # NOTE: If `@chain_value` is still set to `Support::UNDEFINED` after running the begin block - an exception was raised by `chain.next`. See `chain_called?` for more info.
44
+ #
45
+ @chain_value = Support::UNDEFINED
46
+
47
+ begin
48
+ @chain_value = entity.__send__(method, *env[:args], **env[:kwargs], &env[:block])
49
+ rescue => exception
50
+ @chain_exception = exception
51
+
52
+ ##
53
+ # NOTE: `raise` with no args inside `rescue` reraises rescued exception.
54
+ #
55
+ raise
56
+ end
41
57
  end
42
58
  )
43
59
  end
@@ -107,6 +123,16 @@ module ConvenientService
107
123
 
108
124
  @chain_arguments[:block]
109
125
  end
126
+
127
+ ##
128
+ # @return [StandardError, nil]
129
+ # @raise [ConvenientService::RSpec::Helpers::Custom::WrapMethod::Errors::ChainAttributePreliminaryAccess]
130
+ #
131
+ def chain_exception
132
+ raise Errors::ChainAttributePreliminaryAccess.new(attribute: :exception) unless chain_called?
133
+
134
+ @chain_exception
135
+ end
110
136
  end
111
137
  end
112
138
  end
@@ -26,7 +26,12 @@ module ConvenientService
26
26
  rules = []
27
27
 
28
28
  rules << ->(result) { result.class.include?(Service::Plugins::HasResult::Entities::Result::Concern) }
29
+
30
+ ##
31
+ # IMPORTANT: Result status is NOT marked as checked intentionally, since it is a mutable operation.
32
+ #
29
33
  rules << ->(result) { result.status.in?(statuses) }
34
+
30
35
  rules << ->(result) { result.service.instance_of?(service_class) } if used_of_service?
31
36
  rules << ->(result) { Commands::MatchResultStep.call(result: result, step: step) } if used_of_step?
32
37
  rules << ->(result) { result.unsafe_data == data } if used_data?