asker-tool 2.1.3 → 2.2.0
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 +18 -19
- 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 +12 -2
- 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 +24 -7
- data/lib/asker/checker.rb +149 -52
- data/lib/asker/cli.rb +37 -32
- data/lib/asker/data/code.rb +76 -0
- data/lib/asker/data/column.rb +31 -21
- data/lib/asker/data/concept.rb +108 -65
- data/lib/asker/data/data_field.rb +14 -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 +61 -32
- data/lib/asker/{exporter/code_screen_exporter.rb → displayer/code_displayer.rb} +13 -6
- data/lib/asker/displayer/concept_ai_displayer.erb +10 -0
- data/lib/asker/displayer/concept_ai_displayer.rb +133 -0
- data/lib/asker/displayer/concept_displayer.rb +34 -0
- data/lib/asker/displayer/stats_displayer.rb +22 -0
- data/lib/asker/exporter/code_gift_exporter.rb +10 -11
- data/lib/asker/exporter/concept_ai_gift_exporter.rb +21 -13
- data/lib/asker/exporter/concept_ai_moodle_exporter.rb +44 -0
- data/lib/asker/exporter/concept_ai_yaml_exporter.rb +14 -9
- data/lib/asker/exporter/concept_doc_exporter.rb +21 -14
- data/lib/asker/exporter/data_gift_exporter.rb +29 -0
- data/lib/asker/exporter/output_file_exporter.rb +21 -0
- data/lib/asker/files/{config.ini → asker.ini} +48 -1
- data/lib/asker/files/example-concept.haml +24 -8
- data/lib/asker/files/language/du/connectors.yaml +81 -0
- data/lib/asker/files/language/du/mistakes.yaml +82 -0
- data/lib/asker/files/language/du/templates.yaml +29 -0
- data/lib/asker/files/language/en/connectors.yaml +44 -0
- data/lib/asker/files/language/en/mistakes.yaml +37 -0
- data/lib/asker/files/language/en/templates.yaml +29 -0
- data/lib/asker/files/language/es/connectors.yaml +92 -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/files/language/fr/mistakes.yaml +82 -0
- data/lib/asker/files/language/fr/templates.yaml +29 -0
- data/lib/asker/files/language/javascript/connectors.yaml +11 -0
- data/lib/asker/files/language/javascript/mistakes.yaml +30 -0
- data/lib/asker/files/language/javascript/templates.yaml +3 -0
- data/lib/asker/files/language/math/connectors.yaml +2 -0
- data/lib/asker/files/language/math/mistakes.yaml +2 -0
- data/lib/asker/files/language/math/templates.yaml +1 -0
- data/lib/asker/files/language/python/connectors.yaml +11 -0
- data/lib/asker/files/language/python/mistakes.yaml +26 -0
- data/lib/asker/files/language/python/templates.yaml +3 -0
- data/lib/asker/files/language/ruby/connectors.yaml +11 -0
- data/lib/asker/files/language/ruby/mistakes.yaml +33 -0
- data/lib/asker/files/language/ruby/templates.yaml +3 -0
- data/lib/asker/files/language/sql/connectors.yaml +6 -0
- data/lib/asker/files/language/sql/mistakes.yaml +11 -0
- data/lib/asker/files/language/sql/templates.yaml +2 -0
- data/lib/asker/formatter/concept_string_formatter.rb +13 -9
- 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/lang/lang.rb +18 -12
- 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 +16 -12
- data/lib/asker/loader/directory_loader.rb +3 -3
- data/lib/asker/loader/embedded_file.rb +42 -0
- data/lib/asker/loader/file_loader.rb +3 -12
- data/lib/asker/loader/haml_loader.rb +15 -0
- data/lib/asker/loader/image_url_loader.rb +9 -11
- data/lib/asker/loader/input_loader.rb +24 -8
- data/lib/asker/loader/project_loader.rb +42 -30
- data/lib/asker/logger.rb +30 -6
- data/lib/asker/project.rb +28 -117
- data/lib/asker/skeleton.rb +40 -29
- data/lib/asker.rb +68 -79
- metadata +57 -74
- data/docs/changelog/v2.1.md +0 -99
- data/docs/commands.md +0 -12
- data/docs/contributions.md +0 -18
- data/docs/history.md +0 -40
- data/docs/idea.md +0 -44
- data/docs/inputs/README.md +0 -39
- data/docs/inputs/code.md +0 -69
- data/docs/inputs/concepts.md +0 -142
- data/docs/inputs/jedi.md +0 -68
- data/docs/inputs/tables.md +0 -112
- data/docs/inputs/templates.md +0 -87
- data/docs/install/README.md +0 -38
- data/docs/install/manual.md +0 -26
- data/docs/install/scripts.md +0 -38
- data/docs/revise/asker-file.md +0 -41
- data/docs/revise/buenas-practicas/01-convocatoria.md +0 -30
- data/docs/revise/buenas-practicas/02-formulario.md +0 -35
- data/docs/revise/buenas-practicas/03-descripcion.md +0 -63
- data/docs/revise/buenas-practicas/04-resultados.md +0 -17
- data/docs/revise/buenas-practicas/05-reproducir.md +0 -10
- data/docs/revise/ejemplos/01/README.md +0 -27
- data/docs/revise/ejemplos/02/README.md +0 -31
- data/docs/revise/ejemplos/03/README.md +0 -31
- data/docs/revise/ejemplos/04/README.md +0 -37
- data/docs/revise/ejemplos/05/README.md +0 -25
- data/docs/revise/ejemplos/06/README.md +0 -43
- data/docs/revise/ejemplos/README.md +0 -11
- data/docs/revise/projects.md +0 -74
- data/lib/asker/code/ai/base_code_ai.rb +0 -48
- data/lib/asker/code/code.rb +0 -53
- data/lib/asker/exporter/concept_ai_screen_exporter.rb +0 -115
- data/lib/asker/exporter/concept_screen_exporter.rb +0 -25
- data/lib/asker/exporter/main.rb +0 -9
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
require 'yaml'
|
|
4
4
|
require_relative '../project'
|
|
5
|
+
require_relative '../logger'
|
|
5
6
|
|
|
6
7
|
# Load params into Project class using arg input
|
|
7
8
|
# * load
|
|
@@ -10,62 +11,73 @@ require_relative '../project'
|
|
|
10
11
|
# * load_from_directory
|
|
11
12
|
# * load_error
|
|
12
13
|
module ProjectLoader
|
|
13
|
-
|
|
14
|
+
##
|
|
15
|
+
# Load project from args
|
|
16
|
+
# @param args (String or Hash)
|
|
17
|
+
# rubocop:disable Metrics/MethodLength
|
|
18
|
+
def self.load(args)
|
|
14
19
|
project = Project.instance
|
|
15
20
|
|
|
16
21
|
if args.class == Hash
|
|
17
22
|
project.param.merge!(args)
|
|
18
|
-
|
|
23
|
+
project.open
|
|
24
|
+
return project
|
|
19
25
|
elsif args.class == String
|
|
20
26
|
ProjectLoader.load_from_string(args)
|
|
21
|
-
|
|
27
|
+
project.open
|
|
28
|
+
return project
|
|
22
29
|
end
|
|
23
30
|
|
|
24
31
|
msg = '[ERROR] ProjectLoader:'
|
|
25
32
|
msg += "Configuration params format is <#{pArgs.class}>!"
|
|
26
|
-
|
|
33
|
+
Logger.verboseln Rainbow(msg).red
|
|
27
34
|
raise msg
|
|
28
35
|
end
|
|
36
|
+
# rubocop:enable Metrics/MethodLength
|
|
29
37
|
|
|
30
|
-
|
|
38
|
+
##
|
|
39
|
+
# Load project from filepath. Options:
|
|
40
|
+
# * HAML filepath
|
|
41
|
+
# * XML filepath
|
|
42
|
+
# * YAML filepath
|
|
43
|
+
# @param filepath (String)
|
|
44
|
+
# rubocop:disable Metrics/MethodLength
|
|
45
|
+
# rubocop:disable Metrics/AbcSize
|
|
46
|
+
def self.load_from_string(filepath)
|
|
31
47
|
project = Project.instance
|
|
32
|
-
unless File.exist?(
|
|
33
|
-
msg = Rainbow("[
|
|
34
|
-
|
|
35
|
-
|
|
48
|
+
unless File.exist?(filepath)
|
|
49
|
+
msg = Rainbow("[ERROR] #{filepath} not found!").red.bright
|
|
50
|
+
Logger.verboseln msg
|
|
51
|
+
exit 1
|
|
36
52
|
end
|
|
37
53
|
|
|
38
|
-
if File.extname(
|
|
39
|
-
project.set(:inputdirs, File.dirname(
|
|
40
|
-
project.set(:process_file, File.basename(
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
load_from_directory(arg)
|
|
45
|
-
else
|
|
46
|
-
load_error(arg)
|
|
54
|
+
if File.extname(filepath) == '.haml' || File.extname(filepath) == '.xml'
|
|
55
|
+
project.set(:inputdirs, File.dirname(filepath))
|
|
56
|
+
project.set(:process_file, File.basename(filepath))
|
|
57
|
+
return project
|
|
58
|
+
elsif File.extname(filepath) == '.yaml'
|
|
59
|
+
return load_from_yaml(filepath)
|
|
47
60
|
end
|
|
61
|
+
error_loading(filepath)
|
|
48
62
|
end
|
|
63
|
+
# rubocop:enable Metrics/MethodLength
|
|
64
|
+
# rubocop:enable Metrics/AbcSize
|
|
49
65
|
|
|
66
|
+
# rubocop:disable Security/YAMLLoad
|
|
50
67
|
def self.load_from_yaml(arg)
|
|
51
68
|
project = Project.instance
|
|
52
69
|
project.param.merge!(YAML.load(File.open(arg)))
|
|
53
70
|
project.set(:configfilename, arg)
|
|
54
71
|
project.set(:projectdir, File.dirname(arg))
|
|
72
|
+
project
|
|
55
73
|
end
|
|
74
|
+
# rubocop:enable Security/YAMLLoad
|
|
56
75
|
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
msg
|
|
61
|
-
|
|
76
|
+
##
|
|
77
|
+
# Error found and exit application.
|
|
78
|
+
def self.error_loading(arg)
|
|
79
|
+
msg = Rainbow("[ERROR] Loading... #{arg}").red.bright
|
|
80
|
+
Logger.verboseln msg
|
|
62
81
|
exit 1
|
|
63
82
|
end
|
|
64
|
-
|
|
65
|
-
def self.load_error(arg)
|
|
66
|
-
msg = Rainbow('[ERR ] ProjectLoader: Input ').red
|
|
67
|
-
msg += Rainbow(arg).red.bright + Rainbow(' unkown').red
|
|
68
|
-
Project.instance.verbose msg
|
|
69
|
-
raise msg
|
|
70
|
-
end
|
|
71
83
|
end
|
data/lib/asker/logger.rb
CHANGED
|
@@ -1,16 +1,21 @@
|
|
|
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
|
+
class Logger
|
|
8
|
+
include Singleton
|
|
9
|
+
|
|
10
|
+
def initialize
|
|
11
|
+
@logfile = null
|
|
12
|
+
end
|
|
13
|
+
|
|
7
14
|
##
|
|
8
15
|
# Display and log text
|
|
9
16
|
def self.verbose(msg)
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
project.get(:logfile).write("#{msg}\n") if project.get(:logfile)
|
|
13
|
-
# project.get(:logfile)&.project.get(:logfile).write("#{msg}\n")
|
|
17
|
+
print msg if Application.instance.config['global']['verbose'] == 'yes'
|
|
18
|
+
@logfile&.write(msg)
|
|
14
19
|
end
|
|
15
20
|
|
|
16
21
|
##
|
|
@@ -18,4 +23,23 @@ module Logger
|
|
|
18
23
|
def self.verboseln(msg)
|
|
19
24
|
verbose(msg + "\n")
|
|
20
25
|
end
|
|
26
|
+
|
|
27
|
+
##
|
|
28
|
+
# Create or reset logfile
|
|
29
|
+
def self.create(project)
|
|
30
|
+
@logfile = File.open(project.get(:logpath), 'w')
|
|
31
|
+
@logfile.write('=' * 50 + "\n")
|
|
32
|
+
@logfile.write("Created by : #{Application::NAME}")
|
|
33
|
+
@logfile.write(" (version #{Application::VERSION})\n")
|
|
34
|
+
@logfile.write("File : #{project.get(:logname)}\n")
|
|
35
|
+
@logfile.write("Time : #{Time.new}\n")
|
|
36
|
+
@logfile.write("Author : David Vargas Ruiz\n")
|
|
37
|
+
@logfile.write('=' * 50 + "\n\n")
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
##
|
|
41
|
+
# Close Log file
|
|
42
|
+
def self.close
|
|
43
|
+
@logfile.close
|
|
44
|
+
end
|
|
21
45
|
end
|
data/lib/asker/project.rb
CHANGED
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
|
|
3
3
|
require 'singleton'
|
|
4
4
|
require 'rainbow'
|
|
5
|
-
require 'fileutils'
|
|
6
5
|
require_relative 'application'
|
|
6
|
+
require_relative 'logger'
|
|
7
7
|
|
|
8
8
|
# Contains Project data and methods
|
|
9
9
|
class Project
|
|
@@ -20,16 +20,8 @@ class Project
|
|
|
20
20
|
# Reset project params
|
|
21
21
|
def reset
|
|
22
22
|
@default = { inputbasedir: FileUtils.pwd,
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
formula_weights: [1, 1, 1],
|
|
26
|
-
lang: 'en',
|
|
27
|
-
locales: %w[en es javascript math python ruby sql],
|
|
28
|
-
show_mode: :default,
|
|
29
|
-
verbose: true,
|
|
30
|
-
stages: { d: true, b: true, f: true, i: true, s: true, t: true },
|
|
31
|
-
threshold: 0.5,
|
|
32
|
-
color_output: true }
|
|
23
|
+
stages: { d: true, b: true, f: true, i: true, s: true, t: true },
|
|
24
|
+
threshold: 0.5 }
|
|
33
25
|
@param = {}
|
|
34
26
|
end
|
|
35
27
|
|
|
@@ -54,117 +46,36 @@ class Project
|
|
|
54
46
|
# Open new project
|
|
55
47
|
# * setting new params and
|
|
56
48
|
# * creating output files
|
|
57
|
-
# IMPORTANT: We need at least
|
|
49
|
+
# IMPORTANT: We need at least these values
|
|
58
50
|
# * process_file
|
|
59
51
|
# * inputdirs
|
|
52
|
+
# rubocop:disable Metrics/MethodLength
|
|
53
|
+
# rubocop:disable Metrics/AbcSize
|
|
60
54
|
def open
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
get(:projectdir).split(File::SEPARATOR).last + ext
|
|
55
|
+
config = Application.instance.config
|
|
56
|
+
ext = File.extname(@param[:process_file]) || '.haml'
|
|
64
57
|
@param[:projectname] = @param[:projectname] ||
|
|
65
58
|
File.basename(@param[:process_file], ext)
|
|
66
|
-
@param[:inputdirs] = @param[:inputdirs] ||
|
|
67
|
-
File.join(get(:inputbasedir), @param[:projectdir])
|
|
68
59
|
|
|
69
|
-
@param[:logname] = @param[:
|
|
70
|
-
|
|
71
|
-
@param[:
|
|
72
|
-
|
|
73
|
-
@param[:
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
@param[:
|
|
79
|
-
|
|
80
|
-
@param[:
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
Dir.mkdir(get(:outputdir)) unless Dir.exist?(get(:outputdir))
|
|
88
|
-
create_log_file
|
|
89
|
-
create_output_file
|
|
90
|
-
create_lesson_file
|
|
91
|
-
create_yaml_file
|
|
92
|
-
end
|
|
93
|
-
|
|
94
|
-
##
|
|
95
|
-
# Close output files
|
|
96
|
-
def close
|
|
97
|
-
get(:logfile).close
|
|
98
|
-
get(:outputfile).close
|
|
99
|
-
get(:lessonfile).close
|
|
100
|
-
get(:yamlfile).close
|
|
101
|
-
end
|
|
102
|
-
|
|
103
|
-
##
|
|
104
|
-
# Display and log text
|
|
105
|
-
def verbose(msg)
|
|
106
|
-
puts msg if get(:verbose)
|
|
107
|
-
get(:logfile).write(msg.to_s + "\n") if get(:logfile)
|
|
108
|
-
end
|
|
109
|
-
|
|
110
|
-
##
|
|
111
|
-
# Display and log text line
|
|
112
|
-
def verboseln(msg)
|
|
113
|
-
verbose(msg + "\n")
|
|
114
|
-
end
|
|
115
|
-
|
|
116
|
-
def method_missing(method, *_args, &_block)
|
|
117
|
-
get(method)
|
|
118
|
-
end
|
|
119
|
-
|
|
120
|
-
private
|
|
121
|
-
|
|
122
|
-
# create or reset logfile
|
|
123
|
-
def create_log_file
|
|
124
|
-
@param[:logfile] = File.open(get(:logpath), 'w')
|
|
125
|
-
f = get(:logfile)
|
|
126
|
-
f.write('=' * 50 + "\n")
|
|
127
|
-
f.write("Created by : #{Application::NAME}")
|
|
128
|
-
f.write(" (version #{Application::VERSION})\n")
|
|
129
|
-
f.write("File : #{get(:logname)}\n")
|
|
130
|
-
f.write("Time : #{Time.new}\n")
|
|
131
|
-
f.write("Author : David Vargas Ruiz\n")
|
|
132
|
-
f.write('=' * 50 + "\n\n")
|
|
133
|
-
|
|
134
|
-
verbose '[INFO] Project open'
|
|
135
|
-
verbose ' ├── inputdirs = ' + Rainbow(get(:inputdirs)).bright
|
|
136
|
-
verbose ' └── process_file = ' + Rainbow(get(:process_file)).bright
|
|
137
|
-
end
|
|
138
|
-
|
|
139
|
-
# Create or reset output file
|
|
140
|
-
def create_output_file
|
|
141
|
-
@param[:outputfile] = File.open(get(:outputpath), 'w')
|
|
142
|
-
f = get(:outputfile)
|
|
143
|
-
f.write('// ' + ('=' * 50) + "\n")
|
|
144
|
-
f.write("// Created by : #{Application::NAME}")
|
|
145
|
-
f.write(" (version #{Application::VERSION})\n")
|
|
146
|
-
f.write("// File : #{get(:outputname)}\n")
|
|
147
|
-
f.write("// Time : #{Time.new}\n")
|
|
148
|
-
f.write("// Author : David Vargas Ruiz\n")
|
|
149
|
-
f.write('// ' + ('=' * 50) + "\n\n")
|
|
150
|
-
f.write("$CATEGORY: $course$/#{get(:category)}\n") unless get(:category) == :none
|
|
151
|
-
end
|
|
152
|
-
|
|
153
|
-
# Create or reset lesson file
|
|
154
|
-
def create_lesson_file
|
|
155
|
-
@param[:lessonfile] = File.new(get(:lessonpath), 'w')
|
|
156
|
-
f = get(:lessonfile)
|
|
157
|
-
f.write('=' * 50 + "\n")
|
|
158
|
-
f.write("Created by : #{Application::NAME}")
|
|
159
|
-
f.write(" (version #{Application::VERSION})\n")
|
|
160
|
-
f.write("File : #{get(:lessonname)}\n")
|
|
161
|
-
f.write("Time : #{Time.new}\n")
|
|
162
|
-
f.write("Author : David Vargas Ruiz\n")
|
|
163
|
-
f.write('=' * 50 + "\n")
|
|
164
|
-
end
|
|
165
|
-
|
|
166
|
-
# Create or reset yaml file
|
|
167
|
-
def create_yaml_file
|
|
168
|
-
@param[:yamlfile] = File.open(get(:yamlpath), 'w')
|
|
60
|
+
@param[:logname] = "#{@param[:projectname]}-log.txt"
|
|
61
|
+
@param[:outputname] = "#{@param[:projectname]}-gift.txt"
|
|
62
|
+
@param[:lessonname] = "#{@param[:projectname]}-doc.txt"
|
|
63
|
+
@param[:yamlname] = "#{@param[:projectname]}.yaml"
|
|
64
|
+
@param[:moodlename] = "#{@param[:projectname]}-moodle.xml"
|
|
65
|
+
|
|
66
|
+
outputdir = config['output']['folder']
|
|
67
|
+
@param[:logpath] = File.join(outputdir, get(:logname))
|
|
68
|
+
@param[:outputpath] = File.join(outputdir, get(:outputname))
|
|
69
|
+
@param[:lessonpath] = File.join(outputdir, get(:lessonname))
|
|
70
|
+
@param[:yamlpath] = File.join(outputdir, get(:yamlname))
|
|
71
|
+
@param[:moodlepath] = File.join(outputdir, get(:moodlename))
|
|
72
|
+
|
|
73
|
+
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
|
|
169
78
|
end
|
|
79
|
+
# rubocop:enable Metrics/MethodLength
|
|
80
|
+
# rubocop:enable Metrics/AbcSize
|
|
170
81
|
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
|
|
@@ -10,27 +11,38 @@ require 'rainbow'
|
|
|
10
11
|
# * create_dirs
|
|
11
12
|
# * copyfile
|
|
12
13
|
module Skeleton
|
|
13
|
-
|
|
14
|
-
|
|
14
|
+
##
|
|
15
|
+
# Create skeleton for asker input files
|
|
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
|
|
15
27
|
create_dir dirpath
|
|
16
|
-
|
|
28
|
+
source = File.join(File.dirname(__FILE__), 'files/example-concept.haml')
|
|
29
|
+
copyfile(source, File.join(dirpath, filename))
|
|
17
30
|
end
|
|
31
|
+
# rubocop:enable Metrics/MethodLength
|
|
18
32
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
items.each do |item|
|
|
27
|
-
source = File.join(source_basedir, item[:source])
|
|
28
|
-
target = File.join(project_dir, item[:target])
|
|
29
|
-
copyfile(source, target)
|
|
30
|
-
end
|
|
33
|
+
##
|
|
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)
|
|
31
40
|
end
|
|
32
41
|
|
|
33
|
-
|
|
42
|
+
##
|
|
43
|
+
# Create folder
|
|
44
|
+
# @param dirpath (String)
|
|
45
|
+
private_class_method def self.create_dir(dirpath)
|
|
34
46
|
if Dir.exist? dirpath
|
|
35
47
|
puts "* Exists dir! => #{Rainbow(dirpath).yellow}"
|
|
36
48
|
else
|
|
@@ -43,21 +55,20 @@ module Skeleton
|
|
|
43
55
|
end
|
|
44
56
|
end
|
|
45
57
|
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
def self.copyfile(target, dest)
|
|
58
|
+
##
|
|
59
|
+
# Copy target file to dest
|
|
60
|
+
# @param target (String)
|
|
61
|
+
# @param dest (String)
|
|
62
|
+
private_class_method def self.copyfile(target, dest)
|
|
51
63
|
if File.exist? dest
|
|
52
64
|
puts "* Exists file! => #{Rainbow(dest).yellow}"
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
end
|
|
65
|
+
return true
|
|
66
|
+
end
|
|
67
|
+
begin
|
|
68
|
+
FileUtils.cp(target, dest)
|
|
69
|
+
puts "* Create file => #{Rainbow(dest).green}"
|
|
70
|
+
rescue StandardError
|
|
71
|
+
puts "* Create file ERROR => #{Rainbow(dest).red}"
|
|
61
72
|
end
|
|
62
73
|
end
|
|
63
74
|
end
|
data/lib/asker.rb
CHANGED
|
@@ -2,63 +2,29 @@
|
|
|
2
2
|
|
|
3
3
|
require 'rainbow'
|
|
4
4
|
|
|
5
|
-
require_relative 'asker/
|
|
6
|
-
require_relative 'asker/
|
|
7
|
-
require_relative 'asker/
|
|
8
|
-
require_relative 'asker/ai/concept_ai'
|
|
9
|
-
require_relative 'asker/formatter/concept_string_formatter'
|
|
10
|
-
require_relative 'asker/exporter/main'
|
|
5
|
+
require_relative 'asker/displayer/concept_displayer'
|
|
6
|
+
require_relative 'asker/displayer/stats_displayer'
|
|
7
|
+
require_relative 'asker/exporter/output_file_exporter'
|
|
11
8
|
require_relative 'asker/loader/project_loader'
|
|
12
9
|
require_relative 'asker/loader/input_loader'
|
|
13
10
|
require_relative 'asker/checker'
|
|
11
|
+
require_relative 'asker/logger'
|
|
14
12
|
require_relative 'asker/skeleton'
|
|
15
13
|
|
|
16
|
-
|
|
17
|
-
#
|
|
18
|
-
# * load_input_data
|
|
19
|
-
# * create_output_files, show_create_output_files
|
|
20
|
-
# * create_questions
|
|
21
|
-
# * show_final_results
|
|
14
|
+
##
|
|
15
|
+
# Asker main class
|
|
22
16
|
class Asker
|
|
23
|
-
# Initialize atributes
|
|
24
|
-
def initialize
|
|
25
|
-
@concepts_ai = []
|
|
26
|
-
@concepts = []
|
|
27
|
-
@codes = []
|
|
28
|
-
end
|
|
29
|
-
|
|
30
17
|
##
|
|
31
|
-
#
|
|
32
|
-
# @param
|
|
33
|
-
def
|
|
34
|
-
|
|
35
|
-
create_output_files
|
|
36
|
-
show_final_results
|
|
37
|
-
end
|
|
38
|
-
|
|
39
|
-
##
|
|
40
|
-
# Load input data
|
|
41
|
-
# @param args (Hash)
|
|
42
|
-
def load_input_data(args)
|
|
43
|
-
ProjectLoader.load(args)
|
|
44
|
-
Project.instance.open
|
|
45
|
-
data = InputLoader.load(Project.instance.get(:inputdirs).split(','))
|
|
46
|
-
@concepts = data[:concepts]
|
|
47
|
-
@codes = data[:codes]
|
|
48
|
-
Project.instance.verbose "\n[INFO] Loading data from Internet"
|
|
49
|
-
@world = World.new(@concepts)
|
|
50
|
-
ConceptScreenExporter.export_all(@concepts)
|
|
18
|
+
# Create asker input demo files
|
|
19
|
+
# @param dirpath (String)
|
|
20
|
+
def self.create_input(dirpath)
|
|
21
|
+
Skeleton.create_input(dirpath)
|
|
51
22
|
end
|
|
52
23
|
|
|
53
24
|
##
|
|
54
|
-
# Create
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
# * TXT Doc
|
|
58
|
-
def create_output_files
|
|
59
|
-
show_create_output_files
|
|
60
|
-
create_questions
|
|
61
|
-
ConceptDocExporter.new(@concepts).export
|
|
25
|
+
# Create asker configuration files
|
|
26
|
+
def self.create_configuration
|
|
27
|
+
Skeleton.create_configuration
|
|
62
28
|
end
|
|
63
29
|
|
|
64
30
|
##
|
|
@@ -69,43 +35,66 @@ class Asker
|
|
|
69
35
|
end
|
|
70
36
|
|
|
71
37
|
##
|
|
72
|
-
#
|
|
73
|
-
# @param
|
|
74
|
-
def self.
|
|
75
|
-
|
|
38
|
+
# Start working
|
|
39
|
+
# @param filepath (String) HAML or XML filepath
|
|
40
|
+
def self.start(filepath)
|
|
41
|
+
project, data = load_input(filepath)
|
|
42
|
+
ConceptDisplayer.show(data[:concepts])
|
|
43
|
+
create_output(project, data)
|
|
76
44
|
end
|
|
77
45
|
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
p.verbose " └── Lesson file => #{Rainbow(p.lessonpath).bright}"
|
|
46
|
+
##
|
|
47
|
+
# Load input data
|
|
48
|
+
# @param args (Hash)
|
|
49
|
+
private_class_method def self.load_input(args)
|
|
50
|
+
project = ProjectLoader.load(args)
|
|
51
|
+
data = InputLoader.load(project.get(:inputdirs).split(','))
|
|
52
|
+
[project, data]
|
|
86
53
|
end
|
|
87
54
|
|
|
88
55
|
##
|
|
89
|
-
# Create
|
|
90
|
-
#
|
|
91
|
-
#
|
|
92
|
-
#
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
56
|
+
# Create output files: Gift, YAML, TXT Doc
|
|
57
|
+
# rubocop:disable Metrics/AbcSize
|
|
58
|
+
# rubocop:disable Metrics/MethodLength
|
|
59
|
+
# rubocop:disable Metrics/PerceivedComplexity
|
|
60
|
+
private_class_method def self.create_output(project, data)
|
|
61
|
+
Logger.verboseln "\n[INFO] Creating output files"
|
|
62
|
+
m = ' ├── Gift questions file => '
|
|
63
|
+
m += if Application.instance.config['output']['gift'] == 'yes'
|
|
64
|
+
Rainbow(project.get(:outputpath)).bright
|
|
65
|
+
else
|
|
66
|
+
"#{project.get(:outputpath)} (No)"
|
|
67
|
+
end
|
|
68
|
+
Logger.verboseln m
|
|
69
|
+
|
|
70
|
+
m = ' ├── Lesson file => '
|
|
71
|
+
m += if Application.instance.config['output']['doc'] == 'yes'
|
|
72
|
+
Rainbow(project.get(:lessonpath)).bright
|
|
73
|
+
else
|
|
74
|
+
"#{project.get(:lessonpath)} (No)"
|
|
75
|
+
end
|
|
76
|
+
Logger.verboseln m
|
|
77
|
+
|
|
78
|
+
m = ' ├── YAML questions file => '
|
|
79
|
+
m += if Application.instance.config['output']['yaml'] == 'yes'
|
|
80
|
+
Rainbow(project.get(:yamlpath)).bright
|
|
81
|
+
else
|
|
82
|
+
"#{project.get(:yamlpath)} (No)"
|
|
83
|
+
end
|
|
84
|
+
Logger.verboseln m
|
|
105
85
|
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
86
|
+
m = ' └── Moodle XML file => '
|
|
87
|
+
m += if Application.instance.config['output']['moodle'] == 'yes'
|
|
88
|
+
Rainbow(project.get(:moodlepath)).bright
|
|
89
|
+
else
|
|
90
|
+
"#{project.get(:moodlepath)} (No)"
|
|
91
|
+
end
|
|
92
|
+
Logger.verboseln m
|
|
93
|
+
OutputFileExporter.export(data, project)
|
|
94
|
+
StatsDisplayer.show(data)
|
|
95
|
+
Logger.close
|
|
110
96
|
end
|
|
97
|
+
# rubocop:enable Metrics/AbcSize
|
|
98
|
+
# rubocop:enable Metrics/MethodLength
|
|
99
|
+
# rubocop:enable Metrics/PerceivedComplexity
|
|
111
100
|
end
|