judges 0.17.0 → 0.18.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/workflows/copyrights.yml +1 -1
- data/.rubocop.yml +2 -0
- data/Gemfile +1 -0
- data/Gemfile.lock +8 -1
- data/README.md +5 -0
- data/features/test.feature +23 -0
- data/judges.gemspec +1 -1
- data/lib/judges/baza.rb +2 -2
- data/lib/judges/commands/pull.rb +5 -4
- data/lib/judges/commands/test.rb +24 -17
- data/lib/judges/judges.rb +10 -2
- data/lib/judges.rb +1 -1
- data/test/commands/test_test.rb +29 -0
- data/test/test__helper.rb +3 -0
- data/test/test_judges.rb +11 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 01de840b5ca098985b5b4cbdc1ea16d96237d3bbed4617971662f5628fad46bf
|
4
|
+
data.tar.gz: e502a04924b0186921fbbc2026e4f7d78eed0ee47ec2f6cdfcfb01c65e092050
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 38e602fda2bc3a1cce738e1633094d7dc0bc8a50fb43ff97e1e28d4da36752bbdb56fac51f98a2cec884b7a3245b701566c7500d817f4a242fbfb0c28cd9b62d
|
7
|
+
data.tar.gz: d9d5761f6384e7898da2cbab0b39a659d22f91a1af61a834f52c038f0162b8ebf08f576a8ea846b9a3818fb5f822c6d018552478d979365fa0226955f7cdc5d3
|
data/.rubocop.yml
CHANGED
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.
|
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
|
data/features/test.feature
CHANGED
@@ -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.
|
29
|
+
s.version = '0.18.0'
|
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
@@ -33,9 +33,7 @@ require_relative '../judges/elapsed'
|
|
33
33
|
# Copyright:: Copyright (c) 2024 Yegor Bugayenko
|
34
34
|
# License:: MIT
|
35
35
|
class Judges::Baza
|
36
|
-
# rubocop:disable Metrics/ParameterLists
|
37
36
|
def initialize(host, port, token, ssl: true, timeout: 30, retries: 3, loog: Loog::NULL)
|
38
|
-
# rubocop:enable Metrics/ParameterLists
|
39
37
|
@host = host
|
40
38
|
@port = port
|
41
39
|
@ssl = ssl
|
@@ -225,6 +223,8 @@ class Judges::Baza
|
|
225
223
|
msg +=
|
226
224
|
', most probably you are trying to reach a wrong server, which doesn\'t ' \
|
227
225
|
'have the URL that it is expected to have'
|
226
|
+
when 0
|
227
|
+
msg += ', most likely an internal error'
|
228
228
|
end
|
229
229
|
raise msg
|
230
230
|
end
|
data/lib/judges/commands/pull.rb
CHANGED
@@ -49,7 +49,7 @@ class Judges::Pull
|
|
49
49
|
elapsed(@loog) do
|
50
50
|
if baza.name_exists?(name)
|
51
51
|
baza.lock(name, opts['owner'])
|
52
|
-
fb.import(baza.pull(wait(baza, baza.recent(name), opts['wait'])))
|
52
|
+
fb.import(baza.pull(wait(name, baza, baza.recent(name), opts['wait'])))
|
53
53
|
Judges::Impex.new(@loog, args[1]).export(fb)
|
54
54
|
throw :"Pulled #{fb.size} facts by the name '#{name}'"
|
55
55
|
else
|
@@ -60,14 +60,15 @@ class Judges::Pull
|
|
60
60
|
|
61
61
|
private
|
62
62
|
|
63
|
-
def wait(baza, id, limit)
|
63
|
+
def wait(name, baza, id, limit)
|
64
64
|
raise 'Waiting time is nil' if limit.nil?
|
65
65
|
start = Time.now
|
66
66
|
loop do
|
67
67
|
break if baza.finished?(id)
|
68
68
|
sleep 1
|
69
|
-
raise
|
70
|
-
|
69
|
+
raise "Time is over, the job ##{id} ('#{name}') is still not finished" if Time.now - start > limit
|
70
|
+
lapsed = Time.now - start
|
71
|
+
@loog.debug("Still waiting for the job ##{id} ('#{name}') to finish... (#{format('%.2f', lapsed)}s already)")
|
71
72
|
end
|
72
73
|
id
|
73
74
|
end
|
data/lib/judges/commands/test.rb
CHANGED
@@ -46,18 +46,19 @@ class Judges::Test
|
|
46
46
|
dir = args[0]
|
47
47
|
@loog.info("Testing judges in #{dir.to_rel}...")
|
48
48
|
errors = []
|
49
|
-
|
49
|
+
tested = 0
|
50
50
|
tests = 0
|
51
51
|
visible = []
|
52
|
+
judges = Judges::Judges.new(dir, opts['lib'], @loog)
|
52
53
|
elapsed(@loog) do
|
53
|
-
|
54
|
-
visible <<
|
55
|
-
next unless include?(opts,
|
56
|
-
@loog.info("\n👉 Testing #{
|
57
|
-
|
54
|
+
judges.each_with_index do |judge, i|
|
55
|
+
visible << judge.name
|
56
|
+
next unless include?(opts, judge.name)
|
57
|
+
@loog.info("\n👉 Testing #{judge.script} (##{i}) in #{judge.dir.to_rel}...")
|
58
|
+
judge.tests.each do |f|
|
58
59
|
tname = File.basename(f).gsub(/\.yml$/, '')
|
59
|
-
visible << " #{
|
60
|
-
next unless include?(opts,
|
60
|
+
visible << " #{judge.name}/#{tname}"
|
61
|
+
next unless include?(opts, judge.name, tname)
|
61
62
|
yaml = YAML.load_file(f, permitted_classes: [Time])
|
62
63
|
if yaml['skip']
|
63
64
|
@loog.info("Skippped #{f.to_rel}")
|
@@ -69,25 +70,31 @@ class Judges::Test
|
|
69
70
|
end
|
70
71
|
@loog.info("🛠️ Testing #{f.to_rel}:")
|
71
72
|
begin
|
72
|
-
|
73
|
+
fb = Factbase.new
|
74
|
+
yaml['before']&.each do |n|
|
75
|
+
j = judges.get(n)
|
76
|
+
@loog.info("Running #{j.script} judge as a pre-condition...")
|
77
|
+
test_one(fb, opts, j, n, yaml, assert: false)
|
78
|
+
end
|
79
|
+
test_one(fb, opts, judge, tname, yaml)
|
73
80
|
tests += 1
|
74
81
|
rescue StandardError => e
|
75
82
|
@loog.warn(Backtrace.new(e))
|
76
83
|
errors << f
|
77
84
|
end
|
78
85
|
end
|
79
|
-
|
86
|
+
tested += 1
|
80
87
|
end
|
81
|
-
throw :'👍 No judges tested' if
|
82
|
-
throw :"👍 All #{
|
83
|
-
throw :"👍 All #{
|
84
|
-
throw :"❌ #{
|
88
|
+
throw :'👍 No judges tested' if tested.zero?
|
89
|
+
throw :"👍 All #{tested} judge(s) but no tests passed" if tests.zero?
|
90
|
+
throw :"👍 All #{tested} judge(s) and #{tests} tests passed" if errors.empty?
|
91
|
+
throw :"❌ #{tested} judge(s) tested, #{errors.size} of them failed"
|
85
92
|
end
|
86
93
|
unless errors.empty?
|
87
94
|
raise "#{errors.size} tests failed" unless opts['quiet']
|
88
95
|
@loog.debug('Not failing the build with tests failures, due to the --quiet option')
|
89
96
|
end
|
90
|
-
return unless
|
97
|
+
return unless tested.zero? || tests.zero?
|
91
98
|
if opts['judge'].nil?
|
92
99
|
raise 'There are seems to be no judges' unless opts['quiet']
|
93
100
|
@loog.debug('Not failing the build with no judges tested, due to the --quiet option')
|
@@ -106,8 +113,7 @@ class Judges::Test
|
|
106
113
|
judges.any? { |n| n.match?(%r{^#{name}(/#{tre})?$}) }
|
107
114
|
end
|
108
115
|
|
109
|
-
def test_one(opts, judge, tname, yaml)
|
110
|
-
fb = Factbase.new
|
116
|
+
def test_one(fb, opts, judge, tname, yaml, assert: true)
|
111
117
|
inputs = yaml['input']
|
112
118
|
inputs&.each do |i|
|
113
119
|
f = fb.insert
|
@@ -127,6 +133,7 @@ class Judges::Test
|
|
127
133
|
fbx = fb
|
128
134
|
fbx = Factbase::Looged.new(fb, @loog) if opts['log']
|
129
135
|
judge.run(fbx, {}, {}, options)
|
136
|
+
next unless assert
|
130
137
|
assert(judge, tname, fb, yaml) if r == runs || opts['assert_once'].is_a?(FalseClass)
|
131
138
|
end
|
132
139
|
end
|
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 [
|
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 [(
|
55
|
+
# @yield [(Judge, Integer)]
|
48
56
|
def each_with_index
|
49
57
|
idx = 0
|
50
58
|
each do |p|
|
data/lib/judges.rb
CHANGED
data/test/commands/test_test.rb
CHANGED
@@ -88,6 +88,35 @@ 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'), '$fb.insert.foo = 42')
|
96
|
+
FileUtils.mkdir_p(File.join(home, 'second'))
|
97
|
+
File.write(File.join(d, 'judges/second/the-second.rb'), '$fb.insert.foo = 55')
|
98
|
+
File.write(
|
99
|
+
File.join(d, 'judges/first/something.yml'),
|
100
|
+
<<-YAML
|
101
|
+
input: []
|
102
|
+
expected:
|
103
|
+
- /fb[count(f)=1]
|
104
|
+
YAML
|
105
|
+
)
|
106
|
+
File.write(
|
107
|
+
File.join(d, 'judges/second/something.yml'),
|
108
|
+
<<-YAML
|
109
|
+
input: []
|
110
|
+
before:
|
111
|
+
- first
|
112
|
+
expected:
|
113
|
+
- /fb[count(f)=2]
|
114
|
+
YAML
|
115
|
+
)
|
116
|
+
Judges::Test.new(Loog::NULL).run({}, [home])
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
91
120
|
def test_one_judge_negative
|
92
121
|
Dir.mktmpdir do |d|
|
93
122
|
File.write(File.join(d, 'foo.rb'), '')
|
data/test/test__helper.rb
CHANGED
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
|
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.
|
4
|
+
version: 0.18.0
|
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-
|
11
|
+
date: 2024-07-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: backtrace
|