fbe 0.0.18 → 0.0.20
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/Gemfile.lock +17 -17
- data/fbe.gemspec +13 -13
- data/lib/fbe/award.rb +283 -0
- data/lib/fbe.rb +1 -1
- data/test/fbe/test_award.rb +100 -0
- data/test/fbe/test_conclude.rb +1 -0
- data/test/fbe/test_fb.rb +1 -0
- data/test/fbe/test_if_absent.rb +1 -0
- data/test/fbe/test_issue.rb +1 -0
- data/test/fbe/test_iterate.rb +1 -0
- data/test/fbe/test_octo.rb +1 -0
- data/test/fbe/test_sec.rb +1 -0
- data/test/fbe/test_unmask_repos.rb +1 -0
- data/test/fbe/test_who.rb +1 -0
- data/test/test_fbe.rb +1 -0
- metadata +30 -28
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8edc085f571054934f0175c084473ad75477dc2c591a4dfbe20bd85bd00ab364
|
4
|
+
data.tar.gz: 1792731b5d49d6b1a4a2d0c5671cb9dca05843e4af8a7cc7df64bddeb97525bd
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6eaee3b757f8140044a2162f936a92b5b0b259f2e3995fc3032c6a529a9e2d77021506c09ff7910b0272a70b520189ef9f651e0b630f3d63918d400ccb3a6f16
|
7
|
+
data.tar.gz: 62504126787332608ab3a5a178c3946f52bf184e2ff7de2c9fca0b74f208f56437d50c944ff71a67169a66d27d9544c298e322ad320591ddae34c65c76941c49
|
data/Gemfile.lock
CHANGED
@@ -2,19 +2,19 @@ PATH
|
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
4
|
fbe (0.0.0)
|
5
|
-
backtrace
|
6
|
-
decoor
|
7
|
-
factbase
|
8
|
-
faraday
|
9
|
-
faraday-http-cache
|
10
|
-
faraday-multipart
|
11
|
-
faraday-retry
|
12
|
-
judges
|
13
|
-
loog
|
14
|
-
obk
|
15
|
-
octokit
|
16
|
-
others
|
17
|
-
verbose
|
5
|
+
backtrace (> 0)
|
6
|
+
decoor (> 0)
|
7
|
+
factbase (> 0)
|
8
|
+
faraday (> 0)
|
9
|
+
faraday-http-cache (> 0)
|
10
|
+
faraday-multipart (> 0)
|
11
|
+
faraday-retry (> 0)
|
12
|
+
judges (> 0)
|
13
|
+
loog (> 0)
|
14
|
+
obk (> 0)
|
15
|
+
octokit (> 0)
|
16
|
+
others (> 0)
|
17
|
+
verbose (> 0)
|
18
18
|
|
19
19
|
GEM
|
20
20
|
remote: https://rubygems.org/
|
@@ -63,7 +63,7 @@ GEM
|
|
63
63
|
erubi (1.13.0)
|
64
64
|
ethon (0.16.0)
|
65
65
|
ffi (>= 1.15.0)
|
66
|
-
factbase (0.
|
66
|
+
factbase (0.1.1)
|
67
67
|
backtrace (~> 0.3)
|
68
68
|
decoor (~> 0.0)
|
69
69
|
json (~> 2.7)
|
@@ -87,7 +87,7 @@ GEM
|
|
87
87
|
ffi (1.17.0-x64-mingw-ucrt)
|
88
88
|
ffi (1.17.0-x86_64-darwin)
|
89
89
|
ffi (1.17.0-x86_64-linux-gnu)
|
90
|
-
gli (2.21.
|
90
|
+
gli (2.21.3)
|
91
91
|
i18n (1.14.5)
|
92
92
|
concurrent-ruby (~> 1.0)
|
93
93
|
io-console (0.7.2)
|
@@ -96,7 +96,7 @@ GEM
|
|
96
96
|
reline (>= 0.4.2)
|
97
97
|
iri (0.8.0)
|
98
98
|
json (2.7.2)
|
99
|
-
judges (0.
|
99
|
+
judges (0.18.1)
|
100
100
|
backtrace (~> 0)
|
101
101
|
concurrent-ruby (~> 1.2)
|
102
102
|
factbase (~> 0)
|
@@ -178,7 +178,7 @@ GEM
|
|
178
178
|
reline (0.5.9)
|
179
179
|
io-console (~> 0.5)
|
180
180
|
retries (0.0.5)
|
181
|
-
rexml (3.3.
|
181
|
+
rexml (3.3.2)
|
182
182
|
strscan
|
183
183
|
rspec-core (3.13.0)
|
184
184
|
rspec-support (~> 3.13.0)
|
data/fbe.gemspec
CHANGED
@@ -39,18 +39,18 @@ Gem::Specification.new do |s|
|
|
39
39
|
s.files = `git ls-files`.split($RS)
|
40
40
|
s.rdoc_options = ['--charset=UTF-8']
|
41
41
|
s.extra_rdoc_files = ['README.md', 'LICENSE.txt']
|
42
|
-
s.add_dependency 'backtrace'
|
43
|
-
s.add_dependency 'decoor'
|
44
|
-
s.add_dependency 'factbase'
|
45
|
-
s.add_dependency 'faraday'
|
46
|
-
s.add_dependency 'faraday-http-cache'
|
47
|
-
s.add_dependency 'faraday-multipart'
|
48
|
-
s.add_dependency 'faraday-retry'
|
49
|
-
s.add_dependency 'judges'
|
50
|
-
s.add_dependency 'loog'
|
51
|
-
s.add_dependency 'obk'
|
52
|
-
s.add_dependency 'octokit'
|
53
|
-
s.add_dependency 'others'
|
54
|
-
s.add_dependency 'verbose'
|
42
|
+
s.add_dependency 'backtrace', '>0'
|
43
|
+
s.add_dependency 'decoor', '>0'
|
44
|
+
s.add_dependency 'factbase', '>0'
|
45
|
+
s.add_dependency 'faraday', '>0'
|
46
|
+
s.add_dependency 'faraday-http-cache', '>0'
|
47
|
+
s.add_dependency 'faraday-multipart', '>0'
|
48
|
+
s.add_dependency 'faraday-retry', '>0'
|
49
|
+
s.add_dependency 'judges', '>0'
|
50
|
+
s.add_dependency 'loog', '>0'
|
51
|
+
s.add_dependency 'obk', '>0'
|
52
|
+
s.add_dependency 'octokit', '>0'
|
53
|
+
s.add_dependency 'others', '>0'
|
54
|
+
s.add_dependency 'verbose', '>0'
|
55
55
|
s.metadata['rubygems_mfa_required'] = 'true'
|
56
56
|
end
|
data/lib/fbe/award.rb
ADDED
@@ -0,0 +1,283 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# MIT License
|
4
|
+
#
|
5
|
+
# Copyright (c) 2024 Zerocracy
|
6
|
+
#
|
7
|
+
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
8
|
+
# of this software and associated documentation files (the "Software"), to deal
|
9
|
+
# in the Software without restriction, including without limitation the rights
|
10
|
+
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
11
|
+
# copies of the Software, and to permit persons to whom the Software is
|
12
|
+
# furnished to do so, subject to the following conditions:
|
13
|
+
#
|
14
|
+
# The above copyright notice and this permission notice shall be included in all
|
15
|
+
# copies or substantial portions of the Software.
|
16
|
+
#
|
17
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
18
|
+
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
19
|
+
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
20
|
+
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
21
|
+
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
22
|
+
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
23
|
+
# SOFTWARE.
|
24
|
+
|
25
|
+
require 'factbase/syntax'
|
26
|
+
|
27
|
+
# Award generator.
|
28
|
+
# Author:: Yegor Bugayenko (yegor256@gmail.com)
|
29
|
+
# Copyright:: Copyright (c) 2024 Yegor Bugayenko
|
30
|
+
# License:: MIT
|
31
|
+
class Fbe::Award
|
32
|
+
def initialize(query = J.pmp.hr.send($judge.gsub('-', '_')))
|
33
|
+
@query = query
|
34
|
+
end
|
35
|
+
|
36
|
+
def bill(vars = {})
|
37
|
+
term = Factbase::Syntax.new(@query, term: Fbe::Award::BTerm).to_term
|
38
|
+
bill = Bill.new
|
39
|
+
vars.each { |k, v| bill.set(k, v) }
|
40
|
+
term.bill_to(bill)
|
41
|
+
bill
|
42
|
+
end
|
43
|
+
|
44
|
+
def policy
|
45
|
+
term = Factbase::Syntax.new(@query, term: Fbe::Award::PTerm).to_term
|
46
|
+
policy = Policy.new
|
47
|
+
term.publish_to(policy)
|
48
|
+
policy
|
49
|
+
end
|
50
|
+
|
51
|
+
# A term for bill.
|
52
|
+
class BTerm
|
53
|
+
def initialize(operator, operands)
|
54
|
+
@op = operator
|
55
|
+
@operands = operands
|
56
|
+
end
|
57
|
+
|
58
|
+
def to_s
|
59
|
+
"(#{@op} #{@operands.join(' ')})"
|
60
|
+
end
|
61
|
+
|
62
|
+
def bill_to(bill)
|
63
|
+
case @op
|
64
|
+
when :award
|
65
|
+
@operands.each do |o|
|
66
|
+
o.bill_to(bill)
|
67
|
+
rescue StandardError => e
|
68
|
+
raise "Failure in #{o}: #{e.message}"
|
69
|
+
end
|
70
|
+
when :let, :set
|
71
|
+
bill.set(@operands[0], to_val(@operands[1], bill))
|
72
|
+
when :give
|
73
|
+
text = @operands[1]
|
74
|
+
text = '' if text.nil?
|
75
|
+
bill.line(to_val(@operands[0], bill), text)
|
76
|
+
when :explain, :in
|
77
|
+
# nothing, just ignore
|
78
|
+
else
|
79
|
+
raise "Unknown term '#{@op}'"
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
def to_val(any, bill)
|
84
|
+
if any.is_a?(BTerm)
|
85
|
+
any.calc(bill)
|
86
|
+
elsif any.is_a?(Symbol)
|
87
|
+
v = bill.vars[any]
|
88
|
+
raise "Unknown name '#{any}' among [#{bill.vars.keys.join(', ')}]" if v.nil?
|
89
|
+
v
|
90
|
+
else
|
91
|
+
any
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
def calc(bill)
|
96
|
+
case @op
|
97
|
+
when :total
|
98
|
+
bill.points
|
99
|
+
when :if
|
100
|
+
to_val(@operands[0], bill) ? to_val(@operands[1], bill) : to_val(@operands[2], bill)
|
101
|
+
when :eq
|
102
|
+
to_val(@operands[0], bill) == to_val(@operands[1], bill)
|
103
|
+
when :lt
|
104
|
+
to_val(@operands[0], bill) < to_val(@operands[1], bill)
|
105
|
+
when :lte
|
106
|
+
to_val(@operands[0], bill) <= to_val(@operands[1], bill)
|
107
|
+
when :gt
|
108
|
+
to_val(@operands[0], bill) > to_val(@operands[1], bill)
|
109
|
+
when :gte
|
110
|
+
to_val(@operands[0], bill) >= to_val(@operands[1], bill)
|
111
|
+
when :div
|
112
|
+
to_val(@operands[0], bill) / to_val(@operands[1], bill)
|
113
|
+
when :times
|
114
|
+
to_val(@operands[0], bill) * to_val(@operands[1], bill)
|
115
|
+
when :plus
|
116
|
+
to_val(@operands[0], bill) + to_val(@operands[1], bill)
|
117
|
+
when :minus
|
118
|
+
to_val(@operands[0], bill) - to_val(@operands[1], bill)
|
119
|
+
when :max
|
120
|
+
[to_val(@operands[0], bill), to_val(@operands[1], bill)].max
|
121
|
+
when :min
|
122
|
+
[to_val(@operands[0], bill), to_val(@operands[1], bill)].min
|
123
|
+
when :between
|
124
|
+
v = to_val(@operands[0], bill)
|
125
|
+
a = to_val(@operands[1], bill)
|
126
|
+
b = to_val(@operands[2], bill)
|
127
|
+
v = b if v > b
|
128
|
+
v = a if v < a
|
129
|
+
v
|
130
|
+
else
|
131
|
+
raise "Unknown term '#{@op}'"
|
132
|
+
end
|
133
|
+
end
|
134
|
+
end
|
135
|
+
|
136
|
+
# A term for policy.
|
137
|
+
class PTerm
|
138
|
+
def initialize(operator, operands)
|
139
|
+
@op = operator
|
140
|
+
@operands = operands
|
141
|
+
end
|
142
|
+
|
143
|
+
def to_s
|
144
|
+
case @op
|
145
|
+
when :total
|
146
|
+
'total'
|
147
|
+
when :if
|
148
|
+
"if #{to_p(@operands[0])} then #{to_p(@operands[1])} else #{to_p(@operands[2])}"
|
149
|
+
when :eq
|
150
|
+
"#{to_p(@operands[0])} == #{to_p(@operands[1])}"
|
151
|
+
when :lt
|
152
|
+
"#{to_p(@operands[0])} < #{to_p(@operands[1])}"
|
153
|
+
when :lte
|
154
|
+
"#{to_p(@operands[0])} ≤ #{to_p(@operands[1])}"
|
155
|
+
when :gt
|
156
|
+
"#{to_p(@operands[0])} > #{to_p(@operands[1])}"
|
157
|
+
when :gte
|
158
|
+
"#{to_p(@operands[0])} ≥ #{to_p(@operands[1])}"
|
159
|
+
when :div
|
160
|
+
"#{to_p(@operands[0])} ÷ #{to_p(@operands[1])}"
|
161
|
+
when :times
|
162
|
+
"#{to_p(@operands[0])} × #{to_p(@operands[1])}"
|
163
|
+
when :plus
|
164
|
+
"#{to_p(@operands[0])} + #{to_p(@operands[1])}"
|
165
|
+
when :minus
|
166
|
+
"#{to_p(@operands[0])} - #{to_p(@operands[1])}"
|
167
|
+
when :max
|
168
|
+
"maximum of #{to_p(@operands[0])} and #{to_p(@operands[1])}"
|
169
|
+
when :min
|
170
|
+
"minimum of #{to_p(@operands[0])} and #{to_p(@operands[1])}"
|
171
|
+
when :between
|
172
|
+
"at least #{to_p(@operands[0])} and at most #{to_p(@operands[1])}"
|
173
|
+
else
|
174
|
+
raise "Unknown term '#{@op}'"
|
175
|
+
end
|
176
|
+
end
|
177
|
+
|
178
|
+
def publish_to(policy)
|
179
|
+
case @op
|
180
|
+
when :award
|
181
|
+
@operands.each do |o|
|
182
|
+
o.publish_to(policy)
|
183
|
+
rescue StandardError => e
|
184
|
+
raise "Failure in #{o}: #{e.message}"
|
185
|
+
end
|
186
|
+
when :explain
|
187
|
+
policy.intro(to_p(@operands[0]))
|
188
|
+
when :in
|
189
|
+
policy.line("assume that #{to_p(@operands[0])} is #{to_p(@operands[1])}")
|
190
|
+
when :let
|
191
|
+
policy.line("let #{to_p(@operands[0])} be equal to #{to_p(@operands[1])}")
|
192
|
+
when :set
|
193
|
+
policy.line("set #{to_p(@operands[0])} to #{to_p(@operands[1])}")
|
194
|
+
when :give
|
195
|
+
policy.line("award #{to_p(@operands[0])}")
|
196
|
+
else
|
197
|
+
raise "Unknown term '#{@op}'"
|
198
|
+
end
|
199
|
+
end
|
200
|
+
|
201
|
+
def to_p(any)
|
202
|
+
case any
|
203
|
+
when PTerm
|
204
|
+
any.to_s
|
205
|
+
when Symbol
|
206
|
+
s = any.to_s
|
207
|
+
subs = {
|
208
|
+
0 => '₀',
|
209
|
+
1 => '₁',
|
210
|
+
2 => '₂',
|
211
|
+
3 => '₃',
|
212
|
+
4 => '₄',
|
213
|
+
5 => '₅',
|
214
|
+
6 => '₆',
|
215
|
+
7 => '₇',
|
216
|
+
8 => '₈',
|
217
|
+
9 => '₉'
|
218
|
+
}
|
219
|
+
s.gsub!(/([a-z]+)([0-9])/) { |_| "#{Regexp.last_match[1]}#{subs[Regexp.last_match[2].to_i]}" }
|
220
|
+
"_#{s.gsub('_', '\\_')}_"
|
221
|
+
when Integer, Float
|
222
|
+
"**#{any}**"
|
223
|
+
else
|
224
|
+
any
|
225
|
+
end
|
226
|
+
end
|
227
|
+
end
|
228
|
+
|
229
|
+
# A bill.
|
230
|
+
class Bill
|
231
|
+
attr_reader :vars
|
232
|
+
|
233
|
+
def initialize
|
234
|
+
@lines = []
|
235
|
+
@vars = {}
|
236
|
+
end
|
237
|
+
|
238
|
+
def set(var, value)
|
239
|
+
@vars[var] = value
|
240
|
+
end
|
241
|
+
|
242
|
+
def line(value, text)
|
243
|
+
return if value.zero?
|
244
|
+
text = text.gsub(/\$\{([a-z_0-9]+)\}/) { |_x| @vars[Regexp.last_match[1].to_sym] }
|
245
|
+
@lines << { v: value, t: text }
|
246
|
+
end
|
247
|
+
|
248
|
+
def points
|
249
|
+
@lines.map { |l| l[:v] }.inject(&:+).to_i
|
250
|
+
end
|
251
|
+
|
252
|
+
def greeting
|
253
|
+
items = @lines.map { |l| "#{format('%+d', l[:v])} #{l[:t]}" }
|
254
|
+
"You've earned #{format('%+d', points)} points for this: #{items.join('; ')}. "
|
255
|
+
end
|
256
|
+
end
|
257
|
+
|
258
|
+
# A policy.
|
259
|
+
class Policy
|
260
|
+
attr_reader :vars
|
261
|
+
|
262
|
+
def initialize
|
263
|
+
@lines = []
|
264
|
+
@intro = ''
|
265
|
+
end
|
266
|
+
|
267
|
+
def intro(text)
|
268
|
+
@intro = text
|
269
|
+
end
|
270
|
+
|
271
|
+
def line(line)
|
272
|
+
@lines << line
|
273
|
+
end
|
274
|
+
|
275
|
+
def markdown
|
276
|
+
pars = []
|
277
|
+
pars << "#{@intro}." unless @intro.empty?
|
278
|
+
pars << 'Here is how it\'s calculated:'
|
279
|
+
pars += @lines.each_with_index.map { |t, i| "#{i.zero? ? 'First' : 'Then'}, #{t}." }
|
280
|
+
pars.join(' ').gsub('. Then, award ', ', and award ')
|
281
|
+
end
|
282
|
+
end
|
283
|
+
end
|
data/lib/fbe.rb
CHANGED
@@ -0,0 +1,100 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# MIT License
|
4
|
+
#
|
5
|
+
# Copyright (c) 2024 Zerocracy
|
6
|
+
#
|
7
|
+
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
8
|
+
# of this software and associated documentation files (the "Software"), to deal
|
9
|
+
# in the Software without restriction, including without limitation the rights
|
10
|
+
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
11
|
+
# copies of the Software, and to permit persons to whom the Software is
|
12
|
+
# furnished to do so, subject to the following conditions:
|
13
|
+
#
|
14
|
+
# The above copyright notice and this permission notice shall be included in all
|
15
|
+
# copies or substantial portions of the Software.
|
16
|
+
#
|
17
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
18
|
+
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
19
|
+
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
20
|
+
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
21
|
+
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
22
|
+
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
23
|
+
# SOFTWARE.
|
24
|
+
|
25
|
+
require 'minitest/autorun'
|
26
|
+
require_relative '../test__helper'
|
27
|
+
require_relative '../../lib/fbe/award'
|
28
|
+
|
29
|
+
# Test.
|
30
|
+
# Author:: Yegor Bugayenko (yegor256@gmail.com)
|
31
|
+
# Copyright:: Copyright (c) 2024 Yegor Bugayenko
|
32
|
+
# License:: MIT
|
33
|
+
class TestAward < Minitest::Test
|
34
|
+
def test_simple
|
35
|
+
a = Fbe::Award.new(
|
36
|
+
'
|
37
|
+
(award
|
38
|
+
(explain "When a bug is resolved by the person who was assigned to it, a reward is granted to this person")
|
39
|
+
(in hours "hours passed between bug reported and closed")
|
40
|
+
(let max 36)
|
41
|
+
(let basis 30)
|
42
|
+
(give basis "as a basis")
|
43
|
+
(set b1 (if (lt hours max) 10 0))
|
44
|
+
(give b1 "for resolving the bug in ${hours} (<${max}) hours")
|
45
|
+
(set days (div hours 24))
|
46
|
+
(set b2 (times days -1))
|
47
|
+
(let worst -20)
|
48
|
+
(set b2 (max b2 worst))
|
49
|
+
(let at_least -5)
|
50
|
+
(set b2 (if (lt b2 at_least) b2 0))
|
51
|
+
(set b2 (between b2 3 120))
|
52
|
+
(give b2 "for holding the bug open for too long (${days} days)"))
|
53
|
+
'
|
54
|
+
)
|
55
|
+
b = a.bill(hours: 10)
|
56
|
+
assert(b.points <= 100)
|
57
|
+
assert(b.points >= 5)
|
58
|
+
assert_equal(43, b.points)
|
59
|
+
g = b.greeting
|
60
|
+
[
|
61
|
+
'You\'ve earned +43 points for this',
|
62
|
+
'+10 for resolving the bug in 10',
|
63
|
+
'too long (0 days)',
|
64
|
+
'bug in 10 (<36) hours',
|
65
|
+
'+30 as a basis'
|
66
|
+
].each { |t| assert(g.include?(t), g) }
|
67
|
+
md = a.policy.markdown
|
68
|
+
[
|
69
|
+
'First, assume that _hours_ is hours',
|
70
|
+
', and award _b₂_'
|
71
|
+
].each { |t| assert(md.include?(t), md) }
|
72
|
+
end
|
73
|
+
|
74
|
+
def test_some_terms
|
75
|
+
{
|
76
|
+
'(let x 25)' => 0,
|
77
|
+
'(award (give 25 "for being a good boy"))' => 25,
|
78
|
+
'(award (give (between 42 -10 -50) "empty"))' => -10,
|
79
|
+
'(award (give (between -3 -10 -50) "empty"))' => -10,
|
80
|
+
'(award (give (between -100 -50 -10) "empty"))' => -50
|
81
|
+
}.each do |q, v|
|
82
|
+
a = Fbe::Award.new(q)
|
83
|
+
assert_equal(v, a.bill.points, q)
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
def test_some_policies
|
88
|
+
{
|
89
|
+
'(award (let x 25) (set z (plus x 1)) (give z "..."))' =>
|
90
|
+
'First, let _x_ be equal to **25**. Then, set _z_ to _x_ + **1**, and award _z_.'
|
91
|
+
# '(award (let x 25) (give x "..."))' =>
|
92
|
+
# 'The amount is **25**.',
|
93
|
+
# '(award (let x -5) (give x "..."))' =>
|
94
|
+
# 'The amount is **-5**.',
|
95
|
+
}.each do |q, t|
|
96
|
+
md = Fbe::Award.new(q).policy.markdown
|
97
|
+
assert(md.include?(t), md)
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
data/test/fbe/test_conclude.rb
CHANGED
data/test/fbe/test_fb.rb
CHANGED
data/test/fbe/test_if_absent.rb
CHANGED
data/test/fbe/test_issue.rb
CHANGED
data/test/fbe/test_iterate.rb
CHANGED
data/test/fbe/test_octo.rb
CHANGED
data/test/fbe/test_sec.rb
CHANGED
data/test/fbe/test_who.rb
CHANGED
data/test/test_fbe.rb
CHANGED
metadata
CHANGED
@@ -1,195 +1,195 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fbe
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.20
|
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-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: backtrace
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - "
|
17
|
+
- - ">"
|
18
18
|
- !ruby/object:Gem::Version
|
19
19
|
version: '0'
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- - "
|
24
|
+
- - ">"
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '0'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: decoor
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- - "
|
31
|
+
- - ">"
|
32
32
|
- !ruby/object:Gem::Version
|
33
33
|
version: '0'
|
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
40
|
version: '0'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: factbase
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- - "
|
45
|
+
- - ">"
|
46
46
|
- !ruby/object:Gem::Version
|
47
47
|
version: '0'
|
48
48
|
type: :runtime
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
|
-
- - "
|
52
|
+
- - ">"
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '0'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: faraday
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
|
-
- - "
|
59
|
+
- - ">"
|
60
60
|
- !ruby/object:Gem::Version
|
61
61
|
version: '0'
|
62
62
|
type: :runtime
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
|
-
- - "
|
66
|
+
- - ">"
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '0'
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: faraday-http-cache
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
72
72
|
requirements:
|
73
|
-
- - "
|
73
|
+
- - ">"
|
74
74
|
- !ruby/object:Gem::Version
|
75
75
|
version: '0'
|
76
76
|
type: :runtime
|
77
77
|
prerelease: false
|
78
78
|
version_requirements: !ruby/object:Gem::Requirement
|
79
79
|
requirements:
|
80
|
-
- - "
|
80
|
+
- - ">"
|
81
81
|
- !ruby/object:Gem::Version
|
82
82
|
version: '0'
|
83
83
|
- !ruby/object:Gem::Dependency
|
84
84
|
name: faraday-multipart
|
85
85
|
requirement: !ruby/object:Gem::Requirement
|
86
86
|
requirements:
|
87
|
-
- - "
|
87
|
+
- - ">"
|
88
88
|
- !ruby/object:Gem::Version
|
89
89
|
version: '0'
|
90
90
|
type: :runtime
|
91
91
|
prerelease: false
|
92
92
|
version_requirements: !ruby/object:Gem::Requirement
|
93
93
|
requirements:
|
94
|
-
- - "
|
94
|
+
- - ">"
|
95
95
|
- !ruby/object:Gem::Version
|
96
96
|
version: '0'
|
97
97
|
- !ruby/object:Gem::Dependency
|
98
98
|
name: faraday-retry
|
99
99
|
requirement: !ruby/object:Gem::Requirement
|
100
100
|
requirements:
|
101
|
-
- - "
|
101
|
+
- - ">"
|
102
102
|
- !ruby/object:Gem::Version
|
103
103
|
version: '0'
|
104
104
|
type: :runtime
|
105
105
|
prerelease: false
|
106
106
|
version_requirements: !ruby/object:Gem::Requirement
|
107
107
|
requirements:
|
108
|
-
- - "
|
108
|
+
- - ">"
|
109
109
|
- !ruby/object:Gem::Version
|
110
110
|
version: '0'
|
111
111
|
- !ruby/object:Gem::Dependency
|
112
112
|
name: judges
|
113
113
|
requirement: !ruby/object:Gem::Requirement
|
114
114
|
requirements:
|
115
|
-
- - "
|
115
|
+
- - ">"
|
116
116
|
- !ruby/object:Gem::Version
|
117
117
|
version: '0'
|
118
118
|
type: :runtime
|
119
119
|
prerelease: false
|
120
120
|
version_requirements: !ruby/object:Gem::Requirement
|
121
121
|
requirements:
|
122
|
-
- - "
|
122
|
+
- - ">"
|
123
123
|
- !ruby/object:Gem::Version
|
124
124
|
version: '0'
|
125
125
|
- !ruby/object:Gem::Dependency
|
126
126
|
name: loog
|
127
127
|
requirement: !ruby/object:Gem::Requirement
|
128
128
|
requirements:
|
129
|
-
- - "
|
129
|
+
- - ">"
|
130
130
|
- !ruby/object:Gem::Version
|
131
131
|
version: '0'
|
132
132
|
type: :runtime
|
133
133
|
prerelease: false
|
134
134
|
version_requirements: !ruby/object:Gem::Requirement
|
135
135
|
requirements:
|
136
|
-
- - "
|
136
|
+
- - ">"
|
137
137
|
- !ruby/object:Gem::Version
|
138
138
|
version: '0'
|
139
139
|
- !ruby/object:Gem::Dependency
|
140
140
|
name: obk
|
141
141
|
requirement: !ruby/object:Gem::Requirement
|
142
142
|
requirements:
|
143
|
-
- - "
|
143
|
+
- - ">"
|
144
144
|
- !ruby/object:Gem::Version
|
145
145
|
version: '0'
|
146
146
|
type: :runtime
|
147
147
|
prerelease: false
|
148
148
|
version_requirements: !ruby/object:Gem::Requirement
|
149
149
|
requirements:
|
150
|
-
- - "
|
150
|
+
- - ">"
|
151
151
|
- !ruby/object:Gem::Version
|
152
152
|
version: '0'
|
153
153
|
- !ruby/object:Gem::Dependency
|
154
154
|
name: octokit
|
155
155
|
requirement: !ruby/object:Gem::Requirement
|
156
156
|
requirements:
|
157
|
-
- - "
|
157
|
+
- - ">"
|
158
158
|
- !ruby/object:Gem::Version
|
159
159
|
version: '0'
|
160
160
|
type: :runtime
|
161
161
|
prerelease: false
|
162
162
|
version_requirements: !ruby/object:Gem::Requirement
|
163
163
|
requirements:
|
164
|
-
- - "
|
164
|
+
- - ">"
|
165
165
|
- !ruby/object:Gem::Version
|
166
166
|
version: '0'
|
167
167
|
- !ruby/object:Gem::Dependency
|
168
168
|
name: others
|
169
169
|
requirement: !ruby/object:Gem::Requirement
|
170
170
|
requirements:
|
171
|
-
- - "
|
171
|
+
- - ">"
|
172
172
|
- !ruby/object:Gem::Version
|
173
173
|
version: '0'
|
174
174
|
type: :runtime
|
175
175
|
prerelease: false
|
176
176
|
version_requirements: !ruby/object:Gem::Requirement
|
177
177
|
requirements:
|
178
|
-
- - "
|
178
|
+
- - ">"
|
179
179
|
- !ruby/object:Gem::Version
|
180
180
|
version: '0'
|
181
181
|
- !ruby/object:Gem::Dependency
|
182
182
|
name: verbose
|
183
183
|
requirement: !ruby/object:Gem::Requirement
|
184
184
|
requirements:
|
185
|
-
- - "
|
185
|
+
- - ">"
|
186
186
|
- !ruby/object:Gem::Version
|
187
187
|
version: '0'
|
188
188
|
type: :runtime
|
189
189
|
prerelease: false
|
190
190
|
version_requirements: !ruby/object:Gem::Requirement
|
191
191
|
requirements:
|
192
|
-
- - "
|
192
|
+
- - ">"
|
193
193
|
- !ruby/object:Gem::Version
|
194
194
|
version: '0'
|
195
195
|
description: A collection of extensions for a factbase, helping the judges of Zerocracy
|
@@ -224,6 +224,7 @@ files:
|
|
224
224
|
- Rakefile
|
225
225
|
- fbe.gemspec
|
226
226
|
- lib/fbe.rb
|
227
|
+
- lib/fbe/award.rb
|
227
228
|
- lib/fbe/conclude.rb
|
228
229
|
- lib/fbe/fb.rb
|
229
230
|
- lib/fbe/if_absent.rb
|
@@ -235,6 +236,7 @@ files:
|
|
235
236
|
- lib/fbe/who.rb
|
236
237
|
- renovate.json
|
237
238
|
- rules/basic.fe
|
239
|
+
- test/fbe/test_award.rb
|
238
240
|
- test/fbe/test_conclude.rb
|
239
241
|
- test/fbe/test_fb.rb
|
240
242
|
- test/fbe/test_if_absent.rb
|