asker-tool 2.1.3 → 2.2.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 (130) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +18 -19
  3. data/bin/asker +2 -1
  4. data/lib/asker/ai/ai.rb +10 -3
  5. data/lib/asker/ai/ai_calculate.rb +20 -6
  6. data/lib/asker/ai/code/base_code_ai.rb +104 -0
  7. data/lib/asker/{code/ai → ai/code}/code_ai_factory.rb +11 -1
  8. data/lib/asker/{code/ai → ai/code}/javascript_code_ai.rb +2 -5
  9. data/lib/asker/ai/code/problem_code_ai.rb +176 -0
  10. data/lib/asker/{code/ai → ai/code}/python_code_ai.rb +2 -5
  11. data/lib/asker/{code/ai → ai/code}/ruby_code_ai.rb +14 -7
  12. data/lib/asker/{code/ai → ai/code}/sql_code_ai.rb +2 -5
  13. data/lib/asker/ai/concept_ai.rb +12 -2
  14. data/lib/asker/ai/question.rb +28 -6
  15. data/lib/asker/ai/stages/base_stage.rb +45 -6
  16. data/lib/asker/ai/stages/stage_b.rb +100 -50
  17. data/lib/asker/ai/stages/stage_d.rb +75 -90
  18. data/lib/asker/ai/stages/stage_f.rb +64 -36
  19. data/lib/asker/ai/stages/stage_i.rb +79 -92
  20. data/lib/asker/ai/stages/stage_s.rb +41 -36
  21. data/lib/asker/ai/stages/stage_t.rb +149 -108
  22. data/lib/asker/application.rb +24 -7
  23. data/lib/asker/checker.rb +149 -52
  24. data/lib/asker/cli.rb +37 -32
  25. data/lib/asker/data/code.rb +76 -0
  26. data/lib/asker/data/column.rb +31 -21
  27. data/lib/asker/data/concept.rb +108 -65
  28. data/lib/asker/data/data_field.rb +14 -0
  29. data/lib/asker/data/row.rb +75 -52
  30. data/lib/asker/data/table.rb +91 -42
  31. data/lib/asker/data/template.rb +3 -1
  32. data/lib/asker/data/world.rb +61 -32
  33. data/lib/asker/{exporter/code_screen_exporter.rb → displayer/code_displayer.rb} +13 -6
  34. data/lib/asker/displayer/concept_ai_displayer.erb +10 -0
  35. data/lib/asker/displayer/concept_ai_displayer.rb +133 -0
  36. data/lib/asker/displayer/concept_displayer.rb +34 -0
  37. data/lib/asker/displayer/stats_displayer.rb +22 -0
  38. data/lib/asker/exporter/code_gift_exporter.rb +10 -11
  39. data/lib/asker/exporter/concept_ai_gift_exporter.rb +21 -13
  40. data/lib/asker/exporter/concept_ai_moodle_exporter.rb +44 -0
  41. data/lib/asker/exporter/concept_ai_yaml_exporter.rb +14 -9
  42. data/lib/asker/exporter/concept_doc_exporter.rb +21 -14
  43. data/lib/asker/exporter/data_gift_exporter.rb +29 -0
  44. data/lib/asker/exporter/output_file_exporter.rb +21 -0
  45. data/lib/asker/files/{config.ini → asker.ini} +48 -1
  46. data/lib/asker/files/example-concept.haml +24 -8
  47. data/lib/asker/files/language/du/connectors.yaml +81 -0
  48. data/lib/asker/files/language/du/mistakes.yaml +82 -0
  49. data/lib/asker/files/language/du/templates.yaml +29 -0
  50. data/lib/asker/files/language/en/connectors.yaml +44 -0
  51. data/lib/asker/files/language/en/mistakes.yaml +37 -0
  52. data/lib/asker/files/language/en/templates.yaml +29 -0
  53. data/lib/asker/files/language/es/connectors.yaml +92 -0
  54. data/lib/asker/files/language/es/mistakes.yaml +84 -0
  55. data/lib/asker/files/language/es/templates.yaml +29 -0
  56. data/lib/asker/files/language/fr/connectors.yaml +76 -0
  57. data/lib/asker/files/language/fr/mistakes.yaml +82 -0
  58. data/lib/asker/files/language/fr/templates.yaml +29 -0
  59. data/lib/asker/files/language/javascript/connectors.yaml +11 -0
  60. data/lib/asker/files/language/javascript/mistakes.yaml +30 -0
  61. data/lib/asker/files/language/javascript/templates.yaml +3 -0
  62. data/lib/asker/files/language/math/connectors.yaml +2 -0
  63. data/lib/asker/files/language/math/mistakes.yaml +2 -0
  64. data/lib/asker/files/language/math/templates.yaml +1 -0
  65. data/lib/asker/files/language/python/connectors.yaml +11 -0
  66. data/lib/asker/files/language/python/mistakes.yaml +26 -0
  67. data/lib/asker/files/language/python/templates.yaml +3 -0
  68. data/lib/asker/files/language/ruby/connectors.yaml +11 -0
  69. data/lib/asker/files/language/ruby/mistakes.yaml +33 -0
  70. data/lib/asker/files/language/ruby/templates.yaml +3 -0
  71. data/lib/asker/files/language/sql/connectors.yaml +6 -0
  72. data/lib/asker/files/language/sql/mistakes.yaml +11 -0
  73. data/lib/asker/files/language/sql/templates.yaml +2 -0
  74. data/lib/asker/formatter/concept_string_formatter.rb +13 -9
  75. data/lib/asker/formatter/moodle/matching.erb +38 -0
  76. data/lib/asker/formatter/moodle/multichoice.erb +49 -0
  77. data/lib/asker/formatter/moodle/shortanswer.erb +30 -0
  78. data/lib/asker/formatter/moodle/truefalse.erb +47 -0
  79. data/lib/asker/formatter/question_gift_formatter.rb +30 -20
  80. data/lib/asker/formatter/question_moodle_formatter.rb +27 -0
  81. data/lib/asker/lang/lang.rb +18 -12
  82. data/lib/asker/lang/lang_factory.rb +32 -5
  83. data/lib/asker/lang/text_actions.rb +87 -69
  84. data/lib/asker/loader/code_loader.rb +4 -4
  85. data/lib/asker/loader/content_loader.rb +16 -12
  86. data/lib/asker/loader/directory_loader.rb +3 -3
  87. data/lib/asker/loader/embedded_file.rb +42 -0
  88. data/lib/asker/loader/file_loader.rb +3 -12
  89. data/lib/asker/loader/haml_loader.rb +15 -0
  90. data/lib/asker/loader/image_url_loader.rb +9 -11
  91. data/lib/asker/loader/input_loader.rb +24 -8
  92. data/lib/asker/loader/project_loader.rb +42 -30
  93. data/lib/asker/logger.rb +30 -6
  94. data/lib/asker/project.rb +28 -117
  95. data/lib/asker/skeleton.rb +40 -29
  96. data/lib/asker.rb +68 -79
  97. metadata +57 -74
  98. data/docs/changelog/v2.1.md +0 -99
  99. data/docs/commands.md +0 -12
  100. data/docs/contributions.md +0 -18
  101. data/docs/history.md +0 -40
  102. data/docs/idea.md +0 -44
  103. data/docs/inputs/README.md +0 -39
  104. data/docs/inputs/code.md +0 -69
  105. data/docs/inputs/concepts.md +0 -142
  106. data/docs/inputs/jedi.md +0 -68
  107. data/docs/inputs/tables.md +0 -112
  108. data/docs/inputs/templates.md +0 -87
  109. data/docs/install/README.md +0 -38
  110. data/docs/install/manual.md +0 -26
  111. data/docs/install/scripts.md +0 -38
  112. data/docs/revise/asker-file.md +0 -41
  113. data/docs/revise/buenas-practicas/01-convocatoria.md +0 -30
  114. data/docs/revise/buenas-practicas/02-formulario.md +0 -35
  115. data/docs/revise/buenas-practicas/03-descripcion.md +0 -63
  116. data/docs/revise/buenas-practicas/04-resultados.md +0 -17
  117. data/docs/revise/buenas-practicas/05-reproducir.md +0 -10
  118. data/docs/revise/ejemplos/01/README.md +0 -27
  119. data/docs/revise/ejemplos/02/README.md +0 -31
  120. data/docs/revise/ejemplos/03/README.md +0 -31
  121. data/docs/revise/ejemplos/04/README.md +0 -37
  122. data/docs/revise/ejemplos/05/README.md +0 -25
  123. data/docs/revise/ejemplos/06/README.md +0 -43
  124. data/docs/revise/ejemplos/README.md +0 -11
  125. data/docs/revise/projects.md +0 -74
  126. data/lib/asker/code/ai/base_code_ai.rb +0 -48
  127. data/lib/asker/code/code.rb +0 -53
  128. data/lib/asker/exporter/concept_ai_screen_exporter.rb +0 -115
  129. data/lib/asker/exporter/concept_screen_exporter.rb +0 -25
  130. data/lib/asker/exporter/main.rb +0 -9
@@ -2,6 +2,7 @@
2
2
 
3
3
  require 'yaml'
4
4
  require_relative '../project'
5
+ require_relative '../logger'
5
6
 
6
7
  # Load params into Project class using arg input
7
8
  # * load
@@ -10,62 +11,73 @@ require_relative '../project'
10
11
  # * load_from_directory
11
12
  # * load_error
12
13
  module ProjectLoader
13
- def self.load(args = {})
14
+ ##
15
+ # Load project from args
16
+ # @param args (String or Hash)
17
+ # rubocop:disable Metrics/MethodLength
18
+ def self.load(args)
14
19
  project = Project.instance
15
20
 
16
21
  if args.class == Hash
17
22
  project.param.merge!(args)
18
- return true
23
+ project.open
24
+ return project
19
25
  elsif args.class == String
20
26
  ProjectLoader.load_from_string(args)
21
- return true
27
+ project.open
28
+ return project
22
29
  end
23
30
 
24
31
  msg = '[ERROR] ProjectLoader:'
25
32
  msg += "Configuration params format is <#{pArgs.class}>!"
26
- project.verbose Rainbow(msg).red
33
+ Logger.verboseln Rainbow(msg).red
27
34
  raise msg
28
35
  end
36
+ # rubocop:enable Metrics/MethodLength
29
37
 
30
- def self.load_from_string(arg)
38
+ ##
39
+ # Load project from filepath. Options:
40
+ # * HAML filepath
41
+ # * XML filepath
42
+ # * YAML filepath
43
+ # @param filepath (String)
44
+ # rubocop:disable Metrics/MethodLength
45
+ # rubocop:disable Metrics/AbcSize
46
+ def self.load_from_string(filepath)
31
47
  project = Project.instance
32
- unless File.exist?(arg)
33
- msg = Rainbow("[WARN] ProjectLoader.load: #{arg} dosn't exists!").yellow.bright
34
- project.verbose msg
35
- raise msg
48
+ unless File.exist?(filepath)
49
+ msg = Rainbow("[ERROR] #{filepath} not found!").red.bright
50
+ Logger.verboseln msg
51
+ exit 1
36
52
  end
37
53
 
38
- if File.extname(arg) == '.haml' || File.extname(arg) == '.xml'
39
- project.set(:inputdirs, File.dirname(arg))
40
- project.set(:process_file, File.basename(arg))
41
- elsif File.extname(arg) == '.yaml'
42
- load_from_yaml(arg)
43
- elsif File.directory?(arg)
44
- load_from_directory(arg)
45
- else
46
- load_error(arg)
54
+ if File.extname(filepath) == '.haml' || File.extname(filepath) == '.xml'
55
+ project.set(:inputdirs, File.dirname(filepath))
56
+ project.set(:process_file, File.basename(filepath))
57
+ return project
58
+ elsif File.extname(filepath) == '.yaml'
59
+ return load_from_yaml(filepath)
47
60
  end
61
+ error_loading(filepath)
48
62
  end
63
+ # rubocop:enable Metrics/MethodLength
64
+ # rubocop:enable Metrics/AbcSize
49
65
 
66
+ # rubocop:disable Security/YAMLLoad
50
67
  def self.load_from_yaml(arg)
51
68
  project = Project.instance
52
69
  project.param.merge!(YAML.load(File.open(arg)))
53
70
  project.set(:configfilename, arg)
54
71
  project.set(:projectdir, File.dirname(arg))
72
+ project
55
73
  end
74
+ # rubocop:enable Security/YAMLLoad
56
75
 
57
- def self.load_from_directory(dirpath)
58
- msg = Rainbow('[WARN] ProjectLoader.load: Directory input ').yellow
59
- msg += Rainbow(dirpath).bright.yellow
60
- msg += Rainbow(' not implemented!').yellow
61
- Project.instance.verbose msg
76
+ ##
77
+ # Error found and exit application.
78
+ def self.error_loading(arg)
79
+ msg = Rainbow("[ERROR] Loading... #{arg}").red.bright
80
+ Logger.verboseln msg
62
81
  exit 1
63
82
  end
64
-
65
- def self.load_error(arg)
66
- msg = Rainbow('[ERR ] ProjectLoader: Input ').red
67
- msg += Rainbow(arg).red.bright + Rainbow(' unkown').red
68
- Project.instance.verbose msg
69
- raise msg
70
- end
71
83
  end
data/lib/asker/logger.rb CHANGED
@@ -1,16 +1,21 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative 'project'
3
+ require 'singleton'
4
+ require_relative 'application'
4
5
 
5
6
  # Display and log project messages
6
- module Logger
7
+ class Logger
8
+ include Singleton
9
+
10
+ def initialize
11
+ @logfile = null
12
+ end
13
+
7
14
  ##
8
15
  # Display and log text
9
16
  def self.verbose(msg)
10
- project = Project.instance
11
- puts msg if project.get(:verbose)
12
- project.get(:logfile).write("#{msg}\n") if project.get(:logfile)
13
- # project.get(:logfile)&.project.get(:logfile).write("#{msg}\n")
17
+ print msg if Application.instance.config['global']['verbose'] == 'yes'
18
+ @logfile&.write(msg)
14
19
  end
15
20
 
16
21
  ##
@@ -18,4 +23,23 @@ module Logger
18
23
  def self.verboseln(msg)
19
24
  verbose(msg + "\n")
20
25
  end
26
+
27
+ ##
28
+ # Create or reset logfile
29
+ def self.create(project)
30
+ @logfile = File.open(project.get(:logpath), 'w')
31
+ @logfile.write('=' * 50 + "\n")
32
+ @logfile.write("Created by : #{Application::NAME}")
33
+ @logfile.write(" (version #{Application::VERSION})\n")
34
+ @logfile.write("File : #{project.get(:logname)}\n")
35
+ @logfile.write("Time : #{Time.new}\n")
36
+ @logfile.write("Author : David Vargas Ruiz\n")
37
+ @logfile.write('=' * 50 + "\n\n")
38
+ end
39
+
40
+ ##
41
+ # Close Log file
42
+ def self.close
43
+ @logfile.close
44
+ end
21
45
  end
data/lib/asker/project.rb CHANGED
@@ -2,8 +2,8 @@
2
2
 
3
3
  require 'singleton'
4
4
  require 'rainbow'
5
- require 'fileutils'
6
5
  require_relative 'application'
6
+ require_relative 'logger'
7
7
 
8
8
  # Contains Project data and methods
9
9
  class Project
@@ -20,16 +20,8 @@ class Project
20
20
  # Reset project params
21
21
  def reset
22
22
  @default = { inputbasedir: FileUtils.pwd,
23
- outputdir: 'output',
24
- category: :none,
25
- formula_weights: [1, 1, 1],
26
- lang: 'en',
27
- locales: %w[en es javascript math python ruby sql],
28
- show_mode: :default,
29
- verbose: true,
30
- stages: { d: true, b: true, f: true, i: true, s: true, t: true },
31
- threshold: 0.5,
32
- color_output: true }
23
+ stages: { d: true, b: true, f: true, i: true, s: true, t: true },
24
+ threshold: 0.5 }
33
25
  @param = {}
34
26
  end
35
27
 
@@ -54,117 +46,36 @@ class Project
54
46
  # Open new project
55
47
  # * setting new params and
56
48
  # * creating output files
57
- # IMPORTANT: We need at least theses values
49
+ # IMPORTANT: We need at least these values
58
50
  # * process_file
59
51
  # * inputdirs
52
+ # rubocop:disable Metrics/MethodLength
53
+ # rubocop:disable Metrics/AbcSize
60
54
  def open
61
- ext = '.haml'
62
- @param[:process_file] = @param[:process_file] ||
63
- get(:projectdir).split(File::SEPARATOR).last + ext
55
+ config = Application.instance.config
56
+ ext = File.extname(@param[:process_file]) || '.haml'
64
57
  @param[:projectname] = @param[:projectname] ||
65
58
  File.basename(@param[:process_file], ext)
66
- @param[:inputdirs] = @param[:inputdirs] ||
67
- File.join(get(:inputbasedir), @param[:projectdir])
68
59
 
69
- @param[:logname] = @param[:logname] ||
70
- "#{@param[:projectname]}-log.txt"
71
- @param[:outputname] = @param[:outputname] ||
72
- "#{@param[:projectname]}-gift.txt"
73
- @param[:lessonname] = @param[:lessonname] ||
74
- "#{@param[:projectname]}-doc.txt"
75
- @param[:yamlname] = @param[:yamlname] ||
76
- "#{@param[:projectname]}.yaml"
77
-
78
- @param[:logpath] = @param[:logpath] ||
79
- File.join(get(:outputdir), @param[:logname])
80
- @param[:outputpath] = @param[:outputpath] ||
81
- File.join(get(:outputdir), @param[:outputname])
82
- @param[:lessonpath] = @param[:lessonpath] ||
83
- File.join(get(:outputdir), @param[:lessonname])
84
- @param[:yamlpath] = @param[:yamlpath] ||
85
- File.join(get(:outputdir), @param[:yamlname])
86
-
87
- Dir.mkdir(get(:outputdir)) unless Dir.exist?(get(:outputdir))
88
- create_log_file
89
- create_output_file
90
- create_lesson_file
91
- create_yaml_file
92
- end
93
-
94
- ##
95
- # Close output files
96
- def close
97
- get(:logfile).close
98
- get(:outputfile).close
99
- get(:lessonfile).close
100
- get(:yamlfile).close
101
- end
102
-
103
- ##
104
- # Display and log text
105
- def verbose(msg)
106
- puts msg if get(:verbose)
107
- get(:logfile).write(msg.to_s + "\n") if get(:logfile)
108
- end
109
-
110
- ##
111
- # Display and log text line
112
- def verboseln(msg)
113
- verbose(msg + "\n")
114
- end
115
-
116
- def method_missing(method, *_args, &_block)
117
- get(method)
118
- end
119
-
120
- private
121
-
122
- # create or reset logfile
123
- def create_log_file
124
- @param[:logfile] = File.open(get(:logpath), 'w')
125
- f = get(:logfile)
126
- f.write('=' * 50 + "\n")
127
- f.write("Created by : #{Application::NAME}")
128
- f.write(" (version #{Application::VERSION})\n")
129
- f.write("File : #{get(:logname)}\n")
130
- f.write("Time : #{Time.new}\n")
131
- f.write("Author : David Vargas Ruiz\n")
132
- f.write('=' * 50 + "\n\n")
133
-
134
- verbose '[INFO] Project open'
135
- verbose ' ├── inputdirs = ' + Rainbow(get(:inputdirs)).bright
136
- verbose ' └── process_file = ' + Rainbow(get(:process_file)).bright
137
- end
138
-
139
- # Create or reset output file
140
- def create_output_file
141
- @param[:outputfile] = File.open(get(:outputpath), 'w')
142
- f = get(:outputfile)
143
- f.write('// ' + ('=' * 50) + "\n")
144
- f.write("// Created by : #{Application::NAME}")
145
- f.write(" (version #{Application::VERSION})\n")
146
- f.write("// File : #{get(:outputname)}\n")
147
- f.write("// Time : #{Time.new}\n")
148
- f.write("// Author : David Vargas Ruiz\n")
149
- f.write('// ' + ('=' * 50) + "\n\n")
150
- f.write("$CATEGORY: $course$/#{get(:category)}\n") unless get(:category) == :none
151
- end
152
-
153
- # Create or reset lesson file
154
- def create_lesson_file
155
- @param[:lessonfile] = File.new(get(:lessonpath), 'w')
156
- f = get(:lessonfile)
157
- f.write('=' * 50 + "\n")
158
- f.write("Created by : #{Application::NAME}")
159
- f.write(" (version #{Application::VERSION})\n")
160
- f.write("File : #{get(:lessonname)}\n")
161
- f.write("Time : #{Time.new}\n")
162
- f.write("Author : David Vargas Ruiz\n")
163
- f.write('=' * 50 + "\n")
164
- end
165
-
166
- # Create or reset yaml file
167
- def create_yaml_file
168
- @param[:yamlfile] = File.open(get(:yamlpath), 'w')
60
+ @param[:logname] = "#{@param[:projectname]}-log.txt"
61
+ @param[:outputname] = "#{@param[:projectname]}-gift.txt"
62
+ @param[:lessonname] = "#{@param[:projectname]}-doc.txt"
63
+ @param[:yamlname] = "#{@param[:projectname]}.yaml"
64
+ @param[:moodlename] = "#{@param[:projectname]}-moodle.xml"
65
+
66
+ outputdir = config['output']['folder']
67
+ @param[:logpath] = File.join(outputdir, get(:logname))
68
+ @param[:outputpath] = File.join(outputdir, get(:outputname))
69
+ @param[:lessonpath] = File.join(outputdir, get(:lessonname))
70
+ @param[:yamlpath] = File.join(outputdir, get(:yamlname))
71
+ @param[:moodlepath] = File.join(outputdir, get(:moodlename))
72
+
73
+ Dir.mkdir(outputdir) unless Dir.exist?(outputdir)
74
+ Logger.create(self) # Create log file where to save log messages
75
+ Logger.verboseln '[INFO] Project open'
76
+ Logger.verboseln ' ├── inputdirs = ' + Rainbow(get(:inputdirs)).bright
77
+ Logger.verboseln ' └── process_file = ' + Rainbow(get(:process_file)).bright
169
78
  end
79
+ # rubocop:enable Metrics/MethodLength
80
+ # rubocop:enable Metrics/AbcSize
170
81
  end
@@ -2,6 +2,7 @@
2
2
 
3
3
  require 'fileutils'
4
4
  require 'rainbow'
5
+ require_relative 'application'
5
6
 
6
7
  # Skeleton: create skeleton for asker input files
7
8
  # * create
@@ -10,27 +11,38 @@ require 'rainbow'
10
11
  # * create_dirs
11
12
  # * copyfile
12
13
  module Skeleton
13
- def self.create(dirpath)
14
- puts "\n[INFO] Creating #{Rainbow(dirpath).bright} project 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'
21
+ dirpath = File.dirname(inputpath)
22
+ filename = File.basename(inputpath)
23
+ else
24
+ dirpath = inputpath
25
+ filename = 'example-concept.haml'
26
+ end
15
27
  create_dir dirpath
16
- copy_files_into(dirpath)
28
+ source = File.join(File.dirname(__FILE__), 'files/example-concept.haml')
29
+ copyfile(source, File.join(dirpath, filename))
17
30
  end
31
+ # rubocop:enable Metrics/MethodLength
18
32
 
19
- def self.copy_files_into(project_dir)
20
- # Directory and files: Ruby script, Configfile, gitignore
21
- items = [
22
- { source: 'files/example-concept.haml', target: 'example-concept.haml' }
23
- # { source: 'files/example-code.haml', target: 'example-code.haml' },
24
- ]
25
- source_basedir = File.join(File.dirname(__FILE__))
26
- items.each do |item|
27
- source = File.join(source_basedir, item[:source])
28
- target = File.join(project_dir, item[:target])
29
- copyfile(source, target)
30
- end
33
+ ##
34
+ # Create default configuration files
35
+ def self.create_configuration
36
+ puts "\n[INFO] Creating configuration files"
37
+ src = File.join(File.dirname(__FILE__), 'files', Application::CONFIGFILE)
38
+ dst = File.join(Application::CONFIGFILE)
39
+ copyfile(src, dst)
31
40
  end
32
41
 
33
- def self.create_dir(dirpath)
42
+ ##
43
+ # Create folder
44
+ # @param dirpath (String)
45
+ private_class_method def self.create_dir(dirpath)
34
46
  if Dir.exist? dirpath
35
47
  puts "* Exists dir! => #{Rainbow(dirpath).yellow}"
36
48
  else
@@ -43,21 +55,20 @@ module Skeleton
43
55
  end
44
56
  end
45
57
 
46
- def self.create_dirs(*args)
47
- args.each { |arg| create_dir arg }
48
- end
49
-
50
- def self.copyfile(target, dest)
58
+ ##
59
+ # Copy target file to dest
60
+ # @param target (String)
61
+ # @param dest (String)
62
+ private_class_method def self.copyfile(target, dest)
51
63
  if File.exist? dest
52
64
  puts "* Exists file! => #{Rainbow(dest).yellow}"
53
- else
54
- puts "* File not found! => #{Rainbow(target).yellow}" unless File.exist? target
55
- begin
56
- FileUtils.cp(target, dest)
57
- puts "* Create file => #{Rainbow(dest).green}"
58
- rescue StandardError
59
- puts "* Create file ERROR => #{Rainbow(dest).red}"
60
- end
65
+ return true
66
+ end
67
+ begin
68
+ FileUtils.cp(target, dest)
69
+ puts "* Create file => #{Rainbow(dest).green}"
70
+ rescue StandardError
71
+ puts "* Create file ERROR => #{Rainbow(dest).red}"
61
72
  end
62
73
  end
63
74
  end
data/lib/asker.rb CHANGED
@@ -2,63 +2,29 @@
2
2
 
3
3
  require 'rainbow'
4
4
 
5
- require_relative 'asker/project'
6
- require_relative 'asker/data/concept'
7
- require_relative 'asker/data/world'
8
- require_relative 'asker/ai/concept_ai'
9
- require_relative 'asker/formatter/concept_string_formatter'
10
- require_relative 'asker/exporter/main'
5
+ require_relative 'asker/displayer/concept_displayer'
6
+ require_relative 'asker/displayer/stats_displayer'
7
+ require_relative 'asker/exporter/output_file_exporter'
11
8
  require_relative 'asker/loader/project_loader'
12
9
  require_relative 'asker/loader/input_loader'
13
10
  require_relative 'asker/checker'
11
+ require_relative 'asker/logger'
14
12
  require_relative 'asker/skeleton'
15
13
 
16
- # This class does all the job
17
- # * start
18
- # * load_input_data
19
- # * create_output_files, show_create_output_files
20
- # * create_questions
21
- # * show_final_results
14
+ ##
15
+ # Asker main class
22
16
  class Asker
23
- # Initialize atributes
24
- def initialize
25
- @concepts_ai = []
26
- @concepts = []
27
- @codes = []
28
- end
29
-
30
17
  ##
31
- # Start working
32
- # @param args (Hash)
33
- def start(args = {})
34
- load_input_data(args)
35
- create_output_files
36
- show_final_results
37
- end
38
-
39
- ##
40
- # Load input data
41
- # @param args (Hash)
42
- def load_input_data(args)
43
- ProjectLoader.load(args)
44
- Project.instance.open
45
- data = InputLoader.load(Project.instance.get(:inputdirs).split(','))
46
- @concepts = data[:concepts]
47
- @codes = data[:codes]
48
- Project.instance.verbose "\n[INFO] Loading data from Internet"
49
- @world = World.new(@concepts)
50
- ConceptScreenExporter.export_all(@concepts)
18
+ # Create asker input demo files
19
+ # @param dirpath (String)
20
+ def self.create_input(dirpath)
21
+ Skeleton.create_input(dirpath)
51
22
  end
52
23
 
53
24
  ##
54
- # Create output files
55
- # * Gift
56
- # * YAML
57
- # * TXT Doc
58
- def create_output_files
59
- show_create_output_files
60
- create_questions
61
- ConceptDocExporter.new(@concepts).export
25
+ # Create asker configuration files
26
+ def self.create_configuration
27
+ Skeleton.create_configuration
62
28
  end
63
29
 
64
30
  ##
@@ -69,43 +35,66 @@ class Asker
69
35
  end
70
36
 
71
37
  ##
72
- # Create asker input demo files
73
- # @param dirpath (String)
74
- def self.create_skeleton(dirpath)
75
- Skeleton.create(dirpath)
38
+ # Start working
39
+ # @param filepath (String) HAML or XML filepath
40
+ def self.start(filepath)
41
+ project, data = load_input(filepath)
42
+ ConceptDisplayer.show(data[:concepts])
43
+ create_output(project, data)
76
44
  end
77
45
 
78
- private
79
-
80
- def show_create_output_files
81
- p = Project.instance
82
- p.verbose "\n[INFO] Creating output files"
83
- p.verbose " ├── Gift questions file => #{Rainbow(p.outputpath).bright}"
84
- p.verbose " ├── YAML questions file => #{Rainbow(p.yamlpath).bright}"
85
- p.verbose " └── Lesson file => #{Rainbow(p.lessonpath).bright}"
46
+ ##
47
+ # Load input data
48
+ # @param args (Hash)
49
+ private_class_method def self.load_input(args)
50
+ project = ProjectLoader.load(args)
51
+ data = InputLoader.load(project.get(:inputdirs).split(','))
52
+ [project, data]
86
53
  end
87
54
 
88
55
  ##
89
- # Create questions for every "concept"
90
- # Export output to:
91
- # * GIFT format file
92
- # * YAML format file
93
- # Create questions for every "code"
94
- # Export output to GIFT format file
95
- def create_questions
96
- @concepts.each do |concept|
97
- concept_ai = ConceptAI.new(concept, @world)
98
- concept_ai.make_questions
99
- @concepts_ai << concept_ai
100
- end
101
- ConceptAIGiftExporter.export_all(@concepts_ai)
102
- ConceptAIYAMLExporter.export_all(@concepts_ai)
103
- CodeGiftExporter.export_all(@codes) # UNDER DEVELOPMENT
104
- end
56
+ # Create output files: Gift, YAML, TXT Doc
57
+ # rubocop:disable Metrics/AbcSize
58
+ # rubocop:disable Metrics/MethodLength
59
+ # rubocop:disable Metrics/PerceivedComplexity
60
+ private_class_method def self.create_output(project, data)
61
+ Logger.verboseln "\n[INFO] Creating output files"
62
+ m = ' ├── Gift questions file => '
63
+ m += if Application.instance.config['output']['gift'] == 'yes'
64
+ Rainbow(project.get(:outputpath)).bright
65
+ else
66
+ "#{project.get(:outputpath)} (No)"
67
+ end
68
+ Logger.verboseln m
69
+
70
+ m = ' ├── Lesson file => '
71
+ m += if Application.instance.config['output']['doc'] == 'yes'
72
+ Rainbow(project.get(:lessonpath)).bright
73
+ else
74
+ "#{project.get(:lessonpath)} (No)"
75
+ end
76
+ Logger.verboseln m
77
+
78
+ m = ' ├── YAML questions file => '
79
+ m += if Application.instance.config['output']['yaml'] == 'yes'
80
+ Rainbow(project.get(:yamlpath)).bright
81
+ else
82
+ "#{project.get(:yamlpath)} (No)"
83
+ end
84
+ Logger.verboseln m
105
85
 
106
- def show_final_results
107
- ConceptAIScreenExporter.export_all(@concepts_ai)
108
- CodeScreenExporter.export_all(@codes)
109
- Project.instance.close
86
+ m = ' └── Moodle XML file => '
87
+ m += if Application.instance.config['output']['moodle'] == 'yes'
88
+ Rainbow(project.get(:moodlepath)).bright
89
+ else
90
+ "#{project.get(:moodlepath)} (No)"
91
+ end
92
+ Logger.verboseln m
93
+ OutputFileExporter.export(data, project)
94
+ StatsDisplayer.show(data)
95
+ Logger.close
110
96
  end
97
+ # rubocop:enable Metrics/AbcSize
98
+ # rubocop:enable Metrics/MethodLength
99
+ # rubocop:enable Metrics/PerceivedComplexity
111
100
  end