fbe 0.24.0 → 0.24.2
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 +4 -2
- data/fbe.gemspec +1 -0
- data/lib/fbe/award.rb +2 -1
- data/lib/fbe/iterate.rb +2 -1
- data/lib/fbe/middleware/sqlite_store.rb +9 -2
- data/lib/fbe/octo.rb +3 -1
- data/lib/fbe/unmask_repos.rb +5 -2
- data/lib/fbe.rb +1 -1
- data/test/fbe/middleware/test_sqlite_store.rb +43 -6
- metadata +15 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1896cdb2e02c15259d12df1f1ecddb5049b902ff0b52dd67cb25a9c113606175
|
4
|
+
data.tar.gz: b3fdf07d9b80f1b7cffb9974f09296c8f1f33eb44d88f4faa54918f747fcd0cf
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: bfa0a5da515f2054d9e22c7894ea329f70894a7751dc9879c77ba074fcc07df24d70a0332771381c9698b37b83a896bd88bccd40b49877a97d35a688e858af0b
|
7
|
+
data.tar.gz: f15e90b61d66b43e54bf44ecc767b7943ab5f22167203e1ea36900a1b29476a8208bbcece5f8d1c66eb9d5abf9d49d551d190fdcef7dc01c274ce749282cd218
|
data/Gemfile.lock
CHANGED
@@ -14,6 +14,7 @@ PATH
|
|
14
14
|
filesize (~> 0.2)
|
15
15
|
graphql-client (~> 0.26)
|
16
16
|
intercepted (~> 0.2)
|
17
|
+
joined (~> 0.1)
|
17
18
|
judges (~> 0.46)
|
18
19
|
liquid (~> 5.5)
|
19
20
|
loog (~> 0.6)
|
@@ -46,7 +47,7 @@ GEM
|
|
46
47
|
ast (2.4.3)
|
47
48
|
backtrace (0.4.1)
|
48
49
|
base64 (0.3.0)
|
49
|
-
baza.rb (0.9.
|
50
|
+
baza.rb (0.9.8)
|
50
51
|
backtrace (~> 0.4)
|
51
52
|
elapsed (~> 0.0)
|
52
53
|
faraday (~> 2.13)
|
@@ -86,7 +87,7 @@ GEM
|
|
86
87
|
others (~> 0.0)
|
87
88
|
tago (~> 0.0)
|
88
89
|
yaml (~> 0.3)
|
89
|
-
faraday (2.13.
|
90
|
+
faraday (2.13.2)
|
90
91
|
faraday-net_http (>= 2.0, < 3.5)
|
91
92
|
json
|
92
93
|
logger
|
@@ -118,6 +119,7 @@ GEM
|
|
118
119
|
concurrent-ruby (~> 1.0)
|
119
120
|
intercepted (0.2.0)
|
120
121
|
iri (0.11.2)
|
122
|
+
joined (0.3.0)
|
121
123
|
json (2.12.2)
|
122
124
|
judges (0.51.0)
|
123
125
|
backtrace (~> 0.4)
|
data/fbe.gemspec
CHANGED
@@ -34,6 +34,7 @@ Gem::Specification.new do |s|
|
|
34
34
|
s.add_dependency 'filesize', '~>0.2'
|
35
35
|
s.add_dependency 'graphql-client', '~>0.26'
|
36
36
|
s.add_dependency 'intercepted', '~>0.2'
|
37
|
+
s.add_dependency 'joined', '~>0.1'
|
37
38
|
s.add_dependency 'judges', '~>0.46'
|
38
39
|
s.add_dependency 'liquid', '~>5.5'
|
39
40
|
s.add_dependency 'loog', '~>0.6'
|
data/lib/fbe/award.rb
CHANGED
@@ -4,6 +4,7 @@
|
|
4
4
|
# SPDX-License-Identifier: MIT
|
5
5
|
|
6
6
|
require 'factbase/syntax'
|
7
|
+
require 'joined'
|
7
8
|
require_relative 'fb'
|
8
9
|
|
9
10
|
# A generator of awards.
|
@@ -146,7 +147,7 @@ class Fbe::Award
|
|
146
147
|
any.calc(bill)
|
147
148
|
elsif any.is_a?(Symbol)
|
148
149
|
v = bill.vars[any]
|
149
|
-
raise "Unknown name #{any.inspect} among: #{bill.vars.keys.map(&:inspect).
|
150
|
+
raise "Unknown name #{any.inspect} among: #{bill.vars.keys.map(&:inspect).joined}" if v.nil?
|
150
151
|
v
|
151
152
|
else
|
152
153
|
any
|
data/lib/fbe/iterate.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 'joined'
|
6
7
|
require 'tago'
|
7
8
|
require 'time'
|
8
9
|
require_relative '../fbe'
|
@@ -270,6 +271,6 @@ class Fbe::Iterate
|
|
270
271
|
break
|
271
272
|
end
|
272
273
|
end
|
273
|
-
@loog.debug("Finished scanning #{repos.size} repos in #{start.ago}: #{seen.map { |k, v| "#{k}:#{v}" }.
|
274
|
+
@loog.debug("Finished scanning #{repos.size} repos in #{start.ago}: #{seen.map { |k, v| "#{k}:#{v}" }.joined}")
|
274
275
|
end
|
275
276
|
end
|
@@ -3,6 +3,7 @@
|
|
3
3
|
# SPDX-FileCopyrightText: Copyright (c) 2024-2025 Zerocracy
|
4
4
|
# SPDX-License-Identifier: MIT
|
5
5
|
|
6
|
+
require 'zlib'
|
6
7
|
require 'filesize'
|
7
8
|
require 'json'
|
8
9
|
require 'loog'
|
@@ -73,7 +74,13 @@ class Fbe::Middleware::SqliteStore
|
|
73
74
|
t.execute('UPDATE cache SET touched_at = ?2 WHERE key = ?1;', [key, Time.now.utc.iso8601])
|
74
75
|
t.execute('SELECT value FROM cache WHERE key = ? LIMIT 1;', [key])
|
75
76
|
end.dig(0, 0)
|
76
|
-
|
77
|
+
return unless value
|
78
|
+
begin
|
79
|
+
JSON.parse(Zlib::Inflate.inflate(value))
|
80
|
+
rescue Zlib::Error => e
|
81
|
+
@loog.info("Failed to decompress cached value for key: #{key}, error: #{e.message}, the key will be deleted")
|
82
|
+
delete(key)
|
83
|
+
end
|
77
84
|
end
|
78
85
|
|
79
86
|
# Delete a key from the cache.
|
@@ -95,7 +102,7 @@ class Fbe::Middleware::SqliteStore
|
|
95
102
|
req = JSON.parse(vv[0])
|
96
103
|
req['method'] != 'get'
|
97
104
|
end
|
98
|
-
value = JSON.dump(value)
|
105
|
+
value = Zlib::Deflate.deflate(JSON.dump(value))
|
99
106
|
return if value.bytesize > @maxvsize
|
100
107
|
perform do |t|
|
101
108
|
t.execute(<<~SQL, [key, value, Time.now.utc.iso8601])
|
data/lib/fbe/octo.rb
CHANGED
@@ -708,6 +708,7 @@ class Fbe::FakeOctokit
|
|
708
708
|
repo: {
|
709
709
|
full_name: repo
|
710
710
|
},
|
711
|
+
state: 'closed',
|
711
712
|
user: { login: 'yegor256', id: 526_301, type: 'User' },
|
712
713
|
head: { ref: 'master', sha: '6dcb09b5b57875f334f61aebed695e2e4193db5e' },
|
713
714
|
additions: 12,
|
@@ -715,7 +716,8 @@ class Fbe::FakeOctokit
|
|
715
716
|
changed_files: 3,
|
716
717
|
comments: 2,
|
717
718
|
review_comments: 2,
|
718
|
-
|
719
|
+
merged_at: Time.parse('2024-12-20'),
|
720
|
+
created_at: Time.parse('2024-09-20')
|
719
721
|
}
|
720
722
|
end
|
721
723
|
|
data/lib/fbe/unmask_repos.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 'joined'
|
6
7
|
require_relative '../fbe'
|
7
8
|
require_relative 'octo'
|
8
9
|
|
@@ -53,6 +54,8 @@ end
|
|
53
54
|
# @note Exclusion patterns must start with '-' (e.g., '-org/pattern*')
|
54
55
|
# @note Results are shuffled to distribute load when processing
|
55
56
|
def Fbe.unmask_repos(options: $options, global: $global, loog: $loog)
|
57
|
+
raise 'Repositories mask is not specified' unless options.repositories
|
58
|
+
raise 'Repositories mask is empty' if options.repositories.empty?
|
56
59
|
repos = []
|
57
60
|
octo = Fbe.octo(loog:, global:, options:)
|
58
61
|
masks = (options.repositories || '').split(',')
|
@@ -71,8 +74,8 @@ def Fbe.unmask_repos(options: $options, global: $global, loog: $loog)
|
|
71
74
|
repos.reject! { |r| re.match?(r) }
|
72
75
|
end
|
73
76
|
repos.reject! { |repo| octo.repository(repo)[:archived] }
|
74
|
-
raise "No repos found matching: #{options.repositories}" if repos.empty?
|
77
|
+
raise "No repos found matching: #{options.repositories.inspect}" if repos.empty?
|
75
78
|
repos.shuffle!
|
76
|
-
loog.debug("Scanning #{repos.size} repositories: #{repos.
|
79
|
+
loog.debug("Scanning #{repos.size} repositories: #{repos.joined}...")
|
77
80
|
repos
|
78
81
|
end
|
data/lib/fbe.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 'securerandom'
|
6
7
|
require 'qbash'
|
7
8
|
require_relative '../../test__helper'
|
8
9
|
require_relative '../../../lib/fbe/middleware'
|
@@ -141,8 +142,8 @@ class SqliteStoreTest < Fbe::Test
|
|
141
142
|
Fbe::Middleware::SqliteStore.new(f, '0.0.1', loog: fake_loog).then do |store|
|
142
143
|
store.write('a', 'a' * 9_997)
|
143
144
|
store.write('b', 'b' * 9_998)
|
144
|
-
store.write('c',
|
145
|
-
store.write('d',
|
145
|
+
store.write('c', SecureRandom.alphanumeric((19_999 * 1.4).to_i))
|
146
|
+
store.write('d', SecureRandom.alphanumeric((30_000 * 1.4).to_i))
|
146
147
|
assert_equal('a' * 9_997, store.read('a'))
|
147
148
|
assert_equal('b' * 9_998, store.read('b'))
|
148
149
|
assert_nil(store.read('c'))
|
@@ -155,7 +156,6 @@ class SqliteStoreTest < Fbe::Test
|
|
155
156
|
with_tmpfile('large.db') do |f|
|
156
157
|
Fbe::Middleware::SqliteStore.new(f, '0.0.1', loog: fake_loog).then do |store|
|
157
158
|
key = 'aaa'
|
158
|
-
alpha = ('a'..'z').to_a
|
159
159
|
store.write('a', 'aa')
|
160
160
|
Time.stub(:now, (Time.now - (5 * 60 * 60)).round) do
|
161
161
|
store.write('b', 'bb')
|
@@ -163,8 +163,8 @@ class SqliteStoreTest < Fbe::Test
|
|
163
163
|
end
|
164
164
|
assert_equal('cc', store.read('c'))
|
165
165
|
Time.stub(:now, rand((Time.now - (5 * 60 * 60))..Time.now).round) do
|
166
|
+
value = SecureRandom.alphanumeric(2048)
|
166
167
|
10_240.times do
|
167
|
-
value = alpha.sample * rand(1024..2048)
|
168
168
|
store.write(key, value)
|
169
169
|
key = key.next
|
170
170
|
end
|
@@ -185,8 +185,8 @@ class SqliteStoreTest < Fbe::Test
|
|
185
185
|
SQLite3::Database.new(f).tap do |d|
|
186
186
|
d.execute 'CREATE TABLE IF NOT EXISTS cache(key TEXT UNIQUE NOT NULL, value TEXT);'
|
187
187
|
[
|
188
|
-
['key1', JSON.dump('value1')],
|
189
|
-
['key2', JSON.dump('value2')]
|
188
|
+
['key1', Zlib::Deflate.deflate(JSON.dump('value1'))],
|
189
|
+
['key2', Zlib::Deflate.deflate(JSON.dump('value2'))]
|
190
190
|
].each { d.execute 'INSERT INTO cache(key, value) VALUES(?1, ?2);', _1 }
|
191
191
|
d.execute 'CREATE TABLE IF NOT EXISTS meta(key TEXT UNIQUE NOT NULL, value TEXT);'
|
192
192
|
d.execute "INSERT INTO meta(key, value) VALUES('version', ?);", ['0.0.1']
|
@@ -200,6 +200,43 @@ class SqliteStoreTest < Fbe::Test
|
|
200
200
|
end
|
201
201
|
end
|
202
202
|
|
203
|
+
def test_use_compress_for_stored_data
|
204
|
+
with_tmpfile('c.db') do |f|
|
205
|
+
Fbe::Middleware::SqliteStore.new(f, '0.0.1', loog: fake_loog).then do |store|
|
206
|
+
a = SecureRandom.alphanumeric(200)
|
207
|
+
store.write('a', a)
|
208
|
+
store.write('b', 'b' * 100_000)
|
209
|
+
assert_equal(a, store.read('a'))
|
210
|
+
assert_equal('b' * 100_000, store.read('b'))
|
211
|
+
store.all.each do |k, v|
|
212
|
+
case k
|
213
|
+
when 'a'
|
214
|
+
assert_operator(v.size, :<, a.size)
|
215
|
+
when 'b'
|
216
|
+
assert_operator(v.size, :<, 100_000)
|
217
|
+
end
|
218
|
+
end
|
219
|
+
end
|
220
|
+
end
|
221
|
+
end
|
222
|
+
|
223
|
+
def test_corrupted_compression_stored_data
|
224
|
+
with_tmpfile('c.db') do |f|
|
225
|
+
SQLite3::Database.new(f).tap do |d|
|
226
|
+
d.execute 'CREATE TABLE IF NOT EXISTS cache(key TEXT UNIQUE NOT NULL, value TEXT);'
|
227
|
+
[
|
228
|
+
['my_key', JSON.dump('value1')]
|
229
|
+
].each { d.execute 'INSERT INTO cache(key, value) VALUES(?1, ?2);', _1 }
|
230
|
+
d.execute 'CREATE TABLE IF NOT EXISTS meta(key TEXT UNIQUE NOT NULL, value TEXT);'
|
231
|
+
d.execute "INSERT INTO meta(key, value) VALUES('version', ?);", ['0.0.1']
|
232
|
+
end
|
233
|
+
Fbe::Middleware::SqliteStore.new(f, '0.0.1', loog: fake_loog).then do |store|
|
234
|
+
assert_nil(store.read('my_key'))
|
235
|
+
assert_predicate(store.all.count, :zero?)
|
236
|
+
end
|
237
|
+
end
|
238
|
+
end
|
239
|
+
|
203
240
|
private
|
204
241
|
|
205
242
|
def with_tmpfile(name = 'test.db', &)
|
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.24.
|
4
|
+
version: 0.24.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Yegor Bugayenko
|
@@ -177,6 +177,20 @@ dependencies:
|
|
177
177
|
- - "~>"
|
178
178
|
- !ruby/object:Gem::Version
|
179
179
|
version: '0.2'
|
180
|
+
- !ruby/object:Gem::Dependency
|
181
|
+
name: joined
|
182
|
+
requirement: !ruby/object:Gem::Requirement
|
183
|
+
requirements:
|
184
|
+
- - "~>"
|
185
|
+
- !ruby/object:Gem::Version
|
186
|
+
version: '0.1'
|
187
|
+
type: :runtime
|
188
|
+
prerelease: false
|
189
|
+
version_requirements: !ruby/object:Gem::Requirement
|
190
|
+
requirements:
|
191
|
+
- - "~>"
|
192
|
+
- !ruby/object:Gem::Version
|
193
|
+
version: '0.1'
|
180
194
|
- !ruby/object:Gem::Dependency
|
181
195
|
name: judges
|
182
196
|
requirement: !ruby/object:Gem::Requirement
|