fbe 0.17.0 → 0.19.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/Gemfile +8 -8
- data/Gemfile.lock +46 -41
- data/fbe.gemspec +15 -14
- data/lib/fbe/conclude.rb +1 -1
- data/lib/fbe/iterate.rb +3 -3
- data/lib/fbe/middleware/sqlite_store.rb +83 -0
- data/lib/fbe/octo.rb +18 -2
- data/lib/fbe.rb +1 -1
- data/test/fbe/middleware/test_sqlite_store.rb +35 -0
- data/test/fbe/test_fb.rb +22 -0
- data/test/fbe/test_octo.rb +34 -10
- metadata +65 -49
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ca1e12a4b07ce8d4fa15ce2d92d8eed98fe9e34bcf7024106610fd8558c67c18
|
4
|
+
data.tar.gz: e3c30f1281c87d569ae69b966a35d9ec05813890fca0b0ede639b416e4beb7b8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 117de890b3d5d5abfa0fff5a0c8da8b1681618c8c2726fa7cc248fa28321e90752500d83f005583a9cb886624a135386f7379c7f529c1da6205b274888ee6d5e
|
7
|
+
data.tar.gz: 3db7a0b6b6a3a19fff7fb475ca372ad501de9031c4ec0d984e4ffcb0f95d81d83fc7840fe11df4464ea7c920d229e7ccc3dfc6f7099c7d9801559cb89b4a7569
|
data/Gemfile
CHANGED
@@ -7,16 +7,16 @@ source 'https://rubygems.org'
|
|
7
7
|
gemspec
|
8
8
|
|
9
9
|
gem 'minitest', '~>5.25', require: false
|
10
|
-
gem 'minitest-reporters', '
|
11
|
-
gem 'os', '
|
12
|
-
gem 'qbash', '
|
13
|
-
gem 'rake', '
|
10
|
+
gem 'minitest-reporters', '~>1.7', require: false
|
11
|
+
gem 'os', '~>1.1', require: false
|
12
|
+
gem 'qbash', '~>0.4', require: false
|
13
|
+
gem 'rake', '~>13.3', require: false
|
14
14
|
gem 'rubocop', '~>1.75', require: false
|
15
|
-
gem 'rubocop-minitest', '
|
16
|
-
gem 'rubocop-performance', '
|
17
|
-
gem 'rubocop-rake', '
|
15
|
+
gem 'rubocop-minitest', '~>0.38', require: false
|
16
|
+
gem 'rubocop-performance', '~>1.25', require: false
|
17
|
+
gem 'rubocop-rake', '~>0.7', require: false
|
18
18
|
gem 'simplecov', '~>0.22', require: false
|
19
19
|
gem 'simplecov-cobertura', '~>2.1', require: false
|
20
|
-
gem 'veils', '
|
20
|
+
gem 'veils', '~>0.4', require: false
|
21
21
|
gem 'webmock', '~>3.25', require: false
|
22
22
|
gem 'yard', '~>0.9', require: false
|
data/Gemfile.lock
CHANGED
@@ -2,23 +2,24 @@ PATH
|
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
4
|
fbe (0.0.0)
|
5
|
-
backtrace (
|
6
|
-
baza.rb (
|
7
|
-
decoor (
|
8
|
-
factbase (
|
5
|
+
backtrace (~> 0.4)
|
6
|
+
baza.rb (~> 0.5)
|
7
|
+
decoor (~> 0.0)
|
8
|
+
factbase (~> 0.11)
|
9
9
|
faraday (~> 2.0)
|
10
|
-
faraday-http-cache (~> 2.
|
11
|
-
faraday-multipart (~> 1.
|
12
|
-
faraday-retry (~> 2.
|
13
|
-
graphql-client (~> 0.
|
14
|
-
judges (
|
10
|
+
faraday-http-cache (~> 2.5)
|
11
|
+
faraday-multipart (~> 1.1)
|
12
|
+
faraday-retry (~> 2.3)
|
13
|
+
graphql-client (~> 0.26)
|
14
|
+
judges (~> 0.46)
|
15
15
|
liquid (~> 5.5)
|
16
|
-
loog (
|
17
|
-
obk (
|
16
|
+
loog (~> 0.6)
|
17
|
+
obk (~> 0.3)
|
18
18
|
octokit (~> 10.0)
|
19
|
-
others (
|
20
|
-
|
21
|
-
|
19
|
+
others (~> 0.0)
|
20
|
+
sqlite3 (~> 2.6)
|
21
|
+
tago (~> 0.1)
|
22
|
+
verbose (~> 0.0)
|
22
23
|
|
23
24
|
GEM
|
24
25
|
remote: https://rubygems.org/
|
@@ -40,9 +41,9 @@ GEM
|
|
40
41
|
public_suffix (>= 2.0.2, < 7.0)
|
41
42
|
ansi (1.5.0)
|
42
43
|
ast (2.4.3)
|
43
|
-
backtrace (0.4.
|
44
|
+
backtrace (0.4.1)
|
44
45
|
base64 (0.3.0)
|
45
|
-
baza.rb (0.5.
|
46
|
+
baza.rb (0.5.1)
|
46
47
|
backtrace (> 0)
|
47
48
|
elapsed (> 0)
|
48
49
|
faraday (> 0)
|
@@ -55,7 +56,7 @@ GEM
|
|
55
56
|
tago (~> 0)
|
56
57
|
typhoeus (~> 1.3)
|
57
58
|
benchmark (0.4.1)
|
58
|
-
bigdecimal (3.2.
|
59
|
+
bigdecimal (3.2.2)
|
59
60
|
builder (3.3.0)
|
60
61
|
concurrent-ruby (1.3.5)
|
61
62
|
connection_pool (2.5.3)
|
@@ -99,7 +100,7 @@ GEM
|
|
99
100
|
fiber-storage (1.0.1)
|
100
101
|
gli (2.22.2)
|
101
102
|
ostruct
|
102
|
-
graphql (2.5.
|
103
|
+
graphql (2.5.9)
|
103
104
|
base64
|
104
105
|
fiber-storage
|
105
106
|
logger
|
@@ -111,22 +112,22 @@ GEM
|
|
111
112
|
concurrent-ruby (~> 1.0)
|
112
113
|
iri (0.11.2)
|
113
114
|
json (2.12.2)
|
114
|
-
judges (0.
|
115
|
-
backtrace (~> 0)
|
116
|
-
baza.rb (~> 0)
|
115
|
+
judges (0.46.0)
|
116
|
+
backtrace (~> 0.4)
|
117
|
+
baza.rb (~> 0.5)
|
117
118
|
concurrent-ruby (~> 1.2)
|
118
|
-
elapsed (~> 0)
|
119
|
-
factbase (~> 0.
|
119
|
+
elapsed (~> 0.0)
|
120
|
+
factbase (~> 0.11)
|
120
121
|
gli (~> 2.21)
|
121
|
-
iri (~> 0)
|
122
|
-
loog (~> 0)
|
122
|
+
iri (~> 0.11)
|
123
|
+
loog (~> 0.6)
|
123
124
|
moments (~> 0.3)
|
124
125
|
nokogiri (~> 1.10)
|
125
|
-
others (~> 0)
|
126
|
-
retries (~> 0)
|
127
|
-
tago (~> 0)
|
128
|
-
timeout (~> 0)
|
129
|
-
total (~> 0)
|
126
|
+
others (~> 0.0)
|
127
|
+
retries (~> 0.0)
|
128
|
+
tago (~> 0.1)
|
129
|
+
timeout (~> 0.4)
|
130
|
+
total (~> 0.4)
|
130
131
|
typhoeus (~> 1.3)
|
131
132
|
language_server-protocol (3.17.0.5)
|
132
133
|
lint_roller (1.1.0)
|
@@ -178,7 +179,7 @@ GEM
|
|
178
179
|
regexp_parser (2.10.0)
|
179
180
|
retries (0.0.5)
|
180
181
|
rexml (3.4.1)
|
181
|
-
rubocop (1.
|
182
|
+
rubocop (1.76.0)
|
182
183
|
json (~> 2.3)
|
183
184
|
language_server-protocol (~> 3.17.0.2)
|
184
185
|
lint_roller (~> 1.1.0)
|
@@ -186,10 +187,10 @@ GEM
|
|
186
187
|
parser (>= 3.3.0.2)
|
187
188
|
rainbow (>= 2.2.2, < 4.0)
|
188
189
|
regexp_parser (>= 2.9.3, < 3.0)
|
189
|
-
rubocop-ast (>= 1.
|
190
|
+
rubocop-ast (>= 1.45.0, < 2.0)
|
190
191
|
ruby-progressbar (~> 1.7)
|
191
192
|
unicode-display_width (>= 2.4.0, < 4.0)
|
192
|
-
rubocop-ast (1.
|
193
|
+
rubocop-ast (1.45.0)
|
193
194
|
parser (>= 3.3.7.2)
|
194
195
|
prism (~> 1.4)
|
195
196
|
rubocop-minitest (0.38.1)
|
@@ -217,6 +218,10 @@ GEM
|
|
217
218
|
simplecov (~> 0.19)
|
218
219
|
simplecov-html (0.13.1)
|
219
220
|
simplecov_json_formatter (0.1.4)
|
221
|
+
sqlite3 (2.6.0-arm64-darwin)
|
222
|
+
sqlite3 (2.6.0-x64-mingw-ucrt)
|
223
|
+
sqlite3 (2.6.0-x86_64-darwin)
|
224
|
+
sqlite3 (2.6.0-x86_64-linux-gnu)
|
220
225
|
strscan (3.1.5)
|
221
226
|
tago (0.1.0)
|
222
227
|
timeout (0.4.3)
|
@@ -252,17 +257,17 @@ PLATFORMS
|
|
252
257
|
DEPENDENCIES
|
253
258
|
fbe!
|
254
259
|
minitest (~> 5.25)
|
255
|
-
minitest-reporters (
|
256
|
-
os (
|
257
|
-
qbash (
|
258
|
-
rake (
|
260
|
+
minitest-reporters (~> 1.7)
|
261
|
+
os (~> 1.1)
|
262
|
+
qbash (~> 0.4)
|
263
|
+
rake (~> 13.3)
|
259
264
|
rubocop (~> 1.75)
|
260
|
-
rubocop-minitest (
|
261
|
-
rubocop-performance (
|
262
|
-
rubocop-rake (
|
265
|
+
rubocop-minitest (~> 0.38)
|
266
|
+
rubocop-performance (~> 1.25)
|
267
|
+
rubocop-rake (~> 0.7)
|
263
268
|
simplecov (~> 0.22)
|
264
269
|
simplecov-cobertura (~> 2.1)
|
265
|
-
veils (
|
270
|
+
veils (~> 0.4)
|
266
271
|
webmock (~> 3.25)
|
267
272
|
yard (~> 0.9)
|
268
273
|
|
data/fbe.gemspec
CHANGED
@@ -22,22 +22,23 @@ Gem::Specification.new do |s|
|
|
22
22
|
s.files = `git ls-files`.split($RS)
|
23
23
|
s.rdoc_options = ['--charset=UTF-8']
|
24
24
|
s.extra_rdoc_files = ['README.md', 'LICENSE.txt']
|
25
|
-
s.add_dependency 'backtrace', '
|
26
|
-
s.add_dependency 'baza.rb', '
|
27
|
-
s.add_dependency 'decoor', '
|
28
|
-
s.add_dependency 'factbase', '
|
25
|
+
s.add_dependency 'backtrace', '~>0.4'
|
26
|
+
s.add_dependency 'baza.rb', '~>0.5'
|
27
|
+
s.add_dependency 'decoor', '~>0.0'
|
28
|
+
s.add_dependency 'factbase', '~>0.11'
|
29
29
|
s.add_dependency 'faraday', '~>2.0'
|
30
|
-
s.add_dependency 'faraday-http-cache', '~>2.
|
31
|
-
s.add_dependency 'faraday-multipart', '~>1.
|
32
|
-
s.add_dependency 'faraday-retry', '~>2.
|
33
|
-
s.add_dependency 'graphql-client', '~>0.
|
34
|
-
s.add_dependency 'judges', '
|
30
|
+
s.add_dependency 'faraday-http-cache', '~>2.5'
|
31
|
+
s.add_dependency 'faraday-multipart', '~>1.1'
|
32
|
+
s.add_dependency 'faraday-retry', '~>2.3'
|
33
|
+
s.add_dependency 'graphql-client', '~>0.26'
|
34
|
+
s.add_dependency 'judges', '~>0.46'
|
35
35
|
s.add_dependency 'liquid', '~>5.5'
|
36
|
-
s.add_dependency 'loog', '
|
37
|
-
s.add_dependency 'obk', '
|
36
|
+
s.add_dependency 'loog', '~>0.6'
|
37
|
+
s.add_dependency 'obk', '~>0.3'
|
38
38
|
s.add_dependency 'octokit', '~>10.0'
|
39
|
-
s.add_dependency 'others', '
|
40
|
-
s.add_dependency '
|
41
|
-
s.add_dependency '
|
39
|
+
s.add_dependency 'others', '~>0.0'
|
40
|
+
s.add_dependency 'sqlite3', '~> 2.6'
|
41
|
+
s.add_dependency 'tago', '~>0.1'
|
42
|
+
s.add_dependency 'verbose', '~>0.0'
|
42
43
|
s.metadata['rubygems_mfa_required'] = 'true'
|
43
44
|
end
|
data/lib/fbe/conclude.rb
CHANGED
@@ -184,7 +184,7 @@ class Fbe::Conclude
|
|
184
184
|
oct = Fbe.octo(loog: @loog, options: @options, global: @global)
|
185
185
|
@fb.txn do |fbt|
|
186
186
|
fbt.query(@query).each do |a|
|
187
|
-
if @quota_aware && oct.off_quota
|
187
|
+
if @quota_aware && oct.off_quota?
|
188
188
|
@loog.debug('We ran out of GitHub quota, must stop here')
|
189
189
|
throw :commit
|
190
190
|
end
|
data/lib/fbe/iterate.rb
CHANGED
@@ -199,7 +199,7 @@ class Fbe::Iterate
|
|
199
199
|
raise 'Use "by" first' if @query.nil?
|
200
200
|
seen = {}
|
201
201
|
oct = Fbe.octo(loog: @loog, options: @options, global: @global)
|
202
|
-
if oct.off_quota
|
202
|
+
if oct.off_quota?
|
203
203
|
@loog.debug('We are off GitHub quota, cannot even start, sorry')
|
204
204
|
return
|
205
205
|
end
|
@@ -207,12 +207,12 @@ class Fbe::Iterate
|
|
207
207
|
restarted = []
|
208
208
|
start = Time.now
|
209
209
|
loop do
|
210
|
-
if oct.off_quota
|
210
|
+
if oct.off_quota?
|
211
211
|
@loog.info("We are off GitHub quota, time to stop after #{start.ago}")
|
212
212
|
break
|
213
213
|
end
|
214
214
|
repos.each do |repo|
|
215
|
-
if oct.off_quota
|
215
|
+
if oct.off_quota?
|
216
216
|
@loog.debug("We are off GitHub quota, we must skip #{repo}")
|
217
217
|
break
|
218
218
|
end
|
@@ -0,0 +1,83 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# SPDX-FileCopyrightText: Copyright (c) 2024-2025 Zerocracy
|
4
|
+
# SPDX-License-Identifier: MIT
|
5
|
+
|
6
|
+
require 'json'
|
7
|
+
require 'sqlite3'
|
8
|
+
require_relative '../../fbe'
|
9
|
+
require_relative '../../fbe/middleware'
|
10
|
+
|
11
|
+
# Persisted SQLite store for Faraday::HttpCache
|
12
|
+
#
|
13
|
+
# Author:: Yegor Bugayenko (yegor256@gmail.com)
|
14
|
+
# Copyright:: Copyright (c) 2024-2025 Zerocracy
|
15
|
+
# License:: MIT
|
16
|
+
class Fbe::Middleware::SqliteStore
|
17
|
+
def initialize(path)
|
18
|
+
raise ArgumentError, 'Database path cannot be nil or empty' if path.nil? || path.empty?
|
19
|
+
dir = File.dirname(path)
|
20
|
+
raise ArgumentError, "Directory #{dir} does not exist" unless File.directory?(dir)
|
21
|
+
@path = path
|
22
|
+
open
|
23
|
+
prepare
|
24
|
+
at_exit { close }
|
25
|
+
end
|
26
|
+
|
27
|
+
def read(key)
|
28
|
+
value = perform { _1.execute('SELECT value FROM cache WHERE key = ? LIMIT 1', [key]) }.dig(0, 0)
|
29
|
+
JSON.parse(value) if value
|
30
|
+
end
|
31
|
+
|
32
|
+
def delete(key)
|
33
|
+
perform { _1.execute('DELETE FROM cache WHERE key = ?', [key]) }
|
34
|
+
nil
|
35
|
+
end
|
36
|
+
|
37
|
+
def write(key, value)
|
38
|
+
value = JSON.dump(value)
|
39
|
+
perform do |tdb|
|
40
|
+
tdb.execute(<<~SQL, [key, value])
|
41
|
+
INSERT INTO cache(key, value) VALUES(?1, ?2)
|
42
|
+
ON CONFLICT(key) DO UPDATE SET value = ?2
|
43
|
+
SQL
|
44
|
+
end
|
45
|
+
nil
|
46
|
+
end
|
47
|
+
|
48
|
+
def open
|
49
|
+
return if @db
|
50
|
+
@db = SQLite3::Database.new(@path)
|
51
|
+
end
|
52
|
+
|
53
|
+
def prepare
|
54
|
+
perform do |tdb|
|
55
|
+
tdb.execute 'CREATE TABLE IF NOT EXISTS cache(key TEXT UNIQUE NOT NULL, value TEXT);'
|
56
|
+
tdb.execute 'CREATE INDEX IF NOT EXISTS key_idx ON cache(key);'
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
def close
|
61
|
+
return if !@db || @db.closed?
|
62
|
+
@db.close
|
63
|
+
@db = nil
|
64
|
+
end
|
65
|
+
|
66
|
+
def clear
|
67
|
+
perform { _1.execute 'DELETE FROM cache;' }
|
68
|
+
end
|
69
|
+
|
70
|
+
def drop
|
71
|
+
perform { _1.execute 'DROP TABLE IF EXISTS cache;' }
|
72
|
+
end
|
73
|
+
|
74
|
+
def all
|
75
|
+
perform { _1.execute('SELECT key, value FROM cache') }
|
76
|
+
end
|
77
|
+
|
78
|
+
private
|
79
|
+
|
80
|
+
def perform(&)
|
81
|
+
@db.transaction(&)
|
82
|
+
end
|
83
|
+
end
|
data/lib/fbe/octo.rb
CHANGED
@@ -3,6 +3,7 @@
|
|
3
3
|
# SPDX-FileCopyrightText: Copyright (c) 2024-2025 Zerocracy
|
4
4
|
# SPDX-License-Identifier: MIT
|
5
5
|
|
6
|
+
require 'json'
|
6
7
|
require 'decoor'
|
7
8
|
require 'faraday/http_cache'
|
8
9
|
require 'faraday/retry'
|
@@ -15,6 +16,7 @@ require_relative '../fbe'
|
|
15
16
|
require_relative 'middleware'
|
16
17
|
require_relative 'middleware/formatter'
|
17
18
|
require_relative 'middleware/trace'
|
19
|
+
require_relative 'middleware/sqlite_store'
|
18
20
|
|
19
21
|
# Makes a call to the GitHub API.
|
20
22
|
#
|
@@ -78,7 +80,15 @@ def Fbe.octo(options: $options, global: $global, loog: $loog)
|
|
78
80
|
methods: [:get],
|
79
81
|
backoff_factor: 2
|
80
82
|
)
|
81
|
-
|
83
|
+
serializer = Marshal
|
84
|
+
if options.sqlite_cache
|
85
|
+
store = Fbe::Middleware::SqliteStore.new(options.sqlite_cache)
|
86
|
+
serializer = JSON
|
87
|
+
end
|
88
|
+
builder.use(
|
89
|
+
Faraday::HttpCache,
|
90
|
+
store: store, serializer: serializer, shared_cache: false, logger: Loog::NULL
|
91
|
+
)
|
82
92
|
builder.use(Octokit::Response::RaiseError)
|
83
93
|
builder.use(Faraday::Response::Logger, loog, formatter: Fbe::Middleware::Formatter)
|
84
94
|
builder.use(Fbe::Middleware::Trace, trace)
|
@@ -109,7 +119,7 @@ def Fbe.octo(options: $options, global: $global, loog: $loog)
|
|
109
119
|
end
|
110
120
|
end
|
111
121
|
|
112
|
-
def off_quota(threshold: 50)
|
122
|
+
def off_quota?(threshold: 50)
|
113
123
|
left = @origin.rate_limit.remaining
|
114
124
|
if left < threshold
|
115
125
|
@loog.info("Too much GitHub API quota consumed already (#{left} < #{threshold}), stopping")
|
@@ -382,9 +392,11 @@ class Fbe::FakeOctokit
|
|
382
392
|
# @example
|
383
393
|
# fake_client = Fbe::FakeOctokit.new
|
384
394
|
# fake_client.remove_organization_membership('zerocracy') #=> true
|
395
|
+
# rubocop:disable Naming/PredicateMethod
|
385
396
|
def remove_organization_membership(_org, _user = nil)
|
386
397
|
true
|
387
398
|
end
|
399
|
+
# rubocop:enable Naming/PredicateMethod
|
388
400
|
|
389
401
|
# Accepts a repository invitation.
|
390
402
|
#
|
@@ -393,10 +405,12 @@ class Fbe::FakeOctokit
|
|
393
405
|
# @example
|
394
406
|
# fake_client = Fbe::FakeOctokit.new
|
395
407
|
# fake_client.accept_repository_invitation(1) #=> true
|
408
|
+
# rubocop:disable Naming/PredicateMethod
|
396
409
|
def accept_repository_invitation(id)
|
397
410
|
raise Octokit::NotFound if id == 404_000
|
398
411
|
true
|
399
412
|
end
|
413
|
+
# rubocop:enable Naming/PredicateMethod
|
400
414
|
|
401
415
|
# Gives a star to a repository.
|
402
416
|
#
|
@@ -405,9 +419,11 @@ class Fbe::FakeOctokit
|
|
405
419
|
# @example
|
406
420
|
# fake_client = Fbe::FakeOctokit.new
|
407
421
|
# fake_client.star('octocat/Hello-World') #=> true
|
422
|
+
# rubocop:disable Naming/PredicateMethod
|
408
423
|
def star(_repo)
|
409
424
|
true
|
410
425
|
end
|
426
|
+
# rubocop:enable Naming/PredicateMethod
|
411
427
|
|
412
428
|
# Gets details of a GitHub user.
|
413
429
|
#
|
data/lib/fbe.rb
CHANGED
@@ -0,0 +1,35 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# SPDX-FileCopyrightText: Copyright (c) 2024-2025 Zerocracy
|
4
|
+
# SPDX-License-Identifier: MIT
|
5
|
+
|
6
|
+
require_relative '../../test__helper'
|
7
|
+
require_relative '../../../lib/fbe/middleware'
|
8
|
+
require_relative '../../../lib/fbe/middleware/sqlite_store'
|
9
|
+
|
10
|
+
# Test.
|
11
|
+
# Author:: Yegor Bugayenko (yegor256@gmail.com)
|
12
|
+
# Copyright:: Copyright (c) 2024-2025 Zerocracy
|
13
|
+
# License:: MIT
|
14
|
+
class SqliteStoreTest < Fbe::Test
|
15
|
+
def test_sqlite_store
|
16
|
+
Dir.mktmpdir do |dir|
|
17
|
+
store = Fbe::Middleware::SqliteStore.new(File.expand_path('test.db', dir))
|
18
|
+
assert_nil(store.read('my_key'))
|
19
|
+
assert_nil(store.delete('my_key'))
|
20
|
+
assert_nil(store.write('my_key', 'some value'))
|
21
|
+
assert_equal('some value', store.read('my_key'))
|
22
|
+
assert_nil(store.write('my_key', 'some value 2'))
|
23
|
+
assert_equal('some value 2', store.read('my_key'))
|
24
|
+
assert_nil(store.delete('my_key'))
|
25
|
+
assert_nil(store.read('my_key'))
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def test_sqlite_store_empty_all
|
30
|
+
Dir.mktmpdir do |dir|
|
31
|
+
store = Fbe::Middleware::SqliteStore.new(File.expand_path('test.db', dir))
|
32
|
+
assert_empty(store.all)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
data/test/fbe/test_fb.rb
CHANGED
@@ -27,6 +27,28 @@ class TestFb < Fbe::Test
|
|
27
27
|
assert_includes(stdout, 'Inserted new fact #1', stdout)
|
28
28
|
end
|
29
29
|
|
30
|
+
def test_defends_against_improper_facts
|
31
|
+
$fb = Factbase.new
|
32
|
+
$global = {}
|
33
|
+
$options = Judges::Options.new
|
34
|
+
$loog = Loog::Buffer.new
|
35
|
+
assert_raises(StandardError, 'issue without repository') do
|
36
|
+
Fbe.fb.txn do |fbt|
|
37
|
+
f = fbt.insert
|
38
|
+
f.what = 'issue-was-opened'
|
39
|
+
f.issue = 42
|
40
|
+
f.where = 'github'
|
41
|
+
end
|
42
|
+
end
|
43
|
+
assert_raises(StandardError, 'repository without where') do
|
44
|
+
Fbe.fb.txn do |fbt|
|
45
|
+
f = fbt.insert
|
46
|
+
f.what = 'issue-was-opened'
|
47
|
+
f.repository = 44
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
30
52
|
def test_increment_id_in_transaction
|
31
53
|
$fb = Factbase.new
|
32
54
|
$global = {}
|
data/test/fbe/test_octo.rb
CHANGED
@@ -18,7 +18,7 @@ class TestOcto < Fbe::Test
|
|
18
18
|
global = {}
|
19
19
|
options = Judges::Options.new({ 'testing' => true })
|
20
20
|
o = Fbe.octo(loog: Loog::NULL, global:, options:)
|
21
|
-
|
21
|
+
refute_predicate(o, :off_quota?)
|
22
22
|
refute_nil(o.pull_request('foo/foo', 42))
|
23
23
|
refute_nil(o.commit_pulls('foo/foo', 'sha'))
|
24
24
|
end
|
@@ -101,7 +101,7 @@ class TestOcto < Fbe::Test
|
|
101
101
|
assert_equal(4, o.rate_limit.remaining)
|
102
102
|
end
|
103
103
|
|
104
|
-
def test_off_quota
|
104
|
+
def test_off_quota?
|
105
105
|
WebMock.disable_net_connect!
|
106
106
|
stub_request(:get, 'https://api.github.com/rate_limit').to_return(
|
107
107
|
body: '{}', headers: { 'X-RateLimit-Remaining' => '333' }
|
@@ -110,9 +110,9 @@ class TestOcto < Fbe::Test
|
|
110
110
|
body: '', headers: { 'X-RateLimit-Remaining' => '3' }
|
111
111
|
)
|
112
112
|
o = Fbe.octo(loog: Loog::NULL, global: {}, options: Judges::Options.new)
|
113
|
-
|
113
|
+
refute_predicate(o, :off_quota?)
|
114
114
|
o.user(42)
|
115
|
-
|
115
|
+
assert_predicate(o, :off_quota?)
|
116
116
|
end
|
117
117
|
|
118
118
|
def test_off_quota_twice
|
@@ -125,11 +125,11 @@ class TestOcto < Fbe::Test
|
|
125
125
|
{ body: '', headers: { 'X-RateLimit-Remaining' => '5' } }
|
126
126
|
)
|
127
127
|
o = Fbe.octo(loog: Loog::VERBOSE, global: {}, options: Judges::Options.new)
|
128
|
-
|
128
|
+
refute_predicate(o, :off_quota?)
|
129
129
|
o.user(42)
|
130
|
-
|
130
|
+
refute_predicate(o, :off_quota?)
|
131
131
|
o.user(42)
|
132
|
-
|
132
|
+
assert_predicate(o, :off_quota?)
|
133
133
|
end
|
134
134
|
|
135
135
|
def test_print_quota_left_while_initialize
|
@@ -216,9 +216,9 @@ class TestOcto < Fbe::Test
|
|
216
216
|
headers: { 'x-ratelimit-remaining' => '10000' }
|
217
217
|
)
|
218
218
|
o.user('foo')
|
219
|
-
|
219
|
+
assert_predicate(o, :off_quota?)
|
220
220
|
o.user('foo')
|
221
|
-
|
221
|
+
refute_predicate(o, :off_quota?)
|
222
222
|
end
|
223
223
|
|
224
224
|
def test_fetches_fake_check_runs_for_ref
|
@@ -260,7 +260,7 @@ class TestOcto < Fbe::Test
|
|
260
260
|
def test_reads_quota
|
261
261
|
WebMock.enable_net_connect!
|
262
262
|
o = Fbe.octo(loog: Loog::VERBOSE, global: {}, options: Judges::Options.new({ 'github_api_pause' => 0.01 }))
|
263
|
-
refute_nil(o.off_quota)
|
263
|
+
refute_nil(o.off_quota?)
|
264
264
|
end
|
265
265
|
|
266
266
|
def test_fetches_fake_not_found_users
|
@@ -366,4 +366,28 @@ class TestOcto < Fbe::Test
|
|
366
366
|
second_output = second_loog.to_s
|
367
367
|
assert_includes second_output, 'GitHub API trace is empty'
|
368
368
|
end
|
369
|
+
|
370
|
+
def test_sqlite_store
|
371
|
+
WebMock.disable_net_connect!
|
372
|
+
Dir.mktmpdir do |dir|
|
373
|
+
global = {}
|
374
|
+
sqlite_cache = File.expand_path('test.db', dir)
|
375
|
+
o = Fbe.octo(loog: Loog::NULL, global:, options: Judges::Options.new({ 'sqlite_cache' => sqlite_cache }))
|
376
|
+
stub = stub_request(:get, 'https://api.github.com/user/42').to_return(
|
377
|
+
status: 200,
|
378
|
+
body: { login: 'user1' }.to_json,
|
379
|
+
headers: {
|
380
|
+
'Content-Type' => 'application/json',
|
381
|
+
'Cache-Control' => 'public, max-age=60, s-maxage=60',
|
382
|
+
'Etag' => 'W/"2ff9dd4c3153f006830b2b8b721f6a4bb400a1eb81a2e1fa0a3b846ad349b9ec"',
|
383
|
+
'Last-Modified' => 'Wed, 01 May 2025 20:00:00 GMT'
|
384
|
+
}
|
385
|
+
)
|
386
|
+
assert_equal('user1', o.user_name_by_id(42))
|
387
|
+
WebMock.remove_request_stub(stub)
|
388
|
+
global = {}
|
389
|
+
o = Fbe.octo(loog: Loog::NULL, global:, options: Judges::Options.new({ 'sqlite_cache' => sqlite_cache }))
|
390
|
+
assert_equal('user1', o.user_name_by_id(42))
|
391
|
+
end
|
392
|
+
end
|
369
393
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fbe
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.19.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Yegor Bugayenko
|
@@ -13,58 +13,58 @@ dependencies:
|
|
13
13
|
name: backtrace
|
14
14
|
requirement: !ruby/object:Gem::Requirement
|
15
15
|
requirements:
|
16
|
-
- - "
|
16
|
+
- - "~>"
|
17
17
|
- !ruby/object:Gem::Version
|
18
|
-
version: '0'
|
18
|
+
version: '0.4'
|
19
19
|
type: :runtime
|
20
20
|
prerelease: false
|
21
21
|
version_requirements: !ruby/object:Gem::Requirement
|
22
22
|
requirements:
|
23
|
-
- - "
|
23
|
+
- - "~>"
|
24
24
|
- !ruby/object:Gem::Version
|
25
|
-
version: '0'
|
25
|
+
version: '0.4'
|
26
26
|
- !ruby/object:Gem::Dependency
|
27
27
|
name: baza.rb
|
28
28
|
requirement: !ruby/object:Gem::Requirement
|
29
29
|
requirements:
|
30
|
-
- - "
|
30
|
+
- - "~>"
|
31
31
|
- !ruby/object:Gem::Version
|
32
|
-
version: '0'
|
32
|
+
version: '0.5'
|
33
33
|
type: :runtime
|
34
34
|
prerelease: false
|
35
35
|
version_requirements: !ruby/object:Gem::Requirement
|
36
36
|
requirements:
|
37
|
-
- - "
|
37
|
+
- - "~>"
|
38
38
|
- !ruby/object:Gem::Version
|
39
|
-
version: '0'
|
39
|
+
version: '0.5'
|
40
40
|
- !ruby/object:Gem::Dependency
|
41
41
|
name: decoor
|
42
42
|
requirement: !ruby/object:Gem::Requirement
|
43
43
|
requirements:
|
44
|
-
- - "
|
44
|
+
- - "~>"
|
45
45
|
- !ruby/object:Gem::Version
|
46
|
-
version: '0'
|
46
|
+
version: '0.0'
|
47
47
|
type: :runtime
|
48
48
|
prerelease: false
|
49
49
|
version_requirements: !ruby/object:Gem::Requirement
|
50
50
|
requirements:
|
51
|
-
- - "
|
51
|
+
- - "~>"
|
52
52
|
- !ruby/object:Gem::Version
|
53
|
-
version: '0'
|
53
|
+
version: '0.0'
|
54
54
|
- !ruby/object:Gem::Dependency
|
55
55
|
name: factbase
|
56
56
|
requirement: !ruby/object:Gem::Requirement
|
57
57
|
requirements:
|
58
|
-
- - "
|
58
|
+
- - "~>"
|
59
59
|
- !ruby/object:Gem::Version
|
60
|
-
version: 0.
|
60
|
+
version: '0.11'
|
61
61
|
type: :runtime
|
62
62
|
prerelease: false
|
63
63
|
version_requirements: !ruby/object:Gem::Requirement
|
64
64
|
requirements:
|
65
|
-
- - "
|
65
|
+
- - "~>"
|
66
66
|
- !ruby/object:Gem::Version
|
67
|
-
version: 0.
|
67
|
+
version: '0.11'
|
68
68
|
- !ruby/object:Gem::Dependency
|
69
69
|
name: faraday
|
70
70
|
requirement: !ruby/object:Gem::Requirement
|
@@ -85,70 +85,70 @@ dependencies:
|
|
85
85
|
requirements:
|
86
86
|
- - "~>"
|
87
87
|
- !ruby/object:Gem::Version
|
88
|
-
version: '2.
|
88
|
+
version: '2.5'
|
89
89
|
type: :runtime
|
90
90
|
prerelease: false
|
91
91
|
version_requirements: !ruby/object:Gem::Requirement
|
92
92
|
requirements:
|
93
93
|
- - "~>"
|
94
94
|
- !ruby/object:Gem::Version
|
95
|
-
version: '2.
|
95
|
+
version: '2.5'
|
96
96
|
- !ruby/object:Gem::Dependency
|
97
97
|
name: faraday-multipart
|
98
98
|
requirement: !ruby/object:Gem::Requirement
|
99
99
|
requirements:
|
100
100
|
- - "~>"
|
101
101
|
- !ruby/object:Gem::Version
|
102
|
-
version: '1.
|
102
|
+
version: '1.1'
|
103
103
|
type: :runtime
|
104
104
|
prerelease: false
|
105
105
|
version_requirements: !ruby/object:Gem::Requirement
|
106
106
|
requirements:
|
107
107
|
- - "~>"
|
108
108
|
- !ruby/object:Gem::Version
|
109
|
-
version: '1.
|
109
|
+
version: '1.1'
|
110
110
|
- !ruby/object:Gem::Dependency
|
111
111
|
name: faraday-retry
|
112
112
|
requirement: !ruby/object:Gem::Requirement
|
113
113
|
requirements:
|
114
114
|
- - "~>"
|
115
115
|
- !ruby/object:Gem::Version
|
116
|
-
version: '2.
|
116
|
+
version: '2.3'
|
117
117
|
type: :runtime
|
118
118
|
prerelease: false
|
119
119
|
version_requirements: !ruby/object:Gem::Requirement
|
120
120
|
requirements:
|
121
121
|
- - "~>"
|
122
122
|
- !ruby/object:Gem::Version
|
123
|
-
version: '2.
|
123
|
+
version: '2.3'
|
124
124
|
- !ruby/object:Gem::Dependency
|
125
125
|
name: graphql-client
|
126
126
|
requirement: !ruby/object:Gem::Requirement
|
127
127
|
requirements:
|
128
128
|
- - "~>"
|
129
129
|
- !ruby/object:Gem::Version
|
130
|
-
version: '0.
|
130
|
+
version: '0.26'
|
131
131
|
type: :runtime
|
132
132
|
prerelease: false
|
133
133
|
version_requirements: !ruby/object:Gem::Requirement
|
134
134
|
requirements:
|
135
135
|
- - "~>"
|
136
136
|
- !ruby/object:Gem::Version
|
137
|
-
version: '0.
|
137
|
+
version: '0.26'
|
138
138
|
- !ruby/object:Gem::Dependency
|
139
139
|
name: judges
|
140
140
|
requirement: !ruby/object:Gem::Requirement
|
141
141
|
requirements:
|
142
|
-
- - "
|
142
|
+
- - "~>"
|
143
143
|
- !ruby/object:Gem::Version
|
144
|
-
version: '0'
|
144
|
+
version: '0.46'
|
145
145
|
type: :runtime
|
146
146
|
prerelease: false
|
147
147
|
version_requirements: !ruby/object:Gem::Requirement
|
148
148
|
requirements:
|
149
|
-
- - "
|
149
|
+
- - "~>"
|
150
150
|
- !ruby/object:Gem::Version
|
151
|
-
version: '0'
|
151
|
+
version: '0.46'
|
152
152
|
- !ruby/object:Gem::Dependency
|
153
153
|
name: liquid
|
154
154
|
requirement: !ruby/object:Gem::Requirement
|
@@ -167,30 +167,30 @@ dependencies:
|
|
167
167
|
name: loog
|
168
168
|
requirement: !ruby/object:Gem::Requirement
|
169
169
|
requirements:
|
170
|
-
- - "
|
170
|
+
- - "~>"
|
171
171
|
- !ruby/object:Gem::Version
|
172
|
-
version: '0'
|
172
|
+
version: '0.6'
|
173
173
|
type: :runtime
|
174
174
|
prerelease: false
|
175
175
|
version_requirements: !ruby/object:Gem::Requirement
|
176
176
|
requirements:
|
177
|
-
- - "
|
177
|
+
- - "~>"
|
178
178
|
- !ruby/object:Gem::Version
|
179
|
-
version: '0'
|
179
|
+
version: '0.6'
|
180
180
|
- !ruby/object:Gem::Dependency
|
181
181
|
name: obk
|
182
182
|
requirement: !ruby/object:Gem::Requirement
|
183
183
|
requirements:
|
184
|
-
- - "
|
184
|
+
- - "~>"
|
185
185
|
- !ruby/object:Gem::Version
|
186
|
-
version: '0'
|
186
|
+
version: '0.3'
|
187
187
|
type: :runtime
|
188
188
|
prerelease: false
|
189
189
|
version_requirements: !ruby/object:Gem::Requirement
|
190
190
|
requirements:
|
191
|
-
- - "
|
191
|
+
- - "~>"
|
192
192
|
- !ruby/object:Gem::Version
|
193
|
-
version: '0'
|
193
|
+
version: '0.3'
|
194
194
|
- !ruby/object:Gem::Dependency
|
195
195
|
name: octokit
|
196
196
|
requirement: !ruby/object:Gem::Requirement
|
@@ -209,44 +209,58 @@ dependencies:
|
|
209
209
|
name: others
|
210
210
|
requirement: !ruby/object:Gem::Requirement
|
211
211
|
requirements:
|
212
|
-
- - "
|
212
|
+
- - "~>"
|
213
213
|
- !ruby/object:Gem::Version
|
214
|
-
version: '0'
|
214
|
+
version: '0.0'
|
215
215
|
type: :runtime
|
216
216
|
prerelease: false
|
217
217
|
version_requirements: !ruby/object:Gem::Requirement
|
218
218
|
requirements:
|
219
|
-
- - "
|
219
|
+
- - "~>"
|
220
220
|
- !ruby/object:Gem::Version
|
221
|
-
version: '0'
|
221
|
+
version: '0.0'
|
222
|
+
- !ruby/object:Gem::Dependency
|
223
|
+
name: sqlite3
|
224
|
+
requirement: !ruby/object:Gem::Requirement
|
225
|
+
requirements:
|
226
|
+
- - "~>"
|
227
|
+
- !ruby/object:Gem::Version
|
228
|
+
version: '2.6'
|
229
|
+
type: :runtime
|
230
|
+
prerelease: false
|
231
|
+
version_requirements: !ruby/object:Gem::Requirement
|
232
|
+
requirements:
|
233
|
+
- - "~>"
|
234
|
+
- !ruby/object:Gem::Version
|
235
|
+
version: '2.6'
|
222
236
|
- !ruby/object:Gem::Dependency
|
223
237
|
name: tago
|
224
238
|
requirement: !ruby/object:Gem::Requirement
|
225
239
|
requirements:
|
226
|
-
- - "
|
240
|
+
- - "~>"
|
227
241
|
- !ruby/object:Gem::Version
|
228
|
-
version: '0'
|
242
|
+
version: '0.1'
|
229
243
|
type: :runtime
|
230
244
|
prerelease: false
|
231
245
|
version_requirements: !ruby/object:Gem::Requirement
|
232
246
|
requirements:
|
233
|
-
- - "
|
247
|
+
- - "~>"
|
234
248
|
- !ruby/object:Gem::Version
|
235
|
-
version: '0'
|
249
|
+
version: '0.1'
|
236
250
|
- !ruby/object:Gem::Dependency
|
237
251
|
name: verbose
|
238
252
|
requirement: !ruby/object:Gem::Requirement
|
239
253
|
requirements:
|
240
|
-
- - "
|
254
|
+
- - "~>"
|
241
255
|
- !ruby/object:Gem::Version
|
242
|
-
version: '0'
|
256
|
+
version: '0.0'
|
243
257
|
type: :runtime
|
244
258
|
prerelease: false
|
245
259
|
version_requirements: !ruby/object:Gem::Requirement
|
246
260
|
requirements:
|
247
|
-
- - "
|
261
|
+
- - "~>"
|
248
262
|
- !ruby/object:Gem::Version
|
249
|
-
version: '0'
|
263
|
+
version: '0.0'
|
250
264
|
description: A collection of extensions for a factbase, helping the judges of Zerocracy
|
251
265
|
manipulate the facts and create new ones
|
252
266
|
email: yegor256@gmail.com
|
@@ -307,6 +321,7 @@ files:
|
|
307
321
|
- lib/fbe/just_one.rb
|
308
322
|
- lib/fbe/middleware.rb
|
309
323
|
- lib/fbe/middleware/formatter.rb
|
324
|
+
- lib/fbe/middleware/sqlite_store.rb
|
310
325
|
- lib/fbe/middleware/trace.rb
|
311
326
|
- lib/fbe/octo.rb
|
312
327
|
- lib/fbe/overwrite.rb
|
@@ -319,6 +334,7 @@ files:
|
|
319
334
|
- renovate.json
|
320
335
|
- rules/basic.fe
|
321
336
|
- test/fbe/middleware/test_formatter.rb
|
337
|
+
- test/fbe/middleware/test_sqlite_store.rb
|
322
338
|
- test/fbe/middleware/test_trace.rb
|
323
339
|
- test/fbe/test_award.rb
|
324
340
|
- test/fbe/test_bylaws.rb
|