process_handler 0.1.0 → 0.1.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/.travis.yml +6 -0
- data/README.md +1 -0
- data/lib/salemove/process_handler/pivot_process.rb +27 -4
- data/lib/salemove/process_handler/version.rb +1 -1
- data/spec/process_handler/pivot_process_spec.rb +48 -0
- metadata +4 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3025924d4d9d6aabf01d20bb1fe3517f3d20ef1d
|
4
|
+
data.tar.gz: 55fb26289828ad292043ae2eb2ca1657d59286b4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9907397cf94e2c1e5c92881645bb6efd826bf0ccbcd831f59c5b964ac6f723dbfaf39c4e59d27c8b6f3b42287a737eead053f9924b710983db1c31321f5eb6c0
|
7
|
+
data.tar.gz: 745805dfd41786a6d69b5c1aaa667fa13e99bb1a76676b0abd53905bc5b32848e02b7d6d58b0f626259af24582fa1adaca528f89e77a05b42ce8475c302acce2
|
data/.travis.yml
ADDED
data/README.md
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
# ProcessHandler
|
2
2
|
|
3
|
+
[](https://travis-ci.org/salemove/process_handler)
|
3
4
|
[](https://codeclimate.com/github/salemove/process_handler)
|
4
5
|
|
5
6
|
ProcessHandler helps to spawn and manage services. There are multiple types of processes. Every process knows how to handle `SIGINT` and `SIGTERM` signals.
|
@@ -7,6 +7,8 @@ module Salemove
|
|
7
7
|
module ProcessHandler
|
8
8
|
class PivotProcess
|
9
9
|
|
10
|
+
DEFAULT_FULFILLABLE_TIMEOUT = 3
|
11
|
+
|
10
12
|
attr_reader :process_monitor, :exception_notifier
|
11
13
|
|
12
14
|
def self.logger
|
@@ -57,13 +59,34 @@ module Salemove
|
|
57
59
|
def spawn
|
58
60
|
@messenger.respond_to(@service.class::QUEUE) do |input, handler|
|
59
61
|
response = handle_request(input)
|
60
|
-
|
61
|
-
|
62
|
-
handler.error(response)
|
62
|
+
if response.respond_to?(:fulfilled?)
|
63
|
+
handle_fulfillable_response(handler, response)
|
63
64
|
else
|
64
|
-
handler
|
65
|
+
handle_response(handler, response)
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
def handle_fulfillable_response(handler, response)
|
71
|
+
timeout = response.respond_to?(:timeout) && response.timeout || DEFAULT_FULFILLABLE_TIMEOUT
|
72
|
+
Timeout::timeout(timeout) do
|
73
|
+
while true
|
74
|
+
if response.fulfilled?
|
75
|
+
return handle_response(handler, response.value)
|
76
|
+
end
|
77
|
+
sleep 0.001
|
65
78
|
end
|
66
79
|
end
|
80
|
+
rescue Timeout::Error
|
81
|
+
handle_response(handler, success: false, error: "Fulfillable response was not fulfilled")
|
82
|
+
end
|
83
|
+
|
84
|
+
def handle_response(handler, response)
|
85
|
+
if response.is_a?(Hash) && (response[:success] == false || response[:error])
|
86
|
+
handler.error(response)
|
87
|
+
else
|
88
|
+
handler.success(response)
|
89
|
+
end
|
67
90
|
end
|
68
91
|
|
69
92
|
def handle_request(input)
|
@@ -134,4 +134,52 @@ describe ProcessHandler::PivotProcess do
|
|
134
134
|
|
135
135
|
end
|
136
136
|
|
137
|
+
describe 'when result is fulfillable' do
|
138
|
+
let(:result) { double }
|
139
|
+
|
140
|
+
context 'and its already fulfilled' do
|
141
|
+
let(:value) { { success: true, output: { result: 'R'} } }
|
142
|
+
|
143
|
+
before do
|
144
|
+
allow(result).to receive(:fulfilled?) { true }
|
145
|
+
allow(result).to receive(:value) { value }
|
146
|
+
end
|
147
|
+
|
148
|
+
it 'responds immediately' do
|
149
|
+
expect(handler).to receive(:success).with(value)
|
150
|
+
subject()
|
151
|
+
end
|
152
|
+
end
|
153
|
+
|
154
|
+
context 'and its fulfilled later' do
|
155
|
+
let(:value) { { success: true, output: { result: 'R'} } }
|
156
|
+
|
157
|
+
before do
|
158
|
+
allow(result).to receive(:fulfilled?) { false }
|
159
|
+
Thread.new do
|
160
|
+
sleep 0.005
|
161
|
+
allow(result).to receive(:fulfilled?) { true }
|
162
|
+
allow(result).to receive(:value) { value }
|
163
|
+
end
|
164
|
+
end
|
165
|
+
|
166
|
+
it 'responds when fulfilled' do
|
167
|
+
expect(handler).to receive(:success).with(value)
|
168
|
+
subject()
|
169
|
+
end
|
170
|
+
end
|
171
|
+
|
172
|
+
context 'and its never fulfilled' do
|
173
|
+
before do
|
174
|
+
allow(result).to receive(:fulfilled?) { false }
|
175
|
+
allow(result).to receive(:timeout) { 0.001 }
|
176
|
+
end
|
177
|
+
|
178
|
+
it 'responds with timeout error' do
|
179
|
+
expect(handler).to receive(:error).with(success: false, error: "Fulfillable response was not fulfilled")
|
180
|
+
subject
|
181
|
+
end
|
182
|
+
end
|
183
|
+
end
|
184
|
+
|
137
185
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: process_handler
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Indrek Juhkam
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-05-
|
11
|
+
date: 2015-05-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: airbrake
|
@@ -47,6 +47,7 @@ extra_rdoc_files: []
|
|
47
47
|
files:
|
48
48
|
- ".ruby-gemset"
|
49
49
|
- ".ruby-version"
|
50
|
+
- ".travis.yml"
|
50
51
|
- Gemfile
|
51
52
|
- Gemfile.lock
|
52
53
|
- README.md
|
@@ -87,7 +88,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
87
88
|
version: '0'
|
88
89
|
requirements: []
|
89
90
|
rubyforge_project:
|
90
|
-
rubygems_version: 2.
|
91
|
+
rubygems_version: 2.4.2
|
91
92
|
signing_key:
|
92
93
|
specification_version: 4
|
93
94
|
summary: ''
|