asker-tool 2.1.5 → 2.2.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (105) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +13 -17
  3. data/bin/asker +2 -1
  4. data/lib/asker/ai/ai.rb +10 -3
  5. data/lib/asker/ai/ai_calculate.rb +20 -6
  6. data/lib/asker/ai/code/base_code_ai.rb +104 -0
  7. data/lib/asker/{code/ai → ai/code}/code_ai_factory.rb +11 -1
  8. data/lib/asker/{code/ai → ai/code}/javascript_code_ai.rb +2 -5
  9. data/lib/asker/ai/code/problem_code_ai.rb +176 -0
  10. data/lib/asker/{code/ai → ai/code}/python_code_ai.rb +2 -5
  11. data/lib/asker/{code/ai → ai/code}/ruby_code_ai.rb +14 -7
  12. data/lib/asker/{code/ai → ai/code}/sql_code_ai.rb +2 -5
  13. data/lib/asker/ai/concept_ai.rb +13 -3
  14. data/lib/asker/ai/question.rb +28 -6
  15. data/lib/asker/ai/stages/base_stage.rb +45 -6
  16. data/lib/asker/ai/stages/stage_b.rb +100 -50
  17. data/lib/asker/ai/stages/stage_d.rb +75 -90
  18. data/lib/asker/ai/stages/stage_f.rb +64 -36
  19. data/lib/asker/ai/stages/stage_i.rb +79 -92
  20. data/lib/asker/ai/stages/stage_s.rb +41 -36
  21. data/lib/asker/ai/stages/stage_t.rb +149 -108
  22. data/lib/asker/application.rb +19 -11
  23. data/lib/asker/cli.rb +31 -44
  24. data/lib/asker/data/code.rb +62 -0
  25. data/lib/asker/data/column.rb +31 -21
  26. data/lib/asker/data/concept.rb +109 -65
  27. data/lib/asker/data/data_field.rb +14 -0
  28. data/lib/asker/data/project_data.rb +63 -0
  29. data/lib/asker/data/row.rb +75 -52
  30. data/lib/asker/data/table.rb +91 -42
  31. data/lib/asker/data/template.rb +3 -1
  32. data/lib/asker/data/world.rb +51 -35
  33. data/lib/asker/displayer/code_displayer.rb +7 -0
  34. data/lib/asker/displayer/concept_ai_displayer.erb +10 -0
  35. data/lib/asker/displayer/concept_ai_displayer.rb +74 -53
  36. data/lib/asker/displayer/concept_displayer.rb +16 -9
  37. data/lib/asker/displayer/stats_displayer.rb +12 -3
  38. data/lib/asker/exporter/concept_ai_gift_exporter.rb +19 -11
  39. data/lib/asker/exporter/concept_ai_moodle_exporter.rb +44 -0
  40. data/lib/asker/exporter/concept_ai_yaml_exporter.rb +13 -6
  41. data/lib/asker/exporter/concept_doc_exporter.rb +14 -1
  42. data/lib/asker/exporter/data_gift_exporter.rb +29 -0
  43. data/lib/asker/exporter/output_file_exporter.rb +9 -6
  44. data/lib/asker/files/{config.ini → asker.ini} +48 -1
  45. data/lib/asker/files/example-concept.haml +0 -1
  46. data/lib/asker/files/language/du/connectors.yaml +81 -0
  47. data/lib/asker/{lang/locales/fr → files/language/du}/mistakes.yaml +1 -1
  48. data/lib/asker/files/language/du/templates.yaml +29 -0
  49. data/lib/asker/{lang/locales → files/language}/en/connectors.yaml +0 -0
  50. data/lib/asker/{lang/locales → files/language}/en/mistakes.yaml +0 -0
  51. data/lib/asker/files/language/en/templates.yaml +29 -0
  52. data/lib/asker/{lang/locales → files/language}/es/connectors.yaml +0 -0
  53. data/lib/asker/files/language/es/mistakes.yaml +84 -0
  54. data/lib/asker/files/language/es/templates.yaml +29 -0
  55. data/lib/asker/files/language/fr/connectors.yaml +76 -0
  56. data/lib/asker/{lang/locales/es → files/language/fr}/mistakes.yaml +0 -0
  57. data/lib/asker/files/language/fr/templates.yaml +29 -0
  58. data/lib/asker/{lang/locales → files/language}/javascript/connectors.yaml +0 -0
  59. data/lib/asker/{lang/locales → files/language}/javascript/mistakes.yaml +0 -0
  60. data/lib/asker/{lang/locales → files/language}/javascript/templates.yaml +0 -0
  61. data/lib/asker/{lang/locales → files/language}/math/connectors.yaml +0 -0
  62. data/lib/asker/{lang/locales → files/language}/math/mistakes.yaml +0 -0
  63. data/lib/asker/{lang/locales → files/language}/math/templates.yaml +0 -0
  64. data/lib/asker/{lang/locales → files/language}/python/connectors.yaml +0 -0
  65. data/lib/asker/{lang/locales → files/language}/python/mistakes.yaml +0 -0
  66. data/lib/asker/{lang/locales → files/language}/python/templates.yaml +0 -0
  67. data/lib/asker/{lang/locales → files/language}/ruby/connectors.yaml +0 -0
  68. data/lib/asker/{lang/locales → files/language}/ruby/mistakes.yaml +0 -0
  69. data/lib/asker/{lang/locales → files/language}/ruby/templates.yaml +0 -0
  70. data/lib/asker/{lang/locales → files/language}/sql/connectors.yaml +0 -0
  71. data/lib/asker/{lang/locales → files/language}/sql/mistakes.yaml +0 -0
  72. data/lib/asker/{lang/locales → files/language}/sql/templates.yaml +0 -0
  73. data/lib/asker/formatter/concept_doc_formatter.rb +0 -4
  74. data/lib/asker/formatter/concept_string_formatter.rb +7 -4
  75. data/lib/asker/formatter/moodle/matching.erb +38 -0
  76. data/lib/asker/formatter/moodle/multichoice.erb +49 -0
  77. data/lib/asker/formatter/moodle/shortanswer.erb +30 -0
  78. data/lib/asker/formatter/moodle/truefalse.erb +47 -0
  79. data/lib/asker/formatter/question_gift_formatter.rb +30 -20
  80. data/lib/asker/formatter/question_moodle_formatter.rb +27 -0
  81. data/lib/asker/{checker.rb → input_checker.rb} +126 -49
  82. data/lib/asker/lang/lang.rb +17 -10
  83. data/lib/asker/lang/lang_factory.rb +32 -5
  84. data/lib/asker/lang/text_actions.rb +87 -69
  85. data/lib/asker/loader/code_loader.rb +4 -4
  86. data/lib/asker/loader/content_loader.rb +21 -19
  87. data/lib/asker/loader/directory_loader.rb +1 -8
  88. data/lib/asker/loader/embedded_file.rb +42 -0
  89. data/lib/asker/loader/file_loader.rb +3 -14
  90. data/lib/asker/loader/haml_loader.rb +15 -0
  91. data/lib/asker/loader/image_url_loader.rb +8 -12
  92. data/lib/asker/loader/input_loader.rb +13 -15
  93. data/lib/asker/loader/project_loader.rb +25 -15
  94. data/lib/asker/logger.rb +36 -9
  95. data/lib/asker/skeleton.rb +23 -13
  96. data/lib/asker.rb +76 -42
  97. metadata +53 -54
  98. data/lib/asker/code/ai/base_code_ai.rb +0 -48
  99. data/lib/asker/code/code.rb +0 -53
  100. data/lib/asker/lang/locales/du/templates.yaml +0 -50
  101. data/lib/asker/lang/locales/en/templates.yaml +0 -29
  102. data/lib/asker/lang/locales/es/templates.yaml +0 -29
  103. data/lib/asker/lang/locales/fr/connectors.yaml +0 -92
  104. data/lib/asker/lang/locales/fr/templates.yaml +0 -29
  105. data/lib/asker/project.rb +0 -172
@@ -3,20 +3,35 @@
3
3
  require 'rainbow'
4
4
  require 'rexml/document'
5
5
 
6
- require_relative '../project'
7
6
  require_relative '../lang/lang_factory'
7
+ require_relative '../loader/embedded_file'
8
8
  require_relative 'table'
9
9
  require_relative 'data_field'
10
10
 
11
+ ##
11
12
  # Store Concept information
13
+ # rubocop:disable Metrics/ClassLength
14
+ # rubocop:disable Style/ClassVars
12
15
  class Concept
13
- attr_reader :id, :lang, :context
14
- attr_reader :names, :type, :filename
15
- attr_reader :data
16
- attr_accessor :process
17
-
18
- @@id = 0
19
-
16
+ attr_reader :id # Unique identifer (Integer)
17
+ attr_reader :lang # Lang code (By default is the same as map lang)
18
+ attr_reader :context # Context inherits from map
19
+ attr_reader :names # Names used to identify or name this concept
20
+ attr_reader :type # type = text -> Name values are only text
21
+ attr_reader :filename # Filename where this concept is defined
22
+ attr_reader :data # Data about this concept
23
+ attr_accessor :process # (Boolean) if it is necesary generate questions
24
+
25
+ @@id = 0 # Global Concept counter (concept identifier)
26
+
27
+ ##
28
+ # Initilize Concept
29
+ # @param xml_data (XML)
30
+ # @param filename (String)
31
+ # @param lang_code (String)
32
+ # @param context (Array)
33
+ # rubocop:disable Metrics/MethodLength
34
+ # rubocop:disable Metrics/AbcSize
20
35
  def initialize(xml_data, filename, lang_code = 'en', context = [])
21
36
  @@id += 1
22
37
  @id = @@id
@@ -38,16 +53,17 @@ class Concept
38
53
 
39
54
  @data = {}
40
55
  @data[:tags] = []
41
- @data[:texts] = []
42
- @data[:images] = [] # TODO: By now, We'll treat images separated from texts
43
- @data[:textfile_paths] = [] # TODO: By now, We'll treat this separated from texts
56
+ @data[:texts] = [] # Used by standard def inputs
57
+ @data[:images] = [] # Used by [type => file and type => image_url] def inputs
44
58
  @data[:tables] = []
45
59
  @data[:neighbors] = []
46
60
  @data[:reference_to] = []
47
61
  @data[:referenced_by] = []
48
62
 
49
- read_data_from_xml(xml_data)
63
+ read_data_from_xml(xml_data)
50
64
  end
65
+ # rubocop:enable Metrics/MethodLength
66
+ # rubocop:enable Metrics/AbcSize
51
67
 
52
68
  def name(option = :raw)
53
69
  DataField.new(@names[0], @id, @type).get(option)
@@ -71,46 +87,85 @@ class Concept
71
87
  @data[:neighbors].reverse!
72
88
  end
73
89
 
90
+ # rubocop:disable Metrics/MethodLength
91
+ # rubocop:disable Metrics/AbcSize
92
+ # rubocop:disable Metrics/CyclomaticComplexity
74
93
  def calculate_nearness_to_concept(other)
75
- weights = Project.instance.formula_weights
94
+ a = ProjectData.instance.get(:weights)
95
+ #Application.instance.config['ai']['formula_weights']
96
+ weights = a.split(',').map(&:to_f)
76
97
 
77
- li_max1 = @context.count
78
- li_max2 = @data[:tags].count
79
- li_max3 = @data[:tables].count
98
+ max1 = @context.count
99
+ max2 = @data[:tags].count
100
+ max3 = @data[:tables].count
80
101
 
81
- lf_alike1 = lf_alike2 = lf_alike3 = 0.0
102
+ alike1 = alike2 = alike3 = 0.0
82
103
 
83
104
  # check if exists this items from concept1 into concept2
84
- @context.each { |i| lf_alike1 += 1.0 unless other.context.index(i).nil? }
85
- @data[:tags].each { |i| lf_alike2 += 1.0 unless other.tags.index(i).nil? }
86
- @data[:tables].each { |i| lf_alike3 += 1.0 unless other.tables.index(i).nil? }
105
+ @context.each { |i| alike1 += 1.0 unless other.context.index(i).nil? }
106
+ @data[:tags].each { |i| alike2 += 1.0 unless other.tags.index(i).nil? }
107
+ @data[:tables].each { |i| alike3 += 1.0 unless other.tables.index(i).nil? }
87
108
 
88
- lf_alike = (lf_alike1 * weights[0] + lf_alike2 * weights[1] + lf_alike3 * weights[2])
89
- li_max = (li_max1 * weights[0] + li_max2 * weights[1] + li_max3 * weights[2])
90
- (lf_alike * 100.0 / li_max)
109
+ alike = (alike1 * weights[0] + alike2 * weights[1] + alike3 * weights[2])
110
+ max = (max1 * weights[0] + max2 * weights[1] + max3 * weights[2])
111
+ (alike * 100.0 / max)
91
112
  end
113
+ # rubocop:enable Metrics/MethodLength
114
+ # rubocop:enable Metrics/AbcSize
115
+ # rubocop:enable Metrics/CyclomaticComplexity
92
116
 
117
+ # rubocop:disable Metrics/MethodLength
118
+ # rubocop:disable Metrics/AbcSize
93
119
  def try_adding_references(other)
94
120
  reference_to = 0
95
- @data[:tags].each { |i| reference_to += 1 unless other.names.index(i.downcase).nil? }
121
+ @data[:tags].each do |i|
122
+ reference_to += 1 unless other.names.index(i.downcase).nil?
123
+ end
96
124
  @data[:texts].each do |t|
97
125
  text = t.clone
98
126
  text.split(' ').each do |word|
99
127
  reference_to += 1 unless other.names.index(word.downcase).nil?
100
128
  end
101
129
  end
102
- if reference_to.positive?
103
- @data[:reference_to] << other.name
104
- other.data[:referenced_by] << name
105
- end
130
+ return unless reference_to.positive?
131
+
132
+ @data[:reference_to] << other.name
133
+ other.data[:referenced_by] << name
134
+ end
135
+ # rubocop:enable Metrics/MethodLength
136
+ # rubocop:enable Metrics/AbcSize
137
+
138
+ def tags
139
+ @data[:tags]
140
+ end
141
+
142
+ def texts
143
+ @data[:texts]
144
+ end
145
+
146
+ def images
147
+ @data[:images]
148
+ end
149
+
150
+ def tables
151
+ @data[:tables]
106
152
  end
107
153
 
108
- def method_missing(method)
109
- @data[method]
154
+ def neighbors
155
+ @data[:neighbors]
156
+ end
157
+
158
+ def reference_to
159
+ @data[:reference_to]
160
+ end
161
+
162
+ def referenced_by
163
+ @data[:referenced_by]
110
164
  end
111
165
 
112
166
  private
113
167
 
168
+ # rubocop:disable Metrics/MethodLength
114
169
  def read_data_from_xml(xml_data)
115
170
  xml_data.elements.each do |i|
116
171
  case i.name
@@ -118,24 +173,17 @@ class Concept
118
173
  process_names(i)
119
174
  when 'tags'
120
175
  process_tags(i)
121
- when 'context'
122
- # DEPRECATED: Don't use xml tag <context>
123
- # instead define it as attibute of root xml tag
124
- process_context(i)
125
- when 'text'
126
- # DEPRECATED: Use xml tag <def> instead of <text>
127
- process_text(i)
128
176
  when 'def'
129
177
  process_def(i)
130
178
  when 'table'
131
179
  @data[:tables] << Table.new(self, i)
132
180
  else
133
- text = " [ERROR] <#{i.name}> unkown XML attribute for concept #{name}"
134
- msg = Rainbow(text).color(:red)
135
- Project.instance.verbose msg
181
+ text = " [ERROR] Concept #{name} with unkown attribute: #{i.name}"
182
+ puts Rainbow(text).color(:red)
136
183
  end
137
184
  end
138
185
  end
186
+ # rubocop:enable Metrics/MethodLength
139
187
 
140
188
  def process_names(value)
141
189
  @names = []
@@ -145,39 +193,35 @@ class Concept
145
193
  end
146
194
 
147
195
  def process_tags(value)
148
- raise '[Error] tags label empty!' if value.text.nil? || value.text.size.zero?
196
+ if value.text.nil? || value.text.size.zero?
197
+ puts Rainbow("[ERROR] Concept #{name} has tags empty!").red.briht
198
+ exit 1
199
+ end
200
+
149
201
  @data[:tags] = value.text.split(',')
150
202
  @data[:tags].collect!(&:strip)
151
203
  end
152
204
 
153
- def process_context(value)
154
- msg = ' │  ' + Rainbow(' [DEPRECATED] Concept ').yellow
155
- msg += Rainbow(name).yellow.bright
156
- msg += Rainbow(' move <context> tag info to <map>.').yellow
157
- Project.instance.verbose msg
158
- @context = value.text.split(',')
159
- @context.collect!(&:strip)
160
- end
161
-
162
- def process_text(value)
163
- msg = ' │  ' + Rainbow(' [DEPRECATED] Concept ').yellow
164
- msg += Rainbow(name).yellow.bright
165
- msg += Rainbow(' replace <text> tag by <def>.').yellow
166
- Project.instance.verbose msg
167
- @data[:texts] << value.text.strip
168
- end
169
-
205
+ # rubocop:disable Metrics/AbcSize
206
+ # rubocop:disable Metrics/MethodLength
170
207
  def process_def(value)
171
208
  case value.attributes['type']
172
- when 'image'
173
- msg = "[DEBUG] Concept#read_xml: image #{Rainbow(value.text).bright}"
174
- Project.instance.verbose Rainbow(msg).yellow
175
209
  when 'image_url'
176
- @data[:images] << value.text.strip
177
- when 'textfile_path'
178
- @data[:textfile_paths] << value.text.strip
179
- else
210
+ # Link with remote image
211
+ @data[:images] << EmbeddedFile.load(value.text.strip, File.dirname(@filename))
212
+ when 'file'
213
+ # Load local images and text files
214
+ @data[:images] << EmbeddedFile.load(value.text.strip, File.dirname(@filename))
215
+ when nil
180
216
  @data[:texts] << value.text.strip
217
+ else
218
+ msg = "[ERROR] Unknown type: #{value.attributes['type']}"
219
+ puts Rainbow(msg).red.bright
220
+ exit 1
181
221
  end
182
222
  end
223
+ # rubocop:enable Metrics/AbcSize
224
+ # rubocop:enable Metrics/MethodLength
183
225
  end
226
+ # rubocop:enable Metrics/ClassLength
227
+ # rubocop:enable Style/ClassVars
@@ -8,12 +8,19 @@
8
8
  class DataField
9
9
  attr_reader :id, :type
10
10
 
11
+ ##
12
+ # initialize DataField
11
13
  def initialize(data, id, type)
12
14
  @data = data
13
15
  @id = id.to_i # TODO: revise where it comes from? Is it unique value?
14
16
  @type = type.to_sym
15
17
  end
16
18
 
19
+ ##
20
+ # Return internal data
21
+ # @param option (Symbol)
22
+ # @return String
23
+ # rubocop:disable Metrics/MethodLength
17
24
  def get(option = :raw)
18
25
  case @type
19
26
  when :text
@@ -27,6 +34,7 @@ class DataField
27
34
  end
28
35
  raise ".get: data=#{@data}, type=#{@type}, option=#{option}"
29
36
  end
37
+ # rubocop:enable Metrics/MethodLength
30
38
 
31
39
  private
32
40
 
@@ -36,6 +44,7 @@ class DataField
36
44
  @data
37
45
  end
38
46
 
47
+ # rubocop:disable Metrics/MethodLength
39
48
  def get_textfile_path(option)
40
49
  case option
41
50
  when :raw
@@ -50,7 +59,9 @@ class DataField
50
59
  end
51
60
  raise ".get_textfile_path: data=#{@data}, type=#{@type}, option=#{option}"
52
61
  end
62
+ # rubocop:enable Metrics/MethodLength
53
63
 
64
+ # rubocop:disable Metrics/MethodLength
54
65
  def get_textfile_url(option)
55
66
  case option
56
67
  when :raw
@@ -64,7 +75,9 @@ class DataField
64
75
  end
65
76
  raise ".get_textfile_url: data=#{@data}, type=#{@type}, option=#{option}"
66
77
  end
78
+ # rubocop:enable Metrics/MethodLength
67
79
 
80
+ # rubocop:disable Metrics/MethodLength
68
81
  def get_image_url(option)
69
82
  case option
70
83
  when :raw
@@ -78,6 +91,7 @@ class DataField
78
91
  end
79
92
  raise ".get_image_url: data=#{@data}, type=#{@type}, option=#{option}"
80
93
  end
94
+ # rubocop:enable Metrics/MethodLength
81
95
 
82
96
  def to_screen(text)
83
97
  return text[0, 7] + '...' + text[-15, 15] if text.size > 25
@@ -0,0 +1,63 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'singleton'
4
+
5
+ class ProjectData
6
+ include Singleton
7
+ attr_reader :default, :param
8
+
9
+ def initialize
10
+ reset
11
+ end
12
+
13
+ def reset
14
+ @default = { inputbasedir: FileUtils.pwd,
15
+ stages: { d: true, b: true, f: true, i: true, s: true, t: true },
16
+ threshold: 0.5,
17
+ outputdir: 'output',
18
+ weights: '1, 1, 1' }
19
+ @param = {}
20
+ end
21
+
22
+ def get(key)
23
+ return @param[key] unless @param[key].nil?
24
+
25
+ @default[key]
26
+ end
27
+
28
+ def set(key, value)
29
+ @param[key] = value
30
+ end
31
+
32
+ ##
33
+ # Open new project
34
+ # * setting new params and
35
+ # * creating output files
36
+ # IMPORTANT: We need at least these values
37
+ # * process_file
38
+ # * inputdirs
39
+ # rubocop:disable Metrics/MethodLength
40
+ # rubocop:disable Metrics/AbcSize
41
+ def open
42
+ ext = File.extname(@param[:process_file]) || '.haml'
43
+ @param[:projectname] = @param[:projectname] ||
44
+ File.basename(@param[:process_file], ext)
45
+
46
+ @param[:logname] = "#{@param[:projectname]}-log.txt"
47
+ @param[:outputname] = "#{@param[:projectname]}-gift.txt"
48
+ @param[:lessonname] = "#{@param[:projectname]}-doc.txt"
49
+ @param[:yamlname] = "#{@param[:projectname]}.yaml"
50
+ @param[:moodlename] = "#{@param[:projectname]}-moodle.xml"
51
+
52
+ outputdir = get(:outputdir)
53
+ @param[:logpath] = File.join(outputdir, get(:logname))
54
+ @param[:outputpath] = File.join(outputdir, get(:outputname))
55
+ @param[:lessonpath] = File.join(outputdir, get(:lessonname))
56
+ @param[:yamlpath] = File.join(outputdir, get(:yamlname))
57
+ @param[:moodlepath] = File.join(outputdir, get(:moodlename))
58
+
59
+ Dir.mkdir(outputdir) unless Dir.exist?(outputdir)
60
+ end
61
+ # rubocop:enable Metrics/MethodLength
62
+ # rubocop:enable Metrics/AbcSize
63
+ end
@@ -1,93 +1,116 @@
1
+ # frozen_string_literal: true
1
2
 
2
3
  require_relative 'column'
3
4
 
5
+ ##
6
+ # Row objects
4
7
  class Row
5
8
  attr_reader :table, :index, :id
6
9
  attr_reader :langs, :types, :raws, :columns
7
10
  attr_reader :simple
8
11
 
9
- def initialize( table, index, xml_data )
12
+ ##
13
+ # Initialize Row Object
14
+ # @param table (Table)
15
+ # @param index (Integer)
16
+ # @param xml_data (XML)
17
+ def initialize(table, index, xml_data)
10
18
  @table = table
11
19
  @index = index
12
- @id = @table.id + "." + @index.to_s
20
+ @id = "#{@table.id}.#{@index}"
13
21
  @langs = @table.langs
14
22
  @types = @table.types
15
23
  @raws = []
16
24
  @columns = []
17
- @simple = { :lang => true, :type => true }
25
+ @simple = { lang: true, type: true }
18
26
  read_data_from_xml(xml_data)
19
27
  end
20
28
 
21
29
  def simple_off(option)
22
- @simple[option]=false
30
+ @simple[option] = false
23
31
  @table.simple_off(option)
24
32
  end
25
33
 
26
- private
34
+ private
27
35
 
28
- def read_data_from_xml(pXMLdata)
29
- if pXMLdata.elements.count==0 then
30
- build_row_with_1_column(pXMLdata)
36
+ def read_data_from_xml(xml_data)
37
+ if xml_data.elements.count.zero?
38
+ build_row_with_1_column(xml_data)
31
39
  else
32
- build_row_with_N_columns(pXMLdata)
40
+ build_row_with_n_columns(xml_data)
33
41
  end
34
42
 
35
- raise "[ERROR] Row: #{pXMLdata}" if @columns.size!=@table.fields.size
43
+ raise "[ERROR] Row: #{xml_data}" unless @columns.size == @table.fields.size
36
44
  end
37
45
 
38
- def build_row_with_1_column(pXMLdata)
46
+ def build_row_with_1_column(xml_data)
39
47
  # When row tag only has text, we add this text as one value array
40
48
  # This is usefull for tables with only one columns
41
- @columns = [ Column.new( self, @raws.size, pXMLdata) ]
42
- @raws = [ pXMLdata.text.strip.to_s ]
43
-
44
- #read attributes from XML data
45
- if pXMLdata.attributes['lang'] then
46
- code = pXMLdata.attributes['lang'].strip
47
- if code != @langs[0].code then
48
- @langs = [ LangFactory.instance.get(code) ]
49
- @simple[:lang]= false
50
- @table.simple_off(:lang)
51
- end
52
- end
49
+ @columns = [Column.new(self, @raws.size, xml_data)]
50
+ @raws = [xml_data.text.strip.to_s]
53
51
 
54
- if pXMLdata.attributes['type'] then
55
- type = pXMLdata.attributes['type'].strip
56
- if type != @types[0] then
57
- @types = [ type ]
58
- @simple[:type]= false
59
- @table.simple_off(:type)
60
- end
61
- end
52
+ # read attributes from XML data
53
+ read_lang_from_xml(xml_data)
54
+ read_type_from_xml(xml_data)
62
55
  end
63
56
 
64
- def build_row_with_N_columns(pXMLdata)
65
- pXMLdata.elements.each do |i|
57
+ def read_lang_from_xml(xml_data)
58
+ return unless xml_data.attributes['lang']
59
+
60
+ code = xml_data.attributes['lang'].strip
61
+ return if code == @langs[0].code
62
+
63
+ @langs = [LangFactory.instance.get(code)]
64
+ @simple[:lang] = false
65
+ @table.simple_off(:lang)
66
+ end
67
+
68
+ def read_type_from_xml(xml_data)
69
+ return unless xml_data.attributes['type']
70
+
71
+ type = xml_data.attributes['type'].strip
72
+ return if type == @types[0]
73
+
74
+ @types = [type]
75
+ @simple[:type] = false
76
+ @table.simple_off(:type)
77
+ end
78
+
79
+ # rubocop:disable Metrics/MethodLength
80
+ def build_row_with_n_columns(xml_data)
81
+ xml_data.elements.each do |i|
66
82
  case i.name
67
83
  when 'lang'
68
- j = i.text.split(",")
69
- codes = @langs.map {|i| i.code }
70
-
71
- if j.join(",")!=codes.join(",")
72
- @langs = []
73
- j.each { |k| @langs << LangFactory.instance.get(k.strip.to_s) }
74
- @simple[:lang]=false
75
- @table.simple_off(:lang)
76
- end
84
+ read_langs_from_xml(i)
77
85
  when 'type'
78
- j = i.text.split(",")
79
- if j.join(",")!=@types.join(",") then
80
- @types = []
81
- j.each { |k| @types << k.strip.to_s }
82
- @simple[:type]=false
83
- @table.simple_off(:type)
84
- end
85
- when 'col' # When row tag has several columns, we add every value to the array
86
- #Column Objects
87
- @columns << Column.new( self, @raws.size, i)
86
+ read_types_from_xml(i)
87
+ when 'col'
88
+ # When row has several columns, we add every value to the array
89
+ @columns << Column.new(self, @raws.size, i) # Column Objects
88
90
  @raws << i.text.to_s
89
91
  end
90
92
  end
91
93
  end
94
+ # rubocop:enable Metrics/MethodLength
95
+
96
+ def read_langs_from_xml(xml_data)
97
+ j = xml_data.text.split(',')
98
+ codes = @langs.map(&:code)
99
+ return if j.join(',') == codes.join(',')
100
+
101
+ @langs = []
102
+ j.each { |k| @langs << LangFactory.instance.get(k.strip.to_s) }
103
+ @simple[:lang] = false
104
+ @table.simple_off(:lang)
105
+ end
92
106
 
107
+ def read_types_from_xml(xml_data)
108
+ j = xml_data.text.split(',')
109
+ return if j.join(',') == @types.join(',')
110
+
111
+ @types = []
112
+ j.each { |k| @types << k.strip.to_s }
113
+ @simple[:type] = false
114
+ @table.simple_off(:type)
115
+ end
93
116
  end