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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 2530d6f931ed0ff1a7f617c7e04fdbf4be28a4ee
4
- data.tar.gz: fb6d3c7f5e79fb988df866084dfc0ea116ca4c6c
3
+ metadata.gz: 3025924d4d9d6aabf01d20bb1fe3517f3d20ef1d
4
+ data.tar.gz: 55fb26289828ad292043ae2eb2ca1657d59286b4
5
5
  SHA512:
6
- metadata.gz: 1781ed0ee1cf6fa992a64c1a0cb4bf49a4ed002346b8b705df2de9013ce0c8390c16249af2ed4e5da07f01030bc75060760caeaff32d9b8d1657086dd84e2c4a
7
- data.tar.gz: 40e9b2d747eadfe6f423ca37667c802e79a441eecb7bbc7ffe5c06abc6d2dbdeb01cc6bd2e60d6e2333fa5625d6d8536a47a1633e83ce1d0ab512b0151035b3a
6
+ metadata.gz: 9907397cf94e2c1e5c92881645bb6efd826bf0ccbcd831f59c5b964ac6f723dbfaf39c4e59d27c8b6f3b42287a737eead053f9924b710983db1c31321f5eb6c0
7
+ data.tar.gz: 745805dfd41786a6d69b5c1aaa667fa13e99bb1a76676b0abd53905bc5b32848e02b7d6d58b0f626259af24582fa1adaca528f89e77a05b42ce8475c302acce2
data/.travis.yml ADDED
@@ -0,0 +1,6 @@
1
+ language: ruby
2
+ rvm:
3
+ - 2.1.0
4
+ before_script:
5
+ - bundle
6
+ script: bundle exec rspec
data/README.md CHANGED
@@ -1,5 +1,6 @@
1
1
  # ProcessHandler
2
2
 
3
+ [![Build Status](https://travis-ci.org/salemove/process_handler.svg?branch=master)](https://travis-ci.org/salemove/process_handler)
3
4
  [![Code Climate](https://codeclimate.com/github/salemove/process_handler/badges/gpa.svg)](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
- if response.is_a?(Hash) && (response[:success] == false || response[:error])
62
- handler.error(response)
62
+ if response.respond_to?(:fulfilled?)
63
+ handle_fulfillable_response(handler, response)
63
64
  else
64
- handler.success(response)
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)
@@ -1,5 +1,5 @@
1
1
  module Salemove
2
2
  module ProcessHandler
3
- VERSION = '0.1.0'
3
+ VERSION = '0.1.1'
4
4
  end
5
5
  end
@@ -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.0
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-08 00:00:00.000000000 Z
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.2.2
91
+ rubygems_version: 2.4.2
91
92
  signing_key:
92
93
  specification_version: 4
93
94
  summary: ''