servactory 1.4.0 → 1.4.2

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: d4ffa3b926585163837e461a8a1b129a81f951f88a8d715dd6e74297e0a37ddd
4
- data.tar.gz: 1d1a3326828e282ad0f46bc76e2754fb44e0dbd5f2e00c452cd6e856866bcbbd
3
+ metadata.gz: 781548f2f3cda01476bfa6570d3b1fac94890c3b86271f6bc58a32542f2d2ce9
4
+ data.tar.gz: fdddb44644b45ce539193db90e86bfefc63b3fd8140b2a54bd8654d22027191a
5
5
  SHA512:
6
- metadata.gz: 07c4e1f255a4fabe953a3c1381229000b564b80fc0e4f1c08547fed23dcc9cb9b31ebab678d76f894ce55e5506120d412fab26bf214f433f00cf43d958b502d7
7
- data.tar.gz: 85cadb2169b968a0e9cda6f9279d9be37b01acdc0f7f91ca2b7f8458e89a219213ad317b84002d1b7684bb695a73b4c5a3a6c092a4e3a61c05984e2ee027a164
6
+ metadata.gz: 60bc160221bfad63233635071ddb345f814c9ca1bdab3867cb5d3ae58835b43bca0c6a7928200a2553995bf836cfe1592d42f3dbfaa48ea97e44af8ae5eb75e2
7
+ data.tar.gz: 8a272ec82df4539946462099c9dd45857d1583b1526f74fa78d05e1a8896762e61a580bac4016ea0b78c62bb1ebf16480e9992dfadd4c99950b0938557a68f54
data/README.md CHANGED
@@ -3,26 +3,27 @@
3
3
  A set of tools for building reliable services of any complexity.
4
4
 
5
5
  [![Gem version](https://img.shields.io/gem/v/servactory?logo=rubygems&logoColor=fff)](https://rubygems.org/gems/servactory)
6
+ [![Release Date](https://img.shields.io/github/release-date/afuno/servactory)](https://github.com/afuno/servactory/releases)
6
7
 
7
8
  ## Contents
8
9
 
9
- - [Requirements](https://github.com/afuno/servactory/edit/main/README.md#requirements)
10
- - [Getting started](https://github.com/afuno/servactory/edit/main/README.md#getting-started)
11
- - [Conventions](https://github.com/afuno/servactory/edit/main/README.md#conventions)
12
- - [Installation](https://github.com/afuno/servactory/edit/main/README.md#installation)
13
- - [Preparation](https://github.com/afuno/servactory/edit/main/README.md#preparation)
14
- - [Usage](https://github.com/afuno/servactory/edit/main/README.md#usage)
15
- - [Minimal example](https://github.com/afuno/servactory#minimal-example)
16
- - [Input attributes](https://github.com/afuno/servactory#input-attributes)
17
- - [Isolated usage](https://github.com/afuno/servactory#isolated-usage)
18
- - [As an internal argument](https://github.com/afuno/servactory#isolated-usage)
19
- - [Optional inputs](https://github.com/afuno/servactory#optional-inputs)
20
- - [An array of specific values](https://github.com/afuno/servactory#an-array-of-specific-values)
21
- - [Inclusion](https://github.com/afuno/servactory#inclusion)
22
- - [Must](https://github.com/afuno/servactory#must)
23
- - [Output attributes](https://github.com/afuno/servactory/edit/main/README.md#output-attributes)
24
- - [Internal attributes](https://github.com/afuno/servactory/edit/main/README.md#internal-attributes)
25
- - [Result](https://github.com/afuno/servactory/edit/main/README.md#result)
10
+ - [Requirements](#requirements)
11
+ - [Getting started](#getting-started)
12
+ - [Conventions](#conventions)
13
+ - [Installation](#installation)
14
+ - [Preparation](#preparation)
15
+ - [Usage](#usage)
16
+ - [Minimal example](#minimal-example)
17
+ - [Input attributes](#input-attributes)
18
+ - [Isolated usage](#isolated-usage)
19
+ - [As an internal argument](#isolated-usage)
20
+ - [Optional inputs](#optional-inputs)
21
+ - [An array of specific values](#an-array-of-specific-values)
22
+ - [Inclusion](#inclusion)
23
+ - [Must](#must)
24
+ - [Output attributes](#output-attributes)
25
+ - [Internal attributes](#internal-attributes)
26
+ - [Result](#result)
26
27
 
27
28
  ## Requirements
28
29
 
@@ -93,16 +94,18 @@ end
93
94
 
94
95
  ```ruby
95
96
  class MinimalService < ApplicationService::Base
96
- stage { make :something }
97
+ stage { make :call }
97
98
 
98
99
  private
99
100
 
100
- def something
101
+ def call
101
102
  # ...
102
103
  end
103
104
  end
104
105
  ```
105
106
 
107
+ [More examples](https://github.com/afuno/servactory/tree/main/examples/usual)
108
+
106
109
  ### Input attributes
107
110
 
108
111
  #### Isolated usage
@@ -8,7 +8,7 @@ module Servactory
8
8
  end
9
9
 
10
10
  module ClassMethods
11
- def call!(arguments) # rubocop:disable Metrics/MethodLength, Metrics/AbcSize
11
+ def call!(arguments = {}) # rubocop:disable Metrics/MethodLength, Metrics/AbcSize
12
12
  @context_store ||= Store.new(self)
13
13
 
14
14
  assign_data_with(arguments)
@@ -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
@@ -6,15 +6,13 @@ module Servactory
6
6
  ARRAY_DEFAULT_VALUE = ->(is: false, message: nil) { { is: is, message: message } }
7
7
 
8
8
  attr_reader :name,
9
- :collection_of_options,
10
- :types
9
+ :collection_of_options
11
10
 
12
11
  def initialize(name, collection_of_options:, type:, **options)
13
12
  @name = name
14
13
  @collection_of_options = collection_of_options
15
- @types = Array(type)
16
14
 
17
- add_basic_options_with(options)
15
+ add_basic_options_with(type: type, options: options)
18
16
 
19
17
  @collection_of_options.each do |option|
20
18
  self.class.attr_reader(:"#{option.name}")
@@ -23,13 +21,14 @@ module Servactory
23
21
  end
24
22
  end
25
23
 
26
- def add_basic_options_with(options)
24
+ def add_basic_options_with(type:, options:)
27
25
  # Check Class: Servactory::InputArguments::Checks::Required
28
26
  add_required_option_with(options)
29
27
 
30
28
  # Check Class: Servactory::InputArguments::Checks::Type
31
- add_array_option_with(options)
29
+ add_types_option_with(type)
32
30
  add_default_option_with(options)
31
+ add_array_option_with(options)
33
32
 
34
33
  # Check Class: Servactory::InputArguments::Checks::Inclusion
35
34
  add_inclusion_option_with(options)
@@ -69,28 +68,15 @@ module Servactory
69
68
  )
70
69
  end
71
70
 
72
- def add_array_option_with(options) # rubocop:disable Metrics/MethodLength
71
+ def add_types_option_with(type)
73
72
  collection_of_options << Option.new(
74
- name: :array,
73
+ name: :types,
75
74
  input: self,
75
+ original_value: Array(type),
76
76
  check_class: Servactory::InputArguments::Checks::Type,
77
- define_input_methods: lambda do
78
- <<-RUBY
79
- def array?
80
- Servactory::Utils.boolean?(array[:is])
81
- end
82
- RUBY
83
- end,
84
- define_conflicts: lambda do
85
- <<-RUBY
86
- return :array_vs_array if array? && types.include?(Array)
87
- return :array_vs_inclusion if array? && inclusion_present?
88
- RUBY
89
- end,
90
- need_for_checks: false,
91
- value_key: :is,
92
- value_fallback: false,
93
- **options
77
+ need_for_checks: true,
78
+ value_fallback: nil,
79
+ with_advanced_mode: false
94
80
  )
95
81
  end
96
82
 
@@ -113,6 +99,31 @@ module Servactory
113
99
  )
114
100
  end
115
101
 
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
+ )
125
+ end
126
+
116
127
  def add_inclusion_option_with(options) # rubocop:disable Metrics/MethodLength
117
128
  collection_of_options << Option.new(
118
129
  name: :inclusion,
@@ -172,11 +183,7 @@ module Servactory
172
183
  end
173
184
 
174
185
  def options_for_checks
175
- {
176
- types: types
177
- }.merge(
178
- collection_of_options.options_for_checks
179
- )
186
+ collection_of_options.options_for_checks
180
187
  end
181
188
 
182
189
  def conflict_code
@@ -14,12 +14,14 @@ module Servactory
14
14
  :value_key,
15
15
  :value
16
16
 
17
+ # rubocop:disable Metrics/MethodLength
17
18
  def initialize(
18
19
  name:,
19
20
  input:,
20
21
  check_class:,
21
22
  need_for_checks:,
22
23
  value_fallback:,
24
+ original_value: nil,
23
25
  value_key: nil,
24
26
  define_input_methods: nil,
25
27
  define_conflicts: nil,
@@ -32,10 +34,16 @@ module Servactory
32
34
  @need_for_checks = need_for_checks
33
35
  @value_key = value_key
34
36
 
35
- @value = prepare_value_for(options, value_fallback: value_fallback, with_advanced_mode: with_advanced_mode)
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
+ )
36
43
 
37
44
  input.instance_eval(define_input_methods.call) if define_input_methods.present?
38
45
  end
46
+ # rubocop:enable Metrics/MethodLength
39
47
 
40
48
  def need_for_checks?
41
49
  need_for_checks
@@ -43,7 +51,9 @@ module Servactory
43
51
 
44
52
  private
45
53
 
46
- def prepare_value_for(options, value_fallback:, with_advanced_mode:)
54
+ def prepare_value_for(original_value:, options:, value_fallback:, with_advanced_mode:)
55
+ return original_value if original_value.present?
56
+
47
57
  return options.fetch(@name, value_fallback) unless with_advanced_mode
48
58
 
49
59
  prepare_advanced_for(
@@ -39,9 +39,10 @@ module Servactory
39
39
  end
40
40
 
41
41
  def create_instance_variables
42
- Servactory::Inputs.class_eval(class_inputs_template)
42
+ inputs_class = Servactory::Inputs.dup
43
+ inputs_class.class_eval(class_inputs_template) if class_inputs_template.present?
43
44
 
44
- @context.assign_inputs(Servactory::Inputs.new(**@inputs_variables))
45
+ @context.assign_inputs(inputs_class.new(**@inputs_variables))
45
46
 
46
47
  @context.class.class_eval(context_internal_variables_template) if context_internal_variables_template.present?
47
48
 
@@ -54,10 +55,6 @@ module Servactory
54
55
 
55
56
  # EXAMPLE:
56
57
  #
57
- # attr_reader(*[:attr_1]); def initialize(attr_1); @attr_1 = attr_1; end
58
- #
59
- # OR
60
- #
61
58
  # attr_reader(*[:attr_1, :attr_2, :attr_3])
62
59
  #
63
60
  # def initialize(attr_1:, attr_2:, attr_3:)
@@ -65,18 +62,20 @@ module Servactory
65
62
  # end
66
63
  #
67
64
  def class_inputs_template
68
- <<-RUBY.squish
69
- attr_reader(*#{@inputs_variables.keys});
65
+ return if @inputs_variables.blank?
66
+
67
+ @class_inputs_template ||= <<-RUBY
68
+ attr_reader(*#{@inputs_variables.keys})
70
69
 
71
- def initialize(#{@inputs_variables.keys.join(':, ')}:);
72
- #{@inputs_variables.keys.map { |key| "@#{key} = #{key}" }.join('; ')};
70
+ def initialize(#{@inputs_variables.keys.join(':, ')}:)
71
+ #{@inputs_variables.keys.map { |key| "@#{key} = #{key}" }.join('; ')}
73
72
  end
74
73
  RUBY
75
74
  end
76
75
 
77
76
  # EXAMPLE:
78
77
  #
79
- # private attr_reader(*[:attr_1]);
78
+ # private; attr_reader(*[:attr_1]);
80
79
  #
81
80
  def context_internal_variables_template
82
81
  return if @internal_variables.blank?
@@ -1,7 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Servactory
4
- class Inputs # rubocop:disable Lint/EmptyClass
5
- # NOTE: Look at the file `lib/servactory/input_arguments/tools/prepare.rb`
4
+ class Inputs
5
+ def initialize(**)
6
+ # NOTE: Look at the file `lib/servactory/input_arguments/tools/prepare.rb`
7
+ end
6
8
  end
7
9
  end
@@ -4,7 +4,7 @@ module Servactory
4
4
  module VERSION
5
5
  MAJOR = 1
6
6
  MINOR = 4
7
- PATCH = 0
7
+ PATCH = 2
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.4.0
4
+ version: 1.4.2
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-07 00:00:00.000000000 Z
11
+ date: 2023-05-08 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