judges 0.6.0 → 0.8.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 +4 -4
- data/.github/workflows/copyrights.yml +1 -1
- data/Gemfile +1 -1
- data/Gemfile.lock +15 -11
- data/README.md +8 -0
- data/bin/judges +2 -0
- data/features/test.feature +19 -0
- data/judges.gemspec +3 -1
- data/lib/judges/churn.rb +60 -0
- data/lib/judges/commands/test.rb +1 -1
- data/lib/judges/commands/update.rb +9 -29
- data/lib/judges/elapsed.rb +3 -1
- data/lib/judges.rb +1 -1
- data/test/commands/test_print.rb +1 -1
- data/test/test_churn.rb +38 -0
- metadata +32 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: fe5a5448e7e30ad547e467c6493f793b9148ea9cfea8317406902d53b4f7a270
|
|
4
|
+
data.tar.gz: 36b9e68a0797bb79118c51b68b56a2740b5ace3eaae26ed83af97b38f2f80cbc
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 4601b3a1361db40b6b5c4a4d718f47016299583155933ca2168471f0c94de92e81ee9328831b99203b81faa6a872f9ac745bdaaba77ff159513161b32c7a316c
|
|
7
|
+
data.tar.gz: ed839d853ee202832dc23572b52059ea00f1992e148740bc55ade1ec951d4a03759b6f4359e85c1efbb57029a69328f60df5de28d6fed70e548f852586ce88ab
|
data/Gemfile
CHANGED
|
@@ -30,7 +30,7 @@ gem 'rake', '13.2.1', require: false
|
|
|
30
30
|
gem 'rspec-rails', '6.1.2', require: false
|
|
31
31
|
gem 'rubocop', '1.64.1', require: false
|
|
32
32
|
gem 'rubocop-performance', '1.21.0', require: false
|
|
33
|
-
gem 'rubocop-rspec', '2.
|
|
33
|
+
gem 'rubocop-rspec', '2.31.0', require: false
|
|
34
34
|
gem 'simplecov', '0.22.0', require: false
|
|
35
35
|
gem 'simplecov-cobertura', '2.1.0', require: false
|
|
36
36
|
gem 'webmock', '3.23.1', require: false
|
data/Gemfile.lock
CHANGED
|
@@ -8,8 +8,10 @@ PATH
|
|
|
8
8
|
gli (~> 2.21)
|
|
9
9
|
iri (~> 0.8)
|
|
10
10
|
loog (~> 0.2)
|
|
11
|
+
moments (~> 0.3)
|
|
11
12
|
nokogiri (~> 1.10)
|
|
12
13
|
retries (~> 0.0)
|
|
14
|
+
tago (~> 0.0)
|
|
13
15
|
typhoeus (~> 1.3)
|
|
14
16
|
|
|
15
17
|
GEM
|
|
@@ -85,7 +87,7 @@ GEM
|
|
|
85
87
|
erubi (1.12.0)
|
|
86
88
|
ethon (0.16.0)
|
|
87
89
|
ffi (>= 1.15.0)
|
|
88
|
-
factbase (0.0.
|
|
90
|
+
factbase (0.0.48)
|
|
89
91
|
json (~> 2.7)
|
|
90
92
|
loog (~> 0.2)
|
|
91
93
|
nokogiri (~> 1.10)
|
|
@@ -114,6 +116,7 @@ GEM
|
|
|
114
116
|
loog (0.5.1)
|
|
115
117
|
mini_mime (1.1.5)
|
|
116
118
|
minitest (5.23.1)
|
|
119
|
+
moments (0.3.0)
|
|
117
120
|
multi_test (1.1.0)
|
|
118
121
|
mutex_m (0.2.0)
|
|
119
122
|
net-ping (2.0.8)
|
|
@@ -131,7 +134,7 @@ GEM
|
|
|
131
134
|
racc (~> 1.4)
|
|
132
135
|
nokogiri (1.16.5-x86_64-linux)
|
|
133
136
|
racc (~> 1.4)
|
|
134
|
-
parallel (1.
|
|
137
|
+
parallel (1.25.1)
|
|
135
138
|
parser (3.3.2.0)
|
|
136
139
|
ast (~> 2.4.1)
|
|
137
140
|
racc
|
|
@@ -139,7 +142,7 @@ GEM
|
|
|
139
142
|
stringio
|
|
140
143
|
public_suffix (5.0.5)
|
|
141
144
|
racc (1.8.0)
|
|
142
|
-
rack (3.0
|
|
145
|
+
rack (3.1.0)
|
|
143
146
|
rack-session (2.0.0)
|
|
144
147
|
rack (>= 3.0.0)
|
|
145
148
|
rack-test (2.1.0)
|
|
@@ -170,8 +173,8 @@ GEM
|
|
|
170
173
|
reline (0.5.8)
|
|
171
174
|
io-console (~> 0.5)
|
|
172
175
|
retries (0.0.5)
|
|
173
|
-
rexml (3.
|
|
174
|
-
strscan
|
|
176
|
+
rexml (3.3.0)
|
|
177
|
+
strscan
|
|
175
178
|
rspec-core (3.13.0)
|
|
176
179
|
rspec-support (~> 3.13.0)
|
|
177
180
|
rspec-expectations (3.13.0)
|
|
@@ -202,19 +205,19 @@ GEM
|
|
|
202
205
|
unicode-display_width (>= 2.4.0, < 3.0)
|
|
203
206
|
rubocop-ast (1.31.3)
|
|
204
207
|
parser (>= 3.3.1.0)
|
|
205
|
-
rubocop-capybara (2.
|
|
208
|
+
rubocop-capybara (2.21.0)
|
|
206
209
|
rubocop (~> 1.41)
|
|
207
|
-
rubocop-factory_bot (2.
|
|
210
|
+
rubocop-factory_bot (2.26.0)
|
|
208
211
|
rubocop (~> 1.41)
|
|
209
212
|
rubocop-performance (1.21.0)
|
|
210
213
|
rubocop (>= 1.48.1, < 2.0)
|
|
211
214
|
rubocop-ast (>= 1.31.1, < 2.0)
|
|
212
|
-
rubocop-rspec (2.
|
|
215
|
+
rubocop-rspec (2.31.0)
|
|
213
216
|
rubocop (~> 1.40)
|
|
214
217
|
rubocop-capybara (~> 2.17)
|
|
215
218
|
rubocop-factory_bot (~> 2.22)
|
|
216
219
|
rubocop-rspec_rails (~> 2.28)
|
|
217
|
-
rubocop-rspec_rails (2.
|
|
220
|
+
rubocop-rspec_rails (2.29.0)
|
|
218
221
|
rubocop (~> 1.40)
|
|
219
222
|
ruby-progressbar (1.13.0)
|
|
220
223
|
simplecov (0.22.0)
|
|
@@ -228,8 +231,9 @@ GEM
|
|
|
228
231
|
simplecov_json_formatter (0.1.4)
|
|
229
232
|
stringio (3.1.0)
|
|
230
233
|
strscan (3.1.0)
|
|
231
|
-
sys-uname (1.
|
|
234
|
+
sys-uname (1.3.0)
|
|
232
235
|
ffi (~> 1.1)
|
|
236
|
+
tago (0.0.1)
|
|
233
237
|
thor (1.3.1)
|
|
234
238
|
typhoeus (1.4.1)
|
|
235
239
|
ethon (>= 0.9.0)
|
|
@@ -263,7 +267,7 @@ DEPENDENCIES
|
|
|
263
267
|
rspec-rails (= 6.1.2)
|
|
264
268
|
rubocop (= 1.64.1)
|
|
265
269
|
rubocop-performance (= 1.21.0)
|
|
266
|
-
rubocop-rspec (= 2.
|
|
270
|
+
rubocop-rspec (= 2.31.0)
|
|
267
271
|
simplecov (= 0.22.0)
|
|
268
272
|
simplecov-cobertura (= 2.1.0)
|
|
269
273
|
webmock (= 3.23.1)
|
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
|
+
category: slow
|
|
38
|
+
runs: 1
|
|
37
39
|
skip: false
|
|
38
40
|
input:
|
|
39
41
|
-
|
|
@@ -52,6 +54,12 @@ via the command line `--option` flag of the `update` command; and `expected` is
|
|
|
52
54
|
an array of XPath expressions that must be present in the XML of the Factbase
|
|
53
55
|
when the test is finished.
|
|
54
56
|
|
|
57
|
+
The `category` (default: `[]`) may have one or an array of categories,
|
|
58
|
+
which then may be turned on via the `--category` command line flag.
|
|
59
|
+
|
|
60
|
+
The `runs` (default: `1`) is the number of times the `.rb` script should
|
|
61
|
+
be executed. After each execution, all expected XPath expressions are validated.
|
|
62
|
+
|
|
55
63
|
## How to contribute
|
|
56
64
|
|
|
57
65
|
Read
|
data/bin/judges
CHANGED
|
@@ -64,6 +64,8 @@ class App
|
|
|
64
64
|
c.flag([:'max-cycles'], default_value: 8, type: Integer)
|
|
65
65
|
c.desc 'Stay quiet even if some judges fail'
|
|
66
66
|
c.switch([:q, :quiet], default_value: false)
|
|
67
|
+
c.desc 'Use default logging facility'
|
|
68
|
+
c.switch([:log], default_value: true)
|
|
67
69
|
c.action do |global, options, args|
|
|
68
70
|
require_relative '../lib/judges/commands/update'
|
|
69
71
|
Judges::Update.new(loog).run(options, args)
|
data/features/test.feature
CHANGED
|
@@ -47,6 +47,25 @@ Feature: Test
|
|
|
47
47
|
Then Stdout contains "All 1 judge(s) and 1 tests passed"
|
|
48
48
|
And Exit code is zero
|
|
49
49
|
|
|
50
|
+
Scenario: Simple test with two runs
|
|
51
|
+
Given I make a temp directory
|
|
52
|
+
Then I have a "foo/simple.rb" file with content:
|
|
53
|
+
"""
|
|
54
|
+
n = $fb.insert
|
|
55
|
+
n.foo = $fb.size
|
|
56
|
+
"""
|
|
57
|
+
Then I have a "foo/good.yml" file with content:
|
|
58
|
+
"""
|
|
59
|
+
---
|
|
60
|
+
runs: 3
|
|
61
|
+
input: []
|
|
62
|
+
expected:
|
|
63
|
+
- /fb/f[foo=count(/fb/f)]
|
|
64
|
+
"""
|
|
65
|
+
Then I run bin/judges with "test ."
|
|
66
|
+
Then Stdout contains "All 1 judge(s) and 1 tests passed"
|
|
67
|
+
And Exit code is zero
|
|
68
|
+
|
|
50
69
|
Scenario: Enable only one category
|
|
51
70
|
Given I make a temp directory
|
|
52
71
|
Then I have a "mine/good/good.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.8.0'
|
|
30
30
|
s.license = 'MIT'
|
|
31
31
|
s.summary = 'Command-Line Tool for a Factbase'
|
|
32
32
|
s.description =
|
|
@@ -48,8 +48,10 @@ Gem::Specification.new do |s|
|
|
|
48
48
|
s.add_runtime_dependency 'gli', '~>2.21'
|
|
49
49
|
s.add_runtime_dependency 'iri', '~>0.8'
|
|
50
50
|
s.add_runtime_dependency 'loog', '~>0.2'
|
|
51
|
+
s.add_runtime_dependency 'moments', '~>0.3'
|
|
51
52
|
s.add_runtime_dependency 'nokogiri', '~>1.10'
|
|
52
53
|
s.add_runtime_dependency 'retries', '~>0.0'
|
|
54
|
+
s.add_runtime_dependency 'tago', '~>0.0'
|
|
53
55
|
s.add_runtime_dependency 'typhoeus', '~>1.3'
|
|
54
56
|
s.metadata['rubygems_mfa_required'] = 'true'
|
|
55
57
|
end
|
data/lib/judges/churn.rb
ADDED
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# Copyright (c) 2024 Yegor Bugayenko
|
|
4
|
+
#
|
|
5
|
+
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
# of this software and associated documentation files (the 'Software'), to deal
|
|
7
|
+
# in the Software without restriction, including without limitation the rights
|
|
8
|
+
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
# copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
# furnished to do so, subject to the following conditions:
|
|
11
|
+
#
|
|
12
|
+
# The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
# copies or substantial portions of the Software.
|
|
14
|
+
#
|
|
15
|
+
# THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
# SOFTWARE.
|
|
22
|
+
|
|
23
|
+
require_relative '../judges'
|
|
24
|
+
|
|
25
|
+
# How many facts were modified.
|
|
26
|
+
# Author:: Yegor Bugayenko (yegor256@gmail.com)
|
|
27
|
+
# Copyright:: Copyright (c) 2024 Yegor Bugayenko
|
|
28
|
+
# License:: MIT
|
|
29
|
+
class Judges::Churn
|
|
30
|
+
attr_reader :added, :removed
|
|
31
|
+
|
|
32
|
+
def initialize(added, removed)
|
|
33
|
+
@added = added
|
|
34
|
+
@removed = removed
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def to_s
|
|
38
|
+
"#{@added}/#{@removed}"
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def zero?
|
|
42
|
+
@added.zero? && @removed.zero?
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def +(other)
|
|
46
|
+
if other.is_a?(Judges::Churn)
|
|
47
|
+
Judges::Churn.new(@added + other.added, @removed + other.removed)
|
|
48
|
+
else
|
|
49
|
+
Judges::Churn.new(@added + other, @removed)
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
def -(other)
|
|
54
|
+
if other.is_a?(Judges::Churn)
|
|
55
|
+
Judges::Churn.new(@added - other.added, @removed - other.removed)
|
|
56
|
+
else
|
|
57
|
+
Judges::Churn.new(@added, @removed + other)
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
end
|
data/lib/judges/commands/test.rb
CHANGED
|
@@ -122,7 +122,7 @@ class Judges::Test
|
|
|
122
122
|
end
|
|
123
123
|
end
|
|
124
124
|
options = Judges::Options.new(opts['option']) + Judges::Options.new(yaml['options'])
|
|
125
|
-
(1..(opts['runs'] || 1)).each do
|
|
125
|
+
(1..(opts['runs'] || yaml['runs'] || 1)).each do
|
|
126
126
|
judge.run(Factbase::Looged.new(fb, @loog), {}, {}, options)
|
|
127
127
|
end
|
|
128
128
|
xpaths = yaml['expected']
|
|
@@ -25,6 +25,7 @@ require 'factbase/looged'
|
|
|
25
25
|
require_relative '../../judges'
|
|
26
26
|
require_relative '../../judges/to_rel'
|
|
27
27
|
require_relative '../../judges/judges'
|
|
28
|
+
require_relative '../../judges/churn'
|
|
28
29
|
require_relative '../../judges/options'
|
|
29
30
|
require_relative '../../judges/impex'
|
|
30
31
|
require_relative '../../judges/elapsed'
|
|
@@ -44,7 +45,7 @@ class Judges::Update
|
|
|
44
45
|
raise "The directory is absent: #{dir.to_rel}" unless File.exist?(dir)
|
|
45
46
|
impex = Judges::Impex.new(@loog, args[1])
|
|
46
47
|
fb = impex.import(strict: false)
|
|
47
|
-
fb = Factbase::Looged.new(fb, @loog)
|
|
48
|
+
fb = Factbase::Looged.new(fb, @loog) if opts['log']
|
|
48
49
|
before = fb.size
|
|
49
50
|
options = Judges::Options.new(opts['option'])
|
|
50
51
|
@loog.debug("The following options provided:\n\t#{options.to_s.gsub("\n", "\n\t")}")
|
|
@@ -72,42 +73,21 @@ class Judges::Update
|
|
|
72
73
|
end
|
|
73
74
|
end
|
|
74
75
|
|
|
75
|
-
# How many facts were modified.
|
|
76
|
-
class Churn
|
|
77
|
-
attr_reader :added, :removed
|
|
78
|
-
|
|
79
|
-
def initialize(added, removed)
|
|
80
|
-
@added = added
|
|
81
|
-
@removed = removed
|
|
82
|
-
end
|
|
83
|
-
|
|
84
|
-
def to_s
|
|
85
|
-
"#{@added}/-#{@removed}"
|
|
86
|
-
end
|
|
87
|
-
|
|
88
|
-
def zero?
|
|
89
|
-
@added.zero? && @removed.zero?
|
|
90
|
-
end
|
|
91
|
-
|
|
92
|
-
def +(other)
|
|
93
|
-
Churn.new(@added + other.added, @removed + other.removed)
|
|
94
|
-
end
|
|
95
|
-
end
|
|
96
|
-
|
|
97
76
|
private
|
|
98
77
|
|
|
99
78
|
# Run all judges in a full cycle, one by one.
|
|
100
79
|
# @return [Churn] How many modifications have been made
|
|
101
80
|
def cycle(opts, judges, fb, options)
|
|
102
81
|
errors = []
|
|
103
|
-
churn = Churn.new(0, 0)
|
|
82
|
+
churn = Judges::Churn.new(0, 0)
|
|
104
83
|
global = {}
|
|
105
84
|
elapsed(@loog) do
|
|
106
85
|
done = judges.each_with_index do |p, i|
|
|
107
|
-
@loog.info("\n👉 Running #{p.name} (##{i}) at #{p.dir.to_rel}...")
|
|
86
|
+
@loog.info("\n\n👉 Running #{p.name} (##{i}) at #{p.dir.to_rel}...")
|
|
108
87
|
elapsed(@loog) do
|
|
109
|
-
|
|
110
|
-
|
|
88
|
+
c = one_judge(fb, p, global, options)
|
|
89
|
+
churn += c
|
|
90
|
+
throw :"👍 The judge #{p.name} modified #{c.zero? ? 'no' : c} facts"
|
|
111
91
|
end
|
|
112
92
|
rescue StandardError, SyntaxError => e
|
|
113
93
|
@loog.warn(Backtrace.new(e))
|
|
@@ -132,9 +112,9 @@ class Judges::Update
|
|
|
132
112
|
after = fb.size
|
|
133
113
|
diff = after - before
|
|
134
114
|
if diff.positive?
|
|
135
|
-
Churn.new(diff, 0)
|
|
115
|
+
Judges::Churn.new(diff, 0)
|
|
136
116
|
else
|
|
137
|
-
Churn.new(0, -diff)
|
|
117
|
+
Judges::Churn.new(0, -diff)
|
|
138
118
|
end
|
|
139
119
|
end
|
|
140
120
|
end
|
data/lib/judges/elapsed.rb
CHANGED
|
@@ -20,6 +20,8 @@
|
|
|
20
20
|
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
21
|
# SOFTWARE.
|
|
22
22
|
|
|
23
|
+
require 'tago'
|
|
24
|
+
|
|
23
25
|
def elapsed(loog)
|
|
24
26
|
start = Time.now
|
|
25
27
|
begin
|
|
@@ -27,6 +29,6 @@ def elapsed(loog)
|
|
|
27
29
|
rescue UncaughtThrowError => e
|
|
28
30
|
tag = e.tag
|
|
29
31
|
throw e unless tag.is_a?(Symbol)
|
|
30
|
-
loog.info("#{tag} in #{
|
|
32
|
+
loog.info("#{tag} in #{start.ago}")
|
|
31
33
|
end
|
|
32
34
|
end
|
data/lib/judges.rb
CHANGED
data/test/commands/test_print.rb
CHANGED
|
@@ -41,7 +41,7 @@ class TestPrint < Minitest::Test
|
|
|
41
41
|
Judges::Print.new(Loog::NULL).run({ format: 'yaml', auto: true }, [f])
|
|
42
42
|
y = File.join(d, 'base.yaml')
|
|
43
43
|
assert(File.exist?(y))
|
|
44
|
-
assert_equal(1, YAML.load_file(y)
|
|
44
|
+
assert_equal(1, YAML.load_file(y).size)
|
|
45
45
|
end
|
|
46
46
|
end
|
|
47
47
|
|
data/test/test_churn.rb
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# Copyright (c) 2024 Yegor Bugayenko
|
|
4
|
+
#
|
|
5
|
+
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
# of this software and associated documentation files (the 'Software'), to deal
|
|
7
|
+
# in the Software without restriction, including without limitation the rights
|
|
8
|
+
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
# copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
# furnished to do so, subject to the following conditions:
|
|
11
|
+
#
|
|
12
|
+
# The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
# copies or substantial portions of the Software.
|
|
14
|
+
#
|
|
15
|
+
# THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
# SOFTWARE.
|
|
22
|
+
|
|
23
|
+
require 'minitest/autorun'
|
|
24
|
+
require_relative '../lib/judges'
|
|
25
|
+
require_relative '../lib/judges/churn'
|
|
26
|
+
|
|
27
|
+
# Test.
|
|
28
|
+
# Author:: Yegor Bugayenko (yegor256@gmail.com)
|
|
29
|
+
# Copyright:: Copyright (c) 2024 Yegor Bugayenko
|
|
30
|
+
# License:: MIT
|
|
31
|
+
class TestChurn < Minitest::Test
|
|
32
|
+
def test_basic
|
|
33
|
+
churn = Judges::Churn.new(0, 0)
|
|
34
|
+
assert_equal('0/0', churn.to_s)
|
|
35
|
+
assert_equal('42/0', (churn + 42).to_s)
|
|
36
|
+
assert_equal('0/17', (churn - 17).to_s)
|
|
37
|
+
end
|
|
38
|
+
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.8.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-06-
|
|
11
|
+
date: 2024-06-11 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: backtrace
|
|
@@ -94,6 +94,20 @@ dependencies:
|
|
|
94
94
|
- - "~>"
|
|
95
95
|
- !ruby/object:Gem::Version
|
|
96
96
|
version: '0.2'
|
|
97
|
+
- !ruby/object:Gem::Dependency
|
|
98
|
+
name: moments
|
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
|
100
|
+
requirements:
|
|
101
|
+
- - "~>"
|
|
102
|
+
- !ruby/object:Gem::Version
|
|
103
|
+
version: '0.3'
|
|
104
|
+
type: :runtime
|
|
105
|
+
prerelease: false
|
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
107
|
+
requirements:
|
|
108
|
+
- - "~>"
|
|
109
|
+
- !ruby/object:Gem::Version
|
|
110
|
+
version: '0.3'
|
|
97
111
|
- !ruby/object:Gem::Dependency
|
|
98
112
|
name: nokogiri
|
|
99
113
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -122,6 +136,20 @@ dependencies:
|
|
|
122
136
|
- - "~>"
|
|
123
137
|
- !ruby/object:Gem::Version
|
|
124
138
|
version: '0.0'
|
|
139
|
+
- !ruby/object:Gem::Dependency
|
|
140
|
+
name: tago
|
|
141
|
+
requirement: !ruby/object:Gem::Requirement
|
|
142
|
+
requirements:
|
|
143
|
+
- - "~>"
|
|
144
|
+
- !ruby/object:Gem::Version
|
|
145
|
+
version: '0.0'
|
|
146
|
+
type: :runtime
|
|
147
|
+
prerelease: false
|
|
148
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
149
|
+
requirements:
|
|
150
|
+
- - "~>"
|
|
151
|
+
- !ruby/object:Gem::Version
|
|
152
|
+
version: '0.0'
|
|
125
153
|
- !ruby/object:Gem::Dependency
|
|
126
154
|
name: typhoeus
|
|
127
155
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -190,6 +218,7 @@ files:
|
|
|
190
218
|
- lib/judges.rb
|
|
191
219
|
- lib/judges/baza.rb
|
|
192
220
|
- lib/judges/categories.rb
|
|
221
|
+
- lib/judges/churn.rb
|
|
193
222
|
- lib/judges/commands/eval.rb
|
|
194
223
|
- lib/judges/commands/import.rb
|
|
195
224
|
- lib/judges/commands/inspect.rb
|
|
@@ -220,6 +249,7 @@ files:
|
|
|
220
249
|
- test/test__helper.rb
|
|
221
250
|
- test/test_baza.rb
|
|
222
251
|
- test/test_categories.rb
|
|
252
|
+
- test/test_churn.rb
|
|
223
253
|
- test/test_impex.rb
|
|
224
254
|
- test/test_judge.rb
|
|
225
255
|
- test/test_judges.rb
|