asker-tool 2.6.0 → 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 (87) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +4 -4
  3. data/lib/asker/ai/ai.rb +6 -6
  4. data/lib/asker/ai/ai_calculate.rb +3 -3
  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/stage_b.rb +62 -28
  16. data/lib/asker/ai/stages/stage_d.rb +10 -10
  17. data/lib/asker/ai/stages/stage_f.rb +17 -17
  18. data/lib/asker/ai/stages/stage_i.rb +8 -18
  19. data/lib/asker/ai/stages/stage_s.rb +28 -26
  20. data/lib/asker/ai/stages/stage_t.rb +40 -51
  21. data/lib/asker/application.rb +15 -14
  22. data/lib/asker/check_input/check_haml_data.rb +52 -51
  23. data/lib/asker/check_input/check_table.rb +17 -20
  24. data/lib/asker/check_input.rb +10 -23
  25. data/lib/asker/cli.rb +43 -24
  26. data/lib/asker/data/code.rb +10 -9
  27. data/lib/asker/data/column.rb +21 -17
  28. data/lib/asker/data/concept.rb +24 -37
  29. data/lib/asker/data/data_field.rb +2 -2
  30. data/lib/asker/data/problem.rb +112 -0
  31. data/lib/asker/data/project_data.rb +11 -15
  32. data/lib/asker/data/row.rb +25 -23
  33. data/lib/asker/data/table.rb +25 -46
  34. data/lib/asker/data/template.rb +7 -7
  35. data/lib/asker/data/world.rb +3 -3
  36. data/lib/asker/{formatter → deprecated}/question_moodlexml_formatter.rb +19 -21
  37. data/lib/asker/displayer/code_displayer.rb +10 -10
  38. data/lib/asker/displayer/concept_ai_displayer.erb +1 -1
  39. data/lib/asker/displayer/concept_ai_displayer.rb +16 -16
  40. data/lib/asker/displayer/concept_displayer.rb +4 -2
  41. data/lib/asker/displayer/problem_displayer.rb +45 -0
  42. data/lib/asker/displayer/stats_displayer.rb +7 -12
  43. data/lib/asker/exporter/code_gift_exporter.rb +2 -2
  44. data/lib/asker/exporter/concept_ai_gift_exporter.rb +4 -4
  45. data/lib/asker/exporter/concept_ai_yaml_exporter.rb +7 -7
  46. data/lib/asker/exporter/concept_doc_exporter.rb +5 -5
  47. data/lib/asker/exporter/data_gift_exporter.rb +14 -15
  48. data/lib/asker/exporter/data_moodle_exporter.rb +51 -20
  49. data/lib/asker/exporter/output_file_exporter.rb +9 -8
  50. data/lib/asker/exporter/problem_gift_exporter.rb +30 -0
  51. data/lib/asker/files/language/ca/templates.yaml +6 -0
  52. data/lib/asker/files/language/du/templates.yaml +6 -0
  53. data/lib/asker/files/language/en/templates.yaml +7 -1
  54. data/lib/asker/files/language/es/templates.yaml +6 -0
  55. data/lib/asker/files/language/fr/templates.yaml +6 -0
  56. data/lib/asker/formatter/code_string_formatter.rb +5 -5
  57. data/lib/asker/formatter/concept_doc_formatter.rb +3 -3
  58. data/lib/asker/formatter/concept_string_formatter.rb +6 -6
  59. data/lib/asker/formatter/moodle/ddmatch.erb +40 -0
  60. data/lib/asker/formatter/moodle/gapfill.erb +57 -0
  61. data/lib/asker/formatter/moodle/ordering.erb +41 -0
  62. data/lib/asker/formatter/question_gift_formatter.rb +41 -14
  63. data/lib/asker/formatter/question_hash_formatter.rb +5 -6
  64. data/lib/asker/formatter/question_moodle_formatter.rb +14 -7
  65. data/lib/asker/formatter/rb2haml_formatter.rb +8 -7
  66. data/lib/asker/lang/lang.rb +16 -16
  67. data/lib/asker/lang/lang_factory.rb +13 -16
  68. data/lib/asker/lang/text_actions.rb +20 -18
  69. data/lib/asker/loader/code_loader.rb +10 -22
  70. data/lib/asker/loader/content_loader.rb +42 -49
  71. data/lib/asker/loader/directory_loader.rb +13 -16
  72. data/lib/asker/loader/embedded_file.rb +14 -14
  73. data/lib/asker/loader/file_loader.rb +5 -4
  74. data/lib/asker/loader/haml_loader.rb +4 -3
  75. data/lib/asker/loader/image_url_loader.rb +6 -5
  76. data/lib/asker/loader/input_loader.rb +24 -10
  77. data/lib/asker/loader/problem_loader.rb +88 -0
  78. data/lib/asker/loader/project_loader.rb +5 -12
  79. data/lib/asker/logger.rb +19 -10
  80. data/lib/asker/skeleton.rb +19 -35
  81. data/lib/asker/start.rb +44 -0
  82. data/lib/asker/version.rb +1 -1
  83. data/lib/asker.rb +7 -52
  84. metadata +12 -6
  85. data/lib/asker/ai/code/problem_code_ai.rb +0 -176
  86. data/lib/asker/exporter/code_moodle_exporter.rb +0 -15
  87. data/lib/asker/exporter/concept_ai_moodle_exporter.rb +0 -15
@@ -1,34 +1,48 @@
1
1
  require_relative "directory_loader"
2
2
  require_relative "../ai/concept_ai"
3
+ require_relative "../ai/code/code_ai_factory"
4
+ require_relative "../ai/problem/problem_ai"
3
5
  require_relative "../data/world"
4
6
 
5
- module InputLoader
7
+ class InputLoader
6
8
  ##
7
9
  # Load input data from every input directory
8
10
  # @param inputdirs (Array)
9
- def self.load(inputdirs, internet = true)
10
- data = {concepts: [], codes: [], world: nil, concepts_ai: [], codes_ai: []}
11
+ def call(inputdirs, internet = true)
12
+ data = {
13
+ world: nil,
14
+ concepts: [], codes: [], problems: [],
15
+ concepts_ai: [], codes_ai: []
16
+ }
11
17
  inputdirs.each do |dirname|
12
- temp = DirectoryLoader.load(dirname)
13
- data[:concepts] += temp[:concepts]
14
- data[:codes] += temp[:codes]
18
+ loaded = DirectoryLoader.call(dirname)
19
+ data[:concepts] += loaded[:concepts]
20
+ data[:codes] += loaded[:codes]
21
+ data[:problems] += loaded[:problems]
15
22
  end
16
23
  create_questions(data, internet)
17
24
  end
18
25
 
19
- private_class_method def self.create_questions(data, internet)
20
- # Create World data
21
- # * Calculate concept neighbours
22
- # * TO-DO: Calculate code neighbours
26
+ private
27
+
28
+ def create_questions(data, internet)
29
+ # Create World data. Calculate concept neighbours
30
+ # TODO: Calculate code and problem neighbours
23
31
  data[:world] = World.new(data[:concepts], internet)
32
+
24
33
  # Create ConceptAI data (ConceptAI = concept + questions)
25
34
  data[:concepts].each do |concept|
26
35
  data[:concepts_ai] << ConceptAI.new(concept, data[:world])
27
36
  end
37
+
28
38
  # Create CodeAI data (CodeAI = code + questions)
29
39
  data[:codes].each do |code|
30
40
  data[:codes_ai] << CodeAIFactory.get(code)
31
41
  end
42
+
43
+ # Fill problem with questions
44
+ data[:problems].each { |problem| ProblemAI.new.call(problem) }
45
+
32
46
  data
33
47
  end
34
48
  end
@@ -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
@@ -2,13 +2,12 @@
2
2
 
3
3
  require "yaml"
4
4
  require_relative "../data/project_data"
5
+ require_relative "../logger"
5
6
 
6
- # Load params into Project class using arg input
7
7
  module ProjectLoader
8
8
  ##
9
9
  # Load project from args
10
10
  # @param args (String or Hash)
11
- # rubocop:disable Metrics/MethodLength
12
11
  def self.load(args)
13
12
  project = ProjectData.instance
14
13
 
@@ -22,10 +21,8 @@ module ProjectLoader
22
21
  return project
23
22
  end
24
23
 
25
- msg = "[ERROR] ProjectLoader:"
26
- msg += "Configuration params format is <#{pArgs.class}>!"
27
- puts Rainbow(msg).red
28
- raise msg
24
+ Logger.error "ProjectLoader: loading args with incorrect type (#{args.class})"
25
+ exit 1
29
26
  end
30
27
 
31
28
  ##
@@ -34,13 +31,10 @@ module ProjectLoader
34
31
  # * XML filepath
35
32
  # * YAML filepath
36
33
  # @param filepath (String)
37
- # rubocop:disable Metrics/MethodLength
38
- # rubocop:disable Metrics/AbcSize
39
34
  def self.load_from_string(filepath)
40
35
  project = ProjectData.instance
41
36
  unless File.exist?(filepath)
42
- msg = Rainbow("[ERROR] #{filepath} not found!").red.bright
43
- puts msg
37
+ Logger.error "ProjectLoader: #{filepath} not found!"
44
38
  exit 1
45
39
  end
46
40
 
@@ -65,8 +59,7 @@ module ProjectLoader
65
59
  ##
66
60
  # Error found and exit application.
67
61
  def self.error_loading(arg)
68
- msg = Rainbow("[ERROR] Loading... #{arg}").red.bright
69
- puts msg
62
+ Logger.error "ProjectLoader: Loading... #{arg}"
70
63
  exit 1
71
64
  end
72
65
  end
data/lib/asker/logger.rb CHANGED
@@ -3,27 +3,36 @@ 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)
@@ -4,19 +4,16 @@ require "fileutils"
4
4
  require "rainbow"
5
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}"
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}"
20
17
  if File.extname(inputpath) == ".haml"
21
18
  dirpath = File.dirname(inputpath)
22
19
  filename = File.basename(inputpath)
@@ -28,47 +25,34 @@ module Skeleton
28
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
38
  rescue
53
- puts "* Create dir ERROR => #{Rainbow(dirpath).red}"
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
53
  rescue
71
- puts "* Create file ERROR => #{Rainbow(dest).red}"
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.6.0"
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,66 +1,21 @@
1
- require 'rainbow'
2
-
3
- require_relative 'asker/skeleton'
4
- require_relative 'asker/check_input'
5
-
6
- require_relative 'asker/displayer/concept_displayer'
7
- require_relative 'asker/displayer/stats_displayer'
8
- require_relative 'asker/exporter/output_file_exporter'
9
- require_relative 'asker/logger'
10
-
11
- require_relative 'asker/loader/project_loader'
12
- require_relative 'asker/loader/input_loader'
1
+ require_relative "asker/check_input"
2
+ require_relative "asker/skeleton"
3
+ require_relative "asker/start"
13
4
 
14
5
  class Asker
15
6
  def self.init
16
- Skeleton.create_configuration
7
+ Skeleton.new.create_configuration
17
8
  end
18
9
 
19
10
  def self.create_input(dirpath)
20
- Skeleton.create_input(dirpath)
11
+ Skeleton.new.create_input(dirpath)
21
12
  end
22
13
 
23
14
  def self.check(filepath)
24
- CheckInput.new.file(filepath).check
15
+ CheckInput.new.check(filepath)
25
16
  end
26
17
 
27
18
  def self.start(filepath)
28
- project_data, data = load_input(filepath)
29
- ConceptDisplayer.show(data[:concepts])
30
- create_output(project_data, data)
31
- end
32
-
33
- private_class_method def self.load_input(args)
34
- init_project_data
35
- project_data = ProjectLoader.load(args)
36
- init_logger(project_data)
37
-
38
- inputdirs = project_data.get(:inputdirs).split(',')
39
- internet = Application.instance.config['global']['internet'] == 'yes'
40
- data = InputLoader.load(inputdirs, internet)
41
- [project_data, data]
42
- end
43
-
44
- private_class_method def self.init_project_data()
45
- project_data = ProjectData.instance
46
- outputdir = Application.instance.config['output']['folder']
47
- project_data.set(:outputdir, outputdir)
48
-
49
- formula_weights = Application.instance.config['ai']['formula_weights']
50
- project_data.set(:weights, formula_weights)
51
- end
52
-
53
- private_class_method def self.init_logger(project)
54
- Logger.create(project.get(:logpath))
55
- Logger.instance.set_verbose(Application.instance.config['verbose'])
56
- Logger.verboseln '[INFO] Project open'
57
- Logger.verboseln ' ├── inputdirs = ' + Rainbow(project.get(:inputdirs)).bright
58
- Logger.verboseln ' └── process_file = ' + Rainbow(project.get(:process_file)).bright
59
- end
60
-
61
- private_class_method def self.create_output(project, data)
62
- OutputFileExporter.export(data, project)
63
- StatsDisplayer.show(data)
64
- Logger.close
19
+ Start.new.call(filepath)
65
20
  end
66
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.6.0
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-05-31 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
@@ -113,11 +113,11 @@ files:
113
113
  - lib/asker/ai/code/base_code_ai.rb
114
114
  - lib/asker/ai/code/code_ai_factory.rb
115
115
  - lib/asker/ai/code/javascript_code_ai.rb
116
- - lib/asker/ai/code/problem_code_ai.rb
117
116
  - lib/asker/ai/code/python_code_ai.rb
118
117
  - lib/asker/ai/code/ruby_code_ai.rb
119
118
  - lib/asker/ai/code/sql_code_ai.rb
120
119
  - lib/asker/ai/concept_ai.rb
120
+ - lib/asker/ai/problem/problem_ai.rb
121
121
  - lib/asker/ai/question.rb
122
122
  - lib/asker/ai/stages/base_stage.rb
123
123
  - lib/asker/ai/stages/main.rb
@@ -136,25 +136,27 @@ files:
136
136
  - lib/asker/data/column.rb
137
137
  - lib/asker/data/concept.rb
138
138
  - lib/asker/data/data_field.rb
139
+ - lib/asker/data/problem.rb
139
140
  - lib/asker/data/project_data.rb
140
141
  - lib/asker/data/row.rb
141
142
  - lib/asker/data/table.rb
142
143
  - lib/asker/data/template.rb
143
144
  - lib/asker/data/world.rb
145
+ - lib/asker/deprecated/question_moodlexml_formatter.rb
144
146
  - lib/asker/displayer/code_displayer.rb
145
147
  - lib/asker/displayer/concept_ai_displayer.erb
146
148
  - lib/asker/displayer/concept_ai_displayer.rb
147
149
  - lib/asker/displayer/concept_displayer.rb
150
+ - lib/asker/displayer/problem_displayer.rb
148
151
  - lib/asker/displayer/stats_displayer.rb
149
152
  - lib/asker/exporter/code_gift_exporter.rb
150
- - lib/asker/exporter/code_moodle_exporter.rb
151
153
  - lib/asker/exporter/concept_ai_gift_exporter.rb
152
- - lib/asker/exporter/concept_ai_moodle_exporter.rb
153
154
  - lib/asker/exporter/concept_ai_yaml_exporter.rb
154
155
  - lib/asker/exporter/concept_doc_exporter.rb
155
156
  - lib/asker/exporter/data_gift_exporter.rb
156
157
  - lib/asker/exporter/data_moodle_exporter.rb
157
158
  - lib/asker/exporter/output_file_exporter.rb
159
+ - lib/asker/exporter/problem_gift_exporter.rb
158
160
  - lib/asker/files/asker.ini
159
161
  - lib/asker/files/example-code.haml
160
162
  - lib/asker/files/example-concept.haml
@@ -191,14 +193,16 @@ files:
191
193
  - lib/asker/formatter/code_string_formatter.rb
192
194
  - lib/asker/formatter/concept_doc_formatter.rb
193
195
  - lib/asker/formatter/concept_string_formatter.rb
196
+ - lib/asker/formatter/moodle/ddmatch.erb
197
+ - lib/asker/formatter/moodle/gapfill.erb
194
198
  - lib/asker/formatter/moodle/matching.erb
195
199
  - lib/asker/formatter/moodle/multichoice.erb
200
+ - lib/asker/formatter/moodle/ordering.erb
196
201
  - lib/asker/formatter/moodle/shortanswer.erb
197
202
  - lib/asker/formatter/moodle/truefalse.erb
198
203
  - lib/asker/formatter/question_gift_formatter.rb
199
204
  - lib/asker/formatter/question_hash_formatter.rb
200
205
  - lib/asker/formatter/question_moodle_formatter.rb
201
- - lib/asker/formatter/question_moodlexml_formatter.rb
202
206
  - lib/asker/formatter/rb2haml_formatter.rb
203
207
  - lib/asker/lang/lang.rb
204
208
  - lib/asker/lang/lang_factory.rb
@@ -211,9 +215,11 @@ files:
211
215
  - lib/asker/loader/haml_loader.rb
212
216
  - lib/asker/loader/image_url_loader.rb
213
217
  - lib/asker/loader/input_loader.rb
218
+ - lib/asker/loader/problem_loader.rb
214
219
  - lib/asker/loader/project_loader.rb
215
220
  - lib/asker/logger.rb
216
221
  - lib/asker/skeleton.rb
222
+ - lib/asker/start.rb
217
223
  - lib/asker/version.rb
218
224
  homepage: https://github.com/teuton-software/asker
219
225
  licenses: