dry-effects 0.1.0.alpha → 0.1.0.alpha2

Sign up to get free protection for your applications and to get access to all the features.
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
  - - ">"