asker-tool 2.5.9 → 2.7.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 +10 -7
- data/lib/asker/ai/ai.rb +17 -22
- data/lib/asker/ai/ai_calculate.rb +10 -17
- data/lib/asker/ai/code/base_code_ai.rb +5 -30
- data/lib/asker/ai/code/code_ai_factory.rb +6 -12
- data/lib/asker/ai/code/javascript_code_ai.rb +33 -34
- data/lib/asker/ai/code/python_code_ai.rb +35 -36
- data/lib/asker/ai/code/ruby_code_ai.rb +33 -33
- data/lib/asker/ai/code/sql_code_ai.rb +20 -21
- data/lib/asker/ai/concept_ai.rb +12 -22
- data/lib/asker/ai/problem/problem_ai.rb +226 -0
- data/lib/asker/ai/question.rb +34 -45
- data/lib/asker/ai/stages/base_stage.rb +7 -7
- data/lib/asker/ai/stages/main.rb +6 -7
- data/lib/asker/ai/stages/stage_b.rb +62 -28
- data/lib/asker/ai/stages/stage_d.rb +10 -10
- data/lib/asker/ai/stages/stage_f.rb +17 -17
- data/lib/asker/ai/stages/stage_i.rb +8 -18
- data/lib/asker/ai/stages/stage_s.rb +28 -26
- data/lib/asker/ai/stages/stage_t.rb +54 -76
- data/lib/asker/application.rb +15 -14
- data/lib/asker/check_input/check_haml_data.rb +57 -51
- data/lib/asker/check_input/check_table.rb +26 -19
- data/lib/asker/check_input.rb +10 -22
- data/lib/asker/cli.rb +43 -24
- data/lib/asker/data/code.rb +10 -9
- data/lib/asker/data/column.rb +21 -17
- data/lib/asker/data/concept.rb +24 -37
- data/lib/asker/data/data_field.rb +2 -2
- data/lib/asker/data/problem.rb +112 -0
- data/lib/asker/data/project_data.rb +11 -15
- data/lib/asker/data/row.rb +25 -23
- data/lib/asker/data/table.rb +25 -46
- data/lib/asker/data/template.rb +7 -7
- data/lib/asker/data/world.rb +3 -3
- data/lib/asker/{formatter → deprecated}/question_moodlexml_formatter.rb +19 -21
- data/lib/asker/displayer/code_displayer.rb +10 -10
- data/lib/asker/displayer/concept_ai_displayer.erb +1 -1
- data/lib/asker/displayer/concept_ai_displayer.rb +22 -34
- data/lib/asker/displayer/concept_displayer.rb +9 -11
- data/lib/asker/displayer/problem_displayer.rb +45 -0
- data/lib/asker/displayer/stats_displayer.rb +7 -12
- data/lib/asker/exporter/code_gift_exporter.rb +2 -2
- data/lib/asker/exporter/concept_ai_gift_exporter.rb +4 -4
- data/lib/asker/exporter/concept_ai_yaml_exporter.rb +7 -7
- data/lib/asker/exporter/concept_doc_exporter.rb +5 -5
- data/lib/asker/exporter/data_gift_exporter.rb +14 -15
- data/lib/asker/exporter/data_moodle_exporter.rb +51 -20
- data/lib/asker/exporter/output_file_exporter.rb +9 -8
- data/lib/asker/exporter/problem_gift_exporter.rb +30 -0
- data/lib/asker/files/language/ca/templates.yaml +6 -0
- data/lib/asker/files/language/du/templates.yaml +6 -0
- data/lib/asker/files/language/en/templates.yaml +7 -1
- data/lib/asker/files/language/es/templates.yaml +6 -0
- data/lib/asker/files/language/fr/templates.yaml +6 -0
- data/lib/asker/formatter/code_string_formatter.rb +5 -5
- data/lib/asker/formatter/concept_doc_formatter.rb +3 -3
- data/lib/asker/formatter/concept_string_formatter.rb +27 -24
- data/lib/asker/formatter/moodle/ddmatch.erb +40 -0
- data/lib/asker/formatter/moodle/gapfill.erb +57 -0
- data/lib/asker/formatter/moodle/ordering.erb +41 -0
- data/lib/asker/formatter/question_gift_formatter.rb +41 -14
- data/lib/asker/formatter/question_hash_formatter.rb +5 -6
- data/lib/asker/formatter/question_moodle_formatter.rb +14 -7
- data/lib/asker/formatter/rb2haml_formatter.rb +8 -7
- data/lib/asker/lang/lang.rb +16 -16
- data/lib/asker/lang/lang_factory.rb +13 -16
- data/lib/asker/lang/text_actions.rb +20 -18
- data/lib/asker/loader/code_loader.rb +10 -22
- data/lib/asker/loader/content_loader.rb +42 -49
- data/lib/asker/loader/directory_loader.rb +13 -16
- data/lib/asker/loader/embedded_file.rb +29 -24
- data/lib/asker/loader/file_loader.rb +7 -6
- data/lib/asker/loader/haml_loader.rb +6 -5
- data/lib/asker/loader/image_url_loader.rb +21 -18
- data/lib/asker/loader/input_loader.rb +27 -14
- data/lib/asker/loader/problem_loader.rb +88 -0
- data/lib/asker/loader/project_loader.rb +11 -28
- data/lib/asker/logger.rb +22 -13
- data/lib/asker/skeleton.rb +27 -43
- data/lib/asker/start.rb +44 -0
- data/lib/asker/version.rb +1 -1
- data/lib/asker.rb +7 -53
- metadata +12 -20
- data/lib/asker/ai/code/problem_code_ai.rb +0 -176
- data/lib/asker/exporter/code_moodle_exporter.rb +0 -15
- data/lib/asker/exporter/concept_ai_moodle_exporter.rb +0 -15
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "rexml/document"
|
|
4
|
+
require_relative "../logger"
|
|
5
|
+
require_relative "../data/problem"
|
|
6
|
+
|
|
7
|
+
class ProblemLoader
|
|
8
|
+
def initialize(lang, context)
|
|
9
|
+
@lang = lang
|
|
10
|
+
@context = context
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
##
|
|
14
|
+
# Load XML data about Problem object
|
|
15
|
+
# @param xmldata (XML Object)
|
|
16
|
+
# @param filepath (String)
|
|
17
|
+
# @return Problem object
|
|
18
|
+
def call(xmldata, filepath)
|
|
19
|
+
data = read_problemdata_from_xml(xmldata, File.basename(filepath))
|
|
20
|
+
problem = Problem.from(data)
|
|
21
|
+
problem.lang = @lang
|
|
22
|
+
problem.context = @context
|
|
23
|
+
problem
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
private
|
|
27
|
+
|
|
28
|
+
def read_problemdata_from_xml(xmldata, filename)
|
|
29
|
+
data = {
|
|
30
|
+
filename: filename,
|
|
31
|
+
varnames: [],
|
|
32
|
+
cases: [],
|
|
33
|
+
descs: [],
|
|
34
|
+
asks: [],
|
|
35
|
+
formats: {}
|
|
36
|
+
}
|
|
37
|
+
xmldata.elements.each do |i|
|
|
38
|
+
case i.name
|
|
39
|
+
when "cases"
|
|
40
|
+
sep = i.attributes["sep"]&.strip || ","
|
|
41
|
+
data[:varnames] = i.attributes["varnames"].split(sep)
|
|
42
|
+
data[:varnames].map! { _1.strip }
|
|
43
|
+
data[:cases] = read_cases(i, filename, sep)
|
|
44
|
+
when "desc"
|
|
45
|
+
data[:descs] << i.text
|
|
46
|
+
type = i.attributes["type"]
|
|
47
|
+
unless type.nil?
|
|
48
|
+
key = "desc#{data[:descs].size}"
|
|
49
|
+
data[:formats][key] = type
|
|
50
|
+
end
|
|
51
|
+
when "ask"
|
|
52
|
+
data[:asks] << read_ask(i, filename)
|
|
53
|
+
else
|
|
54
|
+
Logger.warn "ProblemLoader: Unkown tag problem/#{i.name} (#{filename})"
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
data
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
def read_ask(xmldata, filename)
|
|
61
|
+
ask = {text: nil, answer: nil, steps: []}
|
|
62
|
+
xmldata.elements.each do |i|
|
|
63
|
+
if i.name == "text"
|
|
64
|
+
ask[:text] = i.text
|
|
65
|
+
elsif i.name == "answer"
|
|
66
|
+
ask[:answer] = i.text
|
|
67
|
+
elsif i.name == "step"
|
|
68
|
+
ask[:steps] << i.text
|
|
69
|
+
else
|
|
70
|
+
Logger.warn "ProblemLoader: Unkown tag problem/ask/#{i.name} (#{filename})"
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
ask
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
def read_cases(xmldata, filename, sep)
|
|
77
|
+
cases = []
|
|
78
|
+
|
|
79
|
+
xmldata.elements.each do |i|
|
|
80
|
+
if i.name == "case"
|
|
81
|
+
cases << i.text.split(sep).map { _1.strip }
|
|
82
|
+
else
|
|
83
|
+
Logger.warn "ProblemLoader: Unkown tag problem/cases/#{i.name} (#{filename})"
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
cases
|
|
87
|
+
end
|
|
88
|
+
end
|
|
@@ -1,38 +1,29 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
require
|
|
4
|
-
require_relative
|
|
3
|
+
require "yaml"
|
|
4
|
+
require_relative "../data/project_data"
|
|
5
|
+
require_relative "../logger"
|
|
5
6
|
|
|
6
|
-
# Load params into Project class using arg input
|
|
7
|
-
# * load
|
|
8
|
-
# * load_from_string
|
|
9
|
-
# * load_from_yaml
|
|
10
|
-
# * load_from_directory
|
|
11
|
-
# * load_error
|
|
12
7
|
module ProjectLoader
|
|
13
8
|
##
|
|
14
9
|
# Load project from args
|
|
15
10
|
# @param args (String or Hash)
|
|
16
|
-
# rubocop:disable Metrics/MethodLength
|
|
17
11
|
def self.load(args)
|
|
18
12
|
project = ProjectData.instance
|
|
19
13
|
|
|
20
|
-
if args.
|
|
14
|
+
if args.instance_of? Hash
|
|
21
15
|
project.param.merge!(args)
|
|
22
16
|
project.open
|
|
23
17
|
return project
|
|
24
|
-
elsif args.
|
|
18
|
+
elsif args.instance_of? String
|
|
25
19
|
ProjectLoader.load_from_string(args)
|
|
26
20
|
project.open
|
|
27
21
|
return project
|
|
28
22
|
end
|
|
29
23
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
puts Rainbow(msg).red
|
|
33
|
-
raise msg
|
|
24
|
+
Logger.error "ProjectLoader: loading args with incorrect type (#{args.class})"
|
|
25
|
+
exit 1
|
|
34
26
|
end
|
|
35
|
-
# rubocop:enable Metrics/MethodLength
|
|
36
27
|
|
|
37
28
|
##
|
|
38
29
|
# Load project from filepath. Options:
|
|
@@ -40,29 +31,23 @@ module ProjectLoader
|
|
|
40
31
|
# * XML filepath
|
|
41
32
|
# * YAML filepath
|
|
42
33
|
# @param filepath (String)
|
|
43
|
-
# rubocop:disable Metrics/MethodLength
|
|
44
|
-
# rubocop:disable Metrics/AbcSize
|
|
45
34
|
def self.load_from_string(filepath)
|
|
46
35
|
project = ProjectData.instance
|
|
47
36
|
unless File.exist?(filepath)
|
|
48
|
-
|
|
49
|
-
puts msg
|
|
37
|
+
Logger.error "ProjectLoader: #{filepath} not found!"
|
|
50
38
|
exit 1
|
|
51
39
|
end
|
|
52
40
|
|
|
53
|
-
if File.extname(filepath) ==
|
|
41
|
+
if File.extname(filepath) == ".haml" || File.extname(filepath) == ".xml"
|
|
54
42
|
project.set(:inputdirs, File.dirname(filepath))
|
|
55
43
|
project.set(:process_file, File.basename(filepath))
|
|
56
44
|
return project
|
|
57
|
-
elsif File.extname(filepath) ==
|
|
45
|
+
elsif File.extname(filepath) == ".yaml"
|
|
58
46
|
return load_from_yaml(filepath)
|
|
59
47
|
end
|
|
60
48
|
error_loading(filepath)
|
|
61
49
|
end
|
|
62
|
-
# rubocop:enable Metrics/MethodLength
|
|
63
|
-
# rubocop:enable Metrics/AbcSize
|
|
64
50
|
|
|
65
|
-
# rubocop:disable Security/YAMLLoad
|
|
66
51
|
def self.load_from_yaml(arg)
|
|
67
52
|
project = ProjectData.instance
|
|
68
53
|
project.param.merge!(YAML.load(File.open(arg)))
|
|
@@ -70,13 +55,11 @@ module ProjectLoader
|
|
|
70
55
|
project.set(:projectdir, File.dirname(arg))
|
|
71
56
|
project
|
|
72
57
|
end
|
|
73
|
-
# rubocop:enable Security/YAMLLoad
|
|
74
58
|
|
|
75
59
|
##
|
|
76
60
|
# Error found and exit application.
|
|
77
61
|
def self.error_loading(arg)
|
|
78
|
-
|
|
79
|
-
puts msg
|
|
62
|
+
Logger.error "ProjectLoader: Loading... #{arg}"
|
|
80
63
|
exit 1
|
|
81
64
|
end
|
|
82
65
|
end
|
data/lib/asker/logger.rb
CHANGED
|
@@ -3,37 +3,46 @@ require_relative "version"
|
|
|
3
3
|
|
|
4
4
|
class Logger
|
|
5
5
|
include Singleton
|
|
6
|
-
@
|
|
6
|
+
@verbose = true
|
|
7
7
|
|
|
8
8
|
def set_verbose(value)
|
|
9
|
-
@
|
|
9
|
+
@verbose = (value == "yes")
|
|
10
10
|
end
|
|
11
11
|
|
|
12
|
-
def self.
|
|
13
|
-
|
|
12
|
+
def self.info(msg)
|
|
13
|
+
puts msg if @verbose
|
|
14
14
|
@logfile&.write(msg)
|
|
15
15
|
end
|
|
16
16
|
|
|
17
|
-
def self.
|
|
18
|
-
|
|
17
|
+
def self.warn(msg)
|
|
18
|
+
msg = Rainbow("[WARN] #{msg}\n").yellow.bright
|
|
19
|
+
puts msg if @verbose
|
|
20
|
+
@logfile&.write(msg)
|
|
19
21
|
end
|
|
20
22
|
|
|
21
|
-
def
|
|
22
|
-
|
|
23
|
+
def self.error(msg)
|
|
24
|
+
msg = Rainbow("[ERROR] #{msg}\n").red.bright
|
|
25
|
+
Warning.warn msg if @verbose
|
|
26
|
+
@logfile&.write(msg)
|
|
23
27
|
end
|
|
24
28
|
|
|
25
|
-
def
|
|
26
|
-
|
|
29
|
+
def self.verbose(msg)
|
|
30
|
+
print msg if @verbose
|
|
31
|
+
@logfile&.write(msg)
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def self.verboseln(msg)
|
|
35
|
+
verbose(msg + "\n")
|
|
27
36
|
end
|
|
28
37
|
|
|
29
38
|
def self.create(logpath)
|
|
30
|
-
@logfile = File.open(logpath,
|
|
31
|
-
@logfile.write(
|
|
39
|
+
@logfile = File.open(logpath, "w")
|
|
40
|
+
@logfile.write("=" * 50 + "\n")
|
|
32
41
|
@logfile.write("Created by : #{Asker::NAME}")
|
|
33
42
|
@logfile.write(" (version #{Asker::VERSION})\n")
|
|
34
43
|
@logfile.write("File : #{File.basename(logpath)}\n")
|
|
35
44
|
@logfile.write("Time : #{Time.new}\n")
|
|
36
|
-
@logfile.write(
|
|
45
|
+
@logfile.write("=" * 50 + "\n\n")
|
|
37
46
|
end
|
|
38
47
|
|
|
39
48
|
def self.close
|
data/lib/asker/skeleton.rb
CHANGED
|
@@ -1,74 +1,58 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
require
|
|
4
|
-
require
|
|
5
|
-
require_relative
|
|
3
|
+
require "fileutils"
|
|
4
|
+
require "rainbow"
|
|
5
|
+
require_relative "version"
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
def self.create_input(inputpath)
|
|
19
|
-
puts "\n[INFO] Creating example input #{Rainbow(inputpath).bright}"
|
|
20
|
-
if File.extname(inputpath) == '.haml'
|
|
7
|
+
class Skeleton
|
|
8
|
+
def create_configuration
|
|
9
|
+
puts "\nCreating configuration files"
|
|
10
|
+
src = File.join(File.dirname(__FILE__), "files", Asker::CONFIGFILE)
|
|
11
|
+
dst = File.join(Asker::CONFIGFILE)
|
|
12
|
+
copyfile(src, dst)
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def create_input(inputpath)
|
|
16
|
+
puts "\nCreating example input #{Rainbow(inputpath).bright}"
|
|
17
|
+
if File.extname(inputpath) == ".haml"
|
|
21
18
|
dirpath = File.dirname(inputpath)
|
|
22
19
|
filename = File.basename(inputpath)
|
|
23
20
|
else
|
|
24
21
|
dirpath = inputpath
|
|
25
|
-
filename =
|
|
22
|
+
filename = "example-concept.haml"
|
|
26
23
|
end
|
|
27
24
|
create_dir dirpath
|
|
28
|
-
source = File.join(File.dirname(__FILE__),
|
|
25
|
+
source = File.join(File.dirname(__FILE__), "files", "example-concept.haml")
|
|
29
26
|
copyfile(source, File.join(dirpath, filename))
|
|
30
27
|
end
|
|
31
|
-
# rubocop:enable Metrics/MethodLength
|
|
32
28
|
|
|
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', Asker::CONFIGFILE)
|
|
38
|
-
dst = File.join(Asker::CONFIGFILE)
|
|
39
|
-
copyfile(src, dst)
|
|
40
|
-
end
|
|
29
|
+
private
|
|
41
30
|
|
|
42
|
-
|
|
43
|
-
# Create folder
|
|
44
|
-
# @param dirpath (String)
|
|
45
|
-
private_class_method def self.create_dir(dirpath)
|
|
31
|
+
def create_dir(dirpath)
|
|
46
32
|
if Dir.exist? dirpath
|
|
47
|
-
puts "* Exists dir! => #{Rainbow(dirpath).yellow}"
|
|
33
|
+
puts "* Exists dir! => #{Rainbow(dirpath).yellow.bright}"
|
|
48
34
|
else
|
|
49
35
|
begin
|
|
50
36
|
FileUtils.mkdir_p(dirpath)
|
|
51
37
|
puts "* Create dir => #{Rainbow(dirpath).green}"
|
|
52
|
-
rescue
|
|
53
|
-
|
|
38
|
+
rescue
|
|
39
|
+
warn "* Create dir ERROR => #{Rainbow(dirpath).red}"
|
|
40
|
+
exit 1
|
|
54
41
|
end
|
|
55
42
|
end
|
|
56
43
|
end
|
|
57
44
|
|
|
58
|
-
|
|
59
|
-
# Copy target file to dest
|
|
60
|
-
# @param target (String)
|
|
61
|
-
# @param dest (String)
|
|
62
|
-
private_class_method def self.copyfile(target, dest)
|
|
45
|
+
def copyfile(target, dest)
|
|
63
46
|
if File.exist? dest
|
|
64
|
-
puts "* Exists file! => #{Rainbow(dest).yellow}"
|
|
47
|
+
puts "* Exists file! => #{Rainbow(dest).yellow.bright}"
|
|
65
48
|
return true
|
|
66
49
|
end
|
|
67
50
|
begin
|
|
68
51
|
FileUtils.cp(target, dest)
|
|
69
52
|
puts "* Create file => #{Rainbow(dest).green}"
|
|
70
|
-
rescue
|
|
71
|
-
|
|
53
|
+
rescue
|
|
54
|
+
warn "* Create file ERROR => #{Rainbow(dest).red}"
|
|
55
|
+
exit 1
|
|
72
56
|
end
|
|
73
57
|
end
|
|
74
58
|
end
|
data/lib/asker/start.rb
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
require_relative "application"
|
|
2
|
+
require_relative "logger"
|
|
3
|
+
require_relative "displayer/concept_displayer"
|
|
4
|
+
require_relative "displayer/stats_displayer"
|
|
5
|
+
require_relative "exporter/output_file_exporter"
|
|
6
|
+
require_relative "loader/project_loader"
|
|
7
|
+
require_relative "loader/input_loader"
|
|
8
|
+
|
|
9
|
+
class Start
|
|
10
|
+
def call(filepath)
|
|
11
|
+
project_data, data = load_input(filepath)
|
|
12
|
+
ConceptDisplayer.show(data[:concepts])
|
|
13
|
+
create_output(project_data, data)
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
private
|
|
17
|
+
|
|
18
|
+
def load_input(args)
|
|
19
|
+
init_project_data
|
|
20
|
+
project_data = ProjectLoader.load(args)
|
|
21
|
+
Logger.create(project_data.get(:logpath))
|
|
22
|
+
Logger.instance.set_verbose(Application.instance.config["verbose"])
|
|
23
|
+
|
|
24
|
+
inputdirs = project_data.get(:inputdirs).split(",")
|
|
25
|
+
internet = Application.instance.config["global"]["internet"] == "yes"
|
|
26
|
+
data = InputLoader.new.call(inputdirs, internet)
|
|
27
|
+
[project_data, data]
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def init_project_data
|
|
31
|
+
project_data = ProjectData.instance
|
|
32
|
+
outputdir = Application.instance.config["output"]["folder"]
|
|
33
|
+
project_data.set(:outputdir, outputdir)
|
|
34
|
+
|
|
35
|
+
formula_weights = Application.instance.config["ai"]["formula_weights"]
|
|
36
|
+
project_data.set(:weights, formula_weights)
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def create_output(project, data)
|
|
40
|
+
OutputFileExporter.export(data, project)
|
|
41
|
+
StatsDisplayer.show(data)
|
|
42
|
+
Logger.close
|
|
43
|
+
end
|
|
44
|
+
end
|
data/lib/asker/version.rb
CHANGED
data/lib/asker.rb
CHANGED
|
@@ -1,67 +1,21 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
require_relative 'asker/skeleton'
|
|
5
|
-
require_relative 'asker/check_input'
|
|
6
|
-
|
|
7
|
-
require_relative 'asker/displayer/concept_displayer'
|
|
8
|
-
require_relative 'asker/displayer/stats_displayer'
|
|
9
|
-
require_relative 'asker/exporter/output_file_exporter'
|
|
10
|
-
require_relative 'asker/logger'
|
|
11
|
-
|
|
12
|
-
require_relative 'asker/loader/project_loader'
|
|
13
|
-
require_relative 'asker/loader/input_loader'
|
|
1
|
+
require_relative "asker/check_input"
|
|
2
|
+
require_relative "asker/skeleton"
|
|
3
|
+
require_relative "asker/start"
|
|
14
4
|
|
|
15
5
|
class Asker
|
|
16
6
|
def self.init
|
|
17
|
-
Skeleton.create_configuration
|
|
7
|
+
Skeleton.new.create_configuration
|
|
18
8
|
end
|
|
19
9
|
|
|
20
10
|
def self.create_input(dirpath)
|
|
21
|
-
Skeleton.create_input(dirpath)
|
|
11
|
+
Skeleton.new.create_input(dirpath)
|
|
22
12
|
end
|
|
23
13
|
|
|
24
14
|
def self.check(filepath)
|
|
25
|
-
CheckInput.new.
|
|
15
|
+
CheckInput.new.check(filepath)
|
|
26
16
|
end
|
|
27
17
|
|
|
28
18
|
def self.start(filepath)
|
|
29
|
-
|
|
30
|
-
ConceptDisplayer.show(data[:concepts])
|
|
31
|
-
create_output(project_data, data)
|
|
32
|
-
end
|
|
33
|
-
|
|
34
|
-
private_class_method def self.load_input(args)
|
|
35
|
-
init_project_data
|
|
36
|
-
project_data = ProjectLoader.load(args)
|
|
37
|
-
init_logger(project_data)
|
|
38
|
-
|
|
39
|
-
inputdirs = project_data.get(:inputdirs).split(',')
|
|
40
|
-
internet = Application.instance.config['global']['internet'] == 'yes'
|
|
41
|
-
data = InputLoader.load(inputdirs, internet)
|
|
42
|
-
[project_data, data]
|
|
43
|
-
end
|
|
44
|
-
|
|
45
|
-
private_class_method def self.init_project_data()
|
|
46
|
-
project_data = ProjectData.instance
|
|
47
|
-
outputdir = Application.instance.config['output']['folder']
|
|
48
|
-
project_data.set(:outputdir, outputdir)
|
|
49
|
-
|
|
50
|
-
formula_weights = Application.instance.config['ai']['formula_weights']
|
|
51
|
-
project_data.set(:weights, formula_weights)
|
|
52
|
-
end
|
|
53
|
-
|
|
54
|
-
private_class_method def self.init_logger(project_data)
|
|
55
|
-
Logger.create(project_data.get(:logpath))
|
|
56
|
-
Logger.instance.set_verbose(Application.instance.config['verbose'])
|
|
57
|
-
Logger.verboseln '[INFO] Project open'
|
|
58
|
-
Logger.verboseln ' ├── inputdirs = ' + Rainbow(project_data.get(:inputdirs)).bright
|
|
59
|
-
Logger.verboseln ' └── process_file = ' + Rainbow(project_data.get(:process_file)).bright
|
|
60
|
-
end
|
|
61
|
-
|
|
62
|
-
private_class_method def self.create_output(project, data)
|
|
63
|
-
OutputFileExporter.export(data, project)
|
|
64
|
-
StatsDisplayer.show(data)
|
|
65
|
-
Logger.close
|
|
19
|
+
Start.new.call(filepath)
|
|
66
20
|
end
|
|
67
21
|
end
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: asker-tool
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 2.
|
|
4
|
+
version: 2.7.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- David Vargas Ruiz
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2023-
|
|
11
|
+
date: 2023-06-20 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: haml
|
|
@@ -52,20 +52,6 @@ dependencies:
|
|
|
52
52
|
- - "~>"
|
|
53
53
|
- !ruby/object:Gem::Version
|
|
54
54
|
version: '3.0'
|
|
55
|
-
- !ruby/object:Gem::Dependency
|
|
56
|
-
name: colorize
|
|
57
|
-
requirement: !ruby/object:Gem::Requirement
|
|
58
|
-
requirements:
|
|
59
|
-
- - "~>"
|
|
60
|
-
- !ruby/object:Gem::Version
|
|
61
|
-
version: '0.8'
|
|
62
|
-
type: :runtime
|
|
63
|
-
prerelease: false
|
|
64
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
65
|
-
requirements:
|
|
66
|
-
- - "~>"
|
|
67
|
-
- !ruby/object:Gem::Version
|
|
68
|
-
version: '0.8'
|
|
69
55
|
- !ruby/object:Gem::Dependency
|
|
70
56
|
name: rexml
|
|
71
57
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -127,11 +113,11 @@ files:
|
|
|
127
113
|
- lib/asker/ai/code/base_code_ai.rb
|
|
128
114
|
- lib/asker/ai/code/code_ai_factory.rb
|
|
129
115
|
- lib/asker/ai/code/javascript_code_ai.rb
|
|
130
|
-
- lib/asker/ai/code/problem_code_ai.rb
|
|
131
116
|
- lib/asker/ai/code/python_code_ai.rb
|
|
132
117
|
- lib/asker/ai/code/ruby_code_ai.rb
|
|
133
118
|
- lib/asker/ai/code/sql_code_ai.rb
|
|
134
119
|
- lib/asker/ai/concept_ai.rb
|
|
120
|
+
- lib/asker/ai/problem/problem_ai.rb
|
|
135
121
|
- lib/asker/ai/question.rb
|
|
136
122
|
- lib/asker/ai/stages/base_stage.rb
|
|
137
123
|
- lib/asker/ai/stages/main.rb
|
|
@@ -150,25 +136,27 @@ files:
|
|
|
150
136
|
- lib/asker/data/column.rb
|
|
151
137
|
- lib/asker/data/concept.rb
|
|
152
138
|
- lib/asker/data/data_field.rb
|
|
139
|
+
- lib/asker/data/problem.rb
|
|
153
140
|
- lib/asker/data/project_data.rb
|
|
154
141
|
- lib/asker/data/row.rb
|
|
155
142
|
- lib/asker/data/table.rb
|
|
156
143
|
- lib/asker/data/template.rb
|
|
157
144
|
- lib/asker/data/world.rb
|
|
145
|
+
- lib/asker/deprecated/question_moodlexml_formatter.rb
|
|
158
146
|
- lib/asker/displayer/code_displayer.rb
|
|
159
147
|
- lib/asker/displayer/concept_ai_displayer.erb
|
|
160
148
|
- lib/asker/displayer/concept_ai_displayer.rb
|
|
161
149
|
- lib/asker/displayer/concept_displayer.rb
|
|
150
|
+
- lib/asker/displayer/problem_displayer.rb
|
|
162
151
|
- lib/asker/displayer/stats_displayer.rb
|
|
163
152
|
- lib/asker/exporter/code_gift_exporter.rb
|
|
164
|
-
- lib/asker/exporter/code_moodle_exporter.rb
|
|
165
153
|
- lib/asker/exporter/concept_ai_gift_exporter.rb
|
|
166
|
-
- lib/asker/exporter/concept_ai_moodle_exporter.rb
|
|
167
154
|
- lib/asker/exporter/concept_ai_yaml_exporter.rb
|
|
168
155
|
- lib/asker/exporter/concept_doc_exporter.rb
|
|
169
156
|
- lib/asker/exporter/data_gift_exporter.rb
|
|
170
157
|
- lib/asker/exporter/data_moodle_exporter.rb
|
|
171
158
|
- lib/asker/exporter/output_file_exporter.rb
|
|
159
|
+
- lib/asker/exporter/problem_gift_exporter.rb
|
|
172
160
|
- lib/asker/files/asker.ini
|
|
173
161
|
- lib/asker/files/example-code.haml
|
|
174
162
|
- lib/asker/files/example-concept.haml
|
|
@@ -205,14 +193,16 @@ files:
|
|
|
205
193
|
- lib/asker/formatter/code_string_formatter.rb
|
|
206
194
|
- lib/asker/formatter/concept_doc_formatter.rb
|
|
207
195
|
- lib/asker/formatter/concept_string_formatter.rb
|
|
196
|
+
- lib/asker/formatter/moodle/ddmatch.erb
|
|
197
|
+
- lib/asker/formatter/moodle/gapfill.erb
|
|
208
198
|
- lib/asker/formatter/moodle/matching.erb
|
|
209
199
|
- lib/asker/formatter/moodle/multichoice.erb
|
|
200
|
+
- lib/asker/formatter/moodle/ordering.erb
|
|
210
201
|
- lib/asker/formatter/moodle/shortanswer.erb
|
|
211
202
|
- lib/asker/formatter/moodle/truefalse.erb
|
|
212
203
|
- lib/asker/formatter/question_gift_formatter.rb
|
|
213
204
|
- lib/asker/formatter/question_hash_formatter.rb
|
|
214
205
|
- lib/asker/formatter/question_moodle_formatter.rb
|
|
215
|
-
- lib/asker/formatter/question_moodlexml_formatter.rb
|
|
216
206
|
- lib/asker/formatter/rb2haml_formatter.rb
|
|
217
207
|
- lib/asker/lang/lang.rb
|
|
218
208
|
- lib/asker/lang/lang_factory.rb
|
|
@@ -225,9 +215,11 @@ files:
|
|
|
225
215
|
- lib/asker/loader/haml_loader.rb
|
|
226
216
|
- lib/asker/loader/image_url_loader.rb
|
|
227
217
|
- lib/asker/loader/input_loader.rb
|
|
218
|
+
- lib/asker/loader/problem_loader.rb
|
|
228
219
|
- lib/asker/loader/project_loader.rb
|
|
229
220
|
- lib/asker/logger.rb
|
|
230
221
|
- lib/asker/skeleton.rb
|
|
222
|
+
- lib/asker/start.rb
|
|
231
223
|
- lib/asker/version.rb
|
|
232
224
|
homepage: https://github.com/teuton-software/asker
|
|
233
225
|
licenses:
|