servactory 2.5.1 → 2.6.0.rc1
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 +9 -10
- data/config/locales/ru.yml +9 -11
- data/lib/generators/servactory/templates/services/application_service/base.rb +2 -2
- data/lib/servactory/actions/tools/rules.rb +2 -3
- data/lib/servactory/configuration/dsl.rb +0 -2
- data/lib/servactory/configuration/factory.rb +19 -6
- data/lib/servactory/configuration/setup.rb +18 -10
- data/lib/servactory/context/workspace/inputs.rb +2 -3
- data/lib/servactory/context/workspace/internals.rb +2 -3
- data/lib/servactory/context/workspace/outputs.rb +2 -3
- data/lib/servactory/context/workspace.rb +23 -3
- data/lib/servactory/info/dsl.rb +3 -9
- data/lib/servactory/inputs/dsl.rb +0 -1
- data/lib/servactory/inputs/input.rb +2 -6
- data/lib/servactory/inputs/tools/rules.rb +2 -3
- data/lib/servactory/inputs/tools/unnecessary.rb +2 -3
- data/lib/servactory/inputs/translator/required.rb +3 -7
- data/lib/servactory/inputs/validations/required.rb +2 -14
- data/lib/servactory/internals/dsl.rb +0 -1
- data/lib/servactory/internals/internal.rb +2 -6
- data/lib/servactory/maintenance/attributes/options/registrar.rb +2 -34
- data/lib/servactory/maintenance/attributes/translator/inclusion.rb +3 -4
- data/lib/servactory/maintenance/attributes/translator/must.rb +8 -10
- data/lib/servactory/maintenance/attributes/translator/type.rb +11 -46
- data/lib/servactory/maintenance/attributes/validations/inclusion.rb +1 -1
- data/lib/servactory/maintenance/attributes/validations/must.rb +2 -2
- data/lib/servactory/maintenance/validations/types.rb +4 -30
- data/lib/servactory/outputs/dsl.rb +0 -1
- data/lib/servactory/outputs/output.rb +2 -6
- data/lib/servactory/result.rb +2 -3
- data/lib/servactory/test_kit/rspec/matchers/have_service_attribute_matchers/consists_of_matcher.rb +8 -56
- data/lib/servactory/test_kit/rspec/matchers/have_service_attribute_matchers/must_matcher.rb +7 -2
- data/lib/servactory/test_kit/rspec/matchers/have_service_input_matcher.rb +5 -0
- data/lib/servactory/test_kit/rspec/matchers/have_service_input_matchers/required_matcher.rb +5 -2
- data/lib/servactory/test_kit/rspec/matchers/have_service_input_matchers/valid_with_matcher.rb +18 -62
- data/lib/servactory/test_kit/rspec/matchers/have_service_internal_matcher.rb +5 -0
- data/lib/servactory/test_kit/rspec/matchers.rb +2 -1
- data/lib/servactory/tool_kit/dynamic_options/consists_of.rb +92 -0
- data/lib/servactory/tool_kit/dynamic_options/format.rb +9 -12
- data/lib/servactory/tool_kit/dynamic_options/max.rb +9 -12
- data/lib/servactory/tool_kit/dynamic_options/min.rb +9 -12
- data/lib/servactory/utils.rb +3 -3
- data/lib/servactory/version.rb +3 -3
- data/lib/servactory.rb +1 -0
- metadata +3 -4
- data/lib/servactory/maintenance/collection_mode/class_names_collection.rb +0 -16
- data/lib/servactory/maintenance/validations/collection.rb +0 -86
@@ -20,7 +20,6 @@ module Servactory
|
|
20
20
|
required: false,
|
21
21
|
types: false,
|
22
22
|
default: false,
|
23
|
-
collection: false,
|
24
23
|
hash: false,
|
25
24
|
inclusion: false,
|
26
25
|
must: false,
|
@@ -33,9 +32,8 @@ module Servactory
|
|
33
32
|
new(...).register
|
34
33
|
end
|
35
34
|
|
36
|
-
def initialize(attribute:,
|
35
|
+
def initialize(attribute:, hash_mode_class_names:, options:, features:)
|
37
36
|
@attribute = attribute
|
38
|
-
@collection_mode_class_names = collection_mode_class_names
|
39
37
|
@hash_mode_class_names = hash_mode_class_names
|
40
38
|
@options = options
|
41
39
|
@features = DEFAULT_FEATURES.merge(features)
|
@@ -43,14 +41,13 @@ module Servactory
|
|
43
41
|
|
44
42
|
########################################################################
|
45
43
|
|
46
|
-
def register # rubocop:disable Metrics/
|
44
|
+
def register # rubocop:disable Metrics/CyclomaticComplexity
|
47
45
|
# Validation Class: Servactory::Inputs::Validations::Required
|
48
46
|
register_required_option if @features.fetch(:required)
|
49
47
|
|
50
48
|
# Validation Class: Servactory::Maintenance::Attributes::Validations::Type
|
51
49
|
register_types_option if @features.fetch(:types)
|
52
50
|
register_default_option if @features.fetch(:default)
|
53
|
-
register_collection_option if @features.fetch(:collection)
|
54
51
|
register_hash_option if @features.fetch(:hash)
|
55
52
|
|
56
53
|
# Validation Class: Servactory::Maintenance::Attributes::Validations::Inclusion
|
@@ -124,35 +121,6 @@ module Servactory
|
|
124
121
|
)
|
125
122
|
end
|
126
123
|
|
127
|
-
def register_collection_option # rubocop:disable Metrics/MethodLength
|
128
|
-
collection << Servactory::Maintenance::Attributes::Option.new(
|
129
|
-
name: :consists_of,
|
130
|
-
attribute: @attribute,
|
131
|
-
validation_class: Servactory::Maintenance::Attributes::Validations::Type,
|
132
|
-
define_methods: [
|
133
|
-
Servactory::Maintenance::Attributes::DefineMethod.new(
|
134
|
-
name: :collection_mode?,
|
135
|
-
content: lambda do |**|
|
136
|
-
@collection_mode_class_names.include?(@options.fetch(:type)) &&
|
137
|
-
@options.fetch(:consists_of, true) != false
|
138
|
-
end
|
139
|
-
)
|
140
|
-
],
|
141
|
-
define_conflicts: [
|
142
|
-
Servactory::Maintenance::Attributes::DefineConflict.new(
|
143
|
-
content: lambda {
|
144
|
-
:collection_vs_inclusion if @attribute.collection_mode? && @attribute.inclusion_present?
|
145
|
-
}
|
146
|
-
)
|
147
|
-
],
|
148
|
-
need_for_checks: false,
|
149
|
-
body_key: :type,
|
150
|
-
body_value: String,
|
151
|
-
body_fallback: String,
|
152
|
-
**@options
|
153
|
-
)
|
154
|
-
end
|
155
|
-
|
156
124
|
def register_hash_option # rubocop:disable Metrics/MethodLength
|
157
125
|
collection << Servactory::Maintenance::Attributes::Option.new(
|
158
126
|
name: :schema,
|
@@ -8,12 +8,11 @@ module Servactory
|
|
8
8
|
module_function
|
9
9
|
|
10
10
|
def default_message
|
11
|
-
lambda do |
|
11
|
+
lambda do |service:, value:, input: nil, internal: nil, output: nil|
|
12
12
|
attribute = Servactory::Utils.define_attribute_with(input: input, internal: internal, output: output)
|
13
13
|
|
14
|
-
|
15
|
-
"
|
16
|
-
service_class_name: service_class_name,
|
14
|
+
service.translate(
|
15
|
+
"#{attribute.i18n_name}.validations.inclusion.default_error",
|
17
16
|
"#{attribute.system_name}_name": attribute.name,
|
18
17
|
"#{attribute.system_name}_inclusion": attribute.inclusion[:in],
|
19
18
|
value: value
|
@@ -7,13 +7,12 @@ module Servactory
|
|
7
7
|
module Must
|
8
8
|
module_function
|
9
9
|
|
10
|
-
def default_message
|
11
|
-
lambda do |
|
10
|
+
def default_message
|
11
|
+
lambda do |service:, value:, code:, input: nil, internal: nil, output: nil, reason: nil|
|
12
12
|
attribute = Servactory::Utils.define_attribute_with(input: input, internal: internal, output: output)
|
13
13
|
|
14
|
-
|
15
|
-
"
|
16
|
-
service_class_name: service_class_name,
|
14
|
+
service.translate(
|
15
|
+
"#{attribute.i18n_name}.validations.must.default_error",
|
17
16
|
"#{attribute.system_name}_name": attribute.name,
|
18
17
|
value: value,
|
19
18
|
code: code,
|
@@ -22,13 +21,12 @@ module Servactory
|
|
22
21
|
end
|
23
22
|
end
|
24
23
|
|
25
|
-
def syntax_error_message
|
26
|
-
lambda do |
|
24
|
+
def syntax_error_message
|
25
|
+
lambda do |service:, value:, code:, exception_message:, input: nil, internal: nil, output: nil|
|
27
26
|
attribute = Servactory::Utils.define_attribute_with(input: input, internal: internal, output: output)
|
28
27
|
|
29
|
-
|
30
|
-
"
|
31
|
-
service_class_name: service_class_name,
|
28
|
+
service.translate(
|
29
|
+
"#{attribute.i18n_name}.validations.must.syntax_error",
|
32
30
|
"#{attribute.system_name}_name": attribute.name,
|
33
31
|
value: value,
|
34
32
|
code: code,
|
@@ -7,16 +7,13 @@ module Servactory
|
|
7
7
|
module Type
|
8
8
|
extend self
|
9
9
|
|
10
|
-
def default_message
|
11
|
-
lambda do |
|
12
|
-
if attribute.
|
13
|
-
|
14
|
-
expected_type: expected_type, given_type: given_type)
|
15
|
-
elsif attribute.hash_mode? && key_name.present?
|
16
|
-
for_hash_mode_with(service_class_name: service_class_name, attribute: attribute, key_name: key_name,
|
10
|
+
def default_message
|
11
|
+
lambda do |service:, attribute:, key_name:, expected_type:, given_type:, **|
|
12
|
+
if attribute.hash_mode? && key_name.present?
|
13
|
+
for_hash_mode_with(service: service, attribute: attribute, key_name: key_name,
|
17
14
|
expected_type: expected_type, given_type: given_type)
|
18
15
|
else
|
19
|
-
for_others_with(
|
16
|
+
for_others_with(service: service, attribute: attribute,
|
20
17
|
expected_type: expected_type, given_type: given_type)
|
21
18
|
end
|
22
19
|
end
|
@@ -24,37 +21,7 @@ module Servactory
|
|
24
21
|
|
25
22
|
private
|
26
23
|
|
27
|
-
def
|
28
|
-
collection_message = attribute.consists_of.fetch(:message)
|
29
|
-
|
30
|
-
if collection_message.is_a?(Proc)
|
31
|
-
collection_message.call(
|
32
|
-
**Servactory::Utils.fetch_hash_with_desired_attribute(attribute),
|
33
|
-
expected_type: expected_type,
|
34
|
-
given_type: given_type
|
35
|
-
)
|
36
|
-
elsif collection_message.is_a?(String) && collection_message.present?
|
37
|
-
collection_message
|
38
|
-
elsif value.is_a?(attribute.types.fetch(0, Array))
|
39
|
-
I18n.t(
|
40
|
-
"servactory.#{attribute.i18n_name}.validations.type.default_error.for_collection.wrong_element_type",
|
41
|
-
service_class_name: service_class_name,
|
42
|
-
"#{attribute.system_name}_name": attribute.name,
|
43
|
-
expected_type: expected_type,
|
44
|
-
given_type: given_type
|
45
|
-
)
|
46
|
-
else
|
47
|
-
I18n.t(
|
48
|
-
"servactory.#{attribute.i18n_name}.validations.type.default_error.for_collection.wrong_type",
|
49
|
-
service_class_name: service_class_name,
|
50
|
-
"#{attribute.system_name}_name": attribute.name,
|
51
|
-
expected_type: attribute.types.fetch(0, Array),
|
52
|
-
given_type: value.class.name
|
53
|
-
)
|
54
|
-
end
|
55
|
-
end
|
56
|
-
|
57
|
-
def for_hash_mode_with(service_class_name:, attribute:, key_name:, expected_type:, given_type:) # rubocop:disable Metrics/MethodLength
|
24
|
+
def for_hash_mode_with(service:, attribute:, key_name:, expected_type:, given_type:) # rubocop:disable Metrics/MethodLength
|
58
25
|
hash_message = attribute.schema.fetch(:message)
|
59
26
|
|
60
27
|
if hash_message.is_a?(Proc)
|
@@ -67,9 +34,8 @@ module Servactory
|
|
67
34
|
elsif hash_message.is_a?(String) && hash_message.present?
|
68
35
|
hash_message
|
69
36
|
else
|
70
|
-
|
71
|
-
"
|
72
|
-
service_class_name: service_class_name,
|
37
|
+
service.translate(
|
38
|
+
"#{attribute.i18n_name}.validations.type.default_error.for_hash.wrong_element_type",
|
73
39
|
"#{attribute.system_name}_name": attribute.name,
|
74
40
|
key_name: key_name,
|
75
41
|
expected_type: expected_type,
|
@@ -78,10 +44,9 @@ module Servactory
|
|
78
44
|
end
|
79
45
|
end
|
80
46
|
|
81
|
-
def for_others_with(
|
82
|
-
|
83
|
-
"
|
84
|
-
service_class_name: service_class_name,
|
47
|
+
def for_others_with(service:, attribute:, expected_type:, given_type:)
|
48
|
+
service.translate(
|
49
|
+
"#{attribute.i18n_name}.validations.type.default_error.default",
|
85
50
|
"#{attribute.system_name}_name": attribute.name,
|
86
51
|
expected_type: expected_type,
|
87
52
|
given_type: given_type
|
@@ -51,7 +51,7 @@ module Servactory
|
|
51
51
|
def add_error_with(message)
|
52
52
|
add_error(
|
53
53
|
message: message.presence || Servactory::Maintenance::Attributes::Translator::Inclusion.default_message,
|
54
|
-
|
54
|
+
service: @context.send(:servactory_service_info),
|
55
55
|
**Servactory::Utils.fetch_hash_with_desired_attribute(@attribute),
|
56
56
|
value: @value
|
57
57
|
)
|
@@ -65,7 +65,7 @@ module Servactory
|
|
65
65
|
def add_error_with(message, code, reason)
|
66
66
|
add_error(
|
67
67
|
message: message,
|
68
|
-
|
68
|
+
service: @context.send(:servactory_service_info),
|
69
69
|
**Servactory::Utils.fetch_hash_with_desired_attribute(@attribute),
|
70
70
|
value: @value,
|
71
71
|
code: code,
|
@@ -76,7 +76,7 @@ module Servactory
|
|
76
76
|
def add_syntax_error_with(message, code, exception_message)
|
77
77
|
add_error(
|
78
78
|
message: message,
|
79
|
-
|
79
|
+
service: @context.send(:servactory_service_info),
|
80
80
|
**Servactory::Utils.fetch_hash_with_desired_attribute(@attribute),
|
81
81
|
value: @value,
|
82
82
|
code: code,
|
@@ -17,18 +17,9 @@ module Servactory
|
|
17
17
|
end
|
18
18
|
|
19
19
|
def validate! # rubocop:disable Metrics/MethodLength, Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
20
|
-
collection_validator = nil
|
21
20
|
object_schema_validator = nil
|
22
21
|
|
23
|
-
if @attribute.
|
24
|
-
collection_validator = Servactory::Maintenance::Validations::Collection.validate(
|
25
|
-
types: @types,
|
26
|
-
value: @value,
|
27
|
-
consists_of: @attribute.consists_of
|
28
|
-
)
|
29
|
-
|
30
|
-
return if collection_validator.valid?
|
31
|
-
elsif @attribute.hash_mode?
|
22
|
+
if @attribute.hash_mode?
|
32
23
|
object_schema_validator = Servactory::Maintenance::Validations::ObjectSchema.validate(
|
33
24
|
object: @value,
|
34
25
|
schema: @attribute.schema
|
@@ -41,22 +32,10 @@ module Servactory
|
|
41
32
|
end
|
42
33
|
end
|
43
34
|
|
44
|
-
if (first_error = collection_validator&.errors&.first).present?
|
45
|
-
return @error_callback.call(
|
46
|
-
message: Servactory::Maintenance::Attributes::Translator::Type.default_message,
|
47
|
-
service_class_name: @context.class.name,
|
48
|
-
attribute: @attribute,
|
49
|
-
value: @value,
|
50
|
-
key_name: nil,
|
51
|
-
expected_type: first_error.fetch(:expected_type),
|
52
|
-
given_type: first_error.fetch(:given_type)
|
53
|
-
)
|
54
|
-
end
|
55
|
-
|
56
35
|
if (first_error = object_schema_validator&.errors&.first).present?
|
57
36
|
return @error_callback.call(
|
58
37
|
message: Servactory::Maintenance::Attributes::Translator::Type.default_message,
|
59
|
-
|
38
|
+
service: @context.send(:servactory_service_info),
|
60
39
|
attribute: @attribute,
|
61
40
|
value: @value,
|
62
41
|
key_name: first_error.fetch(:key_name),
|
@@ -67,7 +46,7 @@ module Servactory
|
|
67
46
|
|
68
47
|
@error_callback.call(
|
69
48
|
message: Servactory::Maintenance::Attributes::Translator::Type.default_message,
|
70
|
-
|
49
|
+
service: @context.send(:servactory_service_info),
|
71
50
|
attribute: @attribute,
|
72
51
|
value: @value,
|
73
52
|
key_name: nil,
|
@@ -79,12 +58,7 @@ module Servactory
|
|
79
58
|
private
|
80
59
|
|
81
60
|
def prepared_types
|
82
|
-
@prepared_types ||=
|
83
|
-
if @attribute.collection_mode?
|
84
|
-
prepared_types_from(Array(@attribute.consists_of.fetch(:type, [])))
|
85
|
-
else
|
86
|
-
prepared_types_from(@types)
|
87
|
-
end
|
61
|
+
@prepared_types ||= prepared_types_from(@types)
|
88
62
|
end
|
89
63
|
|
90
64
|
def prepared_types_from(types)
|
@@ -20,7 +20,6 @@ module Servactory
|
|
20
20
|
collection_of_outputs << Output.new(
|
21
21
|
name,
|
22
22
|
*helpers,
|
23
|
-
collection_mode_class_names: config.collection_mode_class_names,
|
24
23
|
hash_mode_class_names: config.hash_mode_class_names,
|
25
24
|
option_helpers: config.output_option_helpers,
|
26
25
|
**options
|
@@ -3,7 +3,7 @@
|
|
3
3
|
module Servactory
|
4
4
|
module Outputs
|
5
5
|
class Output
|
6
|
-
class
|
6
|
+
class Actor
|
7
7
|
attr_reader :name,
|
8
8
|
:types,
|
9
9
|
:inclusion
|
@@ -28,13 +28,11 @@ module Servactory
|
|
28
28
|
def initialize(
|
29
29
|
name,
|
30
30
|
*helpers,
|
31
|
-
collection_mode_class_names:,
|
32
31
|
hash_mode_class_names:,
|
33
32
|
option_helpers:,
|
34
33
|
**options
|
35
34
|
)
|
36
35
|
@name = name
|
37
|
-
@collection_mode_class_names = collection_mode_class_names
|
38
36
|
@hash_mode_class_names = hash_mode_class_names
|
39
37
|
@option_helpers = option_helpers
|
40
38
|
|
@@ -61,12 +59,10 @@ module Servactory
|
|
61
59
|
|
62
60
|
options_registrar = Servactory::Maintenance::Attributes::Options::Registrar.register(
|
63
61
|
attribute: self,
|
64
|
-
collection_mode_class_names: @collection_mode_class_names,
|
65
62
|
hash_mode_class_names: @hash_mode_class_names,
|
66
63
|
options: options,
|
67
64
|
features: {
|
68
65
|
types: true,
|
69
|
-
collection: true,
|
70
66
|
hash: true,
|
71
67
|
inclusion: true,
|
72
68
|
must: true
|
@@ -94,7 +90,7 @@ module Servactory
|
|
94
90
|
prepared_options.deep_merge!(prepared_option)
|
95
91
|
end
|
96
92
|
|
97
|
-
options.
|
93
|
+
options.deep_merge(prepared_options)
|
98
94
|
end
|
99
95
|
|
100
96
|
def options_for_checks
|
data/lib/servactory/result.rb
CHANGED
@@ -121,9 +121,8 @@ module Servactory
|
|
121
121
|
|
122
122
|
raise @context.class.config.failure_class.new(
|
123
123
|
type: :base,
|
124
|
-
message:
|
125
|
-
"
|
126
|
-
service_class_name: @context.class.name,
|
124
|
+
message: @context.send(:servactory_service_info).translate(
|
125
|
+
"common.undefined_method.missing_name",
|
127
126
|
error_text: exception.message
|
128
127
|
),
|
129
128
|
meta: {
|
data/lib/servactory/test_kit/rspec/matchers/have_service_attribute_matchers/consists_of_matcher.rb
CHANGED
@@ -50,68 +50,20 @@ module Servactory
|
|
50
50
|
:attribute_data
|
51
51
|
|
52
52
|
def submatcher_passes?(_subject)
|
53
|
-
|
53
|
+
attribute_must = attribute_data.fetch(:must)
|
54
54
|
|
55
|
-
|
55
|
+
attribute_must_keys = attribute_must.keys
|
56
56
|
|
57
|
-
|
57
|
+
expected_keys = %i[consists_of]
|
58
58
|
|
59
|
-
|
60
|
-
end
|
61
|
-
|
62
|
-
def attribute_consists_of_message # rubocop:disable Metrics/MethodLength, Metrics/AbcSize
|
63
|
-
attribute_consists_of_message = attribute_data.fetch(:consists_of).fetch(:message)
|
59
|
+
attribute_must_keys = attribute_must_keys.select { |key| expected_keys.include?(key) }
|
64
60
|
|
65
|
-
|
66
|
-
|
67
|
-
"servactory.#{attribute_type_plural}.validations.required.default_error.for_collection",
|
68
|
-
service_class_name: described_class.name,
|
69
|
-
"#{attribute_type}_name": attribute_name
|
70
|
-
)
|
71
|
-
elsif attribute_consists_of_message.is_a?(Proc)
|
72
|
-
input_work = attribute_data.fetch(:work)
|
73
|
-
|
74
|
-
attribute_consists_of_message.call(
|
75
|
-
input: input_work,
|
76
|
-
expected_type: String,
|
77
|
-
given_type: Servactory::TestKit::FakeType.new.class.name
|
78
|
-
)
|
79
|
-
else
|
80
|
-
attribute_consists_of_message
|
81
|
-
end
|
61
|
+
attribute_must_keys.difference(expected_keys).empty? &&
|
62
|
+
expected_keys.difference(attribute_must_keys).empty?
|
82
63
|
end
|
83
64
|
|
84
|
-
def build_missing_option
|
85
|
-
|
86
|
-
|
87
|
-
unless attribute_consists_of.difference(consists_of_types).empty?
|
88
|
-
text_about_types = option_types.size > 1 ? "the following types" : "type"
|
89
|
-
|
90
|
-
return <<~MESSAGE
|
91
|
-
should be a collection consisting of #{text_about_types}
|
92
|
-
|
93
|
-
expected #{consists_of_types.inspect}
|
94
|
-
got #{attribute_consists_of.inspect}
|
95
|
-
MESSAGE
|
96
|
-
end
|
97
|
-
|
98
|
-
if custom_message.present? && !attribute_consists_of_message.casecmp(custom_message).zero?
|
99
|
-
return <<~MESSAGE
|
100
|
-
should be a collection with a message
|
101
|
-
|
102
|
-
expected #{custom_message.inspect}
|
103
|
-
got #{attribute_consists_of_message.inspect}
|
104
|
-
MESSAGE
|
105
|
-
end
|
106
|
-
|
107
|
-
<<~MESSAGE
|
108
|
-
got an unexpected case when using `consists_of`
|
109
|
-
|
110
|
-
Please try to build an example based on the documentation.
|
111
|
-
Or report your problem to us:
|
112
|
-
|
113
|
-
https://github.com/servactory/servactory/issues
|
114
|
-
MESSAGE
|
65
|
+
def build_missing_option
|
66
|
+
"should be consists_of"
|
115
67
|
end
|
116
68
|
end
|
117
69
|
end
|
@@ -46,8 +46,13 @@ module Servactory
|
|
46
46
|
def submatcher_passes?(_subject)
|
47
47
|
attribute_must = attribute_data.fetch(:must)
|
48
48
|
|
49
|
-
attribute_must.keys
|
50
|
-
|
49
|
+
attribute_must_keys = attribute_must.keys
|
50
|
+
|
51
|
+
# NOTE: Even though the dynamic option `consists_of` is a `must`, here we are testing explicit `must`.
|
52
|
+
attribute_must_keys.delete(:consists_of)
|
53
|
+
|
54
|
+
attribute_must_keys.difference(must_names).empty? &&
|
55
|
+
must_names.difference(attribute_must_keys).empty?
|
51
56
|
end
|
52
57
|
|
53
58
|
def build_missing_option
|
@@ -1,5 +1,10 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require_relative "have_service_input_matchers/default_matcher"
|
4
|
+
require_relative "have_service_input_matchers/optional_matcher"
|
5
|
+
require_relative "have_service_input_matchers/required_matcher"
|
6
|
+
require_relative "have_service_input_matchers/valid_with_matcher"
|
7
|
+
|
3
8
|
module Servactory
|
4
9
|
module TestKit
|
5
10
|
module Rspec
|
@@ -17,6 +17,8 @@ module Servactory
|
|
17
17
|
|
18
18
|
@attribute_data = described_class.info.public_send(attribute_type_plural).fetch(attribute_name)
|
19
19
|
|
20
|
+
@i18n_root_key = described_class.config.i18n_root_key
|
21
|
+
|
20
22
|
@missing_option = ""
|
21
23
|
end
|
22
24
|
|
@@ -41,7 +43,8 @@ module Servactory
|
|
41
43
|
:attribute_type_plural,
|
42
44
|
:attribute_name,
|
43
45
|
:custom_message,
|
44
|
-
:attribute_data
|
46
|
+
:attribute_data,
|
47
|
+
:i18n_root_key
|
45
48
|
|
46
49
|
def submatcher_passes?(_subject) # rubocop:disable Metrics/MethodLength, Metrics/AbcSize
|
47
50
|
attribute_required = attribute_data.fetch(:required).fetch(:is)
|
@@ -51,7 +54,7 @@ module Servactory
|
|
51
54
|
|
52
55
|
if attribute_required_message.nil?
|
53
56
|
attribute_required_message = I18n.t(
|
54
|
-
"
|
57
|
+
"#{i18n_root_key}.#{attribute_type_plural}.validations.required.default_error.default",
|
55
58
|
service_class_name: described_class.name,
|
56
59
|
"#{attribute_type}_name": attribute_name
|
57
60
|
)
|
data/lib/servactory/test_kit/rspec/matchers/have_service_input_matchers/valid_with_matcher.rb
CHANGED
@@ -17,6 +17,8 @@ module Servactory
|
|
17
17
|
|
18
18
|
@attribute_data = described_class.info.public_send(attribute_type_plural).fetch(attribute_name)
|
19
19
|
|
20
|
+
@i18n_root_key = described_class.config.i18n_root_key
|
21
|
+
|
20
22
|
@missing_option = ""
|
21
23
|
end
|
22
24
|
|
@@ -41,7 +43,8 @@ module Servactory
|
|
41
43
|
:attribute_type_plural,
|
42
44
|
:attribute_name,
|
43
45
|
:attributes,
|
44
|
-
:attribute_data
|
46
|
+
:attribute_data,
|
47
|
+
:i18n_root_key
|
45
48
|
|
46
49
|
def submatcher_passes?(_subject) # rubocop:disable Metrics/CyclomaticComplexity
|
47
50
|
success_passes? &&
|
@@ -60,41 +63,18 @@ module Servactory
|
|
60
63
|
|
61
64
|
def failure_type_passes? # rubocop:disable Metrics/MethodLength, Metrics/AbcSize
|
62
65
|
option_types = attribute_data.fetch(:types)
|
63
|
-
input_first_type = option_types.first
|
64
|
-
input_required = attribute_data.fetch(:required).fetch(:is)
|
65
|
-
attribute_consists_of_types = Array(attribute_data.fetch(:consists_of).fetch(:type))
|
66
|
-
attribute_consists_of_first_type = attribute_consists_of_types.first
|
67
66
|
|
68
67
|
prepared_attributes = attributes.dup
|
69
68
|
prepared_attributes[attribute_name] = Servactory::TestKit::FakeType.new
|
70
69
|
|
71
70
|
input_required_message =
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
)
|
80
|
-
else
|
81
|
-
I18n.t(
|
82
|
-
"servactory.#{attribute_type_plural}.validations.type.default_error.for_collection.wrong_type",
|
83
|
-
service_class_name: described_class.name,
|
84
|
-
"#{attribute_type}_name": attribute_name,
|
85
|
-
expected_type: option_types.join(", "),
|
86
|
-
given_type: Servactory::TestKit::FakeType.new.class.name
|
87
|
-
)
|
88
|
-
end
|
89
|
-
else
|
90
|
-
I18n.t(
|
91
|
-
"servactory.#{attribute_type_plural}.validations.type.default_error.default",
|
92
|
-
service_class_name: described_class.name,
|
93
|
-
"#{attribute_type}_name": attribute_name,
|
94
|
-
expected_type: option_types.join(", "),
|
95
|
-
given_type: Servactory::TestKit::FakeType.new.class.name
|
96
|
-
)
|
97
|
-
end
|
71
|
+
I18n.t(
|
72
|
+
"#{i18n_root_key}.#{attribute_type_plural}.validations.type.default_error.default",
|
73
|
+
service_class_name: described_class.name,
|
74
|
+
"#{attribute_type}_name": attribute_name,
|
75
|
+
expected_type: option_types.join(", "),
|
76
|
+
given_type: Servactory::TestKit::FakeType.new.class.name
|
77
|
+
)
|
98
78
|
|
99
79
|
expect_failure_with!(prepared_attributes, input_required_message)
|
100
80
|
end
|
@@ -111,7 +91,7 @@ module Servactory
|
|
111
91
|
|
112
92
|
if input_required_message.nil?
|
113
93
|
input_required_message = I18n.t(
|
114
|
-
"
|
94
|
+
"#{i18n_root_key}.#{attribute_type_plural}.validations.required.default_error.default",
|
115
95
|
service_class_name: described_class.name,
|
116
96
|
"#{attribute_type}_name": attribute_name
|
117
97
|
)
|
@@ -131,38 +111,14 @@ module Servactory
|
|
131
111
|
expect_failure_with!(prepared_attributes, nil)
|
132
112
|
end
|
133
113
|
|
134
|
-
def
|
135
|
-
# NOTE: Checking for negative cases is not implemented for `
|
114
|
+
def failure_consists_of_passes?
|
115
|
+
# NOTE: Checking for negative cases is not implemented for `consists_of`
|
136
116
|
true
|
137
117
|
end
|
138
118
|
|
139
|
-
def
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
return true unless described_class.config.collection_mode_class_names.include?(input_first_type)
|
144
|
-
|
145
|
-
prepared_attributes = attributes.dup
|
146
|
-
prepared_attributes[attribute_name] = input_first_type[Servactory::TestKit::FakeType.new]
|
147
|
-
|
148
|
-
attribute_consists_of_types = Array(attribute_data.fetch(:consists_of).fetch(:type))
|
149
|
-
attribute_consists_of_first_type = attribute_consists_of_types.first
|
150
|
-
|
151
|
-
return true if attribute_consists_of_first_type == false
|
152
|
-
|
153
|
-
attribute_consists_of_message = attribute_data.fetch(:consists_of).fetch(:message)
|
154
|
-
|
155
|
-
if attribute_consists_of_message.nil?
|
156
|
-
attribute_consists_of_message = I18n.t(
|
157
|
-
"servactory.#{attribute_type_plural}.validations.type.default_error.for_collection.wrong_element_type", # rubocop:disable Layout/LineLength
|
158
|
-
service_class_name: described_class.name,
|
159
|
-
"#{attribute_type}_name": attribute_name,
|
160
|
-
expected_type: attribute_consists_of_types.join(", "),
|
161
|
-
given_type: prepared_attributes[attribute_name].map { _1.class.name }.join(", ")
|
162
|
-
)
|
163
|
-
end
|
164
|
-
|
165
|
-
expect_failure_with!(prepared_attributes, attribute_consists_of_message)
|
119
|
+
def failure_format_passes?
|
120
|
+
# NOTE: Checking for negative cases is not implemented for `format`
|
121
|
+
true
|
166
122
|
end
|
167
123
|
|
168
124
|
def failure_inclusion_passes? # rubocop:disable Metrics/MethodLength, Metrics/AbcSize
|
@@ -179,7 +135,7 @@ module Servactory
|
|
179
135
|
|
180
136
|
if input_required_message.nil?
|
181
137
|
input_required_message = I18n.t(
|
182
|
-
"
|
138
|
+
"#{i18n_root_key}.#{attribute_type_plural}.validations.inclusion.default_error",
|
183
139
|
service_class_name: described_class.name,
|
184
140
|
"#{attribute_type}_name": attribute_name,
|
185
141
|
"#{attribute_type}_inclusion": input_inclusion_in,
|
@@ -1,5 +1,10 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require_relative "have_service_attribute_matchers/types_matcher"
|
4
|
+
require_relative "have_service_attribute_matchers/consists_of_matcher"
|
5
|
+
require_relative "have_service_attribute_matchers/inclusion_matcher"
|
6
|
+
require_relative "have_service_attribute_matchers/must_matcher"
|
7
|
+
|
3
8
|
module Servactory
|
4
9
|
module TestKit
|
5
10
|
module Rspec
|