asker-tool 2.1.3 → 2.2.0

Sign up to get free protection for your applications and to get access to all the features.
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