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.
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
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 54136f3755a4e11e553c0afaabce55a5566994988eae215c553bed29868b33ec
4
- data.tar.gz: 1d01bd43fc5e9be72beec2b8754caf75313ba5c9b765c8740de21e3d01c00b21
3
+ metadata.gz: 80f0e1405c5ca987eb7f24a1ae3c71371f83595380ad49d04a61980767dbe06e
4
+ data.tar.gz: '028feb1018847ee3713b8a7cbad4572328d7b30f251889e5f58112fa7b25fa3e'
5
5
  SHA512:
6
- metadata.gz: 3f73d5618defff4f54656fa968c93cca50d9f9a47105500e3063bae2a8a9a78a64ec2b29638eaa3bfbeb1f98fc5ccf35862ab50f8dd8a24c75045f88daf59f68
7
- data.tar.gz: 193b6ecc66f060765df8bb3e982bac4b5867e85114f840611a06f31451dcdb7a3d6f8d09137cf33ac36473530aa88848fad13e0f29c9df4fe96c1168d402c33d
6
+ metadata.gz: 9c37d67a9030142e310e0df86d06fbdd63d21a3f3b52ea4f9f7792f9561e9ba48a58d50caad469bcfa4c30ef500b1d5772ebe4153001b65efd2390acb080a3ae
7
+ data.tar.gz: e4dc39c74bbb28a2ab0e79410752f0ceddff4bcd8d351b457c79dd608125c10709612ffb6c21c4b4b55714ad8a151a3c9d1ba93297931126f7c59f3e04d79d65
data/CHANGELOG.md CHANGED
@@ -1,3 +1,27 @@
1
+ <!--- DO NOT EDIT THIS FILE - IT'S AUTOMATICALLY GENERATED VIA DEVTOOLS --->
2
+
3
+ ## 0.2.0 2021-09-12
4
+
5
+
6
+ ### Changed
7
+
8
+ - Updated "system" extension to work with dry-system 0.19.0 (@timriley in #83)
9
+
10
+ [Compare v0.1.5...v0.2.0](https://github.com/dry-rb/dry-effects/compare/v0.1.5...v0.2.0)
11
+
12
+ ## 0.1.5 2020-02-09
13
+
14
+
15
+ ### Fixed
16
+
17
+ - Add patch for ActiveRecord::TaggedLogger to preserve tags in presence of effect handlers (leehambley)
18
+ ```ruby
19
+ Dry::Effects.load_extensions(:active_support_tagged_logging)
20
+ ```
21
+
22
+
23
+ [Compare v0.1.4...v0.1.5](https://github.com/dry-rb/dry-effects/compare/v0.1.4...v0.1.5)
24
+
1
25
  ## 0.1.4 2020-01-07
2
26
 
3
27
 
data/LICENSE CHANGED
@@ -1,6 +1,6 @@
1
1
  The MIT License (MIT)
2
2
 
3
- Copyright (c) 2015-2020 dry-rb team
3
+ Copyright (c) 2015-2021 dry-rb team
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy of
6
6
  this software and associated documentation files (the "Software"), to deal in
data/README.md CHANGED
@@ -1,3 +1,4 @@
1
+ <!--- this file is synced from dry-rb/template-gem project -->
1
2
  [gem]: https://rubygems.org/gems/dry-effects
2
3
  [actions]: https://github.com/dry-rb/dry-effects/actions
3
4
  [codacy]: https://www.codacy.com/gh/dry-rb/dry-effects
@@ -7,22 +8,22 @@
7
8
  # dry-effects [![Join the chat at https://dry-rb.zulipchat.com](https://img.shields.io/badge/dry--rb-join%20chat-%23346b7a.svg)][chat]
8
9
 
9
10
  [![Gem Version](https://badge.fury.io/rb/dry-effects.svg)][gem]
10
- [![CI Status](https://github.com/dry-rb/dry-effects/workflows/ci/badge.svg)][actions]
11
+ [![CI Status](https://github.com/dry-rb/dry-effects/workflows/CI/badge.svg)][actions]
11
12
  [![Codacy Badge](https://api.codacy.com/project/badge/Grade/158a8a584a3845eba4a67a71ad540210)][codacy]
12
13
  [![Codacy Badge](https://api.codacy.com/project/badge/Coverage/158a8a584a3845eba4a67a71ad540210)][codacy]
13
14
  [![Inline docs](http://inch-ci.org/github/dry-rb/dry-effects.svg?branch=master)][inchpages]
14
15
 
15
16
  ## Links
16
17
 
17
- * [User documentation](http://dry-rb.org/gems/dry-effects)
18
+ * [User documentation](https://dry-rb.org/gems/dry-effects)
18
19
  * [API documentation](http://rubydoc.info/gems/dry-effects)
19
20
 
20
21
  ## Supported Ruby versions
21
22
 
22
23
  This library officially supports the following Ruby versions:
23
24
 
24
- * MRI >= `2.4`
25
- * jruby >= `9.2`
25
+ * MRI `>= 2.6.0`
26
+ * ~~jruby~~ `>= 9.3` (we are waiting for [2.6 support](https://github.com/jruby/jruby/issues/6161))
26
27
 
27
28
  ## License
28
29
 
data/dry-effects.gemspec CHANGED
@@ -1,37 +1,37 @@
1
1
  # frozen_string_literal: true
2
- # this file is managed by dry-rb/devtools project
3
2
 
4
- lib = File.expand_path('lib', __dir__)
3
+ # this file is synced from dry-rb/template-gem project
4
+
5
+ lib = File.expand_path("lib", __dir__)
5
6
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
6
- require 'dry/effects/version'
7
+ require "dry/effects/version"
7
8
 
8
9
  Gem::Specification.new do |spec|
9
- spec.name = 'dry-effects'
10
+ spec.name = "dry-effects"
10
11
  spec.authors = ["Nikita Shilnikov"]
11
12
  spec.email = ["fg@flashgordon.ru"]
12
- spec.license = 'MIT'
13
+ spec.license = "MIT"
13
14
  spec.version = Dry::Effects::VERSION.dup
14
15
 
15
16
  spec.summary = "Algebraic effects"
16
17
  spec.description = spec.summary
17
- spec.homepage = 'https://dry-rb.org/gems/dry-effects'
18
+ spec.homepage = "https://dry-rb.org/gems/dry-effects"
18
19
  spec.files = Dir["CHANGELOG.md", "LICENSE", "README.md", "dry-effects.gemspec", "lib/**/*"]
19
- spec.bindir = 'bin'
20
+ spec.bindir = "bin"
20
21
  spec.executables = []
21
- spec.require_paths = ['lib']
22
+ spec.require_paths = ["lib"]
22
23
 
23
- spec.metadata['allowed_push_host'] = 'https://rubygems.org'
24
- spec.metadata['changelog_uri'] = 'https://github.com/dry-rb/dry-effects/blob/master/CHANGELOG.md'
25
- spec.metadata['source_code_uri'] = 'https://github.com/dry-rb/dry-effects'
26
- spec.metadata['bug_tracker_uri'] = 'https://github.com/dry-rb/dry-effects/issues'
24
+ spec.metadata["allowed_push_host"] = "https://rubygems.org"
25
+ spec.metadata["changelog_uri"] = "https://github.com/dry-rb/dry-effects/blob/master/CHANGELOG.md"
26
+ spec.metadata["source_code_uri"] = "https://github.com/dry-rb/dry-effects"
27
+ spec.metadata["bug_tracker_uri"] = "https://github.com/dry-rb/dry-effects/issues"
27
28
 
28
- spec.required_ruby_version = ">= 2.4.0"
29
+ spec.required_ruby_version = ">= 2.6.0"
29
30
 
30
31
  # to update dependencies edit project.yml
31
32
  spec.add_runtime_dependency "concurrent-ruby", "~> 1.0"
32
33
  spec.add_runtime_dependency "dry-container", "~> 0.7", ">= 0.7.2"
33
- spec.add_runtime_dependency "dry-core", "~> 0.4", ">= 0.4.7"
34
- spec.add_runtime_dependency "dry-equalizer", "~> 0.2", ">= 0.2.2"
34
+ spec.add_runtime_dependency "dry-core", "~> 0.5", ">= 0.5"
35
35
  spec.add_runtime_dependency "dry-inflector", "~> 0.1", ">= 0.1.2"
36
36
  spec.add_runtime_dependency "dry-initializer", "~> 3.0"
37
37
 
@@ -1,8 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'concurrent/map'
4
- require 'dry/effects/inflector'
5
- require 'dry/effects/handler'
3
+ require "concurrent/map"
4
+ require "dry/effects/inflector"
5
+ require "dry/effects/handler"
6
6
 
7
7
  module Dry
8
8
  module Effects
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'dry/container'
3
+ require "dry/container"
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/equalizer'
4
- require 'dry/effects/initializer'
3
+ require "dry/core/equalizer"
4
+ require "dry/effects/initializer"
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/effect'
3
+ require "dry/effects/effect"
4
4
 
5
5
  module Dry
6
6
  module Effects
@@ -11,6 +11,8 @@ module Dry
11
11
  Await = Effect.new(type: :async, name: :await)
12
12
 
13
13
  def initialize
14
+ super
15
+
14
16
  module_eval do
15
17
  define_method(:async) { |&block| ::Dry::Effects.yield(Async.(block)) }
16
18
  define_method(:await) { |task| ::Dry::Effects.yield(Await.(task)) }
@@ -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
@@ -11,6 +11,8 @@ module Dry
11
11
  end
12
12
 
13
13
  def initialize(scope = nil, shared: false, **kw)
14
+ super()
15
+
14
16
  if !kw.empty?
15
17
  scope, as = kw.to_a[0]
16
18
  elsif scope.is_a?(::Hash)
@@ -25,16 +27,10 @@ module Dry
25
27
  scope: scope
26
28
  )
27
29
 
28
- if shared
29
- key = method(:shared_cache_key)
30
- else
31
- key = method(:cache_key)
32
- end
33
-
34
- methods = Array(as)
30
+ key = key(shared)
35
31
 
36
32
  module_eval do
37
- methods.each do |meth|
33
+ Array(as).each do |meth|
38
34
  define_method(meth) do |*args, &block|
39
35
  if block
40
36
  eff = fetch_or_store.(key.(self, args), block)
@@ -48,6 +44,14 @@ module Dry
48
44
  end
49
45
  end
50
46
 
47
+ def key(shared)
48
+ if shared
49
+ method(:shared_cache_key)
50
+ else
51
+ method(:cache_key)
52
+ end
53
+ end
54
+
51
55
  def shared_cache_key(_, args, method: Undefined)
52
56
  if Undefined.equal?(method)
53
57
  args
@@ -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
@@ -11,6 +11,8 @@ module Dry
11
11
  end
12
12
 
13
13
  def initialize(id)
14
+ super()
15
+
14
16
  get = CmpEffect.new(type: :cmp, name: :get, id: id)
15
17
 
16
18
  module_eval do
@@ -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(**options)
21
+ super()
22
+
21
23
  module_eval do
22
24
  define_method(:current_time) do |opts = EMPTY_HASH|
23
25
  round = opts.fetch(:round, Undefined)
@@ -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
@@ -11,6 +11,8 @@ module Dry
11
11
  Wait = Effect.new(type: :defer, name: :wait)
12
12
 
13
13
  def initialize
14
+ super
15
+
14
16
  module_eval do
15
17
  define_method(:defer) do |executor: Undefined, &block|
16
18
  ::Dry::Effects.yield(Defer.(block, executor))
@@ -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
  Read = Effect.new(type: :env, name: :read)
10
10
 
11
11
  def initialize(*args, **kwargs)
12
+ super()
13
+
12
14
  readers = args.zip(args) + kwargs.to_a
13
15
 
14
16
  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
  Fork = Effect.new(type: :fork)
10
10
 
11
11
  def initialize
12
+ super
13
+
12
14
  module_eval(<<~RUBY, __FILE__, __LINE__ + 1)
13
15
  def fork
14
16
  yield(::Dry::Effects.yield(Fork))
@@ -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
@@ -11,6 +11,8 @@ module Dry
11
11
  end
12
12
 
13
13
  def initialize(dependency)
14
+ super()
15
+
14
16
  lookup = ImplicitEffect.new(type: :implicit, dependency: dependency)
15
17
 
16
18
  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
@@ -11,6 +11,8 @@ module Dry
11
11
  end
12
12
 
13
13
  def initialize(scope = :default)
14
+ super()
15
+
14
16
  interrupt = InterruptEffect.new(type: :interrupt, scope: scope)
15
17
 
16
18
  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
@@ -12,6 +12,8 @@ module Dry
12
12
  Locked = Effect.new(type: :lock, name: :locked?)
13
13
 
14
14
  def initialize
15
+ super
16
+
15
17
  module_eval do
16
18
  define_method(:lock) do |key, meta: Undefined, &block|
17
19
  if block
@@ -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
@@ -10,6 +10,8 @@ module Dry
10
10
  Join = Effect.new(type: :parallel, name: :join)
11
11
 
12
12
  def initialize
13
+ super
14
+
13
15
  define_method(:par) { |&block| ::Dry::Effects.yield(Par).(&block) }
14
16
  define_method(:join) { |xs| ::Dry::Effects.yield(Join.payload(xs)) }
15
17
  end
@@ -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
  Rand = Effect.new(type: :random, name: :rand)
10
10
 
11
11
  def initialize
12
+ super
13
+
12
14
  module_eval do
13
15
  define_method(:rand) { |n = nil| ::Dry::Effects.yield(Rand.payload(n)) }
14
16
  end
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'dry/effects/effects/state'
3
+ require "dry/effects/effects/state"
4
4
 
5
5
  module Dry
6
6
  module Effects
@@ -1,23 +1,43 @@
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
8
8
  module Effects
9
9
  class Resolve < ::Module
10
+ DependencyNameInvalid = Class.new(StandardError)
11
+
12
+ VALID_NAME = /([a-z_][a-zA-Z_0-9]*)$/.freeze
13
+
10
14
  Resolve = Effect.new(type: :resolve)
11
15
 
12
16
  Constructors.register(:Resolve) { |key| Resolve.(key) }
13
17
 
14
18
  def initialize(*keys, **aliases)
19
+ super()
20
+
21
+ keys_aliased = keys.map { |k| name_for(k) }.zip(keys)
15
22
  module_eval do
16
- (keys.zip(keys) + aliases.to_a).each do |name, key|
23
+ (keys_aliased + aliases.to_a).each do |name, key|
17
24
  define_method(name) { |&block| ::Dry::Effects.yield(Resolve.(key), &block) }
18
25
  end
19
26
  end
20
27
  end
28
+
29
+ private
30
+
31
+ # similar approach in dry-auto_inject https://github.com/dry-rb/dry-auto_inject/blob/master/lib/dry/auto_inject/dependency_map.rb#L42
32
+ def name_for(identifier)
33
+ matched = VALID_NAME.match(identifier.to_s)
34
+ unless matched
35
+ raise DependencyNameInvalid,
36
+ "name +#{identifier}+ is not a valid Ruby identifier"
37
+ end
38
+
39
+ matched[0]
40
+ end
21
41
  end
22
42
  end
23
43
  end