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.
- checksums.yaml +4 -4
- data/README.md +13 -17
- data/bin/asker +2 -1
- data/lib/asker/ai/ai.rb +10 -3
- data/lib/asker/ai/ai_calculate.rb +20 -6
- data/lib/asker/ai/code/base_code_ai.rb +104 -0
- data/lib/asker/{code/ai → ai/code}/code_ai_factory.rb +11 -1
- data/lib/asker/{code/ai → ai/code}/javascript_code_ai.rb +2 -5
- data/lib/asker/ai/code/problem_code_ai.rb +176 -0
- data/lib/asker/{code/ai → ai/code}/python_code_ai.rb +2 -5
- data/lib/asker/{code/ai → ai/code}/ruby_code_ai.rb +14 -7
- data/lib/asker/{code/ai → ai/code}/sql_code_ai.rb +2 -5
- data/lib/asker/ai/concept_ai.rb +13 -3
- data/lib/asker/ai/question.rb +28 -6
- data/lib/asker/ai/stages/base_stage.rb +45 -6
- data/lib/asker/ai/stages/stage_b.rb +100 -50
- data/lib/asker/ai/stages/stage_d.rb +75 -90
- data/lib/asker/ai/stages/stage_f.rb +64 -36
- data/lib/asker/ai/stages/stage_i.rb +79 -92
- data/lib/asker/ai/stages/stage_s.rb +41 -36
- data/lib/asker/ai/stages/stage_t.rb +149 -108
- data/lib/asker/application.rb +19 -11
- data/lib/asker/cli.rb +31 -44
- data/lib/asker/data/code.rb +62 -0
- data/lib/asker/data/column.rb +31 -21
- data/lib/asker/data/concept.rb +109 -65
- data/lib/asker/data/data_field.rb +14 -0
- data/lib/asker/data/project_data.rb +63 -0
- data/lib/asker/data/row.rb +75 -52
- data/lib/asker/data/table.rb +91 -42
- data/lib/asker/data/template.rb +3 -1
- data/lib/asker/data/world.rb +51 -35
- data/lib/asker/displayer/code_displayer.rb +7 -0
- data/lib/asker/displayer/concept_ai_displayer.erb +10 -0
- data/lib/asker/displayer/concept_ai_displayer.rb +74 -53
- data/lib/asker/displayer/concept_displayer.rb +16 -9
- data/lib/asker/displayer/stats_displayer.rb +12 -3
- data/lib/asker/exporter/concept_ai_gift_exporter.rb +19 -11
- data/lib/asker/exporter/concept_ai_moodle_exporter.rb +44 -0
- data/lib/asker/exporter/concept_ai_yaml_exporter.rb +13 -6
- data/lib/asker/exporter/concept_doc_exporter.rb +14 -1
- data/lib/asker/exporter/data_gift_exporter.rb +29 -0
- data/lib/asker/exporter/output_file_exporter.rb +9 -6
- data/lib/asker/files/{config.ini → asker.ini} +48 -1
- data/lib/asker/files/example-concept.haml +0 -1
- data/lib/asker/files/language/du/connectors.yaml +81 -0
- data/lib/asker/{lang/locales/fr → files/language/du}/mistakes.yaml +1 -1
- data/lib/asker/files/language/du/templates.yaml +29 -0
- data/lib/asker/{lang/locales → files/language}/en/connectors.yaml +0 -0
- data/lib/asker/{lang/locales → files/language}/en/mistakes.yaml +0 -0
- data/lib/asker/files/language/en/templates.yaml +29 -0
- data/lib/asker/{lang/locales → files/language}/es/connectors.yaml +0 -0
- data/lib/asker/files/language/es/mistakes.yaml +84 -0
- data/lib/asker/files/language/es/templates.yaml +29 -0
- data/lib/asker/files/language/fr/connectors.yaml +76 -0
- data/lib/asker/{lang/locales/es → files/language/fr}/mistakes.yaml +0 -0
- data/lib/asker/files/language/fr/templates.yaml +29 -0
- data/lib/asker/{lang/locales → files/language}/javascript/connectors.yaml +0 -0
- data/lib/asker/{lang/locales → files/language}/javascript/mistakes.yaml +0 -0
- data/lib/asker/{lang/locales → files/language}/javascript/templates.yaml +0 -0
- data/lib/asker/{lang/locales → files/language}/math/connectors.yaml +0 -0
- data/lib/asker/{lang/locales → files/language}/math/mistakes.yaml +0 -0
- data/lib/asker/{lang/locales → files/language}/math/templates.yaml +0 -0
- data/lib/asker/{lang/locales → files/language}/python/connectors.yaml +0 -0
- data/lib/asker/{lang/locales → files/language}/python/mistakes.yaml +0 -0
- data/lib/asker/{lang/locales → files/language}/python/templates.yaml +0 -0
- data/lib/asker/{lang/locales → files/language}/ruby/connectors.yaml +0 -0
- data/lib/asker/{lang/locales → files/language}/ruby/mistakes.yaml +0 -0
- data/lib/asker/{lang/locales → files/language}/ruby/templates.yaml +0 -0
- data/lib/asker/{lang/locales → files/language}/sql/connectors.yaml +0 -0
- data/lib/asker/{lang/locales → files/language}/sql/mistakes.yaml +0 -0
- data/lib/asker/{lang/locales → files/language}/sql/templates.yaml +0 -0
- data/lib/asker/formatter/concept_doc_formatter.rb +0 -4
- data/lib/asker/formatter/concept_string_formatter.rb +7 -4
- data/lib/asker/formatter/moodle/matching.erb +38 -0
- data/lib/asker/formatter/moodle/multichoice.erb +49 -0
- data/lib/asker/formatter/moodle/shortanswer.erb +30 -0
- data/lib/asker/formatter/moodle/truefalse.erb +47 -0
- data/lib/asker/formatter/question_gift_formatter.rb +30 -20
- data/lib/asker/formatter/question_moodle_formatter.rb +27 -0
- data/lib/asker/{checker.rb → input_checker.rb} +126 -49
- data/lib/asker/lang/lang.rb +17 -10
- data/lib/asker/lang/lang_factory.rb +32 -5
- data/lib/asker/lang/text_actions.rb +87 -69
- data/lib/asker/loader/code_loader.rb +4 -4
- data/lib/asker/loader/content_loader.rb +21 -19
- data/lib/asker/loader/directory_loader.rb +1 -8
- data/lib/asker/loader/embedded_file.rb +42 -0
- data/lib/asker/loader/file_loader.rb +3 -14
- data/lib/asker/loader/haml_loader.rb +15 -0
- data/lib/asker/loader/image_url_loader.rb +8 -12
- data/lib/asker/loader/input_loader.rb +13 -15
- data/lib/asker/loader/project_loader.rb +25 -15
- data/lib/asker/logger.rb +36 -9
- data/lib/asker/skeleton.rb +23 -13
- data/lib/asker.rb +76 -42
- metadata +53 -54
- data/lib/asker/code/ai/base_code_ai.rb +0 -48
- data/lib/asker/code/code.rb +0 -53
- data/lib/asker/lang/locales/du/templates.yaml +0 -50
- data/lib/asker/lang/locales/en/templates.yaml +0 -29
- data/lib/asker/lang/locales/es/templates.yaml +0 -29
- data/lib/asker/lang/locales/fr/connectors.yaml +0 -92
- data/lib/asker/lang/locales/fr/templates.yaml +0 -29
- 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
|