factbase 0.7.3 → 0.7.4

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.
Files changed (49) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/benchmark.yml +3 -1
  3. data/.gitignore +5 -5
  4. data/.rultor.yml +1 -1
  5. data/Gemfile +1 -1
  6. data/Gemfile.lock +4 -4
  7. data/README.md +29 -25
  8. data/REUSE.toml +4 -0
  9. data/Rakefile +10 -3
  10. data/benchmark/bench_factbase.rb +56 -0
  11. data/benchmark/bench_query.rb +41 -0
  12. data/benchmark/bench_taped.rb +33 -0
  13. data/lib/factbase/logged.rb +172 -0
  14. data/lib/factbase/looged.rb +1 -1
  15. data/lib/factbase/taped.rb +23 -24
  16. data/lib/factbase.rb +3 -5
  17. data/test/factbase/terms/test_aggregates.rb +2 -2
  18. data/test/factbase/terms/test_aliases.rb +4 -4
  19. data/test/factbase/terms/test_casting.rb +1 -2
  20. data/test/factbase/terms/test_debug.rb +2 -2
  21. data/test/factbase/terms/test_defn.rb +2 -2
  22. data/test/factbase/terms/test_logical.rb +2 -2
  23. data/test/factbase/terms/test_math.rb +1 -2
  24. data/test/factbase/terms/test_meta.rb +2 -2
  25. data/test/factbase/terms/test_ordering.rb +2 -2
  26. data/test/factbase/terms/test_strings.rb +2 -2
  27. data/test/factbase/terms/test_system.rb +1 -2
  28. data/test/factbase/test_accum.rb +2 -2
  29. data/test/factbase/test_churn.rb +2 -2
  30. data/test/factbase/test_fact.rb +2 -2
  31. data/test/factbase/test_flatten.rb +2 -2
  32. data/test/factbase/test_inv.rb +2 -2
  33. data/test/factbase/test_logged.rb +129 -0
  34. data/test/factbase/test_looged.rb +2 -2
  35. data/test/factbase/test_pre.rb +2 -2
  36. data/test/factbase/test_query.rb +2 -2
  37. data/test/factbase/test_rules.rb +2 -2
  38. data/test/factbase/test_syntax.rb +2 -2
  39. data/test/factbase/test_tallied.rb +2 -2
  40. data/test/factbase/test_taped.rb +2 -2
  41. data/test/factbase/test_tee.rb +2 -2
  42. data/test/factbase/test_term.rb +2 -2
  43. data/test/factbase/test_to_json.rb +2 -2
  44. data/test/factbase/test_to_xml.rb +2 -2
  45. data/test/factbase/test_to_yaml.rb +2 -2
  46. data/test/test__helper.rb +3 -1
  47. data/test/test_factbase.rb +5 -5
  48. metadata +8 -7
  49. data/benchmarks/simple.rb +0 -127
data/lib/factbase.rb CHANGED
@@ -37,7 +37,7 @@ require 'yaml'
37
37
  # {
38
38
  # 'name': ['Jeff', 'Walter'],
39
39
  # 'age': [42, 'unknown'],
40
- # 'place: 'LA'
40
+ # 'place': 'LA'
41
41
  # }
42
42
  #
43
43
  # Value sets, as you can see, allow data of different types. However, there
@@ -64,7 +64,7 @@ require 'yaml'
64
64
  # License:: MIT
65
65
  class Factbase
66
66
  # Current version of the gem (changed by .rultor.yml on every release)
67
- VERSION = '0.7.3'
67
+ VERSION = '0.7.4'
68
68
 
69
69
  # An exception that may be thrown in a transaction, to roll it back.
70
70
  class Rollback < StandardError; end
@@ -150,20 +150,18 @@ class Factbase
150
150
  # @return [Factbase::Churn] How many facts have been changed (zero if rolled back)
151
151
  def txn
152
152
  pairs = {}
153
- lookup = {}
154
153
  before =
155
154
  @mutex.synchronize do
156
155
  @maps.map do |m|
157
156
  n = m.transform_values(&:dup)
158
157
  # rubocop:disable Lint/HashCompareByIdentity
159
158
  pairs[n.object_id] = m.object_id
160
- lookup[n.object_id] = n
161
159
  # rubocop:enable Lint/HashCompareByIdentity
162
160
  n
163
161
  end
164
162
  end
165
163
  require_relative 'factbase/taped'
166
- taped = Factbase::Taped.new(before, lookup:)
164
+ taped = Factbase::Taped.new(before)
167
165
  begin
168
166
  require_relative 'factbase/light'
169
167
  yield Factbase::Light.new(Factbase.new(taped, cache: @cache), @cache)
@@ -3,7 +3,7 @@
3
3
  # SPDX-FileCopyrightText: Copyright (c) 2024-2025 Yegor Bugayenko
4
4
  # SPDX-License-Identifier: MIT
5
5
 
6
- require 'minitest/autorun'
6
+ require_relative '../../test__helper'
7
7
  require_relative '../../../lib/factbase/term'
8
8
  require_relative '../../../lib/factbase/syntax'
9
9
 
@@ -11,7 +11,7 @@ require_relative '../../../lib/factbase/syntax'
11
11
  # Author:: Yegor Bugayenko (yegor256@gmail.com)
12
12
  # Copyright:: Copyright (c) 2024-2025 Yegor Bugayenko
13
13
  # License:: MIT
14
- class TestAggregates < Minitest::Test
14
+ class TestAggregates < Factbase::Test
15
15
  def test_aggregation
16
16
  maps = [
17
17
  { 'x' => [1], 'y' => [0], 'z' => [4] },
@@ -3,7 +3,7 @@
3
3
  # SPDX-FileCopyrightText: Copyright (c) 2024-2025 Yegor Bugayenko
4
4
  # SPDX-License-Identifier: MIT
5
5
 
6
- require 'minitest/autorun'
6
+ require_relative '../../test__helper'
7
7
  require_relative '../../../lib/factbase/term'
8
8
  require_relative '../../../lib/factbase/syntax'
9
9
  require_relative '../../../lib/factbase/accum'
@@ -12,7 +12,7 @@ require_relative '../../../lib/factbase/accum'
12
12
  # Author:: Yegor Bugayenko (yegor256@gmail.com)
13
13
  # Copyright:: Copyright (c) 2024-2025 Yegor Bugayenko
14
14
  # License:: MIT
15
- class TestAliases < Minitest::Test
15
+ class TestAliases < Factbase::Test
16
16
  def test_aliases
17
17
  maps = [
18
18
  { 'x' => [1], 'y' => [0], 't1' => [Time.now], 't2' => [Time.now] },
@@ -47,8 +47,8 @@ class TestAliases < Minitest::Test
47
47
  t = Factbase::Syntax.new(Factbase.new, q).to_term
48
48
  maps.each do |m|
49
49
  f = Factbase::Accum.new(fact(m), {}, false)
50
- require_relative '../../../lib/factbase/looged'
51
- f = Factbase::Looged::Fact.new(f, Loog::NULL)
50
+ require_relative '../../../lib/factbase/logged'
51
+ f = Factbase::Logged::Fact.new(f, Loog::NULL)
52
52
  next unless t.evaluate(f, maps)
53
53
  assert(Factbase::Syntax.new(Factbase.new, r).to_term.evaluate(f, []), "#{q} -> #{f} doesn't match #{r}")
54
54
  end
@@ -3,7 +3,6 @@
3
3
  # SPDX-FileCopyrightText: Copyright (c) 2024-2025 Yegor Bugayenko
4
4
  # SPDX-License-Identifier: MIT
5
5
 
6
- require 'minitest/autorun'
7
6
  require_relative '../../test__helper'
8
7
  require_relative '../../../lib/factbase/term'
9
8
 
@@ -11,7 +10,7 @@ require_relative '../../../lib/factbase/term'
11
10
  # Author:: Yegor Bugayenko (yegor256@gmail.com)
12
11
  # Copyright:: Copyright (c) 2024-2025 Yegor Bugayenko
13
12
  # License:: MIT
14
- class TestCasting < Minitest::Test
13
+ class TestCasting < Factbase::Test
15
14
  def test_to_str
16
15
  t = Factbase::Term.new(Factbase.new, :to_string, [Time.now])
17
16
  assert_equal('String', t.evaluate(fact, []).class.to_s)
@@ -3,14 +3,14 @@
3
3
  # SPDX-FileCopyrightText: Copyright (c) 2024-2025 Yegor Bugayenko
4
4
  # SPDX-License-Identifier: MIT
5
5
 
6
- require 'minitest/autorun'
6
+ require_relative '../../test__helper'
7
7
  require_relative '../../../lib/factbase/term'
8
8
 
9
9
  # Debug test.
10
10
  # Author:: Yegor Bugayenko (yegor256@gmail.com)
11
11
  # Copyright:: Copyright (c) 2024-2025 Yegor Bugayenko
12
12
  # License:: MIT
13
- class TestDebug < Minitest::Test
13
+ class TestDebug < Factbase::Test
14
14
  def test_traced
15
15
  t = Factbase::Term.new(Factbase.new, :traced, [Factbase::Term.new(Factbase.new, :defn, [:test_debug, 'self.to_s'])])
16
16
  assert_output("(traced (defn test_debug 'self.to_s')) -> true\n") do
@@ -3,14 +3,14 @@
3
3
  # SPDX-FileCopyrightText: Copyright (c) 2024-2025 Yegor Bugayenko
4
4
  # SPDX-License-Identifier: MIT
5
5
 
6
- require 'minitest/autorun'
6
+ require_relative '../../test__helper'
7
7
  require_relative '../../../lib/factbase/term'
8
8
 
9
9
  # Defn test.
10
10
  # Author:: Yegor Bugayenko (yegor256@gmail.com)
11
11
  # Copyright:: Copyright (c) 2024-2025 Yegor Bugayenko
12
12
  # License:: MIT
13
- class TestDefn < Minitest::Test
13
+ class TestDefn < Factbase::Test
14
14
  def test_defn_simple
15
15
  t = Factbase::Term.new(Factbase.new, :defn, [:foo, 'self.to_s'])
16
16
  assert(t.evaluate(fact('foo' => 4), []))
@@ -3,14 +3,14 @@
3
3
  # SPDX-FileCopyrightText: Copyright (c) 2024-2025 Yegor Bugayenko
4
4
  # SPDX-License-Identifier: MIT
5
5
 
6
- require 'minitest/autorun'
6
+ require_relative '../../test__helper'
7
7
  require_relative '../../../lib/factbase/term'
8
8
 
9
9
  # Logical test.
10
10
  # Author:: Yegor Bugayenko (yegor256@gmail.com)
11
11
  # Copyright:: Copyright (c) 2024-2025 Yegor Bugayenko
12
12
  # License:: MIT
13
- class TestLogical < Minitest::Test
13
+ class TestLogical < Factbase::Test
14
14
  def test_not_matching
15
15
  t = Factbase::Term.new(Factbase.new, :not, [Factbase::Term.new(Factbase.new, :always, [])])
16
16
  refute(t.evaluate(fact('foo' => [100]), []))
@@ -3,7 +3,6 @@
3
3
  # SPDX-FileCopyrightText: Copyright (c) 2024-2025 Yegor Bugayenko
4
4
  # SPDX-License-Identifier: MIT
5
5
 
6
- require 'minitest/autorun'
7
6
  require_relative '../../test__helper'
8
7
  require_relative '../../../lib/factbase/term'
9
8
 
@@ -11,7 +10,7 @@ require_relative '../../../lib/factbase/term'
11
10
  # Author:: Yegor Bugayenko (yegor256@gmail.com)
12
11
  # Copyright:: Copyright (c) 2024-2025 Yegor Bugayenko
13
12
  # License:: MIT
14
- class TestMath < Minitest::Test
13
+ class TestMath < Factbase::Test
15
14
  def test_simple
16
15
  t = Factbase::Term.new(Factbase.new, :eq, [:foo, 42])
17
16
  assert(t.evaluate(fact('foo' => [42]), []))
@@ -3,14 +3,14 @@
3
3
  # SPDX-FileCopyrightText: Copyright (c) 2024-2025 Yegor Bugayenko
4
4
  # SPDX-License-Identifier: MIT
5
5
 
6
- require 'minitest/autorun'
6
+ require_relative '../../test__helper'
7
7
  require_relative '../../../lib/factbase/term'
8
8
 
9
9
  # Meta test.
10
10
  # Author:: Yegor Bugayenko (yegor256@gmail.com)
11
11
  # Copyright:: Copyright (c) 2024-2025 Yegor Bugayenko
12
12
  # License:: MIT
13
- class TestMeta < Minitest::Test
13
+ class TestMeta < Factbase::Test
14
14
  def test_exists
15
15
  t = Factbase::Term.new(Factbase.new, :exists, [:foo])
16
16
  assert(t.evaluate(fact('foo' => 41), []))
@@ -3,14 +3,14 @@
3
3
  # SPDX-FileCopyrightText: Copyright (c) 2024-2025 Yegor Bugayenko
4
4
  # SPDX-License-Identifier: MIT
5
5
 
6
- require 'minitest/autorun'
6
+ require_relative '../../test__helper'
7
7
  require_relative '../../../lib/factbase/term'
8
8
 
9
9
  # Ordering test.
10
10
  # Author:: Yegor Bugayenko (yegor256@gmail.com)
11
11
  # Copyright:: Copyright (c) 2024-2025 Yegor Bugayenko
12
12
  # License:: MIT
13
- class TestOrdering < Minitest::Test
13
+ class TestOrdering < Factbase::Test
14
14
  def test_prev
15
15
  t = Factbase::Term.new(Factbase.new, :prev, [:foo])
16
16
  assert_nil(t.evaluate(fact('foo' => 41), []))
@@ -3,14 +3,14 @@
3
3
  # SPDX-FileCopyrightText: Copyright (c) 2024-2025 Yegor Bugayenko
4
4
  # SPDX-License-Identifier: MIT
5
5
 
6
- require 'minitest/autorun'
6
+ require_relative '../../test__helper'
7
7
  require_relative '../../../lib/factbase/term'
8
8
 
9
9
  # Strings test.
10
10
  # Author:: Yegor Bugayenko (yegor256@gmail.com)
11
11
  # Copyright:: Copyright (c) 2024-2025 Yegor Bugayenko
12
12
  # License:: MIT
13
- class TestStrings < Minitest::Test
13
+ class TestStrings < Factbase::Test
14
14
  def test_regexp_matching
15
15
  t = Factbase::Term.new(Factbase.new, :matches, [:foo, '[a-z]+'])
16
16
  assert(t.evaluate(fact('foo' => 'hello'), []))
@@ -3,7 +3,6 @@
3
3
  # SPDX-FileCopyrightText: Copyright (c) 2024-2025 Yegor Bugayenko
4
4
  # SPDX-License-Identifier: MIT
5
5
 
6
- require 'minitest/autorun'
7
6
  require_relative '../../test__helper'
8
7
  require_relative '../../../lib/factbase/term'
9
8
 
@@ -11,7 +10,7 @@ require_relative '../../../lib/factbase/term'
11
10
  # Author:: Yegor Bugayenko (yegor256@gmail.com)
12
11
  # Copyright:: Copyright (c) 2024-2025 Yegor Bugayenko
13
12
  # License:: MIT
14
- class TestSystem < Minitest::Test
13
+ class TestSystem < Factbase::Test
15
14
  def test_env
16
15
  ENV.store('FOO', 'bar')
17
16
  t = Factbase::Term.new(Factbase.new, :env, ['FOO', ''])
@@ -3,7 +3,7 @@
3
3
  # SPDX-FileCopyrightText: Copyright (c) 2024-2025 Yegor Bugayenko
4
4
  # SPDX-License-Identifier: MIT
5
5
 
6
- require 'minitest/autorun'
6
+ require_relative '../test__helper'
7
7
  require_relative '../../lib/factbase'
8
8
  require_relative '../../lib/factbase/accum'
9
9
  require_relative '../../lib/factbase/fact'
@@ -12,7 +12,7 @@ require_relative '../../lib/factbase/fact'
12
12
  # Author:: Yegor Bugayenko (yegor256@gmail.com)
13
13
  # Copyright:: Copyright (c) 2024-2025 Yegor Bugayenko
14
14
  # License:: MIT
15
- class TestAccum < Minitest::Test
15
+ class TestAccum < Factbase::Test
16
16
  def test_holds_props
17
17
  map = {}
18
18
  f = Factbase::Fact.new(Factbase.new, Mutex.new, map)
@@ -3,7 +3,7 @@
3
3
  # SPDX-FileCopyrightText: Copyright (c) 2024-2025 Yegor Bugayenko
4
4
  # SPDX-License-Identifier: MIT
5
5
 
6
- require 'minitest/autorun'
6
+ require_relative '../test__helper'
7
7
  require 'loog'
8
8
  require_relative '../../lib/factbase'
9
9
  require_relative '../../lib/factbase/churn'
@@ -12,7 +12,7 @@ require_relative '../../lib/factbase/churn'
12
12
  # Author:: Yegor Bugayenko (yegor256@gmail.com)
13
13
  # Copyright:: Copyright (c) 2024-2025 Yegor Bugayenko
14
14
  # License:: MIT
15
- class TestChurn < Minitest::Test
15
+ class TestChurn < Factbase::Test
16
16
  def test_appends
17
17
  c = Factbase::Churn.new
18
18
  c.append(1, 2, 3)
@@ -3,7 +3,7 @@
3
3
  # SPDX-FileCopyrightText: Copyright (c) 2024-2025 Yegor Bugayenko
4
4
  # SPDX-License-Identifier: MIT
5
5
 
6
- require 'minitest/autorun'
6
+ require_relative '../test__helper'
7
7
  require_relative '../../lib/factbase'
8
8
  require_relative '../../lib/factbase/fact'
9
9
 
@@ -11,7 +11,7 @@ require_relative '../../lib/factbase/fact'
11
11
  # Author:: Yegor Bugayenko (yegor256@gmail.com)
12
12
  # Copyright:: Copyright (c) 2024-2025 Yegor Bugayenko
13
13
  # License:: MIT
14
- class TestFact < Minitest::Test
14
+ class TestFact < Factbase::Test
15
15
  def test_injects_data_correctly
16
16
  map = {}
17
17
  f = Factbase::Fact.new(Factbase.new, Mutex.new, map)
@@ -3,7 +3,7 @@
3
3
  # SPDX-FileCopyrightText: Copyright (c) 2024-2025 Yegor Bugayenko
4
4
  # SPDX-License-Identifier: MIT
5
5
 
6
- require 'minitest/autorun'
6
+ require_relative '../test__helper'
7
7
  require_relative '../../lib/factbase'
8
8
  require_relative '../../lib/factbase/flatten'
9
9
 
@@ -11,7 +11,7 @@ require_relative '../../lib/factbase/flatten'
11
11
  # Author:: Yegor Bugayenko (yegor256@gmail.com)
12
12
  # Copyright:: Copyright (c) 2024-2025 Yegor Bugayenko
13
13
  # License:: MIT
14
- class TestFlatten < Minitest::Test
14
+ class TestFlatten < Factbase::Test
15
15
  def test_mapping
16
16
  maps = [{ 'b' => [42], 'i' => 1 }, { 'a' => 33, 'i' => 0 }, { 'c' => %w[hey you], 'i' => 2 }]
17
17
  to = Factbase::Flatten.new(maps, 'i').it
@@ -3,7 +3,7 @@
3
3
  # SPDX-FileCopyrightText: Copyright (c) 2024-2025 Yegor Bugayenko
4
4
  # SPDX-License-Identifier: MIT
5
5
 
6
- require 'minitest/autorun'
6
+ require_relative '../test__helper'
7
7
  require 'loog'
8
8
  require_relative '../../lib/factbase'
9
9
  require_relative '../../lib/factbase/inv'
@@ -13,7 +13,7 @@ require_relative '../../lib/factbase/pre'
13
13
  # Author:: Yegor Bugayenko (yegor256@gmail.com)
14
14
  # Copyright:: Copyright (c) 2024-2025 Yegor Bugayenko
15
15
  # License:: MIT
16
- class TestInv < Minitest::Test
16
+ class TestInv < Factbase::Test
17
17
  def test_simple_checking
18
18
  fb =
19
19
  Factbase::Inv.new(Factbase.new) do |p, v|
@@ -0,0 +1,129 @@
1
+ # frozen_string_literal: true
2
+
3
+ # SPDX-FileCopyrightText: Copyright (c) 2024-2025 Yegor Bugayenko
4
+ # SPDX-License-Identifier: MIT
5
+
6
+ require_relative '../test__helper'
7
+ require 'loog'
8
+ require_relative '../../lib/factbase'
9
+ require_relative '../../lib/factbase/logged'
10
+
11
+ # Test.
12
+ # Author:: Yegor Bugayenko (yegor256@gmail.com)
13
+ # Copyright:: Copyright (c) 2024-2025 Yegor Bugayenko
14
+ # License:: MIT
15
+ class TestLogged < Factbase::Test
16
+ def test_simple_setting
17
+ fb = Factbase::Logged.new(Factbase.new, Loog::NULL)
18
+ fb.insert
19
+ fb.insert.bar = 3
20
+ found = 0
21
+ fb.query('(exists bar)').each do |f|
22
+ assert_predicate(f.bar, :positive?)
23
+ f.foo = 42
24
+ assert_equal(42, f.foo)
25
+ found += 1
26
+ end
27
+ assert_equal(1, found)
28
+ assert_equal(2, fb.size)
29
+ end
30
+
31
+ def test_reading_one
32
+ fb = Factbase::Logged.new(Factbase.new, Loog::NULL)
33
+ fb.insert
34
+ fb.insert.bar = 42
35
+ assert_equal(1, fb.query('(agg (exists bar) (count))').one)
36
+ assert_equal([42], fb.query('(agg (exists bar) (first bar))').one)
37
+ end
38
+
39
+ def test_with_txn
40
+ log = Loog::Buffer.new
41
+ fb = Factbase::Logged.new(Factbase.new, log)
42
+ assert(
43
+ fb.txn do |fbt|
44
+ fbt.insert.foo = 42
45
+ end
46
+ )
47
+ assert_equal(1, fb.size)
48
+ assert_includes(log.to_s, 'touched', log)
49
+ end
50
+
51
+ def test_with_txn_rollback
52
+ log = Loog::Buffer.new
53
+ fb = Factbase::Logged.new(Factbase.new, log)
54
+ assert_equal(0, fb.txn { raise Factbase::Rollback })
55
+ assert_equal(0, fb.size)
56
+ assert_includes(log.to_s, 'rolled back', log)
57
+ refute_includes(log.to_s, 'didn\'t touch', log)
58
+ end
59
+
60
+ def test_with_modifying_txn
61
+ log = Loog::Buffer.new
62
+ fb = Factbase::Logged.new(Factbase.new, log)
63
+ fb.insert.foo = 1
64
+ assert_equal(0, fb.txn { |fbt| fbt.query('(always)').each.to_a }.to_i, log)
65
+ assert_equal(1, fb.txn { |fbt| fbt.query('(always)').each.to_a[0].foo = 42 }.to_i)
66
+ assert_includes(log.to_s, 'touched', log)
67
+ end
68
+
69
+ def test_with_empty_txn
70
+ log = Loog::Buffer.new
71
+ fb = Factbase::Logged.new(Factbase.new, log)
72
+ assert_equal(0, fb.txn { |fbt| fbt.query('(always)').each.to_a }.to_i)
73
+ assert_includes(log.to_s, 'touched', log)
74
+ end
75
+
76
+ def test_returns_int
77
+ fb = Factbase.new
78
+ fb.insert
79
+ fb.insert
80
+ assert_equal(2, Factbase::Logged.new(fb, Loog::NULL).query('(always)').each(&:to_s))
81
+ end
82
+
83
+ def test_returns_int_when_empty
84
+ fb = Factbase.new
85
+ assert_equal(0, Factbase::Logged.new(fb, Loog::NULL).query('(always)').each(&:to_s))
86
+ end
87
+
88
+ def test_logs_when_enumerator
89
+ fb = Factbase::Logged.new(Factbase.new, Loog::NULL)
90
+ assert_equal(0, fb.query('(always)').each.to_a.size)
91
+ fb.insert
92
+ assert_equal(1, fb.query('(always)').each.to_a.size)
93
+ end
94
+
95
+ def test_proper_logging
96
+ log = Loog::Buffer.new
97
+ fb = Factbase::Logged.new(Factbase.new, log)
98
+ fb.insert
99
+ fb.insert.bar = 3
100
+ fb.insert
101
+ fb.insert.str =
102
+ "Он поскорей звонит. Вбегает
103
+ К нему слуга француз Гильо,
104
+ Халат и туфли предлагает
105
+ И подает ему белье.
106
+ Спешит Онегин одеваться,
107
+ Слуге велит приготовляться
108
+ С ним вместе ехать и с собой
109
+ Взять также ящик боевой.
110
+ Готовы санки беговые.
111
+ Он сел, на мельницу летит.
112
+ Примчались. Он слуге велит
113
+ Лепажа стволы роковые
114
+ Нести за ним, а лошадям
115
+ Отъехать в поле к двум дубкам."
116
+ fb.query('(exists bar)').each(&:to_s)
117
+ fb.query('(not (exists bar))').delete!
118
+ [
119
+ 'Inserted new fact #1',
120
+ 'Inserted new fact #2',
121
+ 'Set \'bar\' to 3 (Integer)',
122
+ 'Set \'str\' to "Он поскорей звонит. Вбегает\n ... Отъехать в поле к двум дубкам." (String)',
123
+ 'Found 1 fact(s) by \'(exists bar)\'',
124
+ 'Deleted 3 fact(s) out of 4 by \'(not (exists bar))\''
125
+ ].each do |s|
126
+ assert_includes(log.to_s, s, "#{log}\n")
127
+ end
128
+ end
129
+ end
@@ -3,7 +3,7 @@
3
3
  # SPDX-FileCopyrightText: Copyright (c) 2024-2025 Yegor Bugayenko
4
4
  # SPDX-License-Identifier: MIT
5
5
 
6
- require 'minitest/autorun'
6
+ require_relative '../test__helper'
7
7
  require 'loog'
8
8
  require_relative '../../lib/factbase'
9
9
  require_relative '../../lib/factbase/looged'
@@ -12,7 +12,7 @@ require_relative '../../lib/factbase/looged'
12
12
  # Author:: Yegor Bugayenko (yegor256@gmail.com)
13
13
  # Copyright:: Copyright (c) 2024-2025 Yegor Bugayenko
14
14
  # License:: MIT
15
- class TestLooged < Minitest::Test
15
+ class TestLooged < Factbase::Test
16
16
  def test_simple_setting
17
17
  fb = Factbase::Looged.new(Factbase.new, Loog::NULL)
18
18
  fb.insert
@@ -3,7 +3,7 @@
3
3
  # SPDX-FileCopyrightText: Copyright (c) 2024-2025 Yegor Bugayenko
4
4
  # SPDX-License-Identifier: MIT
5
5
 
6
- require 'minitest/autorun'
6
+ require_relative '../test__helper'
7
7
  require 'loog'
8
8
  require_relative '../../lib/factbase/pre'
9
9
 
@@ -11,7 +11,7 @@ require_relative '../../lib/factbase/pre'
11
11
  # Author:: Yegor Bugayenko (yegor256@gmail.com)
12
12
  # Copyright:: Copyright (c) 2024-2025 Yegor Bugayenko
13
13
  # License:: MIT
14
- class TestPre < Minitest::Test
14
+ class TestPre < Factbase::Test
15
15
  def test_simple_setting
16
16
  fb = Factbase::Pre.new(Factbase.new) { |f| f.foo = 42 }
17
17
  f = fb.insert
@@ -3,7 +3,7 @@
3
3
  # SPDX-FileCopyrightText: Copyright (c) 2024-2025 Yegor Bugayenko
4
4
  # SPDX-License-Identifier: MIT
5
5
 
6
- require 'minitest/autorun'
6
+ require_relative '../test__helper'
7
7
  require 'time'
8
8
  require_relative '../../lib/factbase'
9
9
  require_relative '../../lib/factbase/query'
@@ -12,7 +12,7 @@ require_relative '../../lib/factbase/query'
12
12
  # Author:: Yegor Bugayenko (yegor256@gmail.com)
13
13
  # Copyright:: Copyright (c) 2024-2025 Yegor Bugayenko
14
14
  # License:: MIT
15
- class TestQuery < Minitest::Test
15
+ class TestQuery < Factbase::Test
16
16
  def test_simple_parsing
17
17
  maps = []
18
18
  maps << { 'foo' => [42] }
@@ -3,7 +3,7 @@
3
3
  # SPDX-FileCopyrightText: Copyright (c) 2024-2025 Yegor Bugayenko
4
4
  # SPDX-License-Identifier: MIT
5
5
 
6
- require 'minitest/autorun'
6
+ require_relative '../test__helper'
7
7
  require_relative '../../lib/factbase'
8
8
  require_relative '../../lib/factbase/rules'
9
9
  require_relative '../../lib/factbase/pre'
@@ -12,7 +12,7 @@ require_relative '../../lib/factbase/pre'
12
12
  # Author:: Yegor Bugayenko (yegor256@gmail.com)
13
13
  # Copyright:: Copyright (c) 2024-2025 Yegor Bugayenko
14
14
  # License:: MIT
15
- class TestRules < Minitest::Test
15
+ class TestRules < Factbase::Test
16
16
  def test_simple_checking
17
17
  fb = Factbase::Rules.new(
18
18
  Factbase.new,
@@ -3,14 +3,14 @@
3
3
  # SPDX-FileCopyrightText: Copyright (c) 2024-2025 Yegor Bugayenko
4
4
  # SPDX-License-Identifier: MIT
5
5
 
6
- require 'minitest/autorun'
6
+ require_relative '../test__helper'
7
7
  require_relative '../../lib/factbase/syntax'
8
8
 
9
9
  # Syntax test.
10
10
  # Author:: Yegor Bugayenko (yegor256@gmail.com)
11
11
  # Copyright:: Copyright (c) 2024-2025 Yegor Bugayenko
12
12
  # License:: MIT
13
- class TestSyntax < Minitest::Test
13
+ class TestSyntax < Factbase::Test
14
14
  def test_parses_string_right
15
15
  [
16
16
  "(foo 'abc')",
@@ -3,7 +3,7 @@
3
3
  # SPDX-FileCopyrightText: Copyright (c) 2024-2025 Yegor Bugayenko
4
4
  # SPDX-License-Identifier: MIT
5
5
 
6
- require 'minitest/autorun'
6
+ require_relative '../test__helper'
7
7
  require 'threads'
8
8
  require_relative '../../lib/factbase'
9
9
  require_relative '../../lib/factbase/tallied'
@@ -12,7 +12,7 @@ require_relative '../../lib/factbase/tallied'
12
12
  # Author:: Yegor Bugayenko (yegor256@gmail.com)
13
13
  # Copyright:: Copyright (c) 2024-2025 Yegor Bugayenko
14
14
  # License:: MIT
15
- class TestTallied < Minitest::Test
15
+ class TestTallied < Factbase::Test
16
16
  def test_counts_size
17
17
  fb = Factbase::Tallied.new(Factbase.new)
18
18
  assert_equal(0, fb.size)
@@ -3,7 +3,7 @@
3
3
  # SPDX-FileCopyrightText: Copyright (c) 2024-2025 Yegor Bugayenko
4
4
  # SPDX-License-Identifier: MIT
5
5
 
6
- require 'minitest/autorun'
6
+ require_relative '../test__helper'
7
7
  require_relative '../../lib/factbase'
8
8
  require_relative '../../lib/factbase/taped'
9
9
 
@@ -11,7 +11,7 @@ require_relative '../../lib/factbase/taped'
11
11
  # Author:: Yegor Bugayenko (yegor256@gmail.com)
12
12
  # Copyright:: Copyright (c) 2024-2025 Yegor Bugayenko
13
13
  # License:: MIT
14
- class TestTaped < Minitest::Test
14
+ class TestTaped < Factbase::Test
15
15
  def test_tracks_insertion
16
16
  t = Factbase::Taped.new([])
17
17
  t << {}
@@ -3,7 +3,7 @@
3
3
  # SPDX-FileCopyrightText: Copyright (c) 2024-2025 Yegor Bugayenko
4
4
  # SPDX-License-Identifier: MIT
5
5
 
6
- require 'minitest/autorun'
6
+ require_relative '../test__helper'
7
7
  require_relative '../../lib/factbase'
8
8
  require_relative '../../lib/factbase/tee'
9
9
  require_relative '../../lib/factbase/fact'
@@ -12,7 +12,7 @@ require_relative '../../lib/factbase/fact'
12
12
  # Author:: Yegor Bugayenko (yegor256@gmail.com)
13
13
  # Copyright:: Copyright (c) 2024-2025 Yegor Bugayenko
14
14
  # License:: MIT
15
- class TestTee < Minitest::Test
15
+ class TestTee < Factbase::Test
16
16
  def test_two_facts
17
17
  prim = Factbase::Fact.new(Factbase.new, Mutex.new, {})
18
18
  prim.foo = 42
@@ -3,14 +3,14 @@
3
3
  # SPDX-FileCopyrightText: Copyright (c) 2024-2025 Yegor Bugayenko
4
4
  # SPDX-License-Identifier: MIT
5
5
 
6
- require 'minitest/autorun'
6
+ require_relative '../test__helper'
7
7
  require_relative '../../lib/factbase/term'
8
8
 
9
9
  # Term test.
10
10
  # Author:: Yegor Bugayenko (yegor256@gmail.com)
11
11
  # Copyright:: Copyright (c) 2024-2025 Yegor Bugayenko
12
12
  # License:: MIT
13
- class TestTerm < Minitest::Test
13
+ class TestTerm < Factbase::Test
14
14
  def test_false_matching
15
15
  t = Factbase::Term.new(Factbase.new, :never, [])
16
16
  refute(t.evaluate(fact('foo' => [100]), []))
@@ -3,7 +3,7 @@
3
3
  # SPDX-FileCopyrightText: Copyright (c) 2024-2025 Yegor Bugayenko
4
4
  # SPDX-License-Identifier: MIT
5
5
 
6
- require 'minitest/autorun'
6
+ require_relative '../test__helper'
7
7
  require 'loog'
8
8
  require_relative '../../lib/factbase'
9
9
  require_relative '../../lib/factbase/to_json'
@@ -12,7 +12,7 @@ require_relative '../../lib/factbase/to_json'
12
12
  # Author:: Yegor Bugayenko (yegor256@gmail.com)
13
13
  # Copyright:: Copyright (c) 2024-2025 Yegor Bugayenko
14
14
  # License:: MIT
15
- class TestToJSON < Minitest::Test
15
+ class TestToJSON < Factbase::Test
16
16
  def test_simple_rendering
17
17
  fb = Factbase.new
18
18
  f = fb.insert