fbe 0.22.0 → 0.23.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e5a39208fa372c54abc221588d0a96f234cfd7ba3c56a65fa1c9d71a5eb119e9
4
- data.tar.gz: 97ef98fd304ce75ec5558a8915d3a8f95482cf0d203d3ede0882021b7bc036ea
3
+ metadata.gz: 7faea911e89cea0abccc6d5f664a1ef5dd1ab8b6853ee0b2b6b97077c604f64d
4
+ data.tar.gz: 88ddb605cd24f68b965aa8ff2200c75c6759d175d130fded4f66ebb02540b00d
5
5
  SHA512:
6
- metadata.gz: e17fbbbc95d55c4e0a9ec6611ba5ab1fcee8e42fb9e126a3d46bdb3e20bbad7d0c140d58f519275f71ce11d4a2d6399a211868638e208324b42dc5e577a988e1
7
- data.tar.gz: d1fac9af3a2e773f23ad7a9392499feb01af4b7786654cf2fdb7140744e2fec4386d5ce45b49ea37432a9f31b9d9ca97fcec3b7c8be5b638b833ce6215b898f0
6
+ metadata.gz: 283110a6a7bd12876e0f383f9d243309b0ff0e9495f0987e1e2dc3a84ce5e76e2aa44e86bafe6bcc992f1ec7eae8f36da7206d8f3b18b57320f9339fb7c781d1
7
+ data.tar.gz: fd3ce178823ca8e9b830b32143b80babda13d0e5f28549728ecd8d8e7635febc177b8691bd189ef9549d01a2ecf036fc9306697ff31856827ec018268338eb60
data/Gemfile.lock CHANGED
@@ -10,6 +10,7 @@ PATH
10
10
  faraday-http-cache (~> 2.5)
11
11
  faraday-multipart (~> 1.1)
12
12
  faraday-retry (~> 2.3)
13
+ filesize (~> 0.2)
13
14
  graphql-client (~> 0.26)
14
15
  judges (~> 0.46)
15
16
  liquid (~> 5.5)
@@ -63,17 +64,19 @@ GEM
63
64
  crack (1.0.0)
64
65
  bigdecimal
65
66
  rexml
66
- decoor (0.0.1)
67
+ decoor (0.1.0)
67
68
  docile (1.4.1)
68
69
  drb (2.2.3)
69
70
  elapsed (0.0.1)
70
71
  loog (> 0)
71
72
  tago (> 0)
73
+ ellipsized (0.3.0)
72
74
  ethon (0.16.0)
73
75
  ffi (>= 1.15.0)
74
- factbase (0.11.0)
76
+ factbase (0.11.1)
75
77
  backtrace (~> 0.4)
76
78
  decoor (~> 0.0)
79
+ ellipsized (~> 0.3)
77
80
  json (~> 2.7)
78
81
  logger (~> 1.0)
79
82
  loog (~> 0.6)
@@ -98,6 +101,7 @@ GEM
98
101
  ffi (1.17.2-x86_64-darwin)
99
102
  ffi (1.17.2-x86_64-linux-gnu)
100
103
  fiber-storage (1.0.1)
104
+ filesize (0.2.0)
101
105
  gli (2.22.2)
102
106
  ostruct
103
107
  graphql (2.5.9)
@@ -112,7 +116,7 @@ GEM
112
116
  concurrent-ruby (~> 1.0)
113
117
  iri (0.11.2)
114
118
  json (2.12.2)
115
- judges (0.50.3)
119
+ judges (0.50.5)
116
120
  backtrace (~> 0.4)
117
121
  baza.rb (~> 0.5)
118
122
  concurrent-ruby (~> 1.2)
data/fbe.gemspec CHANGED
@@ -30,6 +30,7 @@ Gem::Specification.new do |s|
30
30
  s.add_dependency 'faraday-http-cache', '~>2.5'
31
31
  s.add_dependency 'faraday-multipart', '~>1.1'
32
32
  s.add_dependency 'faraday-retry', '~>2.3'
33
+ s.add_dependency 'filesize', '~>0.2'
33
34
  s.add_dependency 'graphql-client', '~>0.26'
34
35
  s.add_dependency 'judges', '~>0.46'
35
36
  s.add_dependency 'liquid', '~>5.5'
@@ -3,10 +3,11 @@
3
3
  # SPDX-FileCopyrightText: Copyright (c) 2024-2025 Zerocracy
4
4
  # SPDX-License-Identifier: MIT
5
5
 
6
- require 'time'
6
+ require 'filesize'
7
7
  require 'json'
8
- require 'sqlite3'
9
8
  require 'loog'
9
+ require 'sqlite3'
10
+ require 'time'
10
11
  require_relative '../../fbe'
11
12
  require_relative '../../fbe/middleware'
12
13
 
@@ -28,7 +29,7 @@ require_relative '../../fbe/middleware'
28
29
  # '/path/to/cache.db',
29
30
  # '1.0.0',
30
31
  # loog: logger,
31
- # maxsize: 50 * 1024 * 1024 # 50MB max size
32
+ # maxsize: '50Mb'
32
33
  # )
33
34
  #
34
35
  # # Use with Faraday
@@ -53,7 +54,7 @@ class Fbe::Middleware::SqliteStore
53
54
  # @param maxsize [Integer] Maximum database size in bytes (optional, defaults to 10MB)
54
55
  # @param maxvsize [Integer] Maximum size in bytes of a single value (optional, defaults to 10Kb)
55
56
  # @raise [ArgumentError] If path is nil/empty, directory doesn't exist, or version is nil/empty
56
- def initialize(path, version, loog: Loog::NULL, maxsize: 10 * 1024 * 1024, maxvsize: 10 * 1024)
57
+ def initialize(path, version, loog: Loog::NULL, maxsize: '10Mb', maxvsize: '10Kb')
57
58
  raise ArgumentError, 'Database path cannot be nil or empty' if path.nil? || path.empty?
58
59
  dir = File.dirname(path)
59
60
  raise ArgumentError, "Directory #{dir} does not exist" unless File.directory?(dir)
@@ -61,8 +62,8 @@ class Fbe::Middleware::SqliteStore
61
62
  @path = File.absolute_path(path)
62
63
  @version = version
63
64
  @loog = loog
64
- @maxsize = maxsize
65
- @maxvsize = maxvsize
65
+ @maxsize = Filesize.from(maxsize.to_s).to_i
66
+ @maxvsize = Filesize.from(maxvsize.to_s).to_i
66
67
  end
67
68
 
68
69
  # Read a value from the cache.
@@ -161,8 +162,8 @@ class Fbe::Middleware::SqliteStore
161
162
  end
162
163
  if File.size(@path) > @maxsize
163
164
  @loog.info(
164
- "SQLite cache file size (#{File.size(@path)} bytes) exceeds " \
165
- "#{@maxsize / 1024 / 1024}MB, cleaning up old entries"
165
+ "SQLite cache file size (#{Filesize.from(File.size(@path).to_s).pretty} bytes) exceeds " \
166
+ "#{Filesize.from(@maxsize.to_s).pretty}, cleaning up old entries"
166
167
  )
167
168
  deleted = 0
168
169
  while d.execute(<<~SQL).dig(0, 0) > @maxsize
@@ -178,7 +179,10 @@ class Fbe::Middleware::SqliteStore
178
179
  end
179
180
  end
180
181
  d.execute 'VACUUM;'
181
- @loog.info("Deleted #{deleted} old cache entries, new file size: #{File.size(@path)} bytes")
182
+ @loog.info(
183
+ "Deleted #{deleted} old cache entries, " \
184
+ "new file size: #{Filesize.from(File.size(@path).to_s).pretty} bytes"
185
+ )
182
186
  end
183
187
  at_exit { @db&.close }
184
188
  end
data/lib/fbe/octo.rb CHANGED
@@ -7,6 +7,7 @@ require 'json'
7
7
  require 'decoor'
8
8
  require 'faraday/http_cache'
9
9
  require 'faraday/retry'
10
+ require 'filesize'
10
11
  require 'loog'
11
12
  require 'obk'
12
13
  require 'octokit'
@@ -82,13 +83,13 @@ def Fbe.octo(options: $options, global: $global, loog: $loog)
82
83
  backoff_factor: 2
83
84
  )
84
85
  if options.sqlite_cache
85
- maxsize = options.sqlite_cache_maxsize || (10 * 1024 * 1024)
86
- maxvsize = options.sqlite_cache_maxxsize || (10 * 1024)
86
+ maxsize = Filesize.from(options.sqlite_cache_maxsize || '10M').to_i
87
+ maxvsize = Filesize.from(options.sqlite_cache_maxxsize || '10K').to_i
87
88
  store = Fbe::Middleware::SqliteStore.new(options.sqlite_cache, Fbe::VERSION, loog:, maxsize:, maxvsize:)
88
89
  loog.info(
89
90
  "Using HTTP cache in SQLite file: #{store.path} (" \
90
- "#{File.exist?(store.path) ? "#{File.size(store.path)} bytes" : 'file is absent'}, " \
91
- "max size: #{maxsize / 1024 / 1024}MB)"
91
+ "#{File.exist?(store.path) ? Filesize.from(File.size(store.path).to_s).pretty : 'file is absent'}, " \
92
+ "max size: #{Filesize.from(maxsize.to_s).pretty}, max vsize: #{Filesize.from(maxvsize.to_s).pretty})"
92
93
  )
93
94
  builder.use(
94
95
  Faraday::HttpCache,
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.22.0' unless const_defined?(:VERSION)
13
+ VERSION = '0.23.0' unless const_defined?(:VERSION)
14
14
  end
@@ -33,14 +33,14 @@ class SqliteStoreTest < Fbe::Test
33
33
 
34
34
  def test_returns_empty_list
35
35
  with_tmpfile('b.db') do |f|
36
- store = Fbe::Middleware::SqliteStore.new(f, '0.0.0')
36
+ store = Fbe::Middleware::SqliteStore.new(f, '0.0.0', loog: fake_loog)
37
37
  assert_empty(store.all)
38
38
  end
39
39
  end
40
40
 
41
41
  def test_clear_all_keys
42
42
  with_tmpfile('a.db') do |f|
43
- store = Fbe::Middleware::SqliteStore.new(f, '0.0.0')
43
+ store = Fbe::Middleware::SqliteStore.new(f, '0.0.0', loog: fake_loog)
44
44
  k = 'a key'
45
45
  store.write(k, 'some value')
46
46
  store.clear
@@ -50,20 +50,20 @@ class SqliteStoreTest < Fbe::Test
50
50
 
51
51
  def test_empty_all_if_not_written
52
52
  with_tmpfile do |f|
53
- store = Fbe::Middleware::SqliteStore.new(f, '0.0.0')
53
+ store = Fbe::Middleware::SqliteStore.new(f, '0.0.0', loog: fake_loog)
54
54
  assert_empty(store.all)
55
55
  end
56
56
  end
57
57
 
58
58
  def test_wrong_db_path
59
59
  assert_raises(ArgumentError) do
60
- Fbe::Middleware::SqliteStore.new(nil, '0.0.0').read('my_key')
60
+ Fbe::Middleware::SqliteStore.new(nil, '0.0.0', loog: fake_loog).read('my_key')
61
61
  end
62
62
  assert_raises(ArgumentError) do
63
- Fbe::Middleware::SqliteStore.new('', '0.0.0').read('my_key')
63
+ Fbe::Middleware::SqliteStore.new('', '0.0.0', loog: fake_loog).read('my_key')
64
64
  end
65
65
  assert_raises(ArgumentError) do
66
- Fbe::Middleware::SqliteStore.new('/fakepath/fakefolder/test.db', '0.0.0').read('my_key')
66
+ Fbe::Middleware::SqliteStore.new('/fakepath/fakefolder/test.db', '0.0.0', loog: fake_loog).read('my_key')
67
67
  end
68
68
  end
69
69
 
@@ -72,7 +72,7 @@ class SqliteStoreTest < Fbe::Test
72
72
  File.binwrite(f, Array.new(20) { rand(0..255) }.pack('C*'))
73
73
  ex =
74
74
  assert_raises(SQLite3::NotADatabaseException) do
75
- Fbe::Middleware::SqliteStore.new(f, '0.0.0').read('my_key')
75
+ Fbe::Middleware::SqliteStore.new(f, '0.0.0', loog: fake_loog).read('my_key')
76
76
  end
77
77
  assert_match('file is not a database', ex.message)
78
78
  end
@@ -83,7 +83,6 @@ class SqliteStoreTest < Fbe::Test
83
83
  require 'tempfile'
84
84
  require 'sqlite3'
85
85
  require 'fbe/middleware/sqlite_store'
86
-
87
86
  SQLite3::Database.class_eval do
88
87
  prepend(Module.new do
89
88
  def close
@@ -92,7 +91,6 @@ class SqliteStoreTest < Fbe::Test
92
91
  end
93
92
  end)
94
93
  end
95
-
96
94
  Tempfile.open('test.db') do |f|
97
95
  Fbe::Middleware::SqliteStore.new(f.path, '0.0.0').then do |s|
98
96
  s.write('my_key', 'my_value')
@@ -111,15 +109,15 @@ class SqliteStoreTest < Fbe::Test
111
109
 
112
110
  def test_different_versions
113
111
  with_tmpfile('d.db') do |f|
114
- Fbe::Middleware::SqliteStore.new(f, '0.0.1').then do |store|
112
+ Fbe::Middleware::SqliteStore.new(f, '0.0.1', loog: fake_loog).then do |store|
115
113
  store.write('kkk1', 'some value')
116
114
  store.write('kkk2', 'another value')
117
115
  end
118
- Fbe::Middleware::SqliteStore.new(f, '0.0.1').then do |store|
116
+ Fbe::Middleware::SqliteStore.new(f, '0.0.1', loog: fake_loog).then do |store|
119
117
  assert_equal('some value', store.read('kkk1'))
120
118
  assert_equal('another value', store.read('kkk2'))
121
119
  end
122
- Fbe::Middleware::SqliteStore.new(f, '0.0.2').then do |store|
120
+ Fbe::Middleware::SqliteStore.new(f, '0.0.2', loog: fake_loog).then do |store|
123
121
  assert_nil(store.read('kkk1'))
124
122
  assert_nil(store.read('kkk2'))
125
123
  end
@@ -129,10 +127,10 @@ class SqliteStoreTest < Fbe::Test
129
127
  def test_initialize_wrong_version
130
128
  with_tmpfile('e.db') do |f|
131
129
  msg = 'Version cannot be nil or empty'
132
- assert_raises(ArgumentError) { Fbe::Middleware::SqliteStore.new(f, nil) }.then do |ex|
130
+ assert_raises(ArgumentError) { Fbe::Middleware::SqliteStore.new(f, nil, loog: fake_loog) }.then do |ex|
133
131
  assert_match(msg, ex.message)
134
132
  end
135
- assert_raises(ArgumentError) { Fbe::Middleware::SqliteStore.new(f, '') }.then do |ex|
133
+ assert_raises(ArgumentError) { Fbe::Middleware::SqliteStore.new(f, '', loog: fake_loog) }.then do |ex|
136
134
  assert_match(msg, ex.message)
137
135
  end
138
136
  end
@@ -140,7 +138,7 @@ class SqliteStoreTest < Fbe::Test
140
138
 
141
139
  def test_skip_write_if_value_more_then_10k_bytes
142
140
  with_tmpfile('a.db') do |f|
143
- Fbe::Middleware::SqliteStore.new(f, '0.0.1').then do |store|
141
+ Fbe::Middleware::SqliteStore.new(f, '0.0.1', loog: fake_loog).then do |store|
144
142
  store.write('a', 'a' * 9_997)
145
143
  store.write('b', 'b' * 9_998)
146
144
  store.write('c', 'c' * 19_999)
@@ -155,7 +153,7 @@ class SqliteStoreTest < Fbe::Test
155
153
 
156
154
  def test_shrink_cache_if_more_then_10_mb
157
155
  with_tmpfile('large.db') do |f|
158
- Fbe::Middleware::SqliteStore.new(f, '0.0.1').then do |store|
156
+ Fbe::Middleware::SqliteStore.new(f, '0.0.1', loog: fake_loog).then do |store|
159
157
  key = 'aaa'
160
158
  alpha = ('a'..'z').to_a
161
159
  store.write('a', 'aa')
@@ -173,7 +171,7 @@ class SqliteStoreTest < Fbe::Test
173
171
  end
174
172
  end
175
173
  assert_operator(File.size(f), :>, 10 * 1024 * 1024)
176
- Fbe::Middleware::SqliteStore.new(f, '0.0.1').then do |store|
174
+ Fbe::Middleware::SqliteStore.new(f, '0.0.1', loog: fake_loog).then do |store|
177
175
  assert_equal('aa', store.read('a'))
178
176
  assert_nil(store.read('b'))
179
177
  assert_equal('cc', store.read('c'))
@@ -193,7 +191,7 @@ class SqliteStoreTest < Fbe::Test
193
191
  d.execute 'CREATE TABLE IF NOT EXISTS meta(key TEXT UNIQUE NOT NULL, value TEXT);'
194
192
  d.execute "INSERT INTO meta(key, value) VALUES('version', ?);", ['0.0.1']
195
193
  end
196
- Fbe::Middleware::SqliteStore.new(f, '0.0.1').then do |store|
194
+ Fbe::Middleware::SqliteStore.new(f, '0.0.1', loog: fake_loog).then do |store|
197
195
  assert_equal('value1', store.read('key1'))
198
196
  assert_equal('value2', store.read('key2'))
199
197
  rescue SQLite3::SQLException => e
data/test/test__helper.rb CHANGED
@@ -31,6 +31,7 @@ end
31
31
  require 'minitest/reporters'
32
32
  Minitest::Reporters.use! [Minitest::Reporters::SpecReporter.new]
33
33
 
34
+ require 'loog'
34
35
  require 'minitest/stub_const'
35
36
  require 'minitest/autorun'
36
37
  require 'webmock/minitest'
@@ -38,4 +39,7 @@ require_relative '../lib/fbe'
38
39
 
39
40
  # Parent class for all tests.
40
41
  class Fbe::Test < Minitest::Test
42
+ def fake_loog
43
+ Loog::VERBOSE
44
+ end
41
45
  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.22.0
4
+ version: 0.23.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Yegor Bugayenko
@@ -121,6 +121,20 @@ dependencies:
121
121
  - - "~>"
122
122
  - !ruby/object:Gem::Version
123
123
  version: '2.3'
124
+ - !ruby/object:Gem::Dependency
125
+ name: filesize
126
+ requirement: !ruby/object:Gem::Requirement
127
+ requirements:
128
+ - - "~>"
129
+ - !ruby/object:Gem::Version
130
+ version: '0.2'
131
+ type: :runtime
132
+ prerelease: false
133
+ version_requirements: !ruby/object:Gem::Requirement
134
+ requirements:
135
+ - - "~>"
136
+ - !ruby/object:Gem::Version
137
+ version: '0.2'
124
138
  - !ruby/object:Gem::Dependency
125
139
  name: graphql-client
126
140
  requirement: !ruby/object:Gem::Requirement