mumuki-laboratory 5.4.0 → 5.5.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +1 -1
- data/app/assets/javascripts/application/kids.js +2 -17
- data/app/assets/stylesheets/application/modules/_kids.scss +9 -0
- data/app/controllers/exercise_query_controller.rb +1 -0
- data/app/controllers/exercise_solutions_controller.rb +1 -0
- data/app/controllers/exercise_tries_controller.rb +1 -0
- data/app/controllers/exercises_controller.rb +2 -0
- data/app/models/exercise/challenge.rb +2 -2
- data/app/models/exercise.rb +4 -1
- data/app/views/layouts/_kids.html.erb +1 -1
- data/db/migrate/20180611190239_add_randomizations_to_exercises.rb +5 -0
- data/lib/mumuki/laboratory/controllers/exercise_seed.rb +11 -0
- data/lib/mumuki/laboratory/controllers.rb +1 -0
- data/lib/mumuki/laboratory/version.rb +1 -1
- data/lib/mumuki/laboratory.rb +1 -0
- data/spec/dummy/db/schema.rb +2 -1
- data/spec/features/dynamic_exam_spec.rb +40 -0
- data/spec/models/randomizer_spec.rb +18 -0
- metadata +22 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a40f596693f402240e506ca625b2562809f3d77ccd5422ec322b1b8dd3a0f48c
|
4
|
+
data.tar.gz: 40b3b07e73b77804a1884d8ee6d6ad4d9ca80c636bdabe379411f73d159eb00f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e20ea051587798caeecbb8e774adece970c19d714b39c102505ce52847a2dcd0e5afa5081aebb9c28ad64c4686786ac4e548b4cf3c048af9d2f4e08221cee7f0
|
7
|
+
data.tar.gz: 38f858df0af512db29f1febad4f7fa007395cbf328a7272904585985dbf8ce2e0bde0fe674eb7335b7e983862fda7e160f1a5c5588910805385c138d4d8eaf17
|
data/README.md
CHANGED
@@ -26,7 +26,7 @@ sudo apt-get install autoconf curl git build-essential libssl-dev autoconf bison
|
|
26
26
|
> [rbenv](https://github.com/rbenv/rbenv) is a ruby versions manager, similar to rvm, nvm, and so on.
|
27
27
|
|
28
28
|
```bash
|
29
|
-
curl https://
|
29
|
+
curl -fsSL https://github.com/rbenv/rbenv-installer/raw/master/bin/rbenv-installer | bash
|
30
30
|
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc # or .bash_profile
|
31
31
|
echo 'eval "$(rbenv init -)"' >> ~/.bashrc # or .bash_profile
|
32
32
|
```
|
@@ -43,6 +43,7 @@ mumuki.load(function () {
|
|
43
43
|
var $prevSpeech = $('.mu-kids-character-speech-bubble-normal > .mu-kids-prev-speech').hide();
|
44
44
|
var $nextSpeech = $('.mu-kids-character-speech-bubble-normal > .mu-kids-next-speech');
|
45
45
|
var $speechTabs = $('.mu-kids-character-speech-bubble-tabs > li:not(.separator)');
|
46
|
+
var $defaultSpeechTabName = 'description';
|
46
47
|
var $bubble = $('.mu-kids-character-speech-bubble').children('.mu-kids-character-speech-bubble-normal');
|
47
48
|
var $texts = $bubble.children('.description, .hint');
|
48
49
|
|
@@ -75,7 +76,7 @@ mumuki.load(function () {
|
|
75
76
|
});
|
76
77
|
|
77
78
|
function getSelectedTabName() {
|
78
|
-
return $speechTabs.filter(".active").data('target');
|
79
|
+
return $speechTabs.filter(".active").data('target') || $defaultSpeechTabName;
|
79
80
|
}
|
80
81
|
|
81
82
|
function hideCurrentParagraph() {
|
@@ -102,22 +103,6 @@ mumuki.load(function () {
|
|
102
103
|
if (isVisible) element.show(); else element.hide();
|
103
104
|
}
|
104
105
|
|
105
|
-
function autoScrollBubble(toBottom) {
|
106
|
-
var SCROLL_TIME = 1000;
|
107
|
-
var PAUSE_TIME = 2000;
|
108
|
-
|
109
|
-
setTimeout(function () {
|
110
|
-
$bubble.animate({scrollTop: toBottom ? $bubble.height() : 0}, {
|
111
|
-
duration: SCROLL_TIME,
|
112
|
-
complete: function () {
|
113
|
-
autoScrollBubble(!toBottom);
|
114
|
-
}
|
115
|
-
});
|
116
|
-
}, PAUSE_TIME);
|
117
|
-
}
|
118
|
-
|
119
|
-
autoScrollBubble();
|
120
|
-
|
121
106
|
mumuki.kids = {
|
122
107
|
|
123
108
|
getResultsModal: function () {
|
@@ -117,6 +117,12 @@ $kids-speech-tabs-width: 40px;
|
|
117
117
|
ul {
|
118
118
|
margin: 0;
|
119
119
|
}
|
120
|
+
&.no-tabs {
|
121
|
+
.mu-kids-prev-speech,
|
122
|
+
.mu-kids-next-speech {
|
123
|
+
right: 0px;
|
124
|
+
}
|
125
|
+
}
|
120
126
|
.mu-kids-prev-speech,
|
121
127
|
.mu-kids-next-speech {
|
122
128
|
position: absolute;
|
@@ -191,6 +197,9 @@ $kids-speech-tabs-width: 40px;
|
|
191
197
|
display: flex;
|
192
198
|
align-items: center;
|
193
199
|
padding: 15px 50px 15px 15px;
|
200
|
+
&.no-tabs {
|
201
|
+
padding-right: 25px;
|
202
|
+
}
|
194
203
|
color: #333;
|
195
204
|
border-radius: 10px;
|
196
205
|
background: $kids-speech-background-color;
|
@@ -1,6 +1,7 @@
|
|
1
1
|
class ExerciseSolutionsController < AjaxController
|
2
2
|
include Mumuki::Laboratory::Controllers::NestedInExercise
|
3
3
|
include Mumuki::Laboratory::Controllers::ResultsRendering
|
4
|
+
include Mumuki::Laboratory::Controllers::ExerciseSeed
|
4
5
|
|
5
6
|
before_action :set_messages, only: :create
|
6
7
|
before_action :validate_accessible!, only: :create
|
@@ -1,6 +1,7 @@
|
|
1
1
|
class ExerciseTriesController < AjaxController
|
2
2
|
include Mumuki::Laboratory::Controllers::NestedInExercise
|
3
3
|
include Mumuki::Laboratory::Controllers::ResultsRendering
|
4
|
+
include Mumuki::Laboratory::Controllers::ExerciseSeed
|
4
5
|
|
5
6
|
def create
|
6
7
|
assignment, results = @exercise.submit_try! current_user, try_params
|
@@ -1,4 +1,6 @@
|
|
1
1
|
class ExercisesController < ApplicationController
|
2
|
+
include Mumuki::Laboratory::Controllers::ExerciseSeed
|
3
|
+
|
2
4
|
before_action :set_guide!, only: :show
|
3
5
|
before_action :set_default_content!, only: :show, if: :current_user?
|
4
6
|
before_action :set_assignment!, only: :show, if: :current_user?
|
data/app/models/exercise.rb
CHANGED
@@ -5,7 +5,8 @@ class Exercise < ApplicationRecord
|
|
5
5
|
WithAssignments,
|
6
6
|
FriendlyName,
|
7
7
|
WithLanguage,
|
8
|
-
Assistable
|
8
|
+
Assistable,
|
9
|
+
WithRandomizations
|
9
10
|
|
10
11
|
include Submittable,
|
11
12
|
Questionable
|
@@ -19,6 +20,8 @@ class Exercise < ApplicationRecord
|
|
19
20
|
validates_presence_of :submissions_count,
|
20
21
|
:guide
|
21
22
|
|
23
|
+
randomize :description, :hint, :extra, :test, :default_content
|
24
|
+
|
22
25
|
def console?
|
23
26
|
queriable?
|
24
27
|
end
|
@@ -1,5 +1,5 @@
|
|
1
1
|
<img src="/anim_amarillo.svg" alt="">
|
2
|
-
<div class="mu-kids-character-speech-bubble">
|
2
|
+
<div class="mu-kids-character-speech-bubble <%= 'no-tabs' unless @exercise.hint? %>">
|
3
3
|
<% if @exercise.hint? %>
|
4
4
|
<ul class="mu-kids-character-speech-bubble-tabs">
|
5
5
|
<li class="active" data-target="description" title="<%= t :task %>"><i class="fa fa-fw fa-file-text-o"></i>
|
data/lib/mumuki/laboratory.rb
CHANGED
data/spec/dummy/db/schema.rb
CHANGED
@@ -10,7 +10,7 @@
|
|
10
10
|
#
|
11
11
|
# It's strongly recommended that you check this file into your version control system.
|
12
12
|
|
13
|
-
ActiveRecord::Schema.define(version:
|
13
|
+
ActiveRecord::Schema.define(version: 20180611190239) do
|
14
14
|
|
15
15
|
# These are extensions that must be enabled in order to support this database
|
16
16
|
enable_extension "plpgsql"
|
@@ -138,6 +138,7 @@ ActiveRecord::Schema.define(version: 20180526141344) do
|
|
138
138
|
t.string "initial_state"
|
139
139
|
t.string "final_state"
|
140
140
|
t.text "assistance_rules"
|
141
|
+
t.text "randomizations"
|
141
142
|
t.index ["guide_id"], name: "index_exercises_on_guide_id"
|
142
143
|
t.index ["language_id"], name: "index_exercises_on_language_id"
|
143
144
|
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
feature 'Dynamic Exam', organization_workspace: :test do
|
4
|
+
let(:user) { create(:user, id: 1) }
|
5
|
+
let(:user2) { create(:user, id: 2) }
|
6
|
+
|
7
|
+
let!(:problem) { build(:problem, description: 'do f = $someVariable', randomizations: { someVariable: { type: :oneOf, value: %w(some_string some_other_string)} }) }
|
8
|
+
|
9
|
+
let!(:chapter) {
|
10
|
+
create(:chapter, lessons: [
|
11
|
+
create(:lesson, description: 'An awesome guide', exercises: [
|
12
|
+
problem
|
13
|
+
])
|
14
|
+
]) }
|
15
|
+
|
16
|
+
before { reindex_current_organization! }
|
17
|
+
|
18
|
+
context 'not logged user' do
|
19
|
+
scenario 'visit exercise by slug' do
|
20
|
+
visit "/exercises/#{problem.slug}"
|
21
|
+
|
22
|
+
expect(page).to have_text('do f = some_string')
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
|
27
|
+
context 'logged user' do
|
28
|
+
scenario 'visit exercise by slug' do
|
29
|
+
set_current_user! user
|
30
|
+
visit "/exercises/#{problem.slug}"
|
31
|
+
|
32
|
+
expect(page).to have_text('do f = some_other_string')
|
33
|
+
|
34
|
+
set_current_user! user2
|
35
|
+
visit "/exercises/#{problem.slug}"
|
36
|
+
|
37
|
+
expect(page).to have_text('do f = some_string')
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Mumukit::Randomizer do
|
4
|
+
let(:randomizer) { Mumukit::Randomizer.parse(randomizations) }
|
5
|
+
|
6
|
+
describe '#with_seed' do
|
7
|
+
before { Mumukit::Randomizer::Randomization::Base.any_instance.stub(:modulo) { |_, value, range| value % range.size + range.first } }
|
8
|
+
let(:randomizer) { Mumukit::Randomizer.parse(some_string: { type: :oneOf, value: %w(some string) }, some_number: { type: :range, value: [1, 3] } ) }
|
9
|
+
|
10
|
+
it { expect(randomizer.with_seed 0).to eq([['some_string', 'some'], ['some_number', 2]]) }
|
11
|
+
it { expect(randomizer.with_seed 1).to eq([['some_string', 'string'], ['some_number', 3]]) }
|
12
|
+
it { expect(randomizer.with_seed 2).to eq([['some_string', 'some'], ['some_number', 1]]) }
|
13
|
+
it { expect(randomizer.with_seed 3).to eq([['some_string', 'string'], ['some_number', 2]]) }
|
14
|
+
it { expect(randomizer.with_seed 4).to eq([['some_string', 'some'], ['some_number', 3]]) }
|
15
|
+
it { expect(randomizer.with_seed 5).to eq([['some_string', 'string'], ['some_number', 1]]) }
|
16
|
+
it { expect(randomizer.with_seed 6).to eq([['some_string', 'some'], ['some_number', 2]]) }
|
17
|
+
end
|
18
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mumuki-laboratory
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 5.
|
4
|
+
version: 5.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Franco Bulgarelli
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-07-
|
11
|
+
date: 2018-07-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -164,6 +164,20 @@ dependencies:
|
|
164
164
|
- - "~>"
|
165
165
|
- !ruby/object:Gem::Version
|
166
166
|
version: '0.1'
|
167
|
+
- !ruby/object:Gem::Dependency
|
168
|
+
name: mumukit-randomizer
|
169
|
+
requirement: !ruby/object:Gem::Requirement
|
170
|
+
requirements:
|
171
|
+
- - "~>"
|
172
|
+
- !ruby/object:Gem::Version
|
173
|
+
version: '0.1'
|
174
|
+
type: :runtime
|
175
|
+
prerelease: false
|
176
|
+
version_requirements: !ruby/object:Gem::Requirement
|
177
|
+
requirements:
|
178
|
+
- - "~>"
|
179
|
+
- !ruby/object:Gem::Version
|
180
|
+
version: '0.1'
|
167
181
|
- !ruby/object:Gem::Dependency
|
168
182
|
name: rack
|
169
183
|
requirement: !ruby/object:Gem::Requirement
|
@@ -703,6 +717,7 @@ files:
|
|
703
717
|
- db/migrate/20180326224511_remove_book_ids.rb
|
704
718
|
- db/migrate/20180402015405_remove_course_uid.rb
|
705
719
|
- db/migrate/20180526141344_add_tips_rules_to_exercise.rb
|
720
|
+
- db/migrate/20180611190239_add_randomizations_to_exercises.rb
|
706
721
|
- db/seeds/users.rb
|
707
722
|
- lib/events.rb
|
708
723
|
- lib/mumuki/laboratory.rb
|
@@ -710,6 +725,7 @@ files:
|
|
710
725
|
- lib/mumuki/laboratory/controllers/authorization.rb
|
711
726
|
- lib/mumuki/laboratory/controllers/current_organization.rb
|
712
727
|
- lib/mumuki/laboratory/controllers/dynamic_errors.rb
|
728
|
+
- lib/mumuki/laboratory/controllers/exercise_seed.rb
|
713
729
|
- lib/mumuki/laboratory/controllers/messages.rb
|
714
730
|
- lib/mumuki/laboratory/controllers/nested_in_exercise.rb
|
715
731
|
- lib/mumuki/laboratory/controllers/results_rendering.rb
|
@@ -841,6 +857,7 @@ files:
|
|
841
857
|
- spec/features/chapter_spec.rb
|
842
858
|
- spec/features/choose_organization_spec.rb
|
843
859
|
- spec/features/complements_flow_spec.rb
|
860
|
+
- spec/features/dynamic_exam_spec.rb
|
844
861
|
- spec/features/exams_flow_spec.rb
|
845
862
|
- spec/features/exercise_flow_spec.rb
|
846
863
|
- spec/features/guide_reset_spec.rb
|
@@ -886,6 +903,7 @@ files:
|
|
886
903
|
- spec/models/problem_spec.rb
|
887
904
|
- spec/models/query_spec.rb
|
888
905
|
- spec/models/question_spec.rb
|
906
|
+
- spec/models/randomizer_spec.rb
|
889
907
|
- spec/models/reading_spec.rb
|
890
908
|
- spec/models/solution_spec.rb
|
891
909
|
- spec/models/stats_spec.rb
|
@@ -1022,6 +1040,7 @@ test_files:
|
|
1022
1040
|
- spec/features/chapter_spec.rb
|
1023
1041
|
- spec/features/choose_organization_spec.rb
|
1024
1042
|
- spec/features/complements_flow_spec.rb
|
1043
|
+
- spec/features/dynamic_exam_spec.rb
|
1025
1044
|
- spec/features/exams_flow_spec.rb
|
1026
1045
|
- spec/features/exercise_flow_spec.rb
|
1027
1046
|
- spec/features/guide_reset_spec.rb
|
@@ -1067,6 +1086,7 @@ test_files:
|
|
1067
1086
|
- spec/models/problem_spec.rb
|
1068
1087
|
- spec/models/query_spec.rb
|
1069
1088
|
- spec/models/question_spec.rb
|
1089
|
+
- spec/models/randomizer_spec.rb
|
1070
1090
|
- spec/models/reading_spec.rb
|
1071
1091
|
- spec/models/solution_spec.rb
|
1072
1092
|
- spec/models/stats_spec.rb
|