asker-tool 2.1.3 → 2.2.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|