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.
Files changed (88) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +10 -7
  3. data/lib/asker/ai/ai.rb +17 -22
  4. data/lib/asker/ai/ai_calculate.rb +10 -17
  5. data/lib/asker/ai/code/base_code_ai.rb +5 -30
  6. data/lib/asker/ai/code/code_ai_factory.rb +6 -12
  7. data/lib/asker/ai/code/javascript_code_ai.rb +33 -34
  8. data/lib/asker/ai/code/python_code_ai.rb +35 -36
  9. data/lib/asker/ai/code/ruby_code_ai.rb +33 -33
  10. data/lib/asker/ai/code/sql_code_ai.rb +20 -21
  11. data/lib/asker/ai/concept_ai.rb +12 -22
  12. data/lib/asker/ai/problem/problem_ai.rb +226 -0
  13. data/lib/asker/ai/question.rb +34 -45
  14. data/lib/asker/ai/stages/base_stage.rb +7 -7
  15. data/lib/asker/ai/stages/main.rb +6 -7
  16. data/lib/asker/ai/stages/stage_b.rb +62 -28
  17. data/lib/asker/ai/stages/stage_d.rb +10 -10
  18. data/lib/asker/ai/stages/stage_f.rb +17 -17
  19. data/lib/asker/ai/stages/stage_i.rb +8 -18
  20. data/lib/asker/ai/stages/stage_s.rb +28 -26
  21. data/lib/asker/ai/stages/stage_t.rb +54 -76
  22. data/lib/asker/application.rb +15 -14
  23. data/lib/asker/check_input/check_haml_data.rb +57 -51
  24. data/lib/asker/check_input/check_table.rb +26 -19
  25. data/lib/asker/check_input.rb +10 -22
  26. data/lib/asker/cli.rb +43 -24
  27. data/lib/asker/data/code.rb +10 -9
  28. data/lib/asker/data/column.rb +21 -17
  29. data/lib/asker/data/concept.rb +24 -37
  30. data/lib/asker/data/data_field.rb +2 -2
  31. data/lib/asker/data/problem.rb +112 -0
  32. data/lib/asker/data/project_data.rb +11 -15
  33. data/lib/asker/data/row.rb +25 -23
  34. data/lib/asker/data/table.rb +25 -46
  35. data/lib/asker/data/template.rb +7 -7
  36. data/lib/asker/data/world.rb +3 -3
  37. data/lib/asker/{formatter → deprecated}/question_moodlexml_formatter.rb +19 -21
  38. data/lib/asker/displayer/code_displayer.rb +10 -10
  39. data/lib/asker/displayer/concept_ai_displayer.erb +1 -1
  40. data/lib/asker/displayer/concept_ai_displayer.rb +22 -34
  41. data/lib/asker/displayer/concept_displayer.rb +9 -11
  42. data/lib/asker/displayer/problem_displayer.rb +45 -0
  43. data/lib/asker/displayer/stats_displayer.rb +7 -12
  44. data/lib/asker/exporter/code_gift_exporter.rb +2 -2
  45. data/lib/asker/exporter/concept_ai_gift_exporter.rb +4 -4
  46. data/lib/asker/exporter/concept_ai_yaml_exporter.rb +7 -7
  47. data/lib/asker/exporter/concept_doc_exporter.rb +5 -5
  48. data/lib/asker/exporter/data_gift_exporter.rb +14 -15
  49. data/lib/asker/exporter/data_moodle_exporter.rb +51 -20
  50. data/lib/asker/exporter/output_file_exporter.rb +9 -8
  51. data/lib/asker/exporter/problem_gift_exporter.rb +30 -0
  52. data/lib/asker/files/language/ca/templates.yaml +6 -0
  53. data/lib/asker/files/language/du/templates.yaml +6 -0
  54. data/lib/asker/files/language/en/templates.yaml +7 -1
  55. data/lib/asker/files/language/es/templates.yaml +6 -0
  56. data/lib/asker/files/language/fr/templates.yaml +6 -0
  57. data/lib/asker/formatter/code_string_formatter.rb +5 -5
  58. data/lib/asker/formatter/concept_doc_formatter.rb +3 -3
  59. data/lib/asker/formatter/concept_string_formatter.rb +27 -24
  60. data/lib/asker/formatter/moodle/ddmatch.erb +40 -0
  61. data/lib/asker/formatter/moodle/gapfill.erb +57 -0
  62. data/lib/asker/formatter/moodle/ordering.erb +41 -0
  63. data/lib/asker/formatter/question_gift_formatter.rb +41 -14
  64. data/lib/asker/formatter/question_hash_formatter.rb +5 -6
  65. data/lib/asker/formatter/question_moodle_formatter.rb +14 -7
  66. data/lib/asker/formatter/rb2haml_formatter.rb +8 -7
  67. data/lib/asker/lang/lang.rb +16 -16
  68. data/lib/asker/lang/lang_factory.rb +13 -16
  69. data/lib/asker/lang/text_actions.rb +20 -18
  70. data/lib/asker/loader/code_loader.rb +10 -22
  71. data/lib/asker/loader/content_loader.rb +42 -49
  72. data/lib/asker/loader/directory_loader.rb +13 -16
  73. data/lib/asker/loader/embedded_file.rb +29 -24
  74. data/lib/asker/loader/file_loader.rb +7 -6
  75. data/lib/asker/loader/haml_loader.rb +6 -5
  76. data/lib/asker/loader/image_url_loader.rb +21 -18
  77. data/lib/asker/loader/input_loader.rb +27 -14
  78. data/lib/asker/loader/problem_loader.rb +88 -0
  79. data/lib/asker/loader/project_loader.rb +11 -28
  80. data/lib/asker/logger.rb +22 -13
  81. data/lib/asker/skeleton.rb +27 -43
  82. data/lib/asker/start.rb +44 -0
  83. data/lib/asker/version.rb +1 -1
  84. data/lib/asker.rb +7 -53
  85. metadata +12 -20
  86. data/lib/asker/ai/code/problem_code_ai.rb +0 -176
  87. data/lib/asker/exporter/code_moodle_exporter.rb +0 -15
  88. 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 'yaml'
4
- require_relative '../data/project_data'
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.class == Hash
14
+ if args.instance_of? Hash
21
15
  project.param.merge!(args)
22
16
  project.open
23
17
  return project
24
- elsif args.class == String
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
- msg = '[ERROR] ProjectLoader:'
31
- msg += "Configuration params format is <#{pArgs.class}>!"
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
- msg = Rainbow("[ERROR] #{filepath} not found!").red.bright
49
- puts msg
37
+ Logger.error "ProjectLoader: #{filepath} not found!"
50
38
  exit 1
51
39
  end
52
40
 
53
- if File.extname(filepath) == '.haml' || File.extname(filepath) == '.xml'
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) == '.yaml'
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
- msg = Rainbow("[ERROR] Loading... #{arg}").red.bright
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
- @attr_verbose = "yes"
6
+ @verbose = true
7
7
 
8
8
  def set_verbose(value)
9
- @attr_verbose = value
9
+ @verbose = (value == "yes")
10
10
  end
11
11
 
12
- def self.verbose(msg)
13
- print msg if @attr_verbose == "yes"
12
+ def self.info(msg)
13
+ puts msg if @verbose
14
14
  @logfile&.write(msg)
15
15
  end
16
16
 
17
- def self.verboseln(msg)
18
- verbose(msg + "\n")
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 log(msg)
22
- verbose(msg)
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 logln(msg)
26
- verboseln(msg)
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, 'w')
31
- @logfile.write('=' * 50 + "\n")
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('=' * 50 + "\n\n")
45
+ @logfile.write("=" * 50 + "\n\n")
37
46
  end
38
47
 
39
48
  def self.close
@@ -1,74 +1,58 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'fileutils'
4
- require 'rainbow'
5
- require_relative 'version'
3
+ require "fileutils"
4
+ require "rainbow"
5
+ require_relative "version"
6
6
 
7
- # Skeleton: create skeleton for asker input files
8
- # * create
9
- # * create_main_dir_and_files
10
- # * create_dir
11
- # * create_dirs
12
- # * copyfile
13
- module Skeleton
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'
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 = 'example-concept.haml'
22
+ filename = "example-concept.haml"
26
23
  end
27
24
  create_dir dirpath
28
- source = File.join(File.dirname(__FILE__), 'files/example-concept.haml')
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 StandardError
53
- puts "* Create dir ERROR => #{Rainbow(dirpath).red}"
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 StandardError
71
- puts "* Create file ERROR => #{Rainbow(dest).red}"
53
+ rescue
54
+ warn "* Create file ERROR => #{Rainbow(dest).red}"
55
+ exit 1
72
56
  end
73
57
  end
74
58
  end
@@ -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
@@ -1,5 +1,5 @@
1
1
  class Asker
2
- VERSION = "2.5.9"
2
+ VERSION = "2.7.0"
3
3
  NAME = "asker"
4
4
  GEM = "asker-tool"
5
5
  CONFIGFILE = "asker.ini"
data/lib/asker.rb CHANGED
@@ -1,67 +1,21 @@
1
- require 'rainbow'
2
- require 'colorize'
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.file(filepath).check
15
+ CheckInput.new.check(filepath)
26
16
  end
27
17
 
28
18
  def self.start(filepath)
29
- project_data, data = load_input(filepath)
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.5.9
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-02-27 00:00:00.000000000 Z
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: