linearly 0.1.2 → 0.1.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 +5 -5
- data/lib/linearly/errors/state_not_returned.rb +24 -7
- data/lib/linearly/flow.rb +1 -1
- data/lib/linearly/mixins/step_collection.rb +108 -0
- data/lib/linearly/runner.rb +1 -1
- data/lib/linearly/version.rb +1 -1
- data/lib/linearly.rb +1 -1
- data/spec/errors/state_not_returned_spec.rb +10 -4
- metadata +6 -6
- data/lib/linearly/mixins/reducer.rb +0 -32
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 2528725570ecfd8cced2b0718a9859be207fa15ffd6cb265bdd5976f5eb626e4
|
4
|
+
data.tar.gz: 478800acf301111d2f714ccd236fa9d9cecbb0d9ffc2b09c0dddf093dd382986
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4cab82060fe000080f29ba4a01b90cbf8081af67879bc8119da01f0ea6c16fd42a6677b7490cc3135b5e004517c6521cdbc33c0d9af1fbe024f8c45c6947a97d
|
7
|
+
data.tar.gz: a4e40ef75656a065a48dee68662b141150dacbca4c2e1e950385fa3359bca844cf1b32bc7dac71d83dbd1d8b2493edccb472d0f4b23b62453fbb10249e700e6e
|
@@ -9,20 +9,37 @@ module Linearly
|
|
9
9
|
# @return [Object]
|
10
10
|
# @api public
|
11
11
|
# @example
|
12
|
-
# Linearly::Errors::StateNotReturned
|
12
|
+
# Linearly::Errors::StateNotReturned
|
13
|
+
# .new(output: 'surprise', step: 'step')
|
14
|
+
# .output
|
13
15
|
# => "surprise"
|
14
|
-
attr_reader :
|
16
|
+
attr_reader :output
|
17
|
+
|
18
|
+
# Name of the step that caused the error
|
19
|
+
#
|
20
|
+
# @return String
|
21
|
+
# @api public
|
22
|
+
# @example
|
23
|
+
# Linearly::Errors::StateNotReturned
|
24
|
+
# .new(output: 'surprise', step: 'step')
|
25
|
+
# .step
|
26
|
+
# => "step"
|
27
|
+
attr_reader :step
|
15
28
|
|
16
29
|
# Constructor for the {StateNotReturned} class
|
17
30
|
#
|
18
|
-
# @param
|
31
|
+
# @param output: [Object]
|
32
|
+
# @param step: [String]
|
19
33
|
#
|
20
34
|
# @api public
|
21
35
|
# @example
|
22
|
-
# Linearly::Errors::StateNotReturned
|
23
|
-
|
24
|
-
|
25
|
-
|
36
|
+
# Linearly::Errors::StateNotReturned
|
37
|
+
# .new(output: 'surprise', step: 'step')
|
38
|
+
def initialize(output:, step:)
|
39
|
+
str = output.inspect
|
40
|
+
super("#{str}, returned from #{step}, is not a Statefully::State")
|
41
|
+
@output = output
|
42
|
+
@step = step
|
26
43
|
end
|
27
44
|
end
|
28
45
|
end
|
data/lib/linearly/flow.rb
CHANGED
@@ -0,0 +1,108 @@
|
|
1
|
+
require 'statefully'
|
2
|
+
|
3
|
+
module Linearly
|
4
|
+
module Mixins
|
5
|
+
# {StepCollection} is a mixin to include in all classes which need to run
|
6
|
+
# more than one step.
|
7
|
+
#
|
8
|
+
# @api private
|
9
|
+
module StepCollection
|
10
|
+
# Keep calling steps as long as long as the state is successful
|
11
|
+
#
|
12
|
+
# This method reeks of :reek:TooManyStatements and :reek:FeatureEnvy.
|
13
|
+
#
|
14
|
+
# @param state [Statefully::State]
|
15
|
+
#
|
16
|
+
# @return [Statefully::State]
|
17
|
+
# @api private
|
18
|
+
def call(state)
|
19
|
+
steps.reduce(state, &Reducer.method(:reduce))
|
20
|
+
end
|
21
|
+
|
22
|
+
# {Reducer} encapsulates the logic required to process a single Step in
|
23
|
+
# a larger collection.
|
24
|
+
#
|
25
|
+
# @api private
|
26
|
+
class Reducer
|
27
|
+
# Public interface for the {Reducer}
|
28
|
+
#
|
29
|
+
# @param input [Statefully::State]
|
30
|
+
# @param step [Step]
|
31
|
+
#
|
32
|
+
# @return [Statefully::State]
|
33
|
+
# @api private
|
34
|
+
def self.reduce(input, step)
|
35
|
+
new(input: input, step: step).reduce
|
36
|
+
end
|
37
|
+
|
38
|
+
# Internal Reducer method to create {Step} output
|
39
|
+
#
|
40
|
+
# @return [Statefully::State]
|
41
|
+
# @api private
|
42
|
+
def reduce
|
43
|
+
return input if input.failed? || input.finished?
|
44
|
+
return input.fail(bad_output_error) unless state_returned?
|
45
|
+
output
|
46
|
+
end
|
47
|
+
|
48
|
+
private
|
49
|
+
|
50
|
+
# Return the original {Statefully::State}
|
51
|
+
#
|
52
|
+
# @return [Statefully::State]
|
53
|
+
# @api private
|
54
|
+
attr_reader :input
|
55
|
+
|
56
|
+
# Return the {Step} to run
|
57
|
+
#
|
58
|
+
# @return [Step]
|
59
|
+
# @api private
|
60
|
+
attr_reader :step
|
61
|
+
|
62
|
+
# Private constructor for the {Reducer}
|
63
|
+
#
|
64
|
+
# @param input [Statefully::State]
|
65
|
+
# @param step [Step]
|
66
|
+
#
|
67
|
+
# @api private
|
68
|
+
def initialize(input:, step:)
|
69
|
+
@input = input
|
70
|
+
@step = step
|
71
|
+
end
|
72
|
+
private_class_method :new
|
73
|
+
|
74
|
+
# Construct an {Errors::StateNotReturned} error from internal state
|
75
|
+
#
|
76
|
+
# @return [Errors::StateNotReturned]
|
77
|
+
# @api private
|
78
|
+
def bad_output_error
|
79
|
+
Errors::StateNotReturned.new(
|
80
|
+
output: output,
|
81
|
+
step: step.class.name,
|
82
|
+
)
|
83
|
+
end
|
84
|
+
|
85
|
+
# Create output and memoize for reuse
|
86
|
+
#
|
87
|
+
# @return [Statefully::State]
|
88
|
+
# @api private
|
89
|
+
def output
|
90
|
+
@output ||= begin
|
91
|
+
step.call(input)
|
92
|
+
rescue StandardError => error
|
93
|
+
input.fail(error)
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
# Check if output is an instance of {Statefully::State}
|
98
|
+
#
|
99
|
+
# @return [Boolean]
|
100
|
+
# @api private
|
101
|
+
def state_returned?
|
102
|
+
output.is_a?(Statefully::State)
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|
107
|
+
private_constant :Mixins
|
108
|
+
end
|
data/lib/linearly/runner.rb
CHANGED
@@ -3,7 +3,7 @@ module Linearly
|
|
3
3
|
# validates the inputs, runs the step, and validates the outputs.
|
4
4
|
# @api private
|
5
5
|
class Runner
|
6
|
-
include Mixins::
|
6
|
+
include Mixins::StepCollection
|
7
7
|
|
8
8
|
# Constructor for the {Runner} object
|
9
9
|
# @param step [Step] anything that implements the +Step+ interface
|
data/lib/linearly/version.rb
CHANGED
data/lib/linearly.rb
CHANGED
@@ -3,11 +3,17 @@ require 'spec_helper'
|
|
3
3
|
module Linearly
|
4
4
|
module Errors
|
5
5
|
describe StateNotReturned do
|
6
|
-
let(:
|
7
|
-
let(:
|
6
|
+
let(:output) { 'output' }
|
7
|
+
let(:step) { 'step' }
|
8
|
+
let(:error) { described_class.new(output: output, step: step) }
|
8
9
|
|
9
|
-
it
|
10
|
-
|
10
|
+
it 'reports the right message' do
|
11
|
+
expect(error.message)
|
12
|
+
.to eq '"output", returned from step, is not a Statefully::State'
|
13
|
+
end
|
14
|
+
|
15
|
+
it { expect(error.output).to eq output }
|
16
|
+
it { expect(error.step).to eq step }
|
11
17
|
end
|
12
18
|
end
|
13
19
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: linearly
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Marcin Wyszynski
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2018-01-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: statefully
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 0.1.
|
19
|
+
version: 0.1.8
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: 0.1.
|
26
|
+
version: 0.1.8
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: bundler
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -203,7 +203,7 @@ files:
|
|
203
203
|
- lib/linearly/errors/state_not_returned.rb
|
204
204
|
- lib/linearly/flow.rb
|
205
205
|
- lib/linearly/mixins/flow_builder.rb
|
206
|
-
- lib/linearly/mixins/
|
206
|
+
- lib/linearly/mixins/step_collection.rb
|
207
207
|
- lib/linearly/runner.rb
|
208
208
|
- lib/linearly/step/dynamic.rb
|
209
209
|
- lib/linearly/step/static.rb
|
@@ -243,7 +243,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
243
243
|
version: '0'
|
244
244
|
requirements: []
|
245
245
|
rubyforge_project:
|
246
|
-
rubygems_version: 2.
|
246
|
+
rubygems_version: 2.7.4
|
247
247
|
signing_key:
|
248
248
|
specification_version: 4
|
249
249
|
summary: Linear workflow framework based on immutable state
|
@@ -1,32 +0,0 @@
|
|
1
|
-
require 'statefully'
|
2
|
-
|
3
|
-
module Linearly
|
4
|
-
module Mixins
|
5
|
-
# {Reducer} is a mixin to include in all classes which need to run more than
|
6
|
-
# one step.
|
7
|
-
# @api private
|
8
|
-
module Reducer
|
9
|
-
# Keep calling steps as long as the state is successful
|
10
|
-
#
|
11
|
-
# This method reeks of :reek:TooManyStatements and :reek:FeatureEnvy.
|
12
|
-
#
|
13
|
-
# @param state [Statefully::State]
|
14
|
-
#
|
15
|
-
# @return [Statefully::State]
|
16
|
-
# @api private
|
17
|
-
def call(state)
|
18
|
-
steps.reduce(state) do |current, step|
|
19
|
-
break current if current.failed? || current.finished?
|
20
|
-
begin
|
21
|
-
next_state = step.call(current)
|
22
|
-
rescue StandardError => err
|
23
|
-
break current.fail(err)
|
24
|
-
end
|
25
|
-
next next_state if next_state.is_a?(Statefully::State)
|
26
|
-
current.fail(Errors::StateNotReturned.new(step))
|
27
|
-
end
|
28
|
-
end
|
29
|
-
end
|
30
|
-
end
|
31
|
-
private_constant :Mixins
|
32
|
-
end
|