nxt_pipeline 0.4.0 → 0.4.1
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/.circleci/config.yml +5 -1
- data/.pryrc +6 -0
- data/.ruby-version +1 -1
- data/CHANGELOG.md +3 -1
- data/Gemfile.lock +28 -24
- data/README.md +4 -47
- data/lib/nxt_pipeline.rb +0 -1
- data/lib/nxt_pipeline/constructor.rb +10 -3
- data/lib/nxt_pipeline/error_callback.rb +1 -1
- data/lib/nxt_pipeline/pipeline.rb +13 -3
- data/lib/nxt_pipeline/step.rb +11 -2
- data/lib/nxt_pipeline/version.rb +1 -1
- data/nxt_pipeline.gemspec +3 -3
- metadata +9 -9
- data/lib/nxt_pipeline/dsl.rb +0 -48
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5d27e24e15af26cd6a1e617ee4a5e71a7b3b556af42983625800e7e74e61f0ef
|
4
|
+
data.tar.gz: b2b21c668222af41422878246fc179f6fc25174e23a7873e536df1df2dc64966
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 03d15d8834d22ca23f4567cac7e8e0d01a77818468e40866a964c164c9fb4adbd59d0a5a79c9acfaee434c44f0f0a2590a982173b107fd9f581cf7f68e381a8b
|
7
|
+
data.tar.gz: ed153b7d64fa2c45314cdbb494e5567dc7fda6d8c6f848d3596a979c330a3e4f03e6eaf0f18a77b43b160f0dcfabaf99df18c6f6ba847c797d9830b099f93535
|
data/.circleci/config.yml
CHANGED
@@ -7,7 +7,9 @@ jobs:
|
|
7
7
|
build:
|
8
8
|
docker:
|
9
9
|
# specify the version you desire here
|
10
|
-
- image: circleci/ruby:2.
|
10
|
+
- image: circleci/ruby:2.7.0-node
|
11
|
+
environment:
|
12
|
+
BUNDLER_VERSION: 2.1.4
|
11
13
|
|
12
14
|
working_directory: ~/repo
|
13
15
|
|
@@ -19,6 +21,8 @@ jobs:
|
|
19
21
|
keys:
|
20
22
|
- v1-dependencies-{{ checksum "Gemfile.lock" }}
|
21
23
|
|
24
|
+
- run: gem install bundler --version $BUNDLER_VERSION
|
25
|
+
|
22
26
|
- run:
|
23
27
|
name: install dependencies
|
24
28
|
command: |
|
data/.pryrc
ADDED
data/.ruby-version
CHANGED
@@ -1 +1 @@
|
|
1
|
-
2.
|
1
|
+
2.7.0
|
data/CHANGELOG.md
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,20 +1,21 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
nxt_pipeline (0.4.
|
4
|
+
nxt_pipeline (0.4.1)
|
5
5
|
activesupport
|
6
6
|
|
7
7
|
GEM
|
8
8
|
remote: https://rubygems.org/
|
9
9
|
specs:
|
10
|
-
activesupport (6.0.
|
10
|
+
activesupport (6.0.2.1)
|
11
11
|
concurrent-ruby (~> 1.0, >= 1.0.2)
|
12
12
|
i18n (>= 0.7, < 2)
|
13
13
|
minitest (~> 5.1)
|
14
14
|
tzinfo (~> 1.1)
|
15
|
-
zeitwerk (~> 2.
|
15
|
+
zeitwerk (~> 2.2)
|
16
|
+
byebug (11.1.1)
|
16
17
|
coderay (1.1.2)
|
17
|
-
concurrent-ruby (1.1.
|
18
|
+
concurrent-ruby (1.1.6)
|
18
19
|
diff-lcs (1.3)
|
19
20
|
ffi (1.11.1)
|
20
21
|
formatador (0.2.5)
|
@@ -32,7 +33,7 @@ GEM
|
|
32
33
|
guard (~> 2.1)
|
33
34
|
guard-compat (~> 1.1)
|
34
35
|
rspec (>= 2.99.0, < 4.0)
|
35
|
-
i18n (1.
|
36
|
+
i18n (1.8.2)
|
36
37
|
concurrent-ruby (~> 1.0)
|
37
38
|
listen (3.1.5)
|
38
39
|
rb-fsevent (~> 0.9, >= 0.9.4)
|
@@ -40,7 +41,7 @@ GEM
|
|
40
41
|
ruby_dep (~> 1.2)
|
41
42
|
lumberjack (1.0.13)
|
42
43
|
method_source (0.9.2)
|
43
|
-
minitest (5.
|
44
|
+
minitest (5.14.0)
|
44
45
|
nenv (0.3.0)
|
45
46
|
notiffany (0.1.1)
|
46
47
|
nenv (~> 0.1)
|
@@ -48,44 +49,47 @@ GEM
|
|
48
49
|
pry (0.12.2)
|
49
50
|
coderay (~> 1.1.0)
|
50
51
|
method_source (~> 0.9.0)
|
51
|
-
|
52
|
+
pry-byebug (3.8.0)
|
53
|
+
byebug (~> 11.0)
|
54
|
+
pry (~> 0.10)
|
55
|
+
rake (13.0.1)
|
52
56
|
rb-fsevent (0.10.3)
|
53
57
|
rb-inotify (0.10.0)
|
54
58
|
ffi (~> 1.0)
|
55
|
-
rspec (3.
|
56
|
-
rspec-core (~> 3.
|
57
|
-
rspec-expectations (~> 3.
|
58
|
-
rspec-mocks (~> 3.
|
59
|
-
rspec-core (3.
|
60
|
-
rspec-support (~> 3.
|
61
|
-
rspec-expectations (3.
|
59
|
+
rspec (3.9.0)
|
60
|
+
rspec-core (~> 3.9.0)
|
61
|
+
rspec-expectations (~> 3.9.0)
|
62
|
+
rspec-mocks (~> 3.9.0)
|
63
|
+
rspec-core (3.9.0)
|
64
|
+
rspec-support (~> 3.9.0)
|
65
|
+
rspec-expectations (3.9.0)
|
62
66
|
diff-lcs (>= 1.2.0, < 2.0)
|
63
|
-
rspec-support (~> 3.
|
64
|
-
rspec-mocks (3.
|
67
|
+
rspec-support (~> 3.9.0)
|
68
|
+
rspec-mocks (3.9.0)
|
65
69
|
diff-lcs (>= 1.2.0, < 2.0)
|
66
|
-
rspec-support (~> 3.
|
67
|
-
rspec-support (3.
|
70
|
+
rspec-support (~> 3.9.0)
|
71
|
+
rspec-support (3.9.0)
|
68
72
|
rspec_junit_formatter (0.4.1)
|
69
73
|
rspec-core (>= 2, < 4, != 2.12.0)
|
70
74
|
ruby_dep (1.5.0)
|
71
75
|
shellany (0.0.1)
|
72
76
|
thor (0.20.3)
|
73
77
|
thread_safe (0.3.6)
|
74
|
-
tzinfo (1.2.
|
78
|
+
tzinfo (1.2.6)
|
75
79
|
thread_safe (~> 0.1)
|
76
|
-
zeitwerk (2.
|
80
|
+
zeitwerk (2.3.0)
|
77
81
|
|
78
82
|
PLATFORMS
|
79
83
|
ruby
|
80
84
|
|
81
85
|
DEPENDENCIES
|
82
|
-
bundler (~> 1
|
86
|
+
bundler (~> 2.1)
|
83
87
|
guard-rspec
|
84
88
|
nxt_pipeline!
|
85
|
-
pry
|
86
|
-
rake (~>
|
89
|
+
pry-byebug
|
90
|
+
rake (~> 13.0)
|
87
91
|
rspec (~> 3.0)
|
88
92
|
rspec_junit_formatter
|
89
93
|
|
90
94
|
BUNDLED WITH
|
91
|
-
1.
|
95
|
+
2.1.4
|
data/README.md
CHANGED
@@ -192,55 +192,12 @@ end
|
|
192
192
|
|
193
193
|
Note that the `after_execute` callback will not be called, when an error is raised in one of the steps. See the previous section (_Error callbacks_) for how to define callbacks that run in case of errors.
|
194
194
|
|
195
|
-
###
|
195
|
+
### Step resolvers
|
196
196
|
|
197
|
-
|
198
|
-
|
197
|
+
NxtPipeline is using so called step_resolvers to find the constructor for a given step by the arguments passed in.
|
198
|
+
You can also use this if you are not fine with resolving the constructor from the step argument. Check out the
|
199
|
+
`nxt_pipeline/spec/step_resolver_spec.rb` for examples how you can implement your own step_resolvers.
|
199
200
|
|
200
|
-
```ruby
|
201
|
-
class MyAwesomeClass
|
202
|
-
include NxtPipeline::Dsl
|
203
|
-
|
204
|
-
# register a pipeline with a name and a block
|
205
|
-
pipeline :validation do |p|
|
206
|
-
pipeline.constructor(:validate) do |step, arg:|
|
207
|
-
result = step.validator.call(arg: arg)
|
208
|
-
result && { arg: result }
|
209
|
-
end
|
210
|
-
|
211
|
-
pipeline.step :validate, validator: NameValidator
|
212
|
-
pipeline.step :validate, validator: AdressValidator
|
213
|
-
pipeline.step :validate, validator: BankAccountValidator
|
214
|
-
pipeline.step :validate, validator: PhoneNumberValidator
|
215
|
-
|
216
|
-
p.on_error ValidationError do |step, opts, error|
|
217
|
-
# ...
|
218
|
-
end
|
219
|
-
end
|
220
|
-
|
221
|
-
pipeline :execution do |p|
|
222
|
-
p.step do |_, arg:|
|
223
|
-
{ arg: arg.upcase }
|
224
|
-
end
|
225
|
-
|
226
|
-
p.on_error MyCustomError do |step, opts, error|
|
227
|
-
# nesting pipelines also works
|
228
|
-
pipeline(:error).execute(error)
|
229
|
-
end
|
230
|
-
end
|
231
|
-
|
232
|
-
pipeline :error do |p|
|
233
|
-
p.step do |_, error|
|
234
|
-
error # do something here
|
235
|
-
end
|
236
|
-
end
|
237
|
-
|
238
|
-
def call(arg)
|
239
|
-
# execute a pipeline simply by fetching it and calling execute on it as you would normally
|
240
|
-
pipeline(:execution).execute(arg: arg)
|
241
|
-
end
|
242
|
-
end
|
243
|
-
```
|
244
201
|
|
245
202
|
## Topics
|
246
203
|
- Step orchestration (chainable steps)
|
data/lib/nxt_pipeline.rb
CHANGED
@@ -1,13 +1,20 @@
|
|
1
1
|
module NxtPipeline
|
2
2
|
class Constructor
|
3
|
-
def initialize(name, opts, block)
|
3
|
+
def initialize(name, **opts, &block)
|
4
4
|
@name = name
|
5
5
|
@block = block
|
6
6
|
@opts = opts
|
7
7
|
end
|
8
8
|
|
9
9
|
attr_reader :opts, :block
|
10
|
-
|
11
|
-
delegate :
|
10
|
+
|
11
|
+
delegate :arity, to: :block
|
12
|
+
|
13
|
+
def call(*args, **opts, &block)
|
14
|
+
# ActiveSupport's #delegate does not properly handle keyword arg passing
|
15
|
+
# in the latest released version. Thefore we bypass delegation by reimplementing
|
16
|
+
# the method ourselves. This is already fixed in Rails master though.
|
17
|
+
self.block.call(*args, **opts, &block)
|
18
|
+
end
|
12
19
|
end
|
13
20
|
end
|
@@ -25,7 +25,7 @@ module NxtPipeline
|
|
25
25
|
name = name.to_sym
|
26
26
|
raise StandardError, "Already registered step :#{name}" if constructors[name]
|
27
27
|
|
28
|
-
constructors[name] = Constructor.new(name, opts, constructor)
|
28
|
+
constructors[name] = Constructor.new(name, **opts, &constructor)
|
29
29
|
|
30
30
|
return unless opts.fetch(:default, false)
|
31
31
|
set_default_constructor(name)
|
@@ -50,7 +50,7 @@ module NxtPipeline
|
|
50
50
|
# fall back to :inline if no type is given
|
51
51
|
argument ||= :inline
|
52
52
|
opts.reverse_merge!(to_s: argument)
|
53
|
-
Constructor.new(:inline, opts, block)
|
53
|
+
Constructor.new(:inline, **opts, &block)
|
54
54
|
else
|
55
55
|
constructor = step_resolvers.lazy.map do |resolver|
|
56
56
|
resolver.call(argument)
|
@@ -78,6 +78,16 @@ module NxtPipeline
|
|
78
78
|
result = steps.inject(changeset) do |changeset, step|
|
79
79
|
execute_step(step, **changeset)
|
80
80
|
rescue StandardError => error
|
81
|
+
logger_for_error = logger
|
82
|
+
|
83
|
+
error.define_singleton_method :details do
|
84
|
+
OpenStruct.new(
|
85
|
+
changeset: changeset,
|
86
|
+
logger: logger_for_error,
|
87
|
+
step: step
|
88
|
+
)
|
89
|
+
end
|
90
|
+
|
81
91
|
callback = find_error_callback(error)
|
82
92
|
raise unless callback && callback.continue_after_error?
|
83
93
|
handle_step_error(error)
|
@@ -100,7 +110,7 @@ module NxtPipeline
|
|
100
110
|
end
|
101
111
|
|
102
112
|
def on_errors(*errors, halt_on_error: true, &callback)
|
103
|
-
error_callbacks << ErrorCallback.new(errors, halt_on_error, callback)
|
113
|
+
error_callbacks << ErrorCallback.new(errors, halt_on_error, &callback)
|
104
114
|
end
|
105
115
|
|
106
116
|
alias :on_error :on_errors
|
data/lib/nxt_pipeline/step.rb
CHANGED
@@ -32,10 +32,11 @@ module NxtPipeline
|
|
32
32
|
if_guard_args = guard_args.take(if_guard.arity)
|
33
33
|
unless_guard_guard_args = guard_args.take(unless_guard.arity)
|
34
34
|
|
35
|
-
if !unless_guard
|
35
|
+
if !instrumentalize_callable(unless_guard, unless_guard_guard_args) && instrumentalize_callable(if_guard, if_guard_args)
|
36
36
|
constructor_args = [self, changeset]
|
37
37
|
constructor_args = constructor_args.take(constructor.arity)
|
38
|
-
|
38
|
+
|
39
|
+
self.result = instrumentalize_callable(constructor, constructor_args)
|
39
40
|
end
|
40
41
|
|
41
42
|
set_status
|
@@ -54,6 +55,14 @@ module NxtPipeline
|
|
54
55
|
|
55
56
|
attr_writer :result, :status, :error, :mapped_options
|
56
57
|
attr_reader :constructor, :options_mapper
|
58
|
+
|
59
|
+
def instrumentalize_callable(callable, args)
|
60
|
+
if args.last.is_a?(Hash)
|
61
|
+
callable.call(*args.take(args.length - 1), **args.last)
|
62
|
+
else
|
63
|
+
callable.call(*args)
|
64
|
+
end
|
65
|
+
end
|
57
66
|
|
58
67
|
def if_guard
|
59
68
|
opts.fetch(:if) { guard(true) }
|
data/lib/nxt_pipeline/version.rb
CHANGED
data/nxt_pipeline.gemspec
CHANGED
@@ -35,9 +35,9 @@ Gem::Specification.new do |spec|
|
|
35
35
|
spec.require_paths = ["lib"]
|
36
36
|
|
37
37
|
spec.add_dependency "activesupport"
|
38
|
-
spec.add_development_dependency "bundler", "~> 1
|
38
|
+
spec.add_development_dependency "bundler", "~> 2.1"
|
39
39
|
spec.add_development_dependency "guard-rspec"
|
40
|
-
spec.add_development_dependency "rake", "~>
|
40
|
+
spec.add_development_dependency "rake", "~> 13.0"
|
41
41
|
spec.add_development_dependency "rspec", "~> 3.0"
|
42
|
-
spec.add_development_dependency "pry"
|
42
|
+
spec.add_development_dependency "pry-byebug"
|
43
43
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: nxt_pipeline
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.
|
4
|
+
version: 0.4.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Nils Sommer
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: exe
|
12
12
|
cert_chain: []
|
13
|
-
date:
|
13
|
+
date: 2020-03-13 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: activesupport
|
@@ -32,14 +32,14 @@ dependencies:
|
|
32
32
|
requirements:
|
33
33
|
- - "~>"
|
34
34
|
- !ruby/object:Gem::Version
|
35
|
-
version: '1
|
35
|
+
version: '2.1'
|
36
36
|
type: :development
|
37
37
|
prerelease: false
|
38
38
|
version_requirements: !ruby/object:Gem::Requirement
|
39
39
|
requirements:
|
40
40
|
- - "~>"
|
41
41
|
- !ruby/object:Gem::Version
|
42
|
-
version: '1
|
42
|
+
version: '2.1'
|
43
43
|
- !ruby/object:Gem::Dependency
|
44
44
|
name: guard-rspec
|
45
45
|
requirement: !ruby/object:Gem::Requirement
|
@@ -60,14 +60,14 @@ dependencies:
|
|
60
60
|
requirements:
|
61
61
|
- - "~>"
|
62
62
|
- !ruby/object:Gem::Version
|
63
|
-
version: '
|
63
|
+
version: '13.0'
|
64
64
|
type: :development
|
65
65
|
prerelease: false
|
66
66
|
version_requirements: !ruby/object:Gem::Requirement
|
67
67
|
requirements:
|
68
68
|
- - "~>"
|
69
69
|
- !ruby/object:Gem::Version
|
70
|
-
version: '
|
70
|
+
version: '13.0'
|
71
71
|
- !ruby/object:Gem::Dependency
|
72
72
|
name: rspec
|
73
73
|
requirement: !ruby/object:Gem::Requirement
|
@@ -83,7 +83,7 @@ dependencies:
|
|
83
83
|
- !ruby/object:Gem::Version
|
84
84
|
version: '3.0'
|
85
85
|
- !ruby/object:Gem::Dependency
|
86
|
-
name: pry
|
86
|
+
name: pry-byebug
|
87
87
|
requirement: !ruby/object:Gem::Requirement
|
88
88
|
requirements:
|
89
89
|
- - ">="
|
@@ -105,6 +105,7 @@ extra_rdoc_files: []
|
|
105
105
|
files:
|
106
106
|
- ".circleci/config.yml"
|
107
107
|
- ".gitignore"
|
108
|
+
- ".pryrc"
|
108
109
|
- ".rspec"
|
109
110
|
- ".ruby-version"
|
110
111
|
- ".travis.yml"
|
@@ -121,7 +122,6 @@ files:
|
|
121
122
|
- bin/setup
|
122
123
|
- lib/nxt_pipeline.rb
|
123
124
|
- lib/nxt_pipeline/constructor.rb
|
124
|
-
- lib/nxt_pipeline/dsl.rb
|
125
125
|
- lib/nxt_pipeline/error_callback.rb
|
126
126
|
- lib/nxt_pipeline/logger.rb
|
127
127
|
- lib/nxt_pipeline/pipeline.rb
|
@@ -150,7 +150,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
150
150
|
- !ruby/object:Gem::Version
|
151
151
|
version: '0'
|
152
152
|
requirements: []
|
153
|
-
rubygems_version: 3.
|
153
|
+
rubygems_version: 3.1.2
|
154
154
|
signing_key:
|
155
155
|
specification_version: 4
|
156
156
|
summary: DSL to build Pipeline with mountable Segments to process things.
|
data/lib/nxt_pipeline/dsl.rb
DELETED
@@ -1,48 +0,0 @@
|
|
1
|
-
module NxtPipeline
|
2
|
-
module Dsl
|
3
|
-
module ClassMethods
|
4
|
-
def pipeline(name = :default, parent = NxtPipeline::Pipeline, &block)
|
5
|
-
name = name.to_sym
|
6
|
-
raise ArgumentError, "No block given!" unless block_given?
|
7
|
-
raise_already_registered_error(name) if pipeline_registry.key?(name)
|
8
|
-
register_pipeline(name, block, parent)
|
9
|
-
end
|
10
|
-
|
11
|
-
def pipeline!(name, parent = NxtPipeline::Pipeline, &block)
|
12
|
-
raise ArgumentError, "No block given!" unless block_given?
|
13
|
-
register_pipeline(name, block, parent)
|
14
|
-
end
|
15
|
-
|
16
|
-
private
|
17
|
-
|
18
|
-
def inherited(child)
|
19
|
-
child.instance_variable_set(:@pipeline_registry, pipeline_registry.deep_dup)
|
20
|
-
end
|
21
|
-
|
22
|
-
def raise_already_registered_error(name)
|
23
|
-
raise KeyError, "Already registered a pipeline #{name}. Call pipeline! to overwrite already registered pipelines"
|
24
|
-
end
|
25
|
-
|
26
|
-
def pipeline_registry
|
27
|
-
@pipeline_registry ||= ActiveSupport::HashWithIndifferentAccess.new
|
28
|
-
end
|
29
|
-
|
30
|
-
def register_pipeline(name, block, parent)
|
31
|
-
pipeline_registry[name] = { config: block, parent: parent }
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
35
|
-
def self.included(base)
|
36
|
-
base.extend(ClassMethods)
|
37
|
-
|
38
|
-
def pipeline(name = :default)
|
39
|
-
registry = self.class.send(:pipeline_registry)
|
40
|
-
entry = registry.fetch(name) { raise KeyError, "No pipeline #{name} registered"}
|
41
|
-
config = entry.fetch(:config)
|
42
|
-
pipeline = entry.fetch(:parent).new
|
43
|
-
instance_exec(pipeline, &config)
|
44
|
-
pipeline
|
45
|
-
end
|
46
|
-
end
|
47
|
-
end
|
48
|
-
end
|