servactory 1.8.4 → 1.8.6

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: 5ca0fa5827beb874848039178b4711da493272bc8d1005ba5f0d7d3a566aa099
4
- data.tar.gz: 62e0eb9d9a955aaf04848f7612ac7f91a88cd583e5ead545d25df9ec99a02e06
3
+ metadata.gz: 63d469613e34fcd13e27dc8fb62fa6c36fc25cf9b9e35f5b21af30013ac75993
4
+ data.tar.gz: e3edd5a0bfbd2b889e81be1aeeaa836f80c6e9925c65e5f4ed09ce2a35d44673
5
5
  SHA512:
6
- metadata.gz: a0720019832d9e0e5b8ca4ed63641ab2f21457b85dbe645bdbe9d1c771b13e261b60318368ec1f3dc98a1a0108761e67b9225c3da678bb9e4f29de5df47dd407
7
- data.tar.gz: 8b4471a08a037994f8b8e79aac11fb5d0bdaec365ea48a1843323a09518d5a679586656f11ef6c8f1805e18f1236e76ee00f2fd4646f4084e28b6a6d6939b90f
6
+ metadata.gz: 774bb94eb10a8695cde168e8cd7bc224ebc65804e2092c617dacf471612d1b3980dbc2f6d80b0418f9885a4697587c9d2d12c4172b176d79de4d6114f5198aed
7
+ data.tar.gz: 2987a6379e4404e1757e4cef6749ae3e5fd8b98712d23e630b1b0a5bde5cdac8232046089d59cc1e642b7a540a9def431dfc6708e3696a14b517ce22cd1025f7
@@ -24,8 +24,9 @@ module Servactory
24
24
 
25
25
  private
26
26
 
27
- def getter_with(name:, &block) # rubocop:disable Lint/UnusedMethodArgument
28
- input = @collection_of_inputs.find_by(name: name)
27
+ def getter_with(name:, &block) # rubocop:disable Metrics/MethodLength, Lint/UnusedMethodArgument, Metrics/AbcSize
28
+ input_name = name.to_s.chomp("?").to_sym
29
+ input = @collection_of_inputs.find_by(name: input_name)
29
30
 
30
31
  return yield if input.nil?
31
32
 
@@ -35,7 +36,11 @@ module Servactory
35
36
  input_prepare = input.prepare.fetch(:in, nil)
36
37
  input_value = input_prepare.call(value: input_value) if input_prepare.present?
37
38
 
38
- input_value
39
+ if name.to_s.end_with?("?")
40
+ Servactory::Utils.query_attribute(input_value)
41
+ else
42
+ input_value
43
+ end
39
44
  end
40
45
  end
41
46
  end
@@ -42,11 +42,18 @@ module Servactory
42
42
  end
43
43
 
44
44
  def getter_with(name:, &block) # rubocop:disable Lint/UnusedMethodArgument
45
- internal = @collection_of_internals.find_by(name: name)
45
+ internal_name = name.to_s.chomp("?").to_sym
46
+ internal = @collection_of_internals.find_by(name: internal_name)
46
47
 
47
48
  return yield if internal.nil?
48
49
 
49
- @context.send(:fetch_internal, internal.name)
50
+ internal_value = @context.send(:fetch_internal, internal.name)
51
+
52
+ if name.to_s.end_with?("?")
53
+ Servactory::Utils.query_attribute(internal_value)
54
+ else
55
+ internal_value
56
+ end
50
57
  end
51
58
  end
52
59
  end
@@ -42,11 +42,18 @@ module Servactory
42
42
  end
43
43
 
44
44
  def getter_with(name:, &block) # rubocop:disable Lint/UnusedMethodArgument
45
- output = @collection_of_outputs.find_by(name: name)
45
+ output_name = name.to_s.chomp("?").to_sym
46
+ output = @collection_of_outputs.find_by(name: output_name)
46
47
 
47
48
  return yield if output.nil?
48
49
 
49
- @context.send(:fetch_output, output.name)
50
+ output_value = @context.send(:fetch_output, output.name)
51
+
52
+ if name.to_s.end_with?("?")
53
+ Servactory::Utils.query_attribute(output_value)
54
+ else
55
+ output_value
56
+ end
50
57
  end
51
58
  end
52
59
  end
@@ -187,7 +187,7 @@ module Servactory
187
187
  )
188
188
  end
189
189
 
190
- def add_prepare_option_with(options)
190
+ def add_prepare_option_with(options) # rubocop:disable Metrics/MethodLength, Metrics/AbcSize
191
191
  collection_of_options << Option.new(
192
192
  name: :prepare,
193
193
  input: self,
@@ -42,6 +42,14 @@ module Servactory
42
42
  def only_if(condition)
43
43
  return if @current_stage.blank?
44
44
 
45
+ @current_stage.is_condition_opposite = false
46
+ @current_stage.condition = condition
47
+ end
48
+
49
+ def only_unless(condition)
50
+ return if @current_stage.blank?
51
+
52
+ @current_stage.is_condition_opposite = true
45
53
  @current_stage.condition = condition
46
54
  end
47
55
 
@@ -6,7 +6,8 @@ module Servactory
6
6
  attr_accessor :position,
7
7
  :wrapper,
8
8
  :rollback,
9
- :condition
9
+ :condition,
10
+ :is_condition_opposite
10
11
 
11
12
  def initialize(position:, wrapper: nil, rollback: nil, condition: nil)
12
13
  @position = position
@@ -57,12 +57,11 @@ module Servactory
57
57
 
58
58
  def unnecessary_for_stage?(stage)
59
59
  condition = stage.condition
60
- # is_condition_opposite = stage.is_condition_opposite
60
+ is_condition_opposite = stage.is_condition_opposite
61
61
 
62
- result = prepare_condition_for(condition) # rubocop:disable Style/RedundantAssignment
62
+ result = prepare_condition_for(condition)
63
63
 
64
- # is_condition_opposite ? !result : result
65
- result
64
+ is_condition_opposite ? !result : result
66
65
  end
67
66
 
68
67
  def unnecessary_for_make?(make_method)
@@ -5,7 +5,6 @@ module Servactory
5
5
  module DSL
6
6
  def self.included(base)
7
7
  base.extend(ClassMethods)
8
- base.include(Workspace)
9
8
  end
10
9
 
11
10
  module ClassMethods
@@ -26,6 +26,7 @@ module Servactory
26
26
  define_singleton_method(:failure?) { false }
27
27
 
28
28
  @context.send(:service_storage).fetch(:outputs).each_pair do |key, value|
29
+ define_singleton_method(:"#{key}?") { Servactory::Utils.query_attribute(value) }
29
30
  define_singleton_method(key) { value }
30
31
  end
31
32
 
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Servactory
4
4
  module TestKit
5
- class FakeType; end
5
+ class FakeType; end # rubocop:disable Lint/EmptyClass
6
6
  end
7
7
  end
@@ -4,16 +4,51 @@ module Servactory
4
4
  module Utils
5
5
  module_function
6
6
 
7
+ FALSE_VALUES = [
8
+ false,
9
+ nil, "",
10
+ "0", :"0", 0,
11
+ "f", :f,
12
+ "F", :F,
13
+ "false", :false, # rubocop:disable Lint/BooleanSymbol
14
+ "FALSE", :FALSE,
15
+ "off", :off,
16
+ "OFF", :OFF
17
+ ].to_set.freeze
18
+
19
+ private_constant :FALSE_VALUES
20
+
7
21
  # @param value [#to_s]
8
22
  # @return [Boolean]
9
23
  def true?(value)
10
- value.to_s.casecmp("true").to_i.zero?
24
+ !FALSE_VALUES.include?(value)
11
25
  end
12
26
 
27
+ # @param value [#to_s]
28
+ # @return [Boolean]
13
29
  def value_present?(value)
14
30
  !value.nil? && (
15
31
  value.respond_to?(:empty?) ? !value.empty? : true
16
32
  )
17
33
  end
34
+
35
+ # NOTE: Based on `query_cast_attribute` from ActiveRecord:
36
+ # https://github.com/rails/rails/blob/main/activerecord/lib/active_record/attribute_methods/query.rb
37
+ # @param value [#to_s]
38
+ # @return [Boolean]
39
+ def query_attribute(value) # rubocop:disable Metrics/MethodLength
40
+ case value
41
+ when true then true
42
+ when false, nil then false
43
+ else
44
+ if value.is_a?(Numeric) || (value.respond_to?(:match?) && !value.match?(/[^0-9]/))
45
+ !value.to_i.zero?
46
+ else
47
+ return false if FALSE_VALUES.include?(value)
48
+
49
+ !value.blank?
50
+ end
51
+ end
52
+ end
18
53
  end
19
54
  end
@@ -4,7 +4,7 @@ module Servactory
4
4
  module VERSION
5
5
  MAJOR = 1
6
6
  MINOR = 8
7
- PATCH = 4
7
+ PATCH = 6
8
8
 
9
9
  STRING = [MAJOR, MINOR, PATCH].join(".")
10
10
  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: 1.8.4
4
+ version: 1.8.6
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-06-29 00:00:00.000000000 Z
11
+ date: 2023-07-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -244,10 +244,8 @@ files:
244
244
  - lib/servactory/outputs/collection.rb
245
245
  - lib/servactory/outputs/dsl.rb
246
246
  - lib/servactory/outputs/output.rb
247
- - lib/servactory/outputs/tools/conflicts.rb
248
247
  - lib/servactory/outputs/validations/base.rb
249
248
  - lib/servactory/outputs/validations/type.rb
250
- - lib/servactory/outputs/workspace.rb
251
249
  - lib/servactory/result.rb
252
250
  - lib/servactory/test_kit/fake_type.rb
253
251
  - lib/servactory/test_kit/result.rb
@@ -1,38 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Servactory
4
- module Outputs
5
- module Tools
6
- class Conflicts
7
- def self.validate!(...)
8
- new(...).validate!
9
- end
10
-
11
- def initialize(context, collection_of_outputs, collection_of_internals)
12
- @context = context
13
- @collection_of_outputs = collection_of_outputs
14
- @collection_of_internals = collection_of_internals
15
- end
16
-
17
- def validate!
18
- return if overlapping_attributes.empty?
19
-
20
- message_text = I18n.t(
21
- "servactory.outputs.tools.conflicts.error",
22
- service_class_name: @context.class.name,
23
- overlapping_attributes: overlapping_attributes.join(", ")
24
- )
25
-
26
- raise Servactory.configuration.output_error_class.new(message: message_text)
27
- end
28
-
29
- private
30
-
31
- def overlapping_attributes
32
- @overlapping_attributes ||=
33
- @collection_of_outputs.names.intersection(@collection_of_internals.names)
34
- end
35
- end
36
- end
37
- end
38
- end
@@ -1,13 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Servactory
4
- module Outputs
5
- module Workspace
6
- def call!(collection_of_internals:, collection_of_outputs:, **)
7
- super
8
-
9
- Tools::Conflicts.validate!(self, collection_of_outputs, collection_of_internals)
10
- end
11
- end
12
- end
13
- end