simple_pipeline 0.0.3 → 0.0.4
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/.rspec +1 -0
- data/README.md +4 -0
- data/lib/simple_pipeline/timeout.rb +0 -6
- data/lib/simple_pipeline/version.rb +3 -3
- data/lib/simple_pipeline.rb +77 -34
- data/spec/simple_pipeline_spec.rb +52 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: '0841cc3eab093abcc6a954e3d24c1153de824d02'
|
4
|
+
data.tar.gz: 46f0b23b29b62843bbefbe73615ac318c1082214
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: dc93171e985aa842a237ddce20c0ab935d5bcb776a63153e3ca6429018435e8cae0dff833641ea6c39b6c6184d838df00d26610707b80acd731ec762cbe20015
|
7
|
+
data.tar.gz: eb66c3a879ef980ab1679a8e6b5150cc9c0680ac85d6664a1f5d255f40e92fa9a051d4771116a9bc956f143c1459c1657c28e478c36125c6356ed3a78486d143
|
data/.rspec
CHANGED
data/README.md
CHANGED
@@ -90,5 +90,9 @@ pipeline.add pipe2
|
|
90
90
|
```
|
91
91
|
This will override the timeout value set by the class definition.
|
92
92
|
|
93
|
+
## Related Projects
|
94
|
+
|
95
|
+
* [PiecePipe](https://github.com/atomicobject/piece_pipe), an alternative implementation of the pipeline pattern.
|
96
|
+
|
93
97
|
## License
|
94
98
|
**SimplePipeline** is released under the [MIT license](MIT-LICENSE).
|
@@ -17,12 +17,6 @@ class SimplePipeline
|
|
17
17
|
@timeout_in_sec = sec
|
18
18
|
end
|
19
19
|
|
20
|
-
def process_with_timeout (payload)
|
21
|
-
::Timeout::timeout(timeout) {
|
22
|
-
process(payload)
|
23
|
-
}
|
24
|
-
end
|
25
|
-
|
26
20
|
def timeout
|
27
21
|
@timeout_in_sec || self.class.class_variable_get(:@@timeout_in_sec)
|
28
22
|
end
|
@@ -1,3 +1,3 @@
|
|
1
|
-
class SimplePipeline
|
2
|
-
VERSION = "0.0.
|
3
|
-
end
|
1
|
+
class SimplePipeline
|
2
|
+
VERSION = "0.0.4"
|
3
|
+
end
|
data/lib/simple_pipeline.rb
CHANGED
@@ -1,35 +1,78 @@
|
|
1
|
-
require "simple_pipeline/timeout"
|
2
|
-
require "simple_pipeline/version"
|
3
|
-
|
4
|
-
|
5
|
-
class SimplePipeline
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
1
|
+
require "simple_pipeline/timeout"
|
2
|
+
require "simple_pipeline/version"
|
3
|
+
|
4
|
+
|
5
|
+
class SimplePipeline
|
6
|
+
|
7
|
+
attr_reader :errors
|
8
|
+
|
9
|
+
def initialize
|
10
|
+
@pipe_order = []
|
11
|
+
@pipe_config = {}
|
12
|
+
@errors = []
|
13
|
+
end
|
14
|
+
|
15
|
+
def add (pipe, args = {})
|
16
|
+
begin
|
17
|
+
raise ArgumentError, "invalid pipe - incorrect number of arguments for process() method (should be 1)" unless pipe.class.instance_method(:process).arity == 1
|
18
|
+
rescue NameError
|
19
|
+
raise ArgumentError, "invalid pipe - process() method not found"
|
20
|
+
end
|
21
|
+
|
22
|
+
@pipe_order << pipe
|
23
|
+
@pipe_config[pipe] = args
|
24
|
+
|
25
|
+
return pipe
|
26
|
+
end
|
27
|
+
|
28
|
+
def size
|
29
|
+
return @pipe_order.size
|
30
|
+
end
|
31
|
+
|
32
|
+
def process (payload)
|
33
|
+
@pipe_order.each do |pipe|
|
34
|
+
begin
|
35
|
+
timeout = @pipe_config[pipe][:timeout]
|
36
|
+
|
37
|
+
if timeout.nil? && (pipe.is_a? SimplePipeline::Timeout)
|
38
|
+
timeout = pipe.timeout
|
39
|
+
end
|
40
|
+
|
41
|
+
if timeout.nil?
|
42
|
+
pipe.process(payload)
|
43
|
+
else
|
44
|
+
process_with_timeout(pipe, payload, timeout)
|
45
|
+
end
|
46
|
+
rescue
|
47
|
+
raise $! unless continue_on_error?($!, @pipe_config[pipe][:continue_on_error?])
|
48
|
+
@errors << $!
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
alias :length :size
|
54
|
+
|
55
|
+
private
|
56
|
+
|
57
|
+
def continue_on_error? (e, config_value)
|
58
|
+
return false if config_value.nil? || config_value == false
|
59
|
+
return true if config_value == true
|
60
|
+
|
61
|
+
if (config_value.is_a? Class) && (e.is_a? config_value)
|
62
|
+
return true
|
63
|
+
end
|
64
|
+
|
65
|
+
if config_value.is_a? Array
|
66
|
+
config_value.each { |klass| return true if (klass.is_a? Class) && (e.is_a? klass) }
|
67
|
+
end
|
68
|
+
|
69
|
+
return false
|
70
|
+
end
|
71
|
+
|
72
|
+
|
73
|
+
def process_with_timeout (pipe, payload, timeout)
|
74
|
+
::Timeout::timeout(timeout) {
|
75
|
+
pipe.process(payload)
|
76
|
+
}
|
77
|
+
end
|
35
78
|
end
|
@@ -22,6 +22,18 @@ class TimeoutPipe
|
|
22
22
|
end
|
23
23
|
end
|
24
24
|
|
25
|
+
class TimeoutPipe2
|
26
|
+
def process (payload)
|
27
|
+
sleep 10 # seconds
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
class ExceptionPipe
|
32
|
+
def process (payload)
|
33
|
+
raise ArgumentError.new "Something bad happened"
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
25
37
|
describe SimplePipeline do
|
26
38
|
it "should support three normal pipes" do
|
27
39
|
pipeline = SimplePipeline.new
|
@@ -49,7 +61,7 @@ describe SimplePipeline do
|
|
49
61
|
}.to raise_error(ArgumentError)
|
50
62
|
end
|
51
63
|
|
52
|
-
it "should support pipes with timeout" do
|
64
|
+
it "should support pipes with timeout values" do
|
53
65
|
pipeline = SimplePipeline.new
|
54
66
|
pipe = TimeoutPipe.new
|
55
67
|
pipeline.add pipe
|
@@ -61,5 +73,44 @@ describe SimplePipeline do
|
|
61
73
|
expect {
|
62
74
|
pipeline.process({})
|
63
75
|
}.to raise_error(Timeout::Error)
|
76
|
+
|
77
|
+
pipeline = SimplePipeline.new
|
78
|
+
pipeline.add TimeoutPipe2.new, :timeout => 1
|
79
|
+
|
80
|
+
expect {
|
81
|
+
pipeline.process({})
|
82
|
+
}.to raise_error(Timeout::Error)
|
83
|
+
end
|
84
|
+
|
85
|
+
it "should support pipes with continue_on_error => true" do
|
86
|
+
pipeline = SimplePipeline.new
|
87
|
+
pipeline.add TestPipe.new
|
88
|
+
pipeline.add ExceptionPipe.new
|
89
|
+
pipeline.add TestPipe.new
|
90
|
+
|
91
|
+
payload = {:test_value => 10}
|
92
|
+
|
93
|
+
expect {
|
94
|
+
pipeline.process(payload)
|
95
|
+
}.to raise_error(ArgumentError)
|
96
|
+
|
97
|
+
expect(payload[:test_value]).to eq 100
|
98
|
+
expect(pipeline.errors.size).to eq 0
|
99
|
+
|
100
|
+
pipeline = SimplePipeline.new
|
101
|
+
pipeline.add TestPipe.new
|
102
|
+
pipeline.add ExceptionPipe.new, :continue_on_error? => true
|
103
|
+
pipeline.add ExceptionPipe.new, :continue_on_error? => ArgumentError
|
104
|
+
pipeline.add ExceptionPipe.new, :continue_on_error? => StandardError
|
105
|
+
pipeline.add ExceptionPipe.new, :continue_on_error? => [ArgumentError]
|
106
|
+
pipeline.add ExceptionPipe.new, :continue_on_error? => [RuntimeError, StandardError]
|
107
|
+
pipeline.add TestPipe.new
|
108
|
+
|
109
|
+
payload = {:test_value => 10}
|
110
|
+
|
111
|
+
pipeline.process(payload)
|
112
|
+
|
113
|
+
expect(payload[:test_value]).to eq 1000
|
114
|
+
expect(pipeline.errors.size).to eq 5
|
64
115
|
end
|
65
116
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: simple_pipeline
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jonathan Wong
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-07-
|
11
|
+
date: 2016-07-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rspec
|