asker-tool 2.1.7 → 2.2.3

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.
Files changed (71) hide show
  1. checksums.yaml +4 -4
  2. data/{LICENSE.txt → LICENSE} +0 -0
  3. data/README.md +14 -15
  4. data/bin/asker +1 -1
  5. data/lib/asker/ai/ai.rb +6 -3
  6. data/lib/asker/ai/ai_calculate.rb +20 -6
  7. data/lib/asker/ai/concept_ai.rb +12 -3
  8. data/lib/asker/ai/question.rb +28 -6
  9. data/lib/asker/ai/stages/base_stage.rb +45 -6
  10. data/lib/asker/ai/stages/stage_b.rb +90 -49
  11. data/lib/asker/ai/stages/stage_d.rb +69 -90
  12. data/lib/asker/ai/stages/stage_f.rb +47 -38
  13. data/lib/asker/ai/stages/stage_i.rb +79 -92
  14. data/lib/asker/ai/stages/stage_s.rb +41 -36
  15. data/lib/asker/ai/stages/stage_t.rb +114 -73
  16. data/lib/asker/application.rb +7 -16
  17. data/lib/asker/check_input/check_haml_data.rb +264 -0
  18. data/lib/asker/check_input/check_table.rb +104 -0
  19. data/lib/asker/check_input.rb +51 -0
  20. data/lib/asker/cli.rb +47 -44
  21. data/lib/asker/data/code.rb +5 -16
  22. data/lib/asker/data/concept.rb +71 -24
  23. data/lib/asker/data/project_data.rb +63 -0
  24. data/lib/asker/data/table.rb +2 -0
  25. data/lib/asker/data/template.rb +3 -1
  26. data/lib/asker/data/world.rb +8 -16
  27. data/lib/asker/displayer/code_displayer.rb +7 -0
  28. data/lib/asker/displayer/concept_ai_displayer.erb +10 -0
  29. data/lib/asker/displayer/concept_ai_displayer.rb +24 -22
  30. data/lib/asker/displayer/concept_displayer.rb +9 -4
  31. data/lib/asker/displayer/stats_displayer.rb +8 -0
  32. data/lib/asker/exporter/concept_ai_gift_exporter.rb +7 -11
  33. data/lib/asker/exporter/concept_ai_moodle_exporter.rb +45 -0
  34. data/lib/asker/exporter/concept_ai_yaml_exporter.rb +6 -3
  35. data/lib/asker/exporter/concept_doc_exporter.rb +12 -2
  36. data/lib/asker/exporter/data_gift_exporter.rb +31 -0
  37. data/lib/asker/exporter/output_file_exporter.rb +9 -6
  38. data/lib/asker/files/{config.ini → asker.ini} +14 -4
  39. data/lib/asker/files/language/du/connectors.yaml +81 -0
  40. data/lib/asker/files/language/du/mistakes.yaml +82 -0
  41. data/lib/asker/files/language/du/templates.yaml +28 -49
  42. data/lib/asker/files/language/en/templates.yaml +19 -19
  43. data/lib/asker/files/language/es/mistakes.yaml +9 -7
  44. data/lib/asker/files/language/es/templates.yaml +19 -19
  45. data/lib/asker/files/language/fr/connectors.yaml +68 -84
  46. data/lib/asker/files/language/fr/templates.yaml +22 -22
  47. data/lib/asker/formatter/concept_doc_formatter.rb +0 -4
  48. data/lib/asker/formatter/concept_string_formatter.rb +7 -4
  49. data/lib/asker/formatter/moodle/matching.erb +38 -0
  50. data/lib/asker/formatter/moodle/multichoice.erb +49 -0
  51. data/lib/asker/formatter/moodle/shortanswer.erb +30 -0
  52. data/lib/asker/formatter/moodle/truefalse.erb +47 -0
  53. data/lib/asker/formatter/question_gift_formatter.rb +21 -19
  54. data/lib/asker/formatter/question_moodle_formatter.rb +27 -0
  55. data/lib/asker/lang/lang_factory.rb +7 -1
  56. data/lib/asker/loader/code_loader.rb +1 -1
  57. data/lib/asker/loader/content_loader.rb +12 -14
  58. data/lib/asker/loader/directory_loader.rb +1 -8
  59. data/lib/asker/loader/embedded_file.rb +42 -0
  60. data/lib/asker/loader/file_loader.rb +1 -6
  61. data/lib/asker/loader/haml_loader.rb +9 -5
  62. data/lib/asker/loader/image_url_loader.rb +8 -9
  63. data/lib/asker/loader/input_loader.rb +5 -6
  64. data/lib/asker/loader/project_loader.rb +18 -10
  65. data/lib/asker/logger.rb +36 -9
  66. data/lib/asker/skeleton.rb +3 -2
  67. data/lib/asker/version.rb +9 -0
  68. data/lib/asker.rb +72 -43
  69. metadata +60 -18
  70. data/lib/asker/checker.rb +0 -455
  71. data/lib/asker/project.rb +0 -146
@@ -3,21 +3,26 @@
3
3
  require 'rainbow'
4
4
  require 'rexml/document'
5
5
 
6
- require_relative '../application'
7
- require_relative '../logger'
8
6
  require_relative '../lang/lang_factory'
7
+ require_relative '../loader/embedded_file'
9
8
  require_relative 'table'
10
9
  require_relative 'data_field'
11
10
 
12
11
  ##
13
12
  # Store Concept information
13
+ # rubocop:disable Metrics/ClassLength
14
+ # rubocop:disable Style/ClassVars
14
15
  class Concept
15
- attr_reader :id, :lang, :context
16
- attr_reader :names, :type, :filename
17
- attr_reader :data
18
- attr_accessor :process
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
19
24
 
20
- @@id = 0 # Concept counter
25
+ @@id = 0 # Global Concept counter (concept identifier)
21
26
 
22
27
  ##
23
28
  # Initilize Concept
@@ -25,6 +30,8 @@ class Concept
25
30
  # @param filename (String)
26
31
  # @param lang_code (String)
27
32
  # @param context (Array)
33
+ # rubocop:disable Metrics/MethodLength
34
+ # rubocop:disable Metrics/AbcSize
28
35
  def initialize(xml_data, filename, lang_code = 'en', context = [])
29
36
  @@id += 1
30
37
  @id = @@id
@@ -46,16 +53,17 @@ class Concept
46
53
 
47
54
  @data = {}
48
55
  @data[:tags] = []
49
- @data[:texts] = []
50
- @data[:images] = [] # TODO: By now, We'll treat images separated from texts
51
- @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
52
58
  @data[:tables] = []
53
59
  @data[:neighbors] = []
54
60
  @data[:reference_to] = []
55
61
  @data[:referenced_by] = []
56
62
 
57
- read_data_from_xml(xml_data)
63
+ read_data_from_xml(xml_data)
58
64
  end
65
+ # rubocop:enable Metrics/MethodLength
66
+ # rubocop:enable Metrics/AbcSize
59
67
 
60
68
  def name(option = :raw)
61
69
  DataField.new(@names[0], @id, @type).get(option)
@@ -79,8 +87,12 @@ class Concept
79
87
  @data[:neighbors].reverse!
80
88
  end
81
89
 
90
+ # rubocop:disable Metrics/MethodLength
91
+ # rubocop:disable Metrics/AbcSize
92
+ # rubocop:disable Metrics/CyclomaticComplexity
82
93
  def calculate_nearness_to_concept(other)
83
- a = Application.instance.config['ai']['formula_weights']
94
+ a = ProjectData.instance.get(:weights)
95
+ #Application.instance.config['ai']['formula_weights']
84
96
  weights = a.split(',').map(&:to_f)
85
97
 
86
98
  max1 = @context.count
@@ -98,8 +110,12 @@ class Concept
98
110
  max = (max1 * weights[0] + max2 * weights[1] + max3 * weights[2])
99
111
  (alike * 100.0 / max)
100
112
  end
113
+ # rubocop:enable Metrics/MethodLength
114
+ # rubocop:enable Metrics/AbcSize
115
+ # rubocop:enable Metrics/CyclomaticComplexity
101
116
 
102
117
  # rubocop:disable Metrics/MethodLength
118
+ # rubocop:disable Metrics/AbcSize
103
119
  def try_adding_references(other)
104
120
  reference_to = 0
105
121
  @data[:tags].each do |i|
@@ -117,9 +133,34 @@ class Concept
117
133
  other.data[:referenced_by] << name
118
134
  end
119
135
  # rubocop:enable Metrics/MethodLength
136
+ # rubocop:enable Metrics/AbcSize
137
+
138
+ def tags
139
+ @data[:tags]
140
+ end
120
141
 
121
- def method_missing(method)
122
- @data[method]
142
+ def texts
143
+ @data[:texts]
144
+ end
145
+
146
+ def images
147
+ @data[:images]
148
+ end
149
+
150
+ def tables
151
+ @data[:tables]
152
+ end
153
+
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]
123
164
  end
124
165
 
125
166
  private
@@ -137,8 +178,8 @@ class Concept
137
178
  when 'table'
138
179
  @data[:tables] << Table.new(self, i)
139
180
  else
140
- text = " [ERROR] <#{i.name}> unkown XML attribute for concept #{name}"
141
- Logger.verbose Rainbow(text).color(:red)
181
+ text = " [ERROR] Concept #{name} with unkown attribute: #{i.name}"
182
+ puts Rainbow(text).color(:red)
142
183
  end
143
184
  end
144
185
  end
@@ -153,7 +194,8 @@ class Concept
153
194
 
154
195
  def process_tags(value)
155
196
  if value.text.nil? || value.text.size.zero?
156
- raise '[Error] tags label empty!'
197
+ puts Rainbow("[ERROR] Concept #{name} has tags empty!").red.briht
198
+ exit 1
157
199
  end
158
200
 
159
201
  @data[:tags] = value.text.split(',')
@@ -164,17 +206,22 @@ class Concept
164
206
  # rubocop:disable Metrics/MethodLength
165
207
  def process_def(value)
166
208
  case value.attributes['type']
167
- when 'image'
168
- msg = "[DEBUG] Concept#read_xml: image #{Rainbow(value.text).bright}"
169
- Project.instance.verbose Rainbow(msg).yellow
170
209
  when 'image_url'
171
- @data[:images] << value.text.strip
172
- when 'textfile_path'
173
- @data[:textfile_paths] << value.text.strip
174
- 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
175
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
176
221
  end
177
222
  end
178
223
  # rubocop:enable Metrics/AbcSize
179
224
  # rubocop:enable Metrics/MethodLength
180
225
  end
226
+ # rubocop:enable Metrics/ClassLength
227
+ # rubocop:enable Style/ClassVars
@@ -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
@@ -114,6 +114,7 @@ class Table
114
114
 
115
115
  # rubocop:disable Metrics/MethodLength
116
116
  # rubocop:disable Metrics/AbcSize
117
+ # rubocop:disable Style/ConditionalAssignment
117
118
  def read_lang_from_xml(xml_data)
118
119
  j = xml_data.text.split(',')
119
120
  codes = @langs.map(&:code)
@@ -131,6 +132,7 @@ class Table
131
132
  end
132
133
  # rubocop:enable Metrics/MethodLength
133
134
  # rubocop:enable Metrics/AbcSize
135
+ # rubocop:enable Style/ConditionalAssignment
134
136
 
135
137
  def read_type_from_xml(xml_data)
136
138
  j = xml_data.text.split(',')
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: false
1
2
 
2
3
  require 'rexml/document'
3
4
  require_relative 'row'
@@ -40,7 +41,8 @@ class Template
40
41
 
41
42
  def apply_vars_to_template(vars, template)
42
43
  output = ''
43
- return if vars.size.zero?
44
+ return output if vars.size.zero?
45
+
44
46
  max = vars.first[1].size
45
47
  (1..max).each do |index|
46
48
  t = template.dup
@@ -1,22 +1,14 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require_relative '../loader/image_url_loader'
4
- require_relative '../project'
5
- require_relative '../logger'
6
4
 
7
- ##
8
- # World data
9
5
  class World
10
6
  attr_reader :concepts, :filenames, :contexts, :image_urls
11
7
 
12
- ##
13
- # Initialize World object
14
- # @param concepts (Array)
15
- # @param show_progress (Boolean)
16
- def initialize(concepts, show_progress = true)
8
+ def initialize(concepts, internet = true)
17
9
  find_neighbors_for_every_concept(concepts)
18
10
  @concepts, @filenames, @contexts = get_lists_from(concepts)
19
- @image_urls = find_url_images_from_internet(show_progress)
11
+ @image_urls = find_url_images_from_internet(internet)
20
12
  end
21
13
 
22
14
  ##
@@ -55,11 +47,11 @@ class World
55
47
 
56
48
  # rubocop:disable Metrics/MethodLength
57
49
  # rubocop:disable Metrics/AbcSize
58
- def find_url_images_from_internet(show_progress)
59
- param = Application.instance.config['global']['internet'] || 'yes'
60
- return {} unless param == 'yes'
50
+ # rubocop:disable Metrics/CyclomaticComplexity
51
+ # rubocop:disable Metrics/PerceivedComplexity
52
+ def find_url_images_from_internet(internet)
53
+ return {} unless internet
61
54
 
62
- Logger.verbose "\n[INFO] Loading data from Internet" if show_progress
63
55
  threads = []
64
56
  searchs = []
65
57
  urls = {}
@@ -67,13 +59,13 @@ class World
67
59
  @concepts&.each_key { |key| searchs << key }
68
60
  @contexts.each { |filter| searchs << filter.join(' ').to_s }
69
61
  searchs.each do |search|
70
- print('.') if show_progress
71
62
  threads << Thread.new { urls[search] = ImageUrlLoader.load(search) }
72
63
  end
73
64
  threads.each(&:join) # wait for all threads to finish
74
- print("\n") if show_progress
75
65
  urls
76
66
  end
77
67
  # rubocop:enable Metrics/MethodLength
78
68
  # rubocop:enable Metrics/AbcSize
69
+ # rubocop:enable Metrics/CyclomaticComplexity
70
+ # rubocop:enable Metrics/PerceivedComplexity
79
71
  end
@@ -5,6 +5,11 @@ require_relative '../logger'
5
5
 
6
6
  # Export Code into Screen
7
7
  module CodeDisplayer
8
+ ##
9
+ # Show all "code" data on screen
10
+ # @param codes (Array) List of "code" data
11
+ # rubocop:disable Metrics/AbcSize
12
+ # rubocop:disable Metrics/MethodLength
8
13
  def self.show(codes)
9
14
  return if codes.nil? || codes.size.zero?
10
15
 
@@ -42,4 +47,6 @@ module CodeDisplayer
42
47
  Logger.verboseln "\n[INFO] Showing CODE statistics"
43
48
  Logger.verboseln my_screen_table.to_s
44
49
  end
50
+ # rubocop:enable Metrics/AbcSize
51
+ # rubocop:enable Metrics/MethodLength
45
52
  end
@@ -0,0 +1,10 @@
1
+
2
+ [INFO] Showing CONCEPT statistics
3
+ * Exclude questions: <%= exclude_questions %>
4
+ * Annotations:
5
+ ├── (d) Definitions <= Concept.def
6
+ ├── (b) Table Matching <= Concept.table.rows.columns
7
+ ├── (f) Tables 1 Field <= Concept.table.fields.size==1
8
+ ├── (i) Images URL <= Concept.def{:type => 'file'}
9
+ ├── (s) Sequences <= Concept.table{:sequence => '...'}
10
+ └── (t) Table Rows&Cols <= Concept.table.rows.columns
@@ -1,5 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'erb'
3
4
  require 'terminal-table'
4
5
  require_relative '../application'
5
6
  require_relative '../logger'
@@ -9,11 +10,15 @@ class ConceptAIDisplayer
9
10
  ##
10
11
  # Display ConceptAI stat on screen
11
12
  # @param concepts_ai (Array)
13
+ # rubocop:disable Metrics/MethodLength
14
+ # rubocop:disable Metrics/AbcSize
15
+ # rubocop:disable Metrics/CyclomaticComplexity
16
+ # rubocop:disable Metrics/PerceivedComplexity
12
17
  def self.show(concepts_ai)
13
18
  stages = Application.instance.config['questions']['stages']
14
19
  # Create table HEAD
15
20
  screen_table = Terminal::Table.new do |st|
16
- title = ['Concept', 'Questions', 'Entries', 'xFactor']
21
+ title = %w[Concept Questions Entries xFactor]
17
22
  %w[d b f i s t].each do |i|
18
23
  if stages.include? i.to_sym
19
24
  title << i
@@ -31,10 +36,11 @@ class ConceptAIDisplayer
31
36
  total[:si] = total[:ss] = total[:st] = 0
32
37
 
33
38
  concepts_ai.each do |concept_ai|
34
- next unless concept_ai.process?
39
+ next unless concept_ai.concept.process?
35
40
 
36
- e = concept_ai.texts.size
37
- concept_ai.tables.each { |t| e += t.fields.size * t.rows.size }
41
+ e = concept_ai.concept.texts.size
42
+ e += concept_ai.concept.images.size
43
+ concept_ai.concept.tables.each { |t| e += t.fields.size * t.rows.size }
38
44
 
39
45
  sd = sb = sf = 0
40
46
  si = ss = st = 0
@@ -48,7 +54,7 @@ class ConceptAIDisplayer
48
54
 
49
55
  factor = 'Unkown'
50
56
  factor = (t.to_f / e).round(2).to_s unless e.zero?
51
- screen_table.add_row [Rainbow(concept_ai.name(:screen)).green.bright,
57
+ screen_table.add_row [Rainbow(concept_ai.concept.name(:screen)).green.bright,
52
58
  t, e, factor, sd, sb, sf, si, ss, st]
53
59
 
54
60
  total[:q] += t
@@ -75,9 +81,15 @@ class ConceptAIDisplayer
75
81
  total[:sd], total[:sb], total[:sf],
76
82
  total[:si], total[:ss], total[:st]]
77
83
  export_notes
78
- Logger.verbose "#{screen_table}\n"
84
+ Logger.verboseln "#{screen_table}\n"
79
85
  end
86
+ # rubocop:enable Metrics/MethodLength
87
+ # rubocop:enable Metrics/AbcSize
88
+ # rubocop:enable Metrics/CyclomaticComplexity
89
+ # rubocop:enable Metrics/PerceivedComplexity
80
90
 
91
+ # rubocop:disable Metrics/MethodLength
92
+ # rubocop:disable Metrics/AbcSize
81
93
  private_class_method def self.export_excluded_questions(screen_table, concepts_ai)
82
94
  # Create table BODY
83
95
  total = {}
@@ -86,7 +98,7 @@ class ConceptAIDisplayer
86
98
  total[:si] = total[:ss] = total[:st] = 0
87
99
 
88
100
  concepts_ai.each do |concept_ai|
89
- next unless concept_ai.process?
101
+ next unless concept_ai.concept.process?
90
102
 
91
103
  sd = concept_ai.excluded_questions[:d].size
92
104
  sb = concept_ai.excluded_questions[:b].size
@@ -111,22 +123,12 @@ class ConceptAIDisplayer
111
123
  total[:sf], total[:si],
112
124
  total[:ss], total[:st]]
113
125
  end
126
+ # rubocop:enable Metrics/MethodLength
127
+ # rubocop:enable Metrics/AbcSize
114
128
 
115
129
  private_class_method def self.export_notes
116
- Logger.verbose "\n[INFO] Showing CONCEPT statistics\n"
117
- Logger.verbose ' * Exclude questions: ' +
118
- Application.instance.config['questions']['exclude'].to_s
119
- Logger.verbose ' * Annotations:'
120
- Logger.verbose ' ├── (d) Definitions <= Concept.def'
121
- Logger.verbose ' ├── (b) Table Matching <= ' \
122
- 'Concept.table.rows.columns'
123
- Logger.verbose ' ├── (f) Tables 1 Field <= Concept.table.fields.size==1'
124
- Logger.verbose ' ├── (i) Images URL <= ' \
125
- "Concept.def{:type => 'image_url'}"
126
- Logger.verbose ' ├── (s) Sequences <= ' \
127
- "Concept.table{:sequence => '...'}"
128
- Logger.verbose ' └── (t) Table Rows&Cols <= ' \
129
- 'Concept.table.rows.columns'
130
- Logger.verbose "\n"
130
+ exclude_questions = Application.instance.config['questions']['exclude'].to_s
131
+ renderer = ERB.new(File.read(File.join(File.dirname(__FILE__), 'concept_ai_displayer.erb')))
132
+ Logger.verboseln renderer.result(binding)
131
133
  end
132
134
  end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
 
2
3
  require_relative '../application'
3
4
  require_relative '../formatter/concept_string_formatter'
@@ -7,23 +8,27 @@ require_relative '../logger'
7
8
  module ConceptDisplayer
8
9
  ##
9
10
  # Show concepts on screen
10
- # @param concepts (Array)
11
+ # @param concepts (Array) List of concept data
12
+ # rubocop:disable Metrics/AbcSize
13
+ # rubocop:disable Metrics/MethodLength
11
14
  def self.show(concepts)
12
15
  show_mode = Application.instance.config['global']['show_mode']
13
16
  return unless show_mode
14
17
 
15
18
  msg = "\n[INFO] Showing concept data (#{Rainbow(show_mode).bright})"
16
- Logger.verbose msg
19
+ Logger.verboseln msg
17
20
  case show_mode
18
21
  when 'resume'
19
22
  s = "* Concepts (#{concepts.count}): "
20
23
  concepts.each { |c| s += c.name + ', ' }
21
- Logger.verbose s
24
+ Logger.verboseln s
22
25
  when 'default'
23
26
  # Only show Concepts with process attr true
24
27
  concepts.each do |c|
25
- Logger.verbose ConceptStringFormatter.to_s(c) if c.process?
28
+ Logger.verboseln ConceptStringFormatter.to_s(c) if c.process?
26
29
  end
27
30
  end
28
31
  end
32
+ # rubocop:enable Metrics/AbcSize
33
+ # rubocop:enable Metrics/MethodLength
29
34
  end
@@ -1,9 +1,17 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require_relative '../application'
2
4
  require_relative 'concept_ai_displayer'
3
5
  require_relative 'code_displayer'
4
6
 
5
7
  # Display Stats on screen.
8
+ # * Display all "Concept AI"
9
+ # * Display all "Code"
6
10
  module StatsDisplayer
11
+ # Display Stats on screen.
12
+ # * Display all "Concept AI"
13
+ # * Display all "Code"
14
+ # @param data (Hash) With concept_ai list and code list
7
15
  def self.show(data)
8
16
  return unless Application.instance.config['global']['show_mode']
9
17
 
@@ -1,6 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative '../project'
4
3
  require_relative '../formatter/question_gift_formatter'
5
4
 
6
5
  # Export ConceptIA data to gift to outputfile
@@ -8,28 +7,25 @@ module ConceptAIGiftExporter
8
7
  ##
9
8
  # Export an array of ConceptAI objects from Project into GIFT outpufile
10
9
  # @param concepts_ai (Array)
11
- # @param project (Project)
12
- def self.export_all(concepts_ai, project)
13
- concepts_ai.each { |concept_ai| export(concept_ai, project) }
10
+ # @param file (File)
11
+ def self.export_all(concepts_ai, file)
12
+ concepts_ai.each { |concept_ai| export(concept_ai, file) }
14
13
  end
15
14
 
16
15
  ##
17
16
  # Export 1 concept_ai from project
18
17
  # @param concept_ai (ConceptAI)
19
- # @param project (Project)
20
- # rubocop:disable Metrics/AbcSize
21
- private_class_method def self.export(concept_ai, project)
22
- return unless concept_ai.process?
18
+ # @param file (File)
19
+ private_class_method def self.export(concept_ai, file)
20
+ return unless concept_ai.concept.process?
23
21
 
24
- file = project.get(:outputfile)
25
- file.write head(concept_ai.name)
22
+ file.write head(concept_ai.concept.name)
26
23
  Application.instance.config['questions']['stages'].each do |stage|
27
24
  concept_ai.questions[stage].each do |question|
28
25
  file.write(QuestionGiftFormatter.to_s(question))
29
26
  end
30
27
  end
31
28
  end
32
- # rubocop:enable Metrics/AbcSize
33
29
 
34
30
  ##
35
31
  # Convert Concept name into gift format head
@@ -0,0 +1,45 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../formatter/question_moodle_formatter'
4
+ require_relative '../version'
5
+
6
+ # Export ConceptIA data to gift to moodlefile
7
+ module ConceptAIMoodleExporter
8
+ ##
9
+ # Export an array of ConceptAI objects from Project into Moodle format file
10
+ # @param concepts_ai (Array)
11
+ # @param project (Project)
12
+ def self.export_all(concepts_ai, project)
13
+ file = File.open(project.get(:moodlepath), 'w')
14
+ file.write("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n")
15
+ file.write("<quiz>\n")
16
+ file.write("<!--\n#{('=' * 50)}\n")
17
+ file.write(" Created by : #{Version::NAME}")
18
+ file.write(" (version #{Version::VERSION})\n")
19
+ file.write(" File : #{project.get(:moodlename)}\n")
20
+ file.write(" Time : #{Time.new}\n")
21
+ file.write(" Author : David Vargas Ruiz\n")
22
+ file.write("#{('=' * 50)}\n-->\n\n")
23
+
24
+ concepts_ai.each { |concept_ai| export(concept_ai, file) }
25
+
26
+ file.write("</quiz>\n")
27
+ file.close
28
+ end
29
+
30
+ ##
31
+ # Export 1 concept_ai from project
32
+ # @param concept_ai (ConceptAI)
33
+ # @param file (File)
34
+ # rubocop:disable Metrics/AbcSize
35
+ private_class_method def self.export(concept_ai, file)
36
+ return unless concept_ai.concept.process?
37
+
38
+ Application.instance.config['questions']['stages'].each do |stage|
39
+ concept_ai.questions[stage].each do |question|
40
+ file.write(QuestionMoodleFormatter.to_s(question))
41
+ end
42
+ end
43
+ end
44
+ # rubocop:enable Metrics/AbcSize
45
+ end
@@ -17,16 +17,19 @@ module ConceptAIYAMLExporter
17
17
  params = { lang: project.get(:lang) ,
18
18
  projectname: project.get(:projectname) }
19
19
  output = { params: params, questions: questions }
20
- project.get(:yamlfile).write(output.to_yaml)
20
+
21
+ yamlfile = File.open(project.get(:yamlpath), 'w')
22
+ yamlfile.write(output.to_yaml)
23
+ yamlfile.close
21
24
  end
22
25
 
23
26
  private_class_method def self.get_questions_from(concept_ai)
24
27
  data = []
25
- return data unless concept_ai.process?
28
+ return data unless concept_ai.concept.process?
26
29
 
27
30
  Application.instance.config['questions']['stages'].each do |stage|
28
31
  concept_ai.questions[stage].each do |question|
29
- question.lang = concept_ai.lang
32
+ question.lang = concept_ai.concept.lang
30
33
  data << QuestionHashFormatter.to_hash(question)
31
34
  end
32
35
  end
@@ -1,15 +1,25 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require_relative '../formatter/concept_doc_formatter'
4
+ require_relative '../version'
4
5
 
5
6
  ##
6
7
  # Export Concept to Doc file
7
8
  module ConceptDocExporter
8
9
  ##
9
- # Export arrya of concepts to doc
10
- def self.export_all(concepts, file)
10
+ # Export array of concepts to doc
11
+ def self.export_all(concepts, project)
12
+ file = File.new(project.get(:lessonpath), 'w')
13
+ file.write('=' * 50 + "\n")
14
+ file.write("Created by : #{Version::NAME} (version #{Version::VERSION})\n")
15
+ file.write("File : #{project.get(:lessonname)}\n")
16
+ file.write("Time : #{Time.new}\n")
17
+ file.write("Author : David Vargas Ruiz\n")
18
+ file.write('=' * 50 + "\n")
19
+
11
20
  concepts.each do |concept|
12
21
  file.write(ConceptDocFormatter.to_s(concept)) if concept.process
13
22
  end
23
+ file.close
14
24
  end
15
25
  end