asker-tool 2.1.6 → 2.2.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (68) hide show
  1. checksums.yaml +4 -4
  2. data/{LICENSE.txt → LICENSE} +0 -0
  3. data/README.md +14 -15
  4. data/bin/asker +1 -1
  5. data/lib/asker/ai/ai.rb +6 -3
  6. data/lib/asker/ai/ai_calculate.rb +20 -6
  7. data/lib/asker/ai/concept_ai.rb +12 -3
  8. data/lib/asker/ai/question.rb +28 -6
  9. data/lib/asker/ai/stages/base_stage.rb +45 -6
  10. data/lib/asker/ai/stages/stage_b.rb +90 -49
  11. data/lib/asker/ai/stages/stage_d.rb +69 -90
  12. data/lib/asker/ai/stages/stage_f.rb +47 -38
  13. data/lib/asker/ai/stages/stage_i.rb +79 -92
  14. data/lib/asker/ai/stages/stage_s.rb +41 -36
  15. data/lib/asker/ai/stages/stage_t.rb +114 -73
  16. data/lib/asker/application.rb +7 -15
  17. data/lib/asker/check_input/input_data.rb +358 -0
  18. data/lib/asker/check_input.rb +51 -0
  19. data/lib/asker/cli.rb +28 -28
  20. data/lib/asker/data/code.rb +5 -16
  21. data/lib/asker/data/concept.rb +71 -24
  22. data/lib/asker/data/project_data.rb +63 -0
  23. data/lib/asker/data/table.rb +2 -0
  24. data/lib/asker/data/template.rb +3 -1
  25. data/lib/asker/data/world.rb +8 -16
  26. data/lib/asker/displayer/code_displayer.rb +7 -0
  27. data/lib/asker/displayer/concept_ai_displayer.erb +10 -0
  28. data/lib/asker/displayer/concept_ai_displayer.rb +24 -22
  29. data/lib/asker/displayer/concept_displayer.rb +9 -4
  30. data/lib/asker/displayer/stats_displayer.rb +8 -0
  31. data/lib/asker/exporter/concept_ai_gift_exporter.rb +16 -10
  32. data/lib/asker/exporter/concept_ai_moodle_exporter.rb +44 -0
  33. data/lib/asker/exporter/concept_ai_yaml_exporter.rb +6 -3
  34. data/lib/asker/exporter/concept_doc_exporter.rb +14 -1
  35. data/lib/asker/exporter/data_gift_exporter.rb +29 -0
  36. data/lib/asker/exporter/output_file_exporter.rb +9 -6
  37. data/lib/asker/files/{config.ini → asker.ini} +14 -4
  38. data/lib/asker/files/language/du/connectors.yaml +81 -0
  39. data/lib/asker/files/language/du/mistakes.yaml +82 -0
  40. data/lib/asker/files/language/du/templates.yaml +28 -49
  41. data/lib/asker/files/language/en/templates.yaml +19 -19
  42. data/lib/asker/files/language/es/mistakes.yaml +9 -7
  43. data/lib/asker/files/language/es/templates.yaml +19 -19
  44. data/lib/asker/files/language/fr/connectors.yaml +68 -84
  45. data/lib/asker/files/language/fr/templates.yaml +22 -22
  46. data/lib/asker/formatter/concept_doc_formatter.rb +0 -4
  47. data/lib/asker/formatter/concept_string_formatter.rb +7 -4
  48. data/lib/asker/formatter/moodle/matching.erb +38 -0
  49. data/lib/asker/formatter/moodle/multichoice.erb +49 -0
  50. data/lib/asker/formatter/moodle/shortanswer.erb +30 -0
  51. data/lib/asker/formatter/moodle/truefalse.erb +47 -0
  52. data/lib/asker/formatter/question_gift_formatter.rb +30 -20
  53. data/lib/asker/formatter/question_moodle_formatter.rb +27 -0
  54. data/lib/asker/lang/lang_factory.rb +7 -1
  55. data/lib/asker/loader/code_loader.rb +1 -1
  56. data/lib/asker/loader/content_loader.rb +12 -14
  57. data/lib/asker/loader/directory_loader.rb +1 -8
  58. data/lib/asker/loader/embedded_file.rb +42 -0
  59. data/lib/asker/loader/file_loader.rb +1 -3
  60. data/lib/asker/loader/image_url_loader.rb +8 -9
  61. data/lib/asker/loader/input_loader.rb +5 -6
  62. data/lib/asker/loader/project_loader.rb +18 -10
  63. data/lib/asker/logger.rb +35 -8
  64. data/lib/asker/skeleton.rb +3 -2
  65. data/lib/asker.rb +72 -43
  66. metadata +43 -17
  67. data/lib/asker/checker.rb +0 -455
  68. data/lib/asker/project.rb +0 -146
@@ -1,7 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require_relative 'file_loader'
4
- require_relative '../logger'
5
4
 
6
5
  # Load input data from one directory
7
6
  module DirectoryLoader
@@ -13,7 +12,6 @@ module DirectoryLoader
13
12
  files = (Dir.new(dirname).entries - ['.', '..']).sort
14
13
  # Accept only HAML or XML files
15
14
  accepted = files.select { |f| %w[.xml .haml].include? File.extname(f) }
16
- Logger.verbose " * Input directory = #{Rainbow(dirname).bright}"
17
15
  DirectoryLoader.load_files(accepted, dirname)
18
16
  end
19
17
 
@@ -24,7 +22,7 @@ module DirectoryLoader
24
22
  return if Dir.exist? dirname
25
23
 
26
24
  msg = Rainbow("[ERROR] #{dirname} directory dosn't exist!").color(:red)
27
- Logger.verboseln msg
25
+ puts msg
28
26
  raise msg
29
27
  end
30
28
 
@@ -48,11 +46,6 @@ module DirectoryLoader
48
46
  # @param filepath (String) Path to input file
49
47
  # @param last (Boolean) True if it is the last filename
50
48
  def self.load_file(filepath, last = false)
51
- if last
52
- Logger.verbose " └── Input file = #{Rainbow(filepath).bright}"
53
- else
54
- Logger.verbose " ├── Input file = #{Rainbow(filepath).bright}"
55
- end
56
49
  FileLoader.load(filepath)
57
50
  end
58
51
  end
@@ -0,0 +1,42 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'base64'
4
+
5
+ # Methods to load embedded files defined into asker input data file
6
+ # Example:
7
+ # * def line with :type = :image_url used to link external file as https://..."
8
+ # * def line with :type = :file used to load local file as image.png or file.txt"
9
+ module EmbeddedFile
10
+ ##
11
+ # @param value (String)
12
+ # @param localdir (String) Input file base folder
13
+ # @return Hash
14
+ # rubocop:disable Metrics/MethodLength
15
+ # rubocop:disable Metrics/AbcSize
16
+ def self.load(value, localdir)
17
+ # When filename is an URL
18
+ if value.start_with?('https://') || value.start_with?('http://')
19
+ return { text: "<img src=\"#{value}\" alt=\"image\" width=\"400\" height=\"300\">", file: :none }
20
+ end
21
+
22
+ filepath = File.join(localdir, value)
23
+ unless File.exist?(filepath)
24
+ # When filename is unkown!
25
+ Logger.verbose Rainbow("[ERROR] Unknown file! #{filepath}").red.bright
26
+ exit 1
27
+ end
28
+ # When filename is PNG, JPG o JPEG
29
+ if ['.png', '.jpg', '.jpeg'].include? File.extname(filepath)
30
+ # converts image into base64 strings
31
+ text = '<img src="@@PLUGINFILE@@/' + File.basename(filepath) \
32
+ + '" alt="imagen" class="img-responsive atto_image_button_text-bottom">'
33
+ data = '<file name="' + File.basename(filepath) + '" path="/" encoding="base64">' \
34
+ + Base64.strict_encode64(File.open(filepath, 'rb').read) + '</file>'
35
+ return { text: text, file: data }
36
+ end
37
+ # Suposse that filename is TXT file
38
+ return { text: "<pre>#{File.read(filepath)}</pre>", file: :none } if File.exist?(filepath)
39
+ end
40
+ # rubocop:enable Metrics/MethodLength
41
+ # rubocop:enable Metrics/AbcSize
42
+ end
@@ -2,7 +2,6 @@
2
2
 
3
3
  require_relative 'content_loader'
4
4
  require_relative 'haml_loader'
5
- require_relative '../logger'
6
5
 
7
6
  # Methods that load a filename and return list of concepts
8
7
  module FileLoader
@@ -15,8 +14,7 @@ module FileLoader
15
14
  elsif File.extname(filename).casecmp('.xml').zero?
16
15
  file_content = File.read(filename)
17
16
  else
18
- msg = "[ERROR] FileLoader: Format error #{filename}"
19
- Logger.verbose msg
17
+ puts "[ERROR] FileLoader: Format error #{filename}"
20
18
  raise msg
21
19
  end
22
20
  ContentLoader.load(filename, file_content)
@@ -1,8 +1,6 @@
1
1
 
2
2
  require 'net/http'
3
3
  require 'uri'
4
- require_relative '../application'
5
- require_relative '../logger'
6
4
 
7
5
  # Search URL images on Internet
8
6
  # Methods:
@@ -36,20 +34,21 @@ module ImageUrlLoader
36
34
  end
37
35
  end
38
36
  rescue
39
- Logger.verboseln '[ERROR] ImageUrlLoader'
40
- Logger.verboseln " => #{search_url}"
41
- Logger.verboseln ' => Check Internet connections'
42
- Logger.verboseln ' => Ensure URL is well formed'
37
+ puts '[ERROR] ImageUrlLoader'
38
+ puts " => #{search_url}"
39
+ puts ' => Check Internet connections'
40
+ puts ' => Ensure URL is well formed'
43
41
  end
44
42
  image_urls
45
43
  end
46
44
 
47
45
  def self.sanitize_string(input)
46
+ text = input.dup
48
47
  r = [ ['á', 'a'], ['é', 'e'], ['í', 'i'], ['ó', 'o'], ['ú', 'u'], ['ñ', 'n'], ['Á', 'A'], ['É', 'E'], ['Í', 'I'], ['Ó', 'O'], ['Ú', 'U'], ['Ñ', 'N']]
49
- r.each { |item| input.gsub!(item[0], item[1]) }
48
+ r.each { |item| text.gsub!(item[0], item[1]) }
50
49
  r = ['-', '_', ',', '"']
51
- r.each { |item| input.gsub!(item, ' ') }
52
- input.split(' ')
50
+ r.each { |item| text.gsub!(item, ' ') }
51
+ text.split(' ')
53
52
  end
54
53
 
55
54
  def self.sanitize_array(input)
@@ -3,30 +3,29 @@
3
3
  require_relative 'directory_loader'
4
4
  require_relative '../ai/concept_ai'
5
5
  require_relative '../data/world'
6
- require_relative '../logger'
7
6
 
8
7
  # Load DATA defined into our Project
9
8
  module InputLoader
10
9
  ##
11
10
  # Load input data from every input directory
12
11
  # @param inputdirs (Array)
13
- def self.load(inputdirs)
12
+ def self.load(inputdirs, internet = true)
14
13
  data = { concepts: [], codes: [], world: nil,
15
14
  concepts_ai: [], codes_ai: [] }
16
- Logger.verbose "\n[INFO] Loading input data"
15
+ #Logger.verboseln "\n[INFO] Loading input data"
17
16
  inputdirs.each do |dirname|
18
17
  temp = DirectoryLoader.load(dirname)
19
18
  data[:concepts] += temp[:concepts]
20
19
  data[:codes] += temp[:codes]
21
20
  end
22
- create_questions(data)
21
+ create_questions(data, internet)
23
22
  end
24
23
 
25
- private_class_method def self.create_questions(data)
24
+ private_class_method def self.create_questions(data, internet)
26
25
  # Create World data
27
26
  # * Calculate concept neighbours
28
27
  # * TO-DO: Calculate code neighbours
29
- data[:world] = World.new(data[:concepts])
28
+ data[:world] = World.new(data[:concepts], internet)
30
29
  # Create ConceptAI data (ConceptAI = concept + questions)
31
30
  data[:concepts].each do |concept|
32
31
  data[:concepts_ai] << ConceptAI.new(concept, data[:world])
@@ -1,8 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'yaml'
4
- require_relative '../project'
5
- require_relative '../logger'
4
+ require_relative '../data/project_data'
6
5
 
7
6
  # Load params into Project class using arg input
8
7
  # * load
@@ -14,22 +13,26 @@ module ProjectLoader
14
13
  ##
15
14
  # Load project from args
16
15
  # @param args (String or Hash)
16
+ # rubocop:disable Metrics/MethodLength
17
17
  def self.load(args)
18
- project = Project.instance
18
+ project = ProjectData.instance
19
19
 
20
20
  if args.class == Hash
21
21
  project.param.merge!(args)
22
+ project.open
22
23
  return project
23
24
  elsif args.class == String
24
25
  ProjectLoader.load_from_string(args)
26
+ project.open
25
27
  return project
26
28
  end
27
29
 
28
30
  msg = '[ERROR] ProjectLoader:'
29
31
  msg += "Configuration params format is <#{pArgs.class}>!"
30
- Logger.verbose Rainbow(msg).red
32
+ puts Rainbow(msg).red
31
33
  raise msg
32
34
  end
35
+ # rubocop:enable Metrics/MethodLength
33
36
 
34
37
  ##
35
38
  # Load project from filepath. Options:
@@ -37,11 +40,13 @@ module ProjectLoader
37
40
  # * XML filepath
38
41
  # * YAML filepath
39
42
  # @param filepath (String)
43
+ # rubocop:disable Metrics/MethodLength
44
+ # rubocop:disable Metrics/AbcSize
40
45
  def self.load_from_string(filepath)
41
- project = Project.instance
46
+ project = ProjectData.instance
42
47
  unless File.exist?(filepath)
43
48
  msg = Rainbow("[ERROR] #{filepath} not found!").red.bright
44
- Logger.verbose msg
49
+ puts msg
45
50
  exit 1
46
51
  end
47
52
 
@@ -51,24 +56,27 @@ module ProjectLoader
51
56
  return project
52
57
  elsif File.extname(filepath) == '.yaml'
53
58
  return load_from_yaml(filepath)
54
- else
55
- error_loading(filepath)
56
59
  end
60
+ error_loading(filepath)
57
61
  end
62
+ # rubocop:enable Metrics/MethodLength
63
+ # rubocop:enable Metrics/AbcSize
58
64
 
65
+ # rubocop:disable Security/YAMLLoad
59
66
  def self.load_from_yaml(arg)
60
- project = Project.instance
67
+ project = ProjectData.instance
61
68
  project.param.merge!(YAML.load(File.open(arg)))
62
69
  project.set(:configfilename, arg)
63
70
  project.set(:projectdir, File.dirname(arg))
64
71
  project
65
72
  end
73
+ # rubocop:enable Security/YAMLLoad
66
74
 
67
75
  ##
68
76
  # Error found and exit application.
69
77
  def self.error_loading(arg)
70
78
  msg = Rainbow("[ERROR] Loading... #{arg}").red.bright
71
- Logger.verbose msg
79
+ puts msg
72
80
  exit 1
73
81
  end
74
82
  end
data/lib/asker/logger.rb CHANGED
@@ -1,20 +1,47 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'singleton'
3
4
  require_relative 'application'
4
- require_relative 'project'
5
5
 
6
6
  # Display and log project messages
7
- module Logger
8
- ##
9
- # Display and log text
7
+ class Logger
8
+ include Singleton
9
+ @attr_verbose = 'yes'
10
+
11
+ def set_verbose(value)
12
+ @attr_verbose = value
13
+ end
14
+
10
15
  def self.verbose(msg)
11
- puts msg if Application.instance.config['global']['verbose'] == 'yes'
12
- Project.instance.get(:logfile)&.write("#{msg}\n")
16
+ print msg if @attr_verbose == 'yes'
17
+ @logfile&.write(msg)
13
18
  end
14
19
 
15
- ##
16
- # Display and log text line
17
20
  def self.verboseln(msg)
18
21
  verbose(msg + "\n")
19
22
  end
23
+
24
+ def log(msg)
25
+ verbose(msg)
26
+ end
27
+
28
+ def logln(msg)
29
+ verboseln(msg)
30
+ end
31
+ ##
32
+ # Create or reset logfile
33
+ def self.create(logpath, logname)
34
+ @logfile = File.open(logpath, 'w')
35
+ @logfile.write('=' * 50 + "\n")
36
+ @logfile.write("Created by : #{Application::NAME}")
37
+ @logfile.write(" (version #{Application::VERSION})\n")
38
+ @logfile.write("File : #{logname}\n")
39
+ @logfile.write("Time : #{Time.new}\n")
40
+ @logfile.write("Author : David Vargas Ruiz\n")
41
+ @logfile.write('=' * 50 + "\n\n")
42
+ end
43
+
44
+ def self.close
45
+ @logfile.close
46
+ end
20
47
  end
@@ -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
@@ -33,8 +34,8 @@ module Skeleton
33
34
  # Create default configuration files
34
35
  def self.create_configuration
35
36
  puts "\n[INFO] Creating configuration files"
36
- src = File.join(File.dirname(__FILE__), 'files', 'config.ini')
37
- dst = File.join('config.ini')
37
+ src = File.join(File.dirname(__FILE__), 'files', Application::CONFIGFILE)
38
+ dst = File.join(Application::CONFIGFILE)
38
39
  copyfile(src, dst)
39
40
  end
40
41
 
data/lib/asker.rb CHANGED
@@ -2,71 +2,100 @@
2
2
 
3
3
  require 'rainbow'
4
4
 
5
+ require_relative 'asker/skeleton'
6
+ require_relative 'asker/check_input'
7
+
5
8
  require_relative 'asker/displayer/concept_displayer'
6
9
  require_relative 'asker/displayer/stats_displayer'
7
10
  require_relative 'asker/exporter/output_file_exporter'
8
- require_relative 'asker/loader/project_loader'
9
- require_relative 'asker/loader/input_loader'
10
- require_relative 'asker/checker'
11
11
  require_relative 'asker/logger'
12
- require_relative 'asker/skeleton'
13
12
 
14
- ##
15
- # Asker main class
13
+ require_relative 'asker/loader/project_loader'
14
+ require_relative 'asker/loader/input_loader'
16
15
  class Asker
17
- ##
18
- # Create asker input demo files
19
- # @param dirpath (String)
20
- def self.create_input(dirpath)
21
- Skeleton.create_input(dirpath)
16
+ def self.init
17
+ Skeleton.create_configuration
22
18
  end
23
19
 
24
- ##
25
- # Create asker configuration files
26
- def self.create_configuration
27
- Skeleton.create_configuration
20
+ def self.new_input(dirpath)
21
+ Skeleton.create_input(dirpath)
28
22
  end
29
23
 
30
- ##
31
- # Checking input file syntax
32
- # @param filepath (String)
33
24
  def self.check(filepath)
34
- Checker.check(filepath)
25
+ CheckInput.new.file(filepath).check
35
26
  end
36
27
 
37
- ##
38
- # Start working
39
- # @param filepath (String) HAML or XML filepath
40
28
  def self.start(filepath)
41
- project, data = load_input(filepath)
29
+ project_data, data = load_input(filepath)
42
30
  ConceptDisplayer.show(data[:concepts])
43
- create_output(project, data)
31
+ create_output(project_data, data)
44
32
  end
45
33
 
46
- ##
47
- # Load input data
48
- # @param args (Hash)
49
34
  private_class_method def self.load_input(args)
50
- project = ProjectLoader.load(args)
51
- project.open # Open output files
52
- data = InputLoader.load(project.get(:inputdirs).split(','))
53
- [project, data]
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
+ # Create log file where to save log messages
56
+ Logger.create(project_data.get(:logpath),
57
+ project_data.get(:logname))
58
+ Logger.instance.set_verbose(Application.instance.config['verbose'])
59
+ Logger.verboseln '[INFO] Project open'
60
+ Logger.verboseln ' ├── inputdirs = ' + Rainbow(project_data.get(:inputdirs)).bright
61
+ Logger.verboseln ' └── process_file = ' + Rainbow(project_data.get(:process_file)).bright
54
62
  end
55
63
 
56
- ##
57
- # Create output files: Gift, YAML, TXT Doc
58
- # rubocop:disable Metrics/AbcSize
59
64
  private_class_method def self.create_output(project, data)
60
- Logger.verbose "\n[INFO] Creating output files"
61
- Logger.verbose ' ├── Gift questions file => ' +
62
- Rainbow(project.get(:outputpath)).bright
63
- Logger.verbose ' ├── YAML questions file => ' +
64
- Rainbow(project.get(:yamlpath)).bright
65
- Logger.verbose ' └── Lesson file => ' +
66
- Rainbow(project.get(:lessonpath)).bright
65
+ Logger.verboseln "\n[INFO] Creating output files"
66
+ m = ' ├── Gift questions file => '
67
+ m += if Application.instance.config['output']['gift'] == 'yes'
68
+ Rainbow(project.get(:outputpath)).bright
69
+ else
70
+ "#{project.get(:outputpath)} (No)"
71
+ end
72
+ Logger.verboseln m
73
+
74
+ m = ' ├── Lesson file => '
75
+ m += if Application.instance.config['output']['doc'] == 'yes'
76
+ Rainbow(project.get(:lessonpath)).bright
77
+ else
78
+ "#{project.get(:lessonpath)} (No)"
79
+ end
80
+ Logger.verboseln m
81
+
82
+ m = ' ├── YAML questions file => '
83
+ m += if Application.instance.config['output']['yaml'] == 'yes'
84
+ Rainbow(project.get(:yamlpath)).bright
85
+ else
86
+ "#{project.get(:yamlpath)} (No)"
87
+ end
88
+ Logger.verboseln m
89
+
90
+ m = ' └── Moodle XML file => '
91
+ m += if Application.instance.config['output']['moodle'] == 'yes'
92
+ Rainbow(project.get(:moodlepath)).bright
93
+ else
94
+ "#{project.get(:moodlepath)} (No)"
95
+ end
96
+ Logger.verboseln m
67
97
  OutputFileExporter.export(data, project)
68
98
  StatsDisplayer.show(data)
69
- project.close # Logger use Project.get(:logfile) until the end
99
+ Logger.close
70
100
  end
71
- # rubocop:enable Metrics/AbcSize
72
101
  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.1.6
4
+ version: 2.2.2
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: 2020-03-12 00:00:00.000000000 Z
11
+ date: 2022-02-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: haml
@@ -52,6 +52,20 @@ dependencies:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
54
  version: '3.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rexml
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '3.2'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '3.2'
55
69
  - !ruby/object:Gem::Dependency
56
70
  name: terminal-table
57
71
  requirement: !ruby/object:Gem::Requirement
@@ -81,33 +95,33 @@ dependencies:
81
95
  - !ruby/object:Gem::Version
82
96
  version: '0.20'
83
97
  - !ruby/object:Gem::Dependency
84
- name: base64_compatible
98
+ name: minitest
85
99
  requirement: !ruby/object:Gem::Requirement
86
100
  requirements:
87
101
  - - "~>"
88
102
  - !ruby/object:Gem::Version
89
- version: '0.0'
90
- type: :runtime
103
+ version: '5.11'
104
+ type: :development
91
105
  prerelease: false
92
106
  version_requirements: !ruby/object:Gem::Requirement
93
107
  requirements:
94
108
  - - "~>"
95
109
  - !ruby/object:Gem::Version
96
- version: '0.0'
110
+ version: '5.11'
97
111
  - !ruby/object:Gem::Dependency
98
- name: minitest
112
+ name: pry-byebug
99
113
  requirement: !ruby/object:Gem::Requirement
100
114
  requirements:
101
115
  - - "~>"
102
116
  - !ruby/object:Gem::Version
103
- version: '5.11'
117
+ version: '3.9'
104
118
  type: :development
105
119
  prerelease: false
106
120
  version_requirements: !ruby/object:Gem::Requirement
107
121
  requirements:
108
122
  - - "~>"
109
123
  - !ruby/object:Gem::Version
110
- version: '5.11'
124
+ version: '3.9'
111
125
  - !ruby/object:Gem::Dependency
112
126
  name: rubocop
113
127
  requirement: !ruby/object:Gem::Requirement
@@ -130,9 +144,9 @@ executables:
130
144
  extensions: []
131
145
  extra_rdoc_files:
132
146
  - README.md
133
- - LICENSE.txt
147
+ - LICENSE
134
148
  files:
135
- - LICENSE.txt
149
+ - LICENSE
136
150
  - README.md
137
151
  - bin/asker
138
152
  - lib/asker.rb
@@ -156,28 +170,35 @@ files:
156
170
  - lib/asker/ai/stages/stage_s.rb
157
171
  - lib/asker/ai/stages/stage_t.rb
158
172
  - lib/asker/application.rb
159
- - lib/asker/checker.rb
173
+ - lib/asker/check_input.rb
174
+ - lib/asker/check_input/input_data.rb
160
175
  - lib/asker/cli.rb
161
176
  - lib/asker/data/code.rb
162
177
  - lib/asker/data/column.rb
163
178
  - lib/asker/data/concept.rb
164
179
  - lib/asker/data/data_field.rb
180
+ - lib/asker/data/project_data.rb
165
181
  - lib/asker/data/row.rb
166
182
  - lib/asker/data/table.rb
167
183
  - lib/asker/data/template.rb
168
184
  - lib/asker/data/world.rb
169
185
  - lib/asker/displayer/code_displayer.rb
186
+ - lib/asker/displayer/concept_ai_displayer.erb
170
187
  - lib/asker/displayer/concept_ai_displayer.rb
171
188
  - lib/asker/displayer/concept_displayer.rb
172
189
  - lib/asker/displayer/stats_displayer.rb
173
190
  - lib/asker/exporter/code_gift_exporter.rb
174
191
  - lib/asker/exporter/concept_ai_gift_exporter.rb
192
+ - lib/asker/exporter/concept_ai_moodle_exporter.rb
175
193
  - lib/asker/exporter/concept_ai_yaml_exporter.rb
176
194
  - lib/asker/exporter/concept_doc_exporter.rb
195
+ - lib/asker/exporter/data_gift_exporter.rb
177
196
  - lib/asker/exporter/output_file_exporter.rb
178
- - lib/asker/files/config.ini
197
+ - lib/asker/files/asker.ini
179
198
  - lib/asker/files/example-code.haml
180
199
  - lib/asker/files/example-concept.haml
200
+ - lib/asker/files/language/du/connectors.yaml
201
+ - lib/asker/files/language/du/mistakes.yaml
181
202
  - lib/asker/files/language/du/templates.yaml
182
203
  - lib/asker/files/language/en/connectors.yaml
183
204
  - lib/asker/files/language/en/mistakes.yaml
@@ -206,8 +227,13 @@ files:
206
227
  - lib/asker/formatter/code_string_formatter.rb
207
228
  - lib/asker/formatter/concept_doc_formatter.rb
208
229
  - lib/asker/formatter/concept_string_formatter.rb
230
+ - lib/asker/formatter/moodle/matching.erb
231
+ - lib/asker/formatter/moodle/multichoice.erb
232
+ - lib/asker/formatter/moodle/shortanswer.erb
233
+ - lib/asker/formatter/moodle/truefalse.erb
209
234
  - lib/asker/formatter/question_gift_formatter.rb
210
235
  - lib/asker/formatter/question_hash_formatter.rb
236
+ - lib/asker/formatter/question_moodle_formatter.rb
211
237
  - lib/asker/formatter/question_moodlexml_formatter.rb
212
238
  - lib/asker/formatter/rb2haml_formatter.rb
213
239
  - lib/asker/lang/lang.rb
@@ -216,19 +242,19 @@ files:
216
242
  - lib/asker/loader/code_loader.rb
217
243
  - lib/asker/loader/content_loader.rb
218
244
  - lib/asker/loader/directory_loader.rb
245
+ - lib/asker/loader/embedded_file.rb
219
246
  - lib/asker/loader/file_loader.rb
220
247
  - lib/asker/loader/haml_loader.rb
221
248
  - lib/asker/loader/image_url_loader.rb
222
249
  - lib/asker/loader/input_loader.rb
223
250
  - lib/asker/loader/project_loader.rb
224
251
  - lib/asker/logger.rb
225
- - lib/asker/project.rb
226
252
  - lib/asker/skeleton.rb
227
- homepage: https://github.com/dvarrui/asker/tree/devel
253
+ homepage: https://github.com/teuton-software/asker/tree/v2.2
228
254
  licenses:
229
255
  - GPL-3.0
230
256
  metadata: {}
231
- post_install_message: Use asker command!
257
+ post_install_message:
232
258
  rdoc_options: []
233
259
  require_paths:
234
260
  - lib
@@ -236,7 +262,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
236
262
  requirements:
237
263
  - - ">="
238
264
  - !ruby/object:Gem::Version
239
- version: 2.5.0
265
+ version: 2.6.9
240
266
  required_rubygems_version: !ruby/object:Gem::Requirement
241
267
  requirements:
242
268
  - - ">="