judges 0.28.1 ā 0.29.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile.lock +3 -1
- data/bin/judges +2 -0
- data/features/update.feature +13 -0
- data/judges.gemspec +2 -1
- data/lib/judges/commands/update.rb +18 -4
- data/lib/judges/judge.rb +1 -1
- data/lib/judges.rb +1 -1
- data/test/commands/test_update.rb +12 -0
- metadata +16 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ef7c67730c179f98b6f395fbad9be1df9229984b380c52ac6c64767b74ce241e
|
4
|
+
data.tar.gz: bf6b63a2acd86e3c8b411f069367aebaed64f5c36a85997038bf31f19cded3c1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e8c2dd385af7ec0e2f80080e27ddec8479812521efe16ae754726adfce6593c62396fae72d6a635ed9e925aa1dee1f2382f0cdedde24abcfb1a805da925f23f4
|
7
|
+
data.tar.gz: 4597927deaf3e416a86083a2aab8db341469c604aa935e145119da1ad7bbb83319ffceaa6ac50778d33cada2cf5cd5209a5227aa5826c2febb4726b7efc36c28
|
data/Gemfile.lock
CHANGED
@@ -15,6 +15,7 @@ PATH
|
|
15
15
|
others (~> 0)
|
16
16
|
retries (~> 0)
|
17
17
|
tago (~> 0)
|
18
|
+
timeout (~> 0)
|
18
19
|
typhoeus (~> 1.3)
|
19
20
|
|
20
21
|
GEM
|
@@ -195,7 +196,7 @@ GEM
|
|
195
196
|
rack (3.1.8)
|
196
197
|
rack-session (2.0.0)
|
197
198
|
rack (>= 3.0.0)
|
198
|
-
rack-test (2.
|
199
|
+
rack-test (2.2.0)
|
199
200
|
rack (>= 1.3)
|
200
201
|
rackup (2.2.1)
|
201
202
|
rack (>= 3)
|
@@ -274,6 +275,7 @@ GEM
|
|
274
275
|
ffi (~> 1.1)
|
275
276
|
tago (0.0.2)
|
276
277
|
thor (1.3.2)
|
278
|
+
timeout (0.4.3)
|
277
279
|
typhoeus (1.4.1)
|
278
280
|
ethon (>= 0.9.0)
|
279
281
|
tzinfo (2.0.6)
|
data/bin/judges
CHANGED
@@ -72,6 +72,8 @@ class JudgesGLI extend GLI::App
|
|
72
72
|
c.flag([:o, :option], multiple: true, arg_name: '<key=value>')
|
73
73
|
c.desc 'The location of a Ruby library (directory with .rb files to include)'
|
74
74
|
c.flag([:lib])
|
75
|
+
c.desc 'Maximum time in seconds to spend on every judge (forcefully terminate if over time)'
|
76
|
+
c.flag([:'timeout'], default_value: 30, type: Integer)
|
75
77
|
c.desc 'Maximum number of update cycles to run'
|
76
78
|
c.flag([:'max-cycles'], default_value: 8, type: Integer)
|
77
79
|
c.desc 'Stay quiet even if some judges fail'
|
data/features/update.feature
CHANGED
@@ -15,6 +15,19 @@ Feature: Update
|
|
15
15
|
Then Stdout contains "Update finished in 3 cycle(s), modified 3/0 fact(s)"
|
16
16
|
And Exit code is zero
|
17
17
|
|
18
|
+
Scenario: Simple run with a timeout for a judge
|
19
|
+
Given I make a temp directory
|
20
|
+
Then I have a "slow/slow.rb" file with content:
|
21
|
+
"""
|
22
|
+
sleep(10)
|
23
|
+
$fb.insert.foo = 1
|
24
|
+
"""
|
25
|
+
Then I run bin/judges with "--verbose update --timeout 1 --quiet . foo.fb"
|
26
|
+
Then Stdout contains "timed out"
|
27
|
+
Then Stdout contains "1 judge(s) processed"
|
28
|
+
Then Stdout contains "Update finished in 1 cycle(s), modified 0/0 fact(s)"
|
29
|
+
And Exit code is zero
|
30
|
+
|
18
31
|
Scenario: Simple run of a few judges, with a lib
|
19
32
|
Given I make a temp directory
|
20
33
|
Then I have a "mine/judge1/judge1.rb" file with content:
|
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.29.0'
|
30
30
|
s.license = 'MIT'
|
31
31
|
s.summary = 'Command-Line Tool for a Factbase'
|
32
32
|
s.description =
|
@@ -55,6 +55,7 @@ Gem::Specification.new do |s|
|
|
55
55
|
s.add_dependency 'others', '~>0'
|
56
56
|
s.add_dependency 'retries', '~>0'
|
57
57
|
s.add_dependency 'tago', '~>0'
|
58
|
+
s.add_dependency 'timeout', '~>0'
|
58
59
|
s.add_dependency 'typhoeus', '~>1.3'
|
59
60
|
s.metadata['rubygems_mfa_required'] = 'true'
|
60
61
|
end
|
@@ -24,6 +24,7 @@ require 'backtrace'
|
|
24
24
|
require 'elapsed'
|
25
25
|
require 'factbase/looged'
|
26
26
|
require 'tago'
|
27
|
+
require 'timeout'
|
27
28
|
require_relative '../../judges'
|
28
29
|
require_relative '../../judges/to_rel'
|
29
30
|
require_relative '../../judges/judges'
|
@@ -45,6 +46,7 @@ class Judges::Update
|
|
45
46
|
end
|
46
47
|
|
47
48
|
# Run it (it is supposed to be called by the +bin/judges+ script.
|
49
|
+
#
|
48
50
|
# @param [Hash] opts Command line options (start with '--')
|
49
51
|
# @param [Array] args List of command line arguments
|
50
52
|
def run(opts, args)
|
@@ -117,9 +119,9 @@ class Judges::Update
|
|
117
119
|
judges.each_with_index do |p, i|
|
118
120
|
@loog.info("\nš Running #{p.name} (##{i}) at #{p.dir.to_rel} (#{start.ago} already)...")
|
119
121
|
elapsed(@loog, level: Logger::INFO) do
|
120
|
-
c = one_judge(fb, p, global, options)
|
122
|
+
c = one_judge(opts, fb, p, global, options)
|
121
123
|
churn += c
|
122
|
-
throw :"š The
|
124
|
+
throw :"š The '#{p.name}' judge modified #{c} facts out of #{fb.size}"
|
123
125
|
end
|
124
126
|
rescue StandardError, SyntaxError => e
|
125
127
|
@loog.warn(Backtrace.new(e))
|
@@ -136,11 +138,23 @@ class Judges::Update
|
|
136
138
|
end
|
137
139
|
|
138
140
|
# Run a single judge.
|
141
|
+
#
|
142
|
+
# @param [Hash] opts The command line options
|
143
|
+
# @param [Factbase] fb The factbase
|
144
|
+
# @param [Judges::Judge] judge The judge
|
145
|
+
# @param [Hash] global Global options
|
146
|
+
# @param [Judges::Options] options The options
|
139
147
|
# @return [Churn] How many modifications have been made
|
140
|
-
def one_judge(fb, judge, global, options)
|
148
|
+
def one_judge(opts, fb, judge, global, options)
|
141
149
|
local = {}
|
142
150
|
before = fb.size
|
143
|
-
|
151
|
+
begin
|
152
|
+
Timeout.timeout(opts['timeout']) do
|
153
|
+
judge.run(fb, global, local, options)
|
154
|
+
end
|
155
|
+
rescue Timeout::Error => e
|
156
|
+
throw :"š The '#{judge.name}' judge timed out: #{e.message}"
|
157
|
+
end
|
144
158
|
after = fb.size
|
145
159
|
diff = after - before
|
146
160
|
if diff.positive?
|
data/lib/judges/judge.rb
CHANGED
@@ -67,7 +67,7 @@ class Judges::Judge
|
|
67
67
|
end
|
68
68
|
s = File.join(@dir, script)
|
69
69
|
raise "Can't load '#{s}'" unless File.exist?(s)
|
70
|
-
elapsed(@loog, intro: "#{$judge} finished
|
70
|
+
elapsed(@loog, intro: "#{$judge} finished", level: Logger::INFO) do
|
71
71
|
load(s, true)
|
72
72
|
ensure
|
73
73
|
$fb = $judge = $options = $loog = nil
|
data/lib/judges.rb
CHANGED
@@ -45,6 +45,18 @@ class TestUpdate < Minitest::Test
|
|
45
45
|
end
|
46
46
|
end
|
47
47
|
|
48
|
+
def test_cancels_slow_judge
|
49
|
+
Dir.mktmpdir do |d|
|
50
|
+
save_it(File.join(d, 'foo/foo.rb'), 'sleep 10; $fb.insert.foo = 1')
|
51
|
+
file = File.join(d, 'base.fb')
|
52
|
+
Judges::Update.new(Loog::NULL).run({ 'timeout' => 0.1 }, [d, file])
|
53
|
+
fb = Factbase.new
|
54
|
+
fb.import(File.binread(file))
|
55
|
+
xml = Nokogiri::XML.parse(Factbase::ToXML.new(fb).xml)
|
56
|
+
assert(xml.xpath('/fb/f').empty?, xml)
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
48
60
|
def test_extend_existing_factbase
|
49
61
|
Dir.mktmpdir do |d|
|
50
62
|
file = File.join(d, 'base.fb')
|
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.29.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-12-
|
11
|
+
date: 2024-12-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: backtrace
|
@@ -192,6 +192,20 @@ dependencies:
|
|
192
192
|
- - "~>"
|
193
193
|
- !ruby/object:Gem::Version
|
194
194
|
version: '0'
|
195
|
+
- !ruby/object:Gem::Dependency
|
196
|
+
name: timeout
|
197
|
+
requirement: !ruby/object:Gem::Requirement
|
198
|
+
requirements:
|
199
|
+
- - "~>"
|
200
|
+
- !ruby/object:Gem::Version
|
201
|
+
version: '0'
|
202
|
+
type: :runtime
|
203
|
+
prerelease: false
|
204
|
+
version_requirements: !ruby/object:Gem::Requirement
|
205
|
+
requirements:
|
206
|
+
- - "~>"
|
207
|
+
- !ruby/object:Gem::Version
|
208
|
+
version: '0'
|
195
209
|
- !ruby/object:Gem::Dependency
|
196
210
|
name: typhoeus
|
197
211
|
requirement: !ruby/object:Gem::Requirement
|