asker-tool 2.2.1 → 2.2.2

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: cb2119553ee0f5bce53f1aebe3468aabb5488ce02c54004c09df4d1256867cf5
4
- data.tar.gz: 29bc8b727e10beb791eac5a113751f6d26ec9036cf3158aec583a93505fb3ba5
3
+ metadata.gz: a0ce9d640d7af95956ae17f28a2acdffba7ca6f31437fbf7d18b6de30d5fd73a
4
+ data.tar.gz: d62bc1fd0380f141dda9e17bd11beb24da62b99be7b4eed13e5206c265589f52
5
5
  SHA512:
6
- metadata.gz: b3f277896c860c2987c25b4088922328f922fa52c8e2bb32ba92b6d90c6b86e05f2c0c9a056f3c69139148266f6bd4443192ca4d6892ee6e6884fb1e6cb3bad4
7
- data.tar.gz: f9bb53fa2c7d5ee05566eb19657e4997d84dea2f521e1445a64fb658b06a7b6b1326e8b3d010fa21b5758c8538fc33ed1f675752493db4a366be9ac881944057
6
+ metadata.gz: 3f35ecee5e80950d66c57b039e39d9be4eb1a06b87b9fc6ca19b0cc2fa8ca99769467fba7608c55e8d1a1e408e17088723c014d8b677fad506896669e65060f1
7
+ data.tar.gz: 99b0da9a849a8d78802f70b03046d98df35f936086dd2f1eeca86a3655c5b8d5b1bbd5c221c291b19db5fafc802fd6202fb117ad8dd78f2f0fd57c907d98213d
data/README.md CHANGED
@@ -1,4 +1,6 @@
1
1
  [![Gem Version](https://badge.fury.io/rb/asker-tool.svg)](https://badge.fury.io/rb/asker-tool)
2
+ ![GitHub](https://img.shields.io/github/license/dvarrui/asker)
3
+ ![Gem](https://img.shields.io/gem/dv/asker-tool/2.2.1)
2
4
 
3
5
  # ASKER (devel 2.3)
4
6
 
@@ -5,16 +5,13 @@ require 'set'
5
5
  require_relative 'base_stage'
6
6
  require_relative '../question'
7
7
 
8
- ##
9
- # range b1
10
8
  class StageB < BaseStage
11
9
  ##
10
+ # range b1
12
11
  # Process table data to generate match questions
13
12
  # @param table (Table)
14
13
  # @param list1 (Array) Rows that belong to this table
15
14
  # @param list2 (Array) List with similar rows (same table name) from the neighbours tables
16
- # rubocop:disable Metrics/AbcSize
17
- # rubocop:disable Metrics/MethodLength
18
15
  def run(table, list1, list2)
19
16
  questions = []
20
17
  return questions if table.fields.count < 2
@@ -44,12 +41,6 @@ class StageB < BaseStage
44
41
  # @param list2 (Array) List with similar rows (same table name) from the neighbours tables
45
42
  # @param index1 (Integer) Use this field number
46
43
  # @param index2 (Integer) Use this field number
47
- # rubocop:disable Metrics/AbcSize
48
- # rubocop:disable Metrics/MethodLength
49
- # rubocop:disable Metrics/CyclomaticComplexity
50
- # rubocop:disable Style/ConditionalAssignment
51
- # rubocop:disable Metrics/BlockLength
52
- # rubocop:disable Metrics/PerceivedComplexity
53
44
  def process_table_match2fields(p_table, list1, list2, index1, index2)
54
45
  questions = []
55
46
  lang = concept.lang
@@ -7,12 +7,6 @@ require_relative '../question'
7
7
 
8
8
  # range d1-d4
9
9
  class StageD < BaseStage
10
- # rubocop:disable Lint/BooleanSymbol
11
- # rubocop:disable Metrics/MethodLength
12
- # rubocop:disable Metrics/AbcSize
13
- # rubocop:disable Metrics/BlockLength
14
- # rubocop:disable Metrics/CyclomaticComplexity
15
- # rubocop:disable Metrics/PerceivedComplexity
16
10
  def run
17
11
  # Stage D: process every definition, I mean every <def> tag
18
12
  questions = []
@@ -67,22 +61,22 @@ class StageD < BaseStage
67
61
 
68
62
  # Question choice => mispelled
69
63
  q = Question.new(:choice)
70
- q.name = "#{name(:id)}-#{num}-d2def-mispelled"
64
+ q.name = "#{name(:id)}-#{num}-d2def-misspelled"
71
65
  q.text = random_image_for(name(:raw)) + lang.text_for(:d2, name(:decorated), lang.do_mistake_to(t))
72
66
  q.good = lang.text_for(:misspelling)
73
67
  q.bads << lang.text_for(:true)
74
68
  q.bads << lang.text_for(:false)
75
- q.feedback = "Definition text mispelled!: #{t}"
69
+ q.feedback = "Definition text misspelled!: #{t}"
76
70
  questions << q
77
71
 
78
72
  # Question choice => name mispelled
79
73
  q = Question.new(:choice)
80
- q.name = "#{name(:id)}-#{num}-d2name-mispelled"
74
+ q.name = "#{name(:id)}-#{num}-d2name-misspelled"
81
75
  q.text = random_image_for(name(:raw)) + lang.text_for(:d2, lang.do_mistake_to(name(:raw)), t)
82
76
  q.good = lang.text_for(:misspelling)
83
77
  q.bads << lang.text_for(:true)
84
78
  q.bads << lang.text_for(:false)
85
- q.feedback = "Concept name mispelled!: #{name(:raw)}"
79
+ q.feedback = "Concept name misspelled!: #{name(:raw)}"
86
80
  questions << q
87
81
 
88
82
  # Question choice => true
@@ -3,8 +3,6 @@
3
3
  require_relative 'base_stage'
4
4
  require_relative '../question'
5
5
 
6
- # StageF: process tables with 1 field
7
- # rubocop:disable Metrics/ClassLength
8
6
  class StageF < BaseStage
9
7
  ##
10
8
  # run stage_f: generate guqestion for tables with 1 field
@@ -24,8 +22,6 @@ class StageF < BaseStage
24
22
 
25
23
  private
26
24
 
27
- # rubocop:disable Metrics/AbcSize
28
- # rubocop:disable Metrics/MethodLength
29
25
  def run_only_this_concept(table, list1)
30
26
  questions = []
31
27
  lang = concept.lang
@@ -69,12 +65,7 @@ class StageF < BaseStage
69
65
  end
70
66
  questions
71
67
  end
72
- # rubocop:enable Metrics/AbcSize
73
- # rubocop:enable Metrics/MethodLength
74
68
 
75
- # rubocop:disable Lint/BooleanSymbol
76
- # rubocop:disable Metrics/MethodLength
77
- # rubocop:disable Metrics/AbcSize
78
69
  def make_questions_with(values, table)
79
70
  questions = []
80
71
  lang = concept.lang
@@ -124,17 +115,11 @@ class StageF < BaseStage
124
115
  q.good = lang.text_for(:misspelling)
125
116
  q.bads << lang.text_for(:true)
126
117
  q.bads << lang.text_for(:false)
127
- q.feedback = "Text #{save} mispelled!"
118
+ q.feedback = "Text #{save} misspelled!"
128
119
  values[0] = save
129
120
  questions << q
130
121
  end
131
- # rubocop:enable Lint/BooleanSymbol
132
- # rubocop:enable Metrics/MethodLength
133
- # rubocop:enable Metrics/AbcSize
134
122
 
135
- # rubocop:disable Lint/BooleanSymbol
136
- # rubocop:disable Metrics/MethodLength
137
- # rubocop:disable Metrics/AbcSize
138
123
  def run_with_other_concepts(table, list1, list2)
139
124
  questions = []
140
125
 
@@ -177,8 +162,4 @@ class StageF < BaseStage
177
162
 
178
163
  questions
179
164
  end
180
- # rubocop:enable Lint/BooleanSymbol
181
- # rubocop:enable Metrics/MethodLength
182
- # rubocop:enable Metrics/AbcSize
183
165
  end
184
- # rubocop:enable Metrics/ClassLength
@@ -8,7 +8,7 @@ require 'rainbow'
8
8
  class Application
9
9
  include Singleton
10
10
 
11
- VERSION = '2.2.1'
11
+ VERSION = '2.2.2'
12
12
  NAME = 'asker'
13
13
  GEM = 'asker-tool'
14
14
  CONFIGFILE = 'asker.ini'
@@ -0,0 +1,358 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rainbow'
4
+
5
+ class InputData
6
+ attr_reader :inputs, :outputs
7
+
8
+ def initialize(filepath)
9
+ @inputs = File.read(filepath).split("\n")
10
+ @outputs = []
11
+ @inputs.each_with_index do |line, index|
12
+ output = { id: index,
13
+ level: 0,
14
+ state: :none,
15
+ type: :none,
16
+ source: line,
17
+ msg: '' }
18
+ @outputs << output
19
+ end
20
+ @ok = false
21
+ end
22
+
23
+ def ok?
24
+ @ok
25
+ end
26
+
27
+ def show
28
+ @outputs.each do |i|
29
+ puts "#{i[:id]}: #{i[:state]} [#{i[:type]}] #{i[:msg]}"
30
+ end
31
+ end
32
+
33
+ def show_errors
34
+ errors = 0
35
+ # puts "Line : Error description"
36
+ @outputs.each do |i|
37
+ next if i[:state] == :ok
38
+
39
+ errors += 1
40
+ if errors < 11
41
+ data = { id: i[:id], msg: i[:msg], source: i[:source][0, 40] }
42
+ order = i[:id] + 1
43
+ data = { order: order, msg: i[:msg], source: i[:source][0, 40] }
44
+ puts format(' %<order>03d : %<msg>s. => %<source>s', data)
45
+ end
46
+ puts '...' if errors == 11
47
+ end
48
+
49
+ if errors.positive?
50
+ puts Rainbow("[ERROR] #{errors} errors " \
51
+ "from #{@inputs.size} lines!").red.bright
52
+ end
53
+ puts Rainbow('Syntax OK!').green if errors.zero?
54
+ end
55
+
56
+ def check
57
+ @ok = true
58
+ @inputs.each_with_index do |line, index|
59
+ check_empty_lines(line, index)
60
+ check_map(line, index)
61
+ check_concept(line, index)
62
+ check_names(line, index)
63
+ check_tags(line, index)
64
+ check_def(line, index)
65
+ check_table(line, index)
66
+ check_row(line, index)
67
+ check_col(line, index)
68
+ check_template(line, index)
69
+ check_code(line, index)
70
+ check_type(line, index)
71
+ check_path(line, index)
72
+ check_features(line, index)
73
+ check_unknown(line, index)
74
+ @ok = false unless @outputs[index][:state] == :ok
75
+ @ok = false if @outputs[index][:type] == :unkown
76
+ end
77
+ @ok
78
+ end
79
+
80
+ private
81
+
82
+ def check_empty_lines(line, index)
83
+ return unless line.strip.size.zero? || line.start_with?('#')
84
+
85
+ @outputs[index][:type] = :empty
86
+ @outputs[index][:level] = -1
87
+ @outputs[index][:state] = :ok
88
+ end
89
+
90
+ def check_map(line, index)
91
+ if index.zero?
92
+ @outputs[index][:type] = :map
93
+ if line.start_with?('%map{')
94
+ @outputs[index][:state] = :ok
95
+ else
96
+ @outputs[index][:state] = :err
97
+ @outputs[index][:msg] = 'Start with %map{'
98
+ end
99
+ elsif index.positive? && line.include?('%map{')
100
+ @outputs[index][:state] = :err
101
+ @outputs[index][:type] = :map
102
+ @outputs[index][:msg] = 'Write %map on line 0'
103
+ end
104
+ end
105
+
106
+ def check_concept(line, index)
107
+ return unless @outputs[index][:state] == :none
108
+ return unless line.include? '%concept'
109
+
110
+ @outputs[index][:type] = :concept
111
+ @outputs[index][:level] = 1
112
+ @outputs[index][:state] = :ok
113
+ if find_parent(index) != :map
114
+ @outputs[index][:state] = :err
115
+ @outputs[index][:msg] = 'Parent(map) not found!'
116
+ elsif line != ' %concept'
117
+ @outputs[index][:state] = :err
118
+ @outputs[index][:msg] = 'Write 2 spaces before %concept'
119
+ end
120
+ end
121
+
122
+ def check_names(line, index)
123
+ return unless @outputs[index][:state] == :none
124
+ return unless line.include? '%names'
125
+
126
+ @outputs[index][:type] = :names
127
+ @outputs[index][:level] = 2
128
+ @outputs[index][:state] = :ok
129
+ if find_parent(index) != :concept
130
+ @outputs[index][:state] = :err
131
+ @outputs[index][:msg] = 'Parent(concept) not found!'
132
+ elsif !line.start_with? ' %names'
133
+ @outputs[index][:state] = :err
134
+ @outputs[index][:msg] = 'Write 4 spaces before %names'
135
+ end
136
+ end
137
+
138
+ def check_tags(line, index)
139
+ return unless @outputs[index][:state] == :none
140
+ return unless line.include? '%tags'
141
+
142
+ @outputs[index][:type] = :tags
143
+ @outputs[index][:level] = 2
144
+ @outputs[index][:state] = :ok
145
+ if find_parent(index) != :concept
146
+ @outputs[index][:state] = :err
147
+ @outputs[index][:msg] = 'Parent(concept) not found!'
148
+ elsif !line.start_with? ' %tags'
149
+ @outputs[index][:state] = :err
150
+ @outputs[index][:msg] = 'Write 4 spaces before %tags'
151
+ end
152
+ end
153
+
154
+ def check_def(line, index)
155
+ return unless @outputs[index][:state] == :none
156
+ return unless line.include? '%def'
157
+
158
+ @outputs[index][:type] = :def
159
+ @outputs[index][:level] = 2
160
+ @outputs[index][:state] = :ok
161
+ if find_parent(index) != :concept
162
+ @outputs[index][:state] = :err
163
+ @outputs[index][:msg] = 'Parent(concept) not found!'
164
+ elsif !line.start_with? ' %def'
165
+ @outputs[index][:state] = :err
166
+ @outputs[index][:msg] = 'Write 4 spaces before %def'
167
+ end
168
+ end
169
+
170
+ def check_table(line, index)
171
+ return unless @outputs[index][:state] == :none
172
+ return unless line.include? '%table'
173
+
174
+ @outputs[index][:type] = :table
175
+ @outputs[index][:level] = 2
176
+ @outputs[index][:state] = :ok
177
+ if find_parent(index) != :concept
178
+ @outputs[index][:state] = :err
179
+ @outputs[index][:msg] = 'Parent(concept) not found!'
180
+ elsif !line.start_with? ' %table'
181
+ @outputs[index][:state] = :err
182
+ @outputs[index][:msg] = 'Write 4 spaces before %table'
183
+ end
184
+ end
185
+
186
+ def check_row(line, index)
187
+ return unless @outputs[index][:state] == :none
188
+ return unless line.include? '%row'
189
+
190
+ @outputs[index][:type] = :row
191
+ @outputs[index][:state] = :ok
192
+
193
+ case count_spaces(line)
194
+ when 6
195
+ @outputs[index][:level] = 3
196
+ parent = find_parent(index)
197
+ unless %i[table features].include? parent
198
+ @outputs[index][:state] = :err
199
+ @outputs[index][:msg] = 'Parent(table/features) not found!'
200
+ end
201
+ when 8
202
+ @outputs[index][:level] = 4
203
+ if find_parent(index) != :template
204
+ @outputs[index][:state] = :err
205
+ @outputs[index][:msg] = 'Parent(template) not found!'
206
+ end
207
+ else
208
+ @outputs[index][:state] = :err
209
+ @outputs[index][:msg] = 'Write 6 or 8 spaces before %row'
210
+ end
211
+ end
212
+
213
+ def check_col(line, index)
214
+ return unless @outputs[index][:state] == :none
215
+ return unless line.include? '%col'
216
+
217
+ @outputs[index][:type] = :col
218
+ @outputs[index][:state] = :ok
219
+ case count_spaces(line)
220
+ when 8
221
+ @outputs[index][:level] = 4
222
+ if find_parent(index) != :row
223
+ @outputs[index][:state] = :err
224
+ @outputs[index][:msg] = 'Parent(row) not found!'
225
+ end
226
+ when 10
227
+ @outputs[index][:level] = 5
228
+ if find_parent(index) != :row
229
+ @outputs[index][:state] = :err
230
+ @outputs[index][:msg] = 'Parent(row) not found!'
231
+ end
232
+ else
233
+ @outputs[index][:state] = :err
234
+ @outputs[index][:msg] = 'Write 8 or 10 spaces before %col'
235
+ end
236
+ check_text(line, index)
237
+ end
238
+
239
+ def check_text(line, index)
240
+ return unless @outputs[index][:state] == :ok
241
+
242
+ ok = ''
243
+ %w[< >].each do |char|
244
+ ok = char if line.include? char
245
+ end
246
+ return if ok == ''
247
+
248
+ @outputs[index][:state] = :err
249
+ @outputs[index][:msg] = "Char #{ok} not allow!"
250
+ end
251
+
252
+ def check_template(line, index)
253
+ return unless @outputs[index][:state] == :none
254
+ return unless line.include? '%template'
255
+
256
+ @outputs[index][:type] = :template
257
+ @outputs[index][:level] = 3
258
+ @outputs[index][:state] = :ok
259
+ if find_parent(index) != :table
260
+ @outputs[index][:state] = :err
261
+ @outputs[index][:msg] = 'Parent(concept) not found!'
262
+ elsif !line.start_with? ' %template'
263
+ @outputs[index][:state] = :err
264
+ @outputs[index][:msg] = 'Write 6 spaces before %template'
265
+ end
266
+ end
267
+
268
+ def check_code(line, index)
269
+ return unless @outputs[index][:state] == :none
270
+ return unless line.include? '%code'
271
+
272
+ @outputs[index][:type] = :code
273
+ @outputs[index][:level] = 1
274
+ @outputs[index][:state] = :ok
275
+ if find_parent(index) != :map
276
+ @outputs[index][:state] = :err
277
+ @outputs[index][:msg] = 'Parent(map) not found!'
278
+ elsif line != ' %code'
279
+ @outputs[index][:state] = :err
280
+ @outputs[index][:msg] = 'Write 2 spaces before %code'
281
+ end
282
+ end
283
+
284
+ def check_type(line, index)
285
+ return unless @outputs[index][:state] == :none
286
+ return unless line.include? '%type'
287
+
288
+ @outputs[index][:type] = :type
289
+ @outputs[index][:level] = 2
290
+ @outputs[index][:state] = :ok
291
+ if find_parent(index) != :code
292
+ @outputs[index][:state] = :err
293
+ @outputs[index][:msg] = 'Parent(code) not found!'
294
+ elsif !line.start_with? ' %type'
295
+ @outputs[index][:state] = :err
296
+ @outputs[index][:msg] = 'Write 4 spaces before %type'
297
+ end
298
+ end
299
+
300
+ def check_path(line, index)
301
+ return unless @outputs[index][:state] == :none
302
+ return unless line.include? '%path'
303
+
304
+ @outputs[index][:type] = :path
305
+ @outputs[index][:level] = 2
306
+ @outputs[index][:state] = :ok
307
+ if find_parent(index) != :code
308
+ @outputs[index][:state] = :err
309
+ @outputs[index][:msg] = 'Parent(code) not found!'
310
+ elsif !line.start_with? ' %path'
311
+ @outputs[index][:state] = :err
312
+ @outputs[index][:msg] = 'Write 4 spaces before %type'
313
+ end
314
+ end
315
+
316
+ def check_features(line, index)
317
+ return unless @outputs[index][:state] == :none
318
+ return unless line.include? '%features'
319
+
320
+ @outputs[index][:type] = :features
321
+ @outputs[index][:level] = 2
322
+ @outputs[index][:state] = :ok
323
+ if find_parent(index) != :code
324
+ @outputs[index][:state] = :err
325
+ @outputs[index][:msg] = 'Parent(code) not found!'
326
+ elsif !line.start_with? ' %features'
327
+ @outputs[index][:state] = :err
328
+ @outputs[index][:msg] = 'Write 4 spaces before %features'
329
+ end
330
+ end
331
+
332
+ def check_unknown(line, index)
333
+ return unless @outputs[index][:state] == :none
334
+
335
+ @outputs[index][:type] = :unknown
336
+ @outputs[index][:level] = count_spaces(line) / 2
337
+ @outputs[index][:state] = :err
338
+ @outputs[index][:msg] = "Unknown tag with parent(#{find_parent(index)})!"
339
+ end
340
+
341
+ def find_parent(index)
342
+ current_level = @outputs[index][:level]
343
+ return :noparent if current_level.zero?
344
+
345
+ i = index - 1
346
+ while i >= 0
347
+ return @outputs[i][:type] if @outputs[i][:level] == current_level - 1
348
+
349
+ i -= 1
350
+ end
351
+ :noparent
352
+ end
353
+
354
+ def count_spaces(line)
355
+ a = line.split('%')
356
+ a[0].count(' ')
357
+ end
358
+ end
@@ -0,0 +1,51 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rainbow'
4
+ require_relative 'check_input/input_data'
5
+
6
+ class CheckInput
7
+ def initialize(verbose = true)
8
+ @verbose = verbose
9
+ end
10
+
11
+ def file(filepath)
12
+ @filepath = filepath
13
+ self
14
+ end
15
+
16
+ def verbose(verbose)
17
+ @verbose = verbose
18
+ self
19
+ end
20
+
21
+ def check
22
+ # Check HAML file syntax
23
+ exist = check_file_exist
24
+ return false unless exist
25
+ check_file_content
26
+ end
27
+
28
+ private
29
+
30
+ def check_file_exist
31
+ if @filepath.nil?
32
+ raise Rainbow("Can't check nil filename")
33
+ end
34
+ unless File.exist? @filepath
35
+ puts Rainbow('File not found!').red.bright if @verbose
36
+ return false
37
+ end
38
+ unless File.extname(@filepath) == '.haml'
39
+ puts Rainbow('Only check HAML files!').yellow.bright if @verbose
40
+ return false
41
+ end
42
+ true
43
+ end
44
+
45
+ def check_file_content
46
+ data = InputData.new(@filepath)
47
+ data.check
48
+ data.show_errors if @verbose
49
+ data.ok?
50
+ end
51
+ end
@@ -12,8 +12,6 @@ module ContentLoader
12
12
  # Load XML content into Asker data objects
13
13
  # @param filepath (String) File path
14
14
  # @param content (String) XML plane text content
15
- # rubocop:disable Metrics/MethodLength
16
- # rubocop:disable Metrics/AbcSize
17
15
  def self.load(filepath, content)
18
16
  concepts = []
19
17
  codes = []
@@ -94,7 +92,9 @@ module ContentLoader
94
92
  # @param filepath (String)
95
93
  # @param content (String)
96
94
  private_class_method def self.raise_error_with(filepath, content)
97
- puts Rainbow("[ERROR] ContentLoader: Format error in #{filepath}").red.bright
95
+ msg = "[ERROR] ContentLoader: Format error in #{filepath}\n"
96
+ msg += " Take a look at ouput/error.xml"
97
+ puts Rainbow(msg).red.bright
98
98
  f = File.open('output/error.xml', 'w')
99
99
  f.write(content)
100
100
  f.close
data/lib/asker.rb CHANGED
@@ -3,7 +3,7 @@
3
3
  require 'rainbow'
4
4
 
5
5
  require_relative 'asker/skeleton'
6
- require_relative 'asker/input_checker'
6
+ require_relative 'asker/check_input'
7
7
 
8
8
  require_relative 'asker/displayer/concept_displayer'
9
9
  require_relative 'asker/displayer/stats_displayer'
@@ -12,7 +12,6 @@ require_relative 'asker/logger'
12
12
 
13
13
  require_relative 'asker/loader/project_loader'
14
14
  require_relative 'asker/loader/input_loader'
15
-
16
15
  class Asker
17
16
  def self.init
18
17
  Skeleton.create_configuration
@@ -23,7 +22,7 @@ class Asker
23
22
  end
24
23
 
25
24
  def self.check(filepath)
26
- InputChecker.check(filepath)
25
+ CheckInput.new.file(filepath).check
27
26
  end
28
27
 
29
28
  def self.start(filepath)
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: asker-tool
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.2.1
4
+ version: 2.2.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - David Vargas Ruiz
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-01-23 00:00:00.000000000 Z
11
+ date: 2022-02-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: haml
@@ -52,6 +52,20 @@ dependencies:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
54
  version: '3.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rexml
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '3.2'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '3.2'
55
69
  - !ruby/object:Gem::Dependency
56
70
  name: terminal-table
57
71
  requirement: !ruby/object:Gem::Requirement
@@ -94,6 +108,20 @@ dependencies:
94
108
  - - "~>"
95
109
  - !ruby/object:Gem::Version
96
110
  version: '5.11'
111
+ - !ruby/object:Gem::Dependency
112
+ name: pry-byebug
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - "~>"
116
+ - !ruby/object:Gem::Version
117
+ version: '3.9'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - "~>"
123
+ - !ruby/object:Gem::Version
124
+ version: '3.9'
97
125
  - !ruby/object:Gem::Dependency
98
126
  name: rubocop
99
127
  requirement: !ruby/object:Gem::Requirement
@@ -142,6 +170,8 @@ files:
142
170
  - lib/asker/ai/stages/stage_s.rb
143
171
  - lib/asker/ai/stages/stage_t.rb
144
172
  - lib/asker/application.rb
173
+ - lib/asker/check_input.rb
174
+ - lib/asker/check_input/input_data.rb
145
175
  - lib/asker/cli.rb
146
176
  - lib/asker/data/code.rb
147
177
  - lib/asker/data/column.rb
@@ -206,7 +236,6 @@ files:
206
236
  - lib/asker/formatter/question_moodle_formatter.rb
207
237
  - lib/asker/formatter/question_moodlexml_formatter.rb
208
238
  - lib/asker/formatter/rb2haml_formatter.rb
209
- - lib/asker/input_checker.rb
210
239
  - lib/asker/lang/lang.rb
211
240
  - lib/asker/lang/lang_factory.rb
212
241
  - lib/asker/lang/text_actions.rb
@@ -1,450 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'rainbow'
4
-
5
- ##
6
- # Check HAML file syntax
7
- module InputChecker
8
-
9
- def self.check(filepath, verbose = true)
10
- exist = check_file_exist(filepath, verbose)
11
- return false unless exist
12
- check_file_content(filepath, verbose)
13
- end
14
-
15
- def self.check_file_exist(filepath, verbose = true)
16
- unless File.exist? filepath
17
- puts Rainbow('File not found!').red.bright if verbose
18
- return false
19
- end
20
- unless File.extname(filepath) == '.haml'
21
- puts Rainbow('Only check HAML files!').yellow.bright if verbose
22
- return false
23
- end
24
- true
25
- end
26
-
27
- def self.check_file_content(filepath, verbose = true)
28
- data = Data.new(filepath)
29
- data.check
30
- data.show_errors if verbose
31
- data.ok?
32
- end
33
-
34
- # rubocop:disable Metrics/ClassLength
35
- class Data
36
- attr_reader :inputs, :outputs
37
-
38
- # rubocop:disable Metrics/MethodLength
39
- def initialize(filepath)
40
- @inputs = File.read(filepath).split("\n")
41
- @outputs = []
42
- @inputs.each_with_index do |line, index|
43
- output = { id: index,
44
- level: 0,
45
- state: :none,
46
- type: :none,
47
- source: line,
48
- msg: '' }
49
- @outputs << output
50
- end
51
- @ok = false
52
- end
53
- # rubocop:enable Metrics/MethodLength
54
-
55
- def ok?
56
- @ok
57
- end
58
-
59
- def show
60
- @outputs.each do |i|
61
- puts "#{i[:id]}: #{i[:state]} [#{i[:type]}] #{i[:msg]}"
62
- end
63
- end
64
-
65
- def show_errors
66
- errors = 0
67
- # puts "Line : Error description"
68
- @outputs.each do |i|
69
- next if i[:state] == :ok
70
-
71
- errors += 1
72
- if errors < 11
73
- data = { id: i[:id], msg: i[:msg], source: i[:source][0, 40] }
74
- order = i[:id] + 1
75
- data = { order: order, msg: i[:msg], source: i[:source][0, 40] }
76
- puts format(' %<order>03d : %<msg>s. => %<source>s', data)
77
- end
78
- puts '...' if errors == 11
79
- end
80
-
81
- if errors.positive?
82
- puts Rainbow("[ERROR] #{errors} errors " \
83
- "from #{@inputs.size} lines!").red.bright
84
- end
85
- puts Rainbow('Syntax OK!').green if errors.zero?
86
- end
87
- # rubocop:enable Metrics/AbcSize
88
- # rubocop:enable Metrics/MethodLength
89
-
90
- # rubocop:disable Metrics/MethodLength
91
- # rubocop:disable Metrics/AbcSize
92
- def check
93
- @ok = true
94
- @inputs.each_with_index do |line, index|
95
- check_empty_lines(line, index)
96
- check_map(line, index)
97
- check_concept(line, index)
98
- check_names(line, index)
99
- check_tags(line, index)
100
- check_def(line, index)
101
- check_table(line, index)
102
- check_row(line, index)
103
- check_col(line, index)
104
- check_template(line, index)
105
- check_code(line, index)
106
- check_type(line, index)
107
- check_path(line, index)
108
- check_features(line, index)
109
- check_unknown(line, index)
110
- @ok = false unless @outputs[index][:state] == :ok
111
- @ok = false if @outputs[index][:type] == :unkown
112
- end
113
- @ok
114
- end
115
- # rubocop:enable Metrics/MethodLength
116
- # rubocop:enable Metrics/AbcSize
117
-
118
- private
119
-
120
- def check_empty_lines(line, index)
121
- return unless line.strip.size.zero? || line.start_with?('#')
122
-
123
- @outputs[index][:type] = :empty
124
- @outputs[index][:level] = -1
125
- @outputs[index][:state] = :ok
126
- end
127
-
128
- # rubocop:disable Metrics/MethodLength
129
- # rubocop:disable Metrics/AbcSize
130
- def check_map(line, index)
131
- if index.zero?
132
- @outputs[index][:type] = :map
133
- if line.start_with?('%map{')
134
- @outputs[index][:state] = :ok
135
- else
136
- @outputs[index][:state] = :err
137
- @outputs[index][:msg] = 'Start with %map{'
138
- end
139
- elsif index.positive? && line.include?('%map{')
140
- @outputs[index][:state] = :err
141
- @outputs[index][:type] = :map
142
- @outputs[index][:msg] = 'Write %map on line 0'
143
- end
144
- end
145
- # rubocop:enable Metrics/MethodLength
146
- # rubocop:enable Metrics/AbcSize
147
-
148
- # rubocop:disable Metrics/MethodLength
149
- # rubocop:disable Metrics/AbcSize
150
- def check_concept(line, index)
151
- return unless @outputs[index][:state] == :none
152
- return unless line.include? '%concept'
153
-
154
- @outputs[index][:type] = :concept
155
- @outputs[index][:level] = 1
156
- @outputs[index][:state] = :ok
157
- if find_parent(index) != :map
158
- @outputs[index][:state] = :err
159
- @outputs[index][:msg] = 'Parent(map) not found!'
160
- elsif line != ' %concept'
161
- @outputs[index][:state] = :err
162
- @outputs[index][:msg] = 'Write 2 spaces before %concept'
163
- end
164
- end
165
- # rubocop:enable Metrics/MethodLength
166
- # rubocop:enable Metrics/AbcSize
167
-
168
- # rubocop:disable Metrics/AbcSize
169
- # rubocop:disable Metrics/MethodLength
170
- def check_names(line, index)
171
- return unless @outputs[index][:state] == :none
172
- return unless line.include? '%names'
173
-
174
- @outputs[index][:type] = :names
175
- @outputs[index][:level] = 2
176
- @outputs[index][:state] = :ok
177
- if find_parent(index) != :concept
178
- @outputs[index][:state] = :err
179
- @outputs[index][:msg] = 'Parent(concept) not found!'
180
- elsif !line.start_with? ' %names'
181
- @outputs[index][:state] = :err
182
- @outputs[index][:msg] = 'Write 4 spaces before %names'
183
- end
184
- end
185
- # rubocop:enable Metrics/AbcSize
186
- # rubocop:enable Metrics/MethodLength
187
-
188
- # rubocop:disable Metrics/AbcSize
189
- # rubocop:disable Metrics/MethodLength
190
- def check_tags(line, index)
191
- return unless @outputs[index][:state] == :none
192
- return unless line.include? '%tags'
193
-
194
- @outputs[index][:type] = :tags
195
- @outputs[index][:level] = 2
196
- @outputs[index][:state] = :ok
197
- if find_parent(index) != :concept
198
- @outputs[index][:state] = :err
199
- @outputs[index][:msg] = 'Parent(concept) not found!'
200
- elsif !line.start_with? ' %tags'
201
- @outputs[index][:state] = :err
202
- @outputs[index][:msg] = 'Write 4 spaces before %tags'
203
- end
204
- end
205
- # rubocop:enable Metrics/AbcSize
206
- # rubocop:enable Metrics/MethodLength
207
-
208
- # rubocop:disable Metrics/AbcSize
209
- # rubocop:disable Metrics/MethodLength
210
- def check_def(line, index)
211
- return unless @outputs[index][:state] == :none
212
- return unless line.include? '%def'
213
-
214
- @outputs[index][:type] = :def
215
- @outputs[index][:level] = 2
216
- @outputs[index][:state] = :ok
217
- if find_parent(index) != :concept
218
- @outputs[index][:state] = :err
219
- @outputs[index][:msg] = 'Parent(concept) not found!'
220
- elsif !line.start_with? ' %def'
221
- @outputs[index][:state] = :err
222
- @outputs[index][:msg] = 'Write 4 spaces before %def'
223
- end
224
- end
225
- # rubocop:enable Metrics/AbcSize
226
- # rubocop:enable Metrics/MethodLength
227
-
228
- # rubocop:disable Metrics/AbcSize
229
- # rubocop:disable Metrics/MethodLength
230
- def check_table(line, index)
231
- return unless @outputs[index][:state] == :none
232
- return unless line.include? '%table'
233
-
234
- @outputs[index][:type] = :table
235
- @outputs[index][:level] = 2
236
- @outputs[index][:state] = :ok
237
- if find_parent(index) != :concept
238
- @outputs[index][:state] = :err
239
- @outputs[index][:msg] = 'Parent(concept) not found!'
240
- elsif !line.start_with? ' %table'
241
- @outputs[index][:state] = :err
242
- @outputs[index][:msg] = 'Write 4 spaces before %table'
243
- end
244
- end
245
- # rubocop:enable Metrics/AbcSize
246
- # rubocop:enable Metrics/MethodLength
247
-
248
- # rubocop:disable Metrics/AbcSize
249
- # rubocop:disable Metrics/MethodLength
250
- def check_row(line, index)
251
- return unless @outputs[index][:state] == :none
252
- return unless line.include? '%row'
253
-
254
- @outputs[index][:type] = :row
255
- @outputs[index][:state] = :ok
256
-
257
- case count_spaces(line)
258
- when 6
259
- @outputs[index][:level] = 3
260
- parent = find_parent(index)
261
- unless %i[table features].include? parent
262
- @outputs[index][:state] = :err
263
- @outputs[index][:msg] = 'Parent(table/features) not found!'
264
- end
265
- when 8
266
- @outputs[index][:level] = 4
267
- if find_parent(index) != :template
268
- @outputs[index][:state] = :err
269
- @outputs[index][:msg] = 'Parent(template) not found!'
270
- end
271
- else
272
- @outputs[index][:state] = :err
273
- @outputs[index][:msg] = 'Write 6 or 8 spaces before %row'
274
- end
275
- end
276
- # rubocop:enable Metrics/AbcSize
277
- # rubocop:enable Metrics/MethodLength
278
-
279
- # rubocop:disable Metrics/AbcSize
280
- # rubocop:disable Metrics/MethodLength
281
- def check_col(line, index)
282
- return unless @outputs[index][:state] == :none
283
- return unless line.include? '%col'
284
-
285
- @outputs[index][:type] = :col
286
- @outputs[index][:state] = :ok
287
- case count_spaces(line)
288
- when 8
289
- @outputs[index][:level] = 4
290
- if find_parent(index) != :row
291
- @outputs[index][:state] = :err
292
- @outputs[index][:msg] = 'Parent(row) not found!'
293
- end
294
- when 10
295
- @outputs[index][:level] = 5
296
- if find_parent(index) != :row
297
- @outputs[index][:state] = :err
298
- @outputs[index][:msg] = 'Parent(row) not found!'
299
- end
300
- else
301
- @outputs[index][:state] = :err
302
- @outputs[index][:msg] = 'Write 8 or 10 spaces before %col'
303
- end
304
- check_text(line, index)
305
- end
306
- # rubocop:enable Metrics/AbcSize
307
- # rubocop:enable Metrics/MethodLength
308
-
309
- def check_text(line, index)
310
- return unless @outputs[index][:state] == :ok
311
-
312
- ok = ''
313
- %w[< >].each do |char|
314
- ok = char if line.include? char
315
- end
316
- return if ok == ''
317
-
318
- @outputs[index][:state] = :err
319
- @outputs[index][:msg] = "Char #{ok} not allow!"
320
- end
321
-
322
- # rubocop:disable Metrics/MethodLength
323
- # rubocop:disable Metrics/AbcSize
324
- def check_template(line, index)
325
- return unless @outputs[index][:state] == :none
326
- return unless line.include? '%template'
327
-
328
- @outputs[index][:type] = :template
329
- @outputs[index][:level] = 3
330
- @outputs[index][:state] = :ok
331
- if find_parent(index) != :table
332
- @outputs[index][:state] = :err
333
- @outputs[index][:msg] = 'Parent(concept) not found!'
334
- elsif !line.start_with? ' %template'
335
- @outputs[index][:state] = :err
336
- @outputs[index][:msg] = 'Write 6 spaces before %template'
337
- end
338
- end
339
- # rubocop:enable Metrics/AbcSize
340
- # rubocop:enable Metrics/MethodLength
341
-
342
- # rubocop:disable Metrics/MethodLength
343
- # rubocop:disable Metrics/AbcSize
344
- def check_code(line, index)
345
- return unless @outputs[index][:state] == :none
346
- return unless line.include? '%code'
347
-
348
- @outputs[index][:type] = :code
349
- @outputs[index][:level] = 1
350
- @outputs[index][:state] = :ok
351
- if find_parent(index) != :map
352
- @outputs[index][:state] = :err
353
- @outputs[index][:msg] = 'Parent(map) not found!'
354
- elsif line != ' %code'
355
- @outputs[index][:state] = :err
356
- @outputs[index][:msg] = 'Write 2 spaces before %code'
357
- end
358
- end
359
- # rubocop:enable Metrics/MethodLength
360
- # rubocop:enable Metrics/AbcSize
361
-
362
- # rubocop:disable Metrics/MethodLength
363
- # rubocop:disable Metrics/AbcSize
364
- def check_type(line, index)
365
- return unless @outputs[index][:state] == :none
366
- return unless line.include? '%type'
367
-
368
- @outputs[index][:type] = :type
369
- @outputs[index][:level] = 2
370
- @outputs[index][:state] = :ok
371
- if find_parent(index) != :code
372
- @outputs[index][:state] = :err
373
- @outputs[index][:msg] = 'Parent(code) not found!'
374
- elsif !line.start_with? ' %type'
375
- @outputs[index][:state] = :err
376
- @outputs[index][:msg] = 'Write 4 spaces before %type'
377
- end
378
- end
379
- # rubocop:enable Metrics/AbcSize
380
- # rubocop:enable Metrics/MethodLength
381
-
382
- # rubocop:disable Metrics/MethodLength
383
- # rubocop:disable Metrics/AbcSize
384
- def check_path(line, index)
385
- return unless @outputs[index][:state] == :none
386
- return unless line.include? '%path'
387
-
388
- @outputs[index][:type] = :path
389
- @outputs[index][:level] = 2
390
- @outputs[index][:state] = :ok
391
- if find_parent(index) != :code
392
- @outputs[index][:state] = :err
393
- @outputs[index][:msg] = 'Parent(code) not found!'
394
- elsif !line.start_with? ' %path'
395
- @outputs[index][:state] = :err
396
- @outputs[index][:msg] = 'Write 4 spaces before %type'
397
- end
398
- end
399
- # rubocop:enable Metrics/AbcSize
400
- # rubocop:enable Metrics/MethodLength
401
-
402
- # rubocop:disable Metrics/MethodLength
403
- # rubocop:disable Metrics/AbcSize
404
- def check_features(line, index)
405
- return unless @outputs[index][:state] == :none
406
- return unless line.include? '%features'
407
-
408
- @outputs[index][:type] = :features
409
- @outputs[index][:level] = 2
410
- @outputs[index][:state] = :ok
411
- if find_parent(index) != :code
412
- @outputs[index][:state] = :err
413
- @outputs[index][:msg] = 'Parent(code) not found!'
414
- elsif !line.start_with? ' %features'
415
- @outputs[index][:state] = :err
416
- @outputs[index][:msg] = 'Write 4 spaces before %features'
417
- end
418
- end
419
- # rubocop:enable Metrics/AbcSize
420
- # rubocop:enable Metrics/MethodLength
421
-
422
- def check_unknown(line, index)
423
- return unless @outputs[index][:state] == :none
424
-
425
- @outputs[index][:type] = :unknown
426
- @outputs[index][:level] = count_spaces(line) / 2
427
- @outputs[index][:state] = :err
428
- @outputs[index][:msg] = "Unknown tag with parent(#{find_parent(index)})!"
429
- end
430
-
431
- def find_parent(index)
432
- current_level = @outputs[index][:level]
433
- return :noparent if current_level.zero?
434
-
435
- i = index - 1
436
- while i >= 0
437
- return @outputs[i][:type] if @outputs[i][:level] == current_level - 1
438
-
439
- i -= 1
440
- end
441
- :noparent
442
- end
443
-
444
- def count_spaces(line)
445
- a = line.split('%')
446
- a[0].count(' ')
447
- end
448
- end
449
- # rubocop:enable Metrics/ClassLength
450
- end