servactory 2.0.0.rc2 → 2.0.0.rc3

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 7138f6d9bc8c21740306eabe282daf762cefd3e0504c1a40761f7db5c2e904ab
4
- data.tar.gz: '09dbc3c8168b68e0db456ba7f0e71242412d05c19fb78d45b25f2161b7b06202'
3
+ metadata.gz: cdc12e7e579fdacbd13a9d7d4997113023dd0f3acb9be1050bf88d3c83c324a9
4
+ data.tar.gz: dbfb8137159dce0ae2fa37a143b9a7b75d1f6a758852fd580567615aa1081bc3
5
5
  SHA512:
6
- metadata.gz: 91f6501df9724f4f116dc03ee57863c7e732f77f8c97b9eae7e9ecf64e85fdb7e5f5c976dcf4c92337711566ea122283013ddc4e3d34b60dd970dc380cc3dd0f
7
- data.tar.gz: bf86943b60422743c0b829cce81fc3f753315a5c129edb228a54a42170f352816c8a306cefd53a2c5199dedfd4801a3df10f7d34043d12f924f22db290fd9450
6
+ metadata.gz: d7696c3a4c46fc4dc72980fcb513d39a0a7f69a5e64d4ec2e6244f3c4f950e27cf25faa583c2b1a36dda2d91b33402588a24fc64d294b3fc83bd3f3bc227fcc1
7
+ data.tar.gz: 0531261cbd2a5e9b0af78c7775cbf08cd45f635b328788510d435bdaf361080931f4f6c7b3d1953e8538288c276fc35a4383e9276bc015ef88600f6591e49593
@@ -17,7 +17,8 @@ en:
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_collection: "[%{service_class_name}] Wrong type in input collection `%{input_name}`, expected `%{expected_type}`"
20
+ for_collection:
21
+ wrong_element_type: "[%{service_class_name}] Wrong type in input collection `%{input_name}`, expected `%{expected_type}`, got `%{given_type}`"
21
22
  for_hash:
22
23
  wrong_element_type: "[%{service_class_name}] Wrong type in input hash `%{input_name}`, expected `%{expected_type}` for `%{key_name}`, got `%{given_type}`"
23
24
  tools:
@@ -17,7 +17,8 @@ ru:
17
17
  type:
18
18
  default_error:
19
19
  default: "[%{service_class_name}] Неправильный тип инпута `%{input_name}`, ожидалось `%{expected_type}`, получено `%{given_type}`"
20
- for_collection: "[%{service_class_name}] Неправильный тип в коллекции инпута `%{input_name}`, ожидалось `%{expected_type}`"
20
+ for_collection:
21
+ wrong_element_type: "[%{service_class_name}] Неправильный тип в коллекции инпута `%{input_name}`, ожидалось `%{expected_type}`, получено `%{given_type}`"
21
22
  for_hash:
22
23
  wrong_element_type: "[%{service_class_name}] Неправильный тип в хеше инпута `%{input_name}`, для `%{key_name}` ожидалось `%{expected_type}`, получено `%{given_type}`"
23
24
 
@@ -6,7 +6,7 @@ module Servactory
6
6
  class Base
7
7
  private
8
8
 
9
- def add_error(message, **attributes)
9
+ def add_error(message:, **attributes)
10
10
  message = message.call(**attributes) if message.is_a?(Proc)
11
11
 
12
12
  errors << message
@@ -54,7 +54,7 @@ module Servactory
54
54
 
55
55
  def add_error_with(message)
56
56
  add_error(
57
- message.presence || DEFAULT_MESSAGE,
57
+ message: message.presence || DEFAULT_MESSAGE,
58
58
  service_class_name: @context.class.name,
59
59
  input: @input,
60
60
  value: @input.value
@@ -75,7 +75,7 @@ module Servactory
75
75
 
76
76
  def add_error_with(message, code)
77
77
  add_error(
78
- message,
78
+ message: message,
79
79
  service_class_name: @context.class.name,
80
80
  input: @input,
81
81
  value: @input.value,
@@ -85,7 +85,7 @@ module Servactory
85
85
 
86
86
  def add_syntax_error_with(message, code, exception_message)
87
87
  add_error(
88
- message,
88
+ message: message,
89
89
  service_class_name: @context.class.name,
90
90
  input: @input,
91
91
  value: @input.value,
@@ -52,7 +52,7 @@ module Servactory
52
52
 
53
53
  def add_error_with(message)
54
54
  add_error(
55
- message.presence || DEFAULT_MESSAGE,
55
+ message: message.presence || DEFAULT_MESSAGE,
56
56
  service_class_name: @context.class.name,
57
57
  input: @input,
58
58
  value: @input.value
@@ -3,50 +3,11 @@
3
3
  module Servactory
4
4
  module Inputs
5
5
  module Validations
6
- class Type < Base # rubocop:disable Metrics/ClassLength
7
- DEFAULT_MESSAGE = lambda do |service_class_name:, input:, key_name:, expected_type:, given_type:| # rubocop:disable Metrics/BlockLength
8
- if input.collection_mode?
9
- collection_message = input.consists_of.fetch(:message)
10
-
11
- if collection_message.is_a?(Proc)
12
- collection_message.call(input: input, expected_type: expected_type)
13
- elsif collection_message.is_a?(String) && collection_message.present?
14
- collection_message
15
- else
16
- I18n.t(
17
- "servactory.inputs.checks.type.default_error.for_collection",
18
- service_class_name: service_class_name,
19
- input_name: input.name,
20
- expected_type: expected_type,
21
- given_type: given_type
22
- )
23
- end
24
- elsif input.hash_mode? && key_name.present?
25
- I18n.t(
26
- "servactory.inputs.checks.type.default_error.for_hash.wrong_element_type",
27
- service_class_name: service_class_name,
28
- input_name: input.name,
29
- key_name: key_name,
30
- expected_type: expected_type,
31
- given_type: given_type
32
- )
33
- else
34
- I18n.t(
35
- "servactory.inputs.checks.type.default_error.default",
36
- service_class_name: service_class_name,
37
- input_name: input.name,
38
- expected_type: expected_type,
39
- given_type: given_type
40
- )
41
- end
42
- end
43
-
44
- private_constant :DEFAULT_MESSAGE
45
-
46
- def self.check(context:, input:, check_key:, check_options:)
6
+ class Type < Base
7
+ def self.check(context:, input:, check_key:, **)
47
8
  return unless should_be_checked_for?(input, check_key)
48
9
 
49
- new(context: context, input: input, types: check_options).check
10
+ new(context: context, input: input).check
50
11
  end
51
12
 
52
13
  def self.should_be_checked_for?(input, check_key)
@@ -59,62 +20,24 @@ module Servactory
59
20
  )
60
21
  end
61
22
 
62
- ##########################################################################
63
-
64
- def initialize(context:, input:, types:)
23
+ def initialize(context:, input:)
65
24
  super()
66
25
 
67
26
  @context = context
68
27
  @input = input
69
- @types = types
70
- end
71
-
72
- def check # rubocop:disable Metrics/MethodLength, Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
73
- object_schema_validator = nil
74
-
75
- return if prepared_types.any? do |type|
76
- if @input.collection_mode?
77
- prepared_value.is_a?(@types.fetch(0, Array)) &&
78
- prepared_value.respond_to?(:all?) && prepared_value.all?(type)
79
- elsif @input.hash_mode?
80
- object_schema_validator = Servactory::Maintenance::Validations::ObjectSchema.validate(
81
- object: prepared_value,
82
- schema: @input.schema
83
- )
84
-
85
- object_schema_validator.valid?
86
- else
87
- prepared_value.is_a?(type)
88
- end
89
- end
90
-
91
- if (first_error = object_schema_validator&.errors&.first).present?
92
- return add_default_object_error_with(first_error)
93
- end
94
-
95
- add_default_error
96
28
  end
97
29
 
98
- ########################################################################
99
-
100
- def prepared_types
101
- @prepared_types ||=
102
- if @input.collection_mode?
103
- prepared_types_from(Array(@input.consists_of.fetch(:type, [])))
104
- else
105
- prepared_types_from(@types)
106
- end
30
+ def check
31
+ Servactory::Maintenance::Validations::Types.validate!(
32
+ context: @context,
33
+ attribute: @input,
34
+ types: @input.types,
35
+ value: prepared_value,
36
+ error_callback: ->(**args) { add_error(**args) }
37
+ )
107
38
  end
108
39
 
109
- def prepared_types_from(types)
110
- types.map do |type|
111
- if type.is_a?(String)
112
- Object.const_get(type)
113
- else
114
- type
115
- end
116
- end
117
- end
40
+ private
118
41
 
119
42
  def prepared_value
120
43
  @prepared_value ||= if @input.optional? && !@input.default.nil? && @input.value.blank?
@@ -123,30 +46,6 @@ module Servactory
123
46
  @input.value
124
47
  end
125
48
  end
126
-
127
- private
128
-
129
- def add_default_object_error_with(error)
130
- add_error(
131
- DEFAULT_MESSAGE,
132
- service_class_name: @context.class.name,
133
- input: @input,
134
- key_name: error.fetch(:name),
135
- expected_type: error.fetch(:expected_type),
136
- given_type: error.fetch(:given_type)
137
- )
138
- end
139
-
140
- def add_default_error
141
- add_error(
142
- DEFAULT_MESSAGE,
143
- service_class_name: @context.class.name,
144
- input: @input,
145
- key_name: nil,
146
- expected_type: prepared_types.join(", "),
147
- given_type: prepared_value.class.name
148
- )
149
- end
150
49
  end
151
50
  end
152
51
  end
@@ -6,7 +6,7 @@ module Servactory
6
6
  class Base
7
7
  protected
8
8
 
9
- def raise_error_with(message, **attributes)
9
+ def raise_error_with(message:, **attributes)
10
10
  message = message.call(**attributes) if message.is_a?(Proc)
11
11
 
12
12
  raise @context.class.config.internal_error_class.new(message: message)
@@ -4,65 +4,10 @@ module Servactory
4
4
  module Internals
5
5
  module Validations
6
6
  class Type < Base
7
- DEFAULT_MESSAGE = lambda do |service_class_name:, internal:, value:, key_name:, expected_type:, given_type:| # rubocop:disable Metrics/BlockLength
8
- if internal.collection_mode?
9
- collection_message = internal.consists_of.fetch(:message)
10
-
11
- if collection_message.is_a?(Proc)
12
- collection_message.call(internal: internal, expected_type: expected_type)
13
- elsif collection_message.is_a?(String) && collection_message.present?
14
- collection_message
15
- elsif value.is_a?(internal.types.fetch(0, Array))
16
- I18n.t(
17
- "servactory.internals.checks.type.default_error.for_collection.wrong_element_type",
18
- service_class_name: service_class_name,
19
- internal_name: internal.name,
20
- expected_type: expected_type,
21
- given_type: given_type
22
- )
23
- else
24
- I18n.t(
25
- "servactory.internals.checks.type.default_error.for_collection.wrong_type",
26
- service_class_name: service_class_name,
27
- internal_name: internal.name,
28
- expected_type: internal.types.fetch(0, Array),
29
- given_type: value.class.name
30
- )
31
- end
32
- elsif internal.hash_mode? && key_name.present?
33
- I18n.t(
34
- "servactory.internals.checks.type.default_error.for_hash.wrong_element_type",
35
- service_class_name: service_class_name,
36
- internal_name: internal.name,
37
- key_name: key_name,
38
- expected_type: expected_type,
39
- given_type: given_type
40
- )
41
- else
42
- I18n.t(
43
- "servactory.internals.checks.type.default_error.default",
44
- service_class_name: service_class_name,
45
- internal_name: internal.name,
46
- expected_type: expected_type,
47
- given_type: given_type
48
- )
49
- end
50
- end
51
-
52
- private_constant :DEFAULT_MESSAGE
53
-
54
7
  def self.validate!(...)
55
- return unless should_be_checked?
56
-
57
8
  new(...).validate!
58
9
  end
59
10
 
60
- def self.should_be_checked?
61
- true
62
- end
63
-
64
- ##########################################################################
65
-
66
11
  def initialize(context:, internal:, value:)
67
12
  super()
68
13
 
@@ -71,76 +16,13 @@ module Servactory
71
16
  @value = value
72
17
  end
73
18
 
74
- def validate! # rubocop:disable Metrics/MethodLength, Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
75
- object_schema_validator = nil
76
-
77
- return if prepared_types.any? do |type|
78
- if @internal.collection_mode?
79
- @value.is_a?(@internal.types.fetch(0, Array)) &&
80
- @value.respond_to?(:all?) && @value.all?(type)
81
- elsif @internal.hash_mode?
82
- object_schema_validator = Servactory::Maintenance::Validations::ObjectSchema.validate(
83
- object: @value,
84
- schema: @internal.schema
85
- )
86
-
87
- object_schema_validator.valid?
88
- else
89
- @value.is_a?(type)
90
- end
91
- end
92
-
93
- if (first_error = object_schema_validator&.errors&.first).present?
94
- raise_default_object_error_with(first_error)
95
- end
96
-
97
- raise_default_error
98
- end
99
-
100
- private
101
-
102
- def prepared_types
103
- @prepared_types ||=
104
- if @internal.collection_mode?
105
- prepared_types_from(Array(@internal.consists_of.fetch(:type, [])))
106
- else
107
- prepared_types_from(@internal.types)
108
- end
109
- end
110
-
111
- def prepared_types_from(types)
112
- types.map do |type|
113
- if type.is_a?(String)
114
- Object.const_get(type)
115
- else
116
- type
117
- end
118
- end
119
- end
120
-
121
- ########################################################################
122
-
123
- def raise_default_object_error_with(error)
124
- raise_error_with(
125
- DEFAULT_MESSAGE,
126
- service_class_name: @context.class.name,
127
- internal: @internal,
128
- value: @value,
129
- key_name: error.fetch(:name),
130
- expected_type: error.fetch(:expected_type),
131
- given_type: error.fetch(:given_type)
132
- )
133
- end
134
-
135
- def raise_default_error
136
- raise_error_with(
137
- DEFAULT_MESSAGE,
138
- service_class_name: @context.class.name,
139
- internal: @internal,
19
+ def validate!
20
+ Servactory::Maintenance::Validations::Types.validate!(
21
+ context: @context,
22
+ attribute: @internal,
23
+ types: @internal.types,
140
24
  value: @value,
141
- key_name: nil,
142
- expected_type: prepared_types.join(", "),
143
- given_type: @value.class.name
25
+ error_callback: ->(**args) { raise_error_with(**args) }
144
26
  )
145
27
  end
146
28
  end
@@ -0,0 +1,66 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Servactory
4
+ module Maintenance
5
+ module Validations
6
+ class Collection
7
+ attr_reader :errors
8
+
9
+ def self.validate(...)
10
+ new(...).validate
11
+ end
12
+
13
+ def initialize(value:, types:, type:)
14
+ @value = value
15
+ @types = types
16
+ @type = type
17
+
18
+ @errors = []
19
+ end
20
+
21
+ def validate
22
+ unless @value.is_a?(prepared_type)
23
+ add_error(
24
+ expected_type: prepared_type.name,
25
+ given_type: @value.class.name
26
+ )
27
+
28
+ return self
29
+ end
30
+
31
+ validate_value!
32
+
33
+ self
34
+ end
35
+
36
+ def valid?
37
+ @errors.empty?
38
+ end
39
+
40
+ private
41
+
42
+ def prepared_type
43
+ @prepared_type ||= @types.fetch(0, Array)
44
+ end
45
+
46
+ def validate_value!
47
+ @value.each do |value_item|
48
+ next if value_item.is_a?(@type)
49
+
50
+ add_error(
51
+ expected_type: @type,
52
+ given_type: value_item.class.name
53
+ )
54
+ end
55
+ end
56
+
57
+ def add_error(expected_type:, given_type:)
58
+ @errors << {
59
+ expected_type: expected_type,
60
+ given_type: given_type
61
+ }
62
+ end
63
+ end
64
+ end
65
+ end
66
+ end
@@ -17,29 +17,28 @@ module Servactory
17
17
  @object = object
18
18
  @schema = schema
19
19
 
20
- @valid = false
21
20
  @errors = []
22
21
  end
23
22
 
24
23
  def validate
25
- @valid = validate_for(object: @object, schema: @schema)
24
+ validate_for(object: @object, schema: @schema)
26
25
 
27
26
  self
28
27
  end
29
28
 
30
29
  def valid?
31
- @valid
30
+ @errors.empty?
32
31
  end
33
32
 
34
33
  private
35
34
 
36
- def validate_for(object:, schema:, root_schema_key: nil) # rubocop:disable Metrics/MethodLength
35
+ def validate_for(object:, schema:, root_schema_key: nil) # rubocop:disable Metrics/MethodLength, Metrics/AbcSize
37
36
  unless object.respond_to?(:fetch)
38
- add_error(name: root_schema_key, expected_type: Hash, given_type: object.class)
39
- return false
37
+ add_error(key_name: root_schema_key, expected_type: Hash.name, given_type: object.class.name)
38
+ return
40
39
  end
41
40
 
42
- schema.all? do |schema_key, schema_value|
41
+ schema.each do |schema_key, schema_value|
43
42
  attribute_type = schema_value.fetch(:type, String)
44
43
 
45
44
  if attribute_type == Hash
@@ -57,15 +56,13 @@ module Servactory
57
56
  attribute_required: schema_value.fetch(:required, true)
58
57
  )
59
58
 
60
- unless is_success
61
- add_error(
62
- name: schema_key,
63
- expected_type: attribute_type,
64
- given_type: object.fetch(schema_key, nil).class
65
- )
66
- end
59
+ next if is_success
67
60
 
68
- is_success
61
+ add_error(
62
+ key_name: schema_key,
63
+ expected_type: attribute_type,
64
+ given_type: object.fetch(schema_key, nil).class.name
65
+ )
69
66
  end
70
67
  end
71
68
  end
@@ -106,9 +103,9 @@ module Servactory
106
103
  value.fetch(:default, nil)
107
104
  end
108
105
 
109
- def add_error(name:, expected_type:, given_type:)
106
+ def add_error(key_name:, expected_type:, given_type:)
110
107
  @errors << {
111
- name: name,
108
+ key_name: key_name,
112
109
  expected_type: expected_type,
113
110
  given_type: given_type
114
111
  }
@@ -0,0 +1,164 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Servactory
4
+ module Maintenance
5
+ module Validations
6
+ class Types # rubocop:disable Metrics/ClassLength
7
+ DEFAULT_MESSAGE = lambda do | # rubocop:disable Metrics/BlockLength
8
+ service_class_name:,
9
+ attribute_system_name:,
10
+ attribute:,
11
+ value:,
12
+ key_name:,
13
+ expected_type:,
14
+ given_type:
15
+ | # do
16
+ if attribute.collection_mode?
17
+ collection_message = attribute.consists_of.fetch(:message)
18
+
19
+ if collection_message.is_a?(Proc)
20
+ collection_message.call(attribute_system_name => attribute, expected_type: expected_type)
21
+ elsif collection_message.is_a?(String) && collection_message.present?
22
+ collection_message
23
+ elsif value.is_a?(attribute.types.fetch(0, Array))
24
+ I18n.t(
25
+ "servactory.#{attribute_system_name.to_s.pluralize}.checks.type.default_error.for_collection.wrong_element_type", # rubocop:disable Layout/LineLength
26
+ service_class_name: service_class_name,
27
+ "#{attribute_system_name}_name": attribute.name,
28
+ expected_type: expected_type,
29
+ given_type: given_type
30
+ )
31
+ else
32
+ I18n.t(
33
+ "servactory.#{attribute_system_name.to_s.pluralize}.checks.type.default_error.for_collection.wrong_type", # rubocop:disable Layout/LineLength
34
+ service_class_name: service_class_name,
35
+ "#{attribute_system_name}_name": attribute.name,
36
+ expected_type: attribute.types.fetch(0, Array),
37
+ given_type: value.class.name
38
+ )
39
+ end
40
+ elsif attribute.hash_mode? && key_name.present?
41
+ I18n.t(
42
+ "servactory.#{attribute_system_name.to_s.pluralize}.checks.type.default_error.for_hash.wrong_element_type", # rubocop:disable Layout/LineLength
43
+ service_class_name: service_class_name,
44
+ "#{attribute_system_name}_name": attribute.name,
45
+ key_name: key_name,
46
+ expected_type: expected_type,
47
+ given_type: given_type
48
+ )
49
+ else
50
+ I18n.t(
51
+ "servactory.#{attribute_system_name.to_s.pluralize}.checks.type.default_error.default",
52
+ service_class_name: service_class_name,
53
+ "#{attribute_system_name}_name": attribute.name,
54
+ expected_type: expected_type,
55
+ given_type: given_type
56
+ )
57
+ end
58
+ end
59
+
60
+ private_constant :DEFAULT_MESSAGE
61
+
62
+ def self.validate!(...)
63
+ new(...).validate!
64
+ end
65
+
66
+ def initialize(context:, attribute:, types:, value:, error_callback:)
67
+ @context = context
68
+ @attribute = attribute
69
+ @types = types
70
+ @value = value
71
+ @error_callback = error_callback
72
+ end
73
+
74
+ def validate! # rubocop:disable Metrics/MethodLength, Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
75
+ collection_validator = nil
76
+ object_schema_validator = nil
77
+
78
+ return if prepared_types.any? do |type|
79
+ if @attribute.collection_mode?
80
+ collection_validator = Servactory::Maintenance::Validations::Collection.validate(
81
+ value: @value,
82
+ types: @attribute.types,
83
+ type: type
84
+ )
85
+
86
+ collection_validator.valid?
87
+ elsif @attribute.hash_mode?
88
+ object_schema_validator = Servactory::Maintenance::Validations::ObjectSchema.validate(
89
+ object: @value,
90
+ schema: @attribute.schema
91
+ )
92
+
93
+ object_schema_validator.valid?
94
+ else
95
+ @value.is_a?(type)
96
+ end
97
+ end
98
+
99
+ if (first_error = collection_validator&.errors&.first).present?
100
+ return @error_callback.call(
101
+ message: DEFAULT_MESSAGE,
102
+ service_class_name: @context.class.name,
103
+ attribute_system_name: attribute_system_name,
104
+ attribute: @attribute,
105
+ value: @value,
106
+ key_name: nil,
107
+ expected_type: first_error.fetch(:expected_type),
108
+ given_type: first_error.fetch(:given_type)
109
+ )
110
+ end
111
+
112
+ if (first_error = object_schema_validator&.errors&.first).present?
113
+ return @error_callback.call(
114
+ message: DEFAULT_MESSAGE,
115
+ service_class_name: @context.class.name,
116
+ attribute_system_name: attribute_system_name,
117
+ attribute: @attribute,
118
+ value: @value,
119
+ key_name: first_error.fetch(:key_name),
120
+ expected_type: first_error.fetch(:expected_type),
121
+ given_type: first_error.fetch(:given_type)
122
+ )
123
+ end
124
+
125
+ @error_callback.call(
126
+ message: DEFAULT_MESSAGE,
127
+ service_class_name: @context.class.name,
128
+ attribute_system_name: attribute_system_name,
129
+ attribute: @attribute,
130
+ value: @value,
131
+ key_name: nil,
132
+ expected_type: prepared_types.join(", "),
133
+ given_type: @value.class.name
134
+ )
135
+ end
136
+
137
+ private
138
+
139
+ def attribute_system_name
140
+ @attribute.class.name.demodulize.downcase.to_sym
141
+ end
142
+
143
+ def prepared_types
144
+ @prepared_types ||=
145
+ if @attribute.collection_mode?
146
+ prepared_types_from(Array(@attribute.consists_of.fetch(:type, [])))
147
+ else
148
+ prepared_types_from(@types)
149
+ end
150
+ end
151
+
152
+ def prepared_types_from(types)
153
+ types.map do |type|
154
+ if type.is_a?(String)
155
+ Object.const_get(type)
156
+ else
157
+ type
158
+ end
159
+ end
160
+ end
161
+ end
162
+ end
163
+ end
164
+ end
@@ -6,7 +6,7 @@ module Servactory
6
6
  class Base
7
7
  protected
8
8
 
9
- def raise_error_with(message, **attributes)
9
+ def raise_error_with(message:, **attributes)
10
10
  message = message.call(**attributes) if message.is_a?(Proc)
11
11
 
12
12
  raise @context.class.config.output_error_class.new(message: message)
@@ -4,65 +4,10 @@ module Servactory
4
4
  module Outputs
5
5
  module Validations
6
6
  class Type < Base
7
- DEFAULT_MESSAGE = lambda do |service_class_name:, output:, value:, key_name:, expected_type:, given_type:| # rubocop:disable Metrics/BlockLength
8
- if output.collection_mode?
9
- collection_message = output.consists_of.fetch(:message)
10
-
11
- if collection_message.is_a?(Proc)
12
- collection_message.call(output: output, expected_type: expected_type)
13
- elsif collection_message.is_a?(String) && collection_message.present?
14
- collection_message
15
- elsif value.is_a?(output.types.fetch(0, Array))
16
- I18n.t(
17
- "servactory.outputs.checks.type.default_error.for_collection.wrong_element_type",
18
- service_class_name: service_class_name,
19
- output_name: output.name,
20
- expected_type: expected_type,
21
- given_type: given_type
22
- )
23
- else
24
- I18n.t(
25
- "servactory.outputs.checks.type.default_error.for_collection.wrong_type",
26
- service_class_name: service_class_name,
27
- output_name: output.name,
28
- expected_type: output.types.fetch(0, Array),
29
- given_type: value.class.name
30
- )
31
- end
32
- elsif output.hash_mode? && key_name.present?
33
- I18n.t(
34
- "servactory.outputs.checks.type.default_error.for_hash.wrong_element_type",
35
- service_class_name: service_class_name,
36
- output_name: output.name,
37
- key_name: key_name,
38
- expected_type: expected_type,
39
- given_type: given_type
40
- )
41
- else
42
- I18n.t(
43
- "servactory.outputs.checks.type.default_error.default",
44
- service_class_name: service_class_name,
45
- output_name: output.name,
46
- expected_type: expected_type,
47
- given_type: given_type
48
- )
49
- end
50
- end
51
-
52
- private_constant :DEFAULT_MESSAGE
53
-
54
7
  def self.validate!(...)
55
- return unless should_be_checked?
56
-
57
8
  new(...).validate!
58
9
  end
59
10
 
60
- def self.should_be_checked?
61
- true
62
- end
63
-
64
- ##########################################################################
65
-
66
11
  def initialize(context:, output:, value:)
67
12
  super()
68
13
 
@@ -71,76 +16,13 @@ module Servactory
71
16
  @value = value
72
17
  end
73
18
 
74
- def validate! # rubocop:disable Metrics/MethodLength, Metrics/AbcSize
75
- object_schema_validator = nil
76
-
77
- return if prepared_types.any? do |type|
78
- if @output.collection_mode?
79
- @value.is_a?(@output.types.fetch(0, Array)) &&
80
- @value.respond_to?(:all?) && @value.all?(type)
81
- elsif @output.hash_mode?
82
- object_schema_validator = Servactory::Maintenance::Validations::ObjectSchema.validate(
83
- object: @value,
84
- schema: @output.schema
85
- )
86
-
87
- object_schema_validator.valid?
88
- else
89
- @value.is_a?(type)
90
- end
91
- end
92
-
93
- if (first_error = object_schema_validator&.errors&.first).present?
94
- raise_default_object_error_with(first_error)
95
- end
96
-
97
- raise_default_error
98
- end
99
-
100
- private
101
-
102
- def prepared_types
103
- @prepared_types ||=
104
- if @output.collection_mode?
105
- prepared_types_from(Array(@output.consists_of.fetch(:type, [])))
106
- else
107
- prepared_types_from(@output.types)
108
- end
109
- end
110
-
111
- def prepared_types_from(types)
112
- types.map do |type|
113
- if type.is_a?(String)
114
- Object.const_get(type)
115
- else
116
- type
117
- end
118
- end
119
- end
120
-
121
- ########################################################################
122
-
123
- def raise_default_object_error_with(error)
124
- raise_error_with(
125
- DEFAULT_MESSAGE,
126
- service_class_name: @context.class.name,
127
- output: @output,
128
- value: @value,
129
- key_name: error.fetch(:name),
130
- expected_type: error.fetch(:expected_type),
131
- given_type: error.fetch(:given_type)
132
- )
133
- end
134
-
135
- def raise_default_error
136
- raise_error_with(
137
- DEFAULT_MESSAGE,
138
- service_class_name: @context.class.name,
139
- output: @output,
19
+ def validate!
20
+ Servactory::Maintenance::Validations::Types.validate!(
21
+ context: @context,
22
+ attribute: @output,
23
+ types: @output.types,
140
24
  value: @value,
141
- key_name: nil,
142
- expected_type: prepared_types.join(", "),
143
- given_type: @value.class.name
25
+ error_callback: ->(**args) { raise_error_with(**args) }
144
26
  )
145
27
  end
146
28
  end
@@ -5,7 +5,7 @@ module Servactory
5
5
  MAJOR = 2
6
6
  MINOR = 0
7
7
  PATCH = 0
8
- PRE = "rc2"
8
+ PRE = "rc3"
9
9
 
10
10
  STRING = [MAJOR, MINOR, PATCH, PRE].compact.join(".")
11
11
  end
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: 2.0.0.rc2
4
+ version: 2.0.0.rc3
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-10-17 00:00:00.000000000 Z
11
+ date: 2023-10-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -251,7 +251,9 @@ files:
251
251
  - lib/servactory/maintenance/attributes/options_collection.rb
252
252
  - lib/servactory/maintenance/collection_mode/class_names_collection.rb
253
253
  - lib/servactory/maintenance/hash_mode/class_names_collection.rb
254
+ - lib/servactory/maintenance/validations/collection.rb
254
255
  - lib/servactory/maintenance/validations/object_schema.rb
256
+ - lib/servactory/maintenance/validations/types.rb
255
257
  - lib/servactory/methods/aliases_for_make/collection.rb
256
258
  - lib/servactory/methods/dsl.rb
257
259
  - lib/servactory/methods/method.rb