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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 4d69d4bf6d04b43a1158cee76f3226460f25df5ed22c2ef51923d457edd6fba9
4
- data.tar.gz: 5b3b6fe6ca5cefb53e9c03637564ec265d13fff47e0ace72416f87e5c46882e2
3
+ metadata.gz: 0f0b8b6d8c59749308e3c9dcd6ab96ae9db013bd388961e5ff5029a99a3d0e28
4
+ data.tar.gz: a1e4d49af97459f0b62b2b74379cbaf1ee21bbce80cf9ddda4562d41e63eaab9
5
5
  SHA512:
6
- metadata.gz: 46ff93a107026b708e82920099482856d8dc5c303694e24b4e18faf270e8a8ade4429920d69f2b786d1920b1d37629a5f8a8331d8ad19e251e6fc30407889433
7
- data.tar.gz: e2e70bfb662d4afed2fdf254e49c42cc2ebc9e83154de2a01a6d1ff0ea16bce65e4b06ec4e3f55c982d1ee70019262fb60c5dd38867cabda831f8cd50a26df67
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.12
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.12 ruby lib
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.12".freeze
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 = "2024-07-30"
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.5.16".freeze
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 = 4
43
+ if s.respond_to? :specification_version then
44
+ s.specification_version = 4
45
+ end
44
46
 
45
- s.add_runtime_dependency(%q<activesupport>.freeze, [">= 2.3.5".freeze])
46
- s.add_runtime_dependency(%q<oj>.freeze, ["~> 3.13.12".freeze])
47
- s.add_runtime_dependency(%q<octokit>.freeze, ["~> 5.0".freeze])
48
- s.add_runtime_dependency(%q<zip>.freeze, [">= 0".freeze])
49
- s.add_runtime_dependency(%q<faraday-retry>.freeze, ["~> 1.0.3".freeze])
50
- s.add_runtime_dependency(%q<rake>.freeze, ["~> 13".freeze])
51
- s.add_development_dependency(%q<rspec>.freeze, ["~> 3.5.0".freeze])
52
- s.add_development_dependency(%q<rdoc>.freeze, ["~> 6.1".freeze])
53
- s.add_development_dependency(%q<bundler>.freeze, ["~> 2.1.4".freeze])
54
- s.add_development_dependency(%q<juwelier>.freeze, ["~> 2.1.0".freeze])
55
- s.add_development_dependency(%q<simplecov>.freeze, [">= 0".freeze])
56
- s.add_development_dependency(%q<pry>.freeze, ["~> 0".freeze])
57
- s.add_development_dependency(%q<pry-byebug>.freeze, ["~> 3".freeze])
58
- s.add_development_dependency(%q<pry-doc>.freeze, ["~> 0".freeze])
59
- s.add_development_dependency(%q<pry-remote>.freeze, ["~> 0".freeze])
60
- s.add_development_dependency(%q<pry-rescue>.freeze, ["~> 1".freeze])
61
- s.add_development_dependency(%q<pry-stack_explorer>.freeze, ["~> 0".freeze])
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
- resource_info = upstream_repo(submission_url, token)
75
- full_reponame = resource_info.fetch("repo_slug")
76
- remote_spec_folder_sha = resource_info.fetch("spec_folder_sha")
77
- source_code_url = resource_info.fetch("source_code_url")
78
- set_upstream_remote(full_reponame)
79
- sync_specs_with_source(full_reponame, remote_spec_folder_sha, source_code_url)
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.12
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: 2024-08-06 00:00:00.000000000 Z
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.5.16
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)