judges 0.0.16 → 0.0.18

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: 583517ec65d24d9415fde952e8ce79daa7fc31662b72642c24e8bafcc211eea5
4
- data.tar.gz: 9ab9e0ecbf4f9adec75e07c19053e9c8c0dd28233af16dea85cee57db732fd75
3
+ metadata.gz: 8399b8c8623c0d099deeb50055658e072bae333b0d851cd0aaef22f441655950
4
+ data.tar.gz: c8ef8e75705e8d0cf3bdb8033c054f7ac4c239566bf0cb80b6a9cc0943932986
5
5
  SHA512:
6
- metadata.gz: '07668e2dde2cfa7290b622e4a683796aaa7913a0591f84c64e4dd0eb5d46b9cd5c5a6e4088caa8f2025f28171aa93d1f44784b6366b63f5ac1da37814b8cc84b'
7
- data.tar.gz: 704b1c14632b39c402075fcb5f51c45711b5668a8e7b037b7a2d0a4b6ff209a55f687cdbfa5f0e7b646aefc08e0f17597089f2a632ef7dd89f4b7905782b4111
6
+ metadata.gz: 7a187a9441700826cf7b539ed264a7d80e5e749169219c62d717cee1451cd77e78f5e9a130617dd2e589ad0c13d504e27482527db2dc6b80da12561ff8d1e3e4
7
+ data.tar.gz: 38c5ae3b4af2981b56d9069a794d791ea107cfae27421f12dce9b001a8ff1d60f38c972362fbd659c4e53f750b35a6192ff66b4869280510286c3d585073d0ae
data/bin/judges CHANGED
@@ -29,7 +29,7 @@ require 'factbase'
29
29
  Encoding.default_external = Encoding::UTF_8
30
30
  Encoding.default_internal = Encoding::UTF_8
31
31
 
32
- ver = '0.0.16'
32
+ ver = '0.0.18'
33
33
 
34
34
  include GLI::App
35
35
 
@@ -58,6 +58,8 @@ desc 'Update the factbase by passing all judges one by one'
58
58
  command :update do |c|
59
59
  c.desc 'Options to pass to every judge'
60
60
  c.flag([:o, :option], multiple: true, arg_name: '<key=value>')
61
+ c.desc 'Maximum number of update cycles to run'
62
+ c.flag([:'max-cycles'], default_value: 8)
61
63
  c.action do |global, options, args|
62
64
  require_relative '../lib/judges/commands/update'
63
65
  Judges::Update.new(loog).run(options, args)
@@ -96,7 +98,9 @@ end
96
98
  desc 'Run automated tests for all judges'
97
99
  command :test do |c|
98
100
  c.desc 'Name of the test pack to run'
99
- c.flag([:pack], default_value: '')
101
+ c.flag([:pack], multiple: true)
102
+ c.desc 'Fail if no judges tested?'
103
+ c.flag([:quiet], default_value: false)
100
104
  c.action do |global, options, args|
101
105
  require_relative '../lib/judges/commands/test'
102
106
  Judges::Test.new(loog).run(options, args)
data/features/cli.feature CHANGED
@@ -19,7 +19,7 @@ Feature: Simple Run
19
19
  n.kind = 'yes!'
20
20
  end
21
21
  """
22
- Then I run bin/judges with "--verbose update -o foo=1 -o bar=2 . simple.fb"
22
+ Then I run bin/judges with "--verbose update -o foo=1 -o bar=2 --max-cycles 2 . simple.fb"
23
23
  Then Stdout contains "foo → "
24
24
  Then Stdout contains "bar → "
25
25
  Then Stdout contains "1 judges processed"
@@ -27,29 +27,36 @@ Feature: Simple Run
27
27
 
28
28
  Scenario: Simple test of a few judges
29
29
  Given I run bin/judges with "test ./fixtures"
30
- Then Stdout contains "judges tested"
30
+ Then Stdout contains "👉 Testing"
31
+ Then Stdout contains "judges tested successfully"
31
32
  And Exit code is zero
32
33
 
33
34
  Scenario: Simple test of just one pack
34
- Given I run bin/judges with "test --pack absent_for_sure ./fixtures"
35
- Then Stdout contains "judges tested"
35
+ Given I run bin/judges with "test --pack reward_for_good_bug ./fixtures"
36
+ Then Stdout contains "judges tested successfully"
36
37
  And Exit code is zero
37
38
 
39
+ Scenario: Simple test of no packs
40
+ Given I run bin/judges with "test --pack absent_for_sure ./fixtures"
41
+ Then Exit code is not zero
42
+
38
43
  Scenario: Simple trimming of a factbase
39
44
  Given I make a temp directory
40
45
  Then I have a "simple/simple_judge.rb" file with content:
41
46
  """
47
+ return if $fb.size > 2
42
48
  $fb.insert.time = Time.now - 100 * 60 * 60 * 24
43
49
  """
44
50
  Then I run bin/judges with "--verbose update . simple.fb"
45
51
  Given I run bin/judges with "trim --days 5 simple.fb"
46
- Then Stdout contains "1 facts deleted"
52
+ Then Stdout contains "3 facts deleted"
47
53
  And Exit code is zero
48
54
 
49
55
  Scenario: Simple print of a small factbase
50
56
  Given I make a temp directory
51
57
  Then I have a "simple/simple_judge.rb" file with content:
52
58
  """
59
+ return if $fb.size > 2
53
60
  n = $fb.insert
54
61
  n.kind = 'yes!'
55
62
  """
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.0.16'
29
+ s.version = '0.0.18'
30
30
  s.license = 'MIT'
31
31
  s.summary = 'Command-Line Tool for a Factbase'
32
32
  s.description = '
@@ -42,7 +42,7 @@ Gem::Specification.new do |s|
42
42
  s.rdoc_options = ['--charset=UTF-8']
43
43
  s.extra_rdoc_files = ['README.md', 'LICENSE.txt']
44
44
  s.add_runtime_dependency 'backtrace', '~> 0.3'
45
- s.add_runtime_dependency 'factbase', '~>0.0.15'
45
+ s.add_runtime_dependency 'factbase', '~>0.0.16'
46
46
  s.add_runtime_dependency 'gli', '~>2.21'
47
47
  s.add_runtime_dependency 'loog', '~>0.2'
48
48
  s.add_runtime_dependency 'nokogiri', '~> 1.10'
@@ -42,8 +42,9 @@ class Judges::Test
42
42
  dir = args[0]
43
43
  @loog.info("Testing judges in #{dir.to_rel}...")
44
44
  errors = []
45
- done = Judges::Packs.new(dir, @loog).each_with_index do |p, i|
46
- next if !opts['pack'].nil? && p.name != opts['pack']
45
+ done = 0
46
+ Judges::Packs.new(dir, @loog).each_with_index do |p, i|
47
+ next unless include?(opts, p.name)
47
48
  @loog.info("\n👉 Testing #{p.script} (##{i}) in #{p.dir.to_rel}...")
48
49
  p.tests.each do |f|
49
50
  yaml = YAML.load_file(f, permitted_classes: [Time])
@@ -55,7 +56,9 @@ class Judges::Test
55
56
  errors << f
56
57
  end
57
58
  end
59
+ done += 1
58
60
  end
61
+ raise 'No judges tested :(' if done.zero? && !opts['quiet']
59
62
  if errors.empty?
60
63
  @loog.info("\nAll #{done} judges tested successfully")
61
64
  else
@@ -66,6 +69,12 @@ class Judges::Test
66
69
 
67
70
  private
68
71
 
72
+ def include?(opts, name)
73
+ packs = opts['pack'] || []
74
+ return true if packs.empty?
75
+ packs.include?(name)
76
+ end
77
+
69
78
  def test_one(pack, yaml)
70
79
  fb = Factbase.new
71
80
  yaml['input'].each do |i|
@@ -44,8 +44,27 @@ class Judges::Update
44
44
  fb = impex.import(strict: false)
45
45
  options = Judges::Options.new(opts['option'])
46
46
  @loog.debug("The following options provided:\n\t#{options.to_s.gsub("\n", "\n\t")}")
47
+ packs = Judges::Packs.new(dir, @loog)
48
+ c = 0
49
+ loop do
50
+ diff = cycle(packs, fb, impex, options)
51
+ break if diff.zero?
52
+ if !opts['max-cycles'].nil? && c > opts['max-cycles']
53
+ @loog.info('Too many cycles already, as set by --max-cycles, breaking')
54
+ break
55
+ end
56
+ c += 1
57
+ @loog.info("#{diff} modifications at the cycle ##{c}")
58
+ end
59
+ @loog.info("Update finished in #{c} cycles")
60
+ end
61
+
62
+ private
63
+
64
+ def cycle(packs, fb, impex, options)
47
65
  errors = []
48
- done = Judges::Packs.new(dir, @loog).each_with_index do |p, i|
66
+ diff = 0
67
+ done = packs.each_with_index do |p, i|
49
68
  @loog.info("Running #{p.dir.to_rel} (##{i})...")
50
69
  before = fb.size
51
70
  begin
@@ -56,9 +75,11 @@ class Judges::Update
56
75
  end
57
76
  after = fb.size
58
77
  @loog.info("Pack #{p.dir.to_rel} added #{after - before} facts") if after > before
78
+ diff += after - before
59
79
  end
60
80
  @loog.info("#{done} judges processed (#{errors.size} errors)")
61
81
  raise "Failed to update correctly (#{errors.size} errors)" unless errors.empty?
62
82
  impex.export(fb)
83
+ diff
63
84
  end
64
85
  end
@@ -45,7 +45,7 @@ class TestTest < Minitest::Test
45
45
  - /fb/f[bar='4']
46
46
  YAML
47
47
  )
48
- Judges::Test.new(Loog::VERBOSE).run({}, [d])
48
+ Judges::Test.new(Loog::NULL).run({}, [d])
49
49
  end
50
50
  end
51
51
 
@@ -65,7 +65,7 @@ class TestTest < Minitest::Test
65
65
  YAML
66
66
  )
67
67
  assert_raises do
68
- Judges::Test.new(Loog::VERBOSE).run({}, [d])
68
+ Judges::Test.new(Loog::NULL).run({}, [d])
69
69
  end
70
70
  end
71
71
  end
@@ -84,7 +84,24 @@ class TestTest < Minitest::Test
84
84
  - /fb/f[foo='42']
85
85
  YAML
86
86
  )
87
- Judges::Test.new(Loog::VERBOSE).run({}, [d])
87
+ Judges::Test.new(Loog::NULL).run({}, [d])
88
+ end
89
+ end
90
+
91
+ def test_one_pack_negative
92
+ Dir.mktmpdir do |d|
93
+ File.write(File.join(d, 'foo.rb'), '')
94
+ File.write(
95
+ File.join(d, 'x.yml'),
96
+ <<-YAML
97
+ input: []
98
+ expected:
99
+ - /fb[count(f)=1]
100
+ YAML
101
+ )
102
+ assert_raises do
103
+ Judges::Test.new(Loog::NULL).run({ 'pack' => [File.basename(dir)] }, [d])
104
+ end
88
105
  end
89
106
  end
90
107
  end
@@ -33,7 +33,7 @@ require_relative '../../lib/judges/commands/update'
33
33
  class TestUpdate < Minitest::Test
34
34
  def test_build_factbase_from_scratch
35
35
  Dir.mktmpdir do |d|
36
- File.write(File.join(d, 'foo.rb'), '$fb.insert.zzz = $options.foo_bar + 1')
36
+ File.write(File.join(d, 'foo.rb'), 'return if $fb.size > 2; $fb.insert.zzz = $options.foo_bar + 1')
37
37
  file = File.join(d, 'base.fb')
38
38
  Judges::Update.new(Loog::VERBOSE).run({ 'option' => ['foo_bar=42'] }, [d, file])
39
39
  fb = Factbase.new
@@ -49,7 +49,7 @@ class TestUpdate < Minitest::Test
49
49
  fb = Factbase.new
50
50
  fb.insert.foo_bar = 42
51
51
  File.binwrite(file, fb.export)
52
- File.write(File.join(d, 'foo.rb'), '$fb.insert.tt = 4')
52
+ File.write(File.join(d, 'foo.rb'), 'return if $fb.size > 2; $fb.insert.tt = 4')
53
53
  Judges::Update.new(Loog::VERBOSE).run({}, [d, file])
54
54
  fb = Factbase.new
55
55
  fb.import(File.binread(file))
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.0.16
4
+ version: 0.0.18
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-05-14 00:00:00.000000000 Z
11
+ date: 2024-05-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: backtrace
@@ -30,14 +30,14 @@ dependencies:
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: 0.0.15
33
+ version: 0.0.16
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: 0.0.15
40
+ version: 0.0.16
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: gli
43
43
  requirement: !ruby/object:Gem::Requirement