servactory 1.4.1 → 1.4.3
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.
- checksums.yaml +4 -4
- data/README.md +89 -5
- data/lib/servactory/base.rb +1 -0
- data/lib/servactory/configuration/dsl.rb +21 -0
- data/lib/servactory/configuration/factory.rb +23 -0
- data/lib/servactory/configuration/setup.rb +20 -0
- data/lib/servactory/context/callable.rb +55 -0
- data/lib/servactory/context/dsl.rb +2 -55
- data/lib/servactory/context/store.rb +0 -38
- data/lib/servactory/context/workspace/error.rb +19 -0
- data/lib/servactory/context/workspace/errors.rb +33 -0
- data/lib/servactory/context/workspace.rb +32 -0
- data/lib/servactory/input_arguments/options_collection.rb +3 -3
- data/lib/servactory/input_arguments/tools/prepare.rb +15 -14
- data/lib/servactory/inputs.rb +4 -2
- data/lib/servactory/internal_arguments/tools/prepare.rb +12 -12
- data/lib/servactory/output_arguments/tools/prepare.rb +13 -13
- data/lib/servactory/version.rb +1 -1
- data/lib/servactory.rb +2 -2
- metadata +9 -3
- data/lib/servactory/configuration.rb +0 -18
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3877871b09a517026f3b66849d43348aae44feca18f2f97e101d1948cbc4f9d0
|
4
|
+
data.tar.gz: c6f0feca2515ebfd9e6123351c78ac29aee0ded0da66c4f689b259460ee7e403
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3d9d7237afe83f2b813d3c3555a322c5357dcc56aff1f45c0289c8efc47a139f5dc0f1bfec5f81005be1083aa0372b40a99b345df212aeded2edb425a03337c8
|
7
|
+
data.tar.gz: e1c7a318ce6a853269c6c3240e4028921fbad2f2d50c0e0c8d1ef52820bff91fe96638e363bbf63f278419cf477c8c2211a929d0c8f19a7198dd4e76c2c122df
|
data/README.md
CHANGED
@@ -3,6 +3,7 @@
|
|
3
3
|
A set of tools for building reliable services of any complexity.
|
4
4
|
|
5
5
|
[](https://rubygems.org/gems/servactory)
|
6
|
+
[](https://github.com/afuno/servactory/releases)
|
6
7
|
|
7
8
|
## Contents
|
8
9
|
|
@@ -22,6 +23,8 @@ A set of tools for building reliable services of any complexity.
|
|
22
23
|
- [Must](#must)
|
23
24
|
- [Output attributes](#output-attributes)
|
24
25
|
- [Internal attributes](#internal-attributes)
|
26
|
+
- [Stage](#stage)
|
27
|
+
- [Failures](#failures)
|
25
28
|
- [Result](#result)
|
26
29
|
|
27
30
|
## Requirements
|
@@ -51,7 +54,7 @@ bundle install
|
|
51
54
|
|
52
55
|
### Preparation
|
53
56
|
|
54
|
-
|
57
|
+
As a first step, it is recommended to prepare the base class for further inheritance.
|
55
58
|
|
56
59
|
#### ApplicationService::Errors
|
57
60
|
|
@@ -93,16 +96,18 @@ end
|
|
93
96
|
|
94
97
|
```ruby
|
95
98
|
class MinimalService < ApplicationService::Base
|
96
|
-
stage { make :
|
99
|
+
stage { make :call }
|
97
100
|
|
98
101
|
private
|
99
102
|
|
100
|
-
def
|
103
|
+
def call
|
101
104
|
# ...
|
102
105
|
end
|
103
106
|
end
|
104
107
|
```
|
105
108
|
|
109
|
+
[More examples](https://github.com/afuno/servactory/tree/main/examples/usual)
|
110
|
+
|
106
111
|
### Input attributes
|
107
112
|
|
108
113
|
#### Isolated usage
|
@@ -147,9 +152,9 @@ By default, all inputs are required. To make an input optional, specify `false`
|
|
147
152
|
|
148
153
|
```ruby
|
149
154
|
class UsersService::Create < ApplicationService::Base
|
150
|
-
input :first_name, type: String
|
155
|
+
input :first_name, type: String
|
151
156
|
input :middle_name, type: String, required: false
|
152
|
-
input :last_name, type: String
|
157
|
+
input :last_name, type: String
|
153
158
|
|
154
159
|
# ...
|
155
160
|
end
|
@@ -239,6 +244,85 @@ class NotificationService::Create < ApplicationService::Base
|
|
239
244
|
end
|
240
245
|
```
|
241
246
|
|
247
|
+
### Stage
|
248
|
+
|
249
|
+
A "stage" is a single action or group of actions that needs to be "make".
|
250
|
+
|
251
|
+
#### Minimal example
|
252
|
+
|
253
|
+
```ruby
|
254
|
+
stage { make :something }
|
255
|
+
|
256
|
+
def something
|
257
|
+
# ...
|
258
|
+
end
|
259
|
+
```
|
260
|
+
|
261
|
+
#### Condition
|
262
|
+
|
263
|
+
```ruby
|
264
|
+
stage { make :something, if: -> { Settings.something.enabled } }
|
265
|
+
|
266
|
+
def something
|
267
|
+
# ...
|
268
|
+
end
|
269
|
+
```
|
270
|
+
|
271
|
+
#### Groups
|
272
|
+
|
273
|
+
The functionality of stage groups will be expanded in future releases.
|
274
|
+
|
275
|
+
```ruby
|
276
|
+
stage do
|
277
|
+
make :assign_api_model
|
278
|
+
make :perform_api_request
|
279
|
+
end
|
280
|
+
|
281
|
+
stage do
|
282
|
+
make :process_result
|
283
|
+
end
|
284
|
+
|
285
|
+
def assign_api_model
|
286
|
+
self.api_model = APIModel.new
|
287
|
+
end
|
288
|
+
|
289
|
+
def perform_api_request
|
290
|
+
self.response = APIClient.resource.create(api_model)
|
291
|
+
end
|
292
|
+
|
293
|
+
def process_result
|
294
|
+
ARModel.create!(response)
|
295
|
+
end
|
296
|
+
```
|
297
|
+
|
298
|
+
### Failures
|
299
|
+
|
300
|
+
The methods that are used in the stages may fail. In order to more informatively provide information about this outside the service, the following methods were prepared.
|
301
|
+
|
302
|
+
#### Fail
|
303
|
+
|
304
|
+
```ruby
|
305
|
+
stage { make :check! }
|
306
|
+
|
307
|
+
def check!
|
308
|
+
return if inputs.invoice_number.start_with?("AA")
|
309
|
+
|
310
|
+
fail!("Invalid invoice number")
|
311
|
+
end
|
312
|
+
```
|
313
|
+
|
314
|
+
#### Fail for input
|
315
|
+
|
316
|
+
```ruby
|
317
|
+
stage { make :check! }
|
318
|
+
|
319
|
+
def check!
|
320
|
+
return if inputs.invoice_number.start_with?("AA")
|
321
|
+
|
322
|
+
fail_input!(:invoice_number, "Invalid invoice number")
|
323
|
+
end
|
324
|
+
```
|
325
|
+
|
242
326
|
### Result
|
243
327
|
|
244
328
|
All services have the result of their work. For example, in case of success this call:
|
data/lib/servactory/base.rb
CHANGED
@@ -0,0 +1,21 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Servactory
|
4
|
+
module Configuration
|
5
|
+
module DSL
|
6
|
+
def self.included(base)
|
7
|
+
base.extend(ClassMethods)
|
8
|
+
end
|
9
|
+
|
10
|
+
module ClassMethods
|
11
|
+
private
|
12
|
+
|
13
|
+
def configuration(&block)
|
14
|
+
@configuration_factory ||= Factory.new
|
15
|
+
|
16
|
+
@configuration_factory.instance_eval(&block)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Servactory
|
4
|
+
module Configuration
|
5
|
+
class Factory
|
6
|
+
def input_argument_error_class(input_argument_error_class)
|
7
|
+
Servactory.configuration.input_argument_error_class = input_argument_error_class
|
8
|
+
end
|
9
|
+
|
10
|
+
def output_argument_error_class(output_argument_error_class)
|
11
|
+
Servactory.configuration.output_argument_error_class = output_argument_error_class
|
12
|
+
end
|
13
|
+
|
14
|
+
def internal_argument_error_class(internal_argument_error_class)
|
15
|
+
Servactory.configuration.internal_argument_error_class = internal_argument_error_class
|
16
|
+
end
|
17
|
+
|
18
|
+
def failure_class(failure_class)
|
19
|
+
Servactory.configuration.failure_class = failure_class
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Servactory
|
4
|
+
module Configuration
|
5
|
+
class Setup
|
6
|
+
attr_accessor :input_argument_error_class,
|
7
|
+
:internal_argument_error_class,
|
8
|
+
:output_argument_error_class,
|
9
|
+
:failure_class
|
10
|
+
|
11
|
+
def initialize
|
12
|
+
@input_argument_error_class = Servactory::Errors::InputArgumentError
|
13
|
+
@internal_argument_error_class = Servactory::Errors::InternalArgumentError
|
14
|
+
@output_argument_error_class = Servactory::Errors::OutputArgumentError
|
15
|
+
|
16
|
+
@failure_class = Servactory::Errors::Failure
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Servactory
|
4
|
+
module Context
|
5
|
+
module Callable
|
6
|
+
def call!(arguments = {}) # rubocop:disable Metrics/MethodLength, Metrics/AbcSize
|
7
|
+
@context_store = Store.new(self)
|
8
|
+
|
9
|
+
assign_data_with(arguments)
|
10
|
+
|
11
|
+
input_arguments_workbench.find_unnecessary!
|
12
|
+
input_arguments_workbench.check_rules!
|
13
|
+
output_arguments_workbench.find_conflicts_in!(
|
14
|
+
collection_of_internal_arguments: collection_of_internal_arguments
|
15
|
+
)
|
16
|
+
|
17
|
+
prepare_data
|
18
|
+
|
19
|
+
input_arguments_workbench.check!
|
20
|
+
|
21
|
+
stage_handyman.run_methods!
|
22
|
+
|
23
|
+
context_store.context.raise_first_fail
|
24
|
+
|
25
|
+
Servactory::Result.prepare_for(
|
26
|
+
context: context_store.context,
|
27
|
+
collection_of_output_arguments: collection_of_output_arguments
|
28
|
+
)
|
29
|
+
end
|
30
|
+
|
31
|
+
private
|
32
|
+
|
33
|
+
attr_reader :context_store
|
34
|
+
|
35
|
+
def assign_data_with(arguments) # rubocop:disable Metrics/AbcSize
|
36
|
+
input_arguments_workbench.assign(
|
37
|
+
context: context_store.context,
|
38
|
+
arguments: arguments,
|
39
|
+
collection_of_input_options: collection_of_input_options
|
40
|
+
)
|
41
|
+
|
42
|
+
internal_arguments_workbench.assign(context: context_store.context)
|
43
|
+
output_arguments_workbench.assign(context: context_store.context)
|
44
|
+
stage_handyman&.assign(context: context_store.context)
|
45
|
+
end
|
46
|
+
|
47
|
+
def prepare_data
|
48
|
+
input_arguments_workbench.prepare # 1
|
49
|
+
|
50
|
+
output_arguments_workbench.prepare # 2
|
51
|
+
internal_arguments_workbench.prepare # 3
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
@@ -4,61 +4,8 @@ module Servactory
|
|
4
4
|
module Context
|
5
5
|
module DSL
|
6
6
|
def self.included(base)
|
7
|
-
base.extend(
|
8
|
-
|
9
|
-
|
10
|
-
module ClassMethods
|
11
|
-
def call!(arguments) # rubocop:disable Metrics/MethodLength, Metrics/AbcSize
|
12
|
-
@context_store ||= Store.new(self)
|
13
|
-
|
14
|
-
assign_data_with(arguments)
|
15
|
-
|
16
|
-
input_arguments_workbench.find_unnecessary!
|
17
|
-
input_arguments_workbench.check_rules!
|
18
|
-
output_arguments_workbench.find_conflicts_in!(
|
19
|
-
collection_of_internal_arguments: collection_of_internal_arguments
|
20
|
-
)
|
21
|
-
|
22
|
-
prepare_data
|
23
|
-
|
24
|
-
input_arguments_workbench.check!
|
25
|
-
|
26
|
-
stage_handyman.run_methods!
|
27
|
-
|
28
|
-
Servactory::Result.prepare_for(
|
29
|
-
context: context_store.context,
|
30
|
-
collection_of_output_arguments: collection_of_output_arguments
|
31
|
-
)
|
32
|
-
end
|
33
|
-
|
34
|
-
private
|
35
|
-
|
36
|
-
attr_reader :context_store
|
37
|
-
|
38
|
-
def assign_data_with(arguments) # rubocop:disable Metrics/AbcSize
|
39
|
-
input_arguments_workbench.assign(
|
40
|
-
context: context_store.context,
|
41
|
-
arguments: arguments,
|
42
|
-
collection_of_input_options: collection_of_input_options
|
43
|
-
)
|
44
|
-
|
45
|
-
internal_arguments_workbench.assign(context: context_store.context)
|
46
|
-
output_arguments_workbench.assign(context: context_store.context)
|
47
|
-
stage_handyman&.assign(context: context_store.context)
|
48
|
-
end
|
49
|
-
|
50
|
-
def prepare_data
|
51
|
-
input_arguments_workbench.prepare # 1
|
52
|
-
|
53
|
-
output_arguments_workbench.prepare # 2
|
54
|
-
internal_arguments_workbench.prepare # 3
|
55
|
-
end
|
56
|
-
|
57
|
-
def configuration(&block)
|
58
|
-
context_configuration = Servactory::Context::Configuration.new
|
59
|
-
|
60
|
-
context_configuration.instance_eval(&block)
|
61
|
-
end
|
7
|
+
base.extend(Callable)
|
8
|
+
base.prepend(Workspace)
|
62
9
|
end
|
63
10
|
end
|
64
11
|
end
|
@@ -7,44 +7,6 @@ module Servactory
|
|
7
7
|
|
8
8
|
def initialize(service_class)
|
9
9
|
@context = service_class.new
|
10
|
-
|
11
|
-
service_class.class_eval(service_class_template_with(context))
|
12
|
-
end
|
13
|
-
|
14
|
-
private
|
15
|
-
|
16
|
-
# EXAMPLE:
|
17
|
-
#
|
18
|
-
# attr_reader(:inputs)
|
19
|
-
#
|
20
|
-
# def assign_inputs(inputs)
|
21
|
-
# @inputs = inputs
|
22
|
-
# end
|
23
|
-
#
|
24
|
-
# def fail_input!(input_attribute_name, message, prefix: true)
|
25
|
-
# message_text = prefix ? "[#{context.class.name}] Custom `\#{input_attribute_name}` input error: " : ""
|
26
|
-
#
|
27
|
-
# message_text += message
|
28
|
-
#
|
29
|
-
# raise Servactory.configuration.input_argument_error_class, message_text
|
30
|
-
# end
|
31
|
-
#
|
32
|
-
def service_class_template_with(context)
|
33
|
-
<<-RUBY
|
34
|
-
attr_reader(:inputs)
|
35
|
-
|
36
|
-
def assign_inputs(inputs)
|
37
|
-
@inputs = inputs
|
38
|
-
end
|
39
|
-
|
40
|
-
def fail_input!(input_attribute_name, message, prefix: true)
|
41
|
-
message_text = prefix ? "[#{context.class.name}] Custom `\#{input_attribute_name}` input error: " : ""
|
42
|
-
|
43
|
-
message_text += message
|
44
|
-
|
45
|
-
raise Servactory.configuration.input_argument_error_class, message_text
|
46
|
-
end
|
47
|
-
RUBY
|
48
10
|
end
|
49
11
|
end
|
50
12
|
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Servactory
|
4
|
+
module Context
|
5
|
+
module Workspace
|
6
|
+
class Error
|
7
|
+
attr_reader :type,
|
8
|
+
:message,
|
9
|
+
:attribute_name
|
10
|
+
|
11
|
+
def initialize(type:, message:, attribute_name: nil)
|
12
|
+
@type = type
|
13
|
+
@message = message
|
14
|
+
@attribute_name = attribute_name
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Servactory
|
4
|
+
module Context
|
5
|
+
module Workspace
|
6
|
+
class Errors
|
7
|
+
# NOTE: http://words.steveklabnik.com/beware-subclassing-ruby-core-classes
|
8
|
+
extend Forwardable
|
9
|
+
def_delegators :@collection, :<<, :filter, :reject, :empty?, :first
|
10
|
+
|
11
|
+
def initialize(collection = [])
|
12
|
+
@collection = collection
|
13
|
+
end
|
14
|
+
|
15
|
+
def not_blank_and_uniq
|
16
|
+
Errors.new(reject(&:blank?).uniq)
|
17
|
+
end
|
18
|
+
|
19
|
+
def for_fails
|
20
|
+
filtered = filter { |error| error.type == :fail }
|
21
|
+
|
22
|
+
Errors.new(filtered)
|
23
|
+
end
|
24
|
+
|
25
|
+
def for_inputs
|
26
|
+
filtered = filter { |error| error.type == :inputs }
|
27
|
+
|
28
|
+
Errors.new(filtered)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Servactory
|
4
|
+
module Context
|
5
|
+
module Workspace
|
6
|
+
attr_reader :inputs
|
7
|
+
|
8
|
+
def errors
|
9
|
+
@errors ||= Errors.new
|
10
|
+
end
|
11
|
+
|
12
|
+
def assign_inputs(inputs)
|
13
|
+
@inputs = inputs
|
14
|
+
end
|
15
|
+
|
16
|
+
def fail_input!(input_attribute_name, message)
|
17
|
+
raise Servactory.configuration.input_argument_error_class,
|
18
|
+
Error.new(type: :input, attribute_name: input_attribute_name, message: message).message
|
19
|
+
end
|
20
|
+
|
21
|
+
def fail!(error)
|
22
|
+
errors << Error.new(type: :fail, message: error)
|
23
|
+
end
|
24
|
+
|
25
|
+
def raise_first_fail
|
26
|
+
return if (tmp_errors = errors.for_fails.not_blank_and_uniq).empty?
|
27
|
+
|
28
|
+
raise Servactory.configuration.failure_class, tmp_errors.first.message
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -5,18 +5,18 @@ module Servactory
|
|
5
5
|
class OptionsCollection
|
6
6
|
# NOTE: http://words.steveklabnik.com/beware-subclassing-ruby-core-classes
|
7
7
|
extend Forwardable
|
8
|
-
def_delegators :@collection, :<<, :
|
8
|
+
def_delegators :@collection, :<<, :filter, :each, :map
|
9
9
|
|
10
10
|
def initialize(*)
|
11
11
|
@collection = []
|
12
12
|
end
|
13
13
|
|
14
14
|
def check_classes
|
15
|
-
|
15
|
+
filter { |option| option.check_class.present? }.map(&:check_class).uniq
|
16
16
|
end
|
17
17
|
|
18
18
|
def options_for_checks
|
19
|
-
|
19
|
+
filter(&:need_for_checks?).to_h do |option|
|
20
20
|
value = if option.value.is_a?(Hash)
|
21
21
|
option.value.key?(:is) ? option.value.fetch(:is) : option.value
|
22
22
|
else
|
@@ -39,9 +39,10 @@ module Servactory
|
|
39
39
|
end
|
40
40
|
|
41
41
|
def create_instance_variables
|
42
|
-
Servactory::Inputs.
|
42
|
+
inputs_class = Servactory::Inputs.dup
|
43
|
+
inputs_class.class_eval(class_inputs_template) if class_inputs_template.present?
|
43
44
|
|
44
|
-
@context.assign_inputs(
|
45
|
+
@context.assign_inputs(inputs_class.new(**@inputs_variables))
|
45
46
|
|
46
47
|
@context.class.class_eval(context_internal_variables_template) if context_internal_variables_template.present?
|
47
48
|
|
@@ -54,10 +55,6 @@ module Servactory
|
|
54
55
|
|
55
56
|
# EXAMPLE:
|
56
57
|
#
|
57
|
-
# attr_reader(*[:attr_1]); def initialize(attr_1); @attr_1 = attr_1; end
|
58
|
-
#
|
59
|
-
# OR
|
60
|
-
#
|
61
58
|
# attr_reader(*[:attr_1, :attr_2, :attr_3])
|
62
59
|
#
|
63
60
|
# def initialize(attr_1:, attr_2:, attr_3:)
|
@@ -65,26 +62,30 @@ module Servactory
|
|
65
62
|
# end
|
66
63
|
#
|
67
64
|
def class_inputs_template
|
68
|
-
|
69
|
-
attr_reader(*#{@inputs_variables.keys});
|
65
|
+
return if @inputs_variables.blank?
|
70
66
|
|
71
|
-
|
72
|
-
|
67
|
+
@class_inputs_template ||= <<-RUBY
|
68
|
+
attr_reader(*#{@inputs_variables.keys})
|
69
|
+
|
70
|
+
def initialize(#{@inputs_variables.keys.join(':, ')}:)
|
71
|
+
#{@inputs_variables.keys.map { |key| "@#{key} = #{key}" }.join('; ')}
|
73
72
|
end
|
74
73
|
RUBY
|
75
74
|
end
|
76
75
|
|
77
76
|
# EXAMPLE:
|
78
77
|
#
|
79
|
-
# private
|
78
|
+
# private
|
79
|
+
#
|
80
|
+
# attr_reader(*[:attr_1])
|
80
81
|
#
|
81
82
|
def context_internal_variables_template
|
82
83
|
return if @internal_variables.blank?
|
83
84
|
|
84
|
-
@context_internal_variables_template ||= <<-RUBY
|
85
|
-
private
|
85
|
+
@context_internal_variables_template ||= <<-RUBY
|
86
|
+
private
|
86
87
|
|
87
|
-
attr_reader(*#{@internal_variables.keys})
|
88
|
+
attr_reader(*#{@internal_variables.keys})
|
88
89
|
RUBY
|
89
90
|
end
|
90
91
|
end
|
data/lib/servactory/inputs.rb
CHANGED
@@ -1,7 +1,9 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module Servactory
|
4
|
-
class Inputs
|
5
|
-
|
4
|
+
class Inputs
|
5
|
+
def initialize(**)
|
6
|
+
# NOTE: Look at the file `lib/servactory/input_arguments/tools/prepare.rb`
|
7
|
+
end
|
6
8
|
end
|
7
9
|
end
|
@@ -29,29 +29,29 @@ module Servactory
|
|
29
29
|
|
30
30
|
# EXAMPLE:
|
31
31
|
#
|
32
|
-
# define_method(:user=) do |value
|
33
|
-
# Servactory::InternalArguments::Checks::Type.check!( context: self, internal_argument:, value: )
|
32
|
+
# define_method(:user=) do |value|
|
33
|
+
# Servactory::InternalArguments::Checks::Type.check!( context: self, internal_argument:, value: )
|
34
34
|
#
|
35
|
-
# instance_variable_set(:@user, value)
|
36
|
-
# end
|
35
|
+
# instance_variable_set(:@user, value)
|
36
|
+
# end
|
37
37
|
#
|
38
|
-
# private attr_reader :user
|
38
|
+
# private attr_reader :user
|
39
39
|
#
|
40
40
|
def context_internal_argument_template_for(internal_argument)
|
41
|
-
<<-RUBY
|
42
|
-
define_method(:#{internal_argument.name}=) do |value
|
41
|
+
<<-RUBY
|
42
|
+
define_method(:#{internal_argument.name}=) do |value|
|
43
43
|
Servactory::InternalArguments::Checks::Type.check!(
|
44
44
|
context: self,
|
45
45
|
internal_argument: internal_argument,
|
46
46
|
value: value
|
47
|
-
)
|
47
|
+
)
|
48
48
|
|
49
|
-
instance_variable_set(:@#{internal_argument.name}, value)
|
50
|
-
end
|
49
|
+
instance_variable_set(:@#{internal_argument.name}, value)
|
50
|
+
end
|
51
51
|
|
52
|
-
private
|
52
|
+
private
|
53
53
|
|
54
|
-
attr_reader :#{internal_argument.name}
|
54
|
+
attr_reader :#{internal_argument.name}
|
55
55
|
RUBY
|
56
56
|
end
|
57
57
|
end
|
@@ -29,31 +29,31 @@ module Servactory
|
|
29
29
|
|
30
30
|
# EXAMPLE:
|
31
31
|
#
|
32
|
-
# define_method(:user=) do |value
|
33
|
-
# Servactory::InternalArguments::Checks::Type.check!( context: self, output_argument:, value: )
|
32
|
+
# define_method(:user=) do |value|
|
33
|
+
# Servactory::InternalArguments::Checks::Type.check!( context: self, output_argument:, value: )
|
34
34
|
#
|
35
|
-
# instance_variable_set(:@user, value)
|
36
|
-
# end
|
35
|
+
# instance_variable_set(:@user, value)
|
36
|
+
# end
|
37
37
|
#
|
38
|
-
# private
|
38
|
+
# private
|
39
39
|
#
|
40
|
-
# attr_reader :user
|
40
|
+
# attr_reader :user
|
41
41
|
#
|
42
42
|
def context_output_argument_template_for(output_argument)
|
43
|
-
<<-RUBY
|
44
|
-
define_method(:#{output_argument.name}=) do |value
|
43
|
+
<<-RUBY
|
44
|
+
define_method(:#{output_argument.name}=) do |value|
|
45
45
|
Servactory::OutputArguments::Checks::Type.check!(
|
46
46
|
context: self,
|
47
47
|
output_argument: output_argument,
|
48
48
|
value: value
|
49
|
-
)
|
49
|
+
)
|
50
50
|
|
51
|
-
instance_variable_set(:@#{output_argument.name}, value)
|
52
|
-
end
|
51
|
+
instance_variable_set(:@#{output_argument.name}, value)
|
52
|
+
end
|
53
53
|
|
54
|
-
private
|
54
|
+
private
|
55
55
|
|
56
|
-
attr_reader :#{output_argument.name}
|
56
|
+
attr_reader :#{output_argument.name}
|
57
57
|
RUBY
|
58
58
|
end
|
59
59
|
end
|
data/lib/servactory/version.rb
CHANGED
data/lib/servactory.rb
CHANGED
@@ -17,11 +17,11 @@ module Servactory
|
|
17
17
|
module_function
|
18
18
|
|
19
19
|
def configuration
|
20
|
-
@configuration ||= Servactory::Configuration.new
|
20
|
+
@configuration ||= Servactory::Configuration::Setup.new
|
21
21
|
end
|
22
22
|
|
23
23
|
def reset
|
24
|
-
@configuration = Servactory::Configuration.new
|
24
|
+
@configuration = Servactory::Configuration::Setup.new
|
25
25
|
end
|
26
26
|
|
27
27
|
def configure
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: servactory
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.4.
|
4
|
+
version: 1.4.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Anton Sokolov
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-05-
|
11
|
+
date: 2023-05-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: zeitwerk
|
@@ -161,10 +161,16 @@ files:
|
|
161
161
|
- Rakefile
|
162
162
|
- lib/servactory.rb
|
163
163
|
- lib/servactory/base.rb
|
164
|
-
- lib/servactory/configuration.rb
|
164
|
+
- lib/servactory/configuration/dsl.rb
|
165
|
+
- lib/servactory/configuration/factory.rb
|
166
|
+
- lib/servactory/configuration/setup.rb
|
167
|
+
- lib/servactory/context/callable.rb
|
165
168
|
- lib/servactory/context/configuration.rb
|
166
169
|
- lib/servactory/context/dsl.rb
|
167
170
|
- lib/servactory/context/store.rb
|
171
|
+
- lib/servactory/context/workspace.rb
|
172
|
+
- lib/servactory/context/workspace/error.rb
|
173
|
+
- lib/servactory/context/workspace/errors.rb
|
168
174
|
- lib/servactory/errors/base.rb
|
169
175
|
- lib/servactory/errors/failure.rb
|
170
176
|
- lib/servactory/errors/input_argument_error.rb
|
@@ -1,18 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Servactory
|
4
|
-
class Configuration
|
5
|
-
attr_accessor :input_argument_error_class,
|
6
|
-
:internal_argument_error_class,
|
7
|
-
:output_argument_error_class,
|
8
|
-
:failure_class
|
9
|
-
|
10
|
-
def initialize
|
11
|
-
@input_argument_error_class = Servactory::Errors::InputArgumentError
|
12
|
-
@internal_argument_error_class = Servactory::Errors::InternalArgumentError
|
13
|
-
@output_argument_error_class = Servactory::Errors::OutputArgumentError
|
14
|
-
|
15
|
-
@failure_class = Servactory::Errors::Failure
|
16
|
-
end
|
17
|
-
end
|
18
|
-
end
|