asker-tool 2.1.3 → 2.2.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.
- checksums.yaml +4 -4
- data/README.md +18 -19
- data/bin/asker +2 -1
- data/lib/asker/ai/ai.rb +10 -3
- data/lib/asker/ai/ai_calculate.rb +20 -6
- data/lib/asker/ai/code/base_code_ai.rb +104 -0
- data/lib/asker/{code/ai → ai/code}/code_ai_factory.rb +11 -1
- data/lib/asker/{code/ai → ai/code}/javascript_code_ai.rb +2 -5
- data/lib/asker/ai/code/problem_code_ai.rb +176 -0
- data/lib/asker/{code/ai → ai/code}/python_code_ai.rb +2 -5
- data/lib/asker/{code/ai → ai/code}/ruby_code_ai.rb +14 -7
- data/lib/asker/{code/ai → ai/code}/sql_code_ai.rb +2 -5
- data/lib/asker/ai/concept_ai.rb +12 -2
- data/lib/asker/ai/question.rb +28 -6
- data/lib/asker/ai/stages/base_stage.rb +45 -6
- data/lib/asker/ai/stages/stage_b.rb +100 -50
- data/lib/asker/ai/stages/stage_d.rb +75 -90
- data/lib/asker/ai/stages/stage_f.rb +64 -36
- data/lib/asker/ai/stages/stage_i.rb +79 -92
- data/lib/asker/ai/stages/stage_s.rb +41 -36
- data/lib/asker/ai/stages/stage_t.rb +149 -108
- data/lib/asker/application.rb +24 -7
- data/lib/asker/checker.rb +149 -52
- data/lib/asker/cli.rb +37 -32
- data/lib/asker/data/code.rb +76 -0
- data/lib/asker/data/column.rb +31 -21
- data/lib/asker/data/concept.rb +108 -65
- data/lib/asker/data/data_field.rb +14 -0
- data/lib/asker/data/row.rb +75 -52
- data/lib/asker/data/table.rb +91 -42
- data/lib/asker/data/template.rb +3 -1
- data/lib/asker/data/world.rb +61 -32
- data/lib/asker/{exporter/code_screen_exporter.rb → displayer/code_displayer.rb} +13 -6
- data/lib/asker/displayer/concept_ai_displayer.erb +10 -0
- data/lib/asker/displayer/concept_ai_displayer.rb +133 -0
- data/lib/asker/displayer/concept_displayer.rb +34 -0
- data/lib/asker/displayer/stats_displayer.rb +22 -0
- data/lib/asker/exporter/code_gift_exporter.rb +10 -11
- data/lib/asker/exporter/concept_ai_gift_exporter.rb +21 -13
- data/lib/asker/exporter/concept_ai_moodle_exporter.rb +44 -0
- data/lib/asker/exporter/concept_ai_yaml_exporter.rb +14 -9
- data/lib/asker/exporter/concept_doc_exporter.rb +21 -14
- data/lib/asker/exporter/data_gift_exporter.rb +29 -0
- data/lib/asker/exporter/output_file_exporter.rb +21 -0
- data/lib/asker/files/{config.ini → asker.ini} +48 -1
- data/lib/asker/files/example-concept.haml +24 -8
- data/lib/asker/files/language/du/connectors.yaml +81 -0
- data/lib/asker/files/language/du/mistakes.yaml +82 -0
- data/lib/asker/files/language/du/templates.yaml +29 -0
- data/lib/asker/files/language/en/connectors.yaml +44 -0
- data/lib/asker/files/language/en/mistakes.yaml +37 -0
- data/lib/asker/files/language/en/templates.yaml +29 -0
- data/lib/asker/files/language/es/connectors.yaml +92 -0
- data/lib/asker/files/language/es/mistakes.yaml +84 -0
- data/lib/asker/files/language/es/templates.yaml +29 -0
- data/lib/asker/files/language/fr/connectors.yaml +76 -0
- data/lib/asker/files/language/fr/mistakes.yaml +82 -0
- data/lib/asker/files/language/fr/templates.yaml +29 -0
- data/lib/asker/files/language/javascript/connectors.yaml +11 -0
- data/lib/asker/files/language/javascript/mistakes.yaml +30 -0
- data/lib/asker/files/language/javascript/templates.yaml +3 -0
- data/lib/asker/files/language/math/connectors.yaml +2 -0
- data/lib/asker/files/language/math/mistakes.yaml +2 -0
- data/lib/asker/files/language/math/templates.yaml +1 -0
- data/lib/asker/files/language/python/connectors.yaml +11 -0
- data/lib/asker/files/language/python/mistakes.yaml +26 -0
- data/lib/asker/files/language/python/templates.yaml +3 -0
- data/lib/asker/files/language/ruby/connectors.yaml +11 -0
- data/lib/asker/files/language/ruby/mistakes.yaml +33 -0
- data/lib/asker/files/language/ruby/templates.yaml +3 -0
- data/lib/asker/files/language/sql/connectors.yaml +6 -0
- data/lib/asker/files/language/sql/mistakes.yaml +11 -0
- data/lib/asker/files/language/sql/templates.yaml +2 -0
- data/lib/asker/formatter/concept_string_formatter.rb +13 -9
- data/lib/asker/formatter/moodle/matching.erb +38 -0
- data/lib/asker/formatter/moodle/multichoice.erb +49 -0
- data/lib/asker/formatter/moodle/shortanswer.erb +30 -0
- data/lib/asker/formatter/moodle/truefalse.erb +47 -0
- data/lib/asker/formatter/question_gift_formatter.rb +30 -20
- data/lib/asker/formatter/question_moodle_formatter.rb +27 -0
- data/lib/asker/lang/lang.rb +18 -12
- data/lib/asker/lang/lang_factory.rb +32 -5
- data/lib/asker/lang/text_actions.rb +87 -69
- data/lib/asker/loader/code_loader.rb +4 -4
- data/lib/asker/loader/content_loader.rb +16 -12
- data/lib/asker/loader/directory_loader.rb +3 -3
- data/lib/asker/loader/embedded_file.rb +42 -0
- data/lib/asker/loader/file_loader.rb +3 -12
- data/lib/asker/loader/haml_loader.rb +15 -0
- data/lib/asker/loader/image_url_loader.rb +9 -11
- data/lib/asker/loader/input_loader.rb +24 -8
- data/lib/asker/loader/project_loader.rb +42 -30
- data/lib/asker/logger.rb +30 -6
- data/lib/asker/project.rb +28 -117
- data/lib/asker/skeleton.rb +40 -29
- data/lib/asker.rb +68 -79
- metadata +57 -74
- data/docs/changelog/v2.1.md +0 -99
- data/docs/commands.md +0 -12
- data/docs/contributions.md +0 -18
- data/docs/history.md +0 -40
- data/docs/idea.md +0 -44
- data/docs/inputs/README.md +0 -39
- data/docs/inputs/code.md +0 -69
- data/docs/inputs/concepts.md +0 -142
- data/docs/inputs/jedi.md +0 -68
- data/docs/inputs/tables.md +0 -112
- data/docs/inputs/templates.md +0 -87
- data/docs/install/README.md +0 -38
- data/docs/install/manual.md +0 -26
- data/docs/install/scripts.md +0 -38
- data/docs/revise/asker-file.md +0 -41
- data/docs/revise/buenas-practicas/01-convocatoria.md +0 -30
- data/docs/revise/buenas-practicas/02-formulario.md +0 -35
- data/docs/revise/buenas-practicas/03-descripcion.md +0 -63
- data/docs/revise/buenas-practicas/04-resultados.md +0 -17
- data/docs/revise/buenas-practicas/05-reproducir.md +0 -10
- data/docs/revise/ejemplos/01/README.md +0 -27
- data/docs/revise/ejemplos/02/README.md +0 -31
- data/docs/revise/ejemplos/03/README.md +0 -31
- data/docs/revise/ejemplos/04/README.md +0 -37
- data/docs/revise/ejemplos/05/README.md +0 -25
- data/docs/revise/ejemplos/06/README.md +0 -43
- data/docs/revise/ejemplos/README.md +0 -11
- data/docs/revise/projects.md +0 -74
- data/lib/asker/code/ai/base_code_ai.rb +0 -48
- data/lib/asker/code/code.rb +0 -53
- data/lib/asker/exporter/concept_ai_screen_exporter.rb +0 -115
- data/lib/asker/exporter/concept_screen_exporter.rb +0 -25
- data/lib/asker/exporter/main.rb +0 -9
data/lib/asker/checker.rb
CHANGED
|
@@ -1,29 +1,46 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
1
2
|
|
|
2
3
|
require 'rainbow'
|
|
3
4
|
|
|
5
|
+
##
|
|
6
|
+
# Check HAML file syntax
|
|
4
7
|
module Checker
|
|
8
|
+
##
|
|
9
|
+
# Check:
|
|
10
|
+
# * file exist
|
|
11
|
+
# * filename extension
|
|
12
|
+
# * and HAML syntax
|
|
13
|
+
# @param filepath (String)
|
|
5
14
|
def self.check(filepath)
|
|
6
15
|
unless File.exist? filepath
|
|
7
|
-
puts Rainbow(
|
|
16
|
+
puts Rainbow('File not found!').red.bright
|
|
8
17
|
return false
|
|
9
18
|
end
|
|
10
19
|
unless File.extname(filepath) == '.haml'
|
|
11
|
-
puts Rainbow(
|
|
20
|
+
puts Rainbow('Only check HAML files!').yellow.bright
|
|
12
21
|
return false
|
|
13
22
|
end
|
|
14
23
|
check_filepath(filepath)
|
|
15
24
|
end
|
|
16
25
|
|
|
26
|
+
##
|
|
27
|
+
# Check HAML syntax
|
|
28
|
+
# @param filepath (String)
|
|
17
29
|
def self.check_filepath(filepath)
|
|
18
30
|
data = Data.new(filepath)
|
|
19
31
|
data.check
|
|
20
32
|
data.show_errors
|
|
21
|
-
data.
|
|
33
|
+
data.ok?
|
|
22
34
|
end
|
|
23
35
|
|
|
36
|
+
##
|
|
37
|
+
# Internal class that revise syntax
|
|
38
|
+
# rubocop:disable Metrics/ClassLength
|
|
24
39
|
class Data
|
|
25
40
|
attr_reader :inputs
|
|
26
41
|
attr_reader :outputs
|
|
42
|
+
|
|
43
|
+
# rubocop:disable Metrics/MethodLength
|
|
27
44
|
def initialize(filepath)
|
|
28
45
|
@inputs = File.read(filepath).split("\n")
|
|
29
46
|
@outputs = []
|
|
@@ -38,8 +55,9 @@ module Checker
|
|
|
38
55
|
end
|
|
39
56
|
@ok = false
|
|
40
57
|
end
|
|
58
|
+
# rubocop:enable Metrics/MethodLength
|
|
41
59
|
|
|
42
|
-
def
|
|
60
|
+
def ok?
|
|
43
61
|
@ok
|
|
44
62
|
end
|
|
45
63
|
|
|
@@ -49,18 +67,33 @@ module Checker
|
|
|
49
67
|
end
|
|
50
68
|
end
|
|
51
69
|
|
|
70
|
+
# rubocop:disable Metrics/AbcSize
|
|
71
|
+
# rubocop:disable Metrics/MethodLength
|
|
52
72
|
def show_errors
|
|
53
73
|
errors = 0
|
|
74
|
+
# puts "Line : Error description"
|
|
54
75
|
@outputs.each do |i|
|
|
55
76
|
next if i[:state] == :ok
|
|
77
|
+
|
|
56
78
|
errors += 1
|
|
57
|
-
|
|
58
|
-
|
|
79
|
+
if errors < 11
|
|
80
|
+
data = { id: i[:id], msg: i[:msg], source: i[:source][0, 40] }
|
|
81
|
+
puts format(' %<id>03d : %<msg>s. => %<source>s', data)
|
|
82
|
+
end
|
|
83
|
+
puts '...' if errors == 11
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
if errors.positive?
|
|
87
|
+
puts Rainbow("[ERROR] #{errors} errors " \
|
|
88
|
+
"from #{@inputs.size} lines!").red.bright
|
|
59
89
|
end
|
|
60
|
-
puts Rainbow(
|
|
61
|
-
puts Rainbow("Syntax OK!").green if errors == 0
|
|
90
|
+
puts Rainbow('Syntax OK!').green if errors.zero?
|
|
62
91
|
end
|
|
92
|
+
# rubocop:enable Metrics/AbcSize
|
|
93
|
+
# rubocop:enable Metrics/MethodLength
|
|
63
94
|
|
|
95
|
+
# rubocop:disable Metrics/MethodLength
|
|
96
|
+
# rubocop:disable Metrics/AbcSize
|
|
64
97
|
def check
|
|
65
98
|
@ok = true
|
|
66
99
|
@inputs.each_with_index do |line, index|
|
|
@@ -84,31 +117,41 @@ module Checker
|
|
|
84
117
|
end
|
|
85
118
|
@ok
|
|
86
119
|
end
|
|
120
|
+
# rubocop:enable Metrics/MethodLength
|
|
121
|
+
# rubocop:enable Metrics/AbcSize
|
|
122
|
+
|
|
123
|
+
private
|
|
87
124
|
|
|
88
125
|
def check_empty_lines(line, index)
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
126
|
+
return unless line.strip.size.zero? || line.start_with?('#')
|
|
127
|
+
|
|
128
|
+
@outputs[index][:type] = :empty
|
|
129
|
+
@outputs[index][:level] = -1
|
|
130
|
+
@outputs[index][:state] = :ok
|
|
94
131
|
end
|
|
95
132
|
|
|
133
|
+
# rubocop:disable Metrics/MethodLength
|
|
134
|
+
# rubocop:disable Metrics/AbcSize
|
|
96
135
|
def check_map(line, index)
|
|
97
|
-
if index
|
|
136
|
+
if index.zero?
|
|
98
137
|
@outputs[index][:type] = :map
|
|
99
138
|
if line.start_with?('%map{')
|
|
100
139
|
@outputs[index][:state] = :ok
|
|
101
140
|
else
|
|
102
141
|
@outputs[index][:state] = :err
|
|
103
|
-
@outputs[index][:msg] =
|
|
142
|
+
@outputs[index][:msg] = 'Start with %map{'
|
|
104
143
|
end
|
|
105
|
-
elsif index
|
|
144
|
+
elsif index.positive? && line.include?('%map{')
|
|
106
145
|
@outputs[index][:state] = :err
|
|
107
146
|
@outputs[index][:type] = :map
|
|
108
|
-
@outputs[index][:msg] =
|
|
147
|
+
@outputs[index][:msg] = 'Write %map on line 0'
|
|
109
148
|
end
|
|
110
149
|
end
|
|
150
|
+
# rubocop:enable Metrics/MethodLength
|
|
151
|
+
# rubocop:enable Metrics/AbcSize
|
|
111
152
|
|
|
153
|
+
# rubocop:disable Metrics/MethodLength
|
|
154
|
+
# rubocop:disable Metrics/AbcSize
|
|
112
155
|
def check_concept(line, index)
|
|
113
156
|
return unless @outputs[index][:state] == :none
|
|
114
157
|
return unless line.include? '%concept'
|
|
@@ -124,7 +167,11 @@ module Checker
|
|
|
124
167
|
@outputs[index][:msg] = 'Write 2 spaces before %concept'
|
|
125
168
|
end
|
|
126
169
|
end
|
|
170
|
+
# rubocop:enable Metrics/MethodLength
|
|
171
|
+
# rubocop:enable Metrics/AbcSize
|
|
127
172
|
|
|
173
|
+
# rubocop:disable Metrics/AbcSize
|
|
174
|
+
# rubocop:disable Metrics/MethodLength
|
|
128
175
|
def check_names(line, index)
|
|
129
176
|
return unless @outputs[index][:state] == :none
|
|
130
177
|
return unless line.include? '%names'
|
|
@@ -135,12 +182,16 @@ module Checker
|
|
|
135
182
|
if find_parent(index) != :concept
|
|
136
183
|
@outputs[index][:state] = :err
|
|
137
184
|
@outputs[index][:msg] = 'Parent(concept) not found!'
|
|
138
|
-
elsif
|
|
185
|
+
elsif !line.start_with? ' %names'
|
|
139
186
|
@outputs[index][:state] = :err
|
|
140
|
-
@outputs[index][:msg] =
|
|
187
|
+
@outputs[index][:msg] = 'Write 4 spaces before %names'
|
|
141
188
|
end
|
|
142
189
|
end
|
|
190
|
+
# rubocop:enable Metrics/AbcSize
|
|
191
|
+
# rubocop:enable Metrics/MethodLength
|
|
143
192
|
|
|
193
|
+
# rubocop:disable Metrics/AbcSize
|
|
194
|
+
# rubocop:disable Metrics/MethodLength
|
|
144
195
|
def check_tags(line, index)
|
|
145
196
|
return unless @outputs[index][:state] == :none
|
|
146
197
|
return unless line.include? '%tags'
|
|
@@ -151,12 +202,16 @@ module Checker
|
|
|
151
202
|
if find_parent(index) != :concept
|
|
152
203
|
@outputs[index][:state] = :err
|
|
153
204
|
@outputs[index][:msg] = 'Parent(concept) not found!'
|
|
154
|
-
elsif
|
|
205
|
+
elsif !line.start_with? ' %tags'
|
|
155
206
|
@outputs[index][:state] = :err
|
|
156
|
-
@outputs[index][:msg] =
|
|
207
|
+
@outputs[index][:msg] = 'Write 4 spaces before %tags'
|
|
157
208
|
end
|
|
158
209
|
end
|
|
210
|
+
# rubocop:enable Metrics/AbcSize
|
|
211
|
+
# rubocop:enable Metrics/MethodLength
|
|
159
212
|
|
|
213
|
+
# rubocop:disable Metrics/AbcSize
|
|
214
|
+
# rubocop:disable Metrics/MethodLength
|
|
160
215
|
def check_def(line, index)
|
|
161
216
|
return unless @outputs[index][:state] == :none
|
|
162
217
|
return unless line.include? '%def'
|
|
@@ -167,12 +222,16 @@ module Checker
|
|
|
167
222
|
if find_parent(index) != :concept
|
|
168
223
|
@outputs[index][:state] = :err
|
|
169
224
|
@outputs[index][:msg] = 'Parent(concept) not found!'
|
|
170
|
-
elsif
|
|
225
|
+
elsif !line.start_with? ' %def'
|
|
171
226
|
@outputs[index][:state] = :err
|
|
172
|
-
@outputs[index][:msg] =
|
|
227
|
+
@outputs[index][:msg] = 'Write 4 spaces before %def'
|
|
173
228
|
end
|
|
174
229
|
end
|
|
230
|
+
# rubocop:enable Metrics/AbcSize
|
|
231
|
+
# rubocop:enable Metrics/MethodLength
|
|
175
232
|
|
|
233
|
+
# rubocop:disable Metrics/AbcSize
|
|
234
|
+
# rubocop:disable Metrics/MethodLength
|
|
176
235
|
def check_table(line, index)
|
|
177
236
|
return unless @outputs[index][:state] == :none
|
|
178
237
|
return unless line.include? '%table'
|
|
@@ -183,12 +242,16 @@ module Checker
|
|
|
183
242
|
if find_parent(index) != :concept
|
|
184
243
|
@outputs[index][:state] = :err
|
|
185
244
|
@outputs[index][:msg] = 'Parent(concept) not found!'
|
|
186
|
-
elsif
|
|
245
|
+
elsif !line.start_with? ' %table'
|
|
187
246
|
@outputs[index][:state] = :err
|
|
188
|
-
@outputs[index][:msg] =
|
|
247
|
+
@outputs[index][:msg] = 'Write 4 spaces before %table'
|
|
189
248
|
end
|
|
190
249
|
end
|
|
250
|
+
# rubocop:enable Metrics/AbcSize
|
|
251
|
+
# rubocop:enable Metrics/MethodLength
|
|
191
252
|
|
|
253
|
+
# rubocop:disable Metrics/AbcSize
|
|
254
|
+
# rubocop:disable Metrics/MethodLength
|
|
192
255
|
def check_row(line, index)
|
|
193
256
|
return unless @outputs[index][:state] == :none
|
|
194
257
|
return unless line.include? '%row'
|
|
@@ -199,7 +262,7 @@ module Checker
|
|
|
199
262
|
if count_spaces(line) == 6
|
|
200
263
|
@outputs[index][:level] = 3
|
|
201
264
|
parent = find_parent(index)
|
|
202
|
-
unless [
|
|
265
|
+
unless %i[table features].include? parent
|
|
203
266
|
@outputs[index][:state] = :err
|
|
204
267
|
@outputs[index][:msg] = 'Parent(table/features) not found!'
|
|
205
268
|
end
|
|
@@ -211,10 +274,14 @@ module Checker
|
|
|
211
274
|
end
|
|
212
275
|
else
|
|
213
276
|
@outputs[index][:state] = :err
|
|
214
|
-
@outputs[index][:msg] =
|
|
277
|
+
@outputs[index][:msg] = 'Write 6 or 8 spaces before %row'
|
|
215
278
|
end
|
|
216
279
|
end
|
|
280
|
+
# rubocop:enable Metrics/AbcSize
|
|
281
|
+
# rubocop:enable Metrics/MethodLength
|
|
217
282
|
|
|
283
|
+
# rubocop:disable Metrics/AbcSize
|
|
284
|
+
# rubocop:disable Metrics/MethodLength
|
|
218
285
|
def check_col(line, index)
|
|
219
286
|
return unless @outputs[index][:state] == :none
|
|
220
287
|
return unless line.include? '%col'
|
|
@@ -235,10 +302,28 @@ module Checker
|
|
|
235
302
|
end
|
|
236
303
|
else
|
|
237
304
|
@outputs[index][:state] = :err
|
|
238
|
-
@outputs[index][:msg] =
|
|
305
|
+
@outputs[index][:msg] = 'Write 8 or 10 spaces before %col'
|
|
239
306
|
end
|
|
307
|
+
check_text(line, index)
|
|
240
308
|
end
|
|
309
|
+
# rubocop:enable Metrics/AbcSize
|
|
310
|
+
# rubocop:enable Metrics/MethodLength
|
|
241
311
|
|
|
312
|
+
def check_text(line, index)
|
|
313
|
+
return unless @outputs[index][:state] == :ok
|
|
314
|
+
|
|
315
|
+
ok = ''
|
|
316
|
+
%w[< >].each do |char|
|
|
317
|
+
ok = char if line.include? char
|
|
318
|
+
end
|
|
319
|
+
return if ok == ''
|
|
320
|
+
|
|
321
|
+
@outputs[index][:state] = :err
|
|
322
|
+
@outputs[index][:msg] = "Char #{ok} not allow!"
|
|
323
|
+
end
|
|
324
|
+
|
|
325
|
+
# rubocop:disable Metrics/MethodLength
|
|
326
|
+
# rubocop:disable Metrics/AbcSize
|
|
242
327
|
def check_template(line, index)
|
|
243
328
|
return unless @outputs[index][:state] == :none
|
|
244
329
|
return unless line.include? '%template'
|
|
@@ -249,12 +334,16 @@ module Checker
|
|
|
249
334
|
if find_parent(index) != :table
|
|
250
335
|
@outputs[index][:state] = :err
|
|
251
336
|
@outputs[index][:msg] = 'Parent(concept) not found!'
|
|
252
|
-
elsif
|
|
337
|
+
elsif !line.start_with? ' %template'
|
|
253
338
|
@outputs[index][:state] = :err
|
|
254
|
-
@outputs[index][:msg] =
|
|
339
|
+
@outputs[index][:msg] = 'Write 6 spaces before %template'
|
|
255
340
|
end
|
|
256
341
|
end
|
|
342
|
+
# rubocop:enable Metrics/AbcSize
|
|
343
|
+
# rubocop:enable Metrics/MethodLength
|
|
257
344
|
|
|
345
|
+
# rubocop:disable Metrics/MethodLength
|
|
346
|
+
# rubocop:disable Metrics/AbcSize
|
|
258
347
|
def check_code(line, index)
|
|
259
348
|
return unless @outputs[index][:state] == :none
|
|
260
349
|
return unless line.include? '%code'
|
|
@@ -270,7 +359,11 @@ module Checker
|
|
|
270
359
|
@outputs[index][:msg] = 'Write 2 spaces before %code'
|
|
271
360
|
end
|
|
272
361
|
end
|
|
362
|
+
# rubocop:enable Metrics/MethodLength
|
|
363
|
+
# rubocop:enable Metrics/AbcSize
|
|
273
364
|
|
|
365
|
+
# rubocop:disable Metrics/MethodLength
|
|
366
|
+
# rubocop:disable Metrics/AbcSize
|
|
274
367
|
def check_type(line, index)
|
|
275
368
|
return unless @outputs[index][:state] == :none
|
|
276
369
|
return unless line.include? '%type'
|
|
@@ -281,12 +374,16 @@ module Checker
|
|
|
281
374
|
if find_parent(index) != :code
|
|
282
375
|
@outputs[index][:state] = :err
|
|
283
376
|
@outputs[index][:msg] = 'Parent(code) not found!'
|
|
284
|
-
elsif
|
|
377
|
+
elsif !line.start_with? ' %type'
|
|
285
378
|
@outputs[index][:state] = :err
|
|
286
|
-
@outputs[index][:msg] =
|
|
379
|
+
@outputs[index][:msg] = 'Write 4 spaces before %type'
|
|
287
380
|
end
|
|
288
381
|
end
|
|
382
|
+
# rubocop:enable Metrics/AbcSize
|
|
383
|
+
# rubocop:enable Metrics/MethodLength
|
|
289
384
|
|
|
385
|
+
# rubocop:disable Metrics/MethodLength
|
|
386
|
+
# rubocop:disable Metrics/AbcSize
|
|
290
387
|
def check_path(line, index)
|
|
291
388
|
return unless @outputs[index][:state] == :none
|
|
292
389
|
return unless line.include? '%path'
|
|
@@ -297,12 +394,16 @@ module Checker
|
|
|
297
394
|
if find_parent(index) != :code
|
|
298
395
|
@outputs[index][:state] = :err
|
|
299
396
|
@outputs[index][:msg] = 'Parent(code) not found!'
|
|
300
|
-
elsif
|
|
397
|
+
elsif !line.start_with? ' %path'
|
|
301
398
|
@outputs[index][:state] = :err
|
|
302
|
-
@outputs[index][:msg] =
|
|
399
|
+
@outputs[index][:msg] = 'Write 4 spaces before %type'
|
|
303
400
|
end
|
|
304
401
|
end
|
|
402
|
+
# rubocop:enable Metrics/AbcSize
|
|
403
|
+
# rubocop:enable Metrics/MethodLength
|
|
305
404
|
|
|
405
|
+
# rubocop:disable Metrics/MethodLength
|
|
406
|
+
# rubocop:disable Metrics/AbcSize
|
|
306
407
|
def check_features(line, index)
|
|
307
408
|
return unless @outputs[index][:state] == :none
|
|
308
409
|
return unless line.include? '%features'
|
|
@@ -313,16 +414,19 @@ module Checker
|
|
|
313
414
|
if find_parent(index) != :code
|
|
314
415
|
@outputs[index][:state] = :err
|
|
315
416
|
@outputs[index][:msg] = 'Parent(code) not found!'
|
|
316
|
-
elsif
|
|
417
|
+
elsif !line.start_with? ' %features'
|
|
317
418
|
@outputs[index][:state] = :err
|
|
318
|
-
@outputs[index][:msg] =
|
|
419
|
+
@outputs[index][:msg] = 'Write 4 spaces before %features'
|
|
319
420
|
end
|
|
320
421
|
end
|
|
422
|
+
# rubocop:enable Metrics/AbcSize
|
|
423
|
+
# rubocop:enable Metrics/MethodLength
|
|
321
424
|
|
|
322
425
|
def check_unknown(line, index)
|
|
323
426
|
return unless @outputs[index][:state] == :none
|
|
427
|
+
|
|
324
428
|
@outputs[index][:type] = :unknown
|
|
325
|
-
@outputs[index][:level] = count_spaces(line)/2
|
|
429
|
+
@outputs[index][:level] = count_spaces(line) / 2
|
|
326
430
|
@outputs[index][:state] = :err
|
|
327
431
|
@outputs[index][:msg] = "Unknown tag with parent(#{find_parent(index)})!"
|
|
328
432
|
end
|
|
@@ -330,27 +434,20 @@ module Checker
|
|
|
330
434
|
def find_parent(index)
|
|
331
435
|
current_level = @outputs[index][:level]
|
|
332
436
|
return :noparent if current_level.zero?
|
|
437
|
+
|
|
333
438
|
i = index - 1
|
|
334
|
-
while
|
|
439
|
+
while i >= 0
|
|
335
440
|
return @outputs[i][:type] if @outputs[i][:level] == current_level - 1
|
|
336
|
-
|
|
441
|
+
|
|
442
|
+
i -= 1
|
|
337
443
|
end
|
|
338
|
-
|
|
444
|
+
:noparent
|
|
339
445
|
end
|
|
340
446
|
|
|
341
447
|
def count_spaces(line)
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
return 2 if line.start_with? ' %'
|
|
345
|
-
return 3 if line.start_with? ' %'
|
|
346
|
-
return 4 if line.start_with? ' %'
|
|
347
|
-
return 5 if line.start_with? ' %'
|
|
348
|
-
return 6 if line.start_with? ' %'
|
|
349
|
-
return 7 if line.start_with? ' %'
|
|
350
|
-
return 8 if line.start_with? ' %'
|
|
351
|
-
return 9 if line.start_with? ' %'
|
|
352
|
-
return 10 if line.start_with? ' %'
|
|
353
|
-
return -1
|
|
448
|
+
a = line.split('%')
|
|
449
|
+
a[0].count(' ')
|
|
354
450
|
end
|
|
355
451
|
end
|
|
452
|
+
# rubocop:enable Metrics/ClassLength
|
|
356
453
|
end
|
data/lib/asker/cli.rb
CHANGED
|
@@ -15,52 +15,32 @@ class CLI < Thor
|
|
|
15
15
|
##
|
|
16
16
|
# Show current version
|
|
17
17
|
def version
|
|
18
|
-
|
|
19
|
-
puts " (version #{Rainbow(Application::VERSION).green})"
|
|
18
|
+
puts "#{Application::NAME} version #{Application::VERSION}"
|
|
20
19
|
end
|
|
21
20
|
|
|
22
21
|
map ['f', '-f', '--file'] => 'file'
|
|
23
22
|
desc 'file NAME', 'Build output files, from HAML/XML input file.'
|
|
24
|
-
option :color, type: :boolean
|
|
25
23
|
long_desc <<-LONGDESC
|
|
26
|
-
Create output files, from input file (HAML/XML format).
|
|
27
24
|
|
|
28
25
|
Build questions about contents defined into input file specified.
|
|
29
26
|
|
|
30
|
-
|
|
27
|
+
Create output files, from input file (HAML/XML format).
|
|
31
28
|
|
|
32
|
-
|
|
29
|
+
Examples:
|
|
33
30
|
|
|
34
|
-
(
|
|
31
|
+
(1) #{Rainbow('asker input/foo/foo.haml').aqua}, Build questions from HAML file.
|
|
35
32
|
|
|
36
|
-
(
|
|
33
|
+
(2) #{Rainbow('asker input/foo/foo.xml').aqua}, Build questions from XML file.
|
|
37
34
|
|
|
38
|
-
(
|
|
35
|
+
(3) #{Rainbow('asker projects/foo/foo.yaml').aqua}, Build questions from YAML project file.
|
|
39
36
|
|
|
40
37
|
LONGDESC
|
|
41
38
|
##
|
|
42
39
|
# Create questions from input file
|
|
43
40
|
# @param filename (String) Path to input file
|
|
44
41
|
def file(filename)
|
|
45
|
-
# Enable/disable color output
|
|
46
|
-
Rainbow.enabled = false if options['color'] == false
|
|
47
42
|
# Asker start processing input file
|
|
48
|
-
Asker.
|
|
49
|
-
end
|
|
50
|
-
|
|
51
|
-
map ['i', '-i', '--init'] => 'init'
|
|
52
|
-
desc 'init', 'Create default INI config fie'
|
|
53
|
-
##
|
|
54
|
-
# Create default INI config file
|
|
55
|
-
def init
|
|
56
|
-
src = File.join(File.dirname(__FILE__), 'files', 'config.ini')
|
|
57
|
-
dst = File.join(Dir.pwd, 'config.ini')
|
|
58
|
-
if File.exist? dst
|
|
59
|
-
puts "[WARN] Exists file! => #{Rainbow(File.basename(dst)).yellow.bright}"
|
|
60
|
-
else
|
|
61
|
-
FileUtils.cp(src, dst)
|
|
62
|
-
puts "[ OK ] Create file => #{Rainbow(File.basename(dst)).green}"
|
|
63
|
-
end
|
|
43
|
+
Asker.start(filename)
|
|
64
44
|
end
|
|
65
45
|
|
|
66
46
|
map ['c', '-c', '--check'] => 'check'
|
|
@@ -75,14 +55,29 @@ class CLI < Thor
|
|
|
75
55
|
Asker.check(filename)
|
|
76
56
|
end
|
|
77
57
|
|
|
78
|
-
map ['
|
|
79
|
-
desc '
|
|
58
|
+
map ['h', '-h', '--homepage', 'homepage'] => 'show_homepage'
|
|
59
|
+
desc 'homepage', 'Documentation homepage'
|
|
60
|
+
##
|
|
61
|
+
# Show documentation homepage
|
|
62
|
+
def show_homepage()
|
|
63
|
+
puts Application::HOMEPAGE
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
map ['i', '-i', '--init'] => 'init'
|
|
67
|
+
desc 'init', 'Create default INI config file'
|
|
68
|
+
##
|
|
69
|
+
# Create default INI config file
|
|
70
|
+
def init
|
|
71
|
+
Asker.create_configuration
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
map ['n', '-n', '--new', 'new'] => 'create_input'
|
|
75
|
+
desc 'new [FOLDER]', 'Create Asker demo input files'
|
|
80
76
|
##
|
|
81
77
|
# Create Asker demo input files
|
|
82
78
|
# @param dirname (String) Path to folder
|
|
83
|
-
def
|
|
84
|
-
|
|
85
|
-
Asker.create_skeleton(dirname)
|
|
79
|
+
def create_input(dirname)
|
|
80
|
+
Asker.create_input(dirname)
|
|
86
81
|
end
|
|
87
82
|
|
|
88
83
|
##
|
|
@@ -92,4 +87,14 @@ class CLI < Thor
|
|
|
92
87
|
def method_missing(method, *_args, &_block)
|
|
93
88
|
file(method.to_s)
|
|
94
89
|
end
|
|
90
|
+
|
|
91
|
+
def respond_to_missing?(_method_name)
|
|
92
|
+
true
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
##
|
|
96
|
+
# Thor stop and show messages on screen on failure
|
|
97
|
+
def self.exit_on_failure?
|
|
98
|
+
true
|
|
99
|
+
end
|
|
95
100
|
end
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative '../ai/code/code_ai_factory'
|
|
4
|
+
require_relative '../project'
|
|
5
|
+
require_relative '../logger'
|
|
6
|
+
require_relative '../formatter/code_string_formatter'
|
|
7
|
+
|
|
8
|
+
##
|
|
9
|
+
# Code data object
|
|
10
|
+
class Code
|
|
11
|
+
attr_reader :dirname, :filename, :type
|
|
12
|
+
attr_accessor :process, :features
|
|
13
|
+
attr_reader :lines, :questions
|
|
14
|
+
|
|
15
|
+
##
|
|
16
|
+
# Initialize Code object
|
|
17
|
+
# @param dirname (String)
|
|
18
|
+
# @param filename (String)
|
|
19
|
+
# @param type (String)
|
|
20
|
+
def initialize(dirname, filename, type)
|
|
21
|
+
@dirname = dirname
|
|
22
|
+
@filename = filename
|
|
23
|
+
@type = type
|
|
24
|
+
@filepath = File.join(@dirname, @filename)
|
|
25
|
+
@process = false
|
|
26
|
+
@features = []
|
|
27
|
+
@lines = load(@filepath)
|
|
28
|
+
@questions = []
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def process?
|
|
32
|
+
@process
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def lines_to_s(lines)
|
|
36
|
+
out = ''
|
|
37
|
+
lines.each_with_index do |line, index|
|
|
38
|
+
out << format("%2d| #{line}\n", (index + 1))
|
|
39
|
+
end
|
|
40
|
+
out
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def debug
|
|
44
|
+
Logger.verbose CodeStringFormatter.to_s(self)
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
private
|
|
48
|
+
|
|
49
|
+
def load(filepath)
|
|
50
|
+
return if filepath.nil?
|
|
51
|
+
|
|
52
|
+
unless File.exist? filepath
|
|
53
|
+
Logger.verboseln Rainbow("[ERROR] Unkown file #{filepath}").red.bright
|
|
54
|
+
return
|
|
55
|
+
end
|
|
56
|
+
content = File.read(filepath)
|
|
57
|
+
encode_and_split(content)
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
def encode_and_split(text, encoding = :default)
|
|
61
|
+
# Convert text to UTF-8 deleting unknown chars
|
|
62
|
+
text ||= '' # Ensure text is not nil
|
|
63
|
+
flag = [:default, 'UTF-8'].include? encoding
|
|
64
|
+
return text.encode('UTF-8', invalid: :replace).split("\n") if flag
|
|
65
|
+
|
|
66
|
+
# Convert text from input ENCODING to UTF-8
|
|
67
|
+
ec = Encoding::Converter.new(encoding.to_s, 'UTF-8')
|
|
68
|
+
begin
|
|
69
|
+
text = ec.convert(text)
|
|
70
|
+
rescue StandardError => e
|
|
71
|
+
puts "[ERROR] Encoding: #{e}"
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
text.split("\n")
|
|
75
|
+
end
|
|
76
|
+
end
|
data/lib/asker/data/column.rb
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
-
# encoding: utf-8
|
|
3
2
|
|
|
4
3
|
# Contain data information for every column
|
|
5
4
|
# Params:
|
|
@@ -9,10 +8,15 @@
|
|
|
9
8
|
class Column
|
|
10
9
|
attr_reader :row, :index, :id, :raw, :lang, :type, :simple
|
|
11
10
|
|
|
11
|
+
##
|
|
12
|
+
# initialize Column
|
|
13
|
+
# @param row (Row)
|
|
14
|
+
# @param index (Integer)
|
|
15
|
+
# @param xml_data (XMLdata)
|
|
12
16
|
def initialize(row, index, xml_data)
|
|
13
17
|
@row = row
|
|
14
18
|
@index = index
|
|
15
|
-
@id = @row.id
|
|
19
|
+
@id = "#{@row.id}.#{@index}"
|
|
16
20
|
@raw = ''
|
|
17
21
|
@lang = @row.langs[@index]
|
|
18
22
|
@type = @row.types[@index]
|
|
@@ -28,35 +32,41 @@ class Column
|
|
|
28
32
|
return "<img src=\"#{raw}\" alt\=\"image\">"
|
|
29
33
|
when 'textfile_path'
|
|
30
34
|
return "<pre>#{raw}</pre>"
|
|
31
|
-
else
|
|
32
|
-
return "ERROR type #{@type}"
|
|
33
35
|
end
|
|
36
|
+
"ERROR type #{@type}"
|
|
34
37
|
end
|
|
35
38
|
|
|
36
39
|
private
|
|
37
40
|
|
|
38
41
|
def read_data_from_xml(xml_data)
|
|
39
|
-
raise '[ERROR] Column
|
|
42
|
+
raise '[ERROR] Column with elements!' if xml_data.elements.count.positive?
|
|
40
43
|
|
|
41
44
|
@raw = xml_data.text.strip.to_s
|
|
42
45
|
|
|
43
46
|
# read attributes from XML input data
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
@lang = LangFactory.instance.get(code)
|
|
48
|
-
@simple[:lang] = false
|
|
49
|
-
@row.simple_off(:lang)
|
|
50
|
-
end
|
|
51
|
-
end
|
|
47
|
+
read_lang_from_xml(xml_data)
|
|
48
|
+
read_type_from_xml(xml_data)
|
|
49
|
+
end
|
|
52
50
|
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
51
|
+
def read_lang_from_xml(xml_data)
|
|
52
|
+
return unless xml_data.attributes['lang']
|
|
53
|
+
|
|
54
|
+
code = xml_data.attributes['lang'].strip
|
|
55
|
+
return if code == @lang.code
|
|
56
|
+
|
|
57
|
+
@lang = LangFactory.instance.get(code)
|
|
58
|
+
@simple[:lang] = false
|
|
59
|
+
@row.simple_off(:lang)
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
def read_type_from_xml(xml_data)
|
|
63
|
+
return unless xml_data.attributes['type']
|
|
64
|
+
|
|
65
|
+
type = xml_data.attributes['type'].strip
|
|
66
|
+
return if type == @type.to_s
|
|
67
|
+
|
|
68
|
+
@type = type
|
|
69
|
+
@simple[:type] = false
|
|
70
|
+
@row.simple_off(:type)
|
|
61
71
|
end
|
|
62
72
|
end
|