servactory 1.3.0 → 1.4.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e9766f87f647b0873a6671d88811141a77b571fb15ac5ee6b10b78e2e5696ca6
4
- data.tar.gz: c36ee73abad2d9241f6b48190cbf3351fe8c9c40bc7cb9bdfdfb09c04e5d05f8
3
+ metadata.gz: 40fbce39ff24b8ea522a6cbd2f2b2d48a9e09034e8cc636da53827eefb254d6f
4
+ data.tar.gz: d2f56d8b47aac242932780b1969c5b47e2da961762fd7625da776ecb9966132b
5
5
  SHA512:
6
- metadata.gz: 11b27258c9a302cb989eed03fe4f1325c03855f58fd3a79b6cad7a3846fa8e9395f780fe0d9a2dd30c9b044d4e98df4677857c93c275f9bfe8780d6ebefe5d5e
7
- data.tar.gz: 57800e68b8c8bece089513dcf0b0ff8da6ab2efb33a4d4a694b11995dae51b7dd0496b1b0f4b6c0ba403db5c6037432e43371d68bea5b56bb05844d98fb36e8e
6
+ metadata.gz: 7ecefb0457e5933ddc441df45adb512da42f815ca1cdb23920835aa5f39ea4e73c7eeb83832bb3d128c83a94a21126e30619af325f7afe540195e2a44cdead7a
7
+ data.tar.gz: 5d3772b974c1d23da5d2b75443d2a1437a0d547a8eb48f538391d66368f449f8065793f152401925a753eac4f908a6c7e02cbdbc8a0b4b019415da3ff44e89b3
data/README.md CHANGED
@@ -2,6 +2,28 @@
2
2
 
3
3
  A set of tools for building reliable services of any complexity.
4
4
 
5
+ [![Gem version](https://img.shields.io/gem/v/servactory?logo=rubygems&logoColor=fff)](https://rubygems.org/gems/servactory)
6
+
7
+ ## Contents
8
+
9
+ - [Requirements](#requirements)
10
+ - [Getting started](#getting-started)
11
+ - [Conventions](#conventions)
12
+ - [Installation](#installation)
13
+ - [Preparation](#preparation)
14
+ - [Usage](#usage)
15
+ - [Minimal example](#minimal-example)
16
+ - [Input attributes](#input-attributes)
17
+ - [Isolated usage](#isolated-usage)
18
+ - [As an internal argument](#isolated-usage)
19
+ - [Optional inputs](#optional-inputs)
20
+ - [An array of specific values](#an-array-of-specific-values)
21
+ - [Inclusion](#inclusion)
22
+ - [Must](#must)
23
+ - [Output attributes](#output-attributes)
24
+ - [Internal attributes](#internal-attributes)
25
+ - [Result](#result)
26
+
5
27
  ## Requirements
6
28
 
7
29
  - Ruby >= 2.7
@@ -70,7 +92,7 @@ end
70
92
  ### Minimal example
71
93
 
72
94
  ```ruby
73
- class SendService < ApplicationService::Base
95
+ class MinimalService < ApplicationService::Base
74
96
  stage { make :something }
75
97
 
76
98
  private
@@ -85,10 +107,10 @@ end
85
107
 
86
108
  #### Isolated usage
87
109
 
88
- With this approach, all input attributes are available only from `inputs`.
110
+ With this approach, all input attributes are available only from `inputs`. This is default behaviour.
89
111
 
90
112
  ```ruby
91
- class UserService::Accept < ApplicationService::Base
113
+ class UsersService::Accept < ApplicationService::Base
92
114
  input :user, type: User
93
115
 
94
116
  stage { make :accept! }
@@ -106,7 +128,7 @@ end
106
128
  With this approach, all input attributes are available from `inputs` as well as directly from the context.
107
129
 
108
130
  ```ruby
109
- class UserService::Accept < ApplicationService::Base
131
+ class UsersService::Accept < ApplicationService::Base
110
132
  input :user, type: User, internal: true
111
133
 
112
134
  stage { make :accept! }
@@ -119,6 +141,59 @@ class UserService::Accept < ApplicationService::Base
119
141
  end
120
142
  ```
121
143
 
144
+ #### Optional inputs
145
+
146
+ By default, all inputs are required. To make an input optional, specify `false` in the `required` option.
147
+
148
+ ```ruby
149
+ class UsersService::Create < ApplicationService::Base
150
+ input :first_name, type: String, internal: true
151
+ input :middle_name, type: String, required: false
152
+ input :last_name, type: String, internal: true
153
+
154
+ # ...
155
+ end
156
+ ```
157
+
158
+ #### An array of specific values
159
+
160
+ ```ruby
161
+ class PymentsService::Send < ApplicationService::Base
162
+ input :invoice_numbers, type: String, array: true
163
+
164
+ # ...
165
+ end
166
+ ```
167
+
168
+ #### Inclusion
169
+
170
+ ```ruby
171
+ class EventService::Send < ApplicationService::Base
172
+ input :event_name, type: String, inclusion: %w[created rejected approved]
173
+
174
+ # ...
175
+ end
176
+ ```
177
+
178
+ #### Must
179
+
180
+ Sometimes there are cases that require the implementation of a specific input attribute check. In such cases `must` can help.
181
+
182
+ ```ruby
183
+ class PymentsService::Send < ApplicationService::Base
184
+ input :invoice_numbers,
185
+ type: String,
186
+ array: true,
187
+ must: {
188
+ be_6_characters: {
189
+ is: ->(value:) { value.all? { |id| id.size == 6 } }
190
+ }
191
+ }
192
+
193
+ # ...
194
+ end
195
+ ```
196
+
122
197
  ### Output attributes
123
198
 
124
199
  ```ruby
@@ -35,11 +35,16 @@ module Servactory
35
35
 
36
36
  attr_reader :context_store
37
37
 
38
- def assign_data_with(arguments)
39
- input_arguments_workbench.assign(context: context_store.context, arguments: arguments) # 1
40
- internal_arguments_workbench.assign(context: context_store.context) # 2
41
- output_arguments_workbench.assign(context: context_store.context) # 3
42
- stage_handyman&.assign(context: context_store.context) # 4
38
+ def assign_data_with(arguments) # rubocop:disable Metrics/AbcSize
39
+ input_arguments_workbench.assign(
40
+ context: context_store.context,
41
+ arguments: arguments,
42
+ collection_of_input_options: collection_of_input_options
43
+ )
44
+
45
+ internal_arguments_workbench.assign(context: context_store.context)
46
+ output_arguments_workbench.assign(context: context_store.context)
47
+ stage_handyman&.assign(context: context_store.context)
43
48
  end
44
49
 
45
50
  def prepare_data
@@ -5,7 +5,7 @@ module Servactory
5
5
  module Checks
6
6
  class Inclusion < Base
7
7
  DEFAULT_MESSAGE = lambda do |service_class_name:, input:|
8
- "[#{service_class_name}] Wrong value in `#{input.name}`, must be one of `#{input.inclusion}`"
8
+ "[#{service_class_name}] Wrong value in `#{input.name}`, must be one of `#{input.inclusion[:in]}`"
9
9
  end
10
10
 
11
11
  private_constant :DEFAULT_MESSAGE
@@ -31,7 +31,7 @@ module Servactory
31
31
  end
32
32
 
33
33
  def check
34
- return if @input.inclusion.include?(@value)
34
+ return if @input.inclusion[:in].include?(@value)
35
35
 
36
36
  add_error(
37
37
  DEFAULT_MESSAGE,
@@ -57,10 +57,12 @@ module Servactory
57
57
  return if check.call(value: @value)
58
58
 
59
59
  message.presence || DEFAULT_MESSAGE
60
- rescue StandardError => _e
60
+ rescue StandardError => e
61
61
  message_text =
62
62
  "[#{@context.class.name}] Syntax error inside `#{code}` of `#{@input.name}` input"
63
63
 
64
+ puts "#{message_text}: #{e}"
65
+
64
66
  add_error(
65
67
  message_text,
66
68
  service_class_name: @context.class.name,
@@ -14,14 +14,14 @@ module Servactory
14
14
 
15
15
  private_constant :DEFAULT_MESSAGE
16
16
 
17
- def self.check(context:, input:, value:, **)
18
- return unless should_be_checked_for?(input)
17
+ def self.check(context:, input:, value:, check_key:, **)
18
+ return unless should_be_checked_for?(input, check_key)
19
19
 
20
20
  new(context: context, input: input, value: value).check
21
21
  end
22
22
 
23
- def self.should_be_checked_for?(input)
24
- input.required?
23
+ def self.should_be_checked_for?(input, check_key)
24
+ check_key == :required && input.required?
25
25
  end
26
26
 
27
27
  ##########################################################################
@@ -34,15 +34,17 @@ module Servactory
34
34
  @value = value
35
35
  end
36
36
 
37
- def check # rubocop:disable Metrics/MethodLength
37
+ def check # rubocop:disable Metrics/MethodLength, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
38
38
  if @input.array? && @value.present?
39
39
  return if @value.respond_to?(:all?) && @value.all?(&:present?)
40
40
  elsif @value.present?
41
41
  return
42
42
  end
43
43
 
44
+ _, message = @input.required.values_at(:is, :message)
45
+
44
46
  add_error(
45
- DEFAULT_MESSAGE,
47
+ message.presence || DEFAULT_MESSAGE,
46
48
  service_class_name: @context.class.name,
47
49
  input: @input,
48
50
  value: @value
@@ -11,13 +11,21 @@ module Servactory
11
11
  private
12
12
 
13
13
  def input(name, **options)
14
- collection_of_input_arguments << InputArgument.new(name, **options)
14
+ collection_of_input_arguments << InputArgument.new(
15
+ name,
16
+ collection_of_options: collection_of_input_options,
17
+ **options
18
+ )
15
19
  end
16
20
 
17
21
  def collection_of_input_arguments
18
22
  @collection_of_input_arguments ||= Collection.new
19
23
  end
20
24
 
25
+ def collection_of_input_options
26
+ @collection_of_input_options ||= OptionsCollection.new
27
+ end
28
+
21
29
  def input_arguments_workbench
22
30
  @input_arguments_workbench ||= Workbench.work_with(collection_of_input_arguments)
23
31
  end
@@ -2,86 +2,194 @@
2
2
 
3
3
  module Servactory
4
4
  module InputArguments
5
- class InputArgument
5
+ class InputArgument # rubocop:disable Metrics/ClassLength
6
6
  ARRAY_DEFAULT_VALUE = ->(is: false, message: nil) { { is: is, message: message } }
7
7
 
8
8
  attr_reader :name,
9
- :types,
10
- :inclusion,
11
- :must,
12
- :array,
13
- :required,
14
- :internal,
15
- :default
16
-
17
- def initialize(name, type:, **options)
9
+ :collection_of_options
10
+
11
+ def initialize(name, collection_of_options:, type:, **options)
18
12
  @name = name
19
- @types = Array(type)
20
-
21
- @inclusion = options.fetch(:inclusion, nil)
22
- @must = options.fetch(:must, nil)
23
- @array = prepare_advanced_for(options.fetch(:array, ARRAY_DEFAULT_VALUE.call))
24
- @required = options.fetch(:required, true)
25
- @internal = options.fetch(:internal, false)
26
- @default = options.fetch(:default, nil)
27
- end
13
+ @collection_of_options = collection_of_options
28
14
 
29
- def options_for_checks
30
- {
31
- types: types,
32
- inclusion: inclusion,
33
- must: must,
34
- required: required,
35
- # internal: internal,
36
- default: default
37
- }
38
- end
15
+ add_basic_options_with(type: type, options: options)
16
+
17
+ @collection_of_options.each do |option|
18
+ self.class.attr_reader(:"#{option.name}")
39
19
 
40
- def prepare_advanced_for(value)
41
- if value.is_a?(Hash)
42
- ARRAY_DEFAULT_VALUE.call(
43
- is: value.fetch(:is, false),
44
- message: value.fetch(:message, nil)
45
- )
46
- else
47
- ARRAY_DEFAULT_VALUE.call(is: value)
20
+ instance_variable_set(:"@#{option.name}", option.value)
48
21
  end
49
22
  end
50
23
 
51
- def conflict_code
52
- return :required_vs_default if required? && default_value_present?
53
- return :array_vs_array if array? && types.include?(Array)
54
- return :array_vs_inclusion if array? && inclusion_present?
24
+ def add_basic_options_with(type:, options:)
25
+ # Check Class: Servactory::InputArguments::Checks::Required
26
+ add_required_option_with(options)
55
27
 
56
- nil
28
+ # Check Class: Servactory::InputArguments::Checks::Type
29
+ add_types_option_with(type)
30
+ add_default_option_with(options)
31
+ add_array_option_with(options)
32
+
33
+ # Check Class: Servactory::InputArguments::Checks::Inclusion
34
+ add_inclusion_option_with(options)
35
+
36
+ # Check Class: Servactory::InputArguments::Checks::Must
37
+ add_must_option_with(options)
38
+
39
+ # Check Class: nil
40
+ add_internal_option_with(options)
41
+ end
42
+
43
+ def add_required_option_with(options) # rubocop:disable Metrics/MethodLength
44
+ collection_of_options << Option.new(
45
+ name: :required,
46
+ input: self,
47
+ check_class: Servactory::InputArguments::Checks::Required,
48
+ define_input_methods: lambda do
49
+ <<-RUBY
50
+ def required?
51
+ Servactory::Utils.boolean?(required[:is])
52
+ end
53
+
54
+ def optional?
55
+ !required?
56
+ end
57
+ RUBY
58
+ end,
59
+ define_conflicts: lambda do
60
+ <<-RUBY
61
+ return :required_vs_default if required? && default_value_present?
62
+ RUBY
63
+ end,
64
+ need_for_checks: true,
65
+ value_key: :is,
66
+ value_fallback: true,
67
+ **options
68
+ )
57
69
  end
58
70
 
59
- def inclusion_present?
60
- inclusion.is_a?(Array) && inclusion.present?
71
+ def add_types_option_with(type)
72
+ collection_of_options << Option.new(
73
+ name: :types,
74
+ input: self,
75
+ original_value: Array(type),
76
+ check_class: Servactory::InputArguments::Checks::Type,
77
+ need_for_checks: true,
78
+ value_fallback: nil,
79
+ with_advanced_mode: false
80
+ )
61
81
  end
62
82
 
63
- def must_present?
64
- must.present?
83
+ def add_default_option_with(options) # rubocop:disable Metrics/MethodLength
84
+ collection_of_options << Option.new(
85
+ name: :default,
86
+ input: self,
87
+ check_class: Servactory::InputArguments::Checks::Type,
88
+ define_input_methods: lambda do
89
+ <<-RUBY
90
+ def default_value_present?
91
+ !default.nil?
92
+ end
93
+ RUBY
94
+ end,
95
+ need_for_checks: true,
96
+ value_fallback: nil,
97
+ with_advanced_mode: false,
98
+ **options
99
+ )
65
100
  end
66
101
 
67
- def array?
68
- Servactory::Utils.boolean?(array[:is])
102
+ def add_array_option_with(options) # rubocop:disable Metrics/MethodLength
103
+ collection_of_options << Option.new(
104
+ name: :array,
105
+ input: self,
106
+ check_class: Servactory::InputArguments::Checks::Type,
107
+ define_input_methods: lambda do
108
+ <<-RUBY
109
+ def array?
110
+ Servactory::Utils.boolean?(array[:is])
111
+ end
112
+ RUBY
113
+ end,
114
+ define_conflicts: lambda do
115
+ <<-RUBY
116
+ return :array_vs_array if array? && types.include?(Array)
117
+ return :array_vs_inclusion if array? && inclusion_present?
118
+ RUBY
119
+ end,
120
+ need_for_checks: false,
121
+ value_key: :is,
122
+ value_fallback: false,
123
+ **options
124
+ )
69
125
  end
70
126
 
71
- def required?
72
- Servactory::Utils.boolean?(required)
127
+ def add_inclusion_option_with(options) # rubocop:disable Metrics/MethodLength
128
+ collection_of_options << Option.new(
129
+ name: :inclusion,
130
+ input: self,
131
+ check_class: Servactory::InputArguments::Checks::Inclusion,
132
+ define_input_methods: lambda do
133
+ <<-RUBY
134
+ def inclusion_present?
135
+ inclusion[:in].is_a?(Array) && inclusion[:in].present?
136
+ end
137
+ RUBY
138
+ end,
139
+ need_for_checks: true,
140
+ value_key: :in,
141
+ value_fallback: nil,
142
+ **options
143
+ )
73
144
  end
74
145
 
75
- def optional?
76
- !required?
146
+ def add_must_option_with(options) # rubocop:disable Metrics/MethodLength
147
+ collection_of_options << Option.new(
148
+ name: :must,
149
+ input: self,
150
+ check_class: Servactory::InputArguments::Checks::Must,
151
+ define_input_methods: lambda do
152
+ <<-RUBY
153
+ def must_present?
154
+ must.present?
155
+ end
156
+ RUBY
157
+ end,
158
+ need_for_checks: true,
159
+ value_key: :is,
160
+ value_fallback: nil,
161
+ with_advanced_mode: false,
162
+ **options
163
+ )
77
164
  end
78
165
 
79
- def internal?
80
- Servactory::Utils.boolean?(internal)
166
+ def add_internal_option_with(options) # rubocop:disable Metrics/MethodLength
167
+ collection_of_options << Option.new(
168
+ name: :internal,
169
+ input: self,
170
+ define_input_methods: lambda do
171
+ <<-RUBY
172
+ def internal?
173
+ Servactory::Utils.boolean?(internal[:is])
174
+ end
175
+ RUBY
176
+ end,
177
+ need_for_checks: false,
178
+ check_class: nil,
179
+ value_key: :is,
180
+ value_fallback: false,
181
+ **options
182
+ )
81
183
  end
82
184
 
83
- def default_value_present?
84
- !default.nil?
185
+ def options_for_checks
186
+ collection_of_options.options_for_checks
187
+ end
188
+
189
+ def conflict_code
190
+ instance_eval(collection_of_options.defined_conflicts)
191
+
192
+ nil
85
193
  end
86
194
 
87
195
  def with_conflicts?
@@ -0,0 +1,78 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Servactory
4
+ module InputArguments
5
+ class Option
6
+ DEFAULT_VALUE = ->(key:, value:, message: nil) { { key => value, message: message } }
7
+
8
+ private_constant :DEFAULT_VALUE
9
+
10
+ attr_reader :name,
11
+ :check_class,
12
+ :define_conflicts,
13
+ :need_for_checks,
14
+ :value_key,
15
+ :value
16
+
17
+ # rubocop:disable Metrics/MethodLength
18
+ def initialize(
19
+ name:,
20
+ input:,
21
+ check_class:,
22
+ need_for_checks:,
23
+ value_fallback:,
24
+ original_value: nil,
25
+ value_key: nil,
26
+ define_input_methods: nil,
27
+ define_conflicts: nil,
28
+ with_advanced_mode: true,
29
+ **options
30
+ ) # do
31
+ @name = name.to_sym
32
+ @check_class = check_class
33
+ @define_conflicts = define_conflicts
34
+ @need_for_checks = need_for_checks
35
+ @value_key = value_key
36
+
37
+ @value = prepare_value_for(
38
+ original_value: original_value,
39
+ options: options,
40
+ value_fallback: value_fallback,
41
+ with_advanced_mode: with_advanced_mode
42
+ )
43
+
44
+ input.instance_eval(define_input_methods.call) if define_input_methods.present?
45
+ end
46
+ # rubocop:enable Metrics/MethodLength
47
+
48
+ def need_for_checks?
49
+ need_for_checks
50
+ end
51
+
52
+ private
53
+
54
+ def prepare_value_for(original_value:, options:, value_fallback:, with_advanced_mode:)
55
+ return original_value if original_value.present?
56
+
57
+ return options.fetch(@name, value_fallback) unless with_advanced_mode
58
+
59
+ prepare_advanced_for(
60
+ value: options.fetch(@name, DEFAULT_VALUE.call(key: value_key, value: value_fallback)),
61
+ value_fallback: value_fallback
62
+ )
63
+ end
64
+
65
+ def prepare_advanced_for(value:, value_fallback:)
66
+ if value.is_a?(Hash)
67
+ DEFAULT_VALUE.call(
68
+ key: value_key,
69
+ value: value.fetch(value_key, value_fallback),
70
+ message: value.fetch(:message, nil)
71
+ )
72
+ else
73
+ DEFAULT_VALUE.call(key: value_key, value: value)
74
+ end
75
+ end
76
+ end
77
+ end
78
+ end
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Servactory
4
+ module InputArguments
5
+ class OptionsCollection
6
+ # NOTE: http://words.steveklabnik.com/beware-subclassing-ruby-core-classes
7
+ extend Forwardable
8
+ def_delegators :@collection, :<<, :each, :select, :map
9
+
10
+ def initialize(*)
11
+ @collection = []
12
+ end
13
+
14
+ def check_classes
15
+ select { |option| option.check_class.present? }.map(&:check_class).uniq
16
+ end
17
+
18
+ def options_for_checks
19
+ select(&:need_for_checks?).to_h do |option|
20
+ value = if option.value.is_a?(Hash)
21
+ option.value.key?(:is) ? option.value.fetch(:is) : option.value
22
+ else
23
+ option.value
24
+ end
25
+
26
+ [option.name, value]
27
+ end
28
+ end
29
+
30
+ def defined_conflicts
31
+ map { |option| option.define_conflicts&.call }.reject(&:blank?).uniq.join
32
+ end
33
+ end
34
+ end
35
+ end
@@ -8,10 +8,11 @@ module Servactory
8
8
  new(...).check!
9
9
  end
10
10
 
11
- def initialize(context, incoming_arguments, collection_of_input_arguments)
11
+ def initialize(context, incoming_arguments, collection_of_input_arguments, collection_of_input_options)
12
12
  @context = context
13
13
  @incoming_arguments = incoming_arguments
14
14
  @collection_of_input_arguments = collection_of_input_arguments
15
+ @collection_of_input_options = collection_of_input_options
15
16
 
16
17
  @errors = []
17
18
  end
@@ -58,20 +59,15 @@ module Servactory
58
59
  ########################################################################
59
60
 
60
61
  def check_classes
61
- [
62
- Servactory::InputArguments::Checks::Required,
63
- Servactory::InputArguments::Checks::Type,
64
- Servactory::InputArguments::Checks::Inclusion,
65
- Servactory::InputArguments::Checks::Must
66
- ]
62
+ @collection_of_input_options.check_classes
67
63
  end
68
64
 
69
65
  ########################################################################
70
66
 
71
67
  def raise_errors
72
- return if @errors.empty?
68
+ return if (tmp_errors = @errors.reject(&:blank?).uniq).empty?
73
69
 
74
- raise Servactory.configuration.input_argument_error_class, @errors.first
70
+ raise Servactory.configuration.input_argument_error_class, tmp_errors.first
75
71
  end
76
72
  end
77
73
  end
@@ -11,9 +11,10 @@ module Servactory
11
11
  @collection_of_input_arguments = collection_of_input_arguments
12
12
  end
13
13
 
14
- def assign(context:, arguments:)
14
+ def assign(context:, arguments:, collection_of_input_options:)
15
15
  @context = context
16
16
  @incoming_arguments = arguments
17
+ @collection_of_input_options = collection_of_input_options
17
18
  end
18
19
 
19
20
  def find_unnecessary!
@@ -29,12 +30,14 @@ module Servactory
29
30
  end
30
31
 
31
32
  def check!
32
- Tools::Check.check!(context, @incoming_arguments, collection_of_input_arguments)
33
+ Tools::Check.check!(context, @incoming_arguments, collection_of_input_arguments, collection_of_input_options)
33
34
  end
34
35
 
35
36
  private
36
37
 
37
- attr_reader :context, :collection_of_input_arguments
38
+ attr_reader :context,
39
+ :collection_of_input_arguments,
40
+ :collection_of_input_options
38
41
  end
39
42
  end
40
43
  end
@@ -3,8 +3,8 @@
3
3
  module Servactory
4
4
  module VERSION
5
5
  MAJOR = 1
6
- MINOR = 3
7
- PATCH = 0
6
+ MINOR = 4
7
+ PATCH = 1
8
8
 
9
9
  STRING = [MAJOR, MINOR, PATCH].join(".")
10
10
  end
metadata CHANGED
@@ -1,43 +1,43 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: servactory
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.3.0
4
+ version: 1.4.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Anton Sokolov
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-05-06 00:00:00.000000000 Z
11
+ date: 2023-05-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: zeitwerk
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ">="
17
+ - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '0'
19
+ version: '2.6'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - ">="
24
+ - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '0'
26
+ version: '2.6'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: activesupport
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - ">="
31
+ - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '0'
33
+ version: '7.0'
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - ">="
38
+ - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: '0'
40
+ version: '7.0'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: rake
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -178,6 +178,8 @@ files:
178
178
  - lib/servactory/input_arguments/collection.rb
179
179
  - lib/servactory/input_arguments/dsl.rb
180
180
  - lib/servactory/input_arguments/input_argument.rb
181
+ - lib/servactory/input_arguments/option.rb
182
+ - lib/servactory/input_arguments/options_collection.rb
181
183
  - lib/servactory/input_arguments/tools/check.rb
182
184
  - lib/servactory/input_arguments/tools/find_unnecessary.rb
183
185
  - lib/servactory/input_arguments/tools/prepare.rb