judges 0.34.0 ā†’ 0.36.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 0e26309233bda6e09c9673cc9b17b3a6309897e2e2a19505288889fe947af3d7
4
- data.tar.gz: 895a20352dd34b430f3001de0ba8c5eb97e0f1fd2de77386ad63d9282831e021
3
+ metadata.gz: 18f43a54137335635c83546194f70f967bb731b09b33776c9ee8b5539cd5475a
4
+ data.tar.gz: 9ecd3d91db07e3f7602493ca6c19efb6f975647b2550ef1a6e07aa784fc0f822
5
5
  SHA512:
6
- metadata.gz: 7bb06d82f69a67972774c2a7ef92bfc1655bcd30f4c162cae6d1669192725a3e7fc28efecaab9fda0bf3ac4a31b84725412248009ff22a7c77e289ae0699947c
7
- data.tar.gz: 621ea22a9b604c2433e07ff6a5c241c86d8559de17b59def8d2878477fe5c4340a565090daa38770b054d81960ec45250db10282dd356b05367397fba066e65c
6
+ metadata.gz: fdf630e6da9a50c250b195c0220f16274065c0ee6a92e237a393d31f62769637fdb18fd064b6c479b9bf8c2605eda772ffb9985a37593e187b44020cf49e73b1
7
+ data.tar.gz: 32d39b254fac069747749c24e093b6e73fbfc09ca740a577e1c71804c8365eda13914f58e79e83947b8550c0f752f9054405e1e4aa4daa464e17ebc7e173dc0d
data/.gitignore CHANGED
@@ -1,10 +1,11 @@
1
- coverage/
2
- .idea/
3
1
  *.gem
4
- .bundle/
5
2
  .DS_Store
6
- rdoc/
7
- doc/
3
+ .bundle/
4
+ .idea/
8
5
  .yardoc/
6
+ coverage/
7
+ doc/
8
+ node_modules/
9
+ rdoc/
9
10
  temp/
10
11
  vendor/
data/.rultor.yml CHANGED
@@ -3,7 +3,7 @@
3
3
  ---
4
4
  # yamllint disable rule:line-length
5
5
  docker:
6
- image: yegor256/rultor-ruby
6
+ image: yegor256/ruby
7
7
  assets:
8
8
  rubygems.yml: yegor256/home#assets/rubygems.yml
9
9
  install: |
data/Gemfile CHANGED
@@ -12,7 +12,7 @@ gem 'minitest-reporters', '1.7.1', require: false
12
12
  gem 'rake', '13.2.1', require: false
13
13
  gem 'random-port', '~>0.0', require: false
14
14
  gem 'rspec-rails', '7.1.1', require: false
15
- gem 'rubocop', '1.72.2', require: false
15
+ gem 'rubocop', '1.73.1', require: false
16
16
  gem 'rubocop-minitest', '>0', require: false
17
17
  gem 'rubocop-performance', '>0', require: false
18
18
  gem 'rubocop-rake', '>0', require: false
data/Gemfile.lock CHANGED
@@ -6,7 +6,7 @@ PATH
6
6
  baza.rb (~> 0)
7
7
  concurrent-ruby (~> 1.2)
8
8
  elapsed (~> 0)
9
- factbase (>= 0.7.0)
9
+ factbase (= 0.7.4)
10
10
  gli (~> 2.21)
11
11
  iri (~> 0)
12
12
  loog (~> 0)
@@ -16,6 +16,7 @@ PATH
16
16
  retries (~> 0)
17
17
  tago (~> 0)
18
18
  timeout (~> 0)
19
+ total (~> 0)
19
20
  typhoeus (~> 1.3)
20
21
 
21
22
  GEM
@@ -113,7 +114,7 @@ GEM
113
114
  erubi (1.13.1)
114
115
  ethon (0.16.0)
115
116
  ffi (>= 1.15.0)
116
- factbase (0.7.3)
117
+ factbase (0.7.4)
117
118
  backtrace (> 0)
118
119
  decoor (> 0)
119
120
  json (~> 2.7)
@@ -253,7 +254,7 @@ GEM
253
254
  rspec-mocks (~> 3.13)
254
255
  rspec-support (~> 3.13)
255
256
  rspec-support (3.13.2)
256
- rubocop (1.72.2)
257
+ rubocop (1.73.1)
257
258
  json (~> 2.3)
258
259
  language_server-protocol (~> 3.17.0.2)
259
260
  lint_roller (~> 1.1.0)
@@ -264,7 +265,7 @@ GEM
264
265
  rubocop-ast (>= 1.38.0, < 2.0)
265
266
  ruby-progressbar (~> 1.7)
266
267
  unicode-display_width (>= 2.4.0, < 4.0)
267
- rubocop-ast (1.38.0)
268
+ rubocop-ast (1.38.1)
268
269
  parser (>= 3.3.1.0)
269
270
  rubocop-minitest (0.37.1)
270
271
  lint_roller (~> 1.1)
@@ -297,6 +298,7 @@ GEM
297
298
  tago (0.0.2)
298
299
  thor (1.3.2)
299
300
  timeout (0.4.3)
301
+ total (0.4.1)
300
302
  typhoeus (1.4.1)
301
303
  ethon (>= 0.9.0)
302
304
  tzinfo (2.0.6)
@@ -304,7 +306,7 @@ GEM
304
306
  unicode-display_width (3.1.4)
305
307
  unicode-emoji (~> 4.0, >= 4.0.4)
306
308
  unicode-emoji (4.0.4)
307
- uri (1.0.2)
309
+ uri (1.0.3)
308
310
  useragent (0.16.11)
309
311
  w3c_validators (1.3.7)
310
312
  json (>= 1.8)
@@ -336,7 +338,7 @@ DEPENDENCIES
336
338
  rake (= 13.2.1)
337
339
  random-port (~> 0.0)
338
340
  rspec-rails (= 7.1.1)
339
- rubocop (= 1.72.2)
341
+ rubocop (= 1.73.1)
340
342
  rubocop-minitest (> 0)
341
343
  rubocop-performance (> 0)
342
344
  rubocop-rake (> 0)
data/README.md CHANGED
@@ -86,7 +86,7 @@ be present in the message of the exception being raised.
86
86
 
87
87
  Read
88
88
  [these guidelines](https://www.yegor256.com/2014/04/15/github-guidelines.html).
89
- Make sure you build is green before you contribute
89
+ Make sure your build is green before you contribute
90
90
  your pull request. You will need to have
91
91
  [Ruby](https://www.ruby-lang.org/en/) 3.0+ and
92
92
  [Bundler](https://bundler.io/) installed. Then:
data/bin/judges CHANGED
@@ -7,8 +7,9 @@ $stdout.sync = true
7
7
 
8
8
  require 'gli'
9
9
  require 'loog'
10
+ require 'tago'
10
11
  require 'time'
11
- require 'factbase'
12
+ require 'total'
12
13
  require_relative '../lib/judges'
13
14
 
14
15
  Encoding.default_external = Encoding::UTF_8
@@ -19,8 +20,10 @@ class JudgesGLI extend GLI::App
19
20
  def self.run_it(cmd, ruby)
20
21
  cmd.action do |global, options, args|
21
22
  require_relative "../lib/judges/commands/#{ruby}"
23
+ start = Time.now
22
24
  @@loog.debug("Running '#{ruby}' command...")
23
25
  Object.const_get("Judges::#{ruby.capitalize}").new(@@loog).run(options, args)
26
+ @@loog.debug("Command '#{ruby}' finished in #{start.ago}")
24
27
  end
25
28
  end
26
29
 
@@ -36,16 +39,25 @@ class JudgesGLI extend GLI::App
36
39
 
37
40
  desc 'Make it more verbose, logging as much as possible'
38
41
  switch([:v, :verbose])
42
+ desc 'Version of Factbase to use'
43
+ flag([:factbase], type: String)
39
44
 
40
45
  pre do |global, command, options, args|
41
46
  if global[:verbose]
42
47
  @@loog = Loog::VERBOSE
43
48
  end
44
49
  @@loog.debug("Judges #{Judges::VERSION}")
50
+ if global[:factbase]
51
+ ver = global[:factbase]
52
+ @@loog.debug("Factbase version to be used: '#{ver}' (set via --factbase)")
53
+ gem 'factbase', ver
54
+ end
55
+ require 'factbase'
45
56
  @@loog.debug("Factbase #{Factbase::VERSION}")
46
57
  @@loog.debug("Ruby: #{RUBY_VERSION}-p#{RUBY_PATCHLEVEL}")
47
58
  @@loog.debug("Current directory: #{Dir.getwd}")
48
59
  @@loog.debug("Time: #{Time.now.utc.iso8601}")
60
+ @@loog.debug("Total memory: #{Total::Mem.new.bytes / (1024 * 1024)}Mb")
49
61
  true
50
62
  end
51
63
 
@@ -55,6 +67,8 @@ class JudgesGLI extend GLI::App
55
67
  c.flag([:o, :option], multiple: true, arg_name: '<key=value>')
56
68
  c.desc 'File with options, one k=v pair per line'
57
69
  c.flag([:'options-file'])
70
+ c.desc 'Name of the judge to run (directory name)'
71
+ c.flag([:judge], multiple: true)
58
72
  c.desc 'The location of a Ruby library (directory with .rb files to include)'
59
73
  c.flag([:lib])
60
74
  c.desc 'Maximum time in seconds to spend on every judge (forcefully terminate if over time)'
@@ -72,6 +86,8 @@ class JudgesGLI extend GLI::App
72
86
 
73
87
  desc 'Evaluate a single Ruby expression on the factbase'
74
88
  command :eval do |c|
89
+ c.desc 'Use default logging facility'
90
+ c.switch([:log], default_value: true)
75
91
  run_it(c, 'eval')
76
92
  end
77
93
 
@@ -82,6 +98,8 @@ class JudgesGLI extend GLI::App
82
98
 
83
99
  desc 'Import YAML into a factbase'
84
100
  command :import do |c|
101
+ c.desc 'Use default logging facility'
102
+ c.switch([:log], default_value: true)
85
103
  run_it(c, 'import')
86
104
  end
87
105
 
@@ -15,6 +15,11 @@ Feature: Test
15
15
  Then Stdout contains "All 1 judge(s) and 1 tests passed"
16
16
  And Exit code is zero
17
17
 
18
+ Scenario: Factbase version can be set
19
+ When I run bin/judges with "--factbase 0.7.4 --verbose test --judge guess ./fixtures"
20
+ Then Exit code is zero
21
+ And Stdout contains "Factbase version to be used: '0.7.4'"
22
+
18
23
  Scenario: Simple test of no judges
19
24
  Given I run bin/judges with "test --judge absent_for_sure ./fixtures"
20
25
  Then Exit code is zero
@@ -44,7 +44,7 @@ Feature: Update
44
44
  $fb.insert.foo = 1
45
45
  """
46
46
  Then I run bin/judges with "--verbose update --timeout 1 --quiet . foo.fb"
47
- Then Stdout contains "timed out"
47
+ Then Stdout contains "execution expired"
48
48
  Then Stdout contains "1 judge(s) processed"
49
49
  Then Stdout contains "Update finished in 1 cycle(s), did 0i/0d/0a"
50
50
  And Exit code is zero
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.34.0'
12
+ s.version = '0.36.0'
13
13
  s.license = 'MIT'
14
14
  s.summary = 'Command-Line Tool for a Factbase'
15
15
  s.description =
@@ -29,7 +29,7 @@ Gem::Specification.new do |s|
29
29
  s.add_dependency 'baza.rb', '~>0'
30
30
  s.add_dependency 'concurrent-ruby', '~>1.2'
31
31
  s.add_dependency 'elapsed', '~>0'
32
- s.add_dependency 'factbase', '>=0.7.0'
32
+ s.add_dependency 'factbase', '0.7.4'
33
33
  s.add_dependency 'gli', '~>2.21'
34
34
  s.add_dependency 'iri', '~>0'
35
35
  s.add_dependency 'loog', '~>0'
@@ -39,6 +39,7 @@ Gem::Specification.new do |s|
39
39
  s.add_dependency 'retries', '~>0'
40
40
  s.add_dependency 'tago', '~>0'
41
41
  s.add_dependency 'timeout', '~>0'
42
+ s.add_dependency 'total', '~>0'
42
43
  s.add_dependency 'typhoeus', '~>1.3'
43
44
  s.metadata['rubygems_mfa_required'] = 'true'
44
45
  end
@@ -4,7 +4,6 @@
4
4
  # SPDX-License-Identifier: MIT
5
5
 
6
6
  require 'elapsed'
7
- require 'factbase/looged'
8
7
  require_relative '../../judges'
9
8
  require_relative '../../judges/impex'
10
9
 
@@ -21,12 +20,15 @@ class Judges::Eval
21
20
  @loog = loog
22
21
  end
23
22
 
24
- def run(_opts, args)
23
+ def run(opts, args)
25
24
  raise 'Exactly two arguments required' unless args.size == 2
26
25
  impex = Judges::Impex.new(@loog, args[0])
27
26
  elapsed(@loog, level: Logger::INFO) do
28
27
  $fb = impex.import(strict: false)
29
- $fb = Factbase::Looged.new($fb, @loog)
28
+ if opts['log']
29
+ require 'factbase/logged'
30
+ $fb = Factbase::Logged.new($fb, @loog)
31
+ end
30
32
  expr = args[1]
31
33
  # rubocop:disable Security/Eval
32
34
  eval(expr)
@@ -5,7 +5,6 @@
5
5
 
6
6
  require 'elapsed'
7
7
  require 'time'
8
- require 'factbase/looged'
9
8
  require_relative '../../judges'
10
9
  require_relative '../../judges/impex'
11
10
  require_relative '../../judges/to_rel'
@@ -23,7 +22,7 @@ class Judges::Import
23
22
  @loog = loog
24
23
  end
25
24
 
26
- def run(_opts, args)
25
+ def run(opts, args)
27
26
  raise 'Exactly two arguments required' unless args.size == 2
28
27
  raise "File not found #{args[0].to_rel}" unless File.exist?(args[0])
29
28
  elapsed(@loog, level: Logger::INFO) do
@@ -31,7 +30,10 @@ class Judges::Import
31
30
  @loog.info("YAML loaded from #{args[0].to_rel} (#{yaml.size} facts)")
32
31
  impex = Judges::Impex.new(@loog, args[1])
33
32
  fb = impex.import(strict: false)
34
- fb = Factbase::Looged.new(fb, @loog)
33
+ if opts['log']
34
+ require 'factbase/logged'
35
+ fb = Factbase::Logged.new(fb, @loog)
36
+ end
35
37
  yaml.each do |i|
36
38
  f = fb.insert
37
39
  i.each do |p, v|
@@ -6,7 +6,6 @@
6
6
  require 'nokogiri'
7
7
  require 'factbase'
8
8
  require 'backtrace'
9
- require 'factbase/looged'
10
9
  require 'factbase/to_xml'
11
10
  require 'elapsed'
12
11
  require_relative '../../judges'
@@ -92,7 +91,9 @@ class Judges::Test
92
91
  'Time summaries:',
93
92
  format(fmt, 'Script', 'Seconds'),
94
93
  format(fmt, '---', '---'),
95
- times.map { |script, sec| format(fmt, script, format('%.3f', sec)) }.join("\n ")
94
+ times.sort_by { |_, v| v }.reverse.map do |script, sec|
95
+ format(fmt, script, format('%.3f', sec))
96
+ end.join("\n ")
96
97
  ].join("\n ")
97
98
  )
98
99
  end
@@ -147,7 +148,10 @@ class Judges::Test
147
148
  runs = opts['runs'] || yaml['runs'] || 1
148
149
  (1..runs).each do |r|
149
150
  fbx = fb
150
- fbx = Factbase::Looged.new(fb, @loog) if opts['log']
151
+ if opts['log']
152
+ require 'factbase/logged'
153
+ fbx = Factbase::Logged.new(fb, @loog)
154
+ end
151
155
  expected_failure = yaml['expected_failure']
152
156
  begin
153
157
  judge.run(fbx, {}, {}, options)
@@ -5,15 +5,14 @@
5
5
 
6
6
  require 'backtrace'
7
7
  require 'elapsed'
8
- require 'factbase/looged'
9
8
  require 'factbase/churn'
10
9
  require 'tago'
11
10
  require 'timeout'
12
11
  require_relative '../../judges'
13
- require_relative '../../judges/to_rel'
12
+ require_relative '../../judges/impex'
14
13
  require_relative '../../judges/judges'
15
14
  require_relative '../../judges/options'
16
- require_relative '../../judges/impex'
15
+ require_relative '../../judges/to_rel'
17
16
 
18
17
  # The +update+ command.
19
18
  #
@@ -39,7 +38,10 @@ class Judges::Update
39
38
  start = Time.now
40
39
  impex = Judges::Impex.new(@loog, args[1])
41
40
  fb = impex.import(strict: false)
42
- fb = Factbase::Looged.new(fb, @loog) if opts['log']
41
+ if opts['log']
42
+ require 'factbase/logged'
43
+ fb = Factbase::Logged.new(fb, @loog)
44
+ end
43
45
  options = Judges::Options.new(opts['option'])
44
46
  if opts['options-file']
45
47
  options += Judges::Options.new(
@@ -111,12 +113,13 @@ class Judges::Update
111
113
  global = {}
112
114
  elapsed(@loog, level: Logger::INFO) do
113
115
  done =
114
- judges.each_with_index do |p, i|
115
- @loog.info("\nšŸ‘‰ Running #{p.name} (##{i}) at #{p.dir.to_rel} (#{start.ago} already)...")
116
+ judges.each_with_index do |judge, i|
117
+ next unless include?(opts, judge.name)
118
+ @loog.info("\nšŸ‘‰ Running #{judge.name} (##{i}) at #{judge.dir.to_rel} (#{start.ago} already)...")
116
119
  elapsed(@loog, level: Logger::INFO) do
117
- c = one_judge(opts, fb, p, global, options, errors)
120
+ c = one_judge(opts, fb, judge, global, options, errors)
118
121
  churn += c
119
- throw :"šŸ‘ The '#{p.name}' judge #{c} out of #{fb.size}"
122
+ throw :"šŸ‘ The '#{judge.name}' judge #{c} out of #{fb.size}"
120
123
  end
121
124
  rescue StandardError, SyntaxError => e
122
125
  @loog.warn(Backtrace.new(e))
@@ -152,4 +155,10 @@ class Judges::Update
152
155
  throw :"šŸ‘Ž The '#{judge.name}' judge timed out: #{e.message}"
153
156
  end
154
157
  end
158
+
159
+ def include?(opts, name)
160
+ judges = opts['judge'] || []
161
+ return true if judges.empty?
162
+ judges.any?(name)
163
+ end
155
164
  end
data/lib/judges/judge.rb CHANGED
@@ -55,6 +55,11 @@ class Judges::Judge
55
55
  elapsed(@loog, intro: "#{$judge} finished", level: Logger::INFO) do
56
56
  load(s, true)
57
57
  $fb.churn
58
+ # rubocop:disable Lint/RescueException
59
+ rescue Exception => e
60
+ # rubocop:enable Lint/RescueException
61
+ @loog.error(Backtrace.new(e))
62
+ raise e.message
58
63
  ensure
59
64
  $fb = $judge = $options = $loog = nil
60
65
  end
data/lib/judges.rb CHANGED
@@ -8,5 +8,5 @@
8
8
  # Copyright:: Copyright (c) 2024-2025 Yegor Bugayenko
9
9
  # License:: MIT
10
10
  module Judges
11
- VERSION = '0.34.0'
11
+ VERSION = '0.36.0'
12
12
  end
@@ -28,6 +28,17 @@ class TestUpdate < Minitest::Test
28
28
  end
29
29
  end
30
30
 
31
+ def test_with_only_one_judge
32
+ Dir.mktmpdir do |d|
33
+ save_it(File.join(d, 'foo/foo.rb'), 'return if $fb.size > 2; $fb.insert')
34
+ save_it(File.join(d, 'bar/bar.rb'), '-&- bug here -&-')
35
+ file = File.join(d, 'base.fb')
36
+ Judges::Update.new(Loog::NULL).run({ 'judge' => ['foo'] }, [d, file])
37
+ assert_path_exists(file)
38
+ assert_raises(StandardError) { Judges::Update.new(Loog::NULL).run({}, [d, file]) }
39
+ end
40
+ end
41
+
31
42
  def test_cancels_slow_judge
32
43
  Dir.mktmpdir do |d|
33
44
  save_it(File.join(d, 'foo/foo.rb'), 'sleep 10; $fb.insert.foo = 1')
metadata CHANGED
@@ -1,14 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: judges
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.34.0
4
+ version: 0.36.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Yegor Bugayenko
8
- autorequire:
9
8
  bindir: bin
10
9
  cert_chain: []
11
- date: 2025-02-25 00:00:00.000000000 Z
10
+ date: 2025-03-03 00:00:00.000000000 Z
12
11
  dependencies:
13
12
  - !ruby/object:Gem::Dependency
14
13
  name: backtrace
@@ -70,16 +69,16 @@ dependencies:
70
69
  name: factbase
71
70
  requirement: !ruby/object:Gem::Requirement
72
71
  requirements:
73
- - - ">="
72
+ - - '='
74
73
  - !ruby/object:Gem::Version
75
- version: 0.7.0
74
+ version: 0.7.4
76
75
  type: :runtime
77
76
  prerelease: false
78
77
  version_requirements: !ruby/object:Gem::Requirement
79
78
  requirements:
80
- - - ">="
79
+ - - '='
81
80
  - !ruby/object:Gem::Version
82
- version: 0.7.0
81
+ version: 0.7.4
83
82
  - !ruby/object:Gem::Dependency
84
83
  name: gli
85
84
  requirement: !ruby/object:Gem::Requirement
@@ -206,6 +205,20 @@ dependencies:
206
205
  - - "~>"
207
206
  - !ruby/object:Gem::Version
208
207
  version: '0'
208
+ - !ruby/object:Gem::Dependency
209
+ name: total
210
+ requirement: !ruby/object:Gem::Requirement
211
+ requirements:
212
+ - - "~>"
213
+ - !ruby/object:Gem::Version
214
+ version: '0'
215
+ type: :runtime
216
+ prerelease: false
217
+ version_requirements: !ruby/object:Gem::Requirement
218
+ requirements:
219
+ - - "~>"
220
+ - !ruby/object:Gem::Version
221
+ version: '0'
209
222
  - !ruby/object:Gem::Dependency
210
223
  name: typhoeus
211
224
  requirement: !ruby/object:Gem::Requirement
@@ -318,7 +331,6 @@ licenses:
318
331
  - MIT
319
332
  metadata:
320
333
  rubygems_mfa_required: 'true'
321
- post_install_message:
322
334
  rdoc_options:
323
335
  - "--charset=UTF-8"
324
336
  require_paths:
@@ -334,8 +346,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
334
346
  - !ruby/object:Gem::Version
335
347
  version: '0'
336
348
  requirements: []
337
- rubygems_version: 3.4.10
338
- signing_key:
349
+ rubygems_version: 3.6.2
339
350
  specification_version: 4
340
351
  summary: Command-Line Tool for a Factbase
341
352
  test_files: []