smartdown 0.2.1 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -8,15 +8,14 @@ require 'smartdown/api/outcome'
8
8
  module Smartdown
9
9
  module Api
10
10
  class Flow
11
-
12
- def initialize(smartdown_input)
11
+ def initialize(smartdown_input, initial_state = {})
13
12
  @smartdown_flow = Smartdown::Parser::FlowInterpreter.new(smartdown_input).interpret
14
- @engine = Smartdown::Engine.new(@smartdown_flow)
13
+ @engine = Smartdown::Engine.new(@smartdown_flow, initial_state)
15
14
  end
16
15
 
17
16
  def state(started, responses)
18
17
  state = smartdown_state(started, responses)
19
- State.new(transform_node(node_by_name(state.get(:current_node))),
18
+ State.new(transform_node(evaluate_node(node_by_name(state.get(:current_node)), state)),
20
19
  previous_question_nodes_for(state),
21
20
  responses
22
21
  )
@@ -89,6 +88,10 @@ module Smartdown
89
88
  end
90
89
  end
91
90
 
91
+ def evaluate_node(node, state)
92
+ Smartdown::Engine::NodePresenter.new.present(node, state)
93
+ end
94
+
92
95
  def front_matter
93
96
  @front_matter ||= coversheet.front_matter
94
97
  end
@@ -110,7 +113,7 @@ module Smartdown
110
113
  return [] if node_path.empty?
111
114
 
112
115
  node_path[1..-1].map do |node_name|
113
- node_by_name(node_name)
116
+ evaluate_node(node_by_name(node_name), state)
114
117
  end
115
118
  end
116
119
 
@@ -6,11 +6,12 @@ module Smartdown
6
6
  class Engine
7
7
  attr_reader :flow
8
8
 
9
- def initialize(flow)
9
+ def initialize(flow, initial_state = {})
10
10
  @flow = flow
11
+ @initial_state = initial_state
11
12
  end
12
13
 
13
- def default_start_state
14
+ def build_start_state
14
15
  Smartdown::Engine::State.new(
15
16
  default_predicates.merge(
16
17
  current_node: flow.name
@@ -21,11 +22,11 @@ module Smartdown
21
22
  def default_predicates
22
23
  {
23
24
  otherwise: ->(_) { true }
24
- }
25
+ }.merge(@initial_state)
25
26
  end
26
27
 
27
- def process(responses, start_state = nil)
28
- state = start_state || default_start_state
28
+ def process(responses, test_start_state = nil)
29
+ state = test_start_state || build_start_state
29
30
  unprocessed_responses = responses
30
31
  while !unprocessed_responses.empty? do
31
32
  nb_questions = 0
@@ -1,3 +1,3 @@
1
1
  module Smartdown
2
- VERSION = "0.2.1"
2
+ VERSION = "0.3.0"
3
3
  end
data/spec/engine_spec.rb CHANGED
@@ -4,7 +4,7 @@ describe Smartdown::Engine do
4
4
 
5
5
  subject(:engine) { Smartdown::Engine.new(flow) }
6
6
  let(:start_state) {
7
- engine.default_start_state
7
+ engine.build_start_state
8
8
  .put(:eea_passport?, ->(state) {
9
9
  %w{greek british}.include?(state.get(:what_passport_do_you_have?))
10
10
  })
@@ -117,6 +117,20 @@ describe Smartdown::Engine do
117
117
  end
118
118
  }
119
119
 
120
+ describe "initial_state" do
121
+ let(:initial_state) { {
122
+ key_1: 'a_state_object',
123
+ key_2: ->(state) { 'a_dynamic_state_object' }
124
+ } }
125
+ let(:engine) { Smartdown::Engine.new(flow, initial_state) }
126
+ subject(:state) { engine.process([]) }
127
+
128
+ it "should have added initial_state to state" do
129
+ expect(subject.get(:key_1)).to eql 'a_state_object'
130
+ expect(subject.get(:key_2)).to eql 'a_dynamic_state_object'
131
+ end
132
+ end
133
+
120
134
  describe "#process" do
121
135
  subject { engine.process(responses, start_state) }
122
136
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: smartdown
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.1
4
+ version: 0.3.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -13,7 +13,7 @@ date: 2014-07-09 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: parslet
16
- requirement: &13419100 !ruby/object:Gem::Requirement
16
+ requirement: &16437600 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ~>
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: 1.6.1
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *13419100
24
+ version_requirements: *16437600
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: rspec
27
- requirement: &13417020 !ruby/object:Gem::Requirement
27
+ requirement: &16435640 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ~>
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: 3.0.0
33
33
  type: :development
34
34
  prerelease: false
35
- version_requirements: *13417020
35
+ version_requirements: *16435640
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: rake
38
- requirement: &13819280 !ruby/object:Gem::Requirement
38
+ requirement: &16837980 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ! '>='
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: '0'
44
44
  type: :development
45
45
  prerelease: false
46
- version_requirements: *13819280
46
+ version_requirements: *16837980
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: gem_publisher
49
- requirement: &13818580 !ruby/object:Gem::Requirement
49
+ requirement: &16837320 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ! '>='
@@ -54,7 +54,7 @@ dependencies:
54
54
  version: '0'
55
55
  type: :development
56
56
  prerelease: false
57
- version_requirements: *13818580
57
+ version_requirements: *16837320
58
58
  description:
59
59
  email: david.heath@digital.cabinet-office.gov.uk
60
60
  executables:
@@ -182,7 +182,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
182
182
  version: '0'
183
183
  segments:
184
184
  - 0
185
- hash: -352555312520548432
185
+ hash: 306060104431825323
186
186
  required_rubygems_version: !ruby/object:Gem::Requirement
187
187
  none: false
188
188
  requirements:
@@ -191,7 +191,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
191
191
  version: '0'
192
192
  segments:
193
193
  - 0
194
- hash: -352555312520548432
194
+ hash: 306060104431825323
195
195
  requirements: []
196
196
  rubyforge_project:
197
197
  rubygems_version: 1.8.11