asker-tool 2.6.0 → 2.7.1
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 +4 -4
- data/README.md +5 -5
- data/lib/asker/ai/ai.rb +6 -6
- data/lib/asker/ai/ai_calculate.rb +3 -3
- data/lib/asker/ai/code/base_code_ai.rb +5 -30
- data/lib/asker/ai/code/code_ai_factory.rb +6 -12
- data/lib/asker/ai/code/javascript_code_ai.rb +33 -34
- data/lib/asker/ai/code/python_code_ai.rb +35 -36
- data/lib/asker/ai/code/ruby_code_ai.rb +33 -33
- data/lib/asker/ai/code/sql_code_ai.rb +20 -21
- data/lib/asker/ai/concept_ai.rb +12 -22
- data/lib/asker/ai/problem/problem_ai.rb +226 -0
- data/lib/asker/ai/question.rb +34 -45
- data/lib/asker/ai/stages/base_stage.rb +7 -7
- data/lib/asker/ai/stages/stage_b.rb +62 -28
- data/lib/asker/ai/stages/stage_d.rb +10 -10
- data/lib/asker/ai/stages/stage_f.rb +17 -17
- data/lib/asker/ai/stages/stage_i.rb +8 -18
- data/lib/asker/ai/stages/stage_s.rb +28 -26
- data/lib/asker/ai/stages/stage_t.rb +40 -51
- data/lib/asker/application.rb +15 -14
- data/lib/asker/check_input/check_haml_data.rb +52 -51
- data/lib/asker/check_input/check_table.rb +17 -20
- data/lib/asker/check_input.rb +10 -23
- data/lib/asker/cli.rb +43 -24
- data/lib/asker/data/code.rb +10 -9
- data/lib/asker/data/column.rb +21 -17
- data/lib/asker/data/concept.rb +24 -37
- data/lib/asker/data/data_field.rb +2 -2
- data/lib/asker/data/problem.rb +112 -0
- data/lib/asker/data/project_data.rb +11 -15
- data/lib/asker/data/row.rb +25 -23
- data/lib/asker/data/table.rb +25 -46
- data/lib/asker/data/template.rb +7 -7
- data/lib/asker/data/world.rb +3 -3
- data/lib/asker/{formatter → deprecated}/question_moodlexml_formatter.rb +19 -21
- data/lib/asker/displayer/code_displayer.rb +10 -10
- data/lib/asker/displayer/concept_ai_displayer.erb +1 -1
- data/lib/asker/displayer/concept_ai_displayer.rb +17 -17
- data/lib/asker/displayer/concept_displayer.rb +4 -2
- data/lib/asker/displayer/problem_displayer.rb +45 -0
- data/lib/asker/displayer/stats_displayer.rb +7 -12
- data/lib/asker/exporter/code_gift_exporter.rb +2 -2
- data/lib/asker/exporter/concept_ai_gift_exporter.rb +4 -4
- data/lib/asker/exporter/concept_ai_yaml_exporter.rb +7 -7
- data/lib/asker/exporter/concept_doc_exporter.rb +5 -5
- data/lib/asker/exporter/data_gift_exporter.rb +14 -15
- data/lib/asker/exporter/data_moodle_exporter.rb +51 -20
- data/lib/asker/exporter/output_file_exporter.rb +9 -8
- data/lib/asker/exporter/problem_gift_exporter.rb +30 -0
- data/lib/asker/files/language/ca/templates.yaml +6 -0
- data/lib/asker/files/language/du/templates.yaml +6 -0
- data/lib/asker/files/language/en/templates.yaml +7 -1
- data/lib/asker/files/language/es/templates.yaml +6 -0
- data/lib/asker/files/language/fr/templates.yaml +6 -0
- data/lib/asker/formatter/code_string_formatter.rb +5 -5
- data/lib/asker/formatter/concept_doc_formatter.rb +3 -3
- data/lib/asker/formatter/concept_string_formatter.rb +6 -6
- data/lib/asker/formatter/moodle/ddmatch.erb +40 -0
- data/lib/asker/formatter/moodle/gapfill.erb +57 -0
- data/lib/asker/formatter/moodle/ordering.erb +41 -0
- data/lib/asker/formatter/question_gift_formatter.rb +41 -14
- data/lib/asker/formatter/question_hash_formatter.rb +5 -6
- data/lib/asker/formatter/question_moodle_formatter.rb +14 -7
- data/lib/asker/formatter/rb2haml_formatter.rb +8 -7
- data/lib/asker/lang/lang.rb +16 -16
- data/lib/asker/lang/lang_factory.rb +13 -16
- data/lib/asker/lang/text_actions.rb +20 -18
- data/lib/asker/loader/code_loader.rb +10 -22
- data/lib/asker/loader/content_loader.rb +42 -49
- data/lib/asker/loader/directory_loader.rb +13 -16
- data/lib/asker/loader/embedded_file.rb +14 -14
- data/lib/asker/loader/file_loader.rb +5 -4
- data/lib/asker/loader/haml_loader.rb +4 -3
- data/lib/asker/loader/image_url_loader.rb +6 -5
- data/lib/asker/loader/input_loader.rb +24 -10
- data/lib/asker/loader/problem_loader.rb +88 -0
- data/lib/asker/loader/project_loader.rb +5 -12
- data/lib/asker/logger.rb +19 -10
- data/lib/asker/skeleton.rb +19 -35
- data/lib/asker/start.rb +44 -0
- data/lib/asker/version.rb +1 -1
- data/lib/asker.rb +7 -52
- metadata +12 -6
- data/lib/asker/ai/code/problem_code_ai.rb +0 -176
- data/lib/asker/exporter/code_moodle_exporter.rb +0 -15
- data/lib/asker/exporter/concept_ai_moodle_exporter.rb +0 -15
@@ -37,12 +37,11 @@ class StageT < BaseStage
|
|
37
37
|
a = s.to_a
|
38
38
|
|
39
39
|
if s.count > 3
|
40
|
-
q = Question.new
|
41
|
-
q.set_choice
|
40
|
+
q = Question.new(:choice)
|
42
41
|
q.name = "#{name}-#{num}-t1table-#{table.name}"
|
43
42
|
q.text = random_image_for(name) \
|
44
|
-
+ lang.text_for(:t1table, name, table.fields[col1].capitalize,
|
45
|
-
|
43
|
+
+ lang.text_for(:t1table, name, table.fields[col1].capitalize,
|
44
|
+
table.fields[col2].capitalize, row[:data][col2])
|
46
45
|
q.good = row[:data][col1]
|
47
46
|
q.bads << lang.text_for(:none)
|
48
47
|
q.bads << a[2]
|
@@ -56,12 +55,11 @@ class StageT < BaseStage
|
|
56
55
|
# a = s.to_a
|
57
56
|
|
58
57
|
if s.count > 4
|
59
|
-
q = Question.new
|
60
|
-
q.set_choice
|
58
|
+
q = Question.new(:choice)
|
61
59
|
q.name = "#{name}-#{num}-t2table-#{table.name}"
|
62
60
|
q.text = random_image_for(name) \
|
63
|
-
+ lang.text_for(:t2table, name, table.fields[col1].capitalize,
|
64
|
-
|
61
|
+
+ lang.text_for(:t2table, name, table.fields[col1].capitalize,
|
62
|
+
table.fields[col2].capitalize, row[:data][col2])
|
65
63
|
q.good = lang.text_for(:none)
|
66
64
|
q.bads << a[2]
|
67
65
|
q.bads << a[3]
|
@@ -75,12 +73,11 @@ class StageT < BaseStage
|
|
75
73
|
a = s.to_a
|
76
74
|
|
77
75
|
if s.count > 3
|
78
|
-
q = Question.new
|
79
|
-
q.set_choice
|
76
|
+
q = Question.new(:choice)
|
80
77
|
q.name = "#{name}-#{num}-t3table-#{table.name}"
|
81
78
|
q.text = random_image_for(name) \
|
82
|
-
+
|
83
|
-
|
79
|
+
+ lang.text_for(:t3table, name, table.fields[col1].capitalize,
|
80
|
+
row[:data][col1], table.fields[col2].capitalize)
|
84
81
|
q.good = a[0]
|
85
82
|
q.bads << lang.text_for(:none)
|
86
83
|
q.bads << a[2]
|
@@ -94,12 +91,11 @@ class StageT < BaseStage
|
|
94
91
|
# a = s.to_a
|
95
92
|
|
96
93
|
if s.count > 4
|
97
|
-
q = Question.new
|
98
|
-
q.set_choice
|
94
|
+
q = Question.new(:choice)
|
99
95
|
q.name = "#{name}-#{num}-t4table-#{table.name}"
|
100
96
|
q.text = random_image_for(name) \
|
101
|
-
+ lang.text_for(:t4table, name, table.fields[col1].capitalize,
|
102
|
-
|
97
|
+
+ lang.text_for(:t4table, name, table.fields[col1].capitalize,
|
98
|
+
row[:data][col1], table.fields[col2].capitalize)
|
103
99
|
q.good = lang.text_for(:none)
|
104
100
|
q.bads << a[2]
|
105
101
|
q.bads << a[3]
|
@@ -108,12 +104,11 @@ class StageT < BaseStage
|
|
108
104
|
end
|
109
105
|
|
110
106
|
# Question Boolean: TRUE
|
111
|
-
q = Question.new
|
112
|
-
q.set_boolean
|
107
|
+
q = Question.new(:boolean)
|
113
108
|
q.name = "#{name}-#{num}t5table-#{table.name}"
|
114
109
|
q.text = random_image_for(name) \
|
115
|
-
+ lang.text_for(:t5table, name, table.fields[col1].capitalize,
|
116
|
-
|
110
|
+
+ lang.text_for(:t5table, name, table.fields[col1].capitalize,
|
111
|
+
row[:data][col1], table.fields[col2].capitalize, row[:data][col2])
|
117
112
|
q.good = "TRUE"
|
118
113
|
questions << q
|
119
114
|
|
@@ -123,12 +118,11 @@ class StageT < BaseStage
|
|
123
118
|
a = s.to_a
|
124
119
|
|
125
120
|
if s.count > 1
|
126
|
-
q = Question.new
|
127
|
-
q.set_boolean
|
121
|
+
q = Question.new(:boolean)
|
128
122
|
q.name = "#{name}-#{num}-t6table-#{table.name}"
|
129
123
|
q.text = random_image_for(name) \
|
130
|
-
+ lang.text_for(:t6table, name, table.fields[col1].capitalize,
|
131
|
-
|
124
|
+
+ lang.text_for(:t6table, name, table.fields[col1].capitalize,
|
125
|
+
row[:data][col1], table.fields[col2].capitalize, a[1])
|
132
126
|
q.good = "FALSE"
|
133
127
|
questions << q
|
134
128
|
end
|
@@ -138,61 +132,56 @@ class StageT < BaseStage
|
|
138
132
|
a = s.to_a
|
139
133
|
|
140
134
|
if s.count > 1
|
141
|
-
q = Question.new
|
142
|
-
q.set_boolean
|
135
|
+
q = Question.new(:boolean)
|
143
136
|
q.name = "#{name}-#{num}t7table-#{table.name}"
|
144
137
|
q.text = random_image_for(name) \
|
145
|
-
+ lang.text_for(:t7table, name, table.fields[col1].capitalize,
|
146
|
-
|
147
|
-
q.good =
|
138
|
+
+ lang.text_for(:t7table, name, table.fields[col1].capitalize,
|
139
|
+
a[1], table.fields[col2].capitalize, row[:data][col2])
|
140
|
+
q.good = "FALSE"
|
148
141
|
questions << q
|
149
142
|
end
|
150
143
|
|
151
144
|
# Question Short: column #0, 1 word
|
152
145
|
if lang.count_words(row[:data][col1]) == 1
|
153
|
-
q = Question.new
|
154
|
-
q.set_short
|
146
|
+
q = Question.new(:short)
|
155
147
|
q.name = "#{name}-#{num}t8table-#{table.name}"
|
156
148
|
q.text = random_image_for(name) \
|
157
|
-
+ lang.text_for(:t8table, name, table.fields[col2].capitalize,
|
158
|
-
|
149
|
+
+ lang.text_for(:t8table, name, table.fields[col2].capitalize,
|
150
|
+
row[:data][col2], table.fields[col1].capitalize)
|
159
151
|
q.shorts << row[:data][col1]
|
160
|
-
q.shorts << row[:data][col1].
|
152
|
+
q.shorts << row[:data][col1].tr("-", " ").tr("_", " ")
|
161
153
|
questions << q
|
162
154
|
elsif lang.count_words(row[:data][col1]) == 2
|
163
|
-
q = Question.new
|
164
|
-
q.set_short
|
155
|
+
q = Question.new(:short)
|
165
156
|
q.name = "#{name}-#{num}t9table-#{table.name}"
|
166
157
|
q.text = random_image_for(name) \
|
167
|
-
+ lang.text_for(:t9table, name, table.fields[col2].capitalize,
|
168
|
-
|
169
|
-
|
158
|
+
+ lang.text_for(:t9table, name, table.fields[col2].capitalize,
|
159
|
+
row[:data][col2], table.fields[col1].capitalize,
|
160
|
+
"[#{lang.hide_text(row[:data][col1])}]", lang.count_words(row[:data][col1]))
|
170
161
|
q.shorts << row[:data][col1]
|
171
|
-
q.shorts << row[:data][col1].
|
162
|
+
q.shorts << row[:data][col1].tr("-", " ").tr("_", " ")
|
172
163
|
questions << q
|
173
164
|
end
|
174
165
|
|
175
166
|
# Question Short: column #1, 1 word
|
176
167
|
if lang.count_words(row[:data][col2]) == 1
|
177
|
-
q = Question.new
|
178
|
-
q.set_short
|
168
|
+
q = Question.new(:short)
|
179
169
|
q.name = "#{name}-#{num}t8table-#{table.name}"
|
180
170
|
q.text = random_image_for(name) \
|
181
|
-
+ lang.text_for(:t8table, name, table.fields[col1].capitalize,
|
182
|
-
|
171
|
+
+ lang.text_for(:t8table, name, table.fields[col1].capitalize,
|
172
|
+
row[:data][col1], table.fields[col2].capitalize)
|
183
173
|
q.shorts << row[:data][col2]
|
184
|
-
q.shorts << row[:data][col2].
|
174
|
+
q.shorts << row[:data][col2].tr("-", " ").tr("_", " ")
|
185
175
|
questions << q
|
186
176
|
elsif lang.count_words(row[:data][col2]) == 2
|
187
|
-
q = Question.new
|
188
|
-
q.set_short
|
177
|
+
q = Question.new(:short)
|
189
178
|
q.name = "#{name}-#{num}t9table-#{table.name}"
|
190
179
|
q.text = random_image_for(name) \
|
191
|
-
+ lang.text_for(:t9table, name, table.fields[col1].capitalize,
|
192
|
-
|
193
|
-
|
180
|
+
+ lang.text_for(:t9table, name, table.fields[col1].capitalize,
|
181
|
+
row[:data][col1], table.fields[col2].capitalize,
|
182
|
+
"[#{lang.hide_text(row[:data][col2])}]", lang.count_words(row[:data][col2]))
|
194
183
|
q.shorts << row[:data][col2]
|
195
|
-
q.shorts << row[:data][col2].
|
184
|
+
q.shorts << row[:data][col2].tr("-", " ").tr("_", " ")
|
196
185
|
questions << q
|
197
186
|
end
|
198
187
|
questions
|
data/lib/asker/application.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
require "singleton"
|
2
2
|
require "inifile"
|
3
|
-
|
3
|
+
require_relative "logger"
|
4
4
|
require_relative "version"
|
5
5
|
|
6
6
|
# Global parameters
|
@@ -14,26 +14,27 @@ class Application
|
|
14
14
|
|
15
15
|
def reset
|
16
16
|
filename = File.join(Dir.pwd,
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
17
|
+
Asker::CONFIGFILE)
|
18
|
+
unless File.exist? filename
|
19
|
+
filename = File.join(File.dirname(__FILE__),
|
20
|
+
"files",
|
21
|
+
Asker::CONFIGFILE)
|
22
|
+
end
|
21
23
|
|
22
24
|
begin
|
23
25
|
@config = IniFile.load(filename)
|
24
|
-
rescue
|
25
|
-
|
26
|
-
|
27
|
-
puts Rainbow(" #{filename}").red.bright
|
26
|
+
rescue => e
|
27
|
+
Logger.error e.display
|
28
|
+
Logger.error "Application: Revise configuration file (#{filename})"
|
28
29
|
exit 1
|
29
30
|
end
|
30
|
-
stages = @config[
|
31
|
-
@config[
|
31
|
+
stages = @config["questions"]["stages"].split(",")
|
32
|
+
@config["questions"]["stages"] = stages.map(&:to_sym)
|
32
33
|
|
33
|
-
fractions = @config[
|
34
|
-
@config[
|
34
|
+
fractions = @config["questions"]["fractions"].split(",")
|
35
|
+
@config["questions"]["fractions"] = fractions + Array.new(5, "0")
|
35
36
|
|
36
37
|
Rainbow.enabled = false
|
37
|
-
Rainbow.enabled = true if @config[
|
38
|
+
Rainbow.enabled = true if @config["global"]["color"].downcase == "yes"
|
38
39
|
end
|
39
40
|
end
|
@@ -8,19 +8,19 @@ class CheckHamlData
|
|
8
8
|
@inputs = File.read(filepath).split("\n")
|
9
9
|
@outputs = []
|
10
10
|
@inputs.each_with_index do |line, index|
|
11
|
-
output = {
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
11
|
+
output = {id: index,
|
12
|
+
level: 0,
|
13
|
+
state: :none,
|
14
|
+
type: :none,
|
15
|
+
source: line,
|
16
|
+
msg: ""}
|
17
17
|
@outputs << output
|
18
18
|
end
|
19
19
|
@ok = false
|
20
20
|
end
|
21
21
|
|
22
22
|
def ok?
|
23
|
-
|
23
|
+
@ok
|
24
24
|
end
|
25
25
|
|
26
26
|
def show
|
@@ -36,22 +36,23 @@ class CheckHamlData
|
|
36
36
|
|
37
37
|
errors += 1
|
38
38
|
if errors < 11
|
39
|
-
data = {
|
39
|
+
data = {id: i[:id], msg: i[:msg], source: i[:source][0, 40]}
|
40
40
|
order = i[:id] + 1
|
41
|
-
data = {
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
41
|
+
data = {order: order, msg: i[:msg], source: i[:source][0, 40]}
|
42
|
+
message1 = Rainbow(" %<order>03d : %<msg>32s. => ").white
|
43
|
+
message2 = Rainbow("%<source>s").yellow.bright
|
44
|
+
output = format(message1, data) + format(message2, data)
|
45
|
+
warn output
|
46
46
|
end
|
47
|
-
|
47
|
+
warn "..." if errors == 11
|
48
48
|
end
|
49
49
|
|
50
50
|
if errors.zero?
|
51
51
|
puts Rainbow("Syntax OK!").green.bright
|
52
52
|
else
|
53
|
-
message = "\nRevise #{errors
|
54
|
-
|
53
|
+
message = "\nRevise #{errors} syntax warning or error/s\n"
|
54
|
+
warn Rainbow(message).yellow.bright
|
55
|
+
exit 1
|
55
56
|
end
|
56
57
|
end
|
57
58
|
|
@@ -82,7 +83,7 @@ class CheckHamlData
|
|
82
83
|
private
|
83
84
|
|
84
85
|
def check_empty_lines(line, index)
|
85
|
-
return unless line.strip.size.zero? || line.start_with?(
|
86
|
+
return unless line.strip.size.zero? || line.start_with?("#")
|
86
87
|
|
87
88
|
@outputs[index][:type] = :empty
|
88
89
|
@outputs[index][:level] = -1
|
@@ -92,155 +93,155 @@ class CheckHamlData
|
|
92
93
|
def check_map(line, index)
|
93
94
|
if index.zero?
|
94
95
|
@outputs[index][:type] = :map
|
95
|
-
if line.start_with?(
|
96
|
+
if line.start_with?("%map{")
|
96
97
|
@outputs[index][:state] = :ok
|
97
98
|
else
|
98
99
|
@outputs[index][:state] = :err
|
99
|
-
@outputs[index][:msg] =
|
100
|
+
@outputs[index][:msg] = "Start with %map{"
|
100
101
|
end
|
101
|
-
elsif index.positive? && line.include?(
|
102
|
+
elsif index.positive? && line.include?("%map{")
|
102
103
|
@outputs[index][:state] = :err
|
103
104
|
@outputs[index][:type] = :map
|
104
|
-
@outputs[index][:msg] =
|
105
|
+
@outputs[index][:msg] = "Write %map on line 0"
|
105
106
|
end
|
106
107
|
end
|
107
108
|
|
108
109
|
def check_concept(line, index)
|
109
110
|
return unless @outputs[index][:state] == :none
|
110
|
-
return unless line.include?
|
111
|
+
return unless line.include? "%concept"
|
111
112
|
|
112
113
|
@outputs[index][:type] = :concept
|
113
114
|
@outputs[index][:level] = 1
|
114
115
|
@outputs[index][:state] = :ok
|
115
116
|
if find_parent(index) != :map
|
116
117
|
@outputs[index][:state] = :err
|
117
|
-
@outputs[index][:msg] =
|
118
|
+
@outputs[index][:msg] = "Parent(map) not found!"
|
118
119
|
elsif !line.match(/^\s\s%concept\s*$/)
|
119
120
|
binding.break
|
120
121
|
@outputs[index][:state] = :err
|
121
|
-
@outputs[index][:msg] =
|
122
|
+
@outputs[index][:msg] = "Write 2 spaces before %concept, and no text after"
|
122
123
|
end
|
123
124
|
end
|
124
125
|
|
125
126
|
def check_names(line, index)
|
126
127
|
return unless @outputs[index][:state] == :none
|
127
|
-
return unless line.include?
|
128
|
+
return unless line.include? "%names"
|
128
129
|
|
129
130
|
@outputs[index][:type] = :names
|
130
131
|
@outputs[index][:level] = 2
|
131
132
|
@outputs[index][:state] = :ok
|
132
133
|
if find_parent(index) != :concept
|
133
134
|
@outputs[index][:state] = :err
|
134
|
-
@outputs[index][:msg] =
|
135
|
-
elsif !line.start_with?
|
135
|
+
@outputs[index][:msg] = "Parent(concept) not found!"
|
136
|
+
elsif !line.start_with? " %names"
|
136
137
|
elsif !line.match(/^\s\s\s\s%names\s/)
|
137
138
|
@outputs[index][:state] = :err
|
138
|
-
@outputs[index][:msg] =
|
139
|
+
@outputs[index][:msg] = "Write 4 spaces before %names"
|
139
140
|
end
|
140
141
|
end
|
141
142
|
|
142
143
|
def check_tags(line, index)
|
143
144
|
return unless @outputs[index][:state] == :none
|
144
|
-
return unless line.include?
|
145
|
+
return unless line.include? "%tags"
|
145
146
|
|
146
147
|
@outputs[index][:type] = :tags
|
147
148
|
@outputs[index][:level] = 2
|
148
149
|
@outputs[index][:state] = :ok
|
149
|
-
if line.strip ==
|
150
|
+
if line.strip == "%tags"
|
150
151
|
@outputs[index][:state] = :err
|
151
|
-
@outputs[index][:msg] =
|
152
|
+
@outputs[index][:msg] = "Please, fill with concept tags!"
|
152
153
|
elsif find_parent(index) != :concept
|
153
154
|
@outputs[index][:state] = :err
|
154
|
-
@outputs[index][:msg] =
|
155
|
+
@outputs[index][:msg] = "Parent(concept) not found!"
|
155
156
|
elsif !line.match(/^\s\s\s\s%tags\s/)
|
156
157
|
@outputs[index][:state] = :err
|
157
|
-
@outputs[index][:msg] =
|
158
|
+
@outputs[index][:msg] = "Write 4 spaces before %tags"
|
158
159
|
end
|
159
160
|
end
|
160
161
|
|
161
162
|
def check_def(line, index)
|
162
163
|
return unless @outputs[index][:state] == :none
|
163
|
-
return unless line.include?
|
164
|
+
return unless line.include? "%def"
|
164
165
|
|
165
166
|
@outputs[index][:type] = :def
|
166
167
|
@outputs[index][:level] = 2
|
167
168
|
@outputs[index][:state] = :ok
|
168
169
|
if find_parent(index) != :concept
|
169
170
|
@outputs[index][:state] = :err
|
170
|
-
@outputs[index][:msg] =
|
171
|
+
@outputs[index][:msg] = "Parent(concept) not found!"
|
171
172
|
elsif !line.match(/^\s\s\s\s%def[\s{]/)
|
172
173
|
@outputs[index][:state] = :err
|
173
|
-
@outputs[index][:msg] =
|
174
|
+
@outputs[index][:msg] = "Write 4 spaces before %def"
|
174
175
|
else
|
175
176
|
items = line.strip.split
|
176
177
|
if items.size < 2
|
177
178
|
@outputs[index][:state] = :err
|
178
|
-
@outputs[index][:msg] =
|
179
|
+
@outputs[index][:msg] = "%def has no definition"
|
179
180
|
end
|
180
181
|
end
|
181
182
|
end
|
182
183
|
|
183
184
|
def check_code(line, index)
|
184
185
|
return unless @outputs[index][:state] == :none
|
185
|
-
return unless line.include?
|
186
|
+
return unless line.include? "%code"
|
186
187
|
|
187
188
|
@outputs[index][:type] = :code
|
188
189
|
@outputs[index][:level] = 1
|
189
190
|
@outputs[index][:state] = :ok
|
190
191
|
if find_parent(index) != :map
|
191
192
|
@outputs[index][:state] = :err
|
192
|
-
@outputs[index][:msg] =
|
193
|
+
@outputs[index][:msg] = "Parent(map) not found!"
|
193
194
|
elsif !line.match(/^\s\s%code\s*$/)
|
194
195
|
@outputs[index][:state] = :err
|
195
|
-
@outputs[index][:msg] =
|
196
|
+
@outputs[index][:msg] = "Write 2 spaces before %code, and no text after"
|
196
197
|
end
|
197
198
|
end
|
198
199
|
|
199
200
|
def check_type(line, index)
|
200
201
|
return unless @outputs[index][:state] == :none
|
201
|
-
return unless line.include?
|
202
|
+
return unless line.include? "%type"
|
202
203
|
|
203
204
|
@outputs[index][:type] = :type
|
204
205
|
@outputs[index][:level] = 2
|
205
206
|
@outputs[index][:state] = :ok
|
206
207
|
if find_parent(index) != :code
|
207
208
|
@outputs[index][:state] = :err
|
208
|
-
@outputs[index][:msg] =
|
209
|
+
@outputs[index][:msg] = "Parent(code) not found!"
|
209
210
|
elsif !line.match(/^\s\s\s\s%type\s/)
|
210
211
|
@outputs[index][:state] = :err
|
211
|
-
@outputs[index][:msg] =
|
212
|
+
@outputs[index][:msg] = "Write 4 spaces before %type"
|
212
213
|
end
|
213
214
|
end
|
214
215
|
|
215
216
|
def check_path(line, index)
|
216
217
|
return unless @outputs[index][:state] == :none
|
217
|
-
return unless line.include?
|
218
|
+
return unless line.include? "%path"
|
218
219
|
|
219
220
|
@outputs[index][:type] = :path
|
220
221
|
@outputs[index][:level] = 2
|
221
222
|
@outputs[index][:state] = :ok
|
222
223
|
if find_parent(index) != :code
|
223
224
|
@outputs[index][:state] = :err
|
224
|
-
@outputs[index][:msg] =
|
225
|
+
@outputs[index][:msg] = "Parent(code) not found!"
|
225
226
|
elsif !line.match(/^\s\s\s\s%path\s/)
|
226
227
|
@outputs[index][:state] = :err
|
227
|
-
@outputs[index][:msg] =
|
228
|
+
@outputs[index][:msg] = "Write 4 spaces before %type"
|
228
229
|
end
|
229
230
|
end
|
230
231
|
|
231
232
|
def check_features(line, index)
|
232
233
|
return unless @outputs[index][:state] == :none
|
233
|
-
return unless line.include?
|
234
|
+
return unless line.include? "%features"
|
234
235
|
|
235
236
|
@outputs[index][:type] = :features
|
236
237
|
@outputs[index][:level] = 2
|
237
238
|
@outputs[index][:state] = :ok
|
238
239
|
if find_parent(index) != :code
|
239
240
|
@outputs[index][:state] = :err
|
240
|
-
@outputs[index][:msg] =
|
241
|
+
@outputs[index][:msg] = "Parent(code) not found!"
|
241
242
|
elsif !line.match(/^\s\s\s\s%features\s*$/)
|
242
243
|
@outputs[index][:state] = :err
|
243
|
-
@outputs[index][:msg] =
|
244
|
+
@outputs[index][:msg] = "Write 4 spaces before %features, and no text after"
|
244
245
|
end
|
245
246
|
end
|
246
247
|
|
@@ -267,7 +268,7 @@ class CheckHamlData
|
|
267
268
|
end
|
268
269
|
|
269
270
|
def count_spaces(line)
|
270
|
-
a = line.split(
|
271
|
-
a[0].count(
|
271
|
+
a = line.split("%")
|
272
|
+
a[0].count(" ")
|
272
273
|
end
|
273
274
|
end
|
@@ -1,19 +1,17 @@
|
|
1
|
-
|
2
1
|
module CheckTable
|
3
|
-
|
4
2
|
def check_table(line, index)
|
5
3
|
return unless @outputs[index][:state] == :none
|
6
|
-
return unless line.include?
|
4
|
+
return unless line.include? "%table"
|
7
5
|
|
8
6
|
@outputs[index][:type] = :table
|
9
7
|
@outputs[index][:level] = 2
|
10
8
|
@outputs[index][:state] = :ok
|
11
9
|
if find_parent(index) != :concept
|
12
10
|
@outputs[index][:state] = :err
|
13
|
-
@outputs[index][:msg] =
|
11
|
+
@outputs[index][:msg] = "Parent(concept) not found!"
|
14
12
|
elsif !line.match(/^\s\s\s\s%table\s*/)
|
15
13
|
@outputs[index][:state] = :err
|
16
|
-
@outputs[index][:msg] =
|
14
|
+
@outputs[index][:msg] = "Write 4 spaces before %table"
|
17
15
|
end
|
18
16
|
|
19
17
|
unless line.include? "%table{"
|
@@ -29,7 +27,7 @@ module CheckTable
|
|
29
27
|
|
30
28
|
def check_row(line, index)
|
31
29
|
return unless @outputs[index][:state] == :none
|
32
|
-
return unless line.include?
|
30
|
+
return unless line.include? "%row"
|
33
31
|
|
34
32
|
@outputs[index][:type] = :row
|
35
33
|
@outputs[index][:state] = :ok
|
@@ -40,23 +38,23 @@ module CheckTable
|
|
40
38
|
parent = find_parent(index)
|
41
39
|
unless %i[table template features].include? parent
|
42
40
|
@outputs[index][:state] = :err
|
43
|
-
@outputs[index][:msg] =
|
41
|
+
@outputs[index][:msg] = "Parent(table/template/features) not found!"
|
44
42
|
end
|
45
43
|
when 8
|
46
44
|
@outputs[index][:level] = 4
|
47
45
|
if find_parent(index) != :template
|
48
46
|
@outputs[index][:state] = :err
|
49
|
-
@outputs[index][:msg] =
|
47
|
+
@outputs[index][:msg] = "Parent(template) not found!"
|
50
48
|
end
|
51
49
|
else
|
52
50
|
@outputs[index][:state] = :err
|
53
|
-
@outputs[index][:msg] =
|
51
|
+
@outputs[index][:msg] = "Write 6 or 8 spaces before %row"
|
54
52
|
end
|
55
53
|
end
|
56
54
|
|
57
55
|
def check_col(line, index)
|
58
56
|
return unless @outputs[index][:state] == :none
|
59
|
-
return unless line.include?
|
57
|
+
return unless line.include? "%col"
|
60
58
|
|
61
59
|
@outputs[index][:type] = :col
|
62
60
|
@outputs[index][:state] = :ok
|
@@ -64,9 +62,8 @@ module CheckTable
|
|
64
62
|
# row parent requires empty msg
|
65
63
|
if @outputs[index - 1][:type] == :row
|
66
64
|
if @outputs[index - 1][:source].strip != "%row"
|
67
|
-
require "debug"; binding.break
|
68
65
|
@outputs[index - 1][:state] = :err
|
69
|
-
@outputs[index - 1
|
66
|
+
@outputs[index - 1][:msg] = "Row with cols requires empty text!"
|
70
67
|
end
|
71
68
|
end
|
72
69
|
|
@@ -75,17 +72,17 @@ module CheckTable
|
|
75
72
|
@outputs[index][:level] = 4
|
76
73
|
if find_parent(index) != :row
|
77
74
|
@outputs[index][:state] = :err
|
78
|
-
@outputs[index][:msg] =
|
75
|
+
@outputs[index][:msg] = "Parent(row) not found!"
|
79
76
|
end
|
80
77
|
when 10
|
81
78
|
@outputs[index][:level] = 5
|
82
79
|
if find_parent(index) != :row
|
83
80
|
@outputs[index][:state] = :err
|
84
|
-
@outputs[index][:msg] =
|
81
|
+
@outputs[index][:msg] = "Parent(row) not found!"
|
85
82
|
end
|
86
83
|
else
|
87
84
|
@outputs[index][:state] = :err
|
88
|
-
@outputs[index][:msg] =
|
85
|
+
@outputs[index][:msg] = "Write 8 or 10 spaces before %col"
|
89
86
|
end
|
90
87
|
check_text(line, index)
|
91
88
|
end
|
@@ -93,11 +90,11 @@ module CheckTable
|
|
93
90
|
def check_text(line, index)
|
94
91
|
return unless @outputs[index][:state] == :ok
|
95
92
|
|
96
|
-
ok =
|
93
|
+
ok = ""
|
97
94
|
%w[< >].each do |char|
|
98
95
|
ok = char if line.include? char
|
99
96
|
end
|
100
|
-
return if ok ==
|
97
|
+
return if ok == ""
|
101
98
|
|
102
99
|
@outputs[index][:state] = :err
|
103
100
|
@outputs[index][:msg] = "Char #{ok} not allow!"
|
@@ -105,17 +102,17 @@ module CheckTable
|
|
105
102
|
|
106
103
|
def check_template(line, index)
|
107
104
|
return unless @outputs[index][:state] == :none
|
108
|
-
return unless line.include?
|
105
|
+
return unless line.include? "%template"
|
109
106
|
|
110
107
|
@outputs[index][:type] = :template
|
111
108
|
@outputs[index][:level] = 3
|
112
109
|
@outputs[index][:state] = :ok
|
113
110
|
if find_parent(index) != :table
|
114
111
|
@outputs[index][:state] = :err
|
115
|
-
@outputs[index][:msg] =
|
112
|
+
@outputs[index][:msg] = "Parent(concept) not found!"
|
116
113
|
elsif !line.match(/^\s\s\s\s\s\s%template\s*/)
|
117
114
|
@outputs[index][:state] = :err
|
118
|
-
@outputs[index][:msg] =
|
115
|
+
@outputs[index][:msg] = "Write 6 spaces before %template"
|
119
116
|
end
|
120
117
|
end
|
121
118
|
end
|
data/lib/asker/check_input.rb
CHANGED
@@ -1,22 +1,9 @@
|
|
1
|
-
|
2
|
-
require_relative
|
1
|
+
require_relative "check_input/check_haml_data"
|
2
|
+
require_relative "logger"
|
3
3
|
|
4
4
|
class CheckInput
|
5
|
-
def
|
6
|
-
@verbose = verbose
|
7
|
-
end
|
8
|
-
|
9
|
-
def file(filepath)
|
5
|
+
def check(filepath)
|
10
6
|
@filepath = filepath
|
11
|
-
self
|
12
|
-
end
|
13
|
-
|
14
|
-
def verbose(verbose)
|
15
|
-
@verbose = verbose
|
16
|
-
self
|
17
|
-
end
|
18
|
-
|
19
|
-
def check
|
20
7
|
# Check HAML file syntax
|
21
8
|
exist = check_file_exist
|
22
9
|
return false unless exist
|
@@ -27,16 +14,16 @@ class CheckInput
|
|
27
14
|
|
28
15
|
def check_file_exist
|
29
16
|
if @filepath.nil?
|
30
|
-
|
31
|
-
|
17
|
+
Logger.error "CheckInput: Unknown filename"
|
18
|
+
exit 1
|
32
19
|
end
|
33
20
|
unless File.exist? @filepath
|
34
|
-
|
35
|
-
|
21
|
+
Logger.error "CheckInput: File not found! (#{@filepath})"
|
22
|
+
exit 1
|
36
23
|
end
|
37
|
-
unless File.extname(@filepath) ==
|
38
|
-
|
39
|
-
|
24
|
+
unless File.extname(@filepath) == ".haml"
|
25
|
+
Logger.error "CheckInput: Check works with HAML files!"
|
26
|
+
exit 1
|
40
27
|
end
|
41
28
|
true
|
42
29
|
end
|