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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 91db19b000a04e9305e13bac13ab0084db8c31950978554f59dbf2a8cd25a795
4
- data.tar.gz: 80c536ab908b35b2d5acf3634560a14c3a352c8229a7a73f20690086d01261c5
3
+ metadata.gz: 1896cdb2e02c15259d12df1f1ecddb5049b902ff0b52dd67cb25a9c113606175
4
+ data.tar.gz: b3fdf07d9b80f1b7cffb9974f09296c8f1f33eb44d88f4faa54918f747fcd0cf
5
5
  SHA512:
6
- metadata.gz: f0722eae0723bd98a0b34a0b5ba0674776450961420a5be71fbf65d6aa7f786df453c0c48789bdef2e70c967bda7c4a90d0f707e121ebbb5fb78937ad3272ecd
7
- data.tar.gz: e991dad19e45b1cf67c514ca83e3bfcf3814e5477ce0c4cc0b6b4680f3286f239f96b337b07c5bd9b1e8148ea8f6930820743976df94463544bcecb17458345b
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.7)
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.1)
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).join(', ')}" if v.nil?
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}" }.join(', ')}")
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
- JSON.parse(value) if value
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
- created_at: Time.parse('2024-09-20 19:00:00 UTC')
719
+ merged_at: Time.parse('2024-12-20'),
720
+ created_at: Time.parse('2024-09-20')
719
721
  }
720
722
  end
721
723
 
@@ -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.join(', ')}...")
79
+ loog.debug("Scanning #{repos.size} repositories: #{repos.joined}...")
77
80
  repos
78
81
  end
data/lib/fbe.rb CHANGED
@@ -10,5 +10,5 @@
10
10
  # License:: MIT
11
11
  module Fbe
12
12
  # Current version of the gem (changed by +.rultor.yml+ on every release)
13
- VERSION = '0.24.0' unless const_defined?(:VERSION)
13
+ VERSION = '0.24.2' unless const_defined?(:VERSION)
14
14
  end
@@ -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', 'c' * 19_999)
145
- store.write('d', 'd' * 30_000)
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.0
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