servactory 1.9.7 → 2.0.0.rc2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (46) hide show
  1. checksums.yaml +4 -4
  2. data/config/locales/en.yml +18 -4
  3. data/config/locales/ru.yml +20 -6
  4. data/lib/servactory/configuration/dsl.rb +2 -0
  5. data/lib/servactory/configuration/factory.rb +8 -0
  6. data/lib/servactory/configuration/setup.rb +20 -4
  7. data/lib/servactory/context/workspace/inputs.rb +41 -7
  8. data/lib/servactory/context/workspace/outputs.rb +1 -1
  9. data/lib/servactory/context/workspace.rb +0 -1
  10. data/lib/servactory/dsl.rb +17 -0
  11. data/lib/servactory/inputs/collection.rb +1 -1
  12. data/lib/servactory/inputs/dsl.rb +2 -0
  13. data/lib/servactory/inputs/input.rb +101 -82
  14. data/lib/servactory/inputs/tools/distributor.rb +24 -0
  15. data/lib/servactory/inputs/tools/rules.rb +3 -3
  16. data/lib/servactory/inputs/tools/{find_unnecessary.rb → unnecessary.rb} +4 -4
  17. data/lib/servactory/inputs/tools/validation.rb +5 -7
  18. data/lib/servactory/inputs/validations/inclusion.rb +14 -9
  19. data/lib/servactory/inputs/validations/must.rb +26 -17
  20. data/lib/servactory/inputs/validations/required.rb +15 -10
  21. data/lib/servactory/inputs/validations/type.rb +85 -34
  22. data/lib/servactory/inputs/workspace.rb +6 -3
  23. data/lib/servactory/internals/dsl.rb +6 -1
  24. data/lib/servactory/internals/internal.rb +82 -14
  25. data/lib/servactory/internals/validations/type.rb +110 -29
  26. data/lib/servactory/maintenance/attributes/define_conflict.rb +15 -0
  27. data/lib/servactory/maintenance/attributes/define_method.rb +17 -0
  28. data/lib/servactory/maintenance/attributes/option.rb +115 -0
  29. data/lib/servactory/maintenance/attributes/option_helper.rb +17 -0
  30. data/lib/servactory/maintenance/attributes/option_helpers_collection.rb +20 -0
  31. data/lib/servactory/maintenance/attributes/options_collection.rb +48 -0
  32. data/lib/servactory/maintenance/collection_mode/class_names_collection.rb +16 -0
  33. data/lib/servactory/maintenance/hash_mode/class_names_collection.rb +16 -0
  34. data/lib/servactory/maintenance/validations/object_schema.rb +119 -0
  35. data/lib/servactory/methods/workspace.rb +2 -0
  36. data/lib/servactory/outputs/dsl.rb +6 -1
  37. data/lib/servactory/outputs/output.rb +80 -19
  38. data/lib/servactory/outputs/validations/type.rb +110 -31
  39. data/lib/servactory/version.rb +5 -4
  40. metadata +15 -11
  41. data/lib/servactory/inputs/define_input_conflict.rb +0 -13
  42. data/lib/servactory/inputs/define_input_method.rb +0 -15
  43. data/lib/servactory/inputs/option.rb +0 -98
  44. data/lib/servactory/inputs/option_helper.rb +0 -15
  45. data/lib/servactory/inputs/option_helpers_collection.rb +0 -18
  46. data/lib/servactory/inputs/options_collection.rb +0 -46
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3c3038f0a3117da46c743b1a0e9cfd08581b19f7f34bff7e34efd27b1b194461
4
- data.tar.gz: 3f74d7bcc690787caf7ea703d385befeaabaec6fdbe5c956704df401fa1a3ce8
3
+ metadata.gz: 7138f6d9bc8c21740306eabe282daf762cefd3e0504c1a40761f7db5c2e904ab
4
+ data.tar.gz: '09dbc3c8168b68e0db456ba7f0e71242412d05c19fb78d45b25f2161b7b06202'
5
5
  SHA512:
6
- metadata.gz: a29637047ca7ee7ccf7b085ff0b95b68c0e6f8007edd527e13b90eb6bddd316a4831cd382077ccb36d5a178bc80c802c59db1f0ae12cf265dc398115ab59ad33
7
- data.tar.gz: 0eb1142cef9a086c29596da9ee4b6b7c237e79ffe1ef98df1f44fe30fb6f33ee3a13411ea7faa083fd9a7b58fca04d5b3a72d1b0c887c82953402ef1b4d25fdf
6
+ metadata.gz: 91f6501df9724f4f116dc03ee57863c7e732f77f8c97b9eae7e9ecf64e85fdb7e5f5c976dcf4c92337711566ea122283013ddc4e3d34b60dd970dc380cc3dd0f
7
+ data.tar.gz: bf86943b60422743c0b829cce81fc3f753315a5c129edb228a54a42170f352816c8a306cefd53a2c5199dedfd4801a3df10f7d34043d12f924f22db290fd9450
@@ -13,11 +13,13 @@ en:
13
13
  required:
14
14
  default_error:
15
15
  default: "[%{service_class_name}] Required input `%{input_name}` is missing"
16
- for_array: "[%{service_class_name}] Required element in input array `%{input_name}` is missing"
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
- for_array: "[%{service_class_name}] Wrong type in input array `%{input_name}`, expected `%{expected_type}`"
20
+ for_collection: "[%{service_class_name}] Wrong type in input collection `%{input_name}`, expected `%{expected_type}`"
21
+ for_hash:
22
+ wrong_element_type: "[%{service_class_name}] Wrong type in input hash `%{input_name}`, expected `%{expected_type}` for `%{key_name}`, got `%{given_type}`"
21
23
  tools:
22
24
  find_unnecessary:
23
25
  error: "[%{service_class_name}] Unexpected attributes: `%{unnecessary_attributes}`"
@@ -29,14 +31,26 @@ en:
29
31
  setter: "[%{service_class_name}] Undefined internal attribute `%{internal_name}`"
30
32
  checks:
31
33
  type:
32
- default_error: "[%{service_class_name}] Wrong type of internal attribute `%{internal_name}`, expected `%{expected_type}`, got `%{given_type}`"
34
+ default_error:
35
+ default: "[%{service_class_name}] Wrong type of internal attribute `%{internal_name}`, expected `%{expected_type}`, got `%{given_type}`"
36
+ for_collection:
37
+ wrong_type: "[%{service_class_name}] Wrong internal attribute collection type `%{internal_name}`, expected `%{expected_type}`, got `%{given_type}`"
38
+ wrong_element_type: "[%{service_class_name}] Wrong element type in internal attribute collection `%{internal_name}`, expected `%{expected_type}`"
39
+ for_hash:
40
+ wrong_element_type: "[%{service_class_name}] Wrong type in internal attribute hash `%{internal_name}`, expected `%{expected_type}` for `%{key_name}`, got `%{given_type}`"
33
41
  outputs:
34
42
  undefined:
35
43
  getter: "[%{service_class_name}] Undefined output attribute `%{output_name}`"
36
44
  setter: "[%{service_class_name}] Undefined output attribute `%{output_name}`"
37
45
  checks:
38
46
  type:
39
- default_error: "[%{service_class_name}] Wrong type of output attribute `%{output_name}`, expected `%{expected_type}`, got `%{given_type}`"
47
+ default_error:
48
+ default: "[%{service_class_name}] Wrong type of output attribute `%{output_name}`, expected `%{expected_type}`, got `%{given_type}`"
49
+ for_collection:
50
+ wrong_type: "[%{service_class_name}] Wrong output attribute collection type `%{output_name}`, expected `%{expected_type}`, got `%{given_type}`"
51
+ wrong_element_type: "[%{service_class_name}] Wrong element type in output attribute collection `%{output_name}`, expected `%{expected_type}`"
52
+ for_hash:
53
+ wrong_element_type: "[%{service_class_name}] Wrong type in output attribute hash `%{output_name}`, expected `%{expected_type}` for `%{key_name}`, got `%{given_type}`"
40
54
  methods:
41
55
  call:
42
56
  not_used: Nothing to perform. Use `make` or create a `call` method.
@@ -6,18 +6,21 @@ ru:
6
6
  setter: "[%{service_class_name}] Неизвестный входящий атрибут `%{input_name}`"
7
7
  checks:
8
8
  inclusion:
9
- default_error: "[%{service_class_name}] Неверное значение в `%{input_name}`, должно быть одним из `%{input_inclusion}`"
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
- for_array: "[%{service_class_name}] Обязательный элемент в инпуте-массиве `%{input_name}` отсутствует"
16
+ for_collection: "[%{service_class_name}] Обязательный элемент в коллекции инпута `%{input_name}` отсутствует"
17
17
  type:
18
18
  default_error:
19
- default: "[%{service_class_name}] Неверный тип инпута `%{input_name}`, ожидалось `%{expected_type}`, получено `%{given_type}`"
20
- for_array: "[%{service_class_name}] Неверный тип инпута-массива `%{input_name}`, ожидалось `%{expected_type}`"
19
+ default: "[%{service_class_name}] Неправильный тип инпута `%{input_name}`, ожидалось `%{expected_type}`, получено `%{given_type}`"
20
+ for_collection: "[%{service_class_name}] Неправильный тип в коллекции инпута `%{input_name}`, ожидалось `%{expected_type}`"
21
+ for_hash:
22
+ wrong_element_type: "[%{service_class_name}] Неправильный тип в хеше инпута `%{input_name}`, для `%{key_name}` ожидалось `%{expected_type}`, получено `%{given_type}`"
23
+
21
24
  tools:
22
25
  find_unnecessary:
23
26
  error: "[%{service_class_name}] Неожиданные атрибуты: `%{unnecessary_attributes}`"
@@ -29,14 +32,25 @@ ru:
29
32
  setter: "[%{service_class_name}] Неизвестный внутренний атрибут `%{internal_name}`"
30
33
  checks:
31
34
  type:
32
- default_error: "[%{service_class_name}] Неверный тип внутреннего атрибута `%{internal_name}`, ожидалось `%{expected_type}`, получено `%{given_type}`"
35
+ default_error:
36
+ default: "[%{service_class_name}] Неправильный тип внутреннего атрибута `%{internal_name}`, ожидалось `%{expected_type}`, получено `%{given_type}`"
37
+ for_collection:
38
+ wrong_type: "[%{service_class_name}] Неправильный тип коллекции внутреннего атрибута `%{internal_name}`, ожидалось `%{expected_type}`, получено `%{given_type}`"
39
+ wrong_element_type: "[%{service_class_name}] Неправильный тип элемента в коллекции внутреннего атрибута `%{internal_name}`, ожидалось `%{expected_type}`"
40
+ for_hash:
41
+ wrong_element_type: "[%{service_class_name}] Неправильный тип в хеше внутреннего атрибута `%{internal_name}`, для `%{key_name}` ожидалось `%{expected_type}`, получено `%{given_type}`"
33
42
  outputs:
34
43
  undefined:
35
44
  getter: "[%{service_class_name}] Неизвестный выходящий атрибут `%{output_name}`"
36
45
  setter: "[%{service_class_name}] Неизвестный выходящий атрибут `%{output_name}`"
37
46
  checks:
38
47
  type:
39
- default_error: "[%{service_class_name}] Неверный тип выходящего атрибута `%{output_name}`, ожидалось `%{expected_type}`, получено `%{given_type}`"
48
+ default: "[%{service_class_name}] Неправильный тип выходящего атрибута `%{output_name}`, ожидалось `%{expected_type}`, получено `%{given_type}`"
49
+ for_collection:
50
+ wrong_type: "[%{service_class_name}] Неправильный тип коллекции выходящего атрибута `%{output_name}`, ожидалось `%{expected_type}`, получено `%{given_type}`"
51
+ wrong_element_type: "[%{service_class_name}] Неправильный тип элемента в коллекции выходящего атрибута `%{output_name}`, ожидалось `%{expected_type}`"
52
+ for_hash:
53
+ wrong_element_type: "[%{service_class_name}] Неправильный тип в хеше выходящего атрибута `%{output_name}`, для `%{key_name}` ожидалось `%{expected_type}`, получено `%{given_type}`"
40
54
  methods:
41
55
  call:
42
56
  not_used: Нечего исполнять. Используйте `make` или создайте метод `call`.
@@ -17,6 +17,8 @@ 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
24
  child.config.aliases_for_make = config.aliases_for_make
@@ -23,6 +23,14 @@ 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.collection_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
@@ -7,18 +7,27 @@ 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
13
  :aliases_for_make,
12
14
  :shortcuts_for_make
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
- @input_option_helpers = Servactory::Inputs::OptionHelpersCollection.new(default_input_option_helpers)
23
+ @collection_mode_class_names =
24
+ Servactory::Maintenance::CollectionMode::ClassNamesCollection.new(default_collection_mode_class_names)
25
+
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)
22
31
 
23
32
  @aliases_for_make = Servactory::Methods::AliasesForMake::Collection.new
24
33
  @shortcuts_for_make = Servactory::Methods::ShortcutsForMake::Collection.new
@@ -26,10 +35,17 @@ module Servactory
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::Inputs::OptionHelper.new(name: :optional, equivalent: { required: false }),
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
- def initialize(context:, incoming_arguments:, collection_of_inputs:)
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,51 @@ module Servactory
44
46
 
45
47
  return yield if input.nil?
46
48
 
47
- input_value = @incoming_arguments.fetch(input.name, nil)
48
- input_value = input.default if input.optional? && input_value.blank?
49
+ input.value = input.default if input.optional? && input.value.blank?
50
+
51
+ input.value = prepare_object_values_inside(object: input.value, schema: input.schema) if input.hash_mode?
49
52
 
50
53
  input_prepare = input.prepare.fetch(:in, nil)
51
- input_value = input_prepare.call(value: input_value) if input_prepare.present?
54
+ input.value = input_prepare.call(value: input.value) if input_prepare.present?
52
55
 
53
56
  if name.to_s.end_with?("?")
54
- Servactory::Utils.query_attribute(input_value)
57
+ Servactory::Utils.query_attribute(input.value)
55
58
  else
56
- input_value
59
+ input.value
57
60
  end
58
61
  end
59
62
 
63
+ def prepare_object_values_inside(object:, schema:) # rubocop:disable Metrics/MethodLength
64
+ return object unless object.respond_to?(:fetch)
65
+
66
+ schema.to_h do |schema_key, schema_value|
67
+ attribute_type = schema_value.fetch(:type, String)
68
+
69
+ result =
70
+ if attribute_type == Hash
71
+ prepare_object_values_inside(
72
+ object: object.fetch(schema_key, {}),
73
+ schema: schema_value.except(*RESERVED_ATTRIBUTES)
74
+ )
75
+ else
76
+ fetch_object_values_from(
77
+ value: object.fetch(schema_key, {}),
78
+ schema_value: schema_value,
79
+ attribute_required: schema_value.fetch(:required, true)
80
+ )
81
+ end
82
+
83
+ [schema_key, result]
84
+ end
85
+ end
86
+
87
+ def fetch_object_values_from(value:, schema_value:, attribute_required:)
88
+ return value if attribute_required
89
+ return value if value.present?
90
+
91
+ schema_value.fetch(:default, nil)
92
+ end
93
+
60
94
  def raise_error_for(type, name)
61
95
  message_text = I18n.t(
62
96
  "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) # ::Servactory::Outputs::Output
43
+ output = @collection_of_outputs.find_by(name: prepared_name)
44
44
 
45
45
  return yield if output.nil?
46
46
 
@@ -6,7 +6,6 @@ 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
@@ -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)
14
+
15
+ extensions.each { |extension| base.include(extension) }
16
+
12
17
  base.include(Methods::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
  )
@@ -3,12 +3,12 @@
3
3
  module Servactory
4
4
  module Inputs
5
5
  class Input # rubocop:disable Metrics/ClassLength
6
- ARRAY_DEFAULT_VALUE = ->(is: false, message: nil) { { is: is, message: message } }
7
-
8
- private_constant :ARRAY_DEFAULT_VALUE
6
+ attr_accessor :value
9
7
 
10
8
  attr_reader :name,
11
9
  :internal_name,
10
+ :collection_mode_class_names,
11
+ :hash_mode_class_names,
12
12
  :option_helpers
13
13
 
14
14
  # rubocop:disable Style/KeywordParametersOrder
@@ -17,11 +17,15 @@ module Servactory
17
17
  *helpers,
18
18
  as: nil,
19
19
  type:,
20
+ collection_mode_class_names:,
21
+ hash_mode_class_names:,
20
22
  option_helpers:,
21
23
  **options
22
24
  )
23
25
  @name = name
24
26
  @internal_name = as.present? ? as : name
27
+ @collection_mode_class_names = collection_mode_class_names
28
+ @hash_mode_class_names = hash_mode_class_names
25
29
  @option_helpers = option_helpers
26
30
 
27
31
  options = apply_helpers_for_options(helpers: helpers, options: options) if helpers.present?
@@ -35,7 +39,7 @@ module Servactory
35
39
 
36
40
  return super if option.nil?
37
41
 
38
- option.value
42
+ option.body
39
43
  end
40
44
 
41
45
  def respond_to_missing?(name, *)
@@ -63,7 +67,8 @@ module Servactory
63
67
  # Check Class: Servactory::Inputs::Validations::Type
64
68
  add_types_option_with(type)
65
69
  add_default_option_with(options)
66
- add_array_option_with(options)
70
+ add_collection_option_with(type, options)
71
+ add_object_option_with(type, options)
67
72
 
68
73
  # Check Class: Servactory::Inputs::Validations::Inclusion
69
74
  add_inclusion_option_with(options)
@@ -73,166 +78,180 @@ module Servactory
73
78
 
74
79
  # Check Class: nil
75
80
  add_prepare_option_with(options)
76
- add_internal_option_with(options)
77
81
  end
78
82
 
79
83
  def add_required_option_with(options) # rubocop:disable Metrics/MethodLength
80
- collection_of_options << Option.new(
84
+ collection_of_options << Servactory::Maintenance::Attributes::Option.new(
81
85
  name: :required,
82
- input: self,
86
+ attribute: self,
83
87
  validation_class: Servactory::Inputs::Validations::Required,
84
- define_input_methods: [
85
- DefineInputMethod.new(
88
+ define_methods: [
89
+ Servactory::Maintenance::Attributes::DefineMethod.new(
86
90
  name: :required?,
87
- content: ->(value:) { Servactory::Utils.true?(value[:is]) }
91
+ content: ->(option:) { Servactory::Utils.true?(option[:is]) }
88
92
  ),
89
- DefineInputMethod.new(
93
+ Servactory::Maintenance::Attributes::DefineMethod.new(
90
94
  name: :optional?,
91
- content: ->(value:) { !Servactory::Utils.true?(value[:is]) }
95
+ content: ->(option:) { !Servactory::Utils.true?(option[:is]) }
92
96
  )
93
97
  ],
94
- define_input_conflicts: [
95
- DefineInputConflict.new(content: -> { :required_vs_default if required? && default_value_present? })
98
+ define_conflicts: [
99
+ Servactory::Maintenance::Attributes::DefineConflict.new(
100
+ content: -> { :required_vs_default if required? && default_value_present? }
101
+ )
96
102
  ],
97
103
  need_for_checks: true,
98
- value_key: :is,
99
- value_fallback: true,
104
+ body_key: :is,
105
+ body_fallback: true,
100
106
  **options
101
107
  )
102
108
  end
103
109
 
104
110
  def add_types_option_with(type)
105
- collection_of_options << Option.new(
111
+ collection_of_options << Servactory::Maintenance::Attributes::Option.new(
106
112
  name: :types,
107
- input: self,
113
+ attribute: self,
108
114
  validation_class: Servactory::Inputs::Validations::Type,
109
115
  original_value: Array(type),
110
116
  need_for_checks: true,
111
- value_fallback: nil,
117
+ body_fallback: nil,
112
118
  with_advanced_mode: false
113
119
  )
114
120
  end
115
121
 
116
122
  def add_default_option_with(options) # rubocop:disable Metrics/MethodLength
117
- collection_of_options << Option.new(
123
+ collection_of_options << Servactory::Maintenance::Attributes::Option.new(
118
124
  name: :default,
119
- input: self,
125
+ attribute: self,
120
126
  validation_class: Servactory::Inputs::Validations::Type,
121
- define_input_methods: [
122
- DefineInputMethod.new(
127
+ define_methods: [
128
+ Servactory::Maintenance::Attributes::DefineMethod.new(
123
129
  name: :default_value_present?,
124
- content: ->(value:) { !value.nil? }
130
+ content: ->(option:) { !option.nil? }
125
131
  )
126
132
  ],
127
133
  need_for_checks: true,
128
- value_fallback: nil,
134
+ body_fallback: nil,
129
135
  with_advanced_mode: false,
130
136
  **options
131
137
  )
132
138
  end
133
139
 
134
- def add_array_option_with(options) # rubocop:disable Metrics/MethodLength
135
- collection_of_options << Option.new(
136
- name: :array,
137
- input: self,
140
+ def add_collection_option_with(type, options) # rubocop:disable Metrics/MethodLength
141
+ collection_of_options << Servactory::Maintenance::Attributes::Option.new(
142
+ name: :consists_of,
143
+ attribute: self,
138
144
  validation_class: Servactory::Inputs::Validations::Type,
139
- define_input_methods: [
140
- DefineInputMethod.new(
141
- name: :array?,
142
- content: ->(value:) { Servactory::Utils.true?(value[:is]) }
145
+ define_methods: [
146
+ Servactory::Maintenance::Attributes::DefineMethod.new(
147
+ name: :collection_mode?,
148
+ content: ->(**) { collection_mode_class_names.include?(type) }
143
149
  )
144
150
  ],
145
- define_input_conflicts: [
146
- DefineInputConflict.new(content: -> { :array_vs_array if array? && types.include?(Array) }),
147
- DefineInputConflict.new(content: -> { :array_vs_inclusion if array? && inclusion_present? })
151
+ define_conflicts: [
152
+ Servactory::Maintenance::Attributes::DefineConflict.new(
153
+ content: -> { :collection_vs_inclusion if collection_mode? && inclusion_present? }
154
+ )
148
155
  ],
149
156
  need_for_checks: false,
150
- value_key: :is,
151
- value_fallback: false,
157
+ body_key: :type,
158
+ body_value: String,
159
+ body_fallback: String,
160
+ **options
161
+ )
162
+ end
163
+
164
+ def add_object_option_with(type, options) # rubocop:disable Metrics/MethodLength
165
+ collection_of_options << Servactory::Maintenance::Attributes::Option.new(
166
+ name: :schema,
167
+ attribute: self,
168
+ validation_class: Servactory::Inputs::Validations::Type,
169
+ define_methods: [
170
+ Servactory::Maintenance::Attributes::DefineMethod.new(
171
+ name: :hash_mode?,
172
+ content: ->(**) { hash_mode_class_names.include?(type) }
173
+ )
174
+ ],
175
+ define_conflicts: [
176
+ Servactory::Maintenance::Attributes::DefineConflict.new(
177
+ content: -> { :object_vs_inclusion if hash_mode? && inclusion_present? }
178
+ )
179
+ ],
180
+ need_for_checks: false,
181
+ body_fallback: {},
182
+ with_advanced_mode: false,
152
183
  **options
153
184
  )
154
185
  end
155
186
 
156
187
  def add_inclusion_option_with(options) # rubocop:disable Metrics/MethodLength
157
- collection_of_options << Option.new(
188
+ collection_of_options << Servactory::Maintenance::Attributes::Option.new(
158
189
  name: :inclusion,
159
- input: self,
190
+ attribute: self,
160
191
  validation_class: Servactory::Inputs::Validations::Inclusion,
161
- define_input_methods: [
162
- DefineInputMethod.new(
192
+ define_methods: [
193
+ Servactory::Maintenance::Attributes::DefineMethod.new(
163
194
  name: :inclusion_present?,
164
- content: ->(value:) { value[:in].is_a?(Array) && value[:in].present? }
195
+ content: ->(option:) { option[:in].is_a?(Array) && option[:in].present? }
165
196
  )
166
197
  ],
167
198
  need_for_checks: true,
168
- value_key: :in,
169
- value_fallback: nil,
199
+ body_key: :in,
200
+ body_fallback: nil,
170
201
  **options
171
202
  )
172
203
  end
173
204
 
174
205
  def add_must_option_with(options) # rubocop:disable Metrics/MethodLength
175
- collection_of_options << Option.new(
206
+ collection_of_options << Servactory::Maintenance::Attributes::Option.new(
176
207
  name: :must,
177
- input: self,
208
+ attribute: self,
178
209
  validation_class: Servactory::Inputs::Validations::Must,
179
- define_input_methods: [
180
- DefineInputMethod.new(
210
+ define_methods: [
211
+ Servactory::Maintenance::Attributes::DefineMethod.new(
181
212
  name: :must_present?,
182
- content: ->(value:) { value.present? }
213
+ content: ->(option:) { option.present? }
183
214
  )
184
215
  ],
185
216
  need_for_checks: true,
186
- value_key: :is,
187
- value_fallback: nil,
217
+ body_key: :is,
218
+ body_fallback: nil,
188
219
  with_advanced_mode: false,
189
220
  **options
190
221
  )
191
222
  end
192
223
 
193
224
  def add_prepare_option_with(options) # rubocop:disable Metrics/MethodLength, Metrics/AbcSize
194
- collection_of_options << Option.new(
225
+ collection_of_options << Servactory::Maintenance::Attributes::Option.new(
195
226
  name: :prepare,
196
- input: self,
227
+ attribute: self,
197
228
  validation_class: nil,
198
- define_input_methods: [
199
- DefineInputMethod.new(
229
+ define_methods: [
230
+ Servactory::Maintenance::Attributes::DefineMethod.new(
200
231
  name: :prepare_present?,
201
- content: ->(value:) { value[:in].present? }
232
+ content: ->(option:) { option[:in].present? }
202
233
  )
203
234
  ],
204
- define_input_conflicts: [
205
- DefineInputConflict.new(content: -> { :prepare_vs_array if prepare_present? && array? }),
206
- DefineInputConflict.new(content: -> { :prepare_vs_inclusion if prepare_present? && inclusion_present? }),
207
- DefineInputConflict.new(content: -> { :prepare_vs_must if prepare_present? && must_present? })
208
- ],
209
- need_for_checks: false,
210
- value_key: :in,
211
- value_fallback: false,
212
- **options
213
- )
214
- end
215
-
216
- def add_internal_option_with(options) # rubocop:disable Metrics/MethodLength
217
- collection_of_options << Option.new(
218
- name: :internal,
219
- input: self,
220
- validation_class: nil,
221
- define_input_methods: [
222
- DefineInputMethod.new(
223
- name: :internal?,
224
- content: ->(value:) { Servactory::Utils.true?(value[:is]) }
235
+ define_conflicts: [
236
+ Servactory::Maintenance::Attributes::DefineConflict.new(
237
+ content: -> { :prepare_vs_collection if prepare_present? && collection_mode? }
238
+ ),
239
+ Servactory::Maintenance::Attributes::DefineConflict.new(
240
+ content: -> { :prepare_vs_inclusion if prepare_present? && inclusion_present? }
241
+ ),
242
+ Servactory::Maintenance::Attributes::DefineConflict.new(
243
+ content: -> { :prepare_vs_must if prepare_present? && must_present? }
225
244
  )
226
245
  ],
227
246
  need_for_checks: false,
228
- value_key: :is,
229
- value_fallback: false,
247
+ body_key: :in,
248
+ body_fallback: false,
230
249
  **options
231
250
  )
232
251
  end
233
252
 
234
253
  def collection_of_options
235
- @collection_of_options ||= OptionsCollection.new
254
+ @collection_of_options ||= Servactory::Maintenance::Attributes::OptionsCollection.new
236
255
  end
237
256
 
238
257
  def options_for_checks