judges 0.17.0 → 0.18.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 6fde2252d089419bf5cb20dabc6368db3b70b7a7e6fb116624b3ec2f04811544
4
- data.tar.gz: 80accd532717b42f176b2bcfc9510610e1dc43d9396ed670196782b923ef2c70
3
+ metadata.gz: 8830243b63e62d966d91e5d59b768039df5da4441d83b1ba0c89fb920a782d36
4
+ data.tar.gz: 9f4fbc2cbe61760e6931f193cb92dd2fd764953ed7598c004476ed29de0e2e94
5
5
  SHA512:
6
- metadata.gz: 3bbdd338bea78fe3d8890b7f581d80081828e3391b738fdbf7a507751f5fab1897764e13dea952ecb5fa2c210c2baa577fb72b1b4d5b6e3994aec49d78eea1b4
7
- data.tar.gz: 1e514af2b34b531fbdc70337d3183aeb54d47f8127cda4145ce735724dc7a029e237e09b3c445876c413c1e3c0c660015c648bceef20661fb8b430e00d739692
6
+ metadata.gz: 1843faa46e6a55657226e8a34d32242e069bff03325330ca48ec6026ecefe792781f2647dce0c1fe3c0f21e9e139f23e32d0402ddc8a9b2045b12e8edac0c570
7
+ data.tar.gz: e94b241263ce9b6fd1891312b38359481567ea9568fe76c0143d6680a8f4cab231ee46adc0ebca0c0b2a193c01a38991a74c874cab0798c47b5d38b23ada96b7
@@ -27,4 +27,4 @@ jobs:
27
27
  runs-on: ubuntu-22.04
28
28
  steps:
29
29
  - uses: actions/checkout@v4
30
- - uses: yegor256/copyrights-action@0.0.4
30
+ - uses: yegor256/copyrights-action@0.0.5
data/.rubocop.yml CHANGED
@@ -28,6 +28,8 @@ AllCops:
28
28
  SuggestExtensions: false
29
29
  NewCops: enable
30
30
 
31
+ Metrics/ParameterLists:
32
+ Enabled: false
31
33
  Style/GlobalVars:
32
34
  Enabled: false
33
35
  Metrics/MethodLength:
data/Gemfile CHANGED
@@ -25,6 +25,7 @@ gemspec
25
25
 
26
26
  gem 'cucumber', '9.2.0', require: false
27
27
  gem 'minitest', '5.24.1', require: false
28
+ gem 'minitest-reporters', '1.7.1', require: false
28
29
  gem 'net-ping', '2.0.8', require: false
29
30
  gem 'rake', '13.2.1', require: false
30
31
  gem 'random-port', '~>0.0', require: false
data/Gemfile.lock CHANGED
@@ -46,6 +46,7 @@ GEM
46
46
  tzinfo (~> 2.0)
47
47
  addressable (2.8.7)
48
48
  public_suffix (>= 2.0.2, < 7.0)
49
+ ansi (1.5.0)
49
50
  ast (2.4.2)
50
51
  backtrace (0.4.0)
51
52
  base64 (0.2.0)
@@ -122,6 +123,11 @@ GEM
122
123
  loog (0.5.2)
123
124
  mini_mime (1.1.5)
124
125
  minitest (5.24.1)
126
+ minitest-reporters (1.7.1)
127
+ ansi
128
+ builder
129
+ minitest (>= 5.0)
130
+ ruby-progressbar
125
131
  moments (0.3.0)
126
132
  multi_test (1.1.0)
127
133
  mutex_m (0.2.0)
@@ -174,7 +180,7 @@ GEM
174
180
  zeitwerk (~> 2.6)
175
181
  rainbow (3.1.1)
176
182
  rake (13.2.1)
177
- random-port (0.7.0)
183
+ random-port (0.7.1)
178
184
  rdoc (6.7.0)
179
185
  psych (>= 4.0.0)
180
186
  regexp_parser (2.9.2)
@@ -261,6 +267,7 @@ DEPENDENCIES
261
267
  cucumber (= 9.2.0)
262
268
  judges!
263
269
  minitest (= 5.24.1)
270
+ minitest-reporters (= 1.7.1)
264
271
  net-ping (= 2.0.8)
265
272
  rake (= 13.2.1)
266
273
  random-port (~> 0.0)
data/README.md CHANGED
@@ -34,6 +34,8 @@ global variables available to it:
34
34
  Every `.yml` file must be formatted as such:
35
35
 
36
36
  ```yaml
37
+ before:
38
+ - abc
37
39
  category: slow
38
40
  runs: 1
39
41
  skip: false
@@ -60,6 +62,9 @@ which then may be turned on via the `--category` command line flag.
60
62
  The `runs` (default: `1`) is the number of times the `.rb` script should
61
63
  be executed. After each execution, all expected XPath expressions are validated.
62
64
 
65
+ The `before` (default: `[]`) is a list of judges that must be executed before
66
+ the current one.
67
+
63
68
  ## How to contribute
64
69
 
65
70
  Read
@@ -118,3 +118,26 @@ Feature: Test
118
118
  Then I run bin/judges with "test --enable bad mine"
119
119
  Then Stdout contains "Testing mine/bad/bad.yml"
120
120
  And Exit code is not zero
121
+
122
+ Scenario: Test with a pre-condition
123
+ Given I make a temp directory
124
+ Then I have a "mine/first/first.rb" file with content:
125
+ """
126
+ n = $fb.insert
127
+ n.foo = 42
128
+ """
129
+ Then I have a "mine/second/second.rb" file with content:
130
+ """
131
+ n = $fb.insert
132
+ n.foo = 55
133
+ """
134
+ Then I have a "mine/second/second.yml" file with content:
135
+ """
136
+ ---
137
+ before:
138
+ - first
139
+ expected:
140
+ - /fb[count(f)=2]
141
+ """
142
+ Then I run bin/judges with "test mine"
143
+ And Exit code is zero
data/judges.gemspec CHANGED
@@ -26,7 +26,7 @@ Gem::Specification.new do |s|
26
26
  s.required_rubygems_version = Gem::Requirement.new('>= 0') if s.respond_to? :required_rubygems_version=
27
27
  s.required_ruby_version = '>=3.2'
28
28
  s.name = 'judges'
29
- s.version = '0.17.0'
29
+ s.version = '0.18.1'
30
30
  s.license = 'MIT'
31
31
  s.summary = 'Command-Line Tool for a Factbase'
32
32
  s.description =
data/lib/judges/baza.rb CHANGED
@@ -28,14 +28,17 @@ require 'base64'
28
28
  require_relative '../judges'
29
29
  require_relative '../judges/elapsed'
30
30
 
31
- # Baza.
31
+ # Interface to the API of zerocracy.com.
32
+ #
33
+ # You make an instance of this class and then call one of its methods.
34
+ # The object will make HTTP request to www.zerocracy.com and interpret the
35
+ # results returned.
36
+ #
32
37
  # Author:: Yegor Bugayenko (yegor256@gmail.com)
33
38
  # Copyright:: Copyright (c) 2024 Yegor Bugayenko
34
39
  # License:: MIT
35
40
  class Judges::Baza
36
- # rubocop:disable Metrics/ParameterLists
37
41
  def initialize(host, port, token, ssl: true, timeout: 30, retries: 3, loog: Loog::NULL)
38
- # rubocop:enable Metrics/ParameterLists
39
42
  @host = host
40
43
  @port = port
41
44
  @ssl = ssl
@@ -45,6 +48,11 @@ class Judges::Baza
45
48
  @retries = retries
46
49
  end
47
50
 
51
+ # Push factbase to the server.
52
+ # @param [String] name The name of the job on the server
53
+ # @param [Bytes] data The data to push to the server (binary)
54
+ # @param [Array<String>] meta List of metas, possibly empty
55
+ # @return [Integer] Job ID on the server
48
56
  def push(name, data, meta)
49
57
  id = 0
50
58
  hdrs = headers.merge(
@@ -72,6 +80,9 @@ class Judges::Baza
72
80
  id
73
81
  end
74
82
 
83
+ # Pull factbase from the server.
84
+ # @param [Integer] id The ID of the job on the server
85
+ # @return [Bytes] Binary data pulled
75
86
  def pull(id)
76
87
  data = 0
77
88
  elapsed(@loog) do
@@ -101,6 +112,8 @@ class Judges::Baza
101
112
  end
102
113
 
103
114
  # The job with this ID is finished already?
115
+ # @param [Integer] id The ID of the job on the server
116
+ # @return [Boolean] TRUE if the job is already finished
104
117
  def finished?(id)
105
118
  finished = false
106
119
  elapsed(@loog) do
@@ -119,6 +132,8 @@ class Judges::Baza
119
132
  end
120
133
 
121
134
  # Lock the name.
135
+ # @param [String] name The name of the job on the server
136
+ # @param [String] owner The owner of the lock (any string)
122
137
  def lock(name, owner)
123
138
  elapsed(@loog) do
124
139
  with_retries(max_tries: @retries) do
@@ -134,6 +149,8 @@ class Judges::Baza
134
149
  end
135
150
 
136
151
  # Unlock the name.
152
+ # @param [String] name The name of the job on the server
153
+ # @param [String] owner The owner of the lock (any string)
137
154
  def unlock(name, owner)
138
155
  elapsed(@loog) do
139
156
  with_retries(max_tries: @retries) do
@@ -148,6 +165,9 @@ class Judges::Baza
148
165
  end
149
166
  end
150
167
 
168
+ # Get the ID of the job by the name.
169
+ # @param [String] name The name of the job on the server
170
+ # @return [Integer] The ID of the job on the server
151
171
  def recent(name)
152
172
  job = 0
153
173
  elapsed(@loog) do
@@ -165,6 +185,9 @@ class Judges::Baza
165
185
  job
166
186
  end
167
187
 
188
+ # Check whether the name of the job exists on the server.
189
+ # @param [String] name The name of the job on the server
190
+ # @return [Boolean] TRUE if such name exists
168
191
  def name_exists?(name)
169
192
  exists = 0
170
193
  elapsed(@loog) do
@@ -225,6 +248,8 @@ class Judges::Baza
225
248
  msg +=
226
249
  ', most probably you are trying to reach a wrong server, which doesn\'t ' \
227
250
  'have the URL that it is expected to have'
251
+ when 0
252
+ msg += ', most likely an internal error'
228
253
  end
229
254
  raise msg
230
255
  end
@@ -25,7 +25,11 @@ require_relative '../../judges'
25
25
  require_relative '../../judges/impex'
26
26
  require_relative '../../judges/elapsed'
27
27
 
28
- # Eval.
28
+ # The +eval+ command.
29
+ #
30
+ # This class is instantiated by the +bin/judge+ command line interface. You
31
+ # are not supposed to instantiate it yourself.
32
+ #
29
33
  # Author:: Yegor Bugayenko (yegor256@gmail.com)
30
34
  # Copyright:: Copyright (c) 2024 Yegor Bugayenko
31
35
  # License:: MIT
@@ -27,7 +27,11 @@ require_relative '../../judges/impex'
27
27
  require_relative '../../judges/to_rel'
28
28
  require_relative '../../judges/elapsed'
29
29
 
30
- # Import.
30
+ # The +import+ command.
31
+ #
32
+ # This class is instantiated by the +bin/judge+ command line interface. You
33
+ # are not supposed to instantiate it yourself.
34
+ #
31
35
  # Author:: Yegor Bugayenko (yegor256@gmail.com)
32
36
  # Copyright:: Copyright (c) 2024 Yegor Bugayenko
33
37
  # License:: MIT
@@ -23,7 +23,11 @@
23
23
  require_relative '../../judges'
24
24
  require_relative '../../judges/impex'
25
25
 
26
- # Inspect.
26
+ # The +inspect+ command.
27
+ #
28
+ # This class is instantiated by the +bin/judge+ command line interface. You
29
+ # are not supposed to instantiate it yourself.
30
+ #
27
31
  # Author:: Yegor Bugayenko (yegor256@gmail.com)
28
32
  # Copyright:: Copyright (c) 2024 Yegor Bugayenko
29
33
  # License:: MIT
@@ -24,7 +24,11 @@ require_relative '../../judges'
24
24
  require_relative '../../judges/impex'
25
25
  require_relative '../../judges/elapsed'
26
26
 
27
- # Join.
27
+ # The +join+ command.
28
+ #
29
+ # This class is instantiated by the +bin/judge+ command line interface. You
30
+ # are not supposed to instantiate it yourself.
31
+ #
28
32
  # Author:: Yegor Bugayenko (yegor256@gmail.com)
29
33
  # Copyright:: Copyright (c) 2024 Yegor Bugayenko
30
34
  # License:: MIT
@@ -28,7 +28,11 @@ require_relative '../../judges'
28
28
  require_relative '../../judges/impex'
29
29
  require_relative '../../judges/elapsed'
30
30
 
31
- # Update.
31
+ # The +print+ command.
32
+ #
33
+ # This class is instantiated by the +bin/judge+ command line interface. You
34
+ # are not supposed to instantiate it yourself.
35
+ #
32
36
  # Author:: Yegor Bugayenko (yegor256@gmail.com)
33
37
  # Copyright:: Copyright (c) 2024 Yegor Bugayenko
34
38
  # License:: MIT
@@ -26,7 +26,11 @@ require_relative '../../judges'
26
26
  require_relative '../../judges/impex'
27
27
  require_relative '../../judges/baza'
28
28
 
29
- # Pull.
29
+ # The +pull+ command.
30
+ #
31
+ # This class is instantiated by the +bin/judge+ command line interface. You
32
+ # are not supposed to instantiate it yourself.
33
+ #
30
34
  # Author:: Yegor Bugayenko (yegor256@gmail.com)
31
35
  # Copyright:: Copyright (c) 2024 Yegor Bugayenko
32
36
  # License:: MIT
@@ -49,7 +53,7 @@ class Judges::Pull
49
53
  elapsed(@loog) do
50
54
  if baza.name_exists?(name)
51
55
  baza.lock(name, opts['owner'])
52
- fb.import(baza.pull(wait(baza, baza.recent(name), opts['wait'])))
56
+ fb.import(baza.pull(wait(name, baza, baza.recent(name), opts['wait'])))
53
57
  Judges::Impex.new(@loog, args[1]).export(fb)
54
58
  throw :"Pulled #{fb.size} facts by the name '#{name}'"
55
59
  else
@@ -60,14 +64,15 @@ class Judges::Pull
60
64
 
61
65
  private
62
66
 
63
- def wait(baza, id, limit)
67
+ def wait(name, baza, id, limit)
64
68
  raise 'Waiting time is nil' if limit.nil?
65
69
  start = Time.now
66
70
  loop do
67
71
  break if baza.finished?(id)
68
72
  sleep 1
69
- raise 'Time is over, the job is still not finished' if Time.now - start > limit
70
- @loog.debug("Still waiting for the job ##{id} to finish... (#{format('%.2f', Time.now - start)}s already)")
73
+ raise "Time is over, the job ##{id} ('#{name}') is still not finished" if Time.now - start > limit
74
+ lapsed = Time.now - start
75
+ @loog.debug("Still waiting for the job ##{id} ('#{name}') to finish... (#{format('%.2f', lapsed)}s already)")
71
76
  end
72
77
  id
73
78
  end
@@ -26,7 +26,11 @@ require_relative '../../judges'
26
26
  require_relative '../../judges/impex'
27
27
  require_relative '../../judges/baza'
28
28
 
29
- # Push.
29
+ # The +push+ command.
30
+ #
31
+ # This class is instantiated by the +bin/judge+ command line interface. You
32
+ # are not supposed to instantiate it yourself.
33
+ #
30
34
  # Author:: Yegor Bugayenko (yegor256@gmail.com)
31
35
  # Copyright:: Copyright (c) 2024 Yegor Bugayenko
32
36
  # License:: MIT
@@ -32,7 +32,11 @@ require_relative '../../judges/options'
32
32
  require_relative '../../judges/categories'
33
33
  require_relative '../../judges/elapsed'
34
34
 
35
- # Test.
35
+ # The +test+ command.
36
+ #
37
+ # This class is instantiated by the +bin/judge+ command line interface. You
38
+ # are not supposed to instantiate it yourself.
39
+ #
36
40
  # Author:: Yegor Bugayenko (yegor256@gmail.com)
37
41
  # Copyright:: Copyright (c) 2024 Yegor Bugayenko
38
42
  # License:: MIT
@@ -46,18 +50,19 @@ class Judges::Test
46
50
  dir = args[0]
47
51
  @loog.info("Testing judges in #{dir.to_rel}...")
48
52
  errors = []
49
- judges = 0
53
+ tested = 0
50
54
  tests = 0
51
55
  visible = []
56
+ judges = Judges::Judges.new(dir, opts['lib'], @loog)
52
57
  elapsed(@loog) do
53
- Judges::Judges.new(dir, opts['lib'], @loog).each_with_index do |p, i|
54
- visible << p.name
55
- next unless include?(opts, p.name)
56
- @loog.info("\n👉 Testing #{p.script} (##{i}) in #{p.dir.to_rel}...")
57
- p.tests.each do |f|
58
+ judges.each_with_index do |judge, i|
59
+ visible << judge.name
60
+ next unless include?(opts, judge.name)
61
+ @loog.info("\n👉 Testing #{judge.script} (##{i}) in #{judge.dir.to_rel}...")
62
+ judge.tests.each do |f|
58
63
  tname = File.basename(f).gsub(/\.yml$/, '')
59
- visible << " #{p.name}/#{tname}"
60
- next unless include?(opts, p.name, tname)
64
+ visible << " #{judge.name}/#{tname}"
65
+ next unless include?(opts, judge.name, tname)
61
66
  yaml = YAML.load_file(f, permitted_classes: [Time])
62
67
  if yaml['skip']
63
68
  @loog.info("Skippped #{f.to_rel}")
@@ -69,25 +74,32 @@ class Judges::Test
69
74
  end
70
75
  @loog.info("🛠️ Testing #{f.to_rel}:")
71
76
  begin
72
- test_one(opts, p, tname, yaml)
77
+ fb = Factbase.new
78
+ prepare(fb, yaml)
79
+ yaml['before']&.each do |n|
80
+ j = judges.get(n)
81
+ @loog.info("Running #{j.script} judge as a pre-condition...")
82
+ test_one(fb, opts, j, n, yaml, assert: false)
83
+ end
84
+ test_one(fb, opts, judge, tname, yaml)
73
85
  tests += 1
74
86
  rescue StandardError => e
75
87
  @loog.warn(Backtrace.new(e))
76
88
  errors << f
77
89
  end
78
90
  end
79
- judges += 1
91
+ tested += 1
80
92
  end
81
- throw :'👍 No judges tested' if judges.zero?
82
- throw :"👍 All #{judges} judge(s) but no tests passed" if tests.zero?
83
- throw :"👍 All #{judges} judge(s) and #{tests} tests passed" if errors.empty?
84
- throw :"❌ #{judges} judge(s) tested, #{errors.size} of them failed"
93
+ throw :'👍 No judges tested' if tested.zero?
94
+ throw :"👍 All #{tested} judge(s) but no tests passed" if tests.zero?
95
+ throw :"👍 All #{tested} judge(s) and #{tests} tests passed" if errors.empty?
96
+ throw :"❌ #{tested} judge(s) tested, #{errors.size} of them failed"
85
97
  end
86
98
  unless errors.empty?
87
99
  raise "#{errors.size} tests failed" unless opts['quiet']
88
100
  @loog.debug('Not failing the build with tests failures, due to the --quiet option')
89
101
  end
90
- return unless judges.zero? || tests.zero?
102
+ return unless tested.zero? || tests.zero?
91
103
  if opts['judge'].nil?
92
104
  raise 'There are seems to be no judges' unless opts['quiet']
93
105
  @loog.debug('Not failing the build with no judges tested, due to the --quiet option')
@@ -106,8 +118,7 @@ class Judges::Test
106
118
  judges.any? { |n| n.match?(%r{^#{name}(/#{tre})?$}) }
107
119
  end
108
120
 
109
- def test_one(opts, judge, tname, yaml)
110
- fb = Factbase.new
121
+ def prepare(fb, yaml)
111
122
  inputs = yaml['input']
112
123
  inputs&.each do |i|
113
124
  f = fb.insert
@@ -121,12 +132,16 @@ class Judges::Test
121
132
  end
122
133
  end
123
134
  end
135
+ end
136
+
137
+ def test_one(fb, opts, judge, tname, yaml, assert: true)
124
138
  options = Judges::Options.new(opts['option']) + Judges::Options.new(yaml['options'])
125
139
  runs = opts['runs'] || yaml['runs'] || 1
126
140
  (1..runs).each do |r|
127
141
  fbx = fb
128
142
  fbx = Factbase::Looged.new(fb, @loog) if opts['log']
129
143
  judge.run(fbx, {}, {}, options)
144
+ next unless assert
130
145
  assert(judge, tname, fb, yaml) if r == runs || opts['assert_once'].is_a?(FalseClass)
131
146
  end
132
147
  end
@@ -25,7 +25,11 @@ require_relative '../../judges'
25
25
  require_relative '../../judges/impex'
26
26
  require_relative '../../judges/elapsed'
27
27
 
28
- # Trim.
28
+ # The +trim+ command.
29
+ #
30
+ # This class is instantiated by the +bin/judge+ command line interface. You
31
+ # are not supposed to instantiate it yourself.
32
+ #
29
33
  # Author:: Yegor Bugayenko (yegor256@gmail.com)
30
34
  # Copyright:: Copyright (c) 2024 Yegor Bugayenko
31
35
  # License:: MIT
@@ -30,7 +30,11 @@ require_relative '../../judges/options'
30
30
  require_relative '../../judges/impex'
31
31
  require_relative '../../judges/elapsed'
32
32
 
33
- # Update.
33
+ # The +update+ command.
34
+ #
35
+ # This class is instantiated by the +bin/judge+ command line interface. You
36
+ # are not supposed to instantiate it yourself.
37
+ #
34
38
  # Author:: Yegor Bugayenko (yegor256@gmail.com)
35
39
  # Copyright:: Copyright (c) 2024 Yegor Bugayenko
36
40
  # License:: MIT
data/lib/judges/judges.rb CHANGED
@@ -34,8 +34,16 @@ class Judges::Judges
34
34
  @loog = loog
35
35
  end
36
36
 
37
+ # Get one judge by name.
38
+ # @return [Judge]
39
+ def get(name)
40
+ d = File.absolute_path(File.join(@dir, name))
41
+ raise "Judge #{name} doesn't exist in #{@dir}" unless File.exist?(d)
42
+ Judges::Judge.new(d, @lib, @loog)
43
+ end
44
+
37
45
  # Iterate over them all.
38
- # @yield [Pack]
46
+ # @yield [Judge]
39
47
  def each
40
48
  Dir.glob(File.join(@dir, '**/*.rb')).each do |f|
41
49
  d = File.dirname(File.absolute_path(f))
@@ -44,7 +52,7 @@ class Judges::Judges
44
52
  end
45
53
 
46
54
  # Iterate over them all.
47
- # @yield [(Pack, Integer)]
55
+ # @yield [(Judge, Integer)]
48
56
  def each_with_index
49
57
  idx = 0
50
58
  each do |p|
data/lib/judges.rb CHANGED
@@ -25,5 +25,5 @@
25
25
  # Copyright:: Copyright (c) 2024 Yegor Bugayenko
26
26
  # License:: MIT
27
27
  module Judges
28
- VERSION = '0.17.0'
28
+ VERSION = '0.18.1'
29
29
  end
@@ -88,6 +88,32 @@ class TestTest < Minitest::Test
88
88
  end
89
89
  end
90
90
 
91
+ def test_with_before
92
+ Dir.mktmpdir do |d|
93
+ home = File.join(d, 'judges')
94
+ FileUtils.mkdir_p(File.join(home, 'first'))
95
+ File.write(File.join(d, 'judges/first/the-first.rb'), 'x = $fb.size; $fb.insert.foo = x')
96
+ FileUtils.mkdir_p(File.join(home, 'second'))
97
+ File.write(File.join(d, 'judges/second/the-second.rb'), '$fb.insert.bar = 55')
98
+ File.write(
99
+ File.join(d, 'judges/second/something.yml'),
100
+ <<-YAML
101
+ input:
102
+ -
103
+ hi: 42
104
+ before:
105
+ - first
106
+ expected:
107
+ - /fb[count(f)=3]
108
+ - /fb/f[hi=42]
109
+ - /fb/f[foo=1]
110
+ - /fb/f[bar=55]
111
+ YAML
112
+ )
113
+ Judges::Test.new(Loog::NULL).run({}, [home])
114
+ end
115
+ end
116
+
91
117
  def test_one_judge_negative
92
118
  Dir.mktmpdir do |d|
93
119
  File.write(File.join(d, 'foo.rb'), '')
data/test/test__helper.rb CHANGED
@@ -29,3 +29,6 @@ require 'simplecov-cobertura'
29
29
  SimpleCov.formatter = SimpleCov::Formatter::CoberturaFormatter
30
30
 
31
31
  require 'minitest/autorun'
32
+
33
+ require 'minitest/reporters'
34
+ Minitest::Reporters.use! [Minitest::Reporters::SpecReporter.new]
data/test/test_judges.rb CHANGED
@@ -30,7 +30,7 @@ require_relative '../lib/judges/judges'
30
30
  # Author:: Yegor Bugayenko (yegor256@gmail.com)
31
31
  # Copyright:: Copyright (c) 2024 Yegor Bugayenko
32
32
  # License:: MIT
33
- class TestPacks < Minitest::Test
33
+ class TestJudges < Minitest::Test
34
34
  def test_basic
35
35
  Dir.mktmpdir do |d|
36
36
  File.write(File.join(d, 'foo.rb'), 'hey')
@@ -44,4 +44,14 @@ class TestPacks < Minitest::Test
44
44
  assert_equal(1, found)
45
45
  end
46
46
  end
47
+
48
+ def test_get_one
49
+ Dir.mktmpdir do |d|
50
+ f = File.join(d, 'boo/foo.rb')
51
+ FileUtils.mkdir_p(File.dirname(f))
52
+ File.write(f, 'hey')
53
+ j = Judges::Judges.new(d, nil, Loog::NULL).get('boo')
54
+ assert_equal('foo.rb', j.script)
55
+ end
56
+ end
47
57
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: judges
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.17.0
4
+ version: 0.18.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Yegor Bugayenko
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-07-12 00:00:00.000000000 Z
11
+ date: 2024-07-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: backtrace