simple_pipeline 0.0.5 → 0.0.6
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/README.md +24 -2
- data/lib/simple_pipeline/validation.rb +24 -0
- data/lib/simple_pipeline/version.rb +1 -1
- data/lib/simple_pipeline.rb +15 -7
- data/spec/simple_pipeline_spec.rb +34 -0
- metadata +2 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a4a484ac10baf55839867a7e23333575331af1f2
|
4
|
+
data.tar.gz: fa4e96d7ef40d54df3d08b274c167a2c21a1e57d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: be5125980ed3f7164f294d2db6a431c0f72769af801308ac95654d85e3fb76bcec280d0c092b30b88e6fc37cd3c52eafa0244a7246567a44bf0258dfc3f708aa
|
7
|
+
data.tar.gz: bc1d2a74e196b4101067f409b9d7e0e69c9ea4941814f08fa69776b46ff170423f9b5e853e8cbe6f7b1298758b505c46b230aedf4677e21e6faa0b8ceeeec641
|
data/README.md
CHANGED
@@ -32,7 +32,7 @@ payload = {:some_key => some_value}
|
|
32
32
|
pipeline.process payload
|
33
33
|
```
|
34
34
|
|
35
|
-
**SimplePipeline** will call the ```process``` method on each of the pipes in the order that they were added to the pipeline.
|
35
|
+
**SimplePipeline** will call the ```process``` method on each of the pipes in the order that they were added to the pipeline. As long as the pipes don't maintain state, you can call ```SimplePipeline#process``` as many times as you want, potentially with each run working with a different payload object.
|
36
36
|
|
37
37
|
## Pipes
|
38
38
|
|
@@ -46,6 +46,24 @@ class Pipe1
|
|
46
46
|
end
|
47
47
|
```
|
48
48
|
|
49
|
+
If your object does not have a ```process``` method, you can still use it as a pipe, but you will need to explicitly state the method to invoke when adding the pipe to the pipeline. Likewise, the specified method must accept a single payload argument.
|
50
|
+
|
51
|
+
```ruby
|
52
|
+
class AlternatePipe
|
53
|
+
def execute (input)
|
54
|
+
# Do something with the input
|
55
|
+
end
|
56
|
+
|
57
|
+
def invoke (param1, param2)
|
58
|
+
# Do something else
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
pipeline.add AlternativePipe.new, :process_method => :execute # => OK
|
63
|
+
|
64
|
+
pipeline.add AlternativePipe.new, :process_method => :invoke # => throws ArgumentError
|
65
|
+
```
|
66
|
+
|
49
67
|
## Payload
|
50
68
|
|
51
69
|
The **payload** can be an Array, Hash, or any other Ruby object. Individual pipes have the responsibility to know what to do with the payload that is passed into the ```process``` method.
|
@@ -116,7 +134,11 @@ pipeline.add pipe, :continue_on_error? => [ArgumentError, NameError]
|
|
116
134
|
pipeline.add pipe, :continue_on_error? => Exception
|
117
135
|
```
|
118
136
|
|
119
|
-
After the pipeline finishes executing, you can call ```
|
137
|
+
After the pipeline finishes executing, you can call ```SimplePipeline#errors``` to get an Array of errors that were caught during execution. This Array will clear itself if the pipeline is run again.
|
138
|
+
|
139
|
+
```ruby
|
140
|
+
pipeline.errors # => Array of errors caught during last run
|
141
|
+
```
|
120
142
|
|
121
143
|
## Related Projects
|
122
144
|
|
@@ -0,0 +1,24 @@
|
|
1
|
+
class SimplePipeline
|
2
|
+
module Validation
|
3
|
+
class Error < StandardError; end
|
4
|
+
|
5
|
+
def self.included (base)
|
6
|
+
base.extend(ClassMethods)
|
7
|
+
base.class_variable_set(:@@validations, [])
|
8
|
+
end
|
9
|
+
|
10
|
+
module ClassMethods
|
11
|
+
def validate (validation_lambda)
|
12
|
+
raise ArgumentException "invalid validation - expect lambda instead of #{validation_lambda.class}" unless (validation_lambda.is_a? Proc) && validation_lambda.lambda?
|
13
|
+
|
14
|
+
self.class_variable_get(:@@validations) << validation_lambda
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def validate (payload)
|
19
|
+
self.class.class_variable_get(:@@validations).each do |validation_lambda|
|
20
|
+
raise SimplePipeline::Validation::Error.new "#{self.class} - #{payload}" unless validation_lambda.call(payload)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
data/lib/simple_pipeline.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require "simple_pipeline/timeout"
|
2
|
+
require "simple_pipeline/validation"
|
2
3
|
require "simple_pipeline/version"
|
3
4
|
|
4
5
|
|
@@ -8,12 +9,12 @@ class SimplePipeline
|
|
8
9
|
|
9
10
|
def initialize
|
10
11
|
@pipe_order = []
|
11
|
-
@
|
12
|
+
@pipe_options = {}
|
12
13
|
@errors = []
|
13
14
|
end
|
14
15
|
|
15
|
-
def add (pipe,
|
16
|
-
process_method =
|
16
|
+
def add (pipe, options = {})
|
17
|
+
process_method = options[:process_method] || :process
|
17
18
|
|
18
19
|
begin
|
19
20
|
raise ArgumentError, "invalid pipe - incorrect number of arguments for #{process_method}() method (should be 1)" unless pipe.class.instance_method(process_method).arity == 1
|
@@ -22,7 +23,7 @@ class SimplePipeline
|
|
22
23
|
end
|
23
24
|
|
24
25
|
@pipe_order << pipe
|
25
|
-
@
|
26
|
+
@pipe_options[pipe] = options
|
26
27
|
|
27
28
|
return pipe
|
28
29
|
end
|
@@ -32,8 +33,11 @@ class SimplePipeline
|
|
32
33
|
end
|
33
34
|
|
34
35
|
def process (payload)
|
36
|
+
@errors.clear
|
37
|
+
|
35
38
|
@pipe_order.each do |pipe|
|
36
39
|
begin
|
40
|
+
validate_payload(pipe, payload)
|
37
41
|
invoke_process_with_timeout(pipe, payload, get_timeout(pipe))
|
38
42
|
rescue
|
39
43
|
raise $! unless continue_on_error?($!, pipe)
|
@@ -47,7 +51,7 @@ class SimplePipeline
|
|
47
51
|
private
|
48
52
|
|
49
53
|
def continue_on_error? (e, pipe)
|
50
|
-
config_value = @
|
54
|
+
config_value = @pipe_options[pipe][:continue_on_error?]
|
51
55
|
|
52
56
|
return false if config_value.nil? || config_value == false
|
53
57
|
return true if config_value == true
|
@@ -70,12 +74,16 @@ class SimplePipeline
|
|
70
74
|
end
|
71
75
|
|
72
76
|
def get_process_method (pipe)
|
73
|
-
@
|
77
|
+
@pipe_options[pipe][:process_method] || :process
|
74
78
|
end
|
75
79
|
|
76
80
|
def get_timeout (pipe)
|
77
|
-
timeout = @
|
81
|
+
timeout = @pipe_options[pipe][:timeout]
|
78
82
|
timeout = pipe.timeout if timeout.nil? && (pipe.is_a? SimplePipeline::Timeout)
|
79
83
|
return timeout
|
80
84
|
end
|
85
|
+
|
86
|
+
def validate_payload (pipe, payload)
|
87
|
+
pipe.validate(payload) if (pipe.is_a? SimplePipeline::Validation)
|
88
|
+
end
|
81
89
|
end
|
@@ -38,6 +38,18 @@ class ExceptionPipe
|
|
38
38
|
end
|
39
39
|
end
|
40
40
|
|
41
|
+
class ValidationPipe
|
42
|
+
include SimplePipeline::Validation
|
43
|
+
|
44
|
+
validate ->(payload) { payload[:must_exist] }
|
45
|
+
validate ->(payload) { payload[:must_be_false] == false }
|
46
|
+
validate ->(payload) { payload[:a][:b] == 1 }
|
47
|
+
|
48
|
+
def process (payload)
|
49
|
+
payload[:test_value] *= 10
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
41
53
|
describe SimplePipeline do
|
42
54
|
it "should support three normal pipes" do
|
43
55
|
pipeline = SimplePipeline.new
|
@@ -132,4 +144,26 @@ describe SimplePipeline do
|
|
132
144
|
|
133
145
|
expect(payload[:test_value]).to eq 100
|
134
146
|
end
|
147
|
+
|
148
|
+
it "should support pipes with payload validation" do
|
149
|
+
pipeline = SimplePipeline.new
|
150
|
+
pipeline.add ValidationPipe.new
|
151
|
+
|
152
|
+
payload = {:test_value => 10}
|
153
|
+
|
154
|
+
expect {
|
155
|
+
pipeline.process(payload)
|
156
|
+
}.to raise_error(SimplePipeline::Validation::Error)
|
157
|
+
|
158
|
+
payload = {
|
159
|
+
:test_value => 10,
|
160
|
+
:must_exist => "abc",
|
161
|
+
:must_be_false => false,
|
162
|
+
:a => {:b => 1}
|
163
|
+
}
|
164
|
+
|
165
|
+
pipeline.process(payload)
|
166
|
+
|
167
|
+
expect(payload[:test_value]).to eq 100
|
168
|
+
end
|
135
169
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
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.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jonathan Wong
|
@@ -53,6 +53,7 @@ files:
|
|
53
53
|
- Rakefile
|
54
54
|
- lib/simple_pipeline.rb
|
55
55
|
- lib/simple_pipeline/timeout.rb
|
56
|
+
- lib/simple_pipeline/validation.rb
|
56
57
|
- lib/simple_pipeline/version.rb
|
57
58
|
- simple_pipeline.gemspec
|
58
59
|
- spec/simple_pipeline_spec.rb
|