smartdown 0.8.2 → 0.9.0

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.
data/README.md CHANGED
@@ -106,6 +106,19 @@ to your outbound flight.
106
106
  * no: No
107
107
  ```
108
108
 
109
+ ### 'Country' question
110
+
111
+ A 'country' question allows the user to select a country from a drop-down list.
112
+
113
+ ```markdown
114
+ ## Where do you want to get married?
115
+
116
+ [country: marriage_country, countries: all_countries]
117
+ ```
118
+
119
+ Where `all_countries` is the name of a data-plugin method that will return a hash of
120
+ country slugs/names.
121
+
109
122
  ### Date
110
123
 
111
124
  ```markdown
@@ -0,0 +1,21 @@
1
+ require 'smartdown/api/question'
2
+ require 'smartdown/model/element/question/country'
3
+
4
+ module Smartdown
5
+ module Api
6
+ class CountryQuestion < Question
7
+ def options
8
+ question = elements.find{|element| element.is_a? Smartdown::Model::Element::Question::Country}
9
+ question.countries.map do |choice|
10
+ OpenStruct.new(:label => choice[1], :value => choice[0])
11
+ end
12
+ end
13
+
14
+ def name
15
+ question = elements.find{|element| element.is_a? Smartdown::Model::Element::Question::Country}
16
+ question.name
17
+ end
18
+
19
+ end
20
+ end
21
+ end
@@ -12,8 +12,11 @@ module Smartdown
12
12
 
13
13
  attr_reader :scenario_sets
14
14
 
15
- def initialize(smartdown_input, initial_state = {})
16
- @smartdown_flow = Smartdown::Parser::FlowInterpreter.new(smartdown_input).interpret
15
+ def initialize(smartdown_input, options = {})
16
+ initial_state = options.fetch(:initial_state, {})
17
+ data_module = options.fetch(:data_module, nil)
18
+
19
+ @smartdown_flow = Smartdown::Parser::FlowInterpreter.new(smartdown_input, data_module).interpret
17
20
  @engine = Smartdown::Engine.new(@smartdown_flow, initial_state)
18
21
  @scenario_sets = Smartdown::Parser::ScenarioSetsInterpreter.new(smartdown_input).interpret
19
22
  end
@@ -10,6 +10,8 @@ module Smartdown
10
10
  def initialize(elements, response)
11
11
  if element = elements.find{|element| element.is_a? Smartdown::Model::Element::Question::MultipleChoice}
12
12
  @question = MultipleChoice.new(elements)
13
+ elsif element = elements.find{|element| element.is_a? Smartdown::Model::Element::Question::Country}
14
+ @question = CountryQuestion.new(elements)
13
15
  elsif element = elements.find{|element| element.is_a? Smartdown::Model::Element::Question::Date}
14
16
  @question = DateQuestion.new(elements)
15
17
  elsif element = elements.find{|element| element.is_a? Smartdown::Model::Element::Question::Salary}
@@ -1,5 +1,6 @@
1
1
  require 'smartdown/api/multiple_choice'
2
2
  require 'smartdown/api/date_question'
3
+ require 'smartdown/api/country_question'
3
4
  require 'smartdown/api/salary_question'
4
5
  require 'smartdown/api/text_question'
5
6
 
@@ -10,8 +11,10 @@ module Smartdown
10
11
  elements.slice_before do |element|
11
12
  element.is_a? Smartdown::Model::Element::MarkdownHeading
12
13
  end.map do |question_element_group|
13
- if question_element_group.find{|element| element.is_a? Smartdown::Model::Element::Question::MultipleChoice}
14
+ if question_element_group.find{|element| element.is_a? Smartdown::Model::Element::Question::MultipleChoice }
14
15
  Smartdown::Api::MultipleChoice.new(question_element_group)
16
+ elsif question_element_group.find{ |element| element.is_a?(Smartdown::Model::Element::Question::Country) }
17
+ Smartdown::Api::CountryQuestion.new(question_element_group)
15
18
  elsif question_element_group.find{|element| element.is_a? Smartdown::Model::Element::Question::Date}
16
19
  Smartdown::Api::DateQuestion.new(question_element_group)
17
20
  elsif question_element_group.find{|element| element.is_a? Smartdown::Model::Element::Question::Salary}
@@ -0,0 +1,28 @@
1
+ require_relative "base"
2
+
3
+ module Smartdown
4
+ module Model
5
+ module Answer
6
+ class Country < Base
7
+ def value_type
8
+ ::String
9
+ end
10
+
11
+ def humanize
12
+ question.countries[value]
13
+ end
14
+
15
+ private
16
+ def parse_value(value)
17
+ check_value_not_nil(value)
18
+ if valid?
19
+ unless question.countries.keys.include? value
20
+ @error = "Invalid country"
21
+ end
22
+ end
23
+ value
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -7,6 +7,10 @@ module Smartdown
7
7
  def value_type
8
8
  ::String
9
9
  end
10
+
11
+ def humanize
12
+ value
13
+ end
10
14
  end
11
15
  end
12
16
  end
@@ -0,0 +1,15 @@
1
+ require 'smartdown/model/answer/country'
2
+
3
+ module Smartdown
4
+ module Model
5
+ module Element
6
+ module Question
7
+ class Country < Struct.new(:name, :countries, :alias)
8
+ def answer_type
9
+ Smartdown::Model::Answer::Country
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -33,15 +33,6 @@ module Smartdown
33
33
  match('[*-]')
34
34
  }
35
35
 
36
- rule(:option_pair) {
37
- comma >>
38
- optional_space >>
39
- identifier.as(:key) >>
40
- colon >>
41
- optional_space >>
42
- identifier.as(:value) >>
43
- optional_space
44
- }
45
36
  end
46
37
  end
47
38
  end
@@ -0,0 +1,21 @@
1
+ require 'smartdown/parser/base'
2
+ require 'smartdown/parser/question'
3
+
4
+ module Smartdown
5
+ module Parser
6
+ module Element
7
+ class CountryQuestion < Question
8
+
9
+ rule(:question_type) {
10
+ str("country")
11
+ }
12
+
13
+ rule(:country_question) {
14
+ question_tag.as(:country)
15
+ }
16
+
17
+ root(:country_question)
18
+ end
19
+ end
20
+ end
21
+ end
@@ -1,21 +1,18 @@
1
1
  require 'smartdown/parser/base'
2
+ require 'smartdown/parser/question'
2
3
 
3
4
  module Smartdown
4
5
  module Parser
5
6
  module Element
6
- class DateQuestion < Base
7
+ class DateQuestion < Question
8
+ rule(:question_type) {
9
+ str("date")
10
+ }
11
+
7
12
  rule(:date_question) {
8
- (
9
- str("[date:") >>
10
- optional_space >>
11
- question_identifier.as(:identifier) >>
12
- optional_space >>
13
- option_pair.repeat.as(:option_pairs) >>
14
- str("]") >>
15
- optional_space >>
16
- line_ending
17
- ).as(:date)
13
+ question_tag.as(:date)
18
14
  }
15
+
19
16
  root(:date_question)
20
17
  end
21
18
  end
@@ -1,18 +1,13 @@
1
1
  require 'smartdown/parser/base'
2
+ require 'smartdown/parser/question'
2
3
 
3
4
  module Smartdown
4
5
  module Parser
5
6
  module Element
6
- class MultipleChoiceQuestion < Base
7
- rule(:multiple_choice_question_tag) {
8
- str("[choice:") >>
9
- optional_space >>
10
- question_identifier.as(:identifier) >>
11
- optional_space >>
12
- option_pair.repeat.as(:option_pairs) >>
13
- str("]") >>
14
- optional_space >>
15
- line_ending
7
+ class MultipleChoiceQuestion < Question
8
+
9
+ rule(:question_type) {
10
+ str("choice")
16
11
  }
17
12
 
18
13
  rule(:option_definition_line) {
@@ -27,7 +22,7 @@ module Smartdown
27
22
 
28
23
  rule(:multiple_choice_question) {
29
24
  (
30
- multiple_choice_question_tag >>
25
+ question_tag >>
31
26
  (option_definition_line >> line_ending).repeat(1).as(:options)
32
27
  ).as(:multiple_choice)
33
28
  }
@@ -1,21 +1,18 @@
1
1
  require 'smartdown/parser/base'
2
+ require 'smartdown/parser/question'
2
3
 
3
4
  module Smartdown
4
5
  module Parser
5
6
  module Element
6
- class SalaryQuestion < Base
7
+ class SalaryQuestion < Question
8
+ rule(:question_type) {
9
+ str("salary")
10
+ }
11
+
7
12
  rule(:salary_question) {
8
- (
9
- str("[salary:") >>
10
- optional_space >>
11
- question_identifier.as(:identifier) >>
12
- optional_space >>
13
- option_pair.repeat.as(:option_pairs) >>
14
- str("]") >>
15
- optional_space >>
16
- line_ending
17
- ).as(:salary)
13
+ question_tag.as(:salary)
18
14
  }
15
+
19
16
  root(:salary_question)
20
17
  end
21
18
  end
@@ -1,21 +1,18 @@
1
- require 'smartdown/parser/base'
1
+ require 'smartdown/parser/question'
2
2
 
3
3
  module Smartdown
4
4
  module Parser
5
5
  module Element
6
- class TextQuestion < Base
6
+ class TextQuestion < Question
7
+
8
+ rule(:question_type) {
9
+ str("text")
10
+ }
11
+
7
12
  rule(:text_question) {
8
- (
9
- str("[text:") >>
10
- optional_space >>
11
- question_identifier.as(:identifier) >>
12
- optional_space >>
13
- option_pair.repeat.as(:option_pairs) >>
14
- str("]") >>
15
- optional_space >>
16
- line_ending
17
- ).as(:text)
13
+ question_tag.as(:text)
18
14
  }
15
+
19
16
  root(:text_question)
20
17
  end
21
18
  end
@@ -18,10 +18,11 @@ module Smartdown
18
18
  end
19
19
 
20
20
  class FlowInterpreter
21
- attr_reader :flow_input
21
+ attr_reader :flow_input, :data_module
22
22
 
23
- def initialize(flow_input)
23
+ def initialize(flow_input, data_module=nil)
24
24
  @flow_input = pre_parse(flow_input)
25
+ @data_module = data_module
25
26
  end
26
27
 
27
28
  def interpret
@@ -42,7 +43,7 @@ module Smartdown
42
43
  end
43
44
 
44
45
  def interpret_node(input_data)
45
- Smartdown::Parser::NodeInterpreter.new(input_data.name, input_data.read).interpret
46
+ Smartdown::Parser::NodeInterpreter.new(input_data.name, input_data.read, options).interpret
46
47
  rescue Parslet::ParseFailed => error
47
48
  raise ParseError.new(input_data.name, error)
48
49
  end
@@ -50,6 +51,12 @@ module Smartdown
50
51
  def pre_parse(flow_input)
51
52
  SnippetPreParser.parse(flow_input)
52
53
  end
54
+
55
+ def options
56
+ {}.tap do |opts|
57
+ opts[:data_module] = data_module if data_module
58
+ end
59
+ end
53
60
  end
54
61
  end
55
62
  end
@@ -12,8 +12,9 @@ module Smartdown
12
12
  def initialize(name, source, options = {})
13
13
  @name = name
14
14
  @source = source
15
+ data_module = options.fetch(:data_module, {})
15
16
  @parser = options.fetch(:parser, Smartdown::Parser::NodeParser.new)
16
- @transform = options.fetch(:transform, Smartdown::Parser::NodeTransform.new)
17
+ @transform = options.fetch(:transform, Smartdown::Parser::NodeTransform.new(data_module))
17
18
  end
18
19
 
19
20
  def interpret
@@ -6,6 +6,7 @@ require 'smartdown/parser/element/multiple_choice_question'
6
6
  require 'smartdown/parser/element/date_question'
7
7
  require 'smartdown/parser/element/salary_question'
8
8
  require 'smartdown/parser/element/text_question'
9
+ require 'smartdown/parser/element/country_question'
9
10
  require 'smartdown/parser/element/markdown_heading'
10
11
  require 'smartdown/parser/element/markdown_paragraph'
11
12
  require 'smartdown/parser/element/conditional'
@@ -21,6 +22,7 @@ module Smartdown
21
22
  Element::DateQuestion.new |
22
23
  Element::SalaryQuestion.new |
23
24
  Element::TextQuestion.new |
25
+ Element::CountryQuestion.new |
24
26
  Rules.new |
25
27
  Element::StartButton.new |
26
28
  Element::NextSteps.new |
@@ -6,6 +6,7 @@ require 'smartdown/model/rule'
6
6
  require 'smartdown/model/nested_rule'
7
7
  require 'smartdown/model/next_node_rules'
8
8
  require 'smartdown/model/element/question/multiple_choice'
9
+ require 'smartdown/model/element/question/country'
9
10
  require 'smartdown/model/element/question/date'
10
11
  require 'smartdown/model/element/question/salary'
11
12
  require 'smartdown/model/element/question/text'
@@ -27,6 +28,22 @@ require 'smartdown/model/predicate/comparison/less'
27
28
  module Smartdown
28
29
  module Parser
29
30
  class NodeTransform < Parslet::Transform
31
+
32
+ attr_reader :data_module
33
+
34
+ def initialize data_module=nil, &block
35
+ super(&block)
36
+
37
+ @data_module = data_module || {}
38
+ end
39
+
40
+ #TODO: Horrible monkey patching, should try to submit a PR to parselet
41
+ #to allow modification of bindings?
42
+ def call_on_match(bindings, block)
43
+ bindings.merge! data_module
44
+ super(bindings, block)
45
+ end
46
+
30
47
  rule(body: subtree(:body)) {
31
48
  Smartdown::Model::Node.new(
32
49
  node_name, body, Smartdown::Model::FrontMatter.new({})
@@ -74,6 +91,16 @@ module Smartdown
74
91
  )
75
92
  }
76
93
 
94
+ rule(:country => {identifier: simple(:identifier), :option_pairs => subtree(:option_pairs)}) {
95
+ country_data_method = Smartdown::Parser::OptionPairs.transform(option_pairs).fetch('countries', nil)
96
+ country_hash = (eval country_data_method).call
97
+ Smartdown::Model::Element::Question::Country.new(
98
+ identifier.to_s,
99
+ country_hash,
100
+ Smartdown::Parser::OptionPairs.transform(option_pairs).fetch('alias', nil)
101
+ )
102
+ }
103
+
77
104
  rule(:date => {identifier: simple(:identifier), :option_pairs => subtree(:option_pairs)}) {
78
105
  Smartdown::Model::Element::Question::Date.new(
79
106
  identifier.to_s,
@@ -0,0 +1,37 @@
1
+ require 'smartdown/parser/base'
2
+ require 'smartdown/parser/predicates'
3
+
4
+ module Smartdown
5
+ module Parser
6
+ module Element
7
+ class Question < Base
8
+
9
+ rule(:option_pair) {
10
+ comma >>
11
+ optional_space >>
12
+ identifier.as(:key) >>
13
+ colon >>
14
+ optional_space >>
15
+ identifier.as(:value) >>
16
+ optional_space
17
+ }
18
+
19
+ rule(:question_tag) {
20
+ (
21
+ str("[") >>
22
+ question_type >>
23
+ str(':') >>
24
+ optional_space >>
25
+ identifier.as(:identifier) >>
26
+ optional_space >>
27
+ option_pair.repeat.as(:option_pairs) >>
28
+ str("]") >>
29
+ optional_space >>
30
+ line_ending
31
+ )
32
+ }
33
+
34
+ end
35
+ end
36
+ end
37
+ end
@@ -1,3 +1,3 @@
1
1
  module Smartdown
2
- VERSION = "0.8.2"
2
+ VERSION = "0.9.0"
3
3
  end
@@ -1,6 +1,7 @@
1
1
  # encoding: utf-8
2
2
  #TODO: this "require" for money is here for now since there is no associated question type for money yet
3
3
  require 'smartdown/model/answer/money'
4
+ require 'smartdown/model/element/question/country'
4
5
  require 'smartdown/engine/interpolator'
5
6
  require 'smartdown/engine/state'
6
7
  require 'parslet'
@@ -126,4 +127,47 @@ describe Smartdown::Engine::Interpolator do
126
127
  expect(interpolated_node.elements.first.content).to eq("£12.33")
127
128
  end
128
129
  end
130
+
131
+ context "a paragraph containing a text answer" do
132
+ let(:elements) { [Smartdown::Model::Element::MarkdownParagraph.new('%{text_answer}')] }
133
+ let(:state) {
134
+ Smartdown::Engine::State.new(
135
+ current_node: node.name,
136
+ text_answer: Smartdown::Model::Answer::Text.new('I AM TEXT, HEAR ME RAWR')
137
+ )
138
+ }
139
+ it "interpolates the result" do
140
+ expect(interpolated_node.elements.first.content).to eq("I AM TEXT, HEAR ME RAWR")
141
+ end
142
+ end
143
+
144
+ context "a paragraph containing a multuple-choice answer" do
145
+ let(:elements) { [Smartdown::Model::Element::MarkdownParagraph.new('%{multiple_choice_answer}')] }
146
+ let(:choices) { { 'dog' => 'Dog', 'growlithe' => 'Growlithe', 'arcanine' => 'Arcanine' } }
147
+ let(:question) { Smartdown::Model::Element::Question::MultipleChoice.new('arcanine', choices) }
148
+ let(:state) {
149
+ Smartdown::Engine::State.new(
150
+ current_node: node.name,
151
+ multiple_choice_answer: Smartdown::Model::Answer::MultipleChoice.new('arcanine', question)
152
+ )
153
+ }
154
+ it "interpolates the result" do
155
+ expect(interpolated_node.elements.first.content).to eq("Arcanine")
156
+ end
157
+ end
158
+
159
+ context "a paragraph containing a country answer" do
160
+ let(:elements) { [Smartdown::Model::Element::MarkdownParagraph.new('%{country_answer}')] }
161
+ let(:country_hash) { { 'united-kingdom' => 'United Kingdom' } }
162
+ let(:question) { Smartdown::Model::Element::Question::Country.new('united-kingdom', country_hash) }
163
+ let(:state) {
164
+ Smartdown::Engine::State.new(
165
+ current_node: node.name,
166
+ country_answer: Smartdown::Model::Answer::Country.new('united-kingdom', question)
167
+ )
168
+ }
169
+ it "interpolates the result" do
170
+ expect(interpolated_node.elements.first.content).to eq("United Kingdom")
171
+ end
172
+ end
129
173
  end
@@ -0,0 +1,31 @@
1
+ describe Smartdown::Model::Answer::Country do
2
+ let(:text_string) { "United Kingdom" }
3
+ subject(:instance) { described_class.new(text_string) }
4
+
5
+
6
+ let(:answer_string) { "country" }
7
+ subject(:answer) { described_class.new(answer_string, multiple_choice_question) }
8
+ let(:multiple_choice_question) {
9
+ Smartdown::Model::Element::Question::Country.new("question",
10
+ {"country" => "Lovely country"}
11
+ )
12
+ }
13
+
14
+ describe "#humanize" do
15
+ it "returns the humanized answer" do
16
+ expect(answer.humanize).to eq "Lovely country"
17
+ end
18
+ end
19
+
20
+ describe "errors" do
21
+ context "format is incorrect" do
22
+ let(:answer_string) { "kasjdf" }
23
+ specify { expect(answer.error).to eql "Invalid country" }
24
+ end
25
+
26
+ context "answer not filled in" do
27
+ let(:answer_string) { nil }
28
+ specify { expect(answer.error).to eql "Please answer this question" }
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,70 @@
1
+ require 'smartdown/parser/node_parser'
2
+ require 'smartdown/parser/node_interpreter'
3
+ require 'smartdown/parser/element/country_question'
4
+
5
+ describe Smartdown::Parser::Element::CountryQuestion do
6
+ subject(:parser) { described_class.new }
7
+ let(:data_module) { { 'country_data_all' => ->{{}} } }
8
+
9
+ context "with question tag and countries" do
10
+ let(:source) { "[country: country_of_residence, countries: country_data_all]" }
11
+
12
+ it "parses" do
13
+ should parse(source).as(
14
+ country: {
15
+ identifier: "country_of_residence",
16
+ option_pairs:[
17
+ {
18
+ key: 'countries',
19
+ value: 'country_data_all',
20
+ },
21
+ ]
22
+ }
23
+ )
24
+ end
25
+
26
+ describe "transformed" do
27
+ let(:node_name) { "my_node" }
28
+ subject(:transformed) {
29
+ Smartdown::Parser::NodeInterpreter.new(node_name, source, data_module: data_module, parser: parser).interpret
30
+ }
31
+
32
+ it { should eq(Smartdown::Model::Element::Question::Country.new("country_of_residence", {})) }
33
+ end
34
+
35
+ end
36
+
37
+ context "with question tag and countries, and alias" do
38
+ let(:source) { "[country: country_of_residence, countries: country_data_all, alias: birthplace]" }
39
+
40
+ it "parses" do
41
+ should parse(source).as(
42
+ country: {
43
+ identifier: "country_of_residence",
44
+ option_pairs:[
45
+ {
46
+ key: 'countries',
47
+ value: 'country_data_all',
48
+ },
49
+ {
50
+ key: 'alias',
51
+ value: 'birthplace',
52
+ },
53
+ ]
54
+ }
55
+ )
56
+ end
57
+
58
+ describe "transformed" do
59
+ let(:node_name) { "my_node" }
60
+ subject(:transformed) {
61
+ Smartdown::Parser::NodeInterpreter.new(node_name, source, data_module: data_module, parser: parser).interpret
62
+ }
63
+
64
+ it { should eq(Smartdown::Model::Element::Question::Country.new("country_of_residence", {}, "birthplace")) }
65
+ end
66
+
67
+ end
68
+
69
+
70
+ end
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.8.2
4
+ version: 0.9.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: &5594140 !ruby/object:Gem::Requirement
16
+ requirement: &9477660 !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: *5594140
24
+ version_requirements: *9477660
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: rspec
27
- requirement: &5593360 !ruby/object:Gem::Requirement
27
+ requirement: &9476740 !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: *5593360
35
+ version_requirements: *9476740
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: rake
38
- requirement: &5592880 !ruby/object:Gem::Requirement
38
+ requirement: &9475460 !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: *5592880
46
+ version_requirements: *9475460
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: gem_publisher
49
- requirement: &5592080 !ruby/object:Gem::Requirement
49
+ requirement: &9474100 !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: *5592080
57
+ version_requirements: *9474100
58
58
  description:
59
59
  email: david.heath@digital.cabinet-office.gov.uk
60
60
  executables:
@@ -66,6 +66,7 @@ files:
66
66
  - lib/smartdown/engine.rb
67
67
  - lib/smartdown/parser/predicates.rb
68
68
  - lib/smartdown/parser/node_transform.rb
69
+ - lib/smartdown/parser/question.rb
69
70
  - lib/smartdown/parser/node_interpreter.rb
70
71
  - lib/smartdown/parser/snippet_pre_parser.rb
71
72
  - lib/smartdown/parser/base.rb
@@ -80,6 +81,7 @@ files:
80
81
  - lib/smartdown/parser/element/markdown_paragraph.rb
81
82
  - lib/smartdown/parser/element/start_button.rb
82
83
  - lib/smartdown/parser/element/front_matter.rb
84
+ - lib/smartdown/parser/element/country_question.rb
83
85
  - lib/smartdown/parser/element/multiple_choice_question.rb
84
86
  - lib/smartdown/parser/element/next_steps.rb
85
87
  - lib/smartdown/parser/element/markdown_heading.rb
@@ -97,6 +99,7 @@ files:
97
99
  - lib/smartdown/api/directory_input.rb
98
100
  - lib/smartdown/api/previous_question.rb
99
101
  - lib/smartdown/api/outcome.rb
102
+ - lib/smartdown/api/country_question.rb
100
103
  - lib/smartdown/api/multiple_choice.rb
101
104
  - lib/smartdown/api/text_question.rb
102
105
  - lib/smartdown/api/previous_question_page.rb
@@ -127,6 +130,7 @@ files:
127
130
  - lib/smartdown/model/answer/date.rb
128
131
  - lib/smartdown/model/answer/base.rb
129
132
  - lib/smartdown/model/answer/salary.rb
133
+ - lib/smartdown/model/answer/country.rb
130
134
  - lib/smartdown/model/answer/money.rb
131
135
  - lib/smartdown/model/answer/multiple_choice.rb
132
136
  - lib/smartdown/model/answer/text.rb
@@ -137,6 +141,7 @@ files:
137
141
  - lib/smartdown/model/element/markdown_heading.rb
138
142
  - lib/smartdown/model/element/question/date.rb
139
143
  - lib/smartdown/model/element/question/salary.rb
144
+ - lib/smartdown/model/element/question/country.rb
140
145
  - lib/smartdown/model/element/question/multiple_choice.rb
141
146
  - lib/smartdown/model/element/question/text.rb
142
147
  - lib/smartdown/model/next_node_rules.rb
@@ -156,6 +161,7 @@ files:
156
161
  - spec/parser/predicates_spec.rb
157
162
  - spec/parser/element/next_steps_spec.rb
158
163
  - spec/parser/element/multiple_choice_question_spec.rb
164
+ - spec/parser/element/country_question_spec.rb
159
165
  - spec/parser/element/conditional_spec.rb
160
166
  - spec/parser/element/start_button_parser_spec.rb
161
167
  - spec/parser/element/date_question_spec.rb
@@ -224,6 +230,7 @@ files:
224
230
  - spec/model/answer/base_spec.rb
225
231
  - spec/model/answer/salary_spec.rb
226
232
  - spec/model/answer/date_spec.rb
233
+ - spec/model/answer/country_spec.rb
227
234
  - spec/model/predicates/set_membership_spec.rb
228
235
  - spec/model/predicates/combined_spec.rb
229
236
  - spec/model/predicates/comparison_spec.rb
@@ -245,7 +252,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
245
252
  version: '0'
246
253
  segments:
247
254
  - 0
248
- hash: -1665618218665725274
255
+ hash: -2036017641587620978
249
256
  required_rubygems_version: !ruby/object:Gem::Requirement
250
257
  none: false
251
258
  requirements:
@@ -254,7 +261,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
254
261
  version: '0'
255
262
  segments:
256
263
  - 0
257
- hash: -1665618218665725274
264
+ hash: -2036017641587620978
258
265
  requirements: []
259
266
  rubyforge_project:
260
267
  rubygems_version: 1.8.11
@@ -273,6 +280,7 @@ test_files:
273
280
  - spec/parser/predicates_spec.rb
274
281
  - spec/parser/element/next_steps_spec.rb
275
282
  - spec/parser/element/multiple_choice_question_spec.rb
283
+ - spec/parser/element/country_question_spec.rb
276
284
  - spec/parser/element/conditional_spec.rb
277
285
  - spec/parser/element/start_button_parser_spec.rb
278
286
  - spec/parser/element/date_question_spec.rb
@@ -341,6 +349,7 @@ test_files:
341
349
  - spec/model/answer/base_spec.rb
342
350
  - spec/model/answer/salary_spec.rb
343
351
  - spec/model/answer/date_spec.rb
352
+ - spec/model/answer/country_spec.rb
344
353
  - spec/model/predicates/set_membership_spec.rb
345
354
  - spec/model/predicates/combined_spec.rb
346
355
  - spec/model/predicates/comparison_spec.rb