asker-tool 2.2.0 → 2.2.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +14 -15
- data/lib/asker/ai/concept_ai.rb +1 -1
- data/lib/asker/ai/stages/stage_b.rb +1 -10
- data/lib/asker/ai/stages/stage_d.rb +4 -10
- data/lib/asker/ai/stages/stage_f.rb +1 -20
- data/lib/asker/application.rb +6 -16
- data/lib/asker/check_input/check_haml_data.rb +264 -0
- data/lib/asker/check_input/check_table.rb +104 -0
- data/lib/asker/check_input.rb +51 -0
- data/lib/asker/cli.rb +32 -47
- data/lib/asker/data/code.rb +1 -15
- data/lib/asker/data/concept.rb +8 -7
- data/lib/asker/{project.rb → data/project_data.rb} +5 -23
- data/lib/asker/data/world.rb +4 -15
- data/lib/asker/displayer/concept_ai_displayer.rb +1 -0
- data/lib/asker/exporter/concept_ai_moodle_exporter.rb +3 -2
- data/lib/asker/exporter/concept_doc_exporter.rb +3 -6
- data/lib/asker/exporter/data_gift_exporter.rb +4 -2
- data/lib/asker/files/language/en/templates.yaml +1 -1
- data/lib/asker/files/language/es/templates.yaml +1 -1
- data/lib/asker/formatter/concept_doc_formatter.rb +0 -4
- data/lib/asker/loader/content_loader.rb +8 -10
- data/lib/asker/loader/directory_loader.rb +1 -8
- data/lib/asker/loader/file_loader.rb +1 -6
- data/lib/asker/loader/haml_loader.rb +9 -5
- data/lib/asker/loader/image_url_loader.rb +4 -6
- data/lib/asker/loader/input_loader.rb +5 -6
- data/lib/asker/loader/project_loader.rb +7 -8
- data/lib/asker/logger.rb +17 -15
- data/lib/asker/skeleton.rb +3 -3
- data/lib/asker/version.rb +9 -0
- data/lib/asker.rb +39 -38
- metadata +52 -7
- data/lib/asker/checker.rb +0 -453
data/lib/asker/cli.rb
CHANGED
@@ -2,24 +2,49 @@
|
|
2
2
|
|
3
3
|
require 'rainbow'
|
4
4
|
require 'thor'
|
5
|
-
require_relative '
|
5
|
+
require_relative 'version'
|
6
6
|
require_relative '../asker'
|
7
7
|
|
8
8
|
##
|
9
9
|
# Command Line User Interface
|
10
10
|
class CLI < Thor
|
11
|
-
map ['
|
11
|
+
map ['--help'] => 'help'
|
12
12
|
|
13
|
-
map ['
|
13
|
+
map ['--version'] => 'version'
|
14
14
|
desc 'version', 'Show the program version'
|
15
|
-
##
|
16
|
-
# Show current version
|
17
15
|
def version
|
18
|
-
puts "#{
|
16
|
+
puts "#{Version::NAME} version #{Version::VERSION}"
|
17
|
+
exit 0
|
18
|
+
end
|
19
|
+
|
20
|
+
map ['--init'] => 'init'
|
21
|
+
desc 'init', 'Create default INI config file'
|
22
|
+
def init
|
23
|
+
Asker.init
|
24
|
+
exit 0
|
25
|
+
end
|
26
|
+
|
27
|
+
map ['new','--new'] => 'new_input'
|
28
|
+
desc 'new DIRPATH', 'Create Asker demo input files'
|
29
|
+
##
|
30
|
+
# Create Asker demo input files
|
31
|
+
# @param dirname (String) Path to folder
|
32
|
+
def new_input(dirname)
|
33
|
+
Asker.new_input(dirname)
|
34
|
+
exit 0
|
35
|
+
end
|
36
|
+
|
37
|
+
map ['--check'] => 'check'
|
38
|
+
desc 'check FILEPATH', 'Check input HAML file syntax'
|
39
|
+
def check(filename)
|
40
|
+
# Enable/disable color output
|
41
|
+
Rainbow.enabled = false if options['color'] == false
|
42
|
+
# Asker start processing input file
|
43
|
+
Asker.check(filename)
|
19
44
|
end
|
20
45
|
|
21
46
|
map ['f', '-f', '--file'] => 'file'
|
22
|
-
desc 'file
|
47
|
+
desc '[file] FILEPATH', 'Build output files, from HAML/XML input file.'
|
23
48
|
long_desc <<-LONGDESC
|
24
49
|
|
25
50
|
Build questions about contents defined into input file specified.
|
@@ -35,51 +60,11 @@ class CLI < Thor
|
|
35
60
|
(3) #{Rainbow('asker projects/foo/foo.yaml').aqua}, Build questions from YAML project file.
|
36
61
|
|
37
62
|
LONGDESC
|
38
|
-
##
|
39
|
-
# Create questions from input file
|
40
|
-
# @param filename (String) Path to input file
|
41
63
|
def file(filename)
|
42
64
|
# Asker start processing input file
|
43
65
|
Asker.start(filename)
|
44
66
|
end
|
45
67
|
|
46
|
-
map ['c', '-c', '--check'] => 'check'
|
47
|
-
desc 'check', 'Check input HAML file syntax'
|
48
|
-
##
|
49
|
-
# Check input file syntax
|
50
|
-
# @param filename (String) Path to input file
|
51
|
-
def check(filename)
|
52
|
-
# Enable/disable color output
|
53
|
-
Rainbow.enabled = false if options['color'] == false
|
54
|
-
# Asker start processing input file
|
55
|
-
Asker.check(filename)
|
56
|
-
end
|
57
|
-
|
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'
|
76
|
-
##
|
77
|
-
# Create Asker demo input files
|
78
|
-
# @param dirname (String) Path to folder
|
79
|
-
def create_input(dirname)
|
80
|
-
Asker.create_input(dirname)
|
81
|
-
end
|
82
|
-
|
83
68
|
##
|
84
69
|
# This actions are equals:
|
85
70
|
# * asker demo/foo.haml
|
data/lib/asker/data/code.rb
CHANGED
@@ -1,22 +1,12 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require_relative '../ai/code/code_ai_factory'
|
4
|
-
require_relative '../project'
|
5
|
-
require_relative '../logger'
|
6
|
-
require_relative '../formatter/code_string_formatter'
|
7
4
|
|
8
|
-
##
|
9
|
-
# Code data object
|
10
5
|
class Code
|
11
6
|
attr_reader :dirname, :filename, :type
|
12
7
|
attr_accessor :process, :features
|
13
8
|
attr_reader :lines, :questions
|
14
9
|
|
15
|
-
##
|
16
|
-
# Initialize Code object
|
17
|
-
# @param dirname (String)
|
18
|
-
# @param filename (String)
|
19
|
-
# @param type (String)
|
20
10
|
def initialize(dirname, filename, type)
|
21
11
|
@dirname = dirname
|
22
12
|
@filename = filename
|
@@ -40,17 +30,13 @@ class Code
|
|
40
30
|
out
|
41
31
|
end
|
42
32
|
|
43
|
-
def debug
|
44
|
-
Logger.verbose CodeStringFormatter.to_s(self)
|
45
|
-
end
|
46
|
-
|
47
33
|
private
|
48
34
|
|
49
35
|
def load(filepath)
|
50
36
|
return if filepath.nil?
|
51
37
|
|
52
38
|
unless File.exist? filepath
|
53
|
-
|
39
|
+
puts Rainbow("[ERROR] Unkown file #{filepath}").red.bright
|
54
40
|
return
|
55
41
|
end
|
56
42
|
content = File.read(filepath)
|
data/lib/asker/data/concept.rb
CHANGED
@@ -3,8 +3,6 @@
|
|
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'
|
9
7
|
require_relative '../loader/embedded_file'
|
10
8
|
require_relative 'table'
|
@@ -24,7 +22,7 @@ class Concept
|
|
24
22
|
attr_reader :data # Data about this concept
|
25
23
|
attr_accessor :process # (Boolean) if it is necesary generate questions
|
26
24
|
|
27
|
-
@@id = 0 # Global Concept counter
|
25
|
+
@@id = 0 # Global Concept counter (concept identifier)
|
28
26
|
|
29
27
|
##
|
30
28
|
# Initilize Concept
|
@@ -93,7 +91,8 @@ class Concept
|
|
93
91
|
# rubocop:disable Metrics/AbcSize
|
94
92
|
# rubocop:disable Metrics/CyclomaticComplexity
|
95
93
|
def calculate_nearness_to_concept(other)
|
96
|
-
a =
|
94
|
+
a = ProjectData.instance.get(:weights)
|
95
|
+
#Application.instance.config['ai']['formula_weights']
|
97
96
|
weights = a.split(',').map(&:to_f)
|
98
97
|
|
99
98
|
max1 = @context.count
|
@@ -180,7 +179,7 @@ class Concept
|
|
180
179
|
@data[:tables] << Table.new(self, i)
|
181
180
|
else
|
182
181
|
text = " [ERROR] Concept #{name} with unkown attribute: #{i.name}"
|
183
|
-
|
182
|
+
puts Rainbow(text).color(:red)
|
184
183
|
end
|
185
184
|
end
|
186
185
|
end
|
@@ -195,7 +194,7 @@ class Concept
|
|
195
194
|
|
196
195
|
def process_tags(value)
|
197
196
|
if value.text.nil? || value.text.size.zero?
|
198
|
-
|
197
|
+
puts Rainbow("[ERROR] Concept #{name} has tags empty!").red.briht
|
199
198
|
exit 1
|
200
199
|
end
|
201
200
|
|
@@ -208,14 +207,16 @@ class Concept
|
|
208
207
|
def process_def(value)
|
209
208
|
case value.attributes['type']
|
210
209
|
when 'image_url'
|
210
|
+
# Link with remote image
|
211
211
|
@data[:images] << EmbeddedFile.load(value.text.strip, File.dirname(@filename))
|
212
212
|
when 'file'
|
213
|
+
# Load local images and text files
|
213
214
|
@data[:images] << EmbeddedFile.load(value.text.strip, File.dirname(@filename))
|
214
215
|
when nil
|
215
216
|
@data[:texts] << value.text.strip
|
216
217
|
else
|
217
218
|
msg = "[ERROR] Unknown type: #{value.attributes['type']}"
|
218
|
-
|
219
|
+
puts Rainbow(msg).red.bright
|
219
220
|
exit 1
|
220
221
|
end
|
221
222
|
end
|
@@ -1,43 +1,30 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require 'singleton'
|
4
|
-
require 'rainbow'
|
5
|
-
require_relative 'application'
|
6
|
-
require_relative 'logger'
|
7
4
|
|
8
|
-
|
9
|
-
class Project
|
5
|
+
class ProjectData
|
10
6
|
include Singleton
|
11
7
|
attr_reader :default, :param
|
12
8
|
|
13
|
-
##
|
14
|
-
# Initialize
|
15
9
|
def initialize
|
16
10
|
reset
|
17
11
|
end
|
18
12
|
|
19
|
-
##
|
20
|
-
# Reset project params
|
21
13
|
def reset
|
22
14
|
@default = { inputbasedir: FileUtils.pwd,
|
23
15
|
stages: { d: true, b: true, f: true, i: true, s: true, t: true },
|
24
|
-
threshold: 0.5
|
16
|
+
threshold: 0.5,
|
17
|
+
outputdir: 'output',
|
18
|
+
weights: '1, 1, 1' }
|
25
19
|
@param = {}
|
26
20
|
end
|
27
21
|
|
28
|
-
##
|
29
|
-
# Get value param
|
30
|
-
# @param key (Symbol) key
|
31
22
|
def get(key)
|
32
23
|
return @param[key] unless @param[key].nil?
|
33
24
|
|
34
25
|
@default[key]
|
35
26
|
end
|
36
27
|
|
37
|
-
##
|
38
|
-
# Set value param
|
39
|
-
# @param key (Symbol) key
|
40
|
-
# @param value (String) value
|
41
28
|
def set(key, value)
|
42
29
|
@param[key] = value
|
43
30
|
end
|
@@ -52,7 +39,6 @@ class Project
|
|
52
39
|
# rubocop:disable Metrics/MethodLength
|
53
40
|
# rubocop:disable Metrics/AbcSize
|
54
41
|
def open
|
55
|
-
config = Application.instance.config
|
56
42
|
ext = File.extname(@param[:process_file]) || '.haml'
|
57
43
|
@param[:projectname] = @param[:projectname] ||
|
58
44
|
File.basename(@param[:process_file], ext)
|
@@ -63,7 +49,7 @@ class Project
|
|
63
49
|
@param[:yamlname] = "#{@param[:projectname]}.yaml"
|
64
50
|
@param[:moodlename] = "#{@param[:projectname]}-moodle.xml"
|
65
51
|
|
66
|
-
outputdir =
|
52
|
+
outputdir = get(:outputdir)
|
67
53
|
@param[:logpath] = File.join(outputdir, get(:logname))
|
68
54
|
@param[:outputpath] = File.join(outputdir, get(:outputname))
|
69
55
|
@param[:lessonpath] = File.join(outputdir, get(:lessonname))
|
@@ -71,10 +57,6 @@ class Project
|
|
71
57
|
@param[:moodlepath] = File.join(outputdir, get(:moodlename))
|
72
58
|
|
73
59
|
Dir.mkdir(outputdir) unless Dir.exist?(outputdir)
|
74
|
-
Logger.create(self) # Create log file where to save log messages
|
75
|
-
Logger.verboseln '[INFO] Project open'
|
76
|
-
Logger.verboseln ' ├── inputdirs = ' + Rainbow(get(:inputdirs)).bright
|
77
|
-
Logger.verboseln ' └── process_file = ' + Rainbow(get(:process_file)).bright
|
78
60
|
end
|
79
61
|
# rubocop:enable Metrics/MethodLength
|
80
62
|
# rubocop:enable Metrics/AbcSize
|
data/lib/asker/data/world.rb
CHANGED
@@ -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(
|
11
|
+
@image_urls = find_url_images_from_internet(internet)
|
20
12
|
end
|
21
13
|
|
22
14
|
##
|
@@ -57,10 +49,9 @@ class World
|
|
57
49
|
# rubocop:disable Metrics/AbcSize
|
58
50
|
# rubocop:disable Metrics/CyclomaticComplexity
|
59
51
|
# rubocop:disable Metrics/PerceivedComplexity
|
60
|
-
def find_url_images_from_internet(
|
61
|
-
return {} unless
|
52
|
+
def find_url_images_from_internet(internet)
|
53
|
+
return {} unless internet
|
62
54
|
|
63
|
-
Logger.verbose "\n[INFO] Loading data from Internet" if show_progress
|
64
55
|
threads = []
|
65
56
|
searchs = []
|
66
57
|
urls = {}
|
@@ -68,11 +59,9 @@ class World
|
|
68
59
|
@concepts&.each_key { |key| searchs << key }
|
69
60
|
@contexts.each { |filter| searchs << filter.join(' ').to_s }
|
70
61
|
searchs.each do |search|
|
71
|
-
Logger.verbose('.') if show_progress
|
72
62
|
threads << Thread.new { urls[search] = ImageUrlLoader.load(search) }
|
73
63
|
end
|
74
64
|
threads.each(&:join) # wait for all threads to finish
|
75
|
-
Logger.verbose("\n") if show_progress
|
76
65
|
urls
|
77
66
|
end
|
78
67
|
# rubocop:enable Metrics/MethodLength
|
@@ -1,6 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require_relative '../formatter/question_moodle_formatter'
|
4
|
+
require_relative '../version'
|
4
5
|
|
5
6
|
# Export ConceptIA data to gift to moodlefile
|
6
7
|
module ConceptAIMoodleExporter
|
@@ -13,8 +14,8 @@ module ConceptAIMoodleExporter
|
|
13
14
|
file.write("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n")
|
14
15
|
file.write("<quiz>\n")
|
15
16
|
file.write("<!--\n#{('=' * 50)}\n")
|
16
|
-
file.write(" Created by : #{
|
17
|
-
file.write(" (version #{
|
17
|
+
file.write(" Created by : #{Version::NAME}")
|
18
|
+
file.write(" (version #{Version::VERSION})\n")
|
18
19
|
file.write(" File : #{project.get(:moodlename)}\n")
|
19
20
|
file.write(" Time : #{Time.new}\n")
|
20
21
|
file.write(" Author : David Vargas Ruiz\n")
|
@@ -1,18 +1,17 @@
|
|
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
|
10
|
-
# rubocop:disable Metrics/AbcSize
|
11
|
-
# rubocop:disable Metrics/MethodLength
|
10
|
+
# Export array of concepts to doc
|
12
11
|
def self.export_all(concepts, project)
|
13
12
|
file = File.new(project.get(:lessonpath), 'w')
|
14
13
|
file.write('=' * 50 + "\n")
|
15
|
-
file.write("Created by : #{
|
14
|
+
file.write("Created by : #{Version::NAME} (version #{Version::VERSION})\n")
|
16
15
|
file.write("File : #{project.get(:lessonname)}\n")
|
17
16
|
file.write("Time : #{Time.new}\n")
|
18
17
|
file.write("Author : David Vargas Ruiz\n")
|
@@ -23,6 +22,4 @@ module ConceptDocExporter
|
|
23
22
|
end
|
24
23
|
file.close
|
25
24
|
end
|
26
|
-
# rubocop:enable Metrics/AbcSize
|
27
|
-
# rubocop:enable Metrics/MethodLength
|
28
25
|
end
|
@@ -2,6 +2,8 @@
|
|
2
2
|
|
3
3
|
require_relative 'concept_ai_gift_exporter'
|
4
4
|
require_relative 'code_gift_exporter'
|
5
|
+
require_relative '../version'
|
6
|
+
require_relative '../application'
|
5
7
|
|
6
8
|
# Export Data (ConceptIA and Code) to gift to outputfile
|
7
9
|
module DataGiftExporter
|
@@ -12,8 +14,8 @@ module DataGiftExporter
|
|
12
14
|
def self.export_all(data, project)
|
13
15
|
file = File.open(project.get(:outputpath), 'w')
|
14
16
|
file.write('// ' + ('=' * 50) + "\n")
|
15
|
-
file.write("// Created by : #{
|
16
|
-
file.write(" (version #{
|
17
|
+
file.write("// Created by : #{Version::NAME}")
|
18
|
+
file.write(" (version #{Version::VERSION})\n")
|
17
19
|
file.write("// File : #{project.get(:outputname)}\n")
|
18
20
|
file.write("// Time : #{Time.new}\n")
|
19
21
|
file.write("// Author : David Vargas Ruiz\n")
|
@@ -13,7 +13,7 @@
|
|
13
13
|
:f2: 'The next items are "<%=text2%>".<br/>Choose the option that not belongs concept <b><%=text1%></b>.'
|
14
14
|
:f3: 'The next items are "<%=text2%>" from <b><%=text1%></b> concept:<br><p><%=text3%></p>(Put every word into the right position)'
|
15
15
|
:i1: '<%=text1%><br/>Choose the best association for the previous image.<br/>'
|
16
|
-
:i2: '<%=text1%><br/>The previous image corresponds to <b><%=text2%></b>.'
|
16
|
+
:i2: '<%=text1%><br/>The previous image/text corresponds to <b><%=text2%></b>.'
|
17
17
|
:i3: '<%=text1%><br/>Write the best answer <%=text2%>, for the previous image.<br/>'
|
18
18
|
:i4: '<%=text1%><br/>Definition:<br/> <i><%=text2%></i><br/><br/>(Put every word in the right text position)'
|
19
19
|
:s1: "About <b><%=text1%></b> concept, sort every \"<%=text2%>\", so It is true that \"<%=text3%>\".<br/>"
|
@@ -13,7 +13,7 @@
|
|
13
13
|
:f2: 'Los siguientes elementos son "<%=text2%>".<br/>Selecciona la opción que no pertenezca al concepto <b><%=text1%></b>.'
|
14
14
|
:f3: 'Los siguientes elementos son "<%=text2%>" del concepto <b><%=text1%></b>:<br><p><%=text3%></p>(Coloca cada palabra en su posición correcta dentro del texto)'
|
15
15
|
:i1: '<%=text1%><br/>Elige la opción que mejor se corresponda con la imagen anterior.<br/>'
|
16
|
-
:i2: '<%=text1%><br/>La imagen anterior corresponde a <b><%=text2%></b>.'
|
16
|
+
:i2: '<%=text1%><br/>La imagen/texto anterior corresponde a <b><%=text2%></b>.'
|
17
17
|
:i3: '<%=text1%><br/>Escribe la opción <%=text2%>, que mejor corresponda con la imagen anterior.<br/>'
|
18
18
|
:i4: '<%=text1%><br/>Definición: <i><%=text2%></i><br/><br/>(Coloca cada palabra en su posición correcta dentro del texto)'
|
19
19
|
:s1: 'En relación al concepto <b><%=text1%></b>, ordena cada/las/los "<%=text2%>" de modo que se cumpla el criterio "<%=text3%>".<br/>'
|
@@ -4,8 +4,7 @@ require 'rainbow'
|
|
4
4
|
require 'rexml/document'
|
5
5
|
require_relative '../data/concept'
|
6
6
|
require_relative 'code_loader'
|
7
|
-
require_relative '../
|
8
|
-
require_relative '../project'
|
7
|
+
require_relative '../data/project_data'
|
9
8
|
|
10
9
|
# Define methods that load data from XML contents
|
11
10
|
module ContentLoader
|
@@ -13,8 +12,6 @@ module ContentLoader
|
|
13
12
|
# Load XML content into Asker data objects
|
14
13
|
# @param filepath (String) File path
|
15
14
|
# @param content (String) XML plane text content
|
16
|
-
# rubocop:disable Metrics/MethodLength
|
17
|
-
# rubocop:disable Metrics/AbcSize
|
18
15
|
def self.load(filepath, content)
|
19
16
|
concepts = []
|
20
17
|
codes = []
|
@@ -33,7 +30,7 @@ module ContentLoader
|
|
33
30
|
when 'code'
|
34
31
|
codes << read_code(xmldata, filepath)
|
35
32
|
else
|
36
|
-
|
33
|
+
puts Rainbow("[ERROR] Unkown tag <#{xmldata.name}>").red
|
37
34
|
end
|
38
35
|
end
|
39
36
|
|
@@ -49,7 +46,7 @@ module ContentLoader
|
|
49
46
|
begin
|
50
47
|
lang = xmldata.root.attributes['lang']
|
51
48
|
rescue StandardError
|
52
|
-
lang =
|
49
|
+
lang = ProjectData.instance.lang
|
53
50
|
end
|
54
51
|
lang
|
55
52
|
end
|
@@ -73,7 +70,7 @@ module ContentLoader
|
|
73
70
|
# @param lang
|
74
71
|
# @param context
|
75
72
|
private_class_method def self.read_concept(xmldata, filepath, lang, context)
|
76
|
-
project =
|
73
|
+
project = ProjectData.instance
|
77
74
|
c = Concept.new(xmldata, filepath, lang, context)
|
78
75
|
c.process = true if [File.basename(filepath), :default].include? project.get(:process_file)
|
79
76
|
c
|
@@ -84,7 +81,7 @@ module ContentLoader
|
|
84
81
|
# @param xmldata (XML Object)
|
85
82
|
# @param filepath (String)
|
86
83
|
private_class_method def self.read_code(xmldata, filepath)
|
87
|
-
project =
|
84
|
+
project = ProjectData.instance
|
88
85
|
c = CodeLoader.load(xmldata, filepath)
|
89
86
|
c.process = true if [File.basename(filepath), :default].include? project.get(:process_file)
|
90
87
|
c
|
@@ -95,8 +92,9 @@ module ContentLoader
|
|
95
92
|
# @param filepath (String)
|
96
93
|
# @param content (String)
|
97
94
|
private_class_method def self.raise_error_with(filepath, content)
|
98
|
-
msg =
|
99
|
-
|
95
|
+
msg = "[ERROR] ContentLoader: Format error in #{filepath}\n"
|
96
|
+
msg += " Take a look at ouput/error.xml"
|
97
|
+
puts Rainbow(msg).red.bright
|
100
98
|
f = File.open('output/error.xml', 'w')
|
101
99
|
f.write(content)
|
102
100
|
f.close
|
@@ -1,7 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require_relative 'file_loader'
|
4
|
-
require_relative '../logger'
|
5
4
|
|
6
5
|
# Load input data from one directory
|
7
6
|
module DirectoryLoader
|
@@ -13,7 +12,6 @@ module DirectoryLoader
|
|
13
12
|
files = (Dir.new(dirname).entries - ['.', '..']).sort
|
14
13
|
# Accept only HAML or XML files
|
15
14
|
accepted = files.select { |f| %w[.xml .haml].include? File.extname(f) }
|
16
|
-
Logger.verboseln " * Input directory = #{Rainbow(dirname).bright}"
|
17
15
|
DirectoryLoader.load_files(accepted, dirname)
|
18
16
|
end
|
19
17
|
|
@@ -24,7 +22,7 @@ module DirectoryLoader
|
|
24
22
|
return if Dir.exist? dirname
|
25
23
|
|
26
24
|
msg = Rainbow("[ERROR] #{dirname} directory dosn't exist!").color(:red)
|
27
|
-
|
25
|
+
puts msg
|
28
26
|
raise msg
|
29
27
|
end
|
30
28
|
|
@@ -48,11 +46,6 @@ module DirectoryLoader
|
|
48
46
|
# @param filepath (String) Path to input file
|
49
47
|
# @param last (Boolean) True if it is the last filename
|
50
48
|
def self.load_file(filepath, last = false)
|
51
|
-
if last
|
52
|
-
Logger.verboseln " └── Input file = #{Rainbow(filepath).bright}"
|
53
|
-
else
|
54
|
-
Logger.verboseln " ├── Input file = #{Rainbow(filepath).bright}"
|
55
|
-
end
|
56
49
|
FileLoader.load(filepath)
|
57
50
|
end
|
58
51
|
end
|
@@ -2,21 +2,16 @@
|
|
2
2
|
|
3
3
|
require_relative 'content_loader'
|
4
4
|
require_relative 'haml_loader'
|
5
|
-
require_relative '../logger'
|
6
5
|
|
7
6
|
# Methods that load a filename and return list of concepts
|
8
7
|
module FileLoader
|
9
|
-
##
|
10
|
-
# Load asker data from file
|
11
|
-
# @param filename (String) File name to be load
|
12
8
|
def self.load(filename)
|
13
9
|
if File.extname(filename).casecmp('.haml').zero?
|
14
10
|
file_content = HamlLoader.load filename
|
15
11
|
elsif File.extname(filename).casecmp('.xml').zero?
|
16
12
|
file_content = File.read(filename)
|
17
13
|
else
|
18
|
-
|
19
|
-
Logger.verboseln msg
|
14
|
+
puts "[ERROR] FileLoader: Format error #{filename}"
|
20
15
|
raise msg
|
21
16
|
end
|
22
17
|
ContentLoader.load(filename, file_content)
|
@@ -4,12 +4,16 @@ require 'haml'
|
|
4
4
|
|
5
5
|
# HAML file loader
|
6
6
|
module HamlLoader
|
7
|
-
##
|
8
|
-
# Load HAML file name
|
9
|
-
# @param filename (String) HAML file name
|
10
7
|
def self.load(filename)
|
11
8
|
template = File.read(filename)
|
12
|
-
|
13
|
-
|
9
|
+
begin
|
10
|
+
haml_engine = Haml::Engine.new(template)
|
11
|
+
return haml_engine.render
|
12
|
+
rescue StandardError => e
|
13
|
+
puts "[ERROR] HamlLoader: Can't load <#{filename}> file!"
|
14
|
+
puts " => #{e}"
|
15
|
+
exit 0
|
16
|
+
end
|
14
17
|
end
|
18
|
+
|
15
19
|
end
|
@@ -1,8 +1,6 @@
|
|
1
1
|
|
2
2
|
require 'net/http'
|
3
3
|
require 'uri'
|
4
|
-
require_relative '../application'
|
5
|
-
require_relative '../logger'
|
6
4
|
|
7
5
|
# Search URL images on Internet
|
8
6
|
# Methods:
|
@@ -36,10 +34,10 @@ module ImageUrlLoader
|
|
36
34
|
end
|
37
35
|
end
|
38
36
|
rescue
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
37
|
+
puts '[ERROR] ImageUrlLoader'
|
38
|
+
puts " => #{search_url}"
|
39
|
+
puts ' => Check Internet connections'
|
40
|
+
puts ' => Ensure URL is well formed'
|
43
41
|
end
|
44
42
|
image_urls
|
45
43
|
end
|
@@ -3,30 +3,29 @@
|
|
3
3
|
require_relative 'directory_loader'
|
4
4
|
require_relative '../ai/concept_ai'
|
5
5
|
require_relative '../data/world'
|
6
|
-
require_relative '../logger'
|
7
6
|
|
8
7
|
# Load DATA defined into our Project
|
9
8
|
module InputLoader
|
10
9
|
##
|
11
10
|
# Load input data from every input directory
|
12
11
|
# @param inputdirs (Array)
|
13
|
-
def self.load(inputdirs)
|
12
|
+
def self.load(inputdirs, internet = true)
|
14
13
|
data = { concepts: [], codes: [], world: nil,
|
15
14
|
concepts_ai: [], codes_ai: [] }
|
16
|
-
Logger.verboseln "\n[INFO] Loading input data"
|
15
|
+
#Logger.verboseln "\n[INFO] Loading input data"
|
17
16
|
inputdirs.each do |dirname|
|
18
17
|
temp = DirectoryLoader.load(dirname)
|
19
18
|
data[:concepts] += temp[:concepts]
|
20
19
|
data[:codes] += temp[:codes]
|
21
20
|
end
|
22
|
-
create_questions(data)
|
21
|
+
create_questions(data, internet)
|
23
22
|
end
|
24
23
|
|
25
|
-
private_class_method def self.create_questions(data)
|
24
|
+
private_class_method def self.create_questions(data, internet)
|
26
25
|
# Create World data
|
27
26
|
# * Calculate concept neighbours
|
28
27
|
# * TO-DO: Calculate code neighbours
|
29
|
-
data[:world] = World.new(data[:concepts])
|
28
|
+
data[:world] = World.new(data[:concepts], internet)
|
30
29
|
# Create ConceptAI data (ConceptAI = concept + questions)
|
31
30
|
data[:concepts].each do |concept|
|
32
31
|
data[:concepts_ai] << ConceptAI.new(concept, data[:world])
|