mumuki-laboratory 7.12.3 → 8.1.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (77) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/javascripts/mumuki_laboratory/application/bridge.js +1 -1
  3. data/app/assets/javascripts/mumuki_laboratory/application/button.js +2 -2
  4. data/app/assets/javascripts/mumuki_laboratory/application/codemirror-builder.js +2 -2
  5. data/app/assets/javascripts/mumuki_laboratory/application/codemirror.js +5 -5
  6. data/app/assets/javascripts/mumuki_laboratory/application/console.js +2 -2
  7. data/app/assets/javascripts/mumuki_laboratory/application/discussions.js +7 -7
  8. data/app/assets/javascripts/mumuki_laboratory/application/editors.js +1 -1
  9. data/app/assets/javascripts/mumuki_laboratory/application/elipsis.js +1 -1
  10. data/app/assets/javascripts/mumuki_laboratory/application/events.js +2 -2
  11. data/app/assets/javascripts/mumuki_laboratory/application/exercise.js +2 -2
  12. data/app/assets/javascripts/mumuki_laboratory/application/gamification.js +13 -3
  13. data/app/assets/javascripts/mumuki_laboratory/application/inputs.js +1 -1
  14. data/app/assets/javascripts/mumuki_laboratory/application/kids.js +4 -4
  15. data/app/assets/javascripts/mumuki_laboratory/application/kindergarten.js +7 -7
  16. data/app/assets/javascripts/mumuki_laboratory/application/messages.js +6 -6
  17. data/app/assets/javascripts/mumuki_laboratory/application/mu-modal-carrousel.js +1 -1
  18. data/app/assets/javascripts/mumuki_laboratory/application/multiple-choice.js +1 -1
  19. data/app/assets/javascripts/mumuki_laboratory/application/multiple-files.js +3 -3
  20. data/app/assets/javascripts/mumuki_laboratory/application/multiple-scenarios.js +1 -1
  21. data/app/assets/javascripts/mumuki_laboratory/application/pin.js +1 -1
  22. data/app/assets/javascripts/mumuki_laboratory/application/primary.js +1 -1
  23. data/app/assets/javascripts/mumuki_laboratory/application/progress.js +1 -1
  24. data/app/assets/javascripts/mumuki_laboratory/application/results-renderer.js +1 -1
  25. data/app/assets/javascripts/mumuki_laboratory/application/speech-bubble-renderer.js +4 -4
  26. data/app/assets/javascripts/mumuki_laboratory/application/submission.js +2 -2
  27. data/app/assets/javascripts/mumuki_laboratory/application/submissions-store.js +3 -3
  28. data/app/assets/javascripts/mumuki_laboratory/application/sync-mode.js +2 -2
  29. data/app/assets/javascripts/mumuki_laboratory/application/timer.js +1 -1
  30. data/app/assets/stylesheets/mumuki_laboratory/application/_layout.scss +7 -7
  31. data/app/assets/stylesheets/mumuki_laboratory/application/modules/_terms.scss +9 -12
  32. data/app/controllers/api/courses_controller.rb +1 -2
  33. data/app/controllers/api/organizations_controller.rb +2 -3
  34. data/app/controllers/api/users_controller.rb +2 -4
  35. data/app/controllers/application_controller.rb +41 -8
  36. data/app/controllers/assets_controller.rb +1 -0
  37. data/app/controllers/book_discussions_controller.rb +1 -1
  38. data/app/controllers/chapters_controller.rb +1 -0
  39. data/app/controllers/concerns/with_user_discussion_validation.rb +6 -0
  40. data/app/controllers/discussions_controller.rb +4 -6
  41. data/app/controllers/exercises_controller.rb +1 -0
  42. data/app/controllers/guides_controller.rb +2 -0
  43. data/app/controllers/invitations_controller.rb +2 -2
  44. data/app/controllers/lessons_controller.rb +1 -0
  45. data/app/controllers/login_controller.rb +1 -0
  46. data/app/controllers/users_controller.rb +9 -1
  47. data/app/helpers/assistance_box_helper.rb +7 -5
  48. data/app/helpers/links_helper.rb +2 -2
  49. data/app/views/book/show.html.erb +1 -1
  50. data/app/views/exercise_solutions/_assistant_rules_box.html.erb +13 -0
  51. data/app/views/exercise_solutions/_results.html.erb +19 -19
  52. data/app/views/layouts/_copyright.html.erb +1 -1
  53. data/app/views/layouts/_organizations_listing.html.erb +8 -12
  54. data/app/views/layouts/application.html.erb +26 -24
  55. data/app/views/layouts/embedded.html.erb +14 -11
  56. data/app/views/users/_edit_user_form.html.erb +1 -1
  57. data/app/views/users/terms.html.erb +12 -0
  58. data/config/routes.rb +8 -8
  59. data/lib/mumuki/laboratory.rb +18 -5
  60. data/lib/mumuki/laboratory/controllers.rb +2 -0
  61. data/lib/mumuki/laboratory/controllers/action_redirector.rb +21 -0
  62. data/lib/mumuki/laboratory/controllers/immersive_navigation.rb +7 -0
  63. data/lib/mumuki/laboratory/events/events.rb +0 -33
  64. data/lib/mumuki/laboratory/locales/en.yml +0 -1
  65. data/lib/mumuki/laboratory/locales/es-CL.yml +1 -2
  66. data/lib/mumuki/laboratory/locales/es.yml +2 -3
  67. data/lib/mumuki/laboratory/locales/pt.yml +1 -2
  68. data/lib/mumuki/laboratory/version.rb +1 -1
  69. data/spec/capybara_helper.rb +5 -1
  70. data/spec/controllers/discussions_controller_spec.rb +19 -0
  71. data/spec/dummy/db/schema.rb +2 -1
  72. data/spec/features/immersive_redirection_spec.rb +181 -0
  73. data/spec/features/profile_flow_spec.rb +35 -3
  74. data/spec/features/terms_flow_spec.rb +155 -0
  75. metadata +13 -9
  76. data/app/helpers/organization_list_helper.rb +0 -5
  77. data/spec/features/choose_organization_spec.rb +0 -74
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 26c8eb799e96cc5d8e68fc6d5b9ae0e268fcc77fa99156db5051b373b6aee412
4
- data.tar.gz: 4dde09623edc6d26430bbd6bc86bcd6e85347e73bcd444df00d8f7b47274859c
3
+ metadata.gz: 7bcc70727fa140c5ad7c313f8b9e9a5e1f9a9e3b383b1add72556f64d4fed4e3
4
+ data.tar.gz: 874a6b5d2f8a64249560dfb11f9f743d6f11267e8c73602e0d53abacb8e9c651
5
5
  SHA512:
6
- metadata.gz: efef98352ef78664e8aac7493a70546b824b54e97ed556d18ae1068c532564dcf509f2878e2c8105d9e5a0e318222b3aa0b1894d43fe2d1d48da397137ea6329
7
- data.tar.gz: fb241340ebe7994e84ab86c08275304c74cd5669bbc2ca3b7c8bcf616d1186b088ecd3da59fe8abb80b65a1f9dfd8538eccbf31cba4f55dbd83f7a2838601911
6
+ metadata.gz: 6c9b7889090c806dd880c5cd9d2730117d2d4927ef18765582b0d79010463f4596bdcf8f65f297b95e0bcec238ec7e36311bffe889d29460191cd79e929afdfb
7
+ data.tar.gz: 2304d78fabb8a5268fb33f79737480d94550fdc22c9a94f9cd65f70ca02ed1e2dbb7d78089690503a85b99ec88dd845a70678970997a3bba4a3c644b2e90276e
@@ -113,7 +113,7 @@ mumuki.bridge = (() => {
113
113
  * @returns {SubmissionResult}
114
114
  */
115
115
  _preRenderResult(result) {
116
- result.class_for_progress_list_item = mumuki.renderers.progressListItemClassForStatus(result.status, true)
116
+ result.class_for_progress_list_item = mumuki.renderers.progressListItemClassForStatus(result.status, true);
117
117
  return result;
118
118
  }
119
119
  }
@@ -36,7 +36,7 @@ mumuki.Button = class {
36
36
  e.preventDefault();
37
37
  main();
38
38
  };
39
- this.$button.on('click', this.main)
39
+ this.$button.on('click', this.main);
40
40
  }
41
41
 
42
42
  // ==============
@@ -80,7 +80,7 @@ mumuki.Button = class {
80
80
 
81
81
  this.enable();
82
82
 
83
- this.$button.on('click', this.main)
83
+ this.$button.on('click', this.main);
84
84
  }
85
85
 
86
86
  // =============
@@ -38,7 +38,7 @@
38
38
  mumuki.editor.toggleFullscreen();
39
39
  },
40
40
  'Tab': function (cm) {
41
- mumuki.editor.indentWithSpaces(cm)
41
+ mumuki.editor.indentWithSpaces(cm);
42
42
  }
43
43
  }
44
44
  });
@@ -53,7 +53,7 @@
53
53
  'Cmd-Enter': submitMessage,
54
54
  'Ctrl-Enter': submitMessage,
55
55
  'Tab': function (cm) {
56
- mumuki.editor.indentWithSpaces(cm)
56
+ mumuki.editor.indentWithSpaces(cm);
57
57
  }
58
58
  }
59
59
  });
@@ -23,14 +23,14 @@ mumuki.page.editors = [];
23
23
  function resetEditor() {
24
24
  mumuki.page.dynamicEditors.forEach(function (e) {
25
25
  setDefaultContent(e, $('#default_content').val());
26
- })
26
+ });
27
27
  }
28
28
 
29
29
  function formatContent() {
30
30
  mumuki.page.editors.each(function (_, editor) {
31
- editor.setSelection({line: 0, ch: 0}, {line: editor.lineCount()})
32
- editor.indentSelection("smart")
33
- editor.setSelection({line: 0})
31
+ editor.setSelection({line: 0, ch: 0}, {line: editor.lineCount()});
32
+ editor.indentSelection("smart");
33
+ editor.setSelection({line: 0});
34
34
  });
35
35
  }
36
36
 
@@ -56,7 +56,7 @@ mumuki.page.editors = [];
56
56
  if (language !== undefined) {
57
57
  mumuki.page.dynamicEditors.forEach(function (e) {
58
58
  setEditorLanguage(e, language);
59
- })
59
+ });
60
60
  }
61
61
  }
62
62
 
@@ -32,7 +32,7 @@
32
32
  function clearConsole() {
33
33
  $('.jquery-console-message-error').remove();
34
34
  $('.jquery-console-message-value').remove();
35
- $('.jquery-console-prompt-box:not(:last)').remove()
35
+ $('.jquery-console-prompt-box:not(:last)').remove();
36
36
  }
37
37
 
38
38
  class QueryConsole {
@@ -134,7 +134,7 @@
134
134
  url: self._requestUrl,
135
135
  type: 'POST',
136
136
  data: self._requestData
137
- })
137
+ });
138
138
  }
139
139
  get _requestUrl() {
140
140
  return this.console.endpoint;
@@ -34,33 +34,33 @@ mumuki.load(() => {
34
34
  },
35
35
  token: new mumuki.CsrfToken(),
36
36
  tokenRequest: function (data) {
37
- return $.ajax(Forum.token.newRequest(data))
37
+ return $.ajax(Forum.token.newRequest(data));
38
38
  },
39
39
  discussionPost: function (url) {
40
40
  return Forum.tokenRequest({
41
41
  url: url,
42
42
  method: 'POST',
43
43
  xhrFields: {withCredentials: true}
44
- })
44
+ });
45
45
  },
46
46
  discussionSubscription: function (url) {
47
- Forum.discussionPostAndToggle(url, $subscriptionSpans)
47
+ Forum.discussionPostAndToggle(url, $subscriptionSpans);
48
48
  },
49
49
  discussionUpvote: function (url) {
50
- Forum.discussionPostAndToggle(url, $upvoteSpans)
50
+ Forum.discussionPostAndToggle(url, $upvoteSpans);
51
51
  },
52
52
  discussionPostAndToggle: function (url, elem) {
53
- Forum.discussionPost(url).done(Forum.toggleButton(elem))
53
+ Forum.discussionPost(url).done(Forum.toggleButton(elem));
54
54
  },
55
55
  discussionMessageToggleApprove: function (url, elem) {
56
56
  Forum.discussionPost(url).done(function () {
57
57
  elem.toggleClass("selected");
58
- })
58
+ });
59
59
  },
60
60
  discussionMessageToggleNotActuallyAQuestion: function (url, elem) {
61
61
  Forum.discussionPost(url).done(function () {
62
62
  elem.toggleClass("selected");
63
- })
63
+ });
64
64
  },
65
65
  discussionsToggleCheckbox: function (elem) {
66
66
  const key = elem.attr('name');
@@ -99,6 +99,6 @@ mumuki.editors = {
99
99
  * @param {CustomEditorSource} source
100
100
  */
101
101
  addCustomSource(source) {
102
- mumuki.CustomEditor.addSource(source)
102
+ mumuki.CustomEditor.addSource(source);
103
103
  }
104
104
  };
@@ -21,7 +21,7 @@ mumuki.elipsis = (() => {
21
21
  $elipsis.each((it, e) => {
22
22
  let $e = $(e);
23
23
  $e.html(mumuki.elipsis($e.html()));
24
- })
24
+ });
25
25
  };
26
26
 
27
27
  mumuki.load(() => {
@@ -34,7 +34,7 @@ mumuki.events = {
34
34
  */
35
35
  fire(eventName, value = null) {
36
36
  if (this._handlers[eventName]) {
37
- this._handlers[eventName].forEach(it => it(value))
37
+ this._handlers[eventName].forEach(it => it(value));
38
38
  }
39
39
  },
40
40
 
@@ -48,4 +48,4 @@ mumuki.events = {
48
48
  this._handlers[eventName] = [];
49
49
  }
50
50
  }
51
- }
51
+ };
@@ -63,6 +63,6 @@ mumuki.exercise = {
63
63
  this._current = null;
64
64
  }
65
65
  }
66
- }
66
+ };
67
67
 
68
- mumuki.load(() => mumuki.exercise.load())
68
+ mumuki.load(() => mumuki.exercise.load());
@@ -108,12 +108,22 @@ mumuki.gamification = (() => {
108
108
  }
109
109
 
110
110
  updateLevel() {
111
- const $muLevelProgress = $('#mu-level-progress');
112
-
113
111
  $('#mu-solve-more-exercises span').text(this.exercisesToNextLevel());
114
112
  $('.mu-level-number').html(this.currentLevel());
115
- $('.mu-level-tooltip').attr("title", (_, value) => `${value} ${this.currentLevel()}`);
116
113
 
114
+ this.updateTooltip();
115
+ this.animateProgressIfAny();
116
+ }
117
+
118
+ updateTooltip() {
119
+ const $muLevelTooltip = $('.mu-level-tooltip');
120
+
121
+ $muLevelTooltip.attr("data-original-title", `${$muLevelTooltip.attr("level")} ${this.currentLevel()}`);
122
+ $muLevelTooltip.attr("title", "");
123
+ }
124
+
125
+ animateProgressIfAny() {
126
+ const $muLevelProgress = $('#mu-level-progress');
117
127
  if (this.currentLevelProgress() === 0) {
118
128
  $muLevelProgress.attr("display", "none");
119
129
  }
@@ -7,7 +7,7 @@ mumuki.onInputsReady = (() => {
7
7
  if ($(inputsSelector).length === 0) return;
8
8
 
9
9
  callback(event);
10
- })
10
+ });
11
11
  }
12
12
 
13
13
  return onInputsReady;
@@ -61,11 +61,11 @@ mumuki.Kids = class {
61
61
  // ==================
62
62
 
63
63
  _showSuccessPopup() {
64
- this._mustImplementThisMethod()
64
+ this._mustImplementThisMethod();
65
65
  }
66
66
 
67
67
  _showFailurePopup() {
68
- this._mustImplementThisMethod()
68
+ this._mustImplementThisMethod();
69
69
  }
70
70
 
71
71
  // ====================
@@ -141,7 +141,7 @@ mumuki.Kids = class {
141
141
  // ============
142
142
 
143
143
  _mustImplementThisMethod() {
144
- throw new Error('TODO: implement method')
144
+ throw new Error('TODO: implement method');
145
145
  }
146
146
 
147
147
  // ============
@@ -214,4 +214,4 @@ mumuki.Kids = class {
214
214
  $blockSvg.height($blocks.height());
215
215
  }
216
216
 
217
- }
217
+ };
@@ -103,27 +103,27 @@ mumuki.load(() => {
103
103
  this._action('play', 'stop', true, (speech) => {
104
104
  mumuki.presenterCharacter.playAnimation('talk', mumuki.kids.$bubbleCharacterAnimation);
105
105
  speech.speak(msg);
106
- })
106
+ });
107
107
  },
108
108
  stop() {
109
- this._action('stop', 'play', false, (speech) => speech.cancel())
109
+ this._action('stop', 'play', false, (speech) => speech.cancel());
110
110
  },
111
111
  _action(add, remove, isPlaying, callback) {
112
112
  callback(window.speechSynthesis);
113
- const $button = $('.mu-kindergarten-play-description')
113
+ const $button = $('.mu-kindergarten-play-description');
114
114
  $button.find(`.mu-kindergarten-${add}`).addClass('hidden');
115
115
  $button.find(`.mu-kindergarten-${remove}`).removeClass('hidden');
116
116
  this._isPlaying = isPlaying;
117
117
  },
118
118
  verifyBrowserSupport() {
119
119
  if (!window.speechSynthesis) {
120
- const $button = $('.mu-kindergarten-play-description')
120
+ const $button = $('.mu-kindergarten-play-description');
121
121
  $button.prop('disabled', true);
122
122
  $button.css('cursor', 'not-allowed');
123
- this._action('play', 'stop', false)
123
+ this._action('play', 'stop', false);
124
124
  }
125
125
  }
126
- }
126
+ };
127
127
 
128
128
  }
129
129
 
@@ -143,7 +143,7 @@ mumuki.load(() => {
143
143
  const $hintMedia = $('.mu-kindergarten-hint-media');
144
144
  if (!$hintMedia.get(0)) $button.addClass('hidden');
145
145
  },
146
- }
146
+ };
147
147
  }
148
148
 
149
149
  get context() {
@@ -1,7 +1,7 @@
1
1
  mumuki.load(() => {
2
2
  var Chat = {
3
3
  $body: function () {
4
- return $('body')
4
+ return $('body');
5
5
  },
6
6
  $newMessageModal: function () {
7
7
  return $('.new-message-modal');
@@ -18,7 +18,7 @@ mumuki.load(() => {
18
18
  $('.notifications-box').toggleClass('notifications-box-empty', !data.has_messages);
19
19
  $('.pending-messages-filter').removeClass('pending-messages-filter');
20
20
  $('button.btn-submit').removeClass('disabled');
21
- $('.pending-messages-text').remove()
21
+ $('.pending-messages-text').remove();
22
22
  },
23
23
  readMessages: function (url) {
24
24
  Chat.tokenRequest({
@@ -26,10 +26,10 @@ mumuki.load(() => {
26
26
  method: 'POST',
27
27
  success: Chat.setMessages,
28
28
  xhrFields: {withCredentials: true}
29
- })
29
+ });
30
30
  },
31
31
  tokenRequest: function (data) {
32
- $.ajax(Chat.token.newRequest(data))
32
+ $.ajax(Chat.token.newRequest(data));
33
33
  },
34
34
  getMessages: function () {
35
35
  if ($('.badge-messages').length == 0) {
@@ -74,7 +74,7 @@ mumuki.load(() => {
74
74
  success: success,
75
75
  error: error,
76
76
  xhrFields: {withCredentials: true}
77
- })
77
+ });
78
78
  },
79
79
  openNewMessageModal: function () {
80
80
  Chat.$newMessageModal().modal({backdrop: false, keyboard: false});
@@ -89,5 +89,5 @@ mumuki.load(() => {
89
89
  Chat.setMessagesInterval();
90
90
  mumuki.Chat = Chat;
91
91
 
92
- })
92
+ });
93
93
 
@@ -41,7 +41,7 @@ mumuki.ModalCarrousel = (() => {
41
41
 
42
42
  _hidePreviousButtonIfFirstSlide() {
43
43
  const $prev = $('.mu-kids-modal-button.mu-previous');
44
- this._addClassIf($prev, 'hidden', () => this._activeSlide().is(':first-child'))
44
+ this._addClassIf($prev, 'hidden', () => this._activeSlide().is(':first-child'));
45
45
  }
46
46
 
47
47
  _showFirstSlide() {
@@ -1,7 +1,7 @@
1
1
  mumuki.load(() => {
2
2
  function dumpChoices(_evt) {
3
3
  var indexes = $('.solution-choice:checked').map(function () {
4
- return $(this).data('index')
4
+ return $(this).data('index');
5
5
  }).get().join(':');
6
6
  $('#solution_content').attr('value', indexes);
7
7
  }
@@ -103,11 +103,11 @@ mumuki.load(() => {
103
103
  }
104
104
 
105
105
  get highlightModes() {
106
- return this._getDataFromHiddenInput('#highlight-modes')
106
+ return this._getDataFromHiddenInput('#highlight-modes');
107
107
  }
108
108
 
109
109
  get locales() {
110
- return this._getDataFromHiddenInput('#multifile-locales')
110
+ return this._getDataFromHiddenInput('#multifile-locales');
111
111
  }
112
112
 
113
113
  setUpAddFile() {
@@ -131,7 +131,7 @@ mumuki.load(() => {
131
131
 
132
132
  this._setVisibility(this._addFileButton, filesCount < this.MAX_TABS);
133
133
  this.files.toArray().forEach(file => {
134
- this._setVisibility(file.deleteButton, file.name !== this.mainFile && filesCount > 1)
134
+ this._setVisibility(file.deleteButton, file.name !== this.mainFile && filesCount > 1);
135
135
  });
136
136
  }
137
137
 
@@ -73,7 +73,7 @@ mumuki.MultipleScenarios = (() => {
73
73
  if (this.validScenarioIndex(newScenarioIndex)) {
74
74
  this.setActiveIndex(newScenarioIndex);
75
75
  }
76
- })
76
+ });
77
77
  }
78
78
 
79
79
  createControls () {
@@ -11,5 +11,5 @@ mumuki.pin = (() => {
11
11
  smoothScrollToElement(scrollPin);
12
12
  }
13
13
  }
14
- }
14
+ };
15
15
  })();
@@ -83,7 +83,7 @@ mumuki.load(() => {
83
83
  this._$texts.hide();
84
84
  this.$characterSpeechBubbleNormal.children('.' + $tab.data('target')).show();
85
85
  this._updateSpeechParagraphs();
86
- })
86
+ });
87
87
  }
88
88
  });
89
89
 
@@ -17,7 +17,7 @@ mumuki.progress = (() => {
17
17
  function updateWholeProgressBar(f) {
18
18
  $('.progress-list-item').each((_, it) => {
19
19
  const $anchor = $(it);
20
- $anchor.attr('class', f($anchor))
20
+ $anchor.attr('class', f($anchor));
21
21
  });
22
22
  }
23
23
 
@@ -49,7 +49,7 @@ mumuki.renderers.results = (() => {
49
49
  classForStatus,
50
50
  iconForStatus,
51
51
  progressListItemClassForStatus
52
- }
52
+ };
53
53
  })();
54
54
 
55
55
  /** @deprecated use {@code mumuki.renderers.results.classForStatus} instead */
@@ -20,7 +20,7 @@ mumuki.renderers.speechBubble = (()=> {
20
20
 
21
21
  _chooseResultItem() {
22
22
  if (this._responseStatus() !== 'passed' && this._hasTips()) {
23
- this._appendFirstTip()
23
+ this._appendFirstTip();
24
24
  } else if (this._responseStatus() === 'failed') {
25
25
  this._appendFirstFailedTestResultSummary();
26
26
  } else if (this._responseStatus() === 'passed_with_warnings') {
@@ -29,7 +29,7 @@ mumuki.renderers.speechBubble = (()=> {
29
29
  }
30
30
 
31
31
  _appendFirstFailedTestResultSummary() {
32
- const failedTestResult = this._failedTestResults()[0]
32
+ const failedTestResult = this._failedTestResults()[0];
33
33
  if (failedTestResult && failedTestResult.summary) {
34
34
  this._appendResultItem(mumuki.renderers.renderSpeechBubbleResultItem(failedTestResult.summary));
35
35
  }
@@ -67,7 +67,7 @@ mumuki.renderers.speechBubble = (()=> {
67
67
  }
68
68
 
69
69
  _hasTips() {
70
- return this.responseData.tips && this.responseData.tips.length
70
+ return this.responseData.tips && this.responseData.tips.length;
71
71
  }
72
72
 
73
73
  _failedTestResults() {
@@ -97,7 +97,7 @@ mumuki.renderers.speechBubble = (()=> {
97
97
  return {
98
98
  SpeechBubbleRenderer,
99
99
  renderSpeechBubbleResultItem
100
- }
100
+ };
101
101
  })();
102
102
 
103
103
  /** @deprecated use {@code mumuki.renderers.speechBubble.SpeechBubbleRenderer} instead */