smartdown 0.12.1 → 0.13.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/lib/smartdown/api/country_question.rb +1 -1
- data/lib/smartdown/api/money_question.rb +9 -0
- data/lib/smartdown/api/previous_question.rb +2 -14
- data/lib/smartdown/api/question_page.rb +4 -19
- data/lib/smartdown/model/answer/base.rb +2 -0
- data/lib/smartdown/model/answer/money.rb +37 -6
- data/lib/smartdown/model/answer/salary.rb +8 -17
- data/lib/smartdown/model/element/question/money.rb +15 -0
- data/lib/smartdown/model/element/question.rb +68 -0
- data/lib/smartdown/parser/element/money_question.rb +20 -0
- data/lib/smartdown/parser/node_parser.rb +3 -1
- data/lib/smartdown/parser/node_transform.rb +8 -6
- data/lib/smartdown/version.rb +1 -1
- data/spec/engine/interpolator_spec.rb +2 -4
- data/spec/model/answer/money_spec.rb +122 -11
- data/spec/model/answer/salary_spec.rb +3 -4
- data/spec/model/element/question_spec.rb +70 -0
- data/spec/parser/element/money_question_spec.rb +57 -0
- data/spec/support/model_builder.rb +1 -4
- metadata +26 -18
@@ -8,20 +8,8 @@ module Smartdown
|
|
8
8
|
attr_reader :answer, :question
|
9
9
|
|
10
10
|
def initialize(elements, response)
|
11
|
-
|
12
|
-
|
13
|
-
elsif element = elements.find{|element| element.is_a? Smartdown::Model::Element::Question::Country}
|
14
|
-
@question = CountryQuestion.new(elements)
|
15
|
-
elsif element = elements.find{|element| element.is_a? Smartdown::Model::Element::Question::Date}
|
16
|
-
@question = DateQuestion.new(elements)
|
17
|
-
elsif element = elements.find{|element| element.is_a? Smartdown::Model::Element::Question::Salary}
|
18
|
-
@question = SalaryQuestion.new(elements)
|
19
|
-
elsif element = elements.find{|element| element.is_a? Smartdown::Model::Element::Question::Text}
|
20
|
-
@question = TextQuestion.new(elements)
|
21
|
-
elsif element = elements.find{|element| element.is_a? Smartdown::Model::Element::Question::Postcode}
|
22
|
-
@question = PostcodeQuestion.new(elements)
|
23
|
-
end
|
24
|
-
@answer = element.answer_type.new(response, element) if element
|
11
|
+
@question, @answer = Smartdown::Model::Element::Question.
|
12
|
+
create_question_answer(elements, response)
|
25
13
|
end
|
26
14
|
|
27
15
|
end
|
@@ -1,9 +1,4 @@
|
|
1
|
-
require 'smartdown/
|
2
|
-
require 'smartdown/api/date_question'
|
3
|
-
require 'smartdown/api/country_question'
|
4
|
-
require 'smartdown/api/salary_question'
|
5
|
-
require 'smartdown/api/text_question'
|
6
|
-
require 'smartdown/api/postcode_question'
|
1
|
+
require 'smartdown/model/element/question'
|
7
2
|
|
8
3
|
module Smartdown
|
9
4
|
module Api
|
@@ -12,19 +7,9 @@ module Smartdown
|
|
12
7
|
elements.slice_before do |element|
|
13
8
|
element.is_a? Smartdown::Model::Element::MarkdownHeading
|
14
9
|
end.map do |question_element_group|
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
Smartdown::Api::CountryQuestion.new(question_element_group)
|
19
|
-
elsif question_element_group.find{|element| element.is_a? Smartdown::Model::Element::Question::Date}
|
20
|
-
Smartdown::Api::DateQuestion.new(question_element_group)
|
21
|
-
elsif question_element_group.find{|element| element.is_a? Smartdown::Model::Element::Question::Salary}
|
22
|
-
Smartdown::Api::SalaryQuestion.new(question_element_group)
|
23
|
-
elsif question_element_group.find{|element| element.is_a? Smartdown::Model::Element::Question::Text}
|
24
|
-
Smartdown::Api::TextQuestion.new(question_element_group)
|
25
|
-
elsif question_element_group.find{|element| element.is_a? Smartdown::Model::Element::Question::Postcode}
|
26
|
-
Smartdown::Api::PostcodeQuestion.new(question_element_group)
|
27
|
-
end
|
10
|
+
question, answer = Smartdown::Model::Element::Question.
|
11
|
+
create_question_answer(question_element_group)
|
12
|
+
question
|
28
13
|
end.compact
|
29
14
|
end
|
30
15
|
end
|
@@ -1,23 +1,54 @@
|
|
1
1
|
# encoding: utf-8
|
2
|
-
#TODO: this is no technically an answer (only used for plugin formatting for now)
|
3
|
-
#since we will have money questions in the near future, this todo should be removed, and the
|
4
|
-
#require in interpolator.rb removed
|
5
|
-
|
6
2
|
require_relative "base"
|
7
3
|
|
8
4
|
module Smartdown
|
9
5
|
module Model
|
10
6
|
module Answer
|
11
7
|
class Money < Base
|
8
|
+
|
9
|
+
FORMAT_REGEX = /^£?\W*([\d|,|]+[\.]?[\d]*)$/
|
10
|
+
|
12
11
|
def value_type
|
13
12
|
::Float
|
14
13
|
end
|
15
14
|
|
15
|
+
def to_s
|
16
|
+
('%.2f' % value).chomp('.00')
|
17
|
+
end
|
18
|
+
|
16
19
|
def humanize
|
17
|
-
|
20
|
+
whole, decimal = separate_by_comma(value)
|
21
|
+
if decimal == '00'
|
22
|
+
"£#{whole}"
|
23
|
+
else
|
24
|
+
"£#{whole}.#{decimal}"
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
private
|
29
|
+
|
30
|
+
def parse_value value
|
31
|
+
if value.is_a?(Float)
|
32
|
+
value
|
33
|
+
elsif value.is_a?(Fixnum)
|
34
|
+
Float value
|
35
|
+
else
|
36
|
+
matched_value = value.strip.match FORMAT_REGEX
|
37
|
+
if matched_value
|
38
|
+
Float matched_value[1].gsub(',','')
|
39
|
+
else
|
40
|
+
@error = 'Invalid format'
|
41
|
+
return
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
def separate_by_comma(number)
|
47
|
+
left, right = ('%.2f' % number).split('.')
|
48
|
+
left.gsub!(/(\d)(?=(\d\d\d)+(?!\d))/) do |digit_to_delimit|
|
18
49
|
"#{digit_to_delimit},"
|
19
50
|
end
|
20
|
-
|
51
|
+
[left, right]
|
21
52
|
end
|
22
53
|
end
|
23
54
|
end
|
@@ -7,23 +7,19 @@ module Smartdown
|
|
7
7
|
class Salary < Base
|
8
8
|
attr_reader :period, :amount_per_period
|
9
9
|
|
10
|
-
FORMAT_REGEX =
|
10
|
+
FORMAT_REGEX = Regexp.new(Money::FORMAT_REGEX.source.chomp('$') +
|
11
|
+
/[-|\W*per\W*](week|month|year)$/.source)
|
11
12
|
|
12
13
|
def value_type
|
13
14
|
::Float
|
14
15
|
end
|
15
16
|
|
16
17
|
def to_s
|
17
|
-
"#{
|
18
|
+
"#{@money_per_period}-#{period}"
|
18
19
|
end
|
19
20
|
|
20
21
|
def humanize
|
21
|
-
|
22
|
-
if decimal == "00"
|
23
|
-
"£#{whole} per #{period}"
|
24
|
-
else
|
25
|
-
"£#{whole}.#{decimal} per #{period}"
|
26
|
-
end
|
22
|
+
"#{@money_per_period.humanize} per #{period}"
|
27
23
|
end
|
28
24
|
|
29
25
|
private
|
@@ -33,8 +29,10 @@ module Smartdown
|
|
33
29
|
@error = "Invalid format"
|
34
30
|
return
|
35
31
|
end
|
36
|
-
|
37
|
-
|
32
|
+
amount_per_period, @period = *matched_value[1..2]
|
33
|
+
|
34
|
+
@money_per_period = Money.new(amount_per_period)
|
35
|
+
@amount_per_period = @money_per_period.value
|
38
36
|
yearly_total
|
39
37
|
end
|
40
38
|
|
@@ -49,13 +47,6 @@ module Smartdown
|
|
49
47
|
end
|
50
48
|
end
|
51
49
|
|
52
|
-
def separate_by_comma(number)
|
53
|
-
left, right = ('%.2f' % number).split('.')
|
54
|
-
left.gsub!(/(\d)(?=(\d\d\d)+(?!\d))/) do |digit_to_delimit|
|
55
|
-
"#{digit_to_delimit},"
|
56
|
-
end
|
57
|
-
[left, right]
|
58
|
-
end
|
59
50
|
end
|
60
51
|
end
|
61
52
|
end
|
@@ -0,0 +1,68 @@
|
|
1
|
+
require 'forwardable'
|
2
|
+
require 'smartdown/model/element/question/multiple_choice'
|
3
|
+
require 'smartdown/model/element/question/country'
|
4
|
+
require 'smartdown/model/element/question/date'
|
5
|
+
require 'smartdown/model/element/question/money'
|
6
|
+
require 'smartdown/model/element/question/salary'
|
7
|
+
require 'smartdown/model/element/question/text'
|
8
|
+
require 'smartdown/model/element/question/postcode'
|
9
|
+
require 'smartdown/api/multiple_choice'
|
10
|
+
require 'smartdown/api/date_question'
|
11
|
+
require 'smartdown/api/country_question'
|
12
|
+
require 'smartdown/api/money_question'
|
13
|
+
require 'smartdown/api/salary_question'
|
14
|
+
require 'smartdown/api/text_question'
|
15
|
+
require 'smartdown/api/postcode_question'
|
16
|
+
|
17
|
+
module Smartdown
|
18
|
+
module Model
|
19
|
+
module Element
|
20
|
+
module Question
|
21
|
+
|
22
|
+
class << self
|
23
|
+
def create_question_answer(elements, response=nil)
|
24
|
+
matching_question_element(elements) do |element|
|
25
|
+
question = create_question(elements, element)
|
26
|
+
answer = create_answer(response, element)
|
27
|
+
return [question, answer]
|
28
|
+
end
|
29
|
+
return [nil, nil]
|
30
|
+
end
|
31
|
+
|
32
|
+
private
|
33
|
+
|
34
|
+
def matching_question_element(elements)
|
35
|
+
constants.find do |symbol|
|
36
|
+
question_type = const_get(symbol)
|
37
|
+
|
38
|
+
if element = elements.find {|e| e.is_a?(question_type) }
|
39
|
+
yield element
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
def create_question(elements, element)
|
45
|
+
question_model(element).new(elements)
|
46
|
+
end
|
47
|
+
|
48
|
+
def question_model(element)
|
49
|
+
Smartdown::Api.const_get question_model_name(element)
|
50
|
+
end
|
51
|
+
|
52
|
+
def question_model_name(element)
|
53
|
+
symbol = element.class.name.split(':').last.to_sym
|
54
|
+
name = (symbol.to_s + 'Question').to_sym
|
55
|
+
name = symbol unless Smartdown::Api.const_defined?(name)
|
56
|
+
name
|
57
|
+
end
|
58
|
+
|
59
|
+
def create_answer(response, element)
|
60
|
+
response ? element.answer_type.new(response, element) : nil
|
61
|
+
end
|
62
|
+
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'smartdown/parser/base'
|
2
|
+
require 'smartdown/parser/question'
|
3
|
+
|
4
|
+
module Smartdown
|
5
|
+
module Parser
|
6
|
+
module Element
|
7
|
+
class MoneyQuestion < Question
|
8
|
+
rule(:question_type) {
|
9
|
+
str("money")
|
10
|
+
}
|
11
|
+
|
12
|
+
rule(:money_question) {
|
13
|
+
question_tag.as(:money)
|
14
|
+
}
|
15
|
+
|
16
|
+
root(:money_question)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -4,6 +4,7 @@ require 'smartdown/parser/element/front_matter'
|
|
4
4
|
require 'smartdown/parser/element/start_button'
|
5
5
|
require 'smartdown/parser/element/multiple_choice_question'
|
6
6
|
require 'smartdown/parser/element/date_question'
|
7
|
+
require 'smartdown/parser/element/money_question'
|
7
8
|
require 'smartdown/parser/element/salary_question'
|
8
9
|
require 'smartdown/parser/element/text_question'
|
9
10
|
require 'smartdown/parser/element/country_question'
|
@@ -26,6 +27,7 @@ module Smartdown
|
|
26
27
|
Element::TextQuestion.new |
|
27
28
|
Element::CountryQuestion.new |
|
28
29
|
Element::PostcodeQuestion.new |
|
30
|
+
Element::MoneyQuestion.new |
|
29
31
|
Rules.new |
|
30
32
|
Element::StartButton.new |
|
31
33
|
Element::NextSteps.new |
|
@@ -34,7 +36,7 @@ module Smartdown
|
|
34
36
|
}
|
35
37
|
|
36
38
|
rule(:markdown_elements) {
|
37
|
-
markdown_element.repeat(1, 1) >>
|
39
|
+
markdown_element.repeat(1, 1) >>
|
38
40
|
(newline.repeat(1).as(:blank_line) >> markdown_element.as(:element)).repeat
|
39
41
|
}
|
40
42
|
|
@@ -6,12 +6,7 @@ require 'smartdown/model/elements'
|
|
6
6
|
require 'smartdown/model/rule'
|
7
7
|
require 'smartdown/model/nested_rule'
|
8
8
|
require 'smartdown/model/next_node_rules'
|
9
|
-
require 'smartdown/model/element/question
|
10
|
-
require 'smartdown/model/element/question/country'
|
11
|
-
require 'smartdown/model/element/question/date'
|
12
|
-
require 'smartdown/model/element/question/salary'
|
13
|
-
require 'smartdown/model/element/question/text'
|
14
|
-
require 'smartdown/model/element/question/postcode'
|
9
|
+
require 'smartdown/model/element/question'
|
15
10
|
require 'smartdown/model/element/start_button'
|
16
11
|
require 'smartdown/model/element/markdown_heading'
|
17
12
|
require 'smartdown/model/element/markdown_line'
|
@@ -137,6 +132,13 @@ module Smartdown
|
|
137
132
|
)
|
138
133
|
}
|
139
134
|
|
135
|
+
rule money: { identifier: simple(:identifier), option_pairs: subtree(:option_pairs) } {
|
136
|
+
Smartdown::Model::Element::Question::Money.new(
|
137
|
+
identifier.to_s,
|
138
|
+
Smartdown::Parser::OptionPairs.transform(option_pairs).fetch('alias', nil)
|
139
|
+
)
|
140
|
+
}
|
141
|
+
|
140
142
|
rule(:next_steps => { content: simple(:content) }) {
|
141
143
|
Smartdown::Model::Element::NextSteps.new(content.to_s)
|
142
144
|
}
|
data/lib/smartdown/version.rb
CHANGED
@@ -1,7 +1,5 @@
|
|
1
1
|
# encoding: utf-8
|
2
|
-
|
3
|
-
require 'smartdown/model/answer/money'
|
4
|
-
require 'smartdown/model/element/question/country'
|
2
|
+
require 'smartdown/model/element/question'
|
5
3
|
require 'smartdown/engine/interpolator'
|
6
4
|
require 'smartdown/engine/state'
|
7
5
|
require 'parslet'
|
@@ -120,7 +118,7 @@ describe Smartdown::Engine::Interpolator do
|
|
120
118
|
let(:state) {
|
121
119
|
Smartdown::Engine::State.new(
|
122
120
|
current_node: node.name,
|
123
|
-
money_answer: Smartdown::Model::Answer::Money.new(12.32523)
|
121
|
+
money_answer: Smartdown::Model::Answer::Money.new('12.32523')
|
124
122
|
)
|
125
123
|
}
|
126
124
|
it "interpolates the result of the function call" do
|
@@ -3,36 +3,147 @@ require 'smartdown/model/answer/money'
|
|
3
3
|
|
4
4
|
describe Smartdown::Model::Answer::Money do
|
5
5
|
|
6
|
-
let(:
|
7
|
-
subject(:instance) { described_class.new(
|
6
|
+
let(:money_input) { '1523.42' }
|
7
|
+
subject(:instance) { described_class.new(money_input) }
|
8
|
+
|
9
|
+
specify { expect(instance.value).to eql(1523.42) }
|
10
|
+
|
11
|
+
describe 'instantiate with integer' do
|
12
|
+
let(:money_input) { 1523 }
|
13
|
+
|
14
|
+
specify { expect(instance.value).to eql(1523.0) }
|
15
|
+
end
|
16
|
+
|
17
|
+
describe 'instantiate with float' do
|
18
|
+
let(:money_input) { 1523.12 }
|
19
|
+
|
20
|
+
specify { expect(instance.value).to eql(1523.12) }
|
21
|
+
end
|
22
|
+
|
23
|
+
describe 'to_s' do
|
24
|
+
it "returns value without comma delimiter" do
|
25
|
+
expect(instance.to_s).to eql("1523.42")
|
26
|
+
end
|
27
|
+
end
|
8
28
|
|
9
29
|
describe "#humanize" do
|
10
30
|
it "specifies money in the correct format" do
|
11
|
-
expect(instance.humanize).to eql("£523.42")
|
31
|
+
expect(instance.humanize).to eql("£1,523.42")
|
12
32
|
end
|
33
|
+
|
13
34
|
context "rounding up" do
|
14
|
-
let(:
|
35
|
+
let(:money_input) { '1523.427' }
|
15
36
|
it "rounds up amounts of money correctly" do
|
16
|
-
expect(instance.humanize).to eql("£523.43")
|
37
|
+
expect(instance.humanize).to eql("£1,523.43")
|
17
38
|
end
|
18
39
|
end
|
19
40
|
context "rounding down" do
|
20
|
-
let(:
|
41
|
+
let(:money_input) { '1523.421' }
|
21
42
|
it "rounds down amounts of money correctly" do
|
22
|
-
expect(instance.humanize).to eql("£523.42")
|
43
|
+
expect(instance.humanize).to eql("£1,523.42")
|
23
44
|
end
|
24
45
|
end
|
25
46
|
context "rounds down in the .005 case" do
|
26
|
-
let(:
|
47
|
+
let(:money_input) { '1523.425' }
|
27
48
|
it "rounds down amounts of money correctly" do
|
28
|
-
expect(instance.humanize).to eql("£523.42")
|
49
|
+
expect(instance.humanize).to eql("£1,523.42")
|
29
50
|
end
|
30
51
|
end
|
31
52
|
context "no pence" do
|
32
|
-
let(:
|
53
|
+
let(:money_input) { '1523.00' }
|
33
54
|
it "rounds down amounts of money correctly" do
|
34
|
-
expect(instance.humanize).to eql("£523")
|
55
|
+
expect(instance.humanize).to eql("£1,523")
|
35
56
|
end
|
36
57
|
end
|
37
58
|
end
|
59
|
+
|
60
|
+
describe "errors" do
|
61
|
+
context "invalid formatting" do
|
62
|
+
let(:money_input) {"Loads'a'money"}
|
63
|
+
|
64
|
+
it "Has errors" do
|
65
|
+
expect(instance.error).to eql("Invalid format")
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
context "no input" do
|
70
|
+
let(:money_input) { nil }
|
71
|
+
|
72
|
+
it "Has errors" do
|
73
|
+
expect(instance.error).to eql("Please answer this question")
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
describe "comparisons" do
|
79
|
+
let(:money_input) { '62,400' }
|
80
|
+
|
81
|
+
context "comparing against Float" do
|
82
|
+
specify { expect(instance == 62400.0).to eql true }
|
83
|
+
|
84
|
+
specify { expect(instance < 62400.1).to eql true }
|
85
|
+
specify { expect(instance < 62400.0).to eql false }
|
86
|
+
specify { expect(instance < 62399.9).to eql false }
|
87
|
+
|
88
|
+
specify { expect(instance > 62400.1).to eql false }
|
89
|
+
specify { expect(instance > 62400.0).to eql false }
|
90
|
+
specify { expect(instance > 62399.9).to eql true }
|
91
|
+
|
92
|
+
specify { expect(instance <= 62400.1).to eql true }
|
93
|
+
specify { expect(instance <= 62400.0).to eql true }
|
94
|
+
specify { expect(instance <= 62399.9).to eql false }
|
95
|
+
|
96
|
+
specify { expect(instance >= 62400.1).to eql false }
|
97
|
+
specify { expect(instance >= 62400.0).to eql true }
|
98
|
+
specify { expect(instance >= 62399.9).to eql true }
|
99
|
+
end
|
100
|
+
|
101
|
+
context "comparing against Integer" do
|
102
|
+
specify { expect(instance == 62400).to eql true }
|
103
|
+
|
104
|
+
specify { expect(instance < 62401).to eql true }
|
105
|
+
specify { expect(instance < 62400).to eql false }
|
106
|
+
specify { expect(instance < 62399).to eql false }
|
107
|
+
|
108
|
+
specify { expect(instance > 62401).to eql false }
|
109
|
+
specify { expect(instance > 62400).to eql false }
|
110
|
+
specify { expect(instance > 62399).to eql true }
|
111
|
+
|
112
|
+
specify { expect(instance <= 62401).to eql true }
|
113
|
+
specify { expect(instance <= 62400).to eql true }
|
114
|
+
specify { expect(instance <= 62399).to eql false }
|
115
|
+
|
116
|
+
specify { expect(instance >= 62401).to eql false }
|
117
|
+
specify { expect(instance >= 62400).to eql true }
|
118
|
+
specify { expect(instance >= 62399).to eql true }
|
119
|
+
end
|
120
|
+
|
121
|
+
context "comparing against strings" do
|
122
|
+
specify { expect(instance == '62400').to eql true }
|
123
|
+
specify { expect(instance < '62400.1').to eql true }
|
124
|
+
specify { expect(instance > '62400').to eql false }
|
125
|
+
specify { expect(instance <= '62400.1').to eql true }
|
126
|
+
specify { expect(instance >= '62400').to eql true }
|
127
|
+
end
|
128
|
+
|
129
|
+
context "comparing against Answer::Money" do
|
130
|
+
specify { expect(instance == described_class.new(money_input)).to eql true }
|
131
|
+
|
132
|
+
specify { expect(instance < described_class.new('62,400.1')).to eql true }
|
133
|
+
specify { expect(instance < described_class.new('62,400')).to eql false }
|
134
|
+
specify { expect(instance < described_class.new('62,399.99')).to eql false }
|
135
|
+
|
136
|
+
specify { expect(instance > described_class.new('62,400.1')).to eql false }
|
137
|
+
specify { expect(instance > described_class.new('62,400')).to eql false }
|
138
|
+
specify { expect(instance > described_class.new('62,399.99')).to eql true }
|
139
|
+
|
140
|
+
specify { expect(instance <= described_class.new('62,400.1')).to eql true }
|
141
|
+
specify { expect(instance <= described_class.new('62,400')).to eql true }
|
142
|
+
specify { expect(instance <= described_class.new('62,399.99')).to eql false }
|
143
|
+
|
144
|
+
specify { expect(instance >= described_class.new('62,400.1')).to eql false }
|
145
|
+
specify { expect(instance >= described_class.new('62,400')).to eql true }
|
146
|
+
specify { expect(instance >= described_class.new('62,399.99')).to eql true }
|
147
|
+
end
|
148
|
+
end
|
38
149
|
end
|
@@ -1,5 +1,6 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
require 'smartdown/model/answer/date'
|
3
|
+
require 'smartdown/model/answer/money'
|
3
4
|
require 'smartdown/model/element/question/date'
|
4
5
|
|
5
6
|
describe Smartdown::Model::Answer::Salary do
|
@@ -11,7 +12,7 @@ describe Smartdown::Model::Answer::Salary do
|
|
11
12
|
specify { expect(instance.amount_per_period).to eql(500.00) }
|
12
13
|
|
13
14
|
it "as a string, it should declare itself in the initial format provided" do
|
14
|
-
expect(instance.to_s).to eql("500
|
15
|
+
expect(instance.to_s).to eql("500-week")
|
15
16
|
end
|
16
17
|
|
17
18
|
describe "#humanize" do
|
@@ -71,7 +72,6 @@ describe Smartdown::Model::Answer::Salary do
|
|
71
72
|
expect(instance.error).to eql("Please answer this question")
|
72
73
|
end
|
73
74
|
end
|
74
|
-
|
75
75
|
end
|
76
76
|
|
77
77
|
context "declared by week" do
|
@@ -89,7 +89,6 @@ describe Smartdown::Model::Answer::Salary do
|
|
89
89
|
specify { expect(instance.value).to eql 20000.0 }
|
90
90
|
end
|
91
91
|
|
92
|
-
|
93
92
|
describe "comparisons" do
|
94
93
|
let(:salary_string) { "1200-week" } # equivalent to 62,400 yearly or 5200 monthly
|
95
94
|
|
@@ -136,7 +135,7 @@ describe Smartdown::Model::Answer::Salary do
|
|
136
135
|
specify { expect(instance >= "5199.9-month").to eql true }
|
137
136
|
end
|
138
137
|
|
139
|
-
context "comparing against Answer::
|
138
|
+
context "comparing against Answer::Salary" do
|
140
139
|
specify { expect(instance == described_class.new("1200-week")).to eql true }
|
141
140
|
|
142
141
|
specify { expect(instance < described_class.new("1200.1-week")).to eql true }
|
@@ -0,0 +1,70 @@
|
|
1
|
+
require 'smartdown/model/element/question'
|
2
|
+
|
3
|
+
describe Smartdown::Model::Element::Question do
|
4
|
+
|
5
|
+
let(:elements) { [
|
6
|
+
Smartdown::Model::Element::Question::Money.new('10.30'),
|
7
|
+
Smartdown::Model::Element::Question::Date.new('2014-10-01')
|
8
|
+
] }
|
9
|
+
|
10
|
+
describe 'constants()' do
|
11
|
+
it 'has expected order' do
|
12
|
+
expect(described_class.constants).to eq [
|
13
|
+
:MultipleChoice,
|
14
|
+
:Country,
|
15
|
+
:Date,
|
16
|
+
:Money,
|
17
|
+
:Salary,
|
18
|
+
:Text,
|
19
|
+
:Postcode
|
20
|
+
]
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
describe 'create_question_answer()' do
|
25
|
+
|
26
|
+
context 'with no matching elements' do
|
27
|
+
before do
|
28
|
+
@question, @answer = described_class.create_question_answer([])
|
29
|
+
end
|
30
|
+
|
31
|
+
it 'does not create question or answer' do
|
32
|
+
expect(@question).to be_nil
|
33
|
+
expect(@answer).to be_nil
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
context 'with response value not given' do
|
38
|
+
before do
|
39
|
+
@question, @answer = described_class.create_question_answer(elements)
|
40
|
+
end
|
41
|
+
|
42
|
+
it 'should create question with correct class' do
|
43
|
+
expect(@question).to be_a Smartdown::Api::DateQuestion
|
44
|
+
end
|
45
|
+
|
46
|
+
it 'should not create answer' do
|
47
|
+
expect(@answer).to be_nil
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
context 'with response value given' do
|
52
|
+
before do
|
53
|
+
@question, @answer = described_class.create_question_answer(elements, '2014-10-01')
|
54
|
+
end
|
55
|
+
|
56
|
+
it 'should create question with correct class' do
|
57
|
+
expect(@question).to be_a Smartdown::Api::DateQuestion
|
58
|
+
end
|
59
|
+
|
60
|
+
it 'should create answer with correct class' do
|
61
|
+
expect(@answer).to be_a Smartdown::Model::Answer::Date
|
62
|
+
end
|
63
|
+
|
64
|
+
it 'should create answer with correct value' do
|
65
|
+
expect(@answer.value.to_s).to eq('2014-10-01')
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
@@ -0,0 +1,57 @@
|
|
1
|
+
require 'smartdown/parser/node_parser'
|
2
|
+
require 'smartdown/parser/node_interpreter'
|
3
|
+
require 'smartdown/parser/element/money_question'
|
4
|
+
|
5
|
+
describe Smartdown::Parser::Element::MoneyQuestion do
|
6
|
+
subject(:parser) { described_class.new }
|
7
|
+
|
8
|
+
context 'with question tag' do
|
9
|
+
let(:source) { '[money: court_fee]' }
|
10
|
+
|
11
|
+
it 'parses' do
|
12
|
+
should parse(source).as(
|
13
|
+
money: {
|
14
|
+
identifier: 'court_fee',
|
15
|
+
option_pairs:[],
|
16
|
+
}
|
17
|
+
)
|
18
|
+
end
|
19
|
+
|
20
|
+
describe 'transformed' do
|
21
|
+
let(:node_name) { 'my_node' }
|
22
|
+
subject(:transformed) {
|
23
|
+
Smartdown::Parser::NodeInterpreter.new(node_name, source, parser: parser).interpret
|
24
|
+
}
|
25
|
+
|
26
|
+
it { should eq(Smartdown::Model::Element::Question::Money.new('court_fee')) }
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
context 'with question tag and alias' do
|
31
|
+
let(:source) { '[money: court_fee, alias: claim_fee]' }
|
32
|
+
|
33
|
+
it 'parses' do
|
34
|
+
should parse(source).as(
|
35
|
+
money: {
|
36
|
+
identifier: 'court_fee',
|
37
|
+
option_pairs: [
|
38
|
+
{
|
39
|
+
key: 'alias',
|
40
|
+
value: 'claim_fee',
|
41
|
+
}
|
42
|
+
]
|
43
|
+
}
|
44
|
+
)
|
45
|
+
end
|
46
|
+
|
47
|
+
describe 'transformed' do
|
48
|
+
let(:node_name) { 'my_node' }
|
49
|
+
subject(:transformed) {
|
50
|
+
Smartdown::Parser::NodeInterpreter.new(node_name, source, parser: parser).interpret
|
51
|
+
}
|
52
|
+
|
53
|
+
it { should eq(Smartdown::Model::Element::Question::Money.new('court_fee', 'claim_fee')) }
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
end
|
@@ -3,10 +3,7 @@ require 'smartdown/model/node'
|
|
3
3
|
require 'smartdown/model/element/markdown_heading'
|
4
4
|
require 'smartdown/model/element/markdown_line'
|
5
5
|
require 'smartdown/model/element/start_button'
|
6
|
-
require 'smartdown/model/element/question
|
7
|
-
require 'smartdown/model/element/question/date'
|
8
|
-
require 'smartdown/model/element/question/salary'
|
9
|
-
require 'smartdown/model/element/question/text'
|
6
|
+
require 'smartdown/model/element/question'
|
10
7
|
require 'smartdown/model/element/conditional'
|
11
8
|
require 'smartdown/model/next_node_rules'
|
12
9
|
require 'smartdown/model/rule'
|
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.
|
4
|
+
version: 0.13.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2015-01-
|
12
|
+
date: 2015-01-15 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: parslet
|
16
|
-
requirement: &
|
16
|
+
requirement: &16864100 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ~>
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: 1.6.2
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *16864100
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: uk_postcode
|
27
|
-
requirement: &
|
27
|
+
requirement: &16863580 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ~>
|
@@ -32,10 +32,10 @@ dependencies:
|
|
32
32
|
version: 1.0.1
|
33
33
|
type: :runtime
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *16863580
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: rspec
|
38
|
-
requirement: &
|
38
|
+
requirement: &16863120 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ~>
|
@@ -43,10 +43,10 @@ dependencies:
|
|
43
43
|
version: 3.0.0
|
44
44
|
type: :development
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *16863120
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: rake
|
49
|
-
requirement: &
|
49
|
+
requirement: &16862640 !ruby/object:Gem::Requirement
|
50
50
|
none: false
|
51
51
|
requirements:
|
52
52
|
- - ! '>='
|
@@ -54,10 +54,10 @@ dependencies:
|
|
54
54
|
version: '0'
|
55
55
|
type: :development
|
56
56
|
prerelease: false
|
57
|
-
version_requirements: *
|
57
|
+
version_requirements: *16862640
|
58
58
|
- !ruby/object:Gem::Dependency
|
59
59
|
name: pry
|
60
|
-
requirement: &
|
60
|
+
requirement: &16862140 !ruby/object:Gem::Requirement
|
61
61
|
none: false
|
62
62
|
requirements:
|
63
63
|
- - ! '>='
|
@@ -65,10 +65,10 @@ dependencies:
|
|
65
65
|
version: '0'
|
66
66
|
type: :development
|
67
67
|
prerelease: false
|
68
|
-
version_requirements: *
|
68
|
+
version_requirements: *16862140
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: gem_publisher
|
71
|
-
requirement: &
|
71
|
+
requirement: &16861580 !ruby/object:Gem::Requirement
|
72
72
|
none: false
|
73
73
|
requirements:
|
74
74
|
- - ! '>='
|
@@ -76,10 +76,10 @@ dependencies:
|
|
76
76
|
version: '0'
|
77
77
|
type: :development
|
78
78
|
prerelease: false
|
79
|
-
version_requirements: *
|
79
|
+
version_requirements: *16861580
|
80
80
|
- !ruby/object:Gem::Dependency
|
81
81
|
name: timecop
|
82
|
-
requirement: &
|
82
|
+
requirement: &16861040 !ruby/object:Gem::Requirement
|
83
83
|
none: false
|
84
84
|
requirements:
|
85
85
|
- - ! '>='
|
@@ -87,7 +87,7 @@ dependencies:
|
|
87
87
|
version: '0'
|
88
88
|
type: :development
|
89
89
|
prerelease: false
|
90
|
-
version_requirements: *
|
90
|
+
version_requirements: *16861040
|
91
91
|
description:
|
92
92
|
email: david.heath@digital.cabinet-office.gov.uk
|
93
93
|
executables:
|
@@ -112,6 +112,7 @@ files:
|
|
112
112
|
- lib/smartdown/parser/element/markdown_blank_line.rb
|
113
113
|
- lib/smartdown/parser/element/salary_question.rb
|
114
114
|
- lib/smartdown/parser/element/postcode_question.rb
|
115
|
+
- lib/smartdown/parser/element/money_question.rb
|
115
116
|
- lib/smartdown/parser/element/conditional.rb
|
116
117
|
- lib/smartdown/parser/element/start_button.rb
|
117
118
|
- lib/smartdown/parser/element/front_matter.rb
|
@@ -130,6 +131,7 @@ files:
|
|
130
131
|
- lib/smartdown/api/postcode_question.rb
|
131
132
|
- lib/smartdown/api/flow.rb
|
132
133
|
- lib/smartdown/api/question_page.rb
|
134
|
+
- lib/smartdown/api/money_question.rb
|
133
135
|
- lib/smartdown/api/state.rb
|
134
136
|
- lib/smartdown/api/node.rb
|
135
137
|
- lib/smartdown/api/directory_input.rb
|
@@ -174,6 +176,7 @@ files:
|
|
174
176
|
- lib/smartdown/model/answer/money.rb
|
175
177
|
- lib/smartdown/model/answer/multiple_choice.rb
|
176
178
|
- lib/smartdown/model/answer/text.rb
|
179
|
+
- lib/smartdown/model/element/question.rb
|
177
180
|
- lib/smartdown/model/element/conditional.rb
|
178
181
|
- lib/smartdown/model/element/start_button.rb
|
179
182
|
- lib/smartdown/model/element/markdown_line.rb
|
@@ -183,6 +186,7 @@ files:
|
|
183
186
|
- lib/smartdown/model/element/question/salary.rb
|
184
187
|
- lib/smartdown/model/element/question/postcode.rb
|
185
188
|
- lib/smartdown/model/element/question/country.rb
|
189
|
+
- lib/smartdown/model/element/question/money.rb
|
186
190
|
- lib/smartdown/model/element/question/multiple_choice.rb
|
187
191
|
- lib/smartdown/model/element/question/text.rb
|
188
192
|
- lib/smartdown/model/next_node_rules.rb
|
@@ -212,6 +216,7 @@ files:
|
|
212
216
|
- spec/parser/element/salary_question_spec.rb
|
213
217
|
- spec/parser/element/markdown_line_spec.rb
|
214
218
|
- spec/parser/element/text_question_spec.rb
|
219
|
+
- spec/parser/element/money_question_spec.rb
|
215
220
|
- spec/parser/option_pairs_transform_spec.rb
|
216
221
|
- spec/parser/node_parser_spec.rb
|
217
222
|
- spec/parser/snippet_pre_parser_spec.rb
|
@@ -280,6 +285,7 @@ files:
|
|
280
285
|
- spec/model/answer/date_spec.rb
|
281
286
|
- spec/model/answer/postcode_spec.rb
|
282
287
|
- spec/model/answer/country_spec.rb
|
288
|
+
- spec/model/element/question_spec.rb
|
283
289
|
- spec/model/predicates/not_operation_spec.rb
|
284
290
|
- spec/model/predicates/set_membership_spec.rb
|
285
291
|
- spec/model/predicates/or_operation_spec.rb
|
@@ -303,7 +309,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
303
309
|
version: '0'
|
304
310
|
segments:
|
305
311
|
- 0
|
306
|
-
hash:
|
312
|
+
hash: 2163453024912914140
|
307
313
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
308
314
|
none: false
|
309
315
|
requirements:
|
@@ -312,7 +318,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
312
318
|
version: '0'
|
313
319
|
segments:
|
314
320
|
- 0
|
315
|
-
hash:
|
321
|
+
hash: 2163453024912914140
|
316
322
|
requirements: []
|
317
323
|
rubyforge_project:
|
318
324
|
rubygems_version: 1.8.11
|
@@ -341,6 +347,7 @@ test_files:
|
|
341
347
|
- spec/parser/element/salary_question_spec.rb
|
342
348
|
- spec/parser/element/markdown_line_spec.rb
|
343
349
|
- spec/parser/element/text_question_spec.rb
|
350
|
+
- spec/parser/element/money_question_spec.rb
|
344
351
|
- spec/parser/option_pairs_transform_spec.rb
|
345
352
|
- spec/parser/node_parser_spec.rb
|
346
353
|
- spec/parser/snippet_pre_parser_spec.rb
|
@@ -409,6 +416,7 @@ test_files:
|
|
409
416
|
- spec/model/answer/date_spec.rb
|
410
417
|
- spec/model/answer/postcode_spec.rb
|
411
418
|
- spec/model/answer/country_spec.rb
|
419
|
+
- spec/model/element/question_spec.rb
|
412
420
|
- spec/model/predicates/not_operation_spec.rb
|
413
421
|
- spec/model/predicates/set_membership_spec.rb
|
414
422
|
- spec/model/predicates/or_operation_spec.rb
|