dry-effects 0.1.5 → 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 +24 -0
- data/LICENSE +1 -1
- data/README.md +5 -4
- data/dry-effects.gemspec +15 -15
- data/lib/dry/effects/all.rb +3 -3
- 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 +3 -1
- data/lib/dry/effects/effects/fork.rb +3 -1
- data/lib/dry/effects/effects/implicit.rb +3 -1
- data/lib/dry/effects/effects/interrupt.rb +3 -1
- data/lib/dry/effects/effects/lock.rb +3 -1
- data/lib/dry/effects/effects/parallel.rb +3 -1
- data/lib/dry/effects/effects/random.rb +3 -1
- 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 +1 -1
- 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 +5 -5
- 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 +16 -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 +5 -4
- 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 +8 -28
@@ -1,7 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
4
|
-
require
|
3
|
+
require "dry/effects/effect"
|
4
|
+
require "dry/effects/constructors"
|
5
5
|
|
6
6
|
module Dry
|
7
7
|
module Effects
|
@@ -18,6 +18,8 @@ module Dry
|
|
18
18
|
end
|
19
19
|
|
20
20
|
def initialize
|
21
|
+
super
|
22
|
+
|
21
23
|
module_eval do
|
22
24
|
define_method(:repeat) do |scope|
|
23
25
|
effect = Retry.new(type: :retry, scope: scope)
|
@@ -1,7 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
4
|
-
require
|
3
|
+
require "dry/effects/effect"
|
4
|
+
require "dry/effects/constructors"
|
5
5
|
|
6
6
|
module Dry
|
7
7
|
module Effects
|
@@ -22,6 +22,8 @@ module Dry
|
|
22
22
|
end
|
23
23
|
|
24
24
|
def initialize(scope, default: Undefined, writer: true, as: scope)
|
25
|
+
super()
|
26
|
+
|
25
27
|
read = State.new(type: :state, name: :read, scope: scope)
|
26
28
|
write = State.new(type: :state, name: :write, scope: scope)
|
27
29
|
|
@@ -1,6 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
3
|
+
require "dry/effects/effect"
|
4
4
|
|
5
5
|
module Dry
|
6
6
|
module Effects
|
@@ -13,6 +13,8 @@ module Dry
|
|
13
13
|
end
|
14
14
|
|
15
15
|
def initialize(scope)
|
16
|
+
super()
|
17
|
+
|
16
18
|
timeout = TimeoutEffect.new(type: :timeout, name: :timeout, scope: scope)
|
17
19
|
|
18
20
|
module_eval do
|
@@ -1,6 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
3
|
+
require "dry/effects/effect"
|
4
4
|
|
5
5
|
module Dry
|
6
6
|
module Effects
|
@@ -9,6 +9,8 @@ module Dry
|
|
9
9
|
Timestamp = Effect.new(type: :timestamp)
|
10
10
|
|
11
11
|
def initialize(options = EMPTY_HASH)
|
12
|
+
super()
|
13
|
+
|
12
14
|
module_eval do
|
13
15
|
define_method(:timestamp) do |round: Undefined|
|
14
16
|
round_to = Undefined.coalesce(round, options.fetch(:round, Undefined))
|
data/lib/dry/effects/errors.rb
CHANGED
@@ -20,7 +20,7 @@ module Dry
|
|
20
20
|
super(
|
21
21
|
Undefined.default(message) {
|
22
22
|
"Effect #{effect.inspect} not handled. "\
|
23
|
-
|
23
|
+
"Effects must be wrapped with corresponding handlers"
|
24
24
|
}
|
25
25
|
)
|
26
26
|
end
|
@@ -32,7 +32,7 @@ module Dry
|
|
32
32
|
class MissingStateError < UnhandledEffectError
|
33
33
|
def initialize(effect)
|
34
34
|
message = "Value of +#{effect.scope}+ is not set, "\
|
35
|
-
|
35
|
+
"you need to provide value with an effect handler"
|
36
36
|
|
37
37
|
super(effect, message)
|
38
38
|
end
|
@@ -46,8 +46,8 @@ module Dry
|
|
46
46
|
|
47
47
|
def initialize(effect)
|
48
48
|
message = "+#{effect.scope}+ is not defined, you need to assign it first "\
|
49
|
-
|
50
|
-
|
49
|
+
"by using a writer, passing initial value to the handler, or "\
|
50
|
+
"providing a fallback value"
|
51
51
|
|
52
52
|
super(message)
|
53
53
|
end
|
@@ -1,8 +1,8 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
4
|
-
require
|
5
|
-
require
|
3
|
+
require "concurrent/map"
|
4
|
+
require "dry/auto_inject/strategies/constructor"
|
5
|
+
require "dry/effects/effects/resolve"
|
6
6
|
|
7
7
|
module Dry
|
8
8
|
module Effects
|
@@ -24,7 +24,7 @@ module Dry
|
|
24
24
|
class Static < Base
|
25
25
|
private
|
26
26
|
|
27
|
-
def define_readers(dynamic = false)
|
27
|
+
def define_readers(dynamic = false) # rubocop:disable Style/OptionalBooleanParameter
|
28
28
|
map = dependency_map.to_h
|
29
29
|
cache = ::Concurrent::Map.new
|
30
30
|
instance_mod.class_exec do
|
@@ -49,7 +49,7 @@ module Dry
|
|
49
49
|
class Dynamic < Static
|
50
50
|
private
|
51
51
|
|
52
|
-
def define_readers(dynamic = true)
|
52
|
+
def define_readers(dynamic = true) # rubocop:disable Style/OptionalBooleanParameter
|
53
53
|
super
|
54
54
|
end
|
55
55
|
end
|
@@ -1,6 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
3
|
+
require "dry/system/container"
|
4
4
|
|
5
5
|
Dry::Effects.load_extensions(:auto_inject)
|
6
6
|
|
@@ -8,17 +8,18 @@ module Dry
|
|
8
8
|
module Effects
|
9
9
|
module System
|
10
10
|
class AutoRegistrar < ::Dry::System::AutoRegistrar
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
11
|
+
# Always memoize and freeze registered components
|
12
|
+
def call(component_dir)
|
13
|
+
components(component_dir).each do |component|
|
14
|
+
next unless register_component?(component)
|
15
|
+
|
16
|
+
container.register(component.key, memoize: true) { component.instance.freeze }
|
16
17
|
end
|
17
18
|
end
|
18
19
|
end
|
19
20
|
|
20
21
|
class Container < ::Dry::System::Container
|
21
|
-
|
22
|
+
config.auto_registrar = AutoRegistrar
|
22
23
|
|
23
24
|
def self.injector(effects: true, **kwargs)
|
24
25
|
if effects
|
@@ -1,23 +1,23 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
3
|
+
require "dry/core/extensions"
|
4
4
|
|
5
5
|
Dry::Effects.extend(Dry::Core::Extensions)
|
6
6
|
|
7
7
|
Dry::Effects.register_extension(:auto_inject) do
|
8
|
-
require
|
8
|
+
require "dry/effects/extensions/auto_inject"
|
9
9
|
end
|
10
10
|
|
11
11
|
Dry::Effects.register_extension(:system) do
|
12
|
-
require
|
12
|
+
require "dry/effects/extensions/system"
|
13
13
|
end
|
14
14
|
|
15
15
|
Dry::Effects.register_extension(:rspec) do
|
16
|
-
require
|
16
|
+
require "dry/effects/extensions/rspec"
|
17
17
|
end
|
18
18
|
|
19
19
|
Dry::Effects.register_extension(:active_support_tagged_logging) do
|
20
|
-
require
|
20
|
+
require "dry/effects/extensions/active_support/tagged_logging"
|
21
21
|
end
|
22
22
|
|
23
23
|
Dry::Effects.register_extension(:active_support) do
|
data/lib/dry/effects/frame.rb
CHANGED
@@ -1,11 +1,11 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
4
|
-
require
|
5
|
-
require
|
6
|
-
require
|
7
|
-
require
|
8
|
-
require
|
3
|
+
require "fiber"
|
4
|
+
require "dry/effects/initializer"
|
5
|
+
require "dry/effects/effect"
|
6
|
+
require "dry/effects/errors"
|
7
|
+
require "dry/effects/stack"
|
8
|
+
require "dry/effects/instructions/raise"
|
9
9
|
|
10
10
|
module Dry
|
11
11
|
module Effects
|
@@ -41,15 +41,36 @@ module Dry
|
|
41
41
|
result = fiber.resume
|
42
42
|
|
43
43
|
loop do
|
44
|
+
error = false
|
44
45
|
break result unless fiber.alive?
|
45
46
|
|
46
47
|
provided = stack.(result) do
|
47
|
-
::Dry::Effects.yield(result) do |_,
|
48
|
-
|
48
|
+
::Dry::Effects.yield(result) do |_, e|
|
49
|
+
error = true
|
50
|
+
e
|
49
51
|
end
|
50
52
|
end
|
51
53
|
|
52
|
-
result =
|
54
|
+
result =
|
55
|
+
if error
|
56
|
+
raise_in_fiber(fiber, provided)
|
57
|
+
else
|
58
|
+
fiber.resume(provided)
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
private
|
64
|
+
|
65
|
+
if RUBY_VERSION >= "2.7"
|
66
|
+
# @api private
|
67
|
+
def raise_in_fiber(fiber, error)
|
68
|
+
fiber.raise(error)
|
69
|
+
end
|
70
|
+
else
|
71
|
+
# @api private
|
72
|
+
def raise_in_fiber(fiber, error)
|
73
|
+
fiber.resume(Instructions.Raise(error))
|
53
74
|
end
|
54
75
|
end
|
55
76
|
end
|
data/lib/dry/effects/halt.rb
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
4
|
-
require
|
5
|
-
require
|
3
|
+
require "concurrent/map"
|
4
|
+
require "dry/core/class_attributes"
|
5
|
+
require "dry/effects/inflector"
|
6
6
|
|
7
7
|
module Dry
|
8
8
|
module Effects
|
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,12 +27,10 @@ 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
|
@@ -48,20 +46,20 @@ module Dry
|
|
48
46
|
.definitions
|
49
47
|
.reject { |_, d| d.option }
|
50
48
|
.keys
|
51
|
-
.join(
|
49
|
+
.join(", ")
|
52
50
|
|
53
|
-
seq_names <<
|
51
|
+
seq_names << ", " unless seq_names.empty?
|
54
52
|
|
55
53
|
undef_method(:with) if method_defined?(:with)
|
56
54
|
|
57
55
|
class_eval(<<-RUBY, __FILE__, __LINE__ + 1)
|
58
|
-
def with(**new_options)
|
59
|
-
if new_options.empty?
|
60
|
-
self
|
61
|
-
else
|
62
|
-
self.class.new(#{seq_names}**options, **new_options)
|
63
|
-
end
|
64
|
-
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
|
65
63
|
RUBY
|
66
64
|
end
|
67
65
|
end
|
@@ -81,9 +79,11 @@ module Dry
|
|
81
79
|
#
|
82
80
|
# @api public
|
83
81
|
def options
|
82
|
+
# rubocop:disable Layout/LineLength
|
84
83
|
@__options__ ||= self.class.dry_initializer.definitions.values.each_with_object({}) do |item, obj|
|
85
84
|
obj[item.target] = instance_variable_get(item.ivar)
|
86
85
|
end
|
86
|
+
# rubocop:enable Layout/LineLength
|
87
87
|
end
|
88
88
|
|
89
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