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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +57 -5
- data/LICENSE +1 -1
- data/README.md +19 -11
- data/dry-effects.gemspec +33 -41
- data/lib/dry/effects/all.rb +4 -4
- data/lib/dry/effects/container.rb +1 -1
- data/lib/dry/effects/effect.rb +2 -2
- data/lib/dry/effects/effects/async.rb +3 -1
- data/lib/dry/effects/effects/cache.rb +13 -9
- data/lib/dry/effects/effects/cmp.rb +3 -1
- data/lib/dry/effects/effects/current_time.rb +4 -2
- data/lib/dry/effects/effects/defer.rb +3 -1
- data/lib/dry/effects/effects/env.rb +4 -2
- data/lib/dry/effects/effects/fork.rb +3 -1
- data/lib/dry/effects/effects/implicit.rb +4 -2
- data/lib/dry/effects/effects/interrupt.rb +4 -2
- data/lib/dry/effects/effects/lock.rb +8 -6
- data/lib/dry/effects/effects/parallel.rb +4 -2
- data/lib/dry/effects/effects/random.rb +5 -3
- data/lib/dry/effects/effects/reader.rb +1 -1
- data/lib/dry/effects/effects/resolve.rb +23 -3
- data/lib/dry/effects/effects/retry.rb +4 -2
- data/lib/dry/effects/effects/state.rb +4 -2
- data/lib/dry/effects/effects/timeout.rb +3 -1
- data/lib/dry/effects/effects/timestamp.rb +3 -1
- data/lib/dry/effects/errors.rb +4 -4
- data/lib/dry/effects/extensions/active_support/tagged_logging.rb +13 -0
- data/lib/dry/effects/extensions/auto_inject.rb +5 -5
- data/lib/dry/effects/extensions/system.rb +8 -7
- data/lib/dry/effects/extensions.rb +12 -4
- data/lib/dry/effects/frame.rb +30 -9
- data/lib/dry/effects/halt.rb +3 -3
- data/lib/dry/effects/handler.rb +1 -1
- data/lib/dry/effects/inflector.rb +1 -1
- data/lib/dry/effects/initializer.rb +17 -16
- data/lib/dry/effects/instruction.rb +1 -1
- data/lib/dry/effects/instructions/execute.rb +2 -1
- data/lib/dry/effects/instructions/raise.rb +2 -1
- data/lib/dry/effects/provider/class_interface.rb +2 -2
- data/lib/dry/effects/provider.rb +2 -2
- data/lib/dry/effects/providers/async.rb +2 -2
- data/lib/dry/effects/providers/cache.rb +2 -2
- data/lib/dry/effects/providers/cmp.rb +1 -1
- data/lib/dry/effects/providers/current_time/time_generators.rb +1 -1
- data/lib/dry/effects/providers/current_time.rb +5 -5
- data/lib/dry/effects/providers/defer.rb +6 -6
- data/lib/dry/effects/providers/env.rb +2 -2
- data/lib/dry/effects/providers/fork.rb +2 -2
- data/lib/dry/effects/providers/implicit.rb +1 -1
- data/lib/dry/effects/providers/interrupt.rb +3 -3
- data/lib/dry/effects/providers/lock.rb +6 -8
- data/lib/dry/effects/providers/parallel.rb +3 -3
- data/lib/dry/effects/providers/random.rb +74 -2
- data/lib/dry/effects/providers/reader.rb +1 -1
- data/lib/dry/effects/providers/resolve.rb +8 -7
- data/lib/dry/effects/providers/retry.rb +5 -7
- data/lib/dry/effects/providers/state.rb +2 -2
- data/lib/dry/effects/providers/timeout.rb +2 -2
- data/lib/dry/effects/providers/timestamp.rb +2 -2
- data/lib/dry/effects/stack.rb +6 -6
- data/lib/dry/effects/version.rb +1 -1
- data/lib/dry/effects.rb +7 -7
- metadata +22 -69
- data/.codeclimate.yml +0 -12
- data/.github/ISSUE_TEMPLATE/----please-don-t-ask-for-support-via-issues.md +0 -10
- data/.github/ISSUE_TEMPLATE/---bug-report.md +0 -30
- data/.github/ISSUE_TEMPLATE/---feature-request.md +0 -18
- data/.github/workflows/ci.yml +0 -74
- data/.github/workflows/docsite.yml +0 -34
- data/.github/workflows/sync_configs.yml +0 -34
- data/.gitignore +0 -12
- data/.rspec +0 -4
- data/.rubocop.yml +0 -95
- data/CODE_OF_CONDUCT.md +0 -13
- data/CONTRIBUTING.md +0 -29
- data/Gemfile +0 -23
- data/Rakefile +0 -8
- data/docsite/source/effects/cache.html.md +0 -84
- data/docsite/source/effects/current_time.html.md +0 -186
- data/docsite/source/effects/defer.html.md +0 -130
- data/docsite/source/effects/env.html.md +0 -144
- data/docsite/source/effects/interrupt.html.md +0 -109
- data/docsite/source/effects/parallel.html.md +0 -25
- data/docsite/source/effects/reader.html.md +0 -126
- data/docsite/source/effects/resolve.html.md +0 -188
- data/docsite/source/effects/state.html.md +0 -178
- data/docsite/source/effects/timeout.html.md +0 -42
- data/docsite/source/effects.html.md +0 -29
- data/docsite/source/index.html.md +0 -212
- data/examples/cmp.rb +0 -51
- data/examples/state.rb +0 -29
data/lib/dry/effects/handler.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
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 ||=
|
31
|
-
|
32
|
-
|
33
|
-
|
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 <<
|
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))
|
@@ -1,6 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
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
|
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
|
|
data/lib/dry/effects/provider.rb
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
4
|
-
require
|
5
|
-
require
|
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
|
-
|
58
|
+
"current_time[fixed=true]"
|
59
59
|
else
|
60
60
|
"current_time[fixed=#{generator.().iso8601(6)}]"
|
61
61
|
end
|
62
62
|
else
|
63
|
-
|
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
|
4
|
-
require
|
5
|
-
require
|
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 = {
|
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
|
-
|
82
|
+
"defer"
|
83
83
|
else
|
84
|
-
"defer[#{info.join(
|
84
|
+
"defer[#{info.join(" ")}]"
|
85
85
|
end
|
86
86
|
end
|
87
87
|
end
|
@@ -1,8 +1,8 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
4
|
-
require
|
5
|
-
require
|
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
|
4
|
-
require
|
5
|
-
require
|
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
|
-
|
100
|
-
|
101
|
-
|
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,12 +1,84 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
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
|
-
|
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,7 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
4
|
-
require
|
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? ?
|
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
|
-
|
95
|
-
|
96
|
-
|
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
|