dry-effects 0.1.5 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (64) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +24 -0
  3. data/LICENSE +1 -1
  4. data/README.md +5 -4
  5. data/dry-effects.gemspec +15 -15
  6. data/lib/dry/effects/all.rb +3 -3
  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 +3 -1
  15. data/lib/dry/effects/effects/fork.rb +3 -1
  16. data/lib/dry/effects/effects/implicit.rb +3 -1
  17. data/lib/dry/effects/effects/interrupt.rb +3 -1
  18. data/lib/dry/effects/effects/lock.rb +3 -1
  19. data/lib/dry/effects/effects/parallel.rb +3 -1
  20. data/lib/dry/effects/effects/random.rb +3 -1
  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 +1 -1
  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 +5 -5
  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 +16 -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 +5 -4
  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 +8 -28
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'dry/effects/effect'
4
- require 'dry/effects/constructors'
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 'dry/effects/effect'
4
- require 'dry/effects/constructors'
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 'dry/effects/effect'
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 'dry/effects/effect'
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))
@@ -20,7 +20,7 @@ module Dry
20
20
  super(
21
21
  Undefined.default(message) {
22
22
  "Effect #{effect.inspect} not handled. "\
23
- 'Effects must be wrapped with corresponding handlers'
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
- 'you need to provide value with an effect handler'
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
- 'by using a writer, passing initial value to the handler, or '\
50
- 'providing a fallback value'
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,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'active_support/tagged_logging'
3
+ require "active_support/tagged_logging"
4
4
 
5
5
  ActiveSupport::TaggedLogging::Formatter.prepend(Module.new {
6
6
  def current_tags
@@ -1,8 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'concurrent/map'
4
- require 'dry/auto_inject/strategies/constructor'
5
- require 'dry/effects/effects/resolve'
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 'dry/system/container'
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
- def call(dir)
12
- super do |config|
13
- config.memoize = true
14
- config.instance { |c| c.instance.freeze }
15
- yield(config) if block_given?
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
- setting :auto_registrar, AutoRegistrar
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 'dry/core/extensions'
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 'dry/effects/extensions/auto_inject'
8
+ require "dry/effects/extensions/auto_inject"
9
9
  end
10
10
 
11
11
  Dry::Effects.register_extension(:system) do
12
- require 'dry/effects/extensions/system'
12
+ require "dry/effects/extensions/system"
13
13
  end
14
14
 
15
15
  Dry::Effects.register_extension(:rspec) do
16
- require 'dry/effects/extensions/rspec'
16
+ require "dry/effects/extensions/rspec"
17
17
  end
18
18
 
19
19
  Dry::Effects.register_extension(:active_support_tagged_logging) do
20
- require 'dry/effects/extensions/active_support/tagged_logging'
20
+ require "dry/effects/extensions/active_support/tagged_logging"
21
21
  end
22
22
 
23
23
  Dry::Effects.register_extension(:active_support) do
@@ -1,11 +1,11 @@
1
1
  # frozen_string_literal: true
2
2
 
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'
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 |_, error|
48
- Instructions.Raise(error)
48
+ ::Dry::Effects.yield(result) do |_, e|
49
+ error = true
50
+ e
49
51
  end
50
52
  end
51
53
 
52
- result = fiber.resume(provided)
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
@@ -1,8 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'concurrent/map'
4
- require 'dry/core/class_attributes'
5
- require 'dry/effects/inflector'
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
@@ -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,12 +27,10 @@ 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
@@ -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 << ', ' unless seq_names.empty?
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))
@@ -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