ntl-orchestra 0.9.2 → 0.9.3
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 +3 -0
- data/Gemfile +1 -1
- data/README.md +91 -90
- data/lib/orchestra/conductor.rb +6 -6
- data/lib/orchestra/dsl/object_adapter.rb +16 -16
- data/lib/orchestra/dsl/operations.rb +35 -35
- data/lib/orchestra/dsl/{nodes.rb → steps.rb} +7 -9
- data/lib/orchestra/execution.rb +158 -0
- data/lib/orchestra/operation.rb +16 -16
- data/lib/orchestra/recording/playback.rb +47 -0
- data/lib/orchestra/recording.rb +5 -45
- data/lib/orchestra/run_list.rb +49 -49
- data/lib/orchestra/{node → step}/output.rb +8 -8
- data/lib/orchestra/{node.rb → step.rb} +22 -25
- data/lib/orchestra/thread_pool.rb +3 -3
- data/lib/orchestra/version.rb +1 -1
- data/lib/orchestra.rb +2 -2
- data/test/examples/fizz_buzz.rb +5 -5
- data/test/examples/invitation_service.rb +9 -9
- data/test/integration/multithreading_test.rb +5 -5
- data/test/integration/recording_telemetry_test.rb +3 -6
- data/test/integration/replayable_operation_test.rb +4 -4
- data/test/lib/console.rb +1 -1
- data/test/support/telemetry_recorder.rb +7 -7
- data/test/unit/dsl_test.rb +26 -26
- data/test/unit/object_adapter_test.rb +14 -14
- data/test/unit/operation_test.rb +45 -45
- data/test/unit/run_list_test.rb +12 -12
- data/test/unit/step_test.rb +122 -0
- data/test/unit/thread_pool_test.rb +2 -2
- metadata +15 -13
- data/lib/orchestra/performance.rb +0 -137
- data/test/unit/node_test.rb +0 -122
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ntl-orchestra
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.9.
|
4
|
+
version: 0.9.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- ntl
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date:
|
12
|
+
date: 2015-01-08 00:00:00 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
requirement: &id001 !ruby/object:Gem::Requirement
|
@@ -18,8 +18,8 @@ dependencies:
|
|
18
18
|
- ">="
|
19
19
|
- !ruby/object:Gem::Version
|
20
20
|
version: "0"
|
21
|
-
prerelease: false
|
22
21
|
name: invokr
|
22
|
+
prerelease: false
|
23
23
|
version_requirements: *id001
|
24
24
|
type: :runtime
|
25
25
|
- !ruby/object:Gem::Dependency
|
@@ -28,16 +28,16 @@ dependencies:
|
|
28
28
|
- - ~>
|
29
29
|
- !ruby/object:Gem::Version
|
30
30
|
version: "1.6"
|
31
|
-
prerelease: false
|
32
31
|
name: bundler
|
32
|
+
prerelease: false
|
33
33
|
version_requirements: *id002
|
34
34
|
type: :development
|
35
35
|
- !ruby/object:Gem::Dependency
|
36
36
|
requirement: &id004 !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- *id003
|
39
|
-
prerelease: false
|
40
39
|
name: pry
|
40
|
+
prerelease: false
|
41
41
|
version_requirements: *id004
|
42
42
|
type: :development
|
43
43
|
- !ruby/object:Gem::Dependency
|
@@ -46,8 +46,8 @@ dependencies:
|
|
46
46
|
- - ~>
|
47
47
|
- !ruby/object:Gem::Version
|
48
48
|
version: "10.0"
|
49
|
-
prerelease: false
|
50
49
|
name: rake
|
50
|
+
prerelease: false
|
51
51
|
version_requirements: *id005
|
52
52
|
type: :development
|
53
53
|
description: Orchestra is an orchestration framework for designing complex operations in an object oriented fashion.
|
@@ -61,6 +61,7 @@ extra_rdoc_files: []
|
|
61
61
|
|
62
62
|
files:
|
63
63
|
- .gitignore
|
64
|
+
- .travis.yml
|
64
65
|
- Gemfile
|
65
66
|
- LICENSE.txt
|
66
67
|
- README.md
|
@@ -70,16 +71,17 @@ files:
|
|
70
71
|
- lib/orchestra.rb
|
71
72
|
- lib/orchestra/conductor.rb
|
72
73
|
- lib/orchestra/configuration.rb
|
73
|
-
- lib/orchestra/dsl/nodes.rb
|
74
74
|
- lib/orchestra/dsl/object_adapter.rb
|
75
75
|
- lib/orchestra/dsl/operations.rb
|
76
|
+
- lib/orchestra/dsl/steps.rb
|
76
77
|
- lib/orchestra/errors.rb
|
77
|
-
- lib/orchestra/
|
78
|
-
- lib/orchestra/node/output.rb
|
78
|
+
- lib/orchestra/execution.rb
|
79
79
|
- lib/orchestra/operation.rb
|
80
|
-
- lib/orchestra/performance.rb
|
81
80
|
- lib/orchestra/recording.rb
|
81
|
+
- lib/orchestra/recording/playback.rb
|
82
82
|
- lib/orchestra/run_list.rb
|
83
|
+
- lib/orchestra/step.rb
|
84
|
+
- lib/orchestra/step/output.rb
|
83
85
|
- lib/orchestra/thread_pool.rb
|
84
86
|
- lib/orchestra/util.rb
|
85
87
|
- lib/orchestra/version.rb
|
@@ -95,10 +97,10 @@ files:
|
|
95
97
|
- test/test_helper.rb
|
96
98
|
- test/unit/conductor_test.rb
|
97
99
|
- test/unit/dsl_test.rb
|
98
|
-
- test/unit/node_test.rb
|
99
100
|
- test/unit/object_adapter_test.rb
|
100
101
|
- test/unit/operation_test.rb
|
101
102
|
- test/unit/run_list_test.rb
|
103
|
+
- test/unit/step_test.rb
|
102
104
|
- test/unit/thread_pool_test.rb
|
103
105
|
- test/unit/util_test.rb
|
104
106
|
- tmp/.keep
|
@@ -121,7 +123,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
121
123
|
requirements: []
|
122
124
|
|
123
125
|
rubyforge_project:
|
124
|
-
rubygems_version: 2.
|
126
|
+
rubygems_version: 2.4.2
|
125
127
|
signing_key:
|
126
128
|
specification_version: 4
|
127
129
|
summary: Orchestrate complex operations with ease.
|
@@ -137,9 +139,9 @@ test_files:
|
|
137
139
|
- test/test_helper.rb
|
138
140
|
- test/unit/conductor_test.rb
|
139
141
|
- test/unit/dsl_test.rb
|
140
|
-
- test/unit/node_test.rb
|
141
142
|
- test/unit/object_adapter_test.rb
|
142
143
|
- test/unit/operation_test.rb
|
143
144
|
- test/unit/run_list_test.rb
|
145
|
+
- test/unit/step_test.rb
|
144
146
|
- test/unit/thread_pool_test.rb
|
145
147
|
- test/unit/util_test.rb
|
@@ -1,137 +0,0 @@
|
|
1
|
-
module Orchestra
|
2
|
-
class Performance
|
3
|
-
include Observable
|
4
|
-
extend Forwardable
|
5
|
-
|
6
|
-
def_delegators :@run_list, :node_names, :provisions, :dependencies,
|
7
|
-
:optional_dependencies, :required_dependencies
|
8
|
-
|
9
|
-
attr :conductor, :input, :state, :registry, :run_list
|
10
|
-
|
11
|
-
def initialize conductor, run_list, input
|
12
|
-
@conductor = conductor
|
13
|
-
@input = input.dup
|
14
|
-
@run_list = run_list
|
15
|
-
@registry = conductor.build_registry self
|
16
|
-
@state = registry.merge input
|
17
|
-
end
|
18
|
-
|
19
|
-
def perform
|
20
|
-
ensure_inputs_are_present!
|
21
|
-
run_list.each do |name, node| process name, node end
|
22
|
-
rescue => error
|
23
|
-
publish :error_raised, error
|
24
|
-
raise error
|
25
|
-
end
|
26
|
-
|
27
|
-
def process name, node
|
28
|
-
input = input_for node
|
29
|
-
publish :node_entered, name, input
|
30
|
-
output = perform_node node
|
31
|
-
publish :node_exited, name, output
|
32
|
-
state.merge! output
|
33
|
-
end
|
34
|
-
|
35
|
-
def perform_node node
|
36
|
-
Movement.perform node, self
|
37
|
-
end
|
38
|
-
|
39
|
-
def ensure_inputs_are_present!
|
40
|
-
has_dep = state.method :[]
|
41
|
-
missing_input = required_dependencies.reject &has_dep
|
42
|
-
raise MissingInputError.new missing_input unless missing_input.empty?
|
43
|
-
end
|
44
|
-
|
45
|
-
def input_for node
|
46
|
-
state.reject do |key, val|
|
47
|
-
registry[key] == val or not node.dependencies.include? key
|
48
|
-
end
|
49
|
-
end
|
50
|
-
|
51
|
-
def extract_result result
|
52
|
-
state.fetch result
|
53
|
-
end
|
54
|
-
|
55
|
-
def publish event, *payload
|
56
|
-
changed
|
57
|
-
notify_observers event, *payload
|
58
|
-
end
|
59
|
-
|
60
|
-
def thread_pool
|
61
|
-
conductor.thread_pool
|
62
|
-
end
|
63
|
-
|
64
|
-
class Movement
|
65
|
-
def self.perform node, *args
|
66
|
-
if node.is_a? Operation
|
67
|
-
klass = EmbeddedOperation
|
68
|
-
else
|
69
|
-
klass = node.collection ? CollectionMovement : self
|
70
|
-
end
|
71
|
-
instance = klass.new node, *args
|
72
|
-
node.process instance.perform
|
73
|
-
end
|
74
|
-
|
75
|
-
attr :context, :node, :performance
|
76
|
-
|
77
|
-
def initialize node, performance
|
78
|
-
@node = node
|
79
|
-
@performance = performance
|
80
|
-
@context = build_context performance
|
81
|
-
end
|
82
|
-
|
83
|
-
def perform
|
84
|
-
context.perform
|
85
|
-
end
|
86
|
-
|
87
|
-
def build_context performance
|
88
|
-
node.build_context performance.state
|
89
|
-
end
|
90
|
-
end
|
91
|
-
|
92
|
-
class CollectionMovement < Movement
|
93
|
-
def perform
|
94
|
-
batch, output = prepare_collection
|
95
|
-
jobs = enqueue_jobs batch do |result, index| output[index] = result end
|
96
|
-
jobs.each &:wait
|
97
|
-
output
|
98
|
-
end
|
99
|
-
|
100
|
-
def enqueue_jobs batch, &block
|
101
|
-
batch.map.with_index do |element, index|
|
102
|
-
enqueue_job element, index, &block
|
103
|
-
end
|
104
|
-
end
|
105
|
-
|
106
|
-
def enqueue_job element, index
|
107
|
-
performance.thread_pool.enqueue do
|
108
|
-
result = context.perform element
|
109
|
-
yield [result, index]
|
110
|
-
end
|
111
|
-
end
|
112
|
-
|
113
|
-
def prepare_collection
|
114
|
-
batch = context.fetch_collection
|
115
|
-
output = [nil] * batch.size
|
116
|
-
[batch, output]
|
117
|
-
end
|
118
|
-
end
|
119
|
-
|
120
|
-
class EmbeddedOperation < Movement
|
121
|
-
def perform
|
122
|
-
super
|
123
|
-
context.state.select do |k,_| k == node.result end
|
124
|
-
end
|
125
|
-
|
126
|
-
def build_context performance
|
127
|
-
conductor = performance.registry[:conductor]
|
128
|
-
copy_observers = conductor.method :copy_observers
|
129
|
-
node.start_performance conductor, input, ©_observers
|
130
|
-
end
|
131
|
-
|
132
|
-
def input
|
133
|
-
performance.state
|
134
|
-
end
|
135
|
-
end
|
136
|
-
end
|
137
|
-
end
|
data/test/unit/node_test.rb
DELETED
@@ -1,122 +0,0 @@
|
|
1
|
-
class NodeTest < Minitest::Test
|
2
|
-
def test_performing_a_node
|
3
|
-
node = build_simple_node
|
4
|
-
|
5
|
-
assert_equal(
|
6
|
-
{ :bar => 4 },
|
7
|
-
node.perform(:foo => 2, :bar => 2),
|
8
|
-
)
|
9
|
-
end
|
10
|
-
|
11
|
-
def test_providing_a_single_hash
|
12
|
-
node = Orchestra::Node::InlineNode.new(
|
13
|
-
:dependencies => [:foo],
|
14
|
-
:provides => [:bar],
|
15
|
-
:perform_block => lambda { { :bar => (foo * 2) } },
|
16
|
-
)
|
17
|
-
|
18
|
-
assert_equal(
|
19
|
-
{ :bar => 4 },
|
20
|
-
node.perform(:foo => 2),
|
21
|
-
)
|
22
|
-
end
|
23
|
-
|
24
|
-
def test_providing_a_single_hash_that_is_not_the_output
|
25
|
-
node = Orchestra::Node::InlineNode.new(
|
26
|
-
:dependencies => [:foo],
|
27
|
-
:provides => [:bar],
|
28
|
-
:perform_block => lambda { { :baz => (foo * 2) } },
|
29
|
-
)
|
30
|
-
|
31
|
-
assert_equal(
|
32
|
-
{ :bar => { :baz => 4 } },
|
33
|
-
node.perform(:foo => 2),
|
34
|
-
)
|
35
|
-
end
|
36
|
-
|
37
|
-
def test_performing_a_collection_node
|
38
|
-
node = Orchestra::Node::InlineNode.new(
|
39
|
-
:dependencies => [:foo],
|
40
|
-
:provides => [:bar],
|
41
|
-
:perform_block => lambda { |e| e * 2 },
|
42
|
-
:collection => :foo,
|
43
|
-
)
|
44
|
-
|
45
|
-
assert_equal(
|
46
|
-
{ :bar => [2, 4, 6, 8] },
|
47
|
-
node.perform(:foo => [1, 2, 3, 4]),
|
48
|
-
)
|
49
|
-
end
|
50
|
-
|
51
|
-
def test_defaulting
|
52
|
-
node = build_simple_node
|
53
|
-
|
54
|
-
assert_equal(
|
55
|
-
{ :bar => 8 },
|
56
|
-
node.perform(:foo => 2),
|
57
|
-
)
|
58
|
-
end
|
59
|
-
|
60
|
-
def test_introspecting_dependencies
|
61
|
-
node = build_simple_node
|
62
|
-
|
63
|
-
assert_equal [:foo, :bar], node.dependencies
|
64
|
-
end
|
65
|
-
|
66
|
-
def test_introspecting_mandatory_dependencies
|
67
|
-
node = build_simple_node
|
68
|
-
|
69
|
-
assert_equal [:foo], node.required_dependencies
|
70
|
-
end
|
71
|
-
|
72
|
-
def test_node_fails_to_supply_provisions
|
73
|
-
node = Orchestra::Node::InlineNode.new(
|
74
|
-
:provides => [:foo, :bar, :baz],
|
75
|
-
:perform_block => lambda { nil },
|
76
|
-
)
|
77
|
-
|
78
|
-
error = assert_raises Orchestra::MissingProvisionError do node.perform end
|
79
|
-
|
80
|
-
assert_equal(
|
81
|
-
"failed to supply output: :foo, :bar and :baz",
|
82
|
-
error.message,
|
83
|
-
)
|
84
|
-
end
|
85
|
-
|
86
|
-
def test_cannot_return_nil
|
87
|
-
node = Orchestra::Node::InlineNode.new(
|
88
|
-
:provides => [:foo],
|
89
|
-
:perform_block => lambda do nil end
|
90
|
-
)
|
91
|
-
|
92
|
-
error = assert_raises Orchestra::MissingProvisionError do node.perform end
|
93
|
-
|
94
|
-
assert_equal(
|
95
|
-
"failed to supply output: :foo",
|
96
|
-
error.message,
|
97
|
-
)
|
98
|
-
end
|
99
|
-
|
100
|
-
def test_node_provides_extra_provisions
|
101
|
-
node = Orchestra::Node::InlineNode.new(
|
102
|
-
:provides => [:foo],
|
103
|
-
:perform_block => lambda do { :foo => :bar, :baz => :qux } end,
|
104
|
-
)
|
105
|
-
|
106
|
-
assert_equal(
|
107
|
-
{ :foo => :bar },
|
108
|
-
node.perform,
|
109
|
-
)
|
110
|
-
end
|
111
|
-
|
112
|
-
private
|
113
|
-
|
114
|
-
def build_simple_node
|
115
|
-
Orchestra::Node::InlineNode.new(
|
116
|
-
:defaults => { :bar => lambda { 4 } },
|
117
|
-
:dependencies => [:foo, :bar],
|
118
|
-
:provides => [:bar],
|
119
|
-
:perform_block => lambda { foo * bar },
|
120
|
-
)
|
121
|
-
end
|
122
|
-
end
|