dry-effects 0.1.2 → 0.2.0

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.
Files changed (92) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +57 -5
  3. data/LICENSE +1 -1
  4. data/README.md +19 -11
  5. data/dry-effects.gemspec +33 -41
  6. data/lib/dry/effects/all.rb +4 -4
  7. data/lib/dry/effects/container.rb +1 -1
  8. data/lib/dry/effects/effect.rb +2 -2
  9. data/lib/dry/effects/effects/async.rb +3 -1
  10. data/lib/dry/effects/effects/cache.rb +13 -9
  11. data/lib/dry/effects/effects/cmp.rb +3 -1
  12. data/lib/dry/effects/effects/current_time.rb +4 -2
  13. data/lib/dry/effects/effects/defer.rb +3 -1
  14. data/lib/dry/effects/effects/env.rb +4 -2
  15. data/lib/dry/effects/effects/fork.rb +3 -1
  16. data/lib/dry/effects/effects/implicit.rb +4 -2
  17. data/lib/dry/effects/effects/interrupt.rb +4 -2
  18. data/lib/dry/effects/effects/lock.rb +8 -6
  19. data/lib/dry/effects/effects/parallel.rb +4 -2
  20. data/lib/dry/effects/effects/random.rb +5 -3
  21. data/lib/dry/effects/effects/reader.rb +1 -1
  22. data/lib/dry/effects/effects/resolve.rb +23 -3
  23. data/lib/dry/effects/effects/retry.rb +4 -2
  24. data/lib/dry/effects/effects/state.rb +4 -2
  25. data/lib/dry/effects/effects/timeout.rb +3 -1
  26. data/lib/dry/effects/effects/timestamp.rb +3 -1
  27. data/lib/dry/effects/errors.rb +4 -4
  28. data/lib/dry/effects/extensions/active_support/tagged_logging.rb +13 -0
  29. data/lib/dry/effects/extensions/auto_inject.rb +5 -5
  30. data/lib/dry/effects/extensions/system.rb +8 -7
  31. data/lib/dry/effects/extensions.rb +12 -4
  32. data/lib/dry/effects/frame.rb +30 -9
  33. data/lib/dry/effects/halt.rb +3 -3
  34. data/lib/dry/effects/handler.rb +1 -1
  35. data/lib/dry/effects/inflector.rb +1 -1
  36. data/lib/dry/effects/initializer.rb +17 -16
  37. data/lib/dry/effects/instruction.rb +1 -1
  38. data/lib/dry/effects/instructions/execute.rb +2 -1
  39. data/lib/dry/effects/instructions/raise.rb +2 -1
  40. data/lib/dry/effects/provider/class_interface.rb +2 -2
  41. data/lib/dry/effects/provider.rb +2 -2
  42. data/lib/dry/effects/providers/async.rb +2 -2
  43. data/lib/dry/effects/providers/cache.rb +2 -2
  44. data/lib/dry/effects/providers/cmp.rb +1 -1
  45. data/lib/dry/effects/providers/current_time/time_generators.rb +1 -1
  46. data/lib/dry/effects/providers/current_time.rb +5 -5
  47. data/lib/dry/effects/providers/defer.rb +6 -6
  48. data/lib/dry/effects/providers/env.rb +2 -2
  49. data/lib/dry/effects/providers/fork.rb +2 -2
  50. data/lib/dry/effects/providers/implicit.rb +1 -1
  51. data/lib/dry/effects/providers/interrupt.rb +3 -3
  52. data/lib/dry/effects/providers/lock.rb +6 -8
  53. data/lib/dry/effects/providers/parallel.rb +3 -3
  54. data/lib/dry/effects/providers/random.rb +74 -2
  55. data/lib/dry/effects/providers/reader.rb +1 -1
  56. data/lib/dry/effects/providers/resolve.rb +8 -7
  57. data/lib/dry/effects/providers/retry.rb +5 -7
  58. data/lib/dry/effects/providers/state.rb +2 -2
  59. data/lib/dry/effects/providers/timeout.rb +2 -2
  60. data/lib/dry/effects/providers/timestamp.rb +2 -2
  61. data/lib/dry/effects/stack.rb +6 -6
  62. data/lib/dry/effects/version.rb +1 -1
  63. data/lib/dry/effects.rb +7 -7
  64. metadata +22 -69
  65. data/.codeclimate.yml +0 -12
  66. data/.github/ISSUE_TEMPLATE/----please-don-t-ask-for-support-via-issues.md +0 -10
  67. data/.github/ISSUE_TEMPLATE/---bug-report.md +0 -30
  68. data/.github/ISSUE_TEMPLATE/---feature-request.md +0 -18
  69. data/.github/workflows/ci.yml +0 -74
  70. data/.github/workflows/docsite.yml +0 -34
  71. data/.github/workflows/sync_configs.yml +0 -34
  72. data/.gitignore +0 -12
  73. data/.rspec +0 -4
  74. data/.rubocop.yml +0 -95
  75. data/CODE_OF_CONDUCT.md +0 -13
  76. data/CONTRIBUTING.md +0 -29
  77. data/Gemfile +0 -23
  78. data/Rakefile +0 -8
  79. data/docsite/source/effects/cache.html.md +0 -84
  80. data/docsite/source/effects/current_time.html.md +0 -186
  81. data/docsite/source/effects/defer.html.md +0 -130
  82. data/docsite/source/effects/env.html.md +0 -144
  83. data/docsite/source/effects/interrupt.html.md +0 -109
  84. data/docsite/source/effects/parallel.html.md +0 -25
  85. data/docsite/source/effects/reader.html.md +0 -126
  86. data/docsite/source/effects/resolve.html.md +0 -188
  87. data/docsite/source/effects/state.html.md +0 -178
  88. data/docsite/source/effects/timeout.html.md +0 -42
  89. data/docsite/source/effects.html.md +0 -29
  90. data/docsite/source/index.html.md +0 -212
  91. data/examples/cmp.rb +0 -51
  92. data/examples/state.rb +0 -29
@@ -12,7 +12,7 @@ module Dry
12
12
  @frame = Frame.new(provider)
13
13
  end
14
14
 
15
- if RUBY_VERSION >= '2.7'
15
+ if RUBY_VERSION >= "2.7"
16
16
  class_eval(<<~RUBY, __FILE__, __LINE__ + 1)
17
17
  def call(...)
18
18
  frame.(...)
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'dry/inflector'
3
+ require "dry/inflector"
4
4
 
5
5
  module Dry
6
6
  module Effects
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'dry/initializer'
3
+ require "dry/initializer"
4
4
 
5
5
  module Dry
6
6
  module Effects
@@ -27,17 +27,16 @@ module Dry
27
27
 
28
28
  # @api private
29
29
  def params_arity
30
- @params_arity ||= begin
31
- dry_initializer
32
- .definitions
33
- .reject { |_, d| d.option }
34
- .size
35
- end
30
+ @params_arity ||= dry_initializer
31
+ .definitions
32
+ .reject { |_, d| d.option }
33
+ .size
36
34
  end
37
35
 
38
36
  # @api private
39
37
  def options?
40
38
  return @has_options if defined? @has_options
39
+
41
40
  @has_options = false
42
41
  end
43
42
 
@@ -47,20 +46,20 @@ module Dry
47
46
  .definitions
48
47
  .reject { |_, d| d.option }
49
48
  .keys
50
- .join(', ')
49
+ .join(", ")
51
50
 
52
- seq_names << ', ' unless seq_names.empty?
51
+ seq_names << ", " unless seq_names.empty?
53
52
 
54
53
  undef_method(:with) if method_defined?(:with)
55
54
 
56
55
  class_eval(<<-RUBY, __FILE__, __LINE__ + 1)
57
- def with(**new_options)
58
- if new_options.empty?
59
- self
60
- else
61
- self.class.new(#{seq_names}**options, **new_options)
62
- end
63
- end
56
+ def with(**new_options) # def with(**new_options)
57
+ if new_options.empty? # if new_options.empty?
58
+ self # self
59
+ else # else
60
+ self.class.new(#{seq_names}**options, **new_options) # self.class.new(attr1, attr2, **options, **new_options)
61
+ end # end
62
+ end # end
64
63
  RUBY
65
64
  end
66
65
  end
@@ -80,9 +79,11 @@ module Dry
80
79
  #
81
80
  # @api public
82
81
  def options
82
+ # rubocop:disable Layout/LineLength
83
83
  @__options__ ||= self.class.dry_initializer.definitions.values.each_with_object({}) do |item, obj|
84
84
  obj[item.target] = instance_variable_get(item.ivar)
85
85
  end
86
+ # rubocop:enable Layout/LineLength
86
87
  end
87
88
 
88
89
  define_method(:class, Kernel.instance_method(:class))
@@ -2,7 +2,7 @@
2
2
 
3
3
  module Dry
4
4
  module Effects
5
- class Instruction
5
+ class Instruction # rubocop:disable Lint/EmptyClass
6
6
  end
7
7
  end
8
8
  end
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'dry/effects/instruction'
3
+ require "dry/effects/instruction"
4
4
 
5
5
  module Dry
6
6
  module Effects
@@ -9,6 +9,7 @@ module Dry
9
9
  attr_reader :block
10
10
 
11
11
  def initialize(block)
12
+ super()
12
13
  @block = block
13
14
  end
14
15
 
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'dry/effects/instruction'
3
+ require "dry/effects/instruction"
4
4
 
5
5
  module Dry
6
6
  module Effects
@@ -9,6 +9,7 @@ module Dry
9
9
  attr_reader :error
10
10
 
11
11
  def initialize(error)
12
+ super()
12
13
  @error = error
13
14
  end
14
15
 
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'dry/core/class_attributes'
4
- require 'dry/effects/frame'
3
+ require "dry/core/class_attributes"
4
+ require "dry/effects/frame"
5
5
 
6
6
  module Dry
7
7
  module Effects
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'dry/effects/initializer'
4
- require 'dry/effects/provider/class_interface'
3
+ require "dry/effects/initializer"
4
+ require "dry/effects/provider/class_interface"
5
5
 
6
6
  module Dry
7
7
  module Effects
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'dry/effects/provider'
4
- require 'dry/effects/frame'
3
+ require "dry/effects/provider"
4
+ require "dry/effects/frame"
5
5
 
6
6
  module Dry
7
7
  module Effects
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'dry/effects/provider'
4
- require 'dry/effects/instructions/execute'
3
+ require "dry/effects/provider"
4
+ require "dry/effects/instructions/execute"
5
5
 
6
6
  module Dry
7
7
  module Effects
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'dry/effects/provider'
3
+ require "dry/effects/provider"
4
4
 
5
5
  module Dry
6
6
  module Effects
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'dry/effects/provider'
3
+ require "dry/effects/provider"
4
4
 
5
5
  module Dry
6
6
  module Effects
@@ -1,8 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'time'
4
- require 'dry/effects/provider'
5
- require 'dry/effects/providers/current_time/time_generators'
3
+ require "time"
4
+ require "dry/effects/provider"
5
+ require "dry/effects/providers/current_time/time_generators"
6
6
 
7
7
  module Dry
8
8
  module Effects
@@ -55,12 +55,12 @@ module Dry
55
55
  def represent
56
56
  if fixed?
57
57
  if generator.nil?
58
- 'current_time[fixed=true]'
58
+ "current_time[fixed=true]"
59
59
  else
60
60
  "current_time[fixed=#{generator.().iso8601(6)}]"
61
61
  end
62
62
  else
63
- 'current_time[fixed=false]'
63
+ "current_time[fixed=false]"
64
64
  end
65
65
  end
66
66
 
@@ -1,8 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'concurrent/promise'
4
- require 'dry/effects/provider'
5
- require 'dry/effects/frame'
3
+ require "concurrent/promise"
4
+ require "dry/effects/provider"
5
+ require "dry/effects/frame"
6
6
 
7
7
  module Dry
8
8
  module Effects
@@ -51,7 +51,7 @@ module Dry
51
51
  # Yield the block with the handler installed
52
52
  #
53
53
  # @api private
54
- def call(options = { executor: Undefined })
54
+ def call(options = {executor: Undefined})
55
55
  unless Undefined.equal?(options[:executor])
56
56
  @executor = options[:executor]
57
57
  end
@@ -79,9 +79,9 @@ module Dry
79
79
  info << "call_later=#{later_calls.size}" if later_calls.any?
80
80
 
81
81
  if info.empty?
82
- 'defer'
82
+ "defer"
83
83
  else
84
- "defer[#{info.join(' ')}]"
84
+ "defer[#{info.join(" ")}]"
85
85
  end
86
86
  end
87
87
  end
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'dry/effects/provider'
4
- require 'dry/effects/instructions/raise'
3
+ require "dry/effects/provider"
4
+ require "dry/effects/instructions/raise"
5
5
 
6
6
  module Dry
7
7
  module Effects
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'dry/effects/provider'
4
- require 'dry/effects/frame'
3
+ require "dry/effects/provider"
4
+ require "dry/effects/frame"
5
5
 
6
6
  module Dry
7
7
  module Effects
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'dry/effects/provider'
3
+ require "dry/effects/provider"
4
4
 
5
5
  module Dry
6
6
  module Effects
@@ -1,8 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'dry/effects/provider'
4
- require 'dry/effects/instructions/raise'
5
- require 'dry/effects/halt'
3
+ require "dry/effects/provider"
4
+ require "dry/effects/instructions/raise"
5
+ require "dry/effects/halt"
6
6
 
7
7
  module Dry
8
8
  module Effects
@@ -1,8 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'dry/equalizer'
4
- require 'dry/effects/provider'
5
- require 'dry/effects/initializer'
3
+ require "dry/core/equalizer"
4
+ require "dry/effects/provider"
5
+ require "dry/effects/initializer"
6
6
 
7
7
  module Dry
8
8
  module Effects
@@ -96,11 +96,9 @@ module Dry
96
96
  end
97
97
 
98
98
  with_backend(backend_replace) do
99
- begin
100
- yield
101
- ensure
102
- owned.each { |handle| unlock(handle) }
103
- end
99
+ yield
100
+ ensure
101
+ owned.each { |handle| unlock(handle) }
104
102
  end
105
103
  end
106
104
 
@@ -1,8 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'concurrent/promise'
4
- require 'dry/effects/provider'
5
- require 'dry/effects/frame'
3
+ require "concurrent/promise"
4
+ require "dry/effects/provider"
5
+ require "dry/effects/frame"
6
6
 
7
7
  module Dry
8
8
  module Effects
@@ -1,12 +1,84 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'dry/effects/provider'
3
+ require "dry/effects/provider"
4
4
 
5
5
  module Dry
6
6
  module Effects
7
7
  module Providers
8
8
  class Random < Provider[:random]
9
- public :rand
9
+ DEFAULT_RANDOM = ::Random
10
+ DEFAULT = -> _ { DEFAULT_RANDOM.rand }
11
+
12
+ DEFAULT_RANGE = (0.0...1.0).freeze
13
+
14
+ def rand(range_or_limit = nil)
15
+ range_or_limit ||= DEFAULT_RANGE
16
+
17
+ if range_or_limit.is_a?(::Range)
18
+ low = range_or_limit.begin
19
+ high = range_or_limit.end
20
+ exclude_end = range_or_limit.exclude_end?
21
+ elsif range_or_limit >= 1
22
+ low = 0
23
+ high = range_or_limit.floor
24
+ exclude_end = true
25
+ else
26
+ low = 0.0
27
+ high = range_or_limit.to_f
28
+ exclude_end = true
29
+ end
30
+
31
+ if low.is_a?(::Integer)
32
+ next_integer(low, high, exclude_end)
33
+ else
34
+ next_float(low, high)
35
+ end
36
+ end
37
+
38
+ def call(options = Undefined)
39
+ @prev = nil
40
+ @generator = build_generator(options)
41
+ yield
42
+ end
43
+
44
+ def next_integer(low, high, exclude_end)
45
+ @prev = @generator.(@prev) % 1
46
+
47
+ value = low + (@prev * (high - low)).round
48
+
49
+ if value.eql?(high) && exclude_end
50
+ low
51
+ else
52
+ value
53
+ end
54
+ end
55
+
56
+ def next_float(low, high)
57
+ @prev = @generator.(@prev) % 1
58
+
59
+ low + (@prev * (high - low))
60
+ end
61
+
62
+ def build_generator(options)
63
+ case options
64
+ when Undefined
65
+ DEFAULT
66
+ when ::Hash
67
+ if options.key?(:seed)
68
+ random = ::Random.new(options[:seed])
69
+ else
70
+ random = DEFAULT_RANDOM
71
+ end
72
+
73
+ -> _ { random.rand }
74
+ else
75
+ generator = options
76
+
77
+ lambda do |prev|
78
+ prev.nil? ? generator.() : generator.(prev)
79
+ end
80
+ end
81
+ end
10
82
  end
11
83
  end
12
84
  end
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'dry/effects/provider'
3
+ require "dry/effects/provider"
4
4
 
5
5
  module Dry
6
6
  module Effects
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'dry/effects/provider'
4
- require 'dry/effects/instructions/raise'
3
+ require "dry/effects/provider"
4
+ require "dry/effects/instructions/raise"
5
5
 
6
6
  module Dry
7
7
  module Effects
@@ -84,16 +84,17 @@ module Dry
84
84
  # @return [String]
85
85
  # @api public
86
86
  def represent
87
- containers = [represent_container(static), represent_container(dynamic)].compact.join('+')
88
- "resolve[#{containers.empty? ? 'empty' : containers}]"
87
+ containers = [represent_container(static), represent_container(dynamic)].compact.join("+")
88
+ "resolve[#{containers.empty? ? "empty" : containers}]"
89
89
  end
90
90
 
91
91
  # @return [String]
92
92
  # @api private
93
93
  def represent_container(container)
94
- if container.is_a?(::Hash)
95
- container.empty? ? nil : 'hash'
96
- elsif container.is_a?(::Class)
94
+ case container
95
+ when ::Hash
96
+ container.empty? ? nil : "hash"
97
+ when ::Class
97
98
  container.name || container.to_s
98
99
  else
99
100
  container.to_s