servactory 1.9.6 → 2.0.1
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/config/locales/en.yml +19 -4
- data/config/locales/ru.yml +21 -6
- data/lib/servactory/{methods/method.rb → actions/action.rb} +2 -2
- data/lib/servactory/{methods/aliases_for_make → actions/aliases}/collection.rb +2 -2
- data/lib/servactory/{methods/method_collection.rb → actions/collection.rb} +3 -3
- data/lib/servactory/{methods → actions}/dsl.rb +9 -9
- data/lib/servactory/{methods/shortcuts_for_make → actions/shortcuts}/collection.rb +2 -2
- data/lib/servactory/actions/stages/collection.rb +20 -0
- data/lib/servactory/actions/stages/stage.rb +30 -0
- data/lib/servactory/{methods → actions}/tools/runner.rb +1 -1
- data/lib/servactory/{methods → actions}/workspace.rb +4 -2
- data/lib/servactory/base.rb +1 -1
- data/lib/servactory/configuration/dsl.rb +4 -2
- data/lib/servactory/configuration/factory.rb +12 -4
- data/lib/servactory/configuration/setup.rb +24 -8
- data/lib/servactory/context/workspace/inputs.rb +43 -7
- data/lib/servactory/context/workspace/outputs.rb +1 -1
- data/lib/servactory/context/workspace.rb +0 -4
- data/lib/servactory/dsl.rb +18 -1
- data/lib/servactory/inputs/collection.rb +1 -1
- data/lib/servactory/inputs/dsl.rb +2 -0
- data/lib/servactory/inputs/input.rb +106 -88
- data/lib/servactory/inputs/tools/distributor.rb +24 -0
- data/lib/servactory/inputs/tools/rules.rb +3 -3
- data/lib/servactory/inputs/tools/{find_unnecessary.rb → unnecessary.rb} +4 -4
- data/lib/servactory/inputs/tools/validation.rb +5 -7
- data/lib/servactory/inputs/validations/base.rb +1 -1
- data/lib/servactory/inputs/validations/inclusion.rb +15 -10
- data/lib/servactory/inputs/validations/must.rb +26 -17
- data/lib/servactory/inputs/validations/required.rb +16 -11
- data/lib/servactory/inputs/validations/type.rb +19 -69
- data/lib/servactory/inputs/workspace.rb +6 -3
- data/lib/servactory/internals/dsl.rb +6 -1
- data/lib/servactory/internals/internal.rb +81 -14
- data/lib/servactory/internals/validations/base.rb +1 -1
- data/lib/servactory/internals/validations/type.rb +6 -43
- data/lib/servactory/maintenance/attributes/define_conflict.rb +15 -0
- data/lib/servactory/maintenance/attributes/define_method.rb +17 -0
- data/lib/servactory/maintenance/attributes/option.rb +121 -0
- data/lib/servactory/maintenance/attributes/option_helper.rb +17 -0
- data/lib/servactory/maintenance/attributes/option_helpers_collection.rb +20 -0
- data/lib/servactory/maintenance/attributes/options_collection.rb +48 -0
- data/lib/servactory/maintenance/collection_mode/class_names_collection.rb +16 -0
- data/lib/servactory/maintenance/hash_mode/class_names_collection.rb +16 -0
- data/lib/servactory/maintenance/validations/collection.rb +66 -0
- data/lib/servactory/maintenance/validations/object_schema.rb +116 -0
- data/lib/servactory/maintenance/validations/types.rb +181 -0
- data/lib/servactory/outputs/dsl.rb +6 -1
- data/lib/servactory/outputs/output.rb +79 -19
- data/lib/servactory/outputs/validations/base.rb +1 -1
- data/lib/servactory/outputs/validations/type.rb +6 -45
- data/lib/servactory/version.rb +5 -4
- data/lib/servactory.rb +1 -1
- metadata +56 -30
- data/lib/servactory/inputs/define_input_conflict.rb +0 -13
- data/lib/servactory/inputs/define_input_method.rb +0 -15
- data/lib/servactory/inputs/option.rb +0 -98
- data/lib/servactory/inputs/option_helper.rb +0 -15
- data/lib/servactory/inputs/option_helpers_collection.rb +0 -18
- data/lib/servactory/inputs/options_collection.rb +0 -46
- data/lib/servactory/methods/stage.rb +0 -28
- data/lib/servactory/methods/stage_collection.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: a360afbf0c2646c3509ad3f37cb49e4a59453ded9f741a012965d962565285e4
|
4
|
+
data.tar.gz: 47a2bca86fc7622a7fa5e8a70bbb9cac4c179e3a43ee67ee050e6c5dd7b0cb21
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d6e1c489135e42759ee1bae986ed590aaf01164f8243a77b24a8a0b13d37056f4f5de3b86c1b741a94bbee8abe87656be6ad351818de32cc01a255af68d4db7e
|
7
|
+
data.tar.gz: 379633b8ddee7e378eafabacc9b97ced01375daa8612ce6b162c054674a6aac825093670602a92e2b03594c76f4f5dc22de9cbec25dcfa3770b0e73f102860fa
|
data/config/locales/en.yml
CHANGED
@@ -13,11 +13,14 @@ en:
|
|
13
13
|
required:
|
14
14
|
default_error:
|
15
15
|
default: "[%{service_class_name}] Required input `%{input_name}` is missing"
|
16
|
-
|
16
|
+
for_collection: "[%{service_class_name}] Required element in input collection `%{input_name}` is missing"
|
17
17
|
type:
|
18
18
|
default_error:
|
19
19
|
default: "[%{service_class_name}] Wrong type of input `%{input_name}`, expected `%{expected_type}`, got `%{given_type}`"
|
20
|
-
|
20
|
+
for_collection:
|
21
|
+
wrong_element_type: "[%{service_class_name}] Wrong type in input collection `%{input_name}`, expected `%{expected_type}`, got `%{given_type}`"
|
22
|
+
for_hash:
|
23
|
+
wrong_element_type: "[%{service_class_name}] Wrong type in input hash `%{input_name}`, expected `%{expected_type}` for `%{key_name}`, got `%{given_type}`"
|
21
24
|
tools:
|
22
25
|
find_unnecessary:
|
23
26
|
error: "[%{service_class_name}] Unexpected attributes: `%{unnecessary_attributes}`"
|
@@ -29,14 +32,26 @@ en:
|
|
29
32
|
setter: "[%{service_class_name}] Undefined internal attribute `%{internal_name}`"
|
30
33
|
checks:
|
31
34
|
type:
|
32
|
-
default_error:
|
35
|
+
default_error:
|
36
|
+
default: "[%{service_class_name}] Wrong type of internal attribute `%{internal_name}`, expected `%{expected_type}`, got `%{given_type}`"
|
37
|
+
for_collection:
|
38
|
+
wrong_type: "[%{service_class_name}] Wrong internal attribute collection type `%{internal_name}`, expected `%{expected_type}`, got `%{given_type}`"
|
39
|
+
wrong_element_type: "[%{service_class_name}] Wrong element type in internal attribute collection `%{internal_name}`, expected `%{expected_type}`"
|
40
|
+
for_hash:
|
41
|
+
wrong_element_type: "[%{service_class_name}] Wrong type in internal attribute hash `%{internal_name}`, expected `%{expected_type}` for `%{key_name}`, got `%{given_type}`"
|
33
42
|
outputs:
|
34
43
|
undefined:
|
35
44
|
getter: "[%{service_class_name}] Undefined output attribute `%{output_name}`"
|
36
45
|
setter: "[%{service_class_name}] Undefined output attribute `%{output_name}`"
|
37
46
|
checks:
|
38
47
|
type:
|
39
|
-
default_error:
|
48
|
+
default_error:
|
49
|
+
default: "[%{service_class_name}] Wrong type of output attribute `%{output_name}`, expected `%{expected_type}`, got `%{given_type}`"
|
50
|
+
for_collection:
|
51
|
+
wrong_type: "[%{service_class_name}] Wrong output attribute collection type `%{output_name}`, expected `%{expected_type}`, got `%{given_type}`"
|
52
|
+
wrong_element_type: "[%{service_class_name}] Wrong element type in output attribute collection `%{output_name}`, expected `%{expected_type}`"
|
53
|
+
for_hash:
|
54
|
+
wrong_element_type: "[%{service_class_name}] Wrong type in output attribute hash `%{output_name}`, expected `%{expected_type}` for `%{key_name}`, got `%{given_type}`"
|
40
55
|
methods:
|
41
56
|
call:
|
42
57
|
not_used: Nothing to perform. Use `make` or create a `call` method.
|
data/config/locales/ru.yml
CHANGED
@@ -6,18 +6,22 @@ ru:
|
|
6
6
|
setter: "[%{service_class_name}] Неизвестный входящий атрибут `%{input_name}`"
|
7
7
|
checks:
|
8
8
|
inclusion:
|
9
|
-
default_error: "[%{service_class_name}]
|
9
|
+
default_error: "[%{service_class_name}] Неправильное значение в `%{input_name}`, должно быть одним из `%{input_inclusion}`"
|
10
10
|
must:
|
11
11
|
default_error: "[%{service_class_name}] Инпут `%{input_name}` должен \"%{code}\""
|
12
12
|
syntax_error: "[%{service_class_name}] Синтаксическая ошибка внутри `%{code}` инпута `%{input_name}`"
|
13
13
|
required:
|
14
14
|
default_error:
|
15
15
|
default: "[%{service_class_name}] Обязательный инпут `%{input_name}` отсутствует"
|
16
|
-
|
16
|
+
for_collection: "[%{service_class_name}] Обязательный элемент в коллекции инпута `%{input_name}` отсутствует"
|
17
17
|
type:
|
18
18
|
default_error:
|
19
|
-
default: "[%{service_class_name}]
|
20
|
-
|
19
|
+
default: "[%{service_class_name}] Неправильный тип инпута `%{input_name}`, ожидалось `%{expected_type}`, получено `%{given_type}`"
|
20
|
+
for_collection:
|
21
|
+
wrong_element_type: "[%{service_class_name}] Неправильный тип в коллекции инпута `%{input_name}`, ожидалось `%{expected_type}`, получено `%{given_type}`"
|
22
|
+
for_hash:
|
23
|
+
wrong_element_type: "[%{service_class_name}] Неправильный тип в хеше инпута `%{input_name}`, для `%{key_name}` ожидалось `%{expected_type}`, получено `%{given_type}`"
|
24
|
+
|
21
25
|
tools:
|
22
26
|
find_unnecessary:
|
23
27
|
error: "[%{service_class_name}] Неожиданные атрибуты: `%{unnecessary_attributes}`"
|
@@ -29,14 +33,25 @@ ru:
|
|
29
33
|
setter: "[%{service_class_name}] Неизвестный внутренний атрибут `%{internal_name}`"
|
30
34
|
checks:
|
31
35
|
type:
|
32
|
-
default_error:
|
36
|
+
default_error:
|
37
|
+
default: "[%{service_class_name}] Неправильный тип внутреннего атрибута `%{internal_name}`, ожидалось `%{expected_type}`, получено `%{given_type}`"
|
38
|
+
for_collection:
|
39
|
+
wrong_type: "[%{service_class_name}] Неправильный тип коллекции внутреннего атрибута `%{internal_name}`, ожидалось `%{expected_type}`, получено `%{given_type}`"
|
40
|
+
wrong_element_type: "[%{service_class_name}] Неправильный тип элемента в коллекции внутреннего атрибута `%{internal_name}`, ожидалось `%{expected_type}`"
|
41
|
+
for_hash:
|
42
|
+
wrong_element_type: "[%{service_class_name}] Неправильный тип в хеше внутреннего атрибута `%{internal_name}`, для `%{key_name}` ожидалось `%{expected_type}`, получено `%{given_type}`"
|
33
43
|
outputs:
|
34
44
|
undefined:
|
35
45
|
getter: "[%{service_class_name}] Неизвестный выходящий атрибут `%{output_name}`"
|
36
46
|
setter: "[%{service_class_name}] Неизвестный выходящий атрибут `%{output_name}`"
|
37
47
|
checks:
|
38
48
|
type:
|
39
|
-
|
49
|
+
default: "[%{service_class_name}] Неправильный тип выходящего атрибута `%{output_name}`, ожидалось `%{expected_type}`, получено `%{given_type}`"
|
50
|
+
for_collection:
|
51
|
+
wrong_type: "[%{service_class_name}] Неправильный тип коллекции выходящего атрибута `%{output_name}`, ожидалось `%{expected_type}`, получено `%{given_type}`"
|
52
|
+
wrong_element_type: "[%{service_class_name}] Неправильный тип элемента в коллекции выходящего атрибута `%{output_name}`, ожидалось `%{expected_type}`"
|
53
|
+
for_hash:
|
54
|
+
wrong_element_type: "[%{service_class_name}] Неправильный тип в хеше выходящего атрибута `%{output_name}`, для `%{key_name}` ожидалось `%{expected_type}`, получено `%{given_type}`"
|
40
55
|
methods:
|
41
56
|
call:
|
42
57
|
not_used: Нечего исполнять. Используйте `make` или создайте метод `call`.
|
@@ -1,8 +1,8 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module Servactory
|
4
|
-
module
|
5
|
-
class
|
4
|
+
module Actions
|
5
|
+
class Collection
|
6
6
|
extend Forwardable
|
7
7
|
def_delegators :@collection, :<<, :each, :sort_by
|
8
8
|
|
@@ -11,7 +11,7 @@ module Servactory
|
|
11
11
|
end
|
12
12
|
|
13
13
|
def sorted_by_position
|
14
|
-
|
14
|
+
Collection.new(sort_by(&:position))
|
15
15
|
end
|
16
16
|
end
|
17
17
|
end
|
@@ -1,7 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module Servactory
|
4
|
-
module
|
4
|
+
module Actions
|
5
5
|
module DSL
|
6
6
|
def self.included(base)
|
7
7
|
base.extend(ClassMethods)
|
@@ -18,7 +18,7 @@ module Servactory
|
|
18
18
|
private
|
19
19
|
|
20
20
|
def stage(&block)
|
21
|
-
@current_stage = Stage.new(position: next_position)
|
21
|
+
@current_stage = Stages::Stage.new(position: next_position)
|
22
22
|
|
23
23
|
instance_eval(&block)
|
24
24
|
|
@@ -56,9 +56,9 @@ module Servactory
|
|
56
56
|
def make(name, position: nil, **options)
|
57
57
|
position = position.presence || next_position
|
58
58
|
|
59
|
-
current_stage = @current_stage.presence || Stage.new(position: position)
|
59
|
+
current_stage = @current_stage.presence || Stages::Stage.new(position: position)
|
60
60
|
|
61
|
-
current_stage.methods <<
|
61
|
+
current_stage.methods << Action.new(
|
62
62
|
name,
|
63
63
|
position: position,
|
64
64
|
**options
|
@@ -68,14 +68,14 @@ module Servactory
|
|
68
68
|
end
|
69
69
|
|
70
70
|
def method_missing(name, *args, &block)
|
71
|
-
return
|
71
|
+
return method_missing_for_action_aliases(name, *args, &block) if config.action_aliases.include?(name)
|
72
72
|
|
73
|
-
return method_missing_for_shortcuts_for_make(name, *args, &block) if config.
|
73
|
+
return method_missing_for_shortcuts_for_make(name, *args, &block) if config.action_shortcuts.include?(name)
|
74
74
|
|
75
75
|
super
|
76
76
|
end
|
77
77
|
|
78
|
-
def
|
78
|
+
def method_missing_for_action_aliases(_alias_name, *args, &block) # rubocop:disable Lint/UnusedMethodArgument
|
79
79
|
method_name = args.first
|
80
80
|
method_options = args.last.is_a?(Hash) ? args.pop : {}
|
81
81
|
|
@@ -93,7 +93,7 @@ module Servactory
|
|
93
93
|
end
|
94
94
|
|
95
95
|
def respond_to_missing?(name, *)
|
96
|
-
config.
|
96
|
+
config.action_aliases.include?(name) || config.action_shortcuts.include?(name) || super
|
97
97
|
end
|
98
98
|
|
99
99
|
def next_position
|
@@ -101,7 +101,7 @@ module Servactory
|
|
101
101
|
end
|
102
102
|
|
103
103
|
def collection_of_stages
|
104
|
-
@collection_of_stages ||=
|
104
|
+
@collection_of_stages ||= Stages::Collection.new
|
105
105
|
end
|
106
106
|
end
|
107
107
|
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Servactory
|
4
|
+
module Actions
|
5
|
+
module Stages
|
6
|
+
class Collection
|
7
|
+
extend Forwardable
|
8
|
+
def_delegators :@collection, :<<, :each, :merge, :sort_by, :size, :empty?
|
9
|
+
|
10
|
+
def initialize(collection = Set.new)
|
11
|
+
@collection = collection
|
12
|
+
end
|
13
|
+
|
14
|
+
def sorted_by_position
|
15
|
+
Collection.new(sort_by(&:position))
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Servactory
|
4
|
+
module Actions
|
5
|
+
module Stages
|
6
|
+
class Stage
|
7
|
+
attr_accessor :position,
|
8
|
+
:wrapper,
|
9
|
+
:rollback,
|
10
|
+
:condition,
|
11
|
+
:is_condition_opposite
|
12
|
+
|
13
|
+
def initialize(position:, wrapper: nil, rollback: nil, condition: nil)
|
14
|
+
@position = position
|
15
|
+
@wrapper = wrapper
|
16
|
+
@rollback = rollback
|
17
|
+
@condition = condition
|
18
|
+
end
|
19
|
+
|
20
|
+
def next_method_position
|
21
|
+
methods.size + 1
|
22
|
+
end
|
23
|
+
|
24
|
+
def methods
|
25
|
+
@methods ||= Collection.new
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -1,12 +1,14 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module Servactory
|
4
|
-
module
|
4
|
+
module Actions
|
5
5
|
module Workspace
|
6
|
+
private
|
7
|
+
|
6
8
|
def call!(collection_of_stages:, **)
|
7
9
|
super
|
8
10
|
|
9
|
-
Servactory::
|
11
|
+
Servactory::Actions::Tools::Runner.run!(self, collection_of_stages)
|
10
12
|
end
|
11
13
|
end
|
12
14
|
end
|
data/lib/servactory/base.rb
CHANGED
@@ -17,10 +17,12 @@ module Servactory
|
|
17
17
|
|
18
18
|
child.config.failure_class = config.failure_class
|
19
19
|
|
20
|
+
child.config.collection_mode_class_names = config.collection_mode_class_names
|
21
|
+
|
20
22
|
child.config.input_option_helpers = config.input_option_helpers
|
21
23
|
|
22
|
-
child.config.
|
23
|
-
child.config.
|
24
|
+
child.config.action_aliases = config.action_aliases
|
25
|
+
child.config.action_shortcuts = config.action_shortcuts
|
24
26
|
end
|
25
27
|
|
26
28
|
def config
|
@@ -23,16 +23,24 @@ module Servactory
|
|
23
23
|
@config.failure_class = failure_class
|
24
24
|
end
|
25
25
|
|
26
|
+
def collection_mode_class_names(collection_mode_class_names)
|
27
|
+
@config.collection_mode_class_names.merge(collection_mode_class_names)
|
28
|
+
end
|
29
|
+
|
30
|
+
def hash_mode_class_names(hash_mode_class_names)
|
31
|
+
@config.hash_mode_class_names.merge(hash_mode_class_names)
|
32
|
+
end
|
33
|
+
|
26
34
|
def input_option_helpers(input_option_helpers)
|
27
35
|
@config.input_option_helpers.merge(input_option_helpers)
|
28
36
|
end
|
29
37
|
|
30
|
-
def
|
31
|
-
@config.
|
38
|
+
def action_aliases(action_aliases)
|
39
|
+
@config.action_aliases.merge(action_aliases)
|
32
40
|
end
|
33
41
|
|
34
|
-
def
|
35
|
-
@config.
|
42
|
+
def action_shortcuts(action_shortcuts)
|
43
|
+
@config.action_shortcuts.merge(action_shortcuts)
|
36
44
|
end
|
37
45
|
end
|
38
46
|
end
|
@@ -7,29 +7,45 @@ module Servactory
|
|
7
7
|
:internal_error_class,
|
8
8
|
:output_error_class,
|
9
9
|
:failure_class,
|
10
|
+
:collection_mode_class_names,
|
11
|
+
:hash_mode_class_names,
|
10
12
|
:input_option_helpers,
|
11
|
-
:
|
12
|
-
:
|
13
|
+
:action_aliases,
|
14
|
+
:action_shortcuts
|
13
15
|
|
14
|
-
def initialize
|
16
|
+
def initialize # rubocop:disable Metrics/MethodLength
|
15
17
|
@input_error_class = Servactory::Errors::InputError
|
16
18
|
@internal_error_class = Servactory::Errors::InternalError
|
17
19
|
@output_error_class = Servactory::Errors::OutputError
|
18
20
|
|
19
21
|
@failure_class = Servactory::Errors::Failure
|
20
22
|
|
21
|
-
@
|
23
|
+
@collection_mode_class_names =
|
24
|
+
Servactory::Maintenance::CollectionMode::ClassNamesCollection.new(default_collection_mode_class_names)
|
22
25
|
|
23
|
-
@
|
24
|
-
|
26
|
+
@hash_mode_class_names =
|
27
|
+
Servactory::Maintenance::HashMode::ClassNamesCollection.new(default_hash_mode_class_names)
|
28
|
+
|
29
|
+
@input_option_helpers =
|
30
|
+
Servactory::Maintenance::Attributes::OptionHelpersCollection.new(default_input_option_helpers)
|
31
|
+
|
32
|
+
@action_aliases = Servactory::Actions::Aliases::Collection.new
|
33
|
+
@action_shortcuts = Servactory::Actions::Shortcuts::Collection.new
|
25
34
|
end
|
26
35
|
|
27
36
|
private
|
28
37
|
|
38
|
+
def default_collection_mode_class_names
|
39
|
+
Set[Array, Set]
|
40
|
+
end
|
41
|
+
|
42
|
+
def default_hash_mode_class_names
|
43
|
+
Set[Hash]
|
44
|
+
end
|
45
|
+
|
29
46
|
def default_input_option_helpers
|
30
47
|
Set[
|
31
|
-
Servactory::
|
32
|
-
Servactory::Inputs::OptionHelper.new(name: :as_array, equivalent: { array: true })
|
48
|
+
Servactory::Maintenance::Attributes::OptionHelper.new(name: :optional, equivalent: { required: false }),
|
33
49
|
]
|
34
50
|
end
|
35
51
|
end
|
@@ -4,9 +4,11 @@ module Servactory
|
|
4
4
|
module Context
|
5
5
|
module Workspace
|
6
6
|
class Inputs
|
7
|
-
|
7
|
+
RESERVED_ATTRIBUTES = %i[type required default].freeze
|
8
|
+
private_constant :RESERVED_ATTRIBUTES
|
9
|
+
|
10
|
+
def initialize(context:, collection_of_inputs:)
|
8
11
|
@context = context
|
9
|
-
@incoming_arguments = incoming_arguments
|
10
12
|
@collection_of_inputs = collection_of_inputs
|
11
13
|
end
|
12
14
|
|
@@ -44,19 +46,53 @@ module Servactory
|
|
44
46
|
|
45
47
|
return yield if input.nil?
|
46
48
|
|
47
|
-
|
48
|
-
|
49
|
+
input.value = input.default if input.optional? && input.value.blank?
|
50
|
+
|
51
|
+
if input.hash_mode? && (tmp_schema = input.schema.fetch(:is)).present?
|
52
|
+
input.value = prepare_hash_values_inside(object: input.value, schema: tmp_schema)
|
53
|
+
end
|
49
54
|
|
50
55
|
input_prepare = input.prepare.fetch(:in, nil)
|
51
|
-
|
56
|
+
input.value = input_prepare.call(value: input.value) if input_prepare.present?
|
52
57
|
|
53
58
|
if name.to_s.end_with?("?")
|
54
|
-
Servactory::Utils.query_attribute(
|
59
|
+
Servactory::Utils.query_attribute(input.value)
|
55
60
|
else
|
56
|
-
|
61
|
+
input.value
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
def prepare_hash_values_inside(object:, schema:) # rubocop:disable Metrics/MethodLength
|
66
|
+
return object unless object.respond_to?(:fetch)
|
67
|
+
|
68
|
+
schema.to_h do |schema_key, schema_value|
|
69
|
+
attribute_type = schema_value.fetch(:type, String)
|
70
|
+
|
71
|
+
result =
|
72
|
+
if attribute_type == Hash
|
73
|
+
prepare_hash_values_inside(
|
74
|
+
object: object.fetch(schema_key, {}),
|
75
|
+
schema: schema_value.except(*RESERVED_ATTRIBUTES)
|
76
|
+
)
|
77
|
+
else
|
78
|
+
fetch_hash_values_from(
|
79
|
+
value: object.fetch(schema_key, {}),
|
80
|
+
schema_value: schema_value,
|
81
|
+
attribute_required: schema_value.fetch(:required, true)
|
82
|
+
)
|
83
|
+
end
|
84
|
+
|
85
|
+
[schema_key, result]
|
57
86
|
end
|
58
87
|
end
|
59
88
|
|
89
|
+
def fetch_hash_values_from(value:, schema_value:, attribute_required:)
|
90
|
+
return value if attribute_required
|
91
|
+
return value if value.present?
|
92
|
+
|
93
|
+
schema_value.fetch(:default, nil)
|
94
|
+
end
|
95
|
+
|
60
96
|
def raise_error_for(type, name)
|
61
97
|
message_text = I18n.t(
|
62
98
|
"servactory.inputs.undefined.#{type}",
|
@@ -40,7 +40,7 @@ module Servactory
|
|
40
40
|
def setter_with(prepared_name:, value:, &block) # rubocop:disable Lint/UnusedMethodArgument
|
41
41
|
return yield unless @collection_of_outputs.names.include?(prepared_name)
|
42
42
|
|
43
|
-
output = @collection_of_outputs.find_by(name: prepared_name)
|
43
|
+
output = @collection_of_outputs.find_by(name: prepared_name)
|
44
44
|
|
45
45
|
return yield if output.nil?
|
46
46
|
|
@@ -6,11 +6,9 @@ module Servactory
|
|
6
6
|
def inputs
|
7
7
|
@inputs ||= Inputs.new(
|
8
8
|
context: self,
|
9
|
-
incoming_arguments: incoming_arguments,
|
10
9
|
collection_of_inputs: collection_of_inputs
|
11
10
|
)
|
12
11
|
end
|
13
|
-
alias inp inputs
|
14
12
|
|
15
13
|
def internals
|
16
14
|
@internals ||= Internals.new(
|
@@ -18,7 +16,6 @@ module Servactory
|
|
18
16
|
collection_of_internals: collection_of_internals
|
19
17
|
)
|
20
18
|
end
|
21
|
-
alias int internals
|
22
19
|
|
23
20
|
def outputs
|
24
21
|
@outputs ||= Outputs.new(
|
@@ -26,7 +23,6 @@ module Servactory
|
|
26
23
|
collection_of_outputs: collection_of_outputs
|
27
24
|
)
|
28
25
|
end
|
29
|
-
alias out outputs
|
30
26
|
|
31
27
|
def fail_input!(input_name, message:)
|
32
28
|
raise self.class.config.input_error_class.new(
|
data/lib/servactory/dsl.rb
CHANGED
@@ -2,6 +2,8 @@
|
|
2
2
|
|
3
3
|
module Servactory
|
4
4
|
module DSL
|
5
|
+
@extensions = []
|
6
|
+
|
5
7
|
def self.included(base)
|
6
8
|
base.include(Configuration::DSL)
|
7
9
|
base.include(Info::DSL)
|
@@ -9,7 +11,22 @@ module Servactory
|
|
9
11
|
base.include(Inputs::DSL)
|
10
12
|
base.include(Internals::DSL)
|
11
13
|
base.include(Outputs::DSL)
|
12
|
-
|
14
|
+
|
15
|
+
extensions.each { |extension| base.include(extension) }
|
16
|
+
|
17
|
+
base.include(Actions::DSL)
|
13
18
|
end
|
19
|
+
|
20
|
+
def self.with_extensions(*extensions)
|
21
|
+
@extensions = extensions
|
22
|
+
|
23
|
+
self
|
24
|
+
end
|
25
|
+
|
26
|
+
def self.extensions
|
27
|
+
@extensions
|
28
|
+
end
|
29
|
+
|
30
|
+
private_class_method :extensions
|
14
31
|
end
|
15
32
|
end
|
@@ -4,7 +4,7 @@ module Servactory
|
|
4
4
|
module Inputs
|
5
5
|
class Collection
|
6
6
|
extend Forwardable
|
7
|
-
def_delegators :@collection, :<<, :filter, :each, :map, :to_h, :merge, :find
|
7
|
+
def_delegators :@collection, :<<, :filter, :each, :map, :flat_map, :to_h, :merge, :find
|
8
8
|
|
9
9
|
def initialize(collection = Set.new)
|
10
10
|
@collection = collection
|
@@ -21,6 +21,8 @@ module Servactory
|
|
21
21
|
collection_of_inputs << Input.new(
|
22
22
|
name,
|
23
23
|
*helpers,
|
24
|
+
collection_mode_class_names: config.collection_mode_class_names,
|
25
|
+
hash_mode_class_names: config.hash_mode_class_names,
|
24
26
|
option_helpers: config.input_option_helpers,
|
25
27
|
**options
|
26
28
|
)
|