waterfall 1.2.1 → 1.3.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: e4fa811a59c1b353ab25f5c56d47c494aab50972
4
- data.tar.gz: 07657eeaebc676339be72d29373afecff23527f1
3
+ metadata.gz: 078be4fc0c809c19b4dc69414117ed5ab2962cec
4
+ data.tar.gz: a1dbebd4c474ea3cca0f3d2ac62ca2883d2cbc73
5
5
  SHA512:
6
- metadata.gz: 512a8896bbd591e770c78be0d3c8fd3628f824c664020b2d1b430b0a2c718e34dc8cca6661f1387d283368eef54b4e439698bad1d0ca950e3c991aa2c9a25257
7
- data.tar.gz: ce7e7632e200548d05a87419aa03b8f318c3284f40052b2b792fa1c8afba5246860b67151a1dda8db66e8006c5e26510edad3925833e0ab17499f927140e1447
6
+ metadata.gz: 4cb114ad14c238c888ee842cc29020a56ce9d554848ba83a60b90bf2faa17a4888d6ff32ad6c2d066379d4107909d252cafa0f55b0741feb3b29b0e233707885
7
+ data.tar.gz: e21b53012acfcf0555c874c26f8fd3bd490f33e9ff74be1afccb9043625038ed08c6b00bc1daa7502f1a0ddd514f51e461952fa68eeabe3c1d9d10f6b36418c8
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- waterfall (1.2.1)
4
+ waterfall (1.3.0)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
data/README.md CHANGED
@@ -53,7 +53,7 @@ Flow.new
53
53
  .chain(user1: :user) { FetchUser.new(1) }
54
54
  .chain(user2: :user) { FetchUser.new(2) }
55
55
  .chain {|outflow| puts(outflow.user1, outflow.user2) } # report success
56
- .on_dam {|error| puts(error) } # report error
56
+ .on_dam {|error, context| puts(error, context) } # report error
57
57
  ```
58
58
 
59
59
  Which works like:
@@ -1,3 +1,8 @@
1
+ ===1.3.0
2
+ - Introduced `error_pool_context`, providing with the stacktrace leading to the dam
3
+ - changed `on_dam` signature to pass context to the block
4
+ - add `Waterfall.caller_locations_length` to limit the number of lines of the stacktrace (default is nil: unlimited)
5
+
1
6
  ===1.2.1
2
7
  - Introduced `Waterfall.with_reversible_flow`, makes `reverse_flow` optionnal, may save memory
3
8
  - outflow is now lazy loaded
@@ -6,17 +6,21 @@ require 'waterfall/predicates/when_falsy'
6
6
  require 'waterfall/predicates/when_truthy'
7
7
  require 'waterfall/predicates/chain'
8
8
 
9
+ WATERFALL_PATH = "lib/waterfall"
10
+
9
11
  module Waterfall
10
12
 
11
- attr_reader :error_pool
13
+ attr_reader :error_pool, :error_pool_context
12
14
 
13
15
  class IncorrectDamArgumentError < StandardError; end
14
16
  class IncorrectChainingArgumentError < StandardError; end
15
17
 
16
18
  class << self
17
19
  attr_accessor :with_reversible_flow
20
+ attr_accessor :caller_locations_length
18
21
  end
19
22
  @with_reversible_flow = true
23
+ @caller_locations_length = nil
20
24
 
21
25
  def outflow
22
26
  @outflow ||= OpenStruct.new({})
@@ -49,16 +53,17 @@ module Waterfall
49
53
  self
50
54
  end
51
55
 
52
- def dam(obj)
56
+ def dam(obj, context = nil)
53
57
  raise IncorrectDamArgumentError.new("You cant dam with a falsy object") unless obj
54
58
  _wf_run do
55
59
  @error_pool = obj
60
+ @error_pool_context = context || _error_pool_context
56
61
  _reverse_flows(true)
57
62
  end
58
63
  end
59
64
 
60
65
  def halt_chain(&block)
61
- yield(outflow, error_pool)
66
+ yield(outflow, error_pool, error_pool_context)
62
67
  end
63
68
 
64
69
  def dammed?
@@ -104,6 +109,12 @@ module Waterfall
104
109
  yield unless dammed?
105
110
  self
106
111
  end
112
+
113
+ def _error_pool_context
114
+ caller_locations(1, Waterfall.caller_locations_length).reject do |line|
115
+ line.to_s.include?(WATERFALL_PATH)
116
+ end
117
+ end
107
118
  end
108
119
 
109
120
  class Wf
@@ -27,7 +27,7 @@ module Waterfall
27
27
  @root.send :_add_executed_flow, child_waterfall
28
28
 
29
29
  if child_waterfall.dammed?
30
- @root.dam child_waterfall.error_pool
30
+ @root.dam child_waterfall.error_pool, child_waterfall.error_pool_context
31
31
  end
32
32
 
33
33
  self
@@ -7,7 +7,7 @@ module Waterfall
7
7
 
8
8
  def call
9
9
  return unless @root.dammed?
10
- yield @root.error_pool, @root.outflow, @root
10
+ yield @root.error_pool, @root.error_pool_context, @root.outflow, @root
11
11
  end
12
12
  end
13
13
  end
@@ -1,3 +1,3 @@
1
1
  module Waterfall
2
- VERSION = "1.2.1"
2
+ VERSION = "1.3.0"
3
3
  end
@@ -42,12 +42,14 @@ describe Flow do
42
42
  it 'isnt dammed by default' do
43
43
  expect(wf.dammed?).to be false
44
44
  expect(wf.error_pool).to eq nil
45
+ expect(wf.error_pool_context).to be nil
45
46
  end
46
47
 
47
48
  it 'is dammed if you dam it!' do
48
49
  wf.dam('error')
49
50
  expect(wf.dammed?).to be true
50
51
  expect(wf.error_pool).to eq 'error'
52
+ expect(wf.error_pool_context).to be_an Array
51
53
  end
52
54
 
53
55
  it 'dam raises if falsy argument sent' do
@@ -66,6 +68,15 @@ describe Flow do
66
68
  expect(wf.error_pool).to eq 'error'
67
69
  end
68
70
 
71
+ it 'error pool and context values propagate to root flow' do
72
+ sub_flow = Flow.new
73
+ sub_flow.chain { sub_flow.dam('errr') }
74
+ wf.chain { sub_flow }
75
+
76
+ expect(wf).to be_dammed
77
+ expect(wf.error_pool_context).to eq sub_flow.error_pool_context
78
+ end
79
+
69
80
  it 'doesnt execute chain blocks once dammed' do
70
81
  expect do
71
82
  wf.when_falsy { false }.dam { 'error' }.chain { raise 'I should not be executed because of damming before me' }
@@ -85,9 +96,10 @@ describe Flow do
85
96
  expect(listener).to have_received :failure
86
97
  end
87
98
 
88
- it 'on_dam blocks yield error pool, outflow and waterfall' do
89
- wf.dam('errr').on_dam do |error_pool, outflow, waterfall|
99
+ it 'on_dam blocks yield error pool, error context, outflow and waterfall' do
100
+ wf.dam('errr').on_dam do |error_pool, error_pool_context, outflow, waterfall|
90
101
  expect(error_pool).to eq wf.error_pool
102
+ expect(error_pool_context).to eq wf.error_pool_context
91
103
  expect(outflow).to eq wf.outflow
92
104
  expect(waterfall).to eq wf
93
105
  end
@@ -106,9 +118,10 @@ describe Flow do
106
118
  end
107
119
 
108
120
  it "yields expected values even if dammed" do
109
- wf.chain(:foo) { 1 }.dam("errr").halt_chain do |outflow, error_pool|
121
+ wf.chain(:foo) { 1 }.dam("errr").halt_chain do |outflow, error_pool, error_pool_context|
110
122
  expect(outflow).to eq wf.outflow
111
123
  expect(error_pool).to eq wf.error_pool
124
+ expect(error_pool_context).to eq wf.error_pool_context
112
125
  end
113
126
  end
114
127
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: waterfall
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.1
4
+ version: 1.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Benjamin Roth
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-10-16 00:00:00.000000000 Z
11
+ date: 2019-11-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler