fbe 0.0.75 → 0.0.77
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/Gemfile.lock +31 -30
- data/fbe.gemspec +15 -14
- data/lib/fbe/bylaws.rb +12 -8
- data/lib/fbe/conclude.rb +73 -11
- data/lib/fbe/copy.rb +8 -1
- data/lib/fbe/enter.rb +38 -0
- data/lib/fbe/fb.rb +5 -0
- data/lib/fbe/github_graph.rb +8 -3
- data/lib/fbe/if_absent.rb +23 -2
- data/lib/fbe/issue.rb +7 -0
- data/lib/fbe/iterate.rb +46 -7
- data/lib/fbe/just_one.rb +14 -0
- data/lib/fbe/middleware/quota.rb +4 -0
- data/lib/fbe/middleware.rb +4 -0
- data/lib/fbe/octo.rb +12 -9
- data/lib/fbe/overwrite.rb +7 -5
- data/lib/fbe/pmp.rb +14 -4
- data/lib/fbe/regularly.rb +2 -0
- data/lib/fbe/repeatedly.rb +2 -0
- data/lib/fbe/sec.rb +9 -2
- data/lib/fbe/unmask_repos.rb +44 -30
- data/lib/fbe/who.rb +8 -1
- data/lib/fbe.rb +3 -3
- data/test/fbe/test_conclude.rb +0 -20
- data/test/fbe/test_enter.rb +44 -0
- metadata +56 -40
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9ddebcf39a53a329190de82fa2ac0cd7396b3e2ba61f78a42071e2178a9b8d90
|
4
|
+
data.tar.gz: 05f078caf57e2b5f62454f01526c13b29f8e86988ed59d1f2c3edca46f2b60f3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 43aeba7ea29b28572827becf136f47c9dd6ed152c3469f94364acd68c389a9acb6cb55810317407e92a58d7a23dd0658f01662269ab1eb47c5749d9661096cb8
|
7
|
+
data.tar.gz: cf05b37c19c84c0414ab8eec86edc2fb700c371083dbdb67bbaf87cce8052db206c5bda8c5d119dc6b11b947da5ab89681da46901c779689a1a90997fa8304a5
|
data/Gemfile.lock
CHANGED
@@ -2,21 +2,22 @@ PATH
|
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
4
|
fbe (0.0.0)
|
5
|
-
backtrace (
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
faraday
|
10
|
-
faraday-
|
11
|
-
faraday-
|
12
|
-
|
13
|
-
|
5
|
+
backtrace (~> 0)
|
6
|
+
baza.rb (~> 0)
|
7
|
+
decoor (~> 0)
|
8
|
+
factbase (~> 0)
|
9
|
+
faraday (~> 2)
|
10
|
+
faraday-http-cache (~> 2)
|
11
|
+
faraday-multipart (~> 1)
|
12
|
+
faraday-retry (~> 2)
|
13
|
+
graphql-client (~> 0)
|
14
|
+
judges (~> 0)
|
14
15
|
liquid (= 5.5.1)
|
15
|
-
loog (
|
16
|
-
obk (
|
17
|
-
octokit (
|
18
|
-
others (
|
19
|
-
verbose (
|
16
|
+
loog (~> 0)
|
17
|
+
obk (~> 0)
|
18
|
+
octokit (~> 9)
|
19
|
+
others (~> 0)
|
20
|
+
verbose (~> 0)
|
20
21
|
|
21
22
|
GEM
|
22
23
|
remote: https://rubygems.org/
|
@@ -55,7 +56,7 @@ GEM
|
|
55
56
|
ast (2.4.2)
|
56
57
|
backtrace (0.4.0)
|
57
58
|
base64 (0.2.0)
|
58
|
-
baza.rb (0.0.
|
59
|
+
baza.rb (0.0.9)
|
59
60
|
backtrace (> 0)
|
60
61
|
elapsed (> 0)
|
61
62
|
faraday (> 0)
|
@@ -112,7 +113,7 @@ GEM
|
|
112
113
|
ffi (1.17.0-x86_64-linux-gnu)
|
113
114
|
fiber-storage (1.0.0)
|
114
115
|
gli (2.21.5)
|
115
|
-
graphql (2.3.
|
116
|
+
graphql (2.3.18)
|
116
117
|
base64
|
117
118
|
fiber-storage
|
118
119
|
graphql-client (0.23.0)
|
@@ -122,25 +123,25 @@ GEM
|
|
122
123
|
i18n (1.14.6)
|
123
124
|
concurrent-ruby (~> 1.0)
|
124
125
|
io-console (0.7.2)
|
125
|
-
irb (1.14.
|
126
|
+
irb (1.14.1)
|
126
127
|
rdoc (>= 4.0.0)
|
127
128
|
reline (>= 0.4.2)
|
128
129
|
iri (0.8.0)
|
129
130
|
json (2.7.2)
|
130
|
-
judges (0.
|
131
|
-
backtrace (
|
132
|
-
baza.rb (
|
131
|
+
judges (0.27.0)
|
132
|
+
backtrace (~> 0)
|
133
|
+
baza.rb (~> 0)
|
133
134
|
concurrent-ruby (~> 1.2)
|
134
|
-
elapsed (
|
135
|
-
factbase (
|
135
|
+
elapsed (~> 0)
|
136
|
+
factbase (~> 0)
|
136
137
|
gli (~> 2.21)
|
137
|
-
iri (
|
138
|
-
loog (
|
138
|
+
iri (~> 0)
|
139
|
+
loog (~> 0)
|
139
140
|
moments (~> 0.3)
|
140
141
|
nokogiri (~> 1.10)
|
141
|
-
others (
|
142
|
-
retries (
|
143
|
-
tago (
|
142
|
+
others (~> 0)
|
143
|
+
retries (~> 0)
|
144
|
+
tago (~> 0)
|
144
145
|
typhoeus (~> 1.3)
|
145
146
|
language_server-protocol (3.17.0.3)
|
146
147
|
liquid (5.5.1)
|
@@ -180,7 +181,7 @@ GEM
|
|
180
181
|
stringio
|
181
182
|
public_suffix (6.0.1)
|
182
183
|
racc (1.8.1)
|
183
|
-
rack (3.1.
|
184
|
+
rack (3.1.8)
|
184
185
|
rack-session (2.0.0)
|
185
186
|
rack (>= 3.0.0)
|
186
187
|
rack-test (2.1.0)
|
@@ -217,7 +218,7 @@ GEM
|
|
217
218
|
rspec-expectations (3.13.3)
|
218
219
|
diff-lcs (>= 1.2.0, < 2.0)
|
219
220
|
rspec-support (~> 3.13.0)
|
220
|
-
rspec-mocks (3.13.
|
221
|
+
rspec-mocks (3.13.2)
|
221
222
|
diff-lcs (>= 1.2.0, < 2.0)
|
222
223
|
rspec-support (~> 3.13.0)
|
223
224
|
rspec-rails (7.0.1)
|
@@ -280,7 +281,7 @@ GEM
|
|
280
281
|
webrick (1.8.2)
|
281
282
|
yaml (0.3.0)
|
282
283
|
yard (0.9.37)
|
283
|
-
zeitwerk (2.
|
284
|
+
zeitwerk (2.7.0)
|
284
285
|
|
285
286
|
PLATFORMS
|
286
287
|
arm64-darwin-22
|
data/fbe.gemspec
CHANGED
@@ -39,20 +39,21 @@ 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 '
|
44
|
-
s.add_dependency '
|
45
|
-
s.add_dependency '
|
46
|
-
s.add_dependency 'faraday
|
47
|
-
s.add_dependency 'faraday-
|
48
|
-
s.add_dependency 'faraday-
|
49
|
-
s.add_dependency '
|
50
|
-
s.add_dependency '
|
42
|
+
s.add_dependency 'backtrace', '~>0'
|
43
|
+
s.add_dependency 'baza.rb', '~>0'
|
44
|
+
s.add_dependency 'decoor', '~>0'
|
45
|
+
s.add_dependency 'factbase', '~>0'
|
46
|
+
s.add_dependency 'faraday', '~>2'
|
47
|
+
s.add_dependency 'faraday-http-cache', '~>2'
|
48
|
+
s.add_dependency 'faraday-multipart', '~>1'
|
49
|
+
s.add_dependency 'faraday-retry', '~>2'
|
50
|
+
s.add_dependency 'graphql-client', '~>0'
|
51
|
+
s.add_dependency 'judges', '~>0'
|
51
52
|
s.add_dependency 'liquid', '5.5.1'
|
52
|
-
s.add_dependency 'loog', '
|
53
|
-
s.add_dependency 'obk', '
|
54
|
-
s.add_dependency 'octokit', '
|
55
|
-
s.add_dependency 'others', '
|
56
|
-
s.add_dependency 'verbose', '
|
53
|
+
s.add_dependency 'loog', '~>0'
|
54
|
+
s.add_dependency 'obk', '~>0'
|
55
|
+
s.add_dependency 'octokit', '~>9'
|
56
|
+
s.add_dependency 'others', '~>0'
|
57
|
+
s.add_dependency 'verbose', '~>0'
|
57
58
|
s.metadata['rubygems_mfa_required'] = 'true'
|
58
59
|
end
|
data/lib/fbe/bylaws.rb
CHANGED
@@ -25,17 +25,21 @@
|
|
25
25
|
require 'liquid'
|
26
26
|
require_relative '../fbe'
|
27
27
|
|
28
|
-
#
|
28
|
+
# Generates policies/bylaws.
|
29
29
|
#
|
30
|
-
#
|
31
|
-
#
|
32
|
-
#
|
30
|
+
# Using the templates stored in the +assets/bylaws+ directory, this function
|
31
|
+
# creates a hash, where keys are names and values are formulas of bylaws.
|
32
|
+
#
|
33
|
+
# @param [Integer] anger How strict must be the bylaws, giving punishments
|
34
|
+
# @param [Integer] love How big should be the volume of rewards
|
35
|
+
# @param [Integer] paranoia How much should be required to reward love
|
36
|
+
# @return [Hash<String, String>] Names of bylaws and their formulas
|
33
37
|
def Fbe.bylaws(anger: 2, love: 2, paranoia: 2)
|
34
|
-
raise
|
35
|
-
raise
|
36
|
-
raise
|
38
|
+
raise "The 'anger' must be in the [0..4] interval: #{anger.inspect}" unless !anger.negative? && anger < 5
|
39
|
+
raise "The 'love' must be in the [0..4] interval: #{love.inspect}" unless !love.negative? && love < 5
|
40
|
+
raise "The 'paranoia' must be in the [1..4] interval: #{paranoia.inspect}" unless paranoia.positive? && paranoia < 5
|
37
41
|
home = File.join(__dir__, '../../assets/bylaws')
|
38
|
-
raise "The directory with templates is absent
|
42
|
+
raise "The directory with templates is absent #{home.inspect}" unless File.exist?(home)
|
39
43
|
Dir[File.join(home, '*.liquid')].to_h do |f|
|
40
44
|
formula = Liquid::Template.parse(File.read(f)).render(
|
41
45
|
'anger' => anger, 'love' => love, 'paranoia' => paranoia
|
data/lib/fbe/conclude.rb
CHANGED
@@ -27,19 +27,39 @@ require_relative 'fb'
|
|
27
27
|
require_relative 'octo'
|
28
28
|
require_relative 'if_absent'
|
29
29
|
|
30
|
-
#
|
30
|
+
# Creates an instance of {Fbe::Conclude} and evals it with the block provided.
|
31
31
|
#
|
32
32
|
# @param [Factbase] fb The factbase
|
33
33
|
# @param [String] judge The name of the judge, from the +judges+ tool
|
34
34
|
# @param [Hash] global The hash for global caching
|
35
35
|
# @param [Judges::Options] options The options coming from the +judges+ tool
|
36
36
|
# @param [Loog] loog The logging facility
|
37
|
+
# @yield [Factbase::Fact] The fact
|
37
38
|
def Fbe.conclude(fb: Fbe.fb, judge: $judge, loog: $loog, options: $options, global: $global, &)
|
38
39
|
c = Fbe::Conclude.new(fb:, judge:, loog:, options:, global:)
|
39
40
|
c.instance_eval(&)
|
40
41
|
end
|
41
42
|
|
42
|
-
#
|
43
|
+
# A concluding block.
|
44
|
+
#
|
45
|
+
# You may want to use this class when you want to go through a number
|
46
|
+
# of facts in the factbase, applying certain algorithm to each of them
|
47
|
+
# and possibly creating new facts from them.
|
48
|
+
#
|
49
|
+
# For example, you want to make a new +good+ fact for every +bad+ fact found:
|
50
|
+
#
|
51
|
+
# require 'fbe/conclude'
|
52
|
+
# conclude do
|
53
|
+
# on '(exist bad)'
|
54
|
+
# follow 'when'
|
55
|
+
# draw on |n, b|
|
56
|
+
# n.good = 'yes!'
|
57
|
+
# end
|
58
|
+
# end
|
59
|
+
#
|
60
|
+
# This snippet will find all facts that have +bad+ property and then create
|
61
|
+
# new facts, letting the block in the {Fbe::Conclude#draw} deal with them.
|
62
|
+
#
|
43
63
|
# Author:: Yegor Bugayenko (yegor256@gmail.com)
|
44
64
|
# Copyright:: Copyright (c) 2024 Zerocracy
|
45
65
|
# License:: MIT
|
@@ -62,19 +82,52 @@ class Fbe::Conclude
|
|
62
82
|
@quota_aware = false
|
63
83
|
end
|
64
84
|
|
85
|
+
# Make this block aware of GitHub API quota.
|
86
|
+
#
|
87
|
+
# When the quota is reached, the loop will gracefully stop.
|
88
|
+
#
|
89
|
+
# @return [nil] Nothing
|
65
90
|
def quota_aware
|
66
91
|
@quota_aware = true
|
67
92
|
end
|
68
93
|
|
94
|
+
# Set the query that should find the facts in the factbase.
|
95
|
+
#
|
96
|
+
# @param [String] query The query
|
97
|
+
# @return [nil] Nothing
|
69
98
|
def on(query)
|
70
99
|
raise 'Query is already set' unless @query.nil?
|
71
100
|
@query = query
|
72
101
|
end
|
73
102
|
|
103
|
+
# Set the list of properties to copy from the facts found to new facts.
|
104
|
+
#
|
105
|
+
# @param [Arra<String>] props List of property names
|
106
|
+
# @return [nil] Nothing
|
74
107
|
def follow(props)
|
75
|
-
@follows = props.split
|
108
|
+
@follows = props.strip.split.compact
|
76
109
|
end
|
77
110
|
|
111
|
+
# Create new fact from every fact found by the query.
|
112
|
+
#
|
113
|
+
# For example, you want to conclude a +reward+ from every +win+ fact:
|
114
|
+
#
|
115
|
+
# require 'fbe/conclude'
|
116
|
+
# conclude do
|
117
|
+
# on '(exist win)'
|
118
|
+
# follow 'win when'
|
119
|
+
# draw on |n, w|
|
120
|
+
# n.reward = 10
|
121
|
+
# end
|
122
|
+
# end
|
123
|
+
#
|
124
|
+
# This snippet will find all facts that have +win+ property and will create
|
125
|
+
# new facts for all of them, passing them one by one in to the block of
|
126
|
+
# the +draw+, where +n+ would be the new created fact and the +w+ would
|
127
|
+
# be the fact found.
|
128
|
+
#
|
129
|
+
# @yield [Array<Factbase::Fact,Factbase::Fact>] New fact and seen fact
|
130
|
+
# @return [Integer] The count of the facts processed
|
78
131
|
def draw(&)
|
79
132
|
roll do |fbt, a|
|
80
133
|
n = fbt.insert
|
@@ -83,14 +136,20 @@ class Fbe::Conclude
|
|
83
136
|
end
|
84
137
|
end
|
85
138
|
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
139
|
+
# Take every fact, allowing the given block to process it.
|
140
|
+
#
|
141
|
+
# For example, you want to add +when+ property to every fact:
|
142
|
+
#
|
143
|
+
# require 'fbe/conclude'
|
144
|
+
# conclude do
|
145
|
+
# on '(always)'
|
146
|
+
# consider on |f|
|
147
|
+
# f.when = Time.new
|
148
|
+
# end
|
149
|
+
# end
|
150
|
+
#
|
151
|
+
# @yield [Factbase::Fact] The next fact found by the query
|
152
|
+
# @return [Integer] The count of the facts processed
|
94
153
|
def consider(&)
|
95
154
|
roll do |_fbt, a|
|
96
155
|
yield a
|
@@ -100,6 +159,8 @@ class Fbe::Conclude
|
|
100
159
|
|
101
160
|
private
|
102
161
|
|
162
|
+
# @yield [Factbase::Fact] The next fact found by the query
|
163
|
+
# @return [Integer] The count of the facts seen
|
103
164
|
def roll(&)
|
104
165
|
passed = 0
|
105
166
|
catch :stop do
|
@@ -113,6 +174,7 @@ class Fbe::Conclude
|
|
113
174
|
end
|
114
175
|
end
|
115
176
|
@loog.debug("Found and processed #{passed} facts by: #{@query}")
|
177
|
+
passed
|
116
178
|
end
|
117
179
|
|
118
180
|
def fill(fact, prev)
|
data/lib/fbe/copy.rb
CHANGED
@@ -25,20 +25,27 @@
|
|
25
25
|
require_relative '../fbe'
|
26
26
|
require_relative 'fb'
|
27
27
|
|
28
|
-
#
|
28
|
+
# Makes a copy of a fact, moving all properties to a new fact.
|
29
|
+
#
|
30
|
+
# All properties from the +source+ will be copied to the +target+, except those
|
31
|
+
# listed in the +except+.
|
29
32
|
#
|
30
33
|
# @param [Factbase::Fact] source The source
|
31
34
|
# @param [Factbase::Fact] target The targer
|
32
35
|
# @param [Array<String>] except List of properties to NOT copy
|
36
|
+
# @return [Integer] How many properties were copied
|
33
37
|
def Fbe.copy(source, target, except: [])
|
34
38
|
raise 'The source is nil' if source.nil?
|
35
39
|
raise 'The target is nil' if target.nil?
|
36
40
|
raise 'The except is nil' if except.nil?
|
41
|
+
copied = 0
|
37
42
|
source.all_properties.each do |k|
|
38
43
|
next unless target[k].nil?
|
39
44
|
next if except.include?(k)
|
40
45
|
source[k].each do |v|
|
41
46
|
target.send(:"#{k}=", v)
|
47
|
+
copied += 1
|
42
48
|
end
|
43
49
|
end
|
50
|
+
copied
|
44
51
|
end
|
data/lib/fbe/enter.rb
ADDED
@@ -0,0 +1,38 @@
|
|
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 'baza-rb'
|
26
|
+
require_relative '../fbe'
|
27
|
+
|
28
|
+
# Enter a new valve.
|
29
|
+
#
|
30
|
+
# @param [String] badge Unique badge of the valve
|
31
|
+
# @param [String] why The reason
|
32
|
+
# @param [Judges::Options] options The options coming from the +judges+ tool
|
33
|
+
# @param [Loog] loog The logging facility
|
34
|
+
# @return [String] Full name of the user
|
35
|
+
def Fbe.enter(badge, why, options: $options, loog: $loog, &)
|
36
|
+
baza = BazaRb.new('api.zerocracy.com', 443, options.zerocracy_token, loog:)
|
37
|
+
baza.enter(options.job_name, badge, why, options.job_id.to_i, &)
|
38
|
+
end
|
data/lib/fbe/fb.rb
CHANGED
@@ -32,10 +32,15 @@ require_relative '../fbe'
|
|
32
32
|
|
33
33
|
# Returns an instance of +Factbase+ (cached).
|
34
34
|
#
|
35
|
+
# Instead of using +$fb+ directly, it is recommended to use this utility
|
36
|
+
# method. It will not only return the global factbase, but will also
|
37
|
+
# make sure it's properly decorated and cached.
|
38
|
+
#
|
35
39
|
# @param [Factbase] fb The global factbase provided by the +judges+ tool
|
36
40
|
# @param [Hash] global The hash for global caching
|
37
41
|
# @param [Judges::Options] options The options coming from the +judges+ tool
|
38
42
|
# @param [Loog] loog The logging facility
|
43
|
+
# @return [Factbase] The global factbase
|
39
44
|
def Fbe.fb(fb: $fb, global: $global, options: $options, loog: $loog)
|
40
45
|
global[:fb] ||=
|
41
46
|
begin
|
data/lib/fbe/github_graph.rb
CHANGED
@@ -22,15 +22,16 @@
|
|
22
22
|
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
23
23
|
# SOFTWARE.
|
24
24
|
|
25
|
-
require 'loog'
|
26
25
|
require 'graphql/client'
|
27
26
|
require 'graphql/client/http'
|
27
|
+
require 'loog'
|
28
28
|
|
29
|
-
#
|
29
|
+
# Creates an instance of {Fbe::Graph}.
|
30
30
|
#
|
31
31
|
# @param [Judges::Options] options The options available globally
|
32
32
|
# @param [Hash] global Hash of global options
|
33
33
|
# @param [Loog] loog Logging facility
|
34
|
+
# @return [Fbe::Graph] The instance of the class
|
34
35
|
def Fbe.github_graph(options: $options, global: $global, loog: $loog)
|
35
36
|
global[:github_graph] ||=
|
36
37
|
if options.testing.nil?
|
@@ -41,7 +42,11 @@ def Fbe.github_graph(options: $options, global: $global, loog: $loog)
|
|
41
42
|
end
|
42
43
|
end
|
43
44
|
|
44
|
-
#
|
45
|
+
# A client to GitHub GraphQL.
|
46
|
+
#
|
47
|
+
# Author:: Yegor Bugayenko (yegor256@gmail.com)
|
48
|
+
# Copyright:: Copyright (c) 2024 Zerocracy
|
49
|
+
# License:: MIT
|
45
50
|
class Fbe::Graph
|
46
51
|
def initialize(token:, host: 'api.github.com')
|
47
52
|
@token = token
|
data/lib/fbe/if_absent.rb
CHANGED
@@ -22,13 +22,33 @@
|
|
22
22
|
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
23
23
|
# SOFTWARE.
|
24
24
|
|
25
|
-
require 'time'
|
26
25
|
require 'others'
|
26
|
+
require 'time'
|
27
27
|
require_relative '../fbe'
|
28
28
|
require_relative 'fb'
|
29
29
|
|
30
30
|
# Injects a fact if it's absent in the factbase, otherwise (it is already
|
31
31
|
# there) returns NIL.
|
32
|
+
#
|
33
|
+
# Here is what you do when you want to add a fact to the factbase, but
|
34
|
+
# don't want to make a duplicate of an existing one:
|
35
|
+
#
|
36
|
+
# require 'fbe/if_absent'
|
37
|
+
# n =
|
38
|
+
# Fbe.if_absent do |f|
|
39
|
+
# f.what = 'something'
|
40
|
+
# f.details = 'important'
|
41
|
+
# end
|
42
|
+
# return if n.nil?
|
43
|
+
# n.when = Time.now
|
44
|
+
#
|
45
|
+
# This code will definitely create one fact with +what+ equals to +something+
|
46
|
+
# and +details+ equals to +important+, while the +when+ will be equal to the
|
47
|
+
# time of its first creation.
|
48
|
+
#
|
49
|
+
# @param [Factbase] fb The global factbase
|
50
|
+
# @yield [Factbase::Fact] The fact just created
|
51
|
+
# @return [nil|Factbase::Fact] Either +nil+ if it's already there or a new fact
|
32
52
|
def Fbe.if_absent(fb: Fbe.fb)
|
33
53
|
attrs = {}
|
34
54
|
f =
|
@@ -51,7 +71,8 @@ def Fbe.if_absent(fb: Fbe.fb)
|
|
51
71
|
"(eq #{k} #{vv})"
|
52
72
|
end.join(' ')
|
53
73
|
q = "(and #{q})"
|
54
|
-
|
74
|
+
before = fb.query(q).each.to_a.first
|
75
|
+
return nil if before
|
55
76
|
n = fb.insert
|
56
77
|
attrs.each { |k, v| n.send("#{k}=", v) }
|
57
78
|
n
|
data/lib/fbe/issue.rb
CHANGED
@@ -23,13 +23,20 @@
|
|
23
23
|
# SOFTWARE.
|
24
24
|
|
25
25
|
require_relative '../fbe'
|
26
|
+
require_relative 'octo'
|
26
27
|
|
27
28
|
# Converts an ID of GitHub issue into a nicely formatting string.
|
28
29
|
#
|
30
|
+
# The function takes the +repository+ property of the provided +fact+,
|
31
|
+
# goes to the GitHub API in order to find the full name of the repository,
|
32
|
+
# and then creates a string with the full name of repository + issue, for
|
33
|
+
# example +"zerocracy/fbe#42"+.
|
34
|
+
#
|
29
35
|
# @param [Factbase::Fact] fact The fact, where to get the ID of GitHub issue
|
30
36
|
# @param [Judges::Options] options The options coming from the +judges+ tool
|
31
37
|
# @param [Hash] global The hash for global caching
|
32
38
|
# @param [Loog] loog The logging facility
|
39
|
+
# @return [String] Textual representation of GitHub issue number
|
33
40
|
def Fbe.issue(fact, options: $options, global: $global, loog: $loog)
|
34
41
|
rid = fact['repository']
|
35
42
|
raise "There is no 'repository' property" if rid.nil?
|
data/lib/fbe/iterate.rb
CHANGED
@@ -23,21 +23,40 @@
|
|
23
23
|
# SOFTWARE.
|
24
24
|
|
25
25
|
require_relative '../fbe'
|
26
|
-
require_relative 'unmask_repos'
|
27
|
-
require_relative 'octo'
|
28
26
|
require_relative 'fb'
|
27
|
+
require_relative 'octo'
|
28
|
+
require_relative 'unmask_repos'
|
29
29
|
|
30
|
-
#
|
30
|
+
# Creates an instance of {Fbe::Iterate} and evals it with the block provided.
|
31
|
+
#
|
32
|
+
# @param [Factbase] fb The global factbase provided by the +judges+ tool
|
33
|
+
# @param [Judges::Options] options The options coming from the +judges+ tool
|
34
|
+
# @param [Hash] global The hash for global caching
|
35
|
+
# @param [Loog] loog The logging facility
|
36
|
+
# @yield [Factbase::Fact] The fact
|
31
37
|
def Fbe.iterate(fb: Fbe.fb, loog: $loog, options: $options, global: $global, &)
|
32
38
|
c = Fbe::Iterate.new(fb:, loog:, options:, global:)
|
33
39
|
c.instance_eval(&)
|
34
40
|
end
|
35
41
|
|
36
|
-
#
|
42
|
+
# An iterator.
|
43
|
+
#
|
44
|
+
# Here, you go through all repositories defined by the +repositories+ option
|
45
|
+
# in the +$options+, trying to run the provided query for each of them. If the
|
46
|
+
# query returns an integer that is different from the previously seen, the
|
47
|
+
# function keeps repeating the cycle. Otherwise, it will restart from the
|
48
|
+
# beginning.
|
49
|
+
#
|
37
50
|
# Author:: Yegor Bugayenko (yegor256@gmail.com)
|
38
51
|
# Copyright:: Copyright (c) 2024 Zerocracy
|
39
52
|
# License:: MIT
|
40
53
|
class Fbe::Iterate
|
54
|
+
# Ctor.
|
55
|
+
#
|
56
|
+
# @param [Factbase] fb The factbase
|
57
|
+
# @param [Loog] loog The logging facility
|
58
|
+
# @param [Judges::Options] options The options coming from the +judges+ tool
|
59
|
+
# @param [Hash] global The hash for global caching
|
41
60
|
def initialize(fb:, loog:, options:, global:)
|
42
61
|
@fb = fb
|
43
62
|
@loog = loog
|
@@ -50,22 +69,39 @@ class Fbe::Iterate
|
|
50
69
|
@quota_aware = false
|
51
70
|
end
|
52
71
|
|
72
|
+
# Make this block aware of GitHub API quota.
|
73
|
+
#
|
74
|
+
# When the quota is reached, the loop will gracefully stop.
|
75
|
+
#
|
76
|
+
# @return [nil] Nothing
|
53
77
|
def quota_aware
|
54
78
|
@quota_aware = true
|
55
79
|
end
|
56
80
|
|
81
|
+
# Sets the total counter of repeats to make.
|
82
|
+
#
|
83
|
+
# @param [Integer] repeats The total count of them
|
84
|
+
# @return [nil] Nothing
|
57
85
|
def repeats(repeats)
|
58
86
|
raise 'Cannot set "repeats" to nil' if repeats.nil?
|
59
87
|
raise 'The "repeats" must be a positive integer' unless repeats.positive?
|
60
88
|
@repeats = repeats
|
61
89
|
end
|
62
90
|
|
91
|
+
# Sets the query to run.
|
92
|
+
#
|
93
|
+
# @param [String] query The query
|
94
|
+
# @return [nil] Nothing
|
63
95
|
def by(query)
|
64
96
|
raise 'Query is already set' unless @query.nil?
|
65
97
|
raise 'Cannot set query to nil' if query.nil?
|
66
98
|
@query = query
|
67
99
|
end
|
68
100
|
|
101
|
+
# Sets the label to use in the "marker" fact.
|
102
|
+
#
|
103
|
+
# @param [String] label The label
|
104
|
+
# @return [nil] Nothing
|
69
105
|
def as(label)
|
70
106
|
raise 'Label is already set' unless @label.nil?
|
71
107
|
raise 'Cannot set "label" to nil' if label.nil?
|
@@ -73,10 +109,13 @@ class Fbe::Iterate
|
|
73
109
|
end
|
74
110
|
|
75
111
|
# It makes a number of repeats of going through all repositories
|
76
|
-
# provided by the
|
112
|
+
# provided by the +repositories+ configuration option. In each "repeat"
|
77
113
|
# it yields the repository ID and a number that is retrieved by the
|
78
|
-
#
|
79
|
-
#
|
114
|
+
# +query+. The query is supplied with two parameter:
|
115
|
+
# +$before+ the value from the previous repeat and +$repository+ (GitHub repo ID).
|
116
|
+
#
|
117
|
+
# @yield [Array<Integer, Integer>] Repository ID and the next number to be considered
|
118
|
+
# @return [nil] Nothing
|
80
119
|
def over(&)
|
81
120
|
raise 'Use "as" first' if @label.nil?
|
82
121
|
raise 'Use "by" first' if @query.nil?
|
data/lib/fbe/just_one.rb
CHANGED
@@ -29,6 +29,20 @@ require_relative 'fb'
|
|
29
29
|
|
30
30
|
# Injects a fact if it's absent in the factbase, otherwise (it is already
|
31
31
|
# there) returns the existing one.
|
32
|
+
#
|
33
|
+
# require 'fbe/just_one'
|
34
|
+
# n =
|
35
|
+
# Fbe.just_one do |f|
|
36
|
+
# f.what = 'something'
|
37
|
+
# f.details = 'important'
|
38
|
+
# end
|
39
|
+
#
|
40
|
+
# This code will guarantee that only one fact with +what+ equals to +something+
|
41
|
+
# and +details+ equals to +important+ may exist.
|
42
|
+
#
|
43
|
+
# @param [Factbase] fb The global factbase
|
44
|
+
# @yield [Factbase::Fact] The fact that was either created or found
|
45
|
+
# @return [Factbase::Fact] The fact found
|
32
46
|
def Fbe.just_one(fb: Fbe.fb)
|
33
47
|
attrs = {}
|
34
48
|
f =
|
data/lib/fbe/middleware/quota.rb
CHANGED
@@ -25,6 +25,10 @@
|
|
25
25
|
require 'faraday'
|
26
26
|
|
27
27
|
# Faraday Middleware that monitors GitHub API rate limits.
|
28
|
+
#
|
29
|
+
# Author:: Yegor Bugayenko (yegor256@gmail.com)
|
30
|
+
# Copyright:: Copyright (c) 2024 Zerocracy
|
31
|
+
# License:: MIT
|
28
32
|
class Fbe::Middleware::Quota < Faraday::Middleware
|
29
33
|
def initialize(app, loog: Loog::NULL, pause: 60, limit: 100, rate: 5)
|
30
34
|
super(app)
|