helpstation 0.1.4 → 0.1.5

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: 81341cf8e7e321080c55620575ae4a25cb076ab3
4
- data.tar.gz: ae67dc37c863c5c771bd67caf5b95e857c573477
3
+ metadata.gz: 6bc387017d0c37a12b74f28b96028cbe0517e32e
4
+ data.tar.gz: f4adbd59e1b9b9a6578b56af633f3398562d5692
5
5
  SHA512:
6
- metadata.gz: 804aa898d1b18fc6e9fc78d9e9e481318c44afe73ed7123f141fe5cb72d49d6896d0a108b24e2e3739e263218ef614b4372120c5cbd5ff5e377d87709f2cd734
7
- data.tar.gz: 9879d023e41c03661a79aee77727da624dc77036185bb87d7ef65fa8952ddc2c5831986dd5b0536f4b0e87a7fdbecc523fc199edb207c494aa10b80349370d4a
6
+ metadata.gz: 20eebb79bc3f800b937ff246676e67ca1ca6248bb3a47d27017cbf7b1dea39d2768c815d15d7c1ba236b902f12063e8ba15400d70af696edbbf22ebe34e8804d
7
+ data.tar.gz: 3b17da6034095a4e9b4d7cd5127e401be16ed2392605108e5c85673f5fc9665e97f24ff57991e4cbf12f1fc33400e9e08d2687e46fd2eb0c61b8cbc9242357dc
data/.travis.yml ADDED
@@ -0,0 +1,7 @@
1
+ language: ruby
2
+ rvm:
3
+ - 2.2.3
4
+ before_script:
5
+ - bundle
6
+ script: bundle exec rspec
7
+ sudo: false
data/lib/helpstation.rb CHANGED
@@ -7,7 +7,9 @@ require_relative 'helpstation/action'
7
7
  require_relative 'helpstation/observer'
8
8
  require_relative 'helpstation/renderer'
9
9
  require_relative 'helpstation/legacy_process'
10
+
10
11
  require_relative 'helpstation/fetchers'
12
+ require_relative 'helpstation/processors'
11
13
 
12
14
  module Helpstation
13
15
  def self.build_substation(env)
@@ -29,8 +29,8 @@ module Helpstation
29
29
  attr_reader :env
30
30
  attr_reader :input
31
31
 
32
- def error(data)
33
- @request.error(success: false, error: data)
32
+ def error(error, extra = {})
33
+ @request.error({success: false, error: error}.merge(extra))
34
34
  end
35
35
  end
36
36
  end
@@ -0,0 +1,47 @@
1
+ module Helpstation
2
+ module Processors
3
+ # Helps to run processors in parallel
4
+ #
5
+ # All output from the processors are merged and then returned. This means
6
+ # that if two fetchers return results with the same key then one will
7
+ # overwrite the other.
8
+ #
9
+ # @example
10
+ # process ParallelProcessor[
11
+ # OperatorFetcher,
12
+ # VisitorFetcher
13
+ # ], NOT_FOUND_ERROR
14
+ #
15
+ class ParallelProcessor < Processor
16
+ def self.[](*processors)
17
+ new(processors)
18
+ end
19
+
20
+ def initialize(processors)
21
+ @processors = processors
22
+ end
23
+
24
+ def call(request)
25
+ results = process_parallel(request)
26
+
27
+ if first_failure = results.detect {|result| !result.success?}
28
+ first_failure
29
+ else
30
+ request.success(results.reduce(request.input, &method(:compose)))
31
+ end
32
+ end
33
+
34
+ private
35
+
36
+ def process_parallel(request)
37
+ @processors.map do |processor|
38
+ Thread.new { processor.call(request) }
39
+ end.map(&:join).map(&:value)
40
+ end
41
+
42
+ def compose(input, result)
43
+ input.merge(result.output)
44
+ end
45
+ end
46
+ end
47
+ end
@@ -1,3 +1,3 @@
1
1
  module Helpstation
2
- VERSION = '0.1.4'
2
+ VERSION = '0.1.5'
3
3
  end
@@ -0,0 +1,27 @@
1
+ require 'spec_helper'
2
+
3
+ describe Helpstation::Evaluator do
4
+ subject { target_class.call(request) }
5
+
6
+ let(:request) { Substation::Request.new(:name, {}, {}) }
7
+
8
+ describe '#error' do
9
+ let(:target_class) do
10
+ Class.new(described_class) do
11
+ def call
12
+ error('ERROR', message: 'a message')
13
+ end
14
+ end
15
+ end
16
+
17
+ it 'returns an error response' do
18
+ should be_a(Substation::Response::Failure)
19
+ end
20
+
21
+ it 'returns status' do
22
+ expect(subject.output).to eq(
23
+ success: false, error: 'ERROR', message: 'a message'
24
+ )
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,71 @@
1
+ require 'spec_helper'
2
+
3
+ describe Helpstation::Processors::ParallelProcessor do
4
+ subject { processor.call(request) }
5
+
6
+ let(:processor) { described_class[processor1, processor2] }
7
+
8
+ let(:processor1) do
9
+ Proc.new do |request|
10
+ sleep 0.1
11
+ request.success(request.input.merge(processor1: 'obj'))
12
+ end
13
+ end
14
+
15
+ let(:request) { Substation::Request.new(:name, {}, input) }
16
+ let(:input) { {initial: 'obj'} }
17
+
18
+ context 'when successful' do
19
+ let(:processor2) do
20
+ Proc.new do |request|
21
+ sleep 0.1
22
+ request.success(request.input.merge(processor2: 'obj'))
23
+ end
24
+ end
25
+
26
+ it 'runs in parallel' do
27
+ expect {
28
+ subject
29
+ }.to change(Time, :now).by_at_most(0.12)
30
+ end
31
+
32
+ it 'merges the results' do
33
+ should be_a(Substation::Response::Success)
34
+ expect(subject.output).to eq(
35
+ initial: 'obj',
36
+ processor1: 'obj',
37
+ processor2: 'obj'
38
+ )
39
+ end
40
+ end
41
+
42
+ context 'when one processor fails' do
43
+ let(:processor2) do
44
+ Proc.new do |request|
45
+ sleep 0.1
46
+ request.error(no: 'way')
47
+ end
48
+ end
49
+
50
+ it 'returns the error response' do
51
+ should be_a(Substation::Response::Failure)
52
+ expect(subject.output).to eq(no: 'way')
53
+ end
54
+ end
55
+
56
+ context 'when one process has an exception' do
57
+ let(:processor2) do
58
+ Proc.new do |request|
59
+ sleep 0.1
60
+ this_throws_an_exception
61
+ request.success(processor2: 'obj')
62
+ end
63
+ end
64
+
65
+ it 'throws the exception' do
66
+ expect {
67
+ subject
68
+ }.to raise_error(NameError)
69
+ end
70
+ end
71
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: helpstation
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.4
4
+ version: 0.1.5
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-09-18 00:00:00.000000000 Z
11
+ date: 2015-10-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: substation
@@ -41,6 +41,7 @@ files:
41
41
  - ".rspec"
42
42
  - ".ruby-gemset"
43
43
  - ".ruby-version"
44
+ - ".travis.yml"
44
45
  - Gemfile
45
46
  - LICENSE.txt
46
47
  - README.md
@@ -53,9 +54,12 @@ files:
53
54
  - lib/helpstation/legacy_process.rb
54
55
  - lib/helpstation/observer.rb
55
56
  - lib/helpstation/processor.rb
57
+ - lib/helpstation/processors.rb
56
58
  - lib/helpstation/renderer.rb
57
59
  - lib/helpstation/version.rb
58
- - spec/helpstation/processors/by_key_fetcher_spec.rb
60
+ - spec/helpstation/evaluator_spec.rb
61
+ - spec/helpstation/fetchers/by_key_fetcher_spec.rb
62
+ - spec/helpstation/processors/parallel_processor_spec.rb
59
63
  - spec/spec_helper.rb
60
64
  homepage: ''
61
65
  licenses:
@@ -82,5 +86,7 @@ signing_key:
82
86
  specification_version: 4
83
87
  summary: ''
84
88
  test_files:
85
- - spec/helpstation/processors/by_key_fetcher_spec.rb
89
+ - spec/helpstation/evaluator_spec.rb
90
+ - spec/helpstation/fetchers/by_key_fetcher_spec.rb
91
+ - spec/helpstation/processors/parallel_processor_spec.rb
86
92
  - spec/spec_helper.rb