mumuki-javascript-runner 1.3.3 → 1.6.2

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ec3828b95e23b39b3306bcb2a507cde9acbf3d98d444e9dd5bb95cf3c648a915
4
- data.tar.gz: b286fa2b2764f084c4f1763cfabcace5e4a975403039d40d89ed20adf4872264
3
+ metadata.gz: 20226f79e13d2ab4258f79b40b3fedc4c0cbc95533663170fb1c3c7fdbad9f8f
4
+ data.tar.gz: 9b52ec14fe5153e27cea40130b2a143a6ba9c73c91bb87c5974908ea27404b89
5
5
  SHA512:
6
- metadata.gz: d717df05b3e3dd99882730c368c13a753264d63bd6c8ded6b60eb13f90feef16a301b5ac240b9ac5bc67bb7b812f3222fbdb680b243da3bbc9c397f711b56e3a
7
- data.tar.gz: e27e945d2adbe2720a3204a87f9a70ebc180eb26b2ae61bebb0ed9103dd81af91308529835ee4bd9e82baebe8e8de57d0ae1c56d209427a4ee7caceb285e43af
6
+ metadata.gz: de05d16296a3b89dd7291d623d2fe6f3cead5fa8b577374a5d5e4d3e42626a0794dfb1d4da1a17db2f7878d511841e73802870c20220c7278fb05ee8197cfb43
7
+ data.tar.gz: 5e37e9518248fc5ae9faef8f5337da68cacdfa8287fcb480f3ab911975aa4330ebd30079f2ab189571478e84579ff94a701316018fbe3c8a0dd38b62172ea27c
@@ -0,0 +1,25 @@
1
+ class JavascriptFeedbackHook < Mumukit::Hook
2
+ def run!(request, results)
3
+ content = request.content
4
+ test_results = test_failure_messages results
5
+
6
+ JavascriptExplainer.new.explain(content, test_results)
7
+ end
8
+
9
+ def test_failure_messages(results)
10
+ structured_test_results = results.test_results[0]
11
+ if structured_test_results.is_a? Array
12
+ structured_test_results.select { |it| it[1].failed? }.map { |it| it[2] }.join("\n")
13
+ else
14
+ ''
15
+ end
16
+ end
17
+
18
+ class JavascriptExplainer < Mumukit::Explainer
19
+ def explain_is_not_defined(_, test_results)
20
+ (/([a-zA-Z0-9_]+) is not defined/.match test_results).try do |it|
21
+ {identifier: it[1]}
22
+ end
23
+ end
24
+ end
25
+ end
@@ -1,10 +1,13 @@
1
1
  require 'mumukit'
2
2
 
3
+ I18n.load_translations_path File.join(__dir__, 'locales', '*.yml')
4
+
3
5
  Mumukit.runner_name = 'javascript'
4
6
  Mumukit.configure do |config|
5
7
  config.docker_image = 'mumuki/mumuki-mocha-worker'
6
8
  config.structured = true
7
9
  config.stateful = true
10
+ config.content_type = 'markdown'
8
11
  end
9
12
 
10
13
  require_relative './version'
@@ -12,4 +15,6 @@ require_relative './metadata_hook'
12
15
  require_relative './validation_hook'
13
16
  require_relative './test_hook'
14
17
  require_relative './expectations_hook'
18
+ require_relative './feedback_hook'
15
19
  require_relative './query_hook'
20
+ require_relative './try_hook'
@@ -0,0 +1,2 @@
1
+ en:
2
+ is_not_defined: "it looks like you are using `%{identifier}` but it is not defined. Perhaps you have misspelled it or you need to define it"
@@ -0,0 +1,2 @@
1
+ es:
2
+ is_not_defined: "parece que estás usando `%{identifier}` pero no está definido. ¿Puede que hayas escrito mal su nombre o tengas que definirlo?"
@@ -0,0 +1,2 @@
1
+ pt:
2
+ is_not_defined: "Parece que você usa %{identifier} mas não está indefinido. Você digitou o nome errado ou precisa defini-lo"
@@ -1,18 +1,27 @@
1
1
  class JavascriptQueryHook < Mumukit::Templates::FileHook
2
+ with_error_patterns
2
3
  isolated true
3
4
 
5
+ VAR_REGEXP = /^ *(?:var|let) +([a-zA-Z_$][a-zA-Z_$0-9]*)/
6
+ VAR_ASSIGN_REGEXP = /^ *(?:var|let) +([a-zA-Z_$][a-zA-Z_$0-9]*) *=/
7
+ CONST_ASSIGN_REGEXP = /^ *const +([a-zA-Z_$][a-zA-Z_$0-9]*) *=/
8
+
4
9
  def tempfile_extension
5
10
  '.js'
6
11
  end
7
12
 
8
-
9
13
  def compile_file_content(r)
14
+ "#{compile_file_header(r)}\n#{compile_query(r.query)}"
15
+ end
16
+
17
+ def compile_file_header(r)
10
18
  <<javascript
11
19
  'use strict';
12
20
 
13
21
  function mumukiConsolePrettyPrint(e) {
14
22
  if (e instanceof Function) return '<function>';
15
- return JSON.stringify(e);
23
+ const json = JSON.stringify(e);
24
+ return json && json.replace(/"(\\w+)"\s*:/g, '$1:');
16
25
  }
17
26
 
18
27
  #{r.extra}
@@ -20,25 +29,81 @@ function mumukiConsolePrettyPrint(e) {
20
29
  #{r.content}
21
30
 
22
31
  #{compile_cookie(r.cookie)}
23
-
24
- #{compile_query(r.query)}
25
32
  javascript
26
33
  end
27
34
 
28
- def compile_query(query)
29
- if query.start_with?('var ') || query.start_with?('let ')
30
- "#{query}\nconsole.log('=> undefined')"
35
+ def compile_query(query, output_prefix = "=> ", output_var = "__mumuki_query_result__")
36
+ if ['var', 'let', 'const'].any? { |type| query.start_with? "#{type} " }
37
+ "#{query}\nconsole.log('#{output_prefix}undefined')"
31
38
  else
32
- "var __mumuki_query_result__ = #{query};\nconsole.log('=> ' + mumukiConsolePrettyPrint(__mumuki_query_result__))"
39
+ "var #{output_var} = #{query};\nconsole.log('#{output_prefix}' + mumukiConsolePrettyPrint(#{output_var}))"
33
40
  end
34
41
  end
35
42
 
36
43
  def compile_cookie(cookie)
37
44
  return if cookie.blank?
38
- cookie.map { |query| "try { #{query} } catch (e) {}" }.join("\n")
45
+
46
+ compile_statements(cookie).join "\n"
39
47
  end
40
48
 
41
49
  def command_line(filename)
42
50
  "node #{filename}"
43
51
  end
52
+
53
+ private
54
+
55
+ def compile_statements(cookie)
56
+ reject_duplicated_statements wrap_statements(cookie)
57
+ end
58
+
59
+ def wrap_statements(cookie)
60
+ cookie.map do |query|
61
+ case query
62
+ when CONST_ASSIGN_REGEXP
63
+ declaration_with_assignment 'const', CONST_ASSIGN_REGEXP, $1, query
64
+ when VAR_ASSIGN_REGEXP
65
+ declaration_with_assignment 'var', VAR_ASSIGN_REGEXP, $1, query
66
+ when VAR_REGEXP
67
+ "var #{$1}"
68
+ else
69
+ "try { #{query} } catch (e) {}"
70
+ end
71
+ end
72
+ end
73
+
74
+ def reject_duplicated_statements(sentences)
75
+ sentences.select.with_index do |line, index|
76
+ next line if !line.match(VAR_ASSIGN_REGEXP) && !line.match(VAR_REGEXP) && !line.match(CONST_ASSIGN_REGEXP)
77
+ name = $1
78
+ sentences.slice(0, index).none? { |previous_line| declaration? previous_line, name }
79
+ end
80
+ end
81
+
82
+ def declaration_with_assignment(type, type_pattern, name, expression)
83
+ "#{type} #{name} = (function() { try { return #{expression.gsub(type_pattern, '')} } catch(e) { return undefined } })()"
84
+ end
85
+
86
+ def declaration?(line, name)
87
+ declaration_of_type?(VAR_REGEXP, line, name) ||
88
+ declaration_of_type?(VAR_ASSIGN_REGEXP, line, name) ||
89
+ declaration_of_type?(CONST_ASSIGN_REGEXP, line, name)
90
+ end
91
+
92
+ def declaration_of_type?(type_pattern, line, name)
93
+ line.match(type_pattern) && $1 == name
94
+ end
95
+
96
+ def error_patterns
97
+ [
98
+ Mumukit::ErrorPattern::Errored.new(error_regexp)
99
+ ]
100
+ end
101
+
102
+ def error_types
103
+ '(Reference|Syntax|Type)Error'
104
+ end
105
+
106
+ def error_regexp
107
+ /(?=\X*#{error_types})(solution.*\n|var __mumuki_query_result__ = )|#{error_types}.*\n\K\X*/
108
+ end
44
109
  end
@@ -0,0 +1,48 @@
1
+ class JavascriptTryHook < Mumukit::Templates::TryHook
2
+ isolated true
3
+ attr_reader :query_hook
4
+
5
+ def initialize(config = nil)
6
+ super config
7
+ @query_hook = JavascriptQueryHook.new
8
+ end
9
+
10
+ def compile_file_content(r)
11
+ <<js
12
+ #{@query_hook.compile_file_header(r)}
13
+ console.log("#{query_separator}");
14
+ #{@query_hook.compile_query(r.query, '')}
15
+ console.log("#{goal_separator}");
16
+ #{@query_hook.compile_query(r.goal.with_indifferent_access[:query] || 'null', '', '__mumuki_goal_query_result__')}
17
+ js
18
+ end
19
+
20
+ delegate :tempfile_extension, to: :query_hook
21
+ delegate :command_line, to: :query_hook
22
+
23
+ def query_separator
24
+ '!!!MUMUKI-QUERY-START!!!'
25
+ end
26
+
27
+ def goal_separator
28
+ '!!!MUMUKI-GOAL-START!!!'
29
+ end
30
+
31
+ def to_structured_results(_file, result, status)
32
+ /#{query_separator}
33
+ ?(.*)
34
+ #{goal_separator}
35
+ ?(.*)
36
+ /m =~ result
37
+
38
+ {
39
+ query: to_query_result($1, status),
40
+ goal: $2,
41
+ status: status
42
+ }
43
+ end
44
+
45
+ def to_query_result(result, status)
46
+ { result: result, status: status }
47
+ end
48
+ end
@@ -1,9 +1,9 @@
1
1
  class JavascriptValidationHook < Mumukit::Hook
2
2
  def validate!(request)
3
3
  matches = request_matches?(request) do |it|
4
- it =~ /\W*(require|process|os|fs|eval|cluster|v8|vm|tty|tls|root|global|crypto|stream|events)\W*/
4
+ it =~ /(^|[^_[[:alnum:]]]+)(require|process|os|fs|eval|cluster|v8|vm|tty|tls|root|global|crypto|stream|events)([^_[[:alnum:]]]+|$)/
5
5
  end
6
- raise Mumukit::RequestValidationError, "You can not use #{$1} here" if matches
6
+ raise Mumukit::RequestValidationError, "You can not use #{$2} here" if matches
7
7
  end
8
8
 
9
9
  private
@@ -1,3 +1,3 @@
1
1
  module JavascriptVersionHook
2
- VERSION = '1.3.3'
2
+ VERSION = '1.6.2'
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mumuki-javascript-runner
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.3.3
4
+ version: 1.6.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Franco Leonardo Bulgarelli
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-05-27 00:00:00.000000000 Z
11
+ date: 2020-12-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: mumukit
@@ -16,28 +16,28 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '2.20'
19
+ version: '2.30'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '2.20'
26
+ version: '2.30'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: bundler
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '1.7'
33
+ version: '2.0'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: '1.7'
40
+ version: '2.0'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: rake
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -102,10 +102,15 @@ extensions: []
102
102
  extra_rdoc_files: []
103
103
  files:
104
104
  - lib/expectations_hook.rb
105
+ - lib/feedback_hook.rb
105
106
  - lib/javascript_runner.rb
107
+ - lib/locales/en.yml
108
+ - lib/locales/es.yml
109
+ - lib/locales/pt.yml
106
110
  - lib/metadata_hook.rb
107
111
  - lib/query_hook.rb
108
112
  - lib/test_hook.rb
113
+ - lib/try_hook.rb
109
114
  - lib/validation_hook.rb
110
115
  - lib/version.rb
111
116
  homepage: http://github.com/mumuki/mumuki-javascript-server
@@ -127,8 +132,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
127
132
  - !ruby/object:Gem::Version
128
133
  version: '0'
129
134
  requirements: []
130
- rubyforge_project:
131
- rubygems_version: 2.7.7
135
+ rubygems_version: 3.0.3
132
136
  signing_key:
133
137
  specification_version: 4
134
138
  summary: Javascript Runner for Mumuki