asker-tool 2.1.5 → 2.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +13 -17
- data/bin/asker +2 -1
- data/lib/asker/ai/ai.rb +10 -3
- data/lib/asker/ai/ai_calculate.rb +20 -6
- data/lib/asker/ai/code/base_code_ai.rb +104 -0
- data/lib/asker/{code/ai → ai/code}/code_ai_factory.rb +11 -1
- data/lib/asker/{code/ai → ai/code}/javascript_code_ai.rb +2 -5
- data/lib/asker/ai/code/problem_code_ai.rb +176 -0
- data/lib/asker/{code/ai → ai/code}/python_code_ai.rb +2 -5
- data/lib/asker/{code/ai → ai/code}/ruby_code_ai.rb +14 -7
- data/lib/asker/{code/ai → ai/code}/sql_code_ai.rb +2 -5
- data/lib/asker/ai/concept_ai.rb +13 -3
- data/lib/asker/ai/question.rb +28 -6
- data/lib/asker/ai/stages/base_stage.rb +45 -6
- data/lib/asker/ai/stages/stage_b.rb +100 -50
- data/lib/asker/ai/stages/stage_d.rb +75 -90
- data/lib/asker/ai/stages/stage_f.rb +64 -36
- data/lib/asker/ai/stages/stage_i.rb +79 -92
- data/lib/asker/ai/stages/stage_s.rb +41 -36
- data/lib/asker/ai/stages/stage_t.rb +149 -108
- data/lib/asker/application.rb +19 -11
- data/lib/asker/cli.rb +31 -44
- data/lib/asker/data/code.rb +62 -0
- data/lib/asker/data/column.rb +31 -21
- data/lib/asker/data/concept.rb +109 -65
- data/lib/asker/data/data_field.rb +14 -0
- data/lib/asker/data/project_data.rb +63 -0
- data/lib/asker/data/row.rb +75 -52
- data/lib/asker/data/table.rb +91 -42
- data/lib/asker/data/template.rb +3 -1
- data/lib/asker/data/world.rb +51 -35
- data/lib/asker/displayer/code_displayer.rb +7 -0
- data/lib/asker/displayer/concept_ai_displayer.erb +10 -0
- data/lib/asker/displayer/concept_ai_displayer.rb +74 -53
- data/lib/asker/displayer/concept_displayer.rb +16 -9
- data/lib/asker/displayer/stats_displayer.rb +12 -3
- data/lib/asker/exporter/concept_ai_gift_exporter.rb +19 -11
- data/lib/asker/exporter/concept_ai_moodle_exporter.rb +44 -0
- data/lib/asker/exporter/concept_ai_yaml_exporter.rb +13 -6
- data/lib/asker/exporter/concept_doc_exporter.rb +14 -1
- data/lib/asker/exporter/data_gift_exporter.rb +29 -0
- data/lib/asker/exporter/output_file_exporter.rb +9 -6
- data/lib/asker/files/{config.ini → asker.ini} +48 -1
- data/lib/asker/files/example-concept.haml +0 -1
- data/lib/asker/files/language/du/connectors.yaml +81 -0
- data/lib/asker/{lang/locales/fr → files/language/du}/mistakes.yaml +1 -1
- data/lib/asker/files/language/du/templates.yaml +29 -0
- data/lib/asker/{lang/locales → files/language}/en/connectors.yaml +0 -0
- data/lib/asker/{lang/locales → files/language}/en/mistakes.yaml +0 -0
- data/lib/asker/files/language/en/templates.yaml +29 -0
- data/lib/asker/{lang/locales → files/language}/es/connectors.yaml +0 -0
- data/lib/asker/files/language/es/mistakes.yaml +84 -0
- data/lib/asker/files/language/es/templates.yaml +29 -0
- data/lib/asker/files/language/fr/connectors.yaml +76 -0
- data/lib/asker/{lang/locales/es → files/language/fr}/mistakes.yaml +0 -0
- data/lib/asker/files/language/fr/templates.yaml +29 -0
- data/lib/asker/{lang/locales → files/language}/javascript/connectors.yaml +0 -0
- data/lib/asker/{lang/locales → files/language}/javascript/mistakes.yaml +0 -0
- data/lib/asker/{lang/locales → files/language}/javascript/templates.yaml +0 -0
- data/lib/asker/{lang/locales → files/language}/math/connectors.yaml +0 -0
- data/lib/asker/{lang/locales → files/language}/math/mistakes.yaml +0 -0
- data/lib/asker/{lang/locales → files/language}/math/templates.yaml +0 -0
- data/lib/asker/{lang/locales → files/language}/python/connectors.yaml +0 -0
- data/lib/asker/{lang/locales → files/language}/python/mistakes.yaml +0 -0
- data/lib/asker/{lang/locales → files/language}/python/templates.yaml +0 -0
- data/lib/asker/{lang/locales → files/language}/ruby/connectors.yaml +0 -0
- data/lib/asker/{lang/locales → files/language}/ruby/mistakes.yaml +0 -0
- data/lib/asker/{lang/locales → files/language}/ruby/templates.yaml +0 -0
- data/lib/asker/{lang/locales → files/language}/sql/connectors.yaml +0 -0
- data/lib/asker/{lang/locales → files/language}/sql/mistakes.yaml +0 -0
- data/lib/asker/{lang/locales → files/language}/sql/templates.yaml +0 -0
- data/lib/asker/formatter/concept_doc_formatter.rb +0 -4
- data/lib/asker/formatter/concept_string_formatter.rb +7 -4
- data/lib/asker/formatter/moodle/matching.erb +38 -0
- data/lib/asker/formatter/moodle/multichoice.erb +49 -0
- data/lib/asker/formatter/moodle/shortanswer.erb +30 -0
- data/lib/asker/formatter/moodle/truefalse.erb +47 -0
- data/lib/asker/formatter/question_gift_formatter.rb +30 -20
- data/lib/asker/formatter/question_moodle_formatter.rb +27 -0
- data/lib/asker/{checker.rb → input_checker.rb} +126 -49
- data/lib/asker/lang/lang.rb +17 -10
- data/lib/asker/lang/lang_factory.rb +32 -5
- data/lib/asker/lang/text_actions.rb +87 -69
- data/lib/asker/loader/code_loader.rb +4 -4
- data/lib/asker/loader/content_loader.rb +21 -19
- data/lib/asker/loader/directory_loader.rb +1 -8
- data/lib/asker/loader/embedded_file.rb +42 -0
- data/lib/asker/loader/file_loader.rb +3 -14
- data/lib/asker/loader/haml_loader.rb +15 -0
- data/lib/asker/loader/image_url_loader.rb +8 -12
- data/lib/asker/loader/input_loader.rb +13 -15
- data/lib/asker/loader/project_loader.rb +25 -15
- data/lib/asker/logger.rb +36 -9
- data/lib/asker/skeleton.rb +23 -13
- data/lib/asker.rb +76 -42
- metadata +53 -54
- data/lib/asker/code/ai/base_code_ai.rb +0 -48
- data/lib/asker/code/code.rb +0 -53
- data/lib/asker/lang/locales/du/templates.yaml +0 -50
- data/lib/asker/lang/locales/en/templates.yaml +0 -29
- data/lib/asker/lang/locales/es/templates.yaml +0 -29
- data/lib/asker/lang/locales/fr/connectors.yaml +0 -92
- data/lib/asker/lang/locales/fr/templates.yaml +0 -29
- data/lib/asker/project.rb +0 -172
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
require 'rainbow'
|
|
4
4
|
require 'rexml/document'
|
|
5
5
|
require_relative '../logger'
|
|
6
|
-
require_relative '../
|
|
6
|
+
require_relative '../data/code'
|
|
7
7
|
|
|
8
8
|
# Read XML info about Code input data
|
|
9
9
|
module CodeLoader
|
|
@@ -24,7 +24,7 @@ module CodeLoader
|
|
|
24
24
|
# @param xmldata (XML Object)
|
|
25
25
|
# @param filename (String) File name that contains data
|
|
26
26
|
# @return Code object
|
|
27
|
-
def self.read_codedata_from_xml(xmldata, filename)
|
|
27
|
+
private_class_method def self.read_codedata_from_xml(xmldata, filename)
|
|
28
28
|
data = { path: '?', type: '?', features: [] }
|
|
29
29
|
xmldata.elements.each do |i|
|
|
30
30
|
data[:path] = i.text if i.name == 'path'
|
|
@@ -38,14 +38,14 @@ module CodeLoader
|
|
|
38
38
|
# Read features data from XML input
|
|
39
39
|
# @param xmldata (XML object)
|
|
40
40
|
# @return Array with features (Strings)
|
|
41
|
-
def self.read_features(xmldata, filename)
|
|
41
|
+
private_class_method def self.read_features(xmldata, filename)
|
|
42
42
|
features = []
|
|
43
43
|
xmldata.elements.each do |i|
|
|
44
44
|
if i.name == 'row'
|
|
45
45
|
features << i.text
|
|
46
46
|
else
|
|
47
47
|
msg = Rainbow("[ERROR] features/#{i.name} from #{filename}").color(:red)
|
|
48
|
-
Logger.
|
|
48
|
+
Logger.verboseln msg
|
|
49
49
|
end
|
|
50
50
|
end
|
|
51
51
|
features
|
|
@@ -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,6 +12,8 @@ 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
|
|
15
|
+
# rubocop:disable Metrics/MethodLength
|
|
16
|
+
# rubocop:disable Metrics/AbcSize
|
|
16
17
|
def self.load(filepath, content)
|
|
17
18
|
concepts = []
|
|
18
19
|
codes = []
|
|
@@ -31,21 +32,23 @@ module ContentLoader
|
|
|
31
32
|
when 'code'
|
|
32
33
|
codes << read_code(xmldata, filepath)
|
|
33
34
|
else
|
|
34
|
-
|
|
35
|
+
puts Rainbow("[ERROR] Unkown tag <#{xmldata.name}>").red
|
|
35
36
|
end
|
|
36
37
|
end
|
|
37
38
|
|
|
38
39
|
{ concepts: concepts, codes: codes }
|
|
39
40
|
end
|
|
41
|
+
# rubocop:enable Metrics/MethodLength
|
|
42
|
+
# rubocop:enable Metrics/AbcSize
|
|
40
43
|
|
|
41
44
|
##
|
|
42
45
|
# Read lang attr from input XML data
|
|
43
46
|
# @param xmldata (XML Object)
|
|
44
|
-
def self.read_lang_attribute(xmldata)
|
|
47
|
+
private_class_method def self.read_lang_attribute(xmldata)
|
|
45
48
|
begin
|
|
46
49
|
lang = xmldata.root.attributes['lang']
|
|
47
50
|
rescue StandardError
|
|
48
|
-
lang =
|
|
51
|
+
lang = ProjectData.instance.lang
|
|
49
52
|
end
|
|
50
53
|
lang
|
|
51
54
|
end
|
|
@@ -53,7 +56,7 @@ module ContentLoader
|
|
|
53
56
|
##
|
|
54
57
|
# Read context attr from input XML data
|
|
55
58
|
# @param xmldata (XML Object)
|
|
56
|
-
def self.read_context_attribute(xmldata)
|
|
59
|
+
private_class_method def self.read_context_attribute(xmldata)
|
|
57
60
|
begin
|
|
58
61
|
context = xmldata.root.attributes['context']
|
|
59
62
|
rescue StandardError
|
|
@@ -68,12 +71,10 @@ module ContentLoader
|
|
|
68
71
|
# @param filepath (String)
|
|
69
72
|
# @param lang
|
|
70
73
|
# @param context
|
|
71
|
-
def self.read_concept(xmldata, filepath, lang, context)
|
|
72
|
-
project =
|
|
74
|
+
private_class_method def self.read_concept(xmldata, filepath, lang, context)
|
|
75
|
+
project = ProjectData.instance
|
|
73
76
|
c = Concept.new(xmldata, filepath, lang, context)
|
|
74
|
-
if [
|
|
75
|
-
c.process = true
|
|
76
|
-
end
|
|
77
|
+
c.process = true if [File.basename(filepath), :default].include? project.get(:process_file)
|
|
77
78
|
c
|
|
78
79
|
end
|
|
79
80
|
|
|
@@ -81,18 +82,19 @@ module ContentLoader
|
|
|
81
82
|
# Read code from input XML data
|
|
82
83
|
# @param xmldata (XML Object)
|
|
83
84
|
# @param filepath (String)
|
|
84
|
-
def self.read_code(xmldata, filepath)
|
|
85
|
-
project =
|
|
85
|
+
private_class_method def self.read_code(xmldata, filepath)
|
|
86
|
+
project = ProjectData.instance
|
|
86
87
|
c = CodeLoader.load(xmldata, filepath)
|
|
87
|
-
if [
|
|
88
|
-
c.process = true
|
|
89
|
-
end
|
|
88
|
+
c.process = true if [File.basename(filepath), :default].include? project.get(:process_file)
|
|
90
89
|
c
|
|
91
90
|
end
|
|
92
91
|
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
92
|
+
##
|
|
93
|
+
# Raise error and save content into error.file
|
|
94
|
+
# @param filepath (String)
|
|
95
|
+
# @param content (String)
|
|
96
|
+
private_class_method def self.raise_error_with(filepath, content)
|
|
97
|
+
puts Rainbow("[ERROR] ContentLoader: Format error in #{filepath}").red.bright
|
|
96
98
|
f = File.open('output/error.xml', 'w')
|
|
97
99
|
f.write(content)
|
|
98
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.verbose " * 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.verbose " └── Input file = #{Rainbow(filepath).bright}"
|
|
53
|
-
else
|
|
54
|
-
Logger.verbose " ├── Input file = #{Rainbow(filepath).bright}"
|
|
55
|
-
end
|
|
56
49
|
FileLoader.load(filepath)
|
|
57
50
|
end
|
|
58
51
|
end
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'base64'
|
|
4
|
+
|
|
5
|
+
# Methods to load embedded files defined into asker input data file
|
|
6
|
+
# Example:
|
|
7
|
+
# * def line with :type = :image_url used to link external file as https://..."
|
|
8
|
+
# * def line with :type = :file used to load local file as image.png or file.txt"
|
|
9
|
+
module EmbeddedFile
|
|
10
|
+
##
|
|
11
|
+
# @param value (String)
|
|
12
|
+
# @param localdir (String) Input file base folder
|
|
13
|
+
# @return Hash
|
|
14
|
+
# rubocop:disable Metrics/MethodLength
|
|
15
|
+
# rubocop:disable Metrics/AbcSize
|
|
16
|
+
def self.load(value, localdir)
|
|
17
|
+
# When filename is an URL
|
|
18
|
+
if value.start_with?('https://') || value.start_with?('http://')
|
|
19
|
+
return { text: "<img src=\"#{value}\" alt=\"image\" width=\"400\" height=\"300\">", file: :none }
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
filepath = File.join(localdir, value)
|
|
23
|
+
unless File.exist?(filepath)
|
|
24
|
+
# When filename is unkown!
|
|
25
|
+
Logger.verbose Rainbow("[ERROR] Unknown file! #{filepath}").red.bright
|
|
26
|
+
exit 1
|
|
27
|
+
end
|
|
28
|
+
# When filename is PNG, JPG o JPEG
|
|
29
|
+
if ['.png', '.jpg', '.jpeg'].include? File.extname(filepath)
|
|
30
|
+
# converts image into base64 strings
|
|
31
|
+
text = '<img src="@@PLUGINFILE@@/' + File.basename(filepath) \
|
|
32
|
+
+ '" alt="imagen" class="img-responsive atto_image_button_text-bottom">'
|
|
33
|
+
data = '<file name="' + File.basename(filepath) + '" path="/" encoding="base64">' \
|
|
34
|
+
+ Base64.strict_encode64(File.open(filepath, 'rb').read) + '</file>'
|
|
35
|
+
return { text: text, file: data }
|
|
36
|
+
end
|
|
37
|
+
# Suposse that filename is TXT file
|
|
38
|
+
return { text: "<pre>#{File.read(filepath)}</pre>", file: :none } if File.exist?(filepath)
|
|
39
|
+
end
|
|
40
|
+
# rubocop:enable Metrics/MethodLength
|
|
41
|
+
# rubocop:enable Metrics/AbcSize
|
|
42
|
+
end
|
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
require 'haml'
|
|
4
3
|
require_relative 'content_loader'
|
|
5
|
-
require_relative '
|
|
4
|
+
require_relative 'haml_loader'
|
|
6
5
|
|
|
7
6
|
# Methods that load a filename and return list of concepts
|
|
8
7
|
module FileLoader
|
|
@@ -11,23 +10,13 @@ module FileLoader
|
|
|
11
10
|
# @param filename (String) File name to be load
|
|
12
11
|
def self.load(filename)
|
|
13
12
|
if File.extname(filename).casecmp('.haml').zero?
|
|
14
|
-
file_content =
|
|
13
|
+
file_content = HamlLoader.load filename
|
|
15
14
|
elsif File.extname(filename).casecmp('.xml').zero?
|
|
16
15
|
file_content = File.read(filename)
|
|
17
16
|
else
|
|
18
|
-
|
|
19
|
-
Logger.verbose msg
|
|
17
|
+
puts "[ERROR] FileLoader: Format error #{filename}"
|
|
20
18
|
raise msg
|
|
21
19
|
end
|
|
22
20
|
ContentLoader.load(filename, file_content)
|
|
23
21
|
end
|
|
24
|
-
|
|
25
|
-
##
|
|
26
|
-
# Load HAML file name
|
|
27
|
-
# @param filename (String) HAML file name
|
|
28
|
-
def self.load_haml(filename)
|
|
29
|
-
template = File.read(filename)
|
|
30
|
-
haml_engine = Haml::Engine.new(template)
|
|
31
|
-
haml_engine.render
|
|
32
|
-
end
|
|
33
22
|
end
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'haml'
|
|
4
|
+
|
|
5
|
+
# HAML file loader
|
|
6
|
+
module HamlLoader
|
|
7
|
+
##
|
|
8
|
+
# Load HAML file name
|
|
9
|
+
# @param filename (String) HAML file name
|
|
10
|
+
def self.load(filename)
|
|
11
|
+
template = File.read(filename)
|
|
12
|
+
haml_engine = Haml::Engine.new(template)
|
|
13
|
+
haml_engine.render
|
|
14
|
+
end
|
|
15
|
+
end
|
|
@@ -1,8 +1,6 @@
|
|
|
1
1
|
|
|
2
2
|
require 'net/http'
|
|
3
3
|
require 'uri'
|
|
4
|
-
require_relative '../project'
|
|
5
|
-
require_relative '../application'
|
|
6
4
|
|
|
7
5
|
# Search URL images on Internet
|
|
8
6
|
# Methods:
|
|
@@ -12,9 +10,6 @@ require_relative '../application'
|
|
|
12
10
|
module ImageUrlLoader
|
|
13
11
|
# Search "input" images on Google and return URL
|
|
14
12
|
def self.load(input = [])
|
|
15
|
-
param = Application.instance.config['global']['internet'] || 'yes'
|
|
16
|
-
return [] unless param == 'yes'
|
|
17
|
-
|
|
18
13
|
filters = []
|
|
19
14
|
if input.class == String
|
|
20
15
|
filters += sanitize_string(input.clone)
|
|
@@ -39,20 +34,21 @@ module ImageUrlLoader
|
|
|
39
34
|
end
|
|
40
35
|
end
|
|
41
36
|
rescue
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
37
|
+
puts '[ERROR] ImageUrlLoader'
|
|
38
|
+
puts " => #{search_url}"
|
|
39
|
+
puts ' => Check Internet connections'
|
|
40
|
+
puts ' => Ensure URL is well formed'
|
|
46
41
|
end
|
|
47
42
|
image_urls
|
|
48
43
|
end
|
|
49
44
|
|
|
50
45
|
def self.sanitize_string(input)
|
|
46
|
+
text = input.dup
|
|
51
47
|
r = [ ['á', 'a'], ['é', 'e'], ['í', 'i'], ['ó', 'o'], ['ú', 'u'], ['ñ', 'n'], ['Á', 'A'], ['É', 'E'], ['Í', 'I'], ['Ó', 'O'], ['Ú', 'U'], ['Ñ', 'N']]
|
|
52
|
-
r.each { |item|
|
|
48
|
+
r.each { |item| text.gsub!(item[0], item[1]) }
|
|
53
49
|
r = ['-', '_', ',', '"']
|
|
54
|
-
r.each { |item|
|
|
55
|
-
|
|
50
|
+
r.each { |item| text.gsub!(item, ' ') }
|
|
51
|
+
text.split(' ')
|
|
56
52
|
end
|
|
57
53
|
|
|
58
54
|
def self.sanitize_array(input)
|
|
@@ -3,39 +3,37 @@
|
|
|
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)
|
|
14
|
-
data = { concepts: [], codes: [], world: nil,
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
# inputdirs = project.inputdirs.split(',')
|
|
12
|
+
def self.load(inputdirs, internet = true)
|
|
13
|
+
data = { concepts: [], codes: [], world: nil,
|
|
14
|
+
concepts_ai: [], codes_ai: [] }
|
|
15
|
+
#Logger.verboseln "\n[INFO] Loading input data"
|
|
18
16
|
inputdirs.each do |dirname|
|
|
19
17
|
temp = DirectoryLoader.load(dirname)
|
|
20
18
|
data[:concepts] += temp[:concepts]
|
|
21
19
|
data[:codes] += temp[:codes]
|
|
22
20
|
end
|
|
23
|
-
create_questions(data)
|
|
21
|
+
create_questions(data, internet)
|
|
24
22
|
end
|
|
25
23
|
|
|
26
|
-
private_class_method def self.create_questions(data)
|
|
24
|
+
private_class_method def self.create_questions(data, internet)
|
|
27
25
|
# Create World data
|
|
28
26
|
# * Calculate concept neighbours
|
|
29
27
|
# * TO-DO: Calculate code neighbours
|
|
30
|
-
data[:world] = World.new(data[:concepts])
|
|
31
|
-
# Create ConceptAI data
|
|
28
|
+
data[:world] = World.new(data[:concepts], internet)
|
|
29
|
+
# Create ConceptAI data (ConceptAI = concept + questions)
|
|
32
30
|
data[:concepts].each do |concept|
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
31
|
+
data[:concepts_ai] << ConceptAI.new(concept, data[:world])
|
|
32
|
+
end
|
|
33
|
+
# Create CodeAI data (CodeAI = code + questions)
|
|
34
|
+
data[:codes].each do |code|
|
|
35
|
+
data[:codes_ai] << CodeAIFactory.get(code)
|
|
36
36
|
end
|
|
37
|
-
# Make code questions
|
|
38
|
-
data[:codes].each(&:make_questions)
|
|
39
37
|
data
|
|
40
38
|
end
|
|
41
39
|
end
|
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
3
|
require 'yaml'
|
|
4
|
-
require_relative '../
|
|
5
|
-
require_relative '../logger'
|
|
4
|
+
require_relative '../data/project_data'
|
|
6
5
|
|
|
7
6
|
# Load params into Project class using arg input
|
|
8
7
|
# * load
|
|
@@ -14,22 +13,26 @@ module ProjectLoader
|
|
|
14
13
|
##
|
|
15
14
|
# Load project from args
|
|
16
15
|
# @param args (String or Hash)
|
|
16
|
+
# rubocop:disable Metrics/MethodLength
|
|
17
17
|
def self.load(args)
|
|
18
|
-
project =
|
|
18
|
+
project = ProjectData.instance
|
|
19
19
|
|
|
20
20
|
if args.class == Hash
|
|
21
21
|
project.param.merge!(args)
|
|
22
|
+
project.open
|
|
22
23
|
return project
|
|
23
24
|
elsif args.class == String
|
|
24
25
|
ProjectLoader.load_from_string(args)
|
|
26
|
+
project.open
|
|
25
27
|
return project
|
|
26
28
|
end
|
|
27
29
|
|
|
28
30
|
msg = '[ERROR] ProjectLoader:'
|
|
29
31
|
msg += "Configuration params format is <#{pArgs.class}>!"
|
|
30
|
-
|
|
32
|
+
puts Rainbow(msg).red
|
|
31
33
|
raise msg
|
|
32
34
|
end
|
|
35
|
+
# rubocop:enable Metrics/MethodLength
|
|
33
36
|
|
|
34
37
|
##
|
|
35
38
|
# Load project from filepath. Options:
|
|
@@ -37,12 +40,14 @@ module ProjectLoader
|
|
|
37
40
|
# * XML filepath
|
|
38
41
|
# * YAML filepath
|
|
39
42
|
# @param filepath (String)
|
|
43
|
+
# rubocop:disable Metrics/MethodLength
|
|
44
|
+
# rubocop:disable Metrics/AbcSize
|
|
40
45
|
def self.load_from_string(filepath)
|
|
41
|
-
project =
|
|
46
|
+
project = ProjectData.instance
|
|
42
47
|
unless File.exist?(filepath)
|
|
43
|
-
msg = Rainbow("[
|
|
44
|
-
|
|
45
|
-
|
|
48
|
+
msg = Rainbow("[ERROR] #{filepath} not found!").red.bright
|
|
49
|
+
puts msg
|
|
50
|
+
exit 1
|
|
46
51
|
end
|
|
47
52
|
|
|
48
53
|
if File.extname(filepath) == '.haml' || File.extname(filepath) == '.xml'
|
|
@@ -51,22 +56,27 @@ module ProjectLoader
|
|
|
51
56
|
return project
|
|
52
57
|
elsif File.extname(filepath) == '.yaml'
|
|
53
58
|
return load_from_yaml(filepath)
|
|
54
|
-
else
|
|
55
|
-
load_error(filepath)
|
|
56
59
|
end
|
|
60
|
+
error_loading(filepath)
|
|
57
61
|
end
|
|
62
|
+
# rubocop:enable Metrics/MethodLength
|
|
63
|
+
# rubocop:enable Metrics/AbcSize
|
|
58
64
|
|
|
65
|
+
# rubocop:disable Security/YAMLLoad
|
|
59
66
|
def self.load_from_yaml(arg)
|
|
60
|
-
project =
|
|
67
|
+
project = ProjectData.instance
|
|
61
68
|
project.param.merge!(YAML.load(File.open(arg)))
|
|
62
69
|
project.set(:configfilename, arg)
|
|
63
70
|
project.set(:projectdir, File.dirname(arg))
|
|
64
71
|
project
|
|
65
72
|
end
|
|
73
|
+
# rubocop:enable Security/YAMLLoad
|
|
66
74
|
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
75
|
+
##
|
|
76
|
+
# Error found and exit application.
|
|
77
|
+
def self.error_loading(arg)
|
|
78
|
+
msg = Rainbow("[ERROR] Loading... #{arg}").red.bright
|
|
79
|
+
puts msg
|
|
80
|
+
exit 1
|
|
71
81
|
end
|
|
72
82
|
end
|
data/lib/asker/logger.rb
CHANGED
|
@@ -1,20 +1,47 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
require 'singleton'
|
|
4
|
+
require_relative 'application'
|
|
4
5
|
|
|
5
6
|
# Display and log project messages
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
7
|
+
class Logger
|
|
8
|
+
include Singleton
|
|
9
|
+
@attr_verbose = 'yes'
|
|
10
|
+
|
|
11
|
+
def set_verbose(value)
|
|
12
|
+
@attr_verbose = value
|
|
13
|
+
end
|
|
14
|
+
|
|
9
15
|
def self.verbose(msg)
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
project.get(:logfile)&.write("#{msg}\n")
|
|
16
|
+
print msg if @attr_verbose == 'yes'
|
|
17
|
+
@logfile&.write(msg)
|
|
13
18
|
end
|
|
14
19
|
|
|
15
|
-
##
|
|
16
|
-
# Display and log text line
|
|
17
20
|
def self.verboseln(msg)
|
|
18
21
|
verbose(msg + "\n")
|
|
19
22
|
end
|
|
23
|
+
|
|
24
|
+
def log(msg)
|
|
25
|
+
verbose(msg)
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def logln(msg)
|
|
29
|
+
verboseln(msg)
|
|
30
|
+
end
|
|
31
|
+
##
|
|
32
|
+
# Create or reset logfile
|
|
33
|
+
def self.create(logpath, logname)
|
|
34
|
+
@logfile = File.open(logpath, 'w')
|
|
35
|
+
@logfile.write('=' * 50 + "\n")
|
|
36
|
+
@logfile.write("Created by : #{Application::NAME}")
|
|
37
|
+
@logfile.write(" (version #{Application::VERSION})\n")
|
|
38
|
+
@logfile.write("File : #{logname}\n")
|
|
39
|
+
@logfile.write("Time : #{Time.new}\n")
|
|
40
|
+
@logfile.write("Author : David Vargas Ruiz\n")
|
|
41
|
+
@logfile.write('=' * 50 + "\n\n")
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def self.close
|
|
45
|
+
@logfile.close
|
|
46
|
+
end
|
|
20
47
|
end
|
data/lib/asker/skeleton.rb
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
require 'fileutils'
|
|
4
4
|
require 'rainbow'
|
|
5
|
+
require_relative 'application'
|
|
5
6
|
|
|
6
7
|
# Skeleton: create skeleton for asker input files
|
|
7
8
|
# * create
|
|
@@ -12,27 +13,36 @@ require 'rainbow'
|
|
|
12
13
|
module Skeleton
|
|
13
14
|
##
|
|
14
15
|
# Create skeleton for asker input files
|
|
15
|
-
# @param
|
|
16
|
-
|
|
17
|
-
|
|
16
|
+
# @param inputpath (String)
|
|
17
|
+
# rubocop:disable Metrics/MethodLength
|
|
18
|
+
def self.create_input(inputpath)
|
|
19
|
+
puts "\n[INFO] Creating example input #{Rainbow(inputpath).bright}"
|
|
20
|
+
if File.extname(inputpath) == '.haml'
|
|
21
|
+
dirpath = File.dirname(inputpath)
|
|
22
|
+
filename = File.basename(inputpath)
|
|
23
|
+
else
|
|
24
|
+
dirpath = inputpath
|
|
25
|
+
filename = 'example-concept.haml'
|
|
26
|
+
end
|
|
18
27
|
create_dir dirpath
|
|
19
|
-
|
|
28
|
+
source = File.join(File.dirname(__FILE__), 'files/example-concept.haml')
|
|
29
|
+
copyfile(source, File.join(dirpath, filename))
|
|
20
30
|
end
|
|
31
|
+
# rubocop:enable Metrics/MethodLength
|
|
21
32
|
|
|
22
33
|
##
|
|
23
|
-
#
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
copyfile(source, target)
|
|
34
|
+
# Create default configuration files
|
|
35
|
+
def self.create_configuration
|
|
36
|
+
puts "\n[INFO] Creating configuration files"
|
|
37
|
+
src = File.join(File.dirname(__FILE__), 'files', Application::CONFIGFILE)
|
|
38
|
+
dst = File.join(Application::CONFIGFILE)
|
|
39
|
+
copyfile(src, dst)
|
|
30
40
|
end
|
|
31
41
|
|
|
32
42
|
##
|
|
33
43
|
# Create folder
|
|
34
44
|
# @param dirpath (String)
|
|
35
|
-
def self.create_dir(dirpath)
|
|
45
|
+
private_class_method def self.create_dir(dirpath)
|
|
36
46
|
if Dir.exist? dirpath
|
|
37
47
|
puts "* Exists dir! => #{Rainbow(dirpath).yellow}"
|
|
38
48
|
else
|
|
@@ -49,7 +59,7 @@ module Skeleton
|
|
|
49
59
|
# Copy target file to dest
|
|
50
60
|
# @param target (String)
|
|
51
61
|
# @param dest (String)
|
|
52
|
-
def self.copyfile(target, dest)
|
|
62
|
+
private_class_method def self.copyfile(target, dest)
|
|
53
63
|
if File.exist? dest
|
|
54
64
|
puts "* Exists file! => #{Rainbow(dest).yellow}"
|
|
55
65
|
return true
|