asker-tool 2.1.5 → 2.2.1

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 (105) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +13 -17
  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 +13 -3
  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 +19 -11
  23. data/lib/asker/cli.rb +31 -44
  24. data/lib/asker/data/code.rb +62 -0
  25. data/lib/asker/data/column.rb +31 -21
  26. data/lib/asker/data/concept.rb +109 -65
  27. data/lib/asker/data/data_field.rb +14 -0
  28. data/lib/asker/data/project_data.rb +63 -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 +51 -35
  33. data/lib/asker/displayer/code_displayer.rb +7 -0
  34. data/lib/asker/displayer/concept_ai_displayer.erb +10 -0
  35. data/lib/asker/displayer/concept_ai_displayer.rb +74 -53
  36. data/lib/asker/displayer/concept_displayer.rb +16 -9
  37. data/lib/asker/displayer/stats_displayer.rb +12 -3
  38. data/lib/asker/exporter/concept_ai_gift_exporter.rb +19 -11
  39. data/lib/asker/exporter/concept_ai_moodle_exporter.rb +44 -0
  40. data/lib/asker/exporter/concept_ai_yaml_exporter.rb +13 -6
  41. data/lib/asker/exporter/concept_doc_exporter.rb +14 -1
  42. data/lib/asker/exporter/data_gift_exporter.rb +29 -0
  43. data/lib/asker/exporter/output_file_exporter.rb +9 -6
  44. data/lib/asker/files/{config.ini → asker.ini} +48 -1
  45. data/lib/asker/files/example-concept.haml +0 -1
  46. data/lib/asker/files/language/du/connectors.yaml +81 -0
  47. data/lib/asker/{lang/locales/fr → files/language/du}/mistakes.yaml +1 -1
  48. data/lib/asker/files/language/du/templates.yaml +29 -0
  49. data/lib/asker/{lang/locales → files/language}/en/connectors.yaml +0 -0
  50. data/lib/asker/{lang/locales → files/language}/en/mistakes.yaml +0 -0
  51. data/lib/asker/files/language/en/templates.yaml +29 -0
  52. data/lib/asker/{lang/locales → files/language}/es/connectors.yaml +0 -0
  53. data/lib/asker/files/language/es/mistakes.yaml +84 -0
  54. data/lib/asker/files/language/es/templates.yaml +29 -0
  55. data/lib/asker/files/language/fr/connectors.yaml +76 -0
  56. data/lib/asker/{lang/locales/es → files/language/fr}/mistakes.yaml +0 -0
  57. data/lib/asker/files/language/fr/templates.yaml +29 -0
  58. data/lib/asker/{lang/locales → files/language}/javascript/connectors.yaml +0 -0
  59. data/lib/asker/{lang/locales → files/language}/javascript/mistakes.yaml +0 -0
  60. data/lib/asker/{lang/locales → files/language}/javascript/templates.yaml +0 -0
  61. data/lib/asker/{lang/locales → files/language}/math/connectors.yaml +0 -0
  62. data/lib/asker/{lang/locales → files/language}/math/mistakes.yaml +0 -0
  63. data/lib/asker/{lang/locales → files/language}/math/templates.yaml +0 -0
  64. data/lib/asker/{lang/locales → files/language}/python/connectors.yaml +0 -0
  65. data/lib/asker/{lang/locales → files/language}/python/mistakes.yaml +0 -0
  66. data/lib/asker/{lang/locales → files/language}/python/templates.yaml +0 -0
  67. data/lib/asker/{lang/locales → files/language}/ruby/connectors.yaml +0 -0
  68. data/lib/asker/{lang/locales → files/language}/ruby/mistakes.yaml +0 -0
  69. data/lib/asker/{lang/locales → files/language}/ruby/templates.yaml +0 -0
  70. data/lib/asker/{lang/locales → files/language}/sql/connectors.yaml +0 -0
  71. data/lib/asker/{lang/locales → files/language}/sql/mistakes.yaml +0 -0
  72. data/lib/asker/{lang/locales → files/language}/sql/templates.yaml +0 -0
  73. data/lib/asker/formatter/concept_doc_formatter.rb +0 -4
  74. data/lib/asker/formatter/concept_string_formatter.rb +7 -4
  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/{checker.rb → input_checker.rb} +126 -49
  82. data/lib/asker/lang/lang.rb +17 -10
  83. data/lib/asker/lang/lang_factory.rb +32 -5
  84. data/lib/asker/lang/text_actions.rb +87 -69
  85. data/lib/asker/loader/code_loader.rb +4 -4
  86. data/lib/asker/loader/content_loader.rb +21 -19
  87. data/lib/asker/loader/directory_loader.rb +1 -8
  88. data/lib/asker/loader/embedded_file.rb +42 -0
  89. data/lib/asker/loader/file_loader.rb +3 -14
  90. data/lib/asker/loader/haml_loader.rb +15 -0
  91. data/lib/asker/loader/image_url_loader.rb +8 -12
  92. data/lib/asker/loader/input_loader.rb +13 -15
  93. data/lib/asker/loader/project_loader.rb +25 -15
  94. data/lib/asker/logger.rb +36 -9
  95. data/lib/asker/skeleton.rb +23 -13
  96. data/lib/asker.rb +76 -42
  97. metadata +53 -54
  98. data/lib/asker/code/ai/base_code_ai.rb +0 -48
  99. data/lib/asker/code/code.rb +0 -53
  100. data/lib/asker/lang/locales/du/templates.yaml +0 -50
  101. data/lib/asker/lang/locales/en/templates.yaml +0 -29
  102. data/lib/asker/lang/locales/es/templates.yaml +0 -29
  103. data/lib/asker/lang/locales/fr/connectors.yaml +0 -92
  104. data/lib/asker/lang/locales/fr/templates.yaml +0 -29
  105. data/lib/asker/project.rb +0 -172
@@ -1,29 +0,0 @@
1
- ---
2
- :none: "Aucune réponse n'est correcte"
3
- :error: 'Erreur'
4
- :misspelling: 'Erreur ortographique'
5
- :true: 'Vrai'
6
- :false: 'Faux'
7
- :d1: "Définition \\: <i><%=text1%></i><br/>Choisissez l'option qui correspond le mieux à la définition précédente.<br/>"
8
- :d2: 'Définition de <b><%=text1%></b>\:<br/> <i><%=text2%></i><br/>'
9
- :d3: 'Définition de <b><%=text1%></b>\:<br/> <i><%=text2%></i><br/></br><p>Note: Chaque symbole ? représente une lettre, et * un ou plusieurs mots.</p>'
10
- :d4: 'Définition de <b><%=text1%></b>\:<br/> <i><%=text2%></i><br/><br/>(Mettez chaque mot à la bonne position dans le texte)'
11
- :b1: 'Par rapport au concept <b><%=text1%></b>, associez chaque "<%=text2%>" avec son,sa "<%=text3%>".<br/>'
12
- :f1: 'Les éléments suivants sont "<%=text2%>" du concept <b><%=text1%></b>\:<ul><li><%=text3%></li></ul>'
13
- :f2: "Les éléments suivants sont \"<%=text2%>\".<br/>Sélectionnez l' option qui n'appartient pas au concept <b><%=text1%></b>."
14
- :f3: 'Les éléments suivants sont "<%=text2%>" du concept <b><%=text1%></b>\:<br><p><%=text3%></p>(Mettez chaque mot à la bonne position dans le texte)'
15
- :i1: "<img src=\"<%=text1%>\" alt\\=\"image\" width=\"400\" height=\"300\"><br/>Choisissez l'option qui correspond le mieux à l'image précédente.<br/>"
16
- :i2: "<img src=\"<%=text1%>\" alt\\=\"image\" width=\"400\" height=\"300\"><br/>L'image précédente correspond à <b><%=text2%></b>."
17
- :i3: "<img src=\"<%=text1%>\" alt\\=\"image\" width=\"400\" height=\"300\"><br/>Écrivez l'option <%=text2%>, qui correspond le mieux à l'image précédente.<br/>"
18
- :i4: '<img src="<%=text1%>" alt\="image" width="400" height="300"><br/>Définition\: <i><%=text2%></i><br/><br/>(Mettez chaque mot à la bonne position dans le texte)'
19
- :s1: 'Par rapport au concept <b><%=text1%></b>, mettez dans l'ordre chaque "<%=text2%>" afin que le critère soit rempli "<%=text3%>".<br/>'
20
- :t1table: 'Concept <b><%=text1%></b><br/><%=text2%>\: [*]<br/><%=text3%>\: "<%=text4%>"<br/>Choisissez l'option correcte.<br/>'
21
- :t2table: 'Concept <b><%=text1%></b><br/><%=text2%>\: [*]<br/><%=text3%>\: "<%=text4%>"<br/>Choisissez l'option correcte.<br/>'
22
- :t3table: 'Concept <b><%=text1%></b><br/><%=text2%>\: "<%=text3%>"<br/><%=text4%>: [*]<br/>Choisissez l'option correcte.<br/>'
23
- :t4table: 'Concept <b><%=text1%></b><br/><%=text2%>\: "<%=text3%>"<br/><%=text4%>: [*]<br/>Choisissez l'option correcte.<br/>'
24
- :t5table: 'Concept <b><%=text1%></b><br/>L'association suivante est correcte\:<br/><ul><li><%=text2%>\: "<%=text3%>"</li><li><%=text4%>\: "<%=text5%>"</li></ul>'
25
- :t6table: 'Concept <b><%=text1%></b><br/>L'association suivante est correcte\:<br/><ul><li><%=text2%>\: "<%=text3%>"</li><li><%=text4%>\: "<%=text5%>"</li></ul>'
26
- :t7table: 'Concept <b><%=text1%></b><br/>L'association suivante est correcte\:<br/><ul><li><%=text2%>\: "<%=text3%>"</li><li><%=text4%>\: "<%=text5%>"</li></ul>'
27
- :t8table: 'Concept <b><%=text1%></b><br/>Complétez l'association suivante\:<br/><ul><li><%=text2%>\: "<%=text3%>"</li><li><%=text4%>\: [*]</li></ul>Écrire un mot.<br/>'
28
- :t9table: 'Concept <b><%=text1%></b><br/>Complétez l'association suivante\:<br/><ul><li><%=text2%>\: "<%=text3%>"</li><li><%=text4%>\: <%=text5%></li></ul>Écrire<%=text6%> mots.<br/>'
29
- :code1: '<pre><%=text1%></pre><br/><p>Écrire le numéro de ligne où se trouve la première erreur. Écrire 0 s'il n'y a aucune erreur.</p>'
data/lib/asker/project.rb DELETED
@@ -1,172 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'singleton'
4
- require 'rainbow'
5
- require 'fileutils'
6
- require_relative 'application'
7
- require_relative 'logger'
8
-
9
- # Contains Project data and methods
10
- class Project
11
- include Singleton
12
- attr_reader :default, :param
13
-
14
- ##
15
- # Initialize
16
- def initialize
17
- reset
18
- end
19
-
20
- ##
21
- # Reset project params
22
- def reset
23
- @default = { inputbasedir: FileUtils.pwd,
24
- outputdir: 'output',
25
- category: :none,
26
- formula_weights: [1, 1, 1],
27
- lang: 'en',
28
- locales: %w[en es javascript math python ruby sql],
29
- show_mode: :default,
30
- verbose: true,
31
- stages: { d: true, b: true, f: true, i: true, s: true, t: true },
32
- threshold: 0.5,
33
- color_output: true }
34
- @param = {}
35
- end
36
-
37
- ##
38
- # Get value param
39
- # @param key (Symbol) key
40
- def get(key)
41
- return @param[key] unless @param[key].nil?
42
-
43
- @default[key]
44
- end
45
-
46
- ##
47
- # Set value param
48
- # @param key (Symbol) key
49
- # @param value (String) value
50
- def set(key, value)
51
- @param[key] = value
52
- end
53
-
54
- ##
55
- # Open new project
56
- # * setting new params and
57
- # * creating output files
58
- # IMPORTANT: We need at least theses values
59
- # * process_file
60
- # * inputdirs
61
- def open
62
- ext = '.haml'
63
- @param[:process_file] = @param[:process_file] ||
64
- get(:projectdir).split(File::SEPARATOR).last + ext
65
- @param[:projectname] = @param[:projectname] ||
66
- File.basename(@param[:process_file], ext)
67
- @param[:inputdirs] = @param[:inputdirs] ||
68
- File.join(get(:inputbasedir), @param[:projectdir])
69
-
70
- @param[:logname] = @param[:logname] ||
71
- "#{@param[:projectname]}-log.txt"
72
- @param[:outputname] = @param[:outputname] ||
73
- "#{@param[:projectname]}-gift.txt"
74
- @param[:lessonname] = @param[:lessonname] ||
75
- "#{@param[:projectname]}-doc.txt"
76
- @param[:yamlname] = @param[:yamlname] ||
77
- "#{@param[:projectname]}.yaml"
78
-
79
- @param[:logpath] = @param[:logpath] ||
80
- File.join(get(:outputdir), @param[:logname])
81
- @param[:outputpath] = @param[:outputpath] ||
82
- File.join(get(:outputdir), @param[:outputname])
83
- @param[:lessonpath] = @param[:lessonpath] ||
84
- File.join(get(:outputdir), @param[:lessonname])
85
- @param[:yamlpath] = @param[:yamlpath] ||
86
- File.join(get(:outputdir), @param[:yamlname])
87
-
88
- Dir.mkdir(get(:outputdir)) unless Dir.exist?(get(:outputdir))
89
- create_log_file
90
- create_output_file
91
- create_lesson_file
92
- create_yaml_file
93
- end
94
-
95
- ##
96
- # Close output files
97
- def close
98
- get(:logfile).close
99
- get(:outputfile).close
100
- get(:lessonfile).close
101
- get(:yamlfile).close
102
- end
103
-
104
- ##
105
- # Display and log text
106
- def verbose(msg)
107
- puts msg if get(:verbose)
108
- get(:logfile).write(msg.to_s + "\n") if get(:logfile)
109
- raise "verbose"
110
- end
111
-
112
- ##
113
- # Display and log text line
114
- def verboseln(msg)
115
- verbose(msg + "\n")
116
- end
117
-
118
- def method_missing(method, *_args, &_block)
119
- get(method)
120
- end
121
-
122
- private
123
-
124
- # create or reset logfile
125
- def create_log_file
126
- @param[:logfile] = File.open(get(:logpath), 'w')
127
- f = get(:logfile)
128
- f.write('=' * 50 + "\n")
129
- f.write("Created by : #{Application::NAME}")
130
- f.write(" (version #{Application::VERSION})\n")
131
- f.write("File : #{get(:logname)}\n")
132
- f.write("Time : #{Time.new}\n")
133
- f.write("Author : David Vargas Ruiz\n")
134
- f.write('=' * 50 + "\n\n")
135
-
136
- Logger.verbose '[INFO] Project open'
137
- Logger.verbose ' ├── inputdirs = ' + Rainbow(get(:inputdirs)).bright
138
- Logger.verbose ' └── process_file = ' + Rainbow(get(:process_file)).bright
139
- end
140
-
141
- # Create or reset output file
142
- def create_output_file
143
- @param[:outputfile] = File.open(get(:outputpath), 'w')
144
- f = get(:outputfile)
145
- f.write('// ' + ('=' * 50) + "\n")
146
- f.write("// Created by : #{Application::NAME}")
147
- f.write(" (version #{Application::VERSION})\n")
148
- f.write("// File : #{get(:outputname)}\n")
149
- f.write("// Time : #{Time.new}\n")
150
- f.write("// Author : David Vargas Ruiz\n")
151
- f.write('// ' + ('=' * 50) + "\n\n")
152
- f.write("$CATEGORY: $course$/#{get(:category)}\n") unless get(:category) == :none
153
- end
154
-
155
- # Create or reset lesson file
156
- def create_lesson_file
157
- @param[:lessonfile] = File.new(get(:lessonpath), 'w')
158
- f = get(:lessonfile)
159
- f.write('=' * 50 + "\n")
160
- f.write("Created by : #{Application::NAME}")
161
- f.write(" (version #{Application::VERSION})\n")
162
- f.write("File : #{get(:lessonname)}\n")
163
- f.write("Time : #{Time.new}\n")
164
- f.write("Author : David Vargas Ruiz\n")
165
- f.write('=' * 50 + "\n")
166
- end
167
-
168
- # Create or reset yaml file
169
- def create_yaml_file
170
- @param[:yamlfile] = File.open(get(:yamlpath), 'w')
171
- end
172
- end