judges 0.60.1 → 0.60.3

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: f52de1c7c4227a92ab20d9811fc5e9afa82529ae974cbf13f2f10182cde01266
4
- data.tar.gz: 231b7e823dd35dcd6973a6d7abeccf3ee50a62c28654c0486a496082e3c3efd1
3
+ metadata.gz: 26d69625988cf52b0a58b477b38399fa6131ce5ef2fca9e41fad8b3f0d9409e9
4
+ data.tar.gz: 49a6f1decdb471de65037f19d249cd4a5f3208e53a7ca3b9e23a8b7a225dbbe4
5
5
  SHA512:
6
- metadata.gz: c8ceea017656a8dfef6cb0a57b55d68b18247b7f60bfa821c375dff87a9e32ed93260cb8f21bac8c8bec6d35775646b61b1ee8dc94e241e483d07bad95137630
7
- data.tar.gz: 44b0ec1172b9c0c2dc434ea572818e6081e57e734bff043da0f9d6a14d079422c01788105bc37d246cafb19d2804457d1ab75934c50194a39dbaf640bef437aa
6
+ metadata.gz: 3222d9734c7ed4e2afe39f61ba91fc9c69ba8ef17ea7639de5112e886a3a5f42cd7a84af6fb024dc96e817750f0cb567f04cd8bf08d93b894500c081323ce5a5
7
+ data.tar.gz: 74bc0d47b424a70b03221212a3626e83999234370003aa97f33d7500c1c2fff7fa175186664c170371ac45a3fa54302ea84920679306079a033f0e0883a8d526
data/Gemfile CHANGED
@@ -7,7 +7,7 @@ source 'https://rubygems.org'
7
7
  gemspec
8
8
 
9
9
  gem 'base64', '~>0.3'
10
- gem 'cucumber', '~>10.0', require: false
10
+ gem 'cucumber', '~>11.0', require: false
11
11
  gem 'diff-lcs', '1.6.2', require: false # GPL
12
12
  gem 'minitest', '~>6.0', require: false
13
13
  gem 'minitest-mock', '~>5.27', require: false
data/Gemfile.lock CHANGED
@@ -13,6 +13,7 @@ PATH
13
13
  loog (~> 0.6)
14
14
  moments (~> 0.3)
15
15
  nokogiri (~> 1.10)
16
+ octokit (~> 10.0)
16
17
  others (~> 0.1)
17
18
  retries (~> 0.0)
18
19
  tago (~> 0.2)
@@ -25,7 +26,7 @@ GEM
25
26
  specs:
26
27
  addressable (2.8.9)
27
28
  public_suffix (>= 2.0.2, < 8.0)
28
- ansi (1.5.0)
29
+ ansi (1.6.0)
29
30
  ast (2.4.3)
30
31
  backtrace (0.4.1)
31
32
  base64 (0.3.0)
@@ -41,24 +42,24 @@ GEM
41
42
  retries (~> 0.0)
42
43
  tago (~> 0.2)
43
44
  typhoeus (~> 1.4)
44
- bigdecimal (4.0.1)
45
+ bigdecimal (4.1.1)
45
46
  builder (3.3.0)
46
47
  concurrent-ruby (1.3.6)
47
48
  crack (1.0.1)
48
49
  bigdecimal
49
50
  rexml
50
- cucumber (10.2.0)
51
+ cucumber (11.0.0)
51
52
  base64 (~> 0.2)
52
53
  builder (~> 3.2)
53
54
  cucumber-ci-environment (> 9, < 12)
54
- cucumber-core (> 15, < 17)
55
+ cucumber-core (>= 16.2.0, < 17)
55
56
  cucumber-cucumber-expressions (> 17, < 20)
56
- cucumber-html-formatter (> 21, < 23)
57
+ cucumber-html-formatter (> 21, < 24)
57
58
  diff-lcs (~> 1.5)
58
59
  logger (~> 1.6)
59
60
  mini_mime (~> 1.1)
60
61
  multi_test (~> 1.1)
61
- sys-uname (~> 1.3)
62
+ sys-uname (~> 1.5)
62
63
  cucumber-ci-environment (11.0.0)
63
64
  cucumber-core (16.2.0)
64
65
  cucumber-gherkin (> 36, < 40)
@@ -68,9 +69,9 @@ GEM
68
69
  bigdecimal
69
70
  cucumber-gherkin (39.0.0)
70
71
  cucumber-messages (>= 31, < 33)
71
- cucumber-html-formatter (22.3.0)
72
+ cucumber-html-formatter (23.1.0)
72
73
  cucumber-messages (> 23, < 33)
73
- cucumber-messages (32.2.0)
74
+ cucumber-messages (32.3.1)
74
75
  cucumber-tag-expressions (8.1.0)
75
76
  date (3.5.1)
76
77
  decoor (0.1.0)
@@ -108,41 +109,36 @@ GEM
108
109
  net-http (~> 0.5)
109
110
  faraday-retry (2.4.0)
110
111
  faraday (~> 2.0)
111
- ffi (1.17.3-aarch64-linux-gnu)
112
- ffi (1.17.3-aarch64-linux-musl)
113
- ffi (1.17.3-arm-linux-gnu)
114
- ffi (1.17.3-arm-linux-musl)
115
- ffi (1.17.3-arm64-darwin)
116
- ffi (1.17.3-x64-mingw-ucrt)
117
- ffi (1.17.3-x86_64-darwin)
118
- ffi (1.17.3-x86_64-linux-gnu)
119
- ffi (1.17.3-x86_64-linux-musl)
112
+ ffi (1.17.4-aarch64-linux-gnu)
113
+ ffi (1.17.4-aarch64-linux-musl)
114
+ ffi (1.17.4-arm-linux-gnu)
115
+ ffi (1.17.4-arm-linux-musl)
116
+ ffi (1.17.4-arm64-darwin)
117
+ ffi (1.17.4-x64-mingw-ucrt)
118
+ ffi (1.17.4-x86_64-darwin)
119
+ ffi (1.17.4-x86_64-linux-gnu)
120
+ ffi (1.17.4-x86_64-linux-musl)
120
121
  gli (2.22.2)
121
122
  ostruct
122
123
  hashdiff (1.2.1)
123
124
  iri (0.11.8)
124
- json (2.18.1)
125
- json-schema (6.1.0)
126
- addressable (~> 2.8)
127
- bigdecimal (>= 3.1, < 5)
125
+ json (2.19.3)
128
126
  language_server-protocol (3.17.0.5)
129
127
  lint_roller (1.1.0)
130
128
  logger (1.7.0)
131
129
  loog (0.8.0)
132
130
  ellipsized
133
131
  logger (~> 1.0)
134
- mcp (0.7.1)
135
- json-schema (>= 4.1)
136
132
  memoist3 (1.0.0)
137
133
  mini_mime (1.1.5)
138
- minitest (6.0.2)
134
+ minitest (6.0.5)
139
135
  drb (~> 2.0)
140
136
  prism (~> 1.5)
141
137
  minitest-mock (5.27.0)
142
- minitest-reporters (1.7.1)
138
+ minitest-reporters (1.8.0)
143
139
  ansi
144
140
  builder
145
- minitest (>= 5.0)
141
+ minitest (>= 5.0, < 7)
146
142
  ruby-progressbar
147
143
  minitest-retry (0.3.1)
148
144
  minitest (>= 5.0)
@@ -169,6 +165,9 @@ GEM
169
165
  racc (~> 1.4)
170
166
  nokogiri (1.19.1-x86_64-linux-musl)
171
167
  racc (~> 1.4)
168
+ octokit (10.0.0)
169
+ faraday (>= 1, < 3)
170
+ sawyer (~> 0.9)
172
171
  online (0.3.0)
173
172
  openssl (>= 3)
174
173
  timeout (~> 0.4)
@@ -177,22 +176,22 @@ GEM
177
176
  ostruct (0.6.3)
178
177
  others (0.1.1)
179
178
  parallel (1.27.0)
180
- parser (3.3.10.2)
179
+ parser (3.3.11.1)
181
180
  ast (~> 2.4.1)
182
181
  racc
183
182
  prism (1.9.0)
184
183
  psych (5.3.1)
185
184
  date
186
185
  stringio
187
- public_suffix (7.0.2)
188
- qbash (0.8.0)
186
+ public_suffix (7.0.5)
187
+ qbash (0.8.2)
189
188
  backtrace (> 0)
190
189
  elapsed (> 0)
191
190
  loog (> 0)
192
191
  tago (> 0)
193
192
  racc (1.8.1)
194
193
  rainbow (3.1.1)
195
- rake (13.3.1)
194
+ rake (13.4.2)
196
195
  random-port (0.8.2)
197
196
  tago (~> 0.0)
198
197
  rdoc (7.2.0)
@@ -202,19 +201,18 @@ GEM
202
201
  regexp_parser (2.11.3)
203
202
  retries (0.0.5)
204
203
  rexml (3.4.4)
205
- rubocop (1.85.0)
204
+ rubocop (1.86.1)
206
205
  json (~> 2.3)
207
206
  language_server-protocol (~> 3.17.0.2)
208
207
  lint_roller (~> 1.1.0)
209
- mcp (~> 0.6)
210
- parallel (~> 1.10)
208
+ parallel (>= 1.10)
211
209
  parser (>= 3.3.0.2)
212
210
  rainbow (>= 2.2.2, < 4.0)
213
211
  regexp_parser (>= 2.9.3, < 3.0)
214
212
  rubocop-ast (>= 1.49.0, < 2.0)
215
213
  ruby-progressbar (~> 1.7)
216
214
  unicode-display_width (>= 2.4.0, < 4.0)
217
- rubocop-ast (1.49.0)
215
+ rubocop-ast (1.49.1)
218
216
  parser (>= 3.3.7.2)
219
217
  prism (~> 1.7)
220
218
  rubocop-minitest (0.39.1)
@@ -229,6 +227,9 @@ GEM
229
227
  lint_roller (~> 1.1)
230
228
  rubocop (>= 1.72.1)
231
229
  ruby-progressbar (1.13.0)
230
+ sawyer (0.9.3)
231
+ addressable (>= 2.3.5)
232
+ faraday (>= 0.17.3, < 3)
232
233
  simplecov (0.22.0)
233
234
  docile (~> 1.1)
234
235
  simplecov-html (~> 0.11)
@@ -239,9 +240,13 @@ GEM
239
240
  simplecov-html (0.13.2)
240
241
  simplecov_json_formatter (0.1.4)
241
242
  stringio (3.2.0)
242
- sys-uname (1.5.0)
243
+ sys-uname (1.5.1)
244
+ ffi (~> 1.1)
245
+ memoist3 (~> 1.0.0)
246
+ sys-uname (1.5.1-universal-mingw32)
243
247
  ffi (~> 1.1)
244
248
  memoist3 (~> 1.0.0)
249
+ win32ole
245
250
  tago (0.7.0)
246
251
  timeout (0.6.0)
247
252
  total (0.4.2)
@@ -256,10 +261,11 @@ GEM
256
261
  json (>= 1.8)
257
262
  nokogiri (~> 1.6)
258
263
  rexml (~> 3.2)
259
- webmock (3.26.1)
264
+ webmock (3.26.2)
260
265
  addressable (>= 2.8.0)
261
266
  crack (>= 0.3.2)
262
267
  hashdiff (>= 0.4.0, < 2.0.0)
268
+ win32ole (1.9.3)
263
269
  yaml (0.4.0)
264
270
  yard (0.9.38)
265
271
 
@@ -276,7 +282,7 @@ PLATFORMS
276
282
 
277
283
  DEPENDENCIES
278
284
  base64 (~> 0.3)
279
- cucumber (~> 10.0)
285
+ cucumber (~> 11.0)
280
286
  diff-lcs (= 1.6.2)
281
287
  judges!
282
288
  minitest (~> 6.0)
data/README.md CHANGED
@@ -84,6 +84,60 @@ of Ruby scripts that are executed after the judge
84
84
  The `expected_failure` (default: `[]`) is a list of strings that must
85
85
  be present in the message of the exception being raised.
86
86
 
87
+ ## Architecture
88
+
89
+ The core data structure is a
90
+ [Factbase](https://github.com/yegor256/factbase) — a flat, schemaless,
91
+ binary-serialized collection of facts (records with named attributes)
92
+ held in memory during a run. Facts are queried via
93
+ [XPath](https://www.w3.org/TR/xpath/) expressions rather than SQL.
94
+ There is no schema to migrate, no ORM layer, and no database process
95
+ to manage. The factbase binary file is read at the start of each
96
+ `update` run and written back on exit, making state portable and
97
+ inspectable via `judges print`. This differs from tools such as
98
+ [Sidekiq](https://sidekiq.org/) or
99
+ [ActiveJob](https://guides.rubyonrails.org/active_job_basics.html),
100
+ which depend on an external database or message broker.
101
+
102
+ Each judge is a single `.rb` Ruby file in its own directory. It is
103
+ not a class, a module, or a Rake task — it is a plain script loaded
104
+ with Ruby's `load(file, true)`, which wraps it in an anonymous module
105
+ and prevents constants in one judge from leaking into another. All
106
+ context is injected as Ruby global variables: `$fb` (the factbase),
107
+ `$loog` (logging), `$options` (configuration), `$global` (shared
108
+ across all judges in a run), and `$local` (reset after each judge).
109
+ A new judge author needs to know only those variables; there is no
110
+ base class to inherit and no interface contract to satisfy.
111
+
112
+ The `update` command runs all judges in repeated cycles until the
113
+ factbase stops changing (zero churn) or until the `--max-cycles` or
114
+ `--lifetime` limit is reached. This fixed-point convergence model is
115
+ analogous to [Datalog](https://en.wikipedia.org/wiki/Datalog): a
116
+ judge that inserts a fact in one cycle may trigger a different judge
117
+ in the next cycle, without any explicit dependency declaration.
118
+ Pipeline tools such as
119
+ [Apache Airflow](https://airflow.apache.org/) or
120
+ [GitHub Actions](https://docs.github.com/en/actions) require a
121
+ directed acyclic graph defined upfront; judges require none.
122
+
123
+ Every judge directory contains `.yml` test files alongside its `.rb`
124
+ script. A YAML file declares the initial facts (`input`), the count
125
+ of judge executions (`runs`), prerequisite judges (`before`),
126
+ post-condition scripts (`after`), and
127
+ [XPath](https://www.w3.org/TR/xpath/) assertions the factbase must
128
+ satisfy when the judge finishes (`expected`). Running `judges test`
129
+ creates a fresh, in-memory factbase per test case. Co-locating tests
130
+ with the script keeps each judge directory self-contained: one
131
+ directory holds both the deliverable and its verification.
132
+
133
+ The `push` and `pull` commands exchange the binary factbase with a
134
+ remote [Baza](https://github.com/yegor256/baza.rb) server via a
135
+ named-lock protocol. `pull` acquires the lock and downloads the
136
+ file; `push` uploads the modified file and releases the lock. This
137
+ lets distributed CI pipelines share a single evolving factbase
138
+ across multiple jobs without running a database: each job pulls,
139
+ runs `update` locally, and pushes back.
140
+
87
141
  ## How to contribute
88
142
 
89
143
  Read
data/judges.gemspec CHANGED
@@ -9,7 +9,7 @@ Gem::Specification.new do |s|
9
9
  s.required_rubygems_version = Gem::Requirement.new('>= 0') if s.respond_to? :required_rubygems_version=
10
10
  s.required_ruby_version = '>=3.2'
11
11
  s.name = 'judges'
12
- s.version = '0.60.1'
12
+ s.version = '0.60.3'
13
13
  s.license = 'MIT'
14
14
  s.summary = 'Command-Line Tool for a Factbase'
15
15
  s.description =
@@ -36,6 +36,7 @@ Gem::Specification.new do |s|
36
36
  s.add_dependency 'loog', '~>0.6'
37
37
  s.add_dependency 'moments', '~>0.3'
38
38
  s.add_dependency 'nokogiri', '~>1.10'
39
+ s.add_dependency 'octokit', '~>10.0'
39
40
  s.add_dependency 'others', '~>0.1'
40
41
  s.add_dependency 'retries', '~>0.0'
41
42
  s.add_dependency 'tago', '~>0.2'
@@ -51,9 +51,8 @@ class Judges::Pull
51
51
  end
52
52
  fb.import(baza.pull(wait(name, baza, jid, opts['wait'])))
53
53
  Judges::Impex.new(@loog, args[1]).export(fb)
54
- rescue StandardError => e
54
+ ensure
55
55
  baza.unlock(name, opts['owner'])
56
- raise e
57
56
  end
58
57
  throw :"👍 Pulled #{fb.size} facts by name '#{name}'"
59
58
  else
data/lib/judges/judge.rb CHANGED
@@ -7,8 +7,10 @@ require 'elapsed'
7
7
  require 'tago'
8
8
  require 'timeout'
9
9
  require 'factbase/tallied'
10
+ require 'octokit'
10
11
  require_relative '../judges'
11
12
  require_relative '../judges/to_rel'
13
+ require_relative '../judges/pretty_exception'
12
14
 
13
15
  # A single judge.
14
16
  # Author:: Yegor Bugayenko (yegor256@gmail.com)
@@ -82,6 +84,7 @@ class Judges::Judge
82
84
  rescue Exception => e
83
85
  # rubocop:enable Lint/RescueException
84
86
  raise e if e.is_a?(RuntimeError) && e.message == 'skip'
87
+ e = Judges::PrettyException.new(e) if e.is_a?(Octokit::ServerError)
85
88
  @loog.error(Backtrace.new(e))
86
89
  raise e if e.is_a?(StandardError)
87
90
  raise e if e.is_a?(Timeout::ExitException)
data/lib/judges/judges.rb CHANGED
@@ -78,7 +78,7 @@ class Judges::Judges
78
78
  next unless File.directory?(d)
79
79
  b = File.basename(d)
80
80
  next unless File.exist?(File.join(d, "#{b}.rb"))
81
- Judges::Judge.new(File.absolute_path(d), @lib, @loog)
81
+ Judges::Judge.new(File.absolute_path(d), @lib, @loog, epoch: @epoch)
82
82
  end
83
83
  list.compact!
84
84
  list.sort_by!(&:name)
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ # SPDX-FileCopyrightText: Copyright (c) 2024-2026 Yegor Bugayenko
4
+ # SPDX-License-Identifier: MIT
5
+
6
+ require 'delegate'
7
+ require 'ellipsized'
8
+ require_relative '../judges'
9
+
10
+ # Decorates the exception for show ellipsed message.
11
+ class Judges::PrettyException < SimpleDelegator
12
+ undef_method :class
13
+ undef_method :instance_of?
14
+ undef_method :kind_of?
15
+
16
+ def message
17
+ __getobj__.message.ellipsized(100, :right)
18
+ end
19
+ end
data/lib/judges.rb CHANGED
@@ -8,5 +8,5 @@
8
8
  # Copyright:: Copyright (c) 2024-2026 Yegor Bugayenko
9
9
  # License:: MIT
10
10
  module Judges
11
- VERSION = '0.60.1' unless const_defined?(:VERSION)
11
+ VERSION = '0.60.3' unless const_defined?(:VERSION)
12
12
  end
data/package-lock.json CHANGED
@@ -52,15 +52,15 @@
52
52
  }
53
53
  },
54
54
  "node_modules/@eslint/config-array": {
55
- "version": "0.21.1",
56
- "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.1.tgz",
57
- "integrity": "sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==",
55
+ "version": "0.21.2",
56
+ "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.2.tgz",
57
+ "integrity": "sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw==",
58
58
  "dev": true,
59
59
  "license": "Apache-2.0",
60
60
  "dependencies": {
61
61
  "@eslint/object-schema": "^2.1.7",
62
62
  "debug": "^4.3.1",
63
- "minimatch": "^3.1.2"
63
+ "minimatch": "^3.1.5"
64
64
  },
65
65
  "engines": {
66
66
  "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -93,20 +93,20 @@
93
93
  }
94
94
  },
95
95
  "node_modules/@eslint/eslintrc": {
96
- "version": "3.3.1",
97
- "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz",
98
- "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==",
96
+ "version": "3.3.5",
97
+ "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.5.tgz",
98
+ "integrity": "sha512-4IlJx0X0qftVsN5E+/vGujTRIFtwuLbNsVUe7TO6zYPDR1O6nFwvwhIKEKSrl6dZchmYBITazxKoUYOjdtjlRg==",
99
99
  "dev": true,
100
100
  "license": "MIT",
101
101
  "dependencies": {
102
- "ajv": "^6.12.4",
102
+ "ajv": "^6.14.0",
103
103
  "debug": "^4.3.2",
104
104
  "espree": "^10.0.1",
105
105
  "globals": "^14.0.0",
106
106
  "ignore": "^5.2.0",
107
107
  "import-fresh": "^3.2.1",
108
- "js-yaml": "^4.1.0",
109
- "minimatch": "^3.1.2",
108
+ "js-yaml": "^4.1.1",
109
+ "minimatch": "^3.1.5",
110
110
  "strip-json-comments": "^3.1.1"
111
111
  },
112
112
  "engines": {
@@ -117,9 +117,9 @@
117
117
  }
118
118
  },
119
119
  "node_modules/@eslint/js": {
120
- "version": "9.39.2",
121
- "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.2.tgz",
122
- "integrity": "sha512-q1mjIoW1VX4IvSocvM/vbTiveKC4k9eLrajNEuSsmjymSDEbpGddtpfOoN7YGAqBK3NG+uqo8ia4PDTt8buCYA==",
120
+ "version": "9.39.4",
121
+ "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.4.tgz",
122
+ "integrity": "sha512-nE7DEIchvtiFTwBw4Lfbu59PG+kCofhjsKaCWzxTpt4lfRjRMqG6uMBzKXuEcyXhOHoUp9riAm7/aWYGhXZ9cw==",
123
123
  "dev": true,
124
124
  "license": "MIT",
125
125
  "engines": {
@@ -239,7 +239,6 @@
239
239
  "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==",
240
240
  "dev": true,
241
241
  "license": "MIT",
242
- "peer": true,
243
242
  "bin": {
244
243
  "acorn": "bin/acorn"
245
244
  },
@@ -258,9 +257,9 @@
258
257
  }
259
258
  },
260
259
  "node_modules/ajv": {
261
- "version": "6.12.6",
262
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
263
- "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
260
+ "version": "6.14.0",
261
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz",
262
+ "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==",
264
263
  "dev": true,
265
264
  "license": "MIT",
266
265
  "dependencies": {
@@ -305,9 +304,9 @@
305
304
  "license": "MIT"
306
305
  },
307
306
  "node_modules/brace-expansion": {
308
- "version": "1.1.11",
309
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
310
- "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
307
+ "version": "1.1.12",
308
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz",
309
+ "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==",
311
310
  "dev": true,
312
311
  "license": "MIT",
313
312
  "dependencies": {
@@ -423,26 +422,25 @@
423
422
  }
424
423
  },
425
424
  "node_modules/eslint": {
426
- "version": "9.39.2",
427
- "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.2.tgz",
428
- "integrity": "sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==",
425
+ "version": "9.39.4",
426
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.4.tgz",
427
+ "integrity": "sha512-XoMjdBOwe/esVgEvLmNsD3IRHkm7fbKIUGvrleloJXUZgDHig2IPWNniv+GwjyJXzuNqVjlr5+4yVUZjycJwfQ==",
429
428
  "dev": true,
430
429
  "license": "MIT",
431
- "peer": true,
432
430
  "dependencies": {
433
431
  "@eslint-community/eslint-utils": "^4.8.0",
434
432
  "@eslint-community/regexpp": "^4.12.1",
435
- "@eslint/config-array": "^0.21.1",
433
+ "@eslint/config-array": "^0.21.2",
436
434
  "@eslint/config-helpers": "^0.4.2",
437
435
  "@eslint/core": "^0.17.0",
438
- "@eslint/eslintrc": "^3.3.1",
439
- "@eslint/js": "9.39.2",
436
+ "@eslint/eslintrc": "^3.3.5",
437
+ "@eslint/js": "9.39.4",
440
438
  "@eslint/plugin-kit": "^0.4.1",
441
439
  "@humanfs/node": "^0.16.6",
442
440
  "@humanwhocodes/module-importer": "^1.0.1",
443
441
  "@humanwhocodes/retry": "^0.4.2",
444
442
  "@types/estree": "^1.0.6",
445
- "ajv": "^6.12.4",
443
+ "ajv": "^6.14.0",
446
444
  "chalk": "^4.0.0",
447
445
  "cross-spawn": "^7.0.6",
448
446
  "debug": "^4.3.2",
@@ -461,7 +459,7 @@
461
459
  "is-glob": "^4.0.0",
462
460
  "json-stable-stringify-without-jsonify": "^1.0.1",
463
461
  "lodash.merge": "^4.6.2",
464
- "minimatch": "^3.1.2",
462
+ "minimatch": "^3.1.5",
465
463
  "natural-compare": "^1.4.0",
466
464
  "optionator": "^0.9.3"
467
465
  },
@@ -753,9 +751,9 @@
753
751
  "license": "ISC"
754
752
  },
755
753
  "node_modules/js-yaml": {
756
- "version": "4.1.0",
757
- "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
758
- "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
754
+ "version": "4.1.1",
755
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz",
756
+ "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==",
759
757
  "dev": true,
760
758
  "license": "MIT",
761
759
  "dependencies": {
@@ -834,9 +832,9 @@
834
832
  "license": "MIT"
835
833
  },
836
834
  "node_modules/minimatch": {
837
- "version": "3.1.2",
838
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
839
- "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
835
+ "version": "3.1.5",
836
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz",
837
+ "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==",
840
838
  "dev": true,
841
839
  "license": "ISC",
842
840
  "dependencies": {
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: judges
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.60.1
4
+ version: 0.60.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Yegor Bugayenko
@@ -163,6 +163,20 @@ dependencies:
163
163
  - - "~>"
164
164
  - !ruby/object:Gem::Version
165
165
  version: '1.10'
166
+ - !ruby/object:Gem::Dependency
167
+ name: octokit
168
+ requirement: !ruby/object:Gem::Requirement
169
+ requirements:
170
+ - - "~>"
171
+ - !ruby/object:Gem::Version
172
+ version: '10.0'
173
+ type: :runtime
174
+ prerelease: false
175
+ version_requirements: !ruby/object:Gem::Requirement
176
+ requirements:
177
+ - - "~>"
178
+ - !ruby/object:Gem::Version
179
+ version: '10.0'
166
180
  - !ruby/object:Gem::Dependency
167
181
  name: others
168
182
  requirement: !ruby/object:Gem::Requirement
@@ -312,6 +326,7 @@ files:
312
326
  - lib/judges/judge.rb
313
327
  - lib/judges/judges.rb
314
328
  - lib/judges/options.rb
329
+ - lib/judges/pretty_exception.rb
315
330
  - lib/judges/statistics.rb
316
331
  - lib/judges/to_rel.rb
317
332
  - package-lock.json