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 +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
|
- - ">"
|