fbe 0.27.1 → 0.28.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: afde9eac2bd529e705f3a265ff617fd51515d4982a1bb5e9389ce4c3815c29c5
4
- data.tar.gz: 8f2aa201a43bdea55ed24aae4c123cb9fe2d5cfdcdbbf5eaade2fc202e21af2c
3
+ metadata.gz: 22c7a8e786ff71b8449f19751665bc82f32ba777248218bcac806b76b8be3fa2
4
+ data.tar.gz: 361d1413b6649089e1ba3e8b499d60540b25261da616b94ac56687fe1af1b7fe
5
5
  SHA512:
6
- metadata.gz: 153df9f33b90603c461ff98123fc619d64d7473fc1ccba2e1a89525854f9773716827acff581ff58a3f80b0046870322e7dab2a571705dc438494948b7da251e
7
- data.tar.gz: 7e50260832bb788bd74e4c06d79b24df5cc5666f3307dc9159ece12bb864e5a0c87ca0a1ebed7b23f939465f4d61e5398605156f22e346e3d6184a8fb21d5ca3
6
+ metadata.gz: 04b8c247dda95f931519f496cab03d02c8d912eafc0d2114e1dd21d507a9b81ed156d26accd2f5be50394cc3dec1fe4c86d4c0415f4f0a8a5c4d1eccef3510b8
7
+ data.tar.gz: 75f0f3ca32b28aee6d1206975bb066b7da7c022f9bee785c723d2a88585cce70ec6e7c5da201418676c0b56bda9db385f8af2ddd0557d157137e5dc3241c3563
data/Gemfile.lock CHANGED
@@ -188,7 +188,7 @@ GEM
188
188
  rake (13.3.0)
189
189
  regexp_parser (2.11.2)
190
190
  retries (0.0.5)
191
- rexml (3.4.1)
191
+ rexml (3.4.2)
192
192
  rubocop (1.80.0)
193
193
  json (~> 2.3)
194
194
  language_server-protocol (~> 3.17.0.2)
@@ -223,7 +223,7 @@ GEM
223
223
  docile (~> 1.1)
224
224
  simplecov-html (~> 0.11)
225
225
  simplecov_json_formatter (~> 0.1)
226
- simplecov-cobertura (3.0.0)
226
+ simplecov-cobertura (3.1.0)
227
227
  rexml
228
228
  simplecov (~> 0.19)
229
229
  simplecov-html (0.13.2)
data/lib/fbe/if_absent.rb CHANGED
@@ -30,6 +30,7 @@ require_relative 'fb'
30
30
  # time of its first creation.
31
31
  #
32
32
  # @param [Factbase] fb The factbase to check and insert into (defaults to Fbe.fb)
33
+ # @param [Boolean] always If true, return the object in any case
33
34
  # @yield [Factbase::Fact] A proxy fact object to set properties on
34
35
  # @return [nil, Factbase::Fact] nil if fact exists, otherwise the newly created fact
35
36
  # @note String values are properly escaped in queries
@@ -45,7 +46,7 @@ require_relative 'fb'
45
46
  # else
46
47
  # puts "User already exists"
47
48
  # end
48
- def Fbe.if_absent(fb: Fbe.fb)
49
+ def Fbe.if_absent(fb: Fbe.fb, always: false)
49
50
  attrs = {}
50
51
  f =
51
52
  others(map: attrs) do |*args|
@@ -71,7 +72,8 @@ def Fbe.if_absent(fb: Fbe.fb)
71
72
  "(eq #{k} #{vv})"
72
73
  end.join(' ')
73
74
  q = "(and #{q})"
74
- before = fb.query(q).each.to_a.first
75
+ before = fb.query(q).each.first
76
+ return before if before && always
75
77
  return nil if before
76
78
  n = fb.insert
77
79
  attrs.each { |k, v| n.send(:"#{k}=", v) }
data/lib/fbe/overwrite.rb CHANGED
@@ -17,7 +17,7 @@ require_relative 'fb'
17
17
  #
18
18
  # @param [Factbase::Fact] fact The fact to modify (must have _id property)
19
19
  # @param [String] property The name of the property to set
20
- # @param [Any] value The value to set (can be any type)
20
+ # @param [Any] value The value to set (can be any type, including array)
21
21
  # @param [Factbase] fb The factbase to use (defaults to Fbe.fb)
22
22
  # @return [nil] Nothing
23
23
  # @raise [RuntimeError] If fact is nil, has no _id, or property is not a String
@@ -27,7 +27,7 @@ require_relative 'fb'
27
27
  # user = fb.query('(eq login "john")').first
28
28
  # updated_user = Fbe.overwrite(user, 'status', 'active')
29
29
  # # All properties preserved, only 'status' is set to 'active'
30
- def Fbe.overwrite(fact, property, value, fb: Fbe.fb)
30
+ def Fbe.overwrite(fact, property, value, fb: Fbe.fb, fid: '_id')
31
31
  raise 'The fact is nil' if fact.nil?
32
32
  raise 'The fb is nil' if fb.nil?
33
33
  raise "The property is not a String but #{property.class} (#{property})" unless property.is_a?(String)
@@ -36,12 +36,12 @@ def Fbe.overwrite(fact, property, value, fb: Fbe.fb)
36
36
  fact.all_properties.each do |prop|
37
37
  before[prop.to_s] = fact[prop]
38
38
  end
39
- id = fact['_id']&.first
40
- raise 'There is no _id in the fact, cannot use Fbe.overwrite' if id.nil?
41
- raise "No facts by _id = #{id}" if fb.query("(eq _id #{id})").delete!.zero?
39
+ id = fact[fid]&.first
40
+ raise "There is no #{fid} in the fact, cannot use Fbe.overwrite" if id.nil?
41
+ raise "No facts by #{fid} = #{id}" if fb.query("(eq #{fid} #{id})").delete!.zero?
42
42
  fb.txn do |fbt|
43
43
  n = fbt.insert
44
- before[property.to_s] = [value]
44
+ before[property.to_s] = value.is_a?(Array) ? value : [value]
45
45
  before.each do |k, vv|
46
46
  next unless n[k].nil?
47
47
  vv.each do |v|
@@ -0,0 +1,67 @@
1
+ # frozen_string_literal: true
2
+
3
+ # SPDX-FileCopyrightText: Copyright (c) 2024-2025 Zerocracy
4
+ # SPDX-License-Identifier: MIT
5
+
6
+ require_relative '../fbe'
7
+ require_relative 'fb'
8
+ require_relative 'if_absent'
9
+ require_relative 'overwrite'
10
+
11
+ # Checks whether an issue is already under a tombstone.
12
+ #
13
+ # Author:: Yegor Bugayenko (yegor256@gmail.com)
14
+ # Copyright:: Copyright (c) 2024-2025 Zerocracy
15
+ # License:: MIT
16
+ class Fbe::Tombstone
17
+ # Ctor.
18
+ # @param [Factbase] fb The factbase to use (defaults to Fbe.fb)
19
+ def initialize(fb: Fbe.fb, fid: '_id')
20
+ @fb = fb
21
+ @fid = fid
22
+ end
23
+
24
+ # Put it there.
25
+ # @param [Integer] repo ID of repository
26
+ # @param [Integer] issue ID of issue
27
+ def bury!(repo, issue)
28
+ f =
29
+ Fbe.if_absent(fb: @fb, always: true) do |n|
30
+ n.what = 'tombstone'
31
+ n.repository = repo
32
+ end
33
+ f.send(:"#{@fid}=", SecureRandom.random_number(99_999)) if f[@fid].nil?
34
+ nn = f['issues']&.map { |ii| ii.split('-').map(&:to_i) } || []
35
+ nn << [issue, issue]
36
+ nn = nn.sort_by(&:first)
37
+ merged = []
38
+ nn.each do |a, b|
39
+ if merged.empty?
40
+ merged << [a, b]
41
+ else
42
+ last = merged[-1]
43
+ if last[1] == a - 1
44
+ last[1] = b
45
+ else
46
+ merged << [a, b]
47
+ end
48
+ end
49
+ end
50
+ Fbe.overwrite(f, 'issues', merged.map { |ii| "#{ii[0]}-#{ii[1]}" }, fb: @fb, fid: @fid)
51
+ end
52
+
53
+ # Is it there?
54
+ # @param [Integer] repo ID of repository
55
+ # @param [Integer] issue ID of issue
56
+ # @return [Boolean] True if it's there
57
+ def has?(repo, issue)
58
+ f = @fb.query(
59
+ "(and (eq what 'tombstone') (eq repository #{repo}) (exists issues))"
60
+ ).each.first
61
+ return false if f.nil?
62
+ f['issues'].any? do |ii|
63
+ a, b = ii.split('-').map(&:to_i)
64
+ (a..b).cover?(issue)
65
+ end
66
+ end
67
+ 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.27.1' unless const_defined?(:VERSION)
13
+ VERSION = '0.28.0' unless const_defined?(:VERSION)
14
14
  end
@@ -0,0 +1,46 @@
1
+ # frozen_string_literal: true
2
+
3
+ # SPDX-FileCopyrightText: Copyright (c) 2024-2025 Zerocracy
4
+ # SPDX-License-Identifier: MIT
5
+
6
+ require 'factbase'
7
+ require_relative '../../lib/fbe/tombstone'
8
+ require_relative '../test__helper'
9
+
10
+ # Test.
11
+ # Author:: Yegor Bugayenko (yegor256@gmail.com)
12
+ # Copyright:: Copyright (c) 2024-2025 Zerocracy
13
+ # License:: MIT
14
+ class TestTombstone < Fbe::Test
15
+ def test_simple
16
+ fb = Factbase.new
17
+ ts = Fbe::Tombstone.new(fb:)
18
+ ts.bury!(41, 13)
19
+ ts.bury!(42, 13)
20
+ ts.bury!(42, 999)
21
+ assert(ts.has?(41, 13))
22
+ assert(ts.has?(42, 999))
23
+ refute(ts.has?(8, 7))
24
+ refute(ts.has?(43, 999))
25
+ refute(ts.has?(43, 990))
26
+ end
27
+
28
+ def test_on_empty
29
+ fb = Factbase.new
30
+ ts = Fbe::Tombstone.new(fb:)
31
+ refute(ts.has?(8, 7))
32
+ end
33
+
34
+ def test_merges_them
35
+ fb = Factbase.new
36
+ ts = Fbe::Tombstone.new(fb:)
37
+ ts.bury!(42, 13)
38
+ ts.bury!(42, 18)
39
+ ts.bury!(42, 14)
40
+ ts.bury!(42, 17)
41
+ ts.bury!(42, 15)
42
+ ts.bury!(42, 16)
43
+ assert(ts.has?(42, 16))
44
+ refute(ts.has?(42, 22))
45
+ end
46
+ 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.27.1
4
+ version: 0.28.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Yegor Bugayenko
@@ -387,6 +387,7 @@ files:
387
387
  - lib/fbe/regularly.rb
388
388
  - lib/fbe/repeatedly.rb
389
389
  - lib/fbe/sec.rb
390
+ - lib/fbe/tombstone.rb
390
391
  - lib/fbe/unmask_repos.rb
391
392
  - lib/fbe/who.rb
392
393
  - renovate.json
@@ -414,6 +415,7 @@ files:
414
415
  - test/fbe/test_regularly.rb
415
416
  - test/fbe/test_repeatedly.rb
416
417
  - test/fbe/test_sec.rb
418
+ - test/fbe/test_tombstone.rb
417
419
  - test/fbe/test_unmask_repos.rb
418
420
  - test/fbe/test_who.rb
419
421
  - test/test__helper.rb