ntl-orchestra 0.9.2 → 0.9.3

Sign up to get free protection for your applications and to get access to all the features.
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.2
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: 2014-12-04 00:00:00 Z
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/node.rb
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.2.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, &copy_observers
130
- end
131
-
132
- def input
133
- performance.state
134
- end
135
- end
136
- end
137
- end
@@ -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