mumuki-sqlite-runner 3.1.0 → 3.2.0
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/lib/helpers.rb +21 -0
- data/lib/locales/en.yml +3 -0
- data/lib/locales/es.yml +3 -0
- data/lib/parsers/common_test_parser.rb +18 -0
- data/lib/parsers/dataset_test_parser.rb +0 -5
- data/lib/parsers/display_test_parser.rb +18 -0
- data/lib/parsers/final_dataset_test_parser.rb +7 -3
- data/lib/parsers/invalid_test_parser.rb +1 -9
- data/lib/sqlite_runner.rb +7 -4
- data/lib/test_hook.rb +12 -60
- data/lib/validation_hook.rb +31 -0
- data/lib/version_hook.rb +1 -1
- metadata +5 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e2ae7f324d12e24d38f8ac0fbf573406453c0cece8e1853800314feb3ba9b2b8
|
4
|
+
data.tar.gz: c0619a88e63b5df94d0dc9c715a7539dddc6a9b82d38bf7b89461a6b080c8326
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b971e4cc0cac4b5f9d71067bd06e4e9ace57b31c14184fadfb269d35471a101f0a4fda7d35f6148db7c6c4fe417db5d559edf23db2188ef64aaf6d9443544f45
|
7
|
+
data.tar.gz: 6d1fb79de256ba8903fe326da8beef481c28e7b04a26b094f872fe48992bfd273e55c366e03f6c87dfba099a6206b5774be44d01371fafc7e5d44ada0e4b80d7
|
data/lib/helpers.rb
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
module Sqlite
|
2
|
+
module TestHelper
|
3
|
+
|
4
|
+
def set_test_parsers_hash
|
5
|
+
@test_parsers = {
|
6
|
+
query: Sqlite::QueryTestParser,
|
7
|
+
display: Sqlite::DisplayTestParser,
|
8
|
+
datasets: Sqlite::DatasetTestParser,
|
9
|
+
final_dataset: Sqlite::FinalDatasetTestParser,
|
10
|
+
}
|
11
|
+
@test_parsers.default = Sqlite::InvalidTestParser
|
12
|
+
end
|
13
|
+
|
14
|
+
def load_tests(test)
|
15
|
+
tests = YAML.load test
|
16
|
+
tests = [tests] unless tests.kind_of? Array
|
17
|
+
tests.map(&:to_struct)
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
21
|
+
end
|
data/lib/locales/en.yml
CHANGED
@@ -7,3 +7,6 @@ en:
|
|
7
7
|
columns: 'Columns do not match'
|
8
8
|
rows: 'Rows do not match'
|
9
9
|
query: 'Queries do not match'
|
10
|
+
tests:
|
11
|
+
lint: "Invalid tests, It should be a valid YAML format. Try with this validator http://www.yamllint.com/"
|
12
|
+
types: "Unsupported test type '%{type}'. Use one of these: datasets, query, display, final_dataset"
|
data/lib/locales/es.yml
CHANGED
@@ -7,3 +7,6 @@ es:
|
|
7
7
|
columns: 'Las columnas no coinciden'
|
8
8
|
rows: 'Las filas no coinciden'
|
9
9
|
query: 'Las consultas no coinciden'
|
10
|
+
tests:
|
11
|
+
lint: "¡Tests inválidos! No tienen el formato YAML correcto. Podés probar en este validador http://www.yamllint.com/"
|
12
|
+
types: "El test type '%{type}' no está soportado. Tenés que usar uno de éstos: datasets, query, display, final_dataset"
|
@@ -6,6 +6,7 @@ module Sqlite
|
|
6
6
|
required :parse, 'You need to implement parse method when use CommonTestParse mixin!'
|
7
7
|
|
8
8
|
def initialize(test)
|
9
|
+
@test = test
|
9
10
|
@result = parse test
|
10
11
|
end
|
11
12
|
|
@@ -13,6 +14,23 @@ module Sqlite
|
|
13
14
|
solution
|
14
15
|
end
|
15
16
|
|
17
|
+
def has?(key)
|
18
|
+
!@test[key.to_sym].blank?
|
19
|
+
end
|
20
|
+
|
21
|
+
def get(key)
|
22
|
+
@test[key.to_sym]
|
23
|
+
end
|
24
|
+
|
25
|
+
def has_final?
|
26
|
+
# Only FinalDataset should have final query
|
27
|
+
false
|
28
|
+
end
|
29
|
+
|
30
|
+
def get_final
|
31
|
+
''
|
32
|
+
end
|
33
|
+
|
16
34
|
protected
|
17
35
|
|
18
36
|
def final_parse(test, override = {})
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module Sqlite
|
2
|
+
class DisplayTestParser
|
3
|
+
include Sqlite::CommonTestParser
|
4
|
+
|
5
|
+
def has_final?
|
6
|
+
has?(:query)
|
7
|
+
end
|
8
|
+
|
9
|
+
def get_final
|
10
|
+
# Assume has_final? is true
|
11
|
+
get(:query)
|
12
|
+
end
|
13
|
+
|
14
|
+
def parse(test)
|
15
|
+
final_parse test, { expected: get_final }
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -1,9 +1,13 @@
|
|
1
1
|
module Sqlite
|
2
2
|
class FinalDatasetTestParser < DatasetTestParser
|
3
3
|
|
4
|
-
def
|
5
|
-
|
6
|
-
|
4
|
+
def has_final?
|
5
|
+
has?(:final) || has?(:query)
|
6
|
+
end
|
7
|
+
|
8
|
+
def get_final
|
9
|
+
# Assume has_final? is true
|
10
|
+
has?(:final) ? get(:final) : get(:query)
|
7
11
|
end
|
8
12
|
|
9
13
|
end
|
@@ -3,16 +3,8 @@ module Sqlite
|
|
3
3
|
|
4
4
|
include Sqlite::CommonTestParser
|
5
5
|
|
6
|
-
# return {
|
7
|
-
# seed: -- NONE,
|
8
|
-
# expected: -- NONE
|
9
|
-
# }
|
10
6
|
def parse(test)
|
11
|
-
|
12
|
-
seed: COMMENT,
|
13
|
-
expected: COMMENT
|
14
|
-
})
|
7
|
+
raise I18n.t('message.failure.tests.types', type: test.type)
|
15
8
|
end
|
16
|
-
|
17
9
|
end
|
18
10
|
end
|
data/lib/sqlite_runner.rb
CHANGED
@@ -10,16 +10,19 @@ Mumukit.configure do |config|
|
|
10
10
|
config.structured = true
|
11
11
|
end
|
12
12
|
|
13
|
+
require_relative './dataset'
|
14
|
+
require_relative './checker'
|
13
15
|
require_relative './version_hook'
|
14
|
-
require_relative './test_hook'
|
15
16
|
require_relative './metadata_hook'
|
16
|
-
require_relative './checker'
|
17
|
-
require_relative './multiple_executions_runner'
|
18
17
|
require_relative './html_renderer'
|
19
|
-
require_relative './
|
18
|
+
require_relative './multiple_executions_runner'
|
20
19
|
require_relative './parsers/common_test_parser'
|
21
20
|
require_relative './parsers/query_test_parser'
|
21
|
+
require_relative './parsers/display_test_parser'
|
22
22
|
require_relative './parsers/dataset_test_parser'
|
23
23
|
require_relative './parsers/final_dataset_test_parser'
|
24
24
|
require_relative './parsers/invalid_test_parser'
|
25
|
+
require_relative './helpers'
|
26
|
+
require_relative './test_hook'
|
27
|
+
require_relative './validation_hook'
|
25
28
|
require_relative './errors'
|
data/lib/test_hook.rb
CHANGED
@@ -5,67 +5,36 @@ require 'diffy'
|
|
5
5
|
# This Hook allow to run Sqlite Worker from an ad-hoc program that receives .json files.
|
6
6
|
|
7
7
|
class SqliteTestHook < Mumukit::Templates::FileHook
|
8
|
-
|
9
|
-
# Define that worker runs on a freshly-cleaned environment
|
10
8
|
isolated
|
9
|
+
include Sqlite::TestHelper
|
11
10
|
|
12
11
|
def initialize(config = nil)
|
13
12
|
super(config)
|
14
|
-
|
15
|
-
query: Sqlite::QueryTestParser,
|
16
|
-
datasets: Sqlite::DatasetTestParser,
|
17
|
-
final_dataset: Sqlite::FinalDatasetTestParser,
|
18
|
-
}
|
19
|
-
@test_parsers.default = Sqlite::InvalidTestParser
|
13
|
+
set_test_parsers_hash
|
20
14
|
end
|
21
15
|
|
22
|
-
# Just define file extension
|
23
16
|
def tempfile_extension
|
24
17
|
'.json'
|
25
18
|
end
|
26
19
|
|
27
|
-
# Define the command to be run by sqlite worker
|
28
20
|
def command_line(filename)
|
29
21
|
"runsql #{filename}"
|
30
22
|
end
|
31
23
|
|
32
24
|
# Transform Mumuki Request into Docker file style
|
33
|
-
# Request = {
|
34
|
-
# test: {
|
35
|
-
# type: (string) query|dataset,
|
36
|
-
# seed: (string) sql code to populate tables,
|
37
|
-
# expected: (string) query sentence | resulting table
|
38
|
-
# },
|
39
|
-
# extra: (string) sql code to create tables,
|
40
|
-
# content: (string) student's solution,
|
41
|
-
# expectations: [] # not using
|
42
|
-
# }
|
43
|
-
#
|
44
25
|
def compile_file_content(request)
|
45
26
|
tests = parse_tests request.test
|
46
27
|
final = get_final_query
|
47
28
|
{
|
48
|
-
init: request.extra
|
49
|
-
student: request.content
|
29
|
+
init: "#{request.extra&.strip}",
|
30
|
+
student: "#{request.content&.strip}#{final}",
|
50
31
|
tests: tests
|
51
32
|
}.to_json
|
52
33
|
end
|
53
34
|
|
54
|
-
#
|
55
|
-
# Expected:
|
56
|
-
# {
|
57
|
-
# "expected": [
|
58
|
-
# "name\nTest 1.1\nTest 1.2\nTest 1.3\n",
|
59
|
-
# "name\nTest 2.1\nTest 2.2\nTest 2.3\n"
|
60
|
-
# ],
|
61
|
-
# "student": [
|
62
|
-
# "id|name\n1|Test 1.1\n2|Test 1.2\n3|Test 1.3\n",
|
63
|
-
# "id|name\n1|Test 2.1\n2|Test 2.2\n3|Test 2.3\n"
|
64
|
-
# ]
|
65
|
-
# }
|
35
|
+
# Transform Docker result into Response to Mumuki
|
66
36
|
def post_process_file(_file, result, status)
|
67
|
-
output = JSON.parse
|
68
|
-
|
37
|
+
output = JSON.parse result
|
69
38
|
case status
|
70
39
|
when :passed
|
71
40
|
expected, student = parse_output output
|
@@ -83,12 +52,12 @@ class SqliteTestHook < Mumukit::Templates::FileHook
|
|
83
52
|
student = output['student']
|
84
53
|
expected = output['expected']
|
85
54
|
expected.map!.with_index do |expect, i|
|
86
|
-
@
|
55
|
+
@tests[i].choose expect
|
87
56
|
end
|
88
|
-
|
89
57
|
diff(expected, student)
|
90
58
|
end
|
91
59
|
|
60
|
+
# Make diff between expected and student dataset result and mark each line one according comparision
|
92
61
|
def diff(expected, student)
|
93
62
|
zipped = expected.zip(student).map do |expected_i, student_i|
|
94
63
|
diff = Diffy::SplitDiff.new student_i << "\n", expected_i << "\n"
|
@@ -119,34 +88,17 @@ class SqliteTestHook < Mumukit::Templates::FileHook
|
|
119
88
|
end
|
120
89
|
end
|
121
90
|
|
122
|
-
# This method receives a list of test cases
|
123
|
-
# Each one could be like one of these:
|
124
|
-
#
|
125
|
-
# type: query
|
126
|
-
# seed: INSERT INTO ...
|
127
|
-
# expected: SELECT * FROM ...
|
128
|
-
#
|
129
|
-
# type: dataset
|
130
|
-
# seed: INSERT INTO ...
|
131
|
-
# expected: |
|
132
|
-
# id|field
|
133
|
-
# 1|row 1
|
134
|
-
# ...
|
91
|
+
# This method receives a list of test cases and transforms each one according it parser
|
135
92
|
def parse_tests(tests)
|
136
|
-
tests =
|
137
|
-
tests = [tests] unless tests.kind_of? Array
|
138
|
-
@tests = tests.map do | test |
|
139
|
-
test = test.to_struct
|
93
|
+
@tests = load_tests(tests).map do | test |
|
140
94
|
@test_parsers[test.type.to_sym].new test
|
141
95
|
end
|
142
|
-
|
143
|
-
@expected_parser = @tests
|
144
96
|
@tests.map(&:result)
|
145
97
|
end
|
146
98
|
|
147
99
|
def get_final_query
|
148
|
-
|
149
|
-
|
100
|
+
tests = @tests.select { |test| test.has_final? }
|
101
|
+
tests.empty? ? '' : tests.first.get_final
|
150
102
|
end
|
151
103
|
|
152
104
|
# Initialize Metatest Framework with Checker & Runner
|
@@ -0,0 +1,31 @@
|
|
1
|
+
class SqliteValidationHook < Mumukit::Hook
|
2
|
+
|
3
|
+
include Sqlite::TestHelper
|
4
|
+
|
5
|
+
def initialize(config = nil)
|
6
|
+
super(config)
|
7
|
+
set_test_parsers_hash
|
8
|
+
end
|
9
|
+
|
10
|
+
def validate!(request)
|
11
|
+
lint_tests request.test
|
12
|
+
types_tests request.test
|
13
|
+
end
|
14
|
+
|
15
|
+
def lint_tests(tests)
|
16
|
+
begin
|
17
|
+
YAML.load tests
|
18
|
+
rescue
|
19
|
+
raise Mumukit::RequestValidationError, I18n.t('message.failure.tests.lint')
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def types_tests(tests)
|
24
|
+
# Assumes that pass lint_tests
|
25
|
+
load_tests(tests).each do |test|
|
26
|
+
valid = @test_parsers.has_key? test.type.to_sym
|
27
|
+
raise Mumukit::RequestValidationError, I18n.t('message.failure.tests.types', type: test.type) unless valid
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
data/lib/version_hook.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mumuki-sqlite-runner
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.
|
4
|
+
version: 3.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Leandro Di Lorenzo
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-12-
|
11
|
+
date: 2017-12-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: mumukit
|
@@ -174,6 +174,7 @@ files:
|
|
174
174
|
- lib/checker.rb
|
175
175
|
- lib/dataset.rb
|
176
176
|
- lib/errors.rb
|
177
|
+
- lib/helpers.rb
|
177
178
|
- lib/html_renderer.rb
|
178
179
|
- lib/locales/en.yml
|
179
180
|
- lib/locales/es.yml
|
@@ -181,11 +182,13 @@ files:
|
|
181
182
|
- lib/multiple_executions_runner.rb
|
182
183
|
- lib/parsers/common_test_parser.rb
|
183
184
|
- lib/parsers/dataset_test_parser.rb
|
185
|
+
- lib/parsers/display_test_parser.rb
|
184
186
|
- lib/parsers/final_dataset_test_parser.rb
|
185
187
|
- lib/parsers/invalid_test_parser.rb
|
186
188
|
- lib/parsers/query_test_parser.rb
|
187
189
|
- lib/sqlite_runner.rb
|
188
190
|
- lib/test_hook.rb
|
191
|
+
- lib/validation_hook.rb
|
189
192
|
- lib/version_hook.rb
|
190
193
|
- lib/view/rows_error.html.erb
|
191
194
|
- lib/view/rows_success.html.erb
|