dry-effects 0.1.0.alpha → 0.1.0.alpha2

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 66aa8408a51ae62ea853de06a0d19617925646c28783044e01338e46d5e75e0d
4
- data.tar.gz: f226f1cbb69164f77db634870e139439290927f58075aa0a2fa83b37bb438c46
3
+ metadata.gz: e467f4de9697568b05a68ccc58c3d7acc44ab3f196e6a93c07c574b6aaeca6f9
4
+ data.tar.gz: 4f3b5093c7aabb77aeab310080bc1a1e2091537da7724c5c1b70587cbcbce12b
5
5
  SHA512:
6
- metadata.gz: bebd714592097d5dde1852ad38bc5162e1d275c7c92d98a36a9f9445dead76dde4325a6b4e58758ca3fc40ae7ba554a2484c1ae64f59b344273f34da9e4d5305
7
- data.tar.gz: '06600796cf9707b1e55141d3fec4cae8584a8525b3ed3155eb36be05095db85148e2cdc75f2d9aad662096cb454f5a8ab4070989022d6cc16ce98c3af87b3261'
6
+ metadata.gz: bc7202bfd43a789fd1221323126eee3000479c45508ccb08874a29b91b86ee089a6248b7f33a64a651aa296b84a4ae425bcdab689b18709144ea33ab3cd9e582
7
+ data.tar.gz: 1e2a61bcfe1e64991317b028b1bae6e3ddd663c3b658c9f67ecb14dc0570610d75bccc94ad8ec9cb7d8f935099086dadcb6e075bc702a920820fc07b90bb8571
data/.travis.yml CHANGED
@@ -7,6 +7,7 @@ before_script:
7
7
  - chmod +x ./cc-test-reporter
8
8
  - ./cc-test-reporter before-build
9
9
  rvm:
10
+ - 2.4.6
10
11
  - 2.5.5
11
12
  - 2.6.3
12
13
  - truffleruby
data/dry-effects.gemspec CHANGED
@@ -35,6 +35,7 @@ Gem::Specification.new do |spec|
35
35
  spec.bindir = 'exe'
36
36
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
37
37
  spec.require_paths = ['lib']
38
+ spec.required_ruby_version = '>= 2.4'
38
39
 
39
40
  spec.add_runtime_dependency 'concurrent-ruby', '~> 1.0'
40
41
  spec.add_runtime_dependency 'dry-container', '~> 0.7', '>= 0.7.2'
@@ -9,7 +9,7 @@ module Dry
9
9
  default = %i[
10
10
  cache current_time random resolve defer
11
11
  state interrupt amb retry fork parallel
12
- async implicit env lock reader
12
+ async implicit env lock reader timestamp
13
13
  ]
14
14
 
15
15
  effect_modules = ::Concurrent::Map.new
@@ -38,7 +38,7 @@ module Dry
38
38
  Providers.const_get(Inflector.camelize(key))
39
39
  end
40
40
 
41
- Handler.singleton_class.define_method(class_name) do |*args|
41
+ Handler.singleton_class.send(:define_method, class_name) do |*args|
42
42
  ::Dry::Effects.providers[key].mixin(*args)
43
43
  end
44
44
  end
@@ -8,16 +8,18 @@ module Dry
8
8
  class CurrentTime < ::Module
9
9
  CurrentTime = Effect.new(type: :current_time)
10
10
 
11
- def initialize(round: Undefined)
12
- get = CurrentTime.payload(round_to: round)
13
-
11
+ def initialize(options = EMPTY_HASH)
14
12
  module_eval do
15
- define_method(:current_time) do |round: Undefined|
16
- if Undefined.equal?(round)
17
- ::Dry::Effects.yield(get)
13
+ define_method(:current_time) do |round: Undefined, refresh: false|
14
+ round_to = Undefined.coalesce(round, options.fetch(:round, Undefined))
15
+
16
+ if Undefined.equal?(round_to) && refresh.equal?(false)
17
+ effect = CurrentTime
18
18
  else
19
- ::Dry::Effects.yield(get.payload(round_to: round))
19
+ effect = CurrentTime.payload(round_to: round_to, refresh: refresh)
20
20
  end
21
+
22
+ ::Dry::Effects.yield(effect)
21
23
  end
22
24
  end
23
25
  end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'dry/effects/effect'
4
+
5
+ module Dry
6
+ module Effects
7
+ module Effects
8
+ class Timestamp < ::Module
9
+ Timestamp = Effect.new(type: :timestamp)
10
+
11
+ def initialize(options = EMPTY_HASH)
12
+ module_eval do
13
+ define_method(:timestamp) do |round: Undefined|
14
+ round_to = Undefined.coalesce(round, options.fetch(:round, Undefined))
15
+
16
+ if Undefined.equal?(round_to)
17
+ ::Dry::Effects.yield(Timestamp)
18
+ else
19
+ ::Dry::Effects.yield(Timestamp.payload(round_to: round_to))
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -46,8 +46,8 @@ module Dry
46
46
  handler = Handler.new(provider)
47
47
 
48
48
  ::Module.new do
49
- define_method(handle_method) do |*args, &block|
50
- handler.(args, &block)
49
+ define_method(handle_method) do |*xs, &block|
50
+ handler.(xs, &block)
51
51
  end
52
52
  end
53
53
  end
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'dry/effects/provider'
4
+
5
+ module Dry
6
+ module Effects
7
+ module Providers
8
+ class CurrentTime < Provider[:current_time]
9
+ module TimeGenetators
10
+ FixedTimeGenerator = lambda do
11
+ time = ::Time.now
12
+ lambda do |refresh: false, **|
13
+ time = ::Time.now if refresh
14
+ time
15
+ end
16
+ end
17
+
18
+ RunningTime = -> ** { ::Time.now }
19
+ RunningTimeGenerator = -> { RunningTime }
20
+
21
+ IncrementingTimeGenerator = lambda do |initial, step|
22
+ start = Undefined.default(initial) { ::Time.now }
23
+ current = nil
24
+
25
+ lambda do |**|
26
+ if current.nil?
27
+ current = start
28
+ else
29
+ current += step
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -1,12 +1,16 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'dry/effects/provider'
4
+ require 'dry/effects/providers/current_time/time_generators'
4
5
 
5
6
  module Dry
6
7
  module Effects
7
8
  module Providers
8
9
  class CurrentTime < Provider[:current_time]
9
10
  include Dry::Equalizer(:fixed, :round)
11
+ include TimeGenetators
12
+
13
+ Locate = Effect.new(type: :current_time, name: :locate)
10
14
 
11
15
  option :fixed, default: -> { true }
12
16
 
@@ -14,31 +18,52 @@ module Dry
14
18
 
15
19
  alias_method :fixed?, :fixed
16
20
 
17
- attr_reader :time
21
+ attr_reader :generator
18
22
 
19
- def call(stack, time = Undefined)
20
- if fixed?
21
- @time = Undefined.default(time) { ::Time.now }
23
+ def call(stack, generator = Undefined, **options)
24
+ @generator = build_generator(generator, **options)
25
+ super(stack)
26
+ end
27
+
28
+ def build_generator(generator, step: Undefined, initial: Undefined, overridable: false)
29
+ if overridable
30
+ parent = ::Dry::Effects.yield(Locate) { nil }
22
31
  else
23
- @time = time
32
+ parent = nil
33
+ end
34
+
35
+ if !parent.nil?
36
+ -> options { parent.current_time(options) }
37
+ elsif !Undefined.equal?(generator)
38
+ generator
39
+ elsif !Undefined.equal?(step)
40
+ IncrementingTimeGenerator.(initial, step)
41
+ elsif fixed?
42
+ FixedTimeGenerator.()
43
+ else
44
+ RunningTimeGenerator.()
24
45
  end
25
- super(stack)
26
46
  end
27
47
 
28
- def current_time(round_to: Undefined)
29
- t = fixed? ? time : Undefined.default(time) { ::Time.now }
30
- round = Undefined.default(round_to) { self.round }
48
+ def current_time(round_to: Undefined, **options)
49
+ time = generator.(**options)
50
+
51
+ round = Undefined.coalesce(round_to, self.round)
31
52
 
32
53
  if Undefined.equal?(round)
33
- t
54
+ time
34
55
  else
35
- t.round(round)
56
+ time.round(round)
36
57
  end
37
58
  end
38
59
 
60
+ def locate
61
+ self
62
+ end
63
+
39
64
  def represent
40
65
  if fixed?
41
- "current_time[fixed=#{time.iso8601(6)}]"
66
+ "current_time[fixed=#{generator.().iso8601(6)}]"
42
67
  else
43
68
  'current_time[fixed=false]'
44
69
  end
@@ -89,9 +89,11 @@ module Dry
89
89
  end
90
90
 
91
91
  with_backend(backend_replace) do
92
- super(stack)
93
- ensure
94
- owned.each { |handle| unlock(handle) }
92
+ begin
93
+ super(stack)
94
+ ensure
95
+ owned.each { |handle| unlock(handle) }
96
+ end
95
97
  end
96
98
  end
97
99
 
@@ -20,8 +20,10 @@ module Dry
20
20
  @attempts = 0
21
21
 
22
22
  loop do
23
- return attempt { yield }
24
- rescue halt
23
+ begin
24
+ return attempt { yield }
25
+ rescue halt
26
+ end
25
27
  end
26
28
  end
27
29
 
@@ -0,0 +1,60 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'dry/effects/provider'
4
+ require 'dry/effects/providers/current_time'
5
+
6
+ module Dry
7
+ module Effects
8
+ module Providers
9
+ class Timestamp < Provider[:timestamp]
10
+ include Dry::Equalizer(:round)
11
+ include CurrentTime::TimeGenetators
12
+
13
+ Locate = Effect.new(type: :timestamp, name: :locate)
14
+
15
+ option :round, default: -> { Undefined }
16
+
17
+ attr_reader :generator
18
+
19
+ def call(stack, generator = Undefined, **options)
20
+ @generator = build_generator(generator, **options)
21
+ super(stack)
22
+ end
23
+
24
+ def build_generator(generator, step: Undefined, initial: Undefined, overridable: false)
25
+ if overridable
26
+ parent = ::Dry::Effects.yield(Locate) { nil }
27
+ else
28
+ parent = nil
29
+ end
30
+
31
+ if !parent.nil?
32
+ -> options { parent.timestamp(options) }
33
+ elsif !Undefined.equal?(generator)
34
+ generator
35
+ elsif !Undefined.equal?(step)
36
+ IncrementingTimeGenerator.(initial, step)
37
+ else
38
+ RunningTimeGenerator.()
39
+ end
40
+ end
41
+
42
+ def timestamp(round_to: Undefined, **options)
43
+ time = generator.(**options)
44
+
45
+ round = Undefined.coalesce(round_to, self.round)
46
+
47
+ if Undefined.equal?(round)
48
+ time
49
+ else
50
+ time.round(round)
51
+ end
52
+ end
53
+
54
+ def locate
55
+ self
56
+ end
57
+ end
58
+ end
59
+ end
60
+ end
@@ -25,10 +25,12 @@ module Dry
25
25
 
26
26
  def push(provider, args)
27
27
  provider.(self, *args) do
28
- providers.unshift(provider)
29
- yield
30
- ensure
31
- providers.shift
28
+ begin
29
+ providers.unshift(provider)
30
+ yield
31
+ ensure
32
+ providers.shift
33
+ end
32
34
  end
33
35
  end
34
36
 
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Dry
4
4
  module Effects
5
- VERSION = '0.1.0.alpha'
5
+ VERSION = '0.1.0.alpha2'
6
6
  end
7
7
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dry-effects
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0.alpha
4
+ version: 0.1.0.alpha2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nikita Shilnikov
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2019-08-18 00:00:00.000000000 Z
11
+ date: 2019-08-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: concurrent-ruby
@@ -202,6 +202,7 @@ files:
202
202
  - lib/dry/effects/effects/resolve.rb
203
203
  - lib/dry/effects/effects/retry.rb
204
204
  - lib/dry/effects/effects/state.rb
205
+ - lib/dry/effects/effects/timestamp.rb
205
206
  - lib/dry/effects/errors.rb
206
207
  - lib/dry/effects/extensions.rb
207
208
  - lib/dry/effects/extensions/auto_inject.rb
@@ -219,6 +220,7 @@ files:
219
220
  - lib/dry/effects/providers/async.rb
220
221
  - lib/dry/effects/providers/cache.rb
221
222
  - lib/dry/effects/providers/current_time.rb
223
+ - lib/dry/effects/providers/current_time/time_generators.rb
222
224
  - lib/dry/effects/providers/defer.rb
223
225
  - lib/dry/effects/providers/env.rb
224
226
  - lib/dry/effects/providers/fork.rb
@@ -231,6 +233,7 @@ files:
231
233
  - lib/dry/effects/providers/resolve.rb
232
234
  - lib/dry/effects/providers/retry.rb
233
235
  - lib/dry/effects/providers/state.rb
236
+ - lib/dry/effects/providers/timestamp.rb
234
237
  - lib/dry/effects/stack.rb
235
238
  - lib/dry/effects/version.rb
236
239
  homepage: https://github.com/dry-rb/dry-effects
@@ -249,7 +252,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
249
252
  requirements:
250
253
  - - ">="
251
254
  - !ruby/object:Gem::Version
252
- version: '0'
255
+ version: '2.4'
253
256
  required_rubygems_version: !ruby/object:Gem::Requirement
254
257
  requirements:
255
258
  - - ">"