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 +4 -4
- data/.travis.yml +1 -0
- data/dry-effects.gemspec +1 -0
- data/lib/dry/effects/all.rb +2 -2
- data/lib/dry/effects/effects/current_time.rb +9 -7
- data/lib/dry/effects/effects/timestamp.rb +27 -0
- data/lib/dry/effects/provider/class_interface.rb +2 -2
- data/lib/dry/effects/providers/current_time/time_generators.rb +37 -0
- data/lib/dry/effects/providers/current_time.rb +37 -12
- data/lib/dry/effects/providers/lock.rb +5 -3
- data/lib/dry/effects/providers/retry.rb +4 -2
- data/lib/dry/effects/providers/timestamp.rb +60 -0
- data/lib/dry/effects/stack.rb +6 -4
- data/lib/dry/effects/version.rb +1 -1
- metadata +6 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e467f4de9697568b05a68ccc58c3d7acc44ab3f196e6a93c07c574b6aaeca6f9
|
4
|
+
data.tar.gz: 4f3b5093c7aabb77aeab310080bc1a1e2091537da7724c5c1b70587cbcbce12b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: bc7202bfd43a789fd1221323126eee3000479c45508ccb08874a29b91b86ee089a6248b7f33a64a651aa296b84a4ae425bcdab689b18709144ea33ab3cd9e582
|
7
|
+
data.tar.gz: 1e2a61bcfe1e64991317b028b1bae6e3ddd663c3b658c9f67ecb14dc0570610d75bccc94ad8ec9cb7d8f935099086dadcb6e075bc702a920820fc07b90bb8571
|
data/.travis.yml
CHANGED
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'
|
data/lib/dry/effects/all.rb
CHANGED
@@ -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
|
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(
|
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
|
-
|
17
|
-
|
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
|
-
|
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
|
@@ -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 :
|
21
|
+
attr_reader :generator
|
18
22
|
|
19
|
-
def call(stack,
|
20
|
-
|
21
|
-
|
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
|
-
|
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
|
-
|
30
|
-
|
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
|
-
|
54
|
+
time
|
34
55
|
else
|
35
|
-
|
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=#{
|
66
|
+
"current_time[fixed=#{generator.().iso8601(6)}]"
|
42
67
|
else
|
43
68
|
'current_time[fixed=false]'
|
44
69
|
end
|
@@ -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
|
data/lib/dry/effects/stack.rb
CHANGED
data/lib/dry/effects/version.rb
CHANGED
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.
|
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-
|
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: '
|
255
|
+
version: '2.4'
|
253
256
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
254
257
|
requirements:
|
255
258
|
- - ">"
|