grade_runner 0.0.12 → 0.0.13
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/Gemfile.lock +0 -19
- data/VERSION +1 -1
- data/grade_runner.gemspec +44 -22
- data/lib/grade_runner/formatters/hint_formatter.rb +11 -0
- data/lib/grade_runner/formatters/json_output_formatter.rb +67 -0
- data/lib/grade_runner.rb +24 -0
- data/lib/tasks/grade.rake +8 -6
- metadata +5 -3
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 0f0b8b6d8c59749308e3c9dcd6ab96ae9db013bd388961e5ff5029a99a3d0e28
|
|
4
|
+
data.tar.gz: a1e4d49af97459f0b62b2b74379cbaf1ee21bbce80cf9ddda4562d41e63eaab9
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 8b005be1f8ee9db2d9385036e27233acbce5b5fc6d9eb0a6f875d76d5d7da095cf42d5dde54242b270efa2493ff30414d9f292263648d560e1f9305f0a23a2c5
|
|
7
|
+
data.tar.gz: c8b7c8026a6d880bca7021d36975f9c71eabcfd7375c4efde5821ff42840d045b333ab61c567b76aecdab61f58d2e48fac1199a9d095cbcddbde5d622bebdd93
|
data/Gemfile.lock
CHANGED
|
@@ -8,7 +8,6 @@ GEM
|
|
|
8
8
|
tzinfo (~> 2.0)
|
|
9
9
|
addressable (2.8.4)
|
|
10
10
|
public_suffix (>= 2.0.2, < 6.0)
|
|
11
|
-
base64 (0.2.0)
|
|
12
11
|
binding_of_caller (1.0.0)
|
|
13
12
|
debug_inspector (>= 0.0.1)
|
|
14
13
|
builder (3.2.4)
|
|
@@ -20,7 +19,6 @@ GEM
|
|
|
20
19
|
thread_safe (~> 0.3, >= 0.3.1)
|
|
21
20
|
diff-lcs (1.5.0)
|
|
22
21
|
docile (1.4.0)
|
|
23
|
-
domain_name (0.6.20240107)
|
|
24
22
|
faraday (1.10.3)
|
|
25
23
|
faraday-em_http (~> 1.0)
|
|
26
24
|
faraday-em_synchrony (~> 1.0)
|
|
@@ -44,10 +42,6 @@ GEM
|
|
|
44
42
|
faraday-patron (1.0.0)
|
|
45
43
|
faraday-rack (1.0.0)
|
|
46
44
|
faraday-retry (1.0.3)
|
|
47
|
-
ffi (1.17.0)
|
|
48
|
-
ffi-compiler (1.3.2)
|
|
49
|
-
ffi (>= 1.15.5)
|
|
50
|
-
rake
|
|
51
45
|
git (1.18.0)
|
|
52
46
|
addressable (~> 2.8)
|
|
53
47
|
rchardet (~> 1.8)
|
|
@@ -59,15 +53,6 @@ GEM
|
|
|
59
53
|
oauth2 (~> 1.0)
|
|
60
54
|
hashie (3.6.0)
|
|
61
55
|
highline (2.1.0)
|
|
62
|
-
http (5.2.0)
|
|
63
|
-
addressable (~> 2.8)
|
|
64
|
-
base64 (~> 0.1)
|
|
65
|
-
http-cookie (~> 1.0)
|
|
66
|
-
http-form_data (~> 2.2)
|
|
67
|
-
llhttp-ffi (~> 0.5.0)
|
|
68
|
-
http-cookie (1.0.6)
|
|
69
|
-
domain_name (~> 0.5)
|
|
70
|
-
http-form_data (2.3.0)
|
|
71
56
|
i18n (1.14.1)
|
|
72
57
|
concurrent-ruby (~> 1.0)
|
|
73
58
|
interception (0.5)
|
|
@@ -82,9 +67,6 @@ GEM
|
|
|
82
67
|
rdoc
|
|
83
68
|
semver
|
|
84
69
|
jwt (2.7.0)
|
|
85
|
-
llhttp-ffi (0.5.0)
|
|
86
|
-
ffi-compiler (~> 1.0)
|
|
87
|
-
rake (~> 13.0)
|
|
88
70
|
method_source (1.0.0)
|
|
89
71
|
mini_portile2 (2.8.1)
|
|
90
72
|
minitest (5.19.0)
|
|
@@ -172,7 +154,6 @@ DEPENDENCIES
|
|
|
172
154
|
activesupport (>= 2.3.5)
|
|
173
155
|
bundler (~> 2.1.4)
|
|
174
156
|
faraday-retry (~> 1.0.3)
|
|
175
|
-
http
|
|
176
157
|
juwelier (~> 2.1.0)
|
|
177
158
|
octokit (~> 5.0)
|
|
178
159
|
oj (~> 3.13.12)
|
data/VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
0.0.
|
|
1
|
+
0.0.13
|
data/grade_runner.gemspec
CHANGED
|
@@ -2,16 +2,16 @@
|
|
|
2
2
|
# DO NOT EDIT THIS FILE DIRECTLY
|
|
3
3
|
# Instead, edit Juwelier::Tasks in Rakefile, and run 'rake gemspec'
|
|
4
4
|
# -*- encoding: utf-8 -*-
|
|
5
|
-
# stub: grade_runner 0.0.
|
|
5
|
+
# stub: grade_runner 0.0.13 ruby lib
|
|
6
6
|
|
|
7
7
|
Gem::Specification.new do |s|
|
|
8
8
|
s.name = "grade_runner".freeze
|
|
9
|
-
s.version = "0.0.
|
|
9
|
+
s.version = "0.0.13"
|
|
10
10
|
|
|
11
11
|
s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
|
|
12
12
|
s.require_paths = ["lib".freeze]
|
|
13
13
|
s.authors = ["Raghu Betina".freeze, "Jelani Woods".freeze]
|
|
14
|
-
s.date = "
|
|
14
|
+
s.date = "2025-03-17"
|
|
15
15
|
s.description = "This gem runs your RSpec test suite and posts the JSON output to grades.firstdraft.com.".freeze
|
|
16
16
|
s.email = ["raghu@firstdraft.com".freeze, "jelani@firstdraft.com".freeze]
|
|
17
17
|
s.extra_rdoc_files = [
|
|
@@ -37,27 +37,49 @@ Gem::Specification.new do |s|
|
|
|
37
37
|
]
|
|
38
38
|
s.homepage = "http://github.com/firstdraft/grade_runner".freeze
|
|
39
39
|
s.licenses = ["MIT".freeze]
|
|
40
|
-
s.rubygems_version = "3.
|
|
40
|
+
s.rubygems_version = "3.1.6".freeze
|
|
41
41
|
s.summary = "A Ruby client for [firstdraft Grades](https://grades.firstdraft.com)".freeze
|
|
42
42
|
|
|
43
|
-
s.specification_version
|
|
43
|
+
if s.respond_to? :specification_version then
|
|
44
|
+
s.specification_version = 4
|
|
45
|
+
end
|
|
44
46
|
|
|
45
|
-
s.add_runtime_dependency
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
47
|
+
if s.respond_to? :add_runtime_dependency then
|
|
48
|
+
s.add_runtime_dependency(%q<activesupport>.freeze, [">= 2.3.5"])
|
|
49
|
+
s.add_runtime_dependency(%q<oj>.freeze, ["~> 3.13.12"])
|
|
50
|
+
s.add_runtime_dependency(%q<octokit>.freeze, ["~> 5.0"])
|
|
51
|
+
s.add_runtime_dependency(%q<zip>.freeze, [">= 0"])
|
|
52
|
+
s.add_runtime_dependency(%q<faraday-retry>.freeze, ["~> 1.0.3"])
|
|
53
|
+
s.add_runtime_dependency(%q<rake>.freeze, ["~> 13"])
|
|
54
|
+
s.add_development_dependency(%q<rspec>.freeze, ["~> 3.5.0"])
|
|
55
|
+
s.add_development_dependency(%q<rdoc>.freeze, ["~> 6.1"])
|
|
56
|
+
s.add_development_dependency(%q<bundler>.freeze, ["~> 2.1.4"])
|
|
57
|
+
s.add_development_dependency(%q<juwelier>.freeze, ["~> 2.1.0"])
|
|
58
|
+
s.add_development_dependency(%q<simplecov>.freeze, [">= 0"])
|
|
59
|
+
s.add_development_dependency(%q<pry>.freeze, ["~> 0"])
|
|
60
|
+
s.add_development_dependency(%q<pry-byebug>.freeze, ["~> 3"])
|
|
61
|
+
s.add_development_dependency(%q<pry-doc>.freeze, ["~> 0"])
|
|
62
|
+
s.add_development_dependency(%q<pry-remote>.freeze, ["~> 0"])
|
|
63
|
+
s.add_development_dependency(%q<pry-rescue>.freeze, ["~> 1"])
|
|
64
|
+
s.add_development_dependency(%q<pry-stack_explorer>.freeze, ["~> 0"])
|
|
65
|
+
else
|
|
66
|
+
s.add_dependency(%q<activesupport>.freeze, [">= 2.3.5"])
|
|
67
|
+
s.add_dependency(%q<oj>.freeze, ["~> 3.13.12"])
|
|
68
|
+
s.add_dependency(%q<octokit>.freeze, ["~> 5.0"])
|
|
69
|
+
s.add_dependency(%q<zip>.freeze, [">= 0"])
|
|
70
|
+
s.add_dependency(%q<faraday-retry>.freeze, ["~> 1.0.3"])
|
|
71
|
+
s.add_dependency(%q<rake>.freeze, ["~> 13"])
|
|
72
|
+
s.add_dependency(%q<rspec>.freeze, ["~> 3.5.0"])
|
|
73
|
+
s.add_dependency(%q<rdoc>.freeze, ["~> 6.1"])
|
|
74
|
+
s.add_dependency(%q<bundler>.freeze, ["~> 2.1.4"])
|
|
75
|
+
s.add_dependency(%q<juwelier>.freeze, ["~> 2.1.0"])
|
|
76
|
+
s.add_dependency(%q<simplecov>.freeze, [">= 0"])
|
|
77
|
+
s.add_dependency(%q<pry>.freeze, ["~> 0"])
|
|
78
|
+
s.add_dependency(%q<pry-byebug>.freeze, ["~> 3"])
|
|
79
|
+
s.add_dependency(%q<pry-doc>.freeze, ["~> 0"])
|
|
80
|
+
s.add_dependency(%q<pry-remote>.freeze, ["~> 0"])
|
|
81
|
+
s.add_dependency(%q<pry-rescue>.freeze, ["~> 1"])
|
|
82
|
+
s.add_dependency(%q<pry-stack_explorer>.freeze, ["~> 0"])
|
|
83
|
+
end
|
|
62
84
|
end
|
|
63
85
|
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
RSpec::Support.require_rspec_core "formatters/documentation_formatter"
|
|
2
|
+
|
|
3
|
+
class HintFormatter < RSpec::Core::Formatters::DocumentationFormatter
|
|
4
|
+
RSpec::Core::Formatters.register self, :example_failed
|
|
5
|
+
|
|
6
|
+
def example_failed(failure)
|
|
7
|
+
super
|
|
8
|
+
@output.puts "\n\nHint: #{failure.example.metadata[:hint][0]}" if failure.example.metadata[:hint].present?
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
end
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
RSpec::Support.require_rspec_core "formatters/json_formatter"
|
|
2
|
+
require "oj"
|
|
3
|
+
class JsonOutputFormatter < RSpec::Core::Formatters::JsonFormatter
|
|
4
|
+
RSpec::Core::Formatters.register self, :dump_summary
|
|
5
|
+
|
|
6
|
+
def dump_summary(summary)
|
|
7
|
+
total_points = summary.
|
|
8
|
+
examples.
|
|
9
|
+
map { |example| example.metadata.fetch(:points, GradeRunner.default_points).to_i }.
|
|
10
|
+
sum
|
|
11
|
+
|
|
12
|
+
earned_points = summary.
|
|
13
|
+
examples.
|
|
14
|
+
select { |example| example.execution_result.status == :passed }.
|
|
15
|
+
map { |example| example.metadata.fetch(:points, GradeRunner.default_points).to_i }.
|
|
16
|
+
sum
|
|
17
|
+
|
|
18
|
+
score = (earned_points.to_f / total_points).round(4)
|
|
19
|
+
score = 0 if score.nan?
|
|
20
|
+
|
|
21
|
+
@output_hash[:summary] = {
|
|
22
|
+
duration: summary.duration,
|
|
23
|
+
example_count: summary.example_count,
|
|
24
|
+
errors_outside_of_examples_count: summary.errors_outside_of_examples_count,
|
|
25
|
+
failure_count: summary.failure_count,
|
|
26
|
+
pending_count: summary.pending_count,
|
|
27
|
+
total_points: total_points,
|
|
28
|
+
earned_points: earned_points,
|
|
29
|
+
score: score
|
|
30
|
+
}
|
|
31
|
+
result = (@output_hash[:summary][:score] * 100).round(2)
|
|
32
|
+
|
|
33
|
+
if summary.errors_outside_of_examples_count.positive?
|
|
34
|
+
result = "An error occurred while running tests"
|
|
35
|
+
else
|
|
36
|
+
result = result.to_s + "%"
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
@output_hash[:summary_line] = [
|
|
41
|
+
"#{summary.example_count} #{summary.example_count == 1 ? "test" : "tests"}",
|
|
42
|
+
"#{summary.failure_count} failures",
|
|
43
|
+
"#{earned_points}/#{total_points} points",
|
|
44
|
+
result,
|
|
45
|
+
].join(", ")
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def close(_notification)
|
|
49
|
+
output.write Oj.dump @output_hash
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
private
|
|
53
|
+
|
|
54
|
+
def format_example(example)
|
|
55
|
+
{
|
|
56
|
+
description: example.description,
|
|
57
|
+
full_description: example.full_description,
|
|
58
|
+
hint: example.metadata[:hint],
|
|
59
|
+
status: example.execution_result.status.to_s,
|
|
60
|
+
points: example.metadata.fetch(:points, GradeRunner.default_points),
|
|
61
|
+
file_path: example.metadata[:file_path],
|
|
62
|
+
line_number: example.metadata[:line_number],
|
|
63
|
+
run_time: example.execution_result.run_time,
|
|
64
|
+
}
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
end
|
data/lib/grade_runner.rb
CHANGED
|
@@ -1,2 +1,26 @@
|
|
|
1
1
|
require "grade_runner/runner"
|
|
2
2
|
require "grade_runner/railtie" if defined?(Rails)
|
|
3
|
+
|
|
4
|
+
module GradeRunner
|
|
5
|
+
class Error < StandardError; end
|
|
6
|
+
|
|
7
|
+
class << self
|
|
8
|
+
attr_writer :default_points, :override_local_specs
|
|
9
|
+
|
|
10
|
+
def default_points
|
|
11
|
+
@default_points || 1
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def override_local_specs
|
|
15
|
+
if @override_local_specs.nil?
|
|
16
|
+
true
|
|
17
|
+
else
|
|
18
|
+
@override_local_specs
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def config
|
|
23
|
+
yield self
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
data/lib/tasks/grade.rake
CHANGED
|
@@ -71,12 +71,14 @@ namespace :grade do
|
|
|
71
71
|
update_config_file(config_file_name, student_config)
|
|
72
72
|
puts "Your access token looked invalid, so we've reset it to be blank. Please re-run rails grade and, when asked, copy-paste your token carefully from the assignment page."
|
|
73
73
|
else
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
74
|
+
if GradeRunner.override_local_specs
|
|
75
|
+
resource_info = upstream_repo(submission_url, token)
|
|
76
|
+
full_reponame = resource_info.fetch("repo_slug")
|
|
77
|
+
remote_spec_folder_sha = resource_info.fetch("spec_folder_sha")
|
|
78
|
+
source_code_url = resource_info.fetch("source_code_url")
|
|
79
|
+
set_upstream_remote(full_reponame)
|
|
80
|
+
sync_specs_with_source(full_reponame, remote_spec_folder_sha, source_code_url)
|
|
81
|
+
end
|
|
80
82
|
|
|
81
83
|
path = File.join(project_root, "/tmp/output/#{Time.now.to_i}.json")
|
|
82
84
|
`bin/rails db:migrate RAILS_ENV=test` if defined?(Rails)
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: grade_runner
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.0.
|
|
4
|
+
version: 0.0.13
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Raghu Betina
|
|
@@ -9,7 +9,7 @@ authors:
|
|
|
9
9
|
autorequire:
|
|
10
10
|
bindir: bin
|
|
11
11
|
cert_chain: []
|
|
12
|
-
date:
|
|
12
|
+
date: 2025-03-18 00:00:00.000000000 Z
|
|
13
13
|
dependencies:
|
|
14
14
|
- !ruby/object:Gem::Dependency
|
|
15
15
|
name: activesupport
|
|
@@ -269,6 +269,8 @@ files:
|
|
|
269
269
|
- VERSION
|
|
270
270
|
- grade_runner.gemspec
|
|
271
271
|
- lib/grade_runner.rb
|
|
272
|
+
- lib/grade_runner/formatters/hint_formatter.rb
|
|
273
|
+
- lib/grade_runner/formatters/json_output_formatter.rb
|
|
272
274
|
- lib/grade_runner/railtie.rb
|
|
273
275
|
- lib/grade_runner/runner.rb
|
|
274
276
|
- lib/tasks/grade.rake
|
|
@@ -293,7 +295,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
293
295
|
- !ruby/object:Gem::Version
|
|
294
296
|
version: '0'
|
|
295
297
|
requirements: []
|
|
296
|
-
rubygems_version: 3.
|
|
298
|
+
rubygems_version: 3.1.6
|
|
297
299
|
signing_key:
|
|
298
300
|
specification_version: 4
|
|
299
301
|
summary: A Ruby client for [firstdraft Grades](https://grades.firstdraft.com)
|