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)
|