factbase 0.7.3 → 0.7.5

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 (54) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/benchmark.yml +3 -1
  3. data/.gitignore +6 -5
  4. data/.rultor.yml +1 -1
  5. data/Gemfile +1 -1
  6. data/Gemfile.lock +9 -9
  7. data/README.md +37 -25
  8. data/REUSE.toml +4 -0
  9. data/Rakefile +10 -3
  10. data/benchmark/bench_factbase.rb +61 -0
  11. data/benchmark/bench_large_query.rb +128 -0
  12. data/benchmark/bench_query.rb +41 -0
  13. data/benchmark/bench_taped.rb +33 -0
  14. data/factbase.gemspec +5 -5
  15. data/lib/factbase/accum.rb +1 -1
  16. data/lib/factbase/{looged.rb → logged.rb} +8 -8
  17. data/lib/factbase/taped.rb +25 -25
  18. data/lib/factbase/term.rb +9 -1
  19. data/lib/factbase/terms/aggregates.rb +2 -2
  20. data/lib/factbase/terms/meta.rb +1 -1
  21. data/lib/factbase/terms/ordering.rb +1 -1
  22. data/lib/factbase.rb +3 -5
  23. data/test/factbase/terms/test_aggregates.rb +2 -2
  24. data/test/factbase/terms/test_aliases.rb +4 -4
  25. data/test/factbase/terms/test_casting.rb +1 -2
  26. data/test/factbase/terms/test_debug.rb +2 -2
  27. data/test/factbase/terms/test_defn.rb +2 -2
  28. data/test/factbase/terms/test_logical.rb +2 -2
  29. data/test/factbase/terms/test_math.rb +1 -2
  30. data/test/factbase/terms/test_meta.rb +2 -2
  31. data/test/factbase/terms/test_ordering.rb +2 -2
  32. data/test/factbase/terms/test_strings.rb +2 -2
  33. data/test/factbase/terms/test_system.rb +1 -2
  34. data/test/factbase/test_accum.rb +2 -2
  35. data/test/factbase/test_churn.rb +2 -2
  36. data/test/factbase/test_fact.rb +2 -2
  37. data/test/factbase/test_flatten.rb +2 -2
  38. data/test/factbase/test_inv.rb +2 -2
  39. data/test/factbase/{test_looged.rb → test_logged.rb} +13 -13
  40. data/test/factbase/test_pre.rb +2 -2
  41. data/test/factbase/test_query.rb +2 -2
  42. data/test/factbase/test_rules.rb +2 -2
  43. data/test/factbase/test_syntax.rb +2 -2
  44. data/test/factbase/test_tallied.rb +2 -2
  45. data/test/factbase/test_taped.rb +2 -2
  46. data/test/factbase/test_tee.rb +2 -2
  47. data/test/factbase/test_term.rb +2 -2
  48. data/test/factbase/test_to_json.rb +2 -2
  49. data/test/factbase/test_to_xml.rb +2 -2
  50. data/test/factbase/test_to_yaml.rb +2 -2
  51. data/test/test__helper.rb +3 -1
  52. data/test/test_factbase.rb +5 -5
  53. metadata +29 -29
  54. data/benchmarks/simple.rb +0 -127
@@ -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
@@ -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_xml'
@@ -12,7 +12,7 @@ require_relative '../../lib/factbase/to_xml'
12
12
  # Author:: Yegor Bugayenko (yegor256@gmail.com)
13
13
  # Copyright:: Copyright (c) 2024-2025 Yegor Bugayenko
14
14
  # License:: MIT
15
- class TestToXML < Minitest::Test
15
+ class TestToXML < Factbase::Test
16
16
  def test_simple_rendering
17
17
  fb = Factbase.new
18
18
  fb.insert.t = Time.now
@@ -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_yaml'
@@ -12,7 +12,7 @@ require_relative '../../lib/factbase/to_yaml'
12
12
  # Author:: Yegor Bugayenko (yegor256@gmail.com)
13
13
  # Copyright:: Copyright (c) 2024-2025 Yegor Bugayenko
14
14
  # License:: MIT
15
- class TestToYAML < Minitest::Test
15
+ class TestToYAML < Factbase::Test
16
16
  def test_simple_rendering
17
17
  fb = Factbase.new
18
18
  f = fb.insert
data/test/test__helper.rb CHANGED
@@ -17,8 +17,10 @@ require 'minitest/autorun'
17
17
  require 'minitest/reporters'
18
18
  Minitest::Reporters.use! [Minitest::Reporters::SpecReporter.new]
19
19
 
20
+ require_relative '../lib/factbase'
21
+
20
22
  # Default methods for all tests.
21
- class Minitest::Test
23
+ class Factbase::Test < Minitest::Test
22
24
  def fact(map = {})
23
25
  require 'factbase/fact'
24
26
  Factbase::Fact.new(Factbase.new, Mutex.new, map)
@@ -3,20 +3,20 @@
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 'loog'
8
7
  require 'threads'
9
8
  require_relative '../lib/factbase'
10
- require_relative '../lib/factbase/rules'
11
9
  require_relative '../lib/factbase/inv'
10
+ require_relative '../lib/factbase/logged'
12
11
  require_relative '../lib/factbase/pre'
13
- require_relative '../lib/factbase/looged'
12
+ require_relative '../lib/factbase/rules'
13
+ require_relative 'test__helper'
14
14
 
15
15
  # Factbase main module test.
16
16
  # Author:: Yegor Bugayenko (yegor256@gmail.com)
17
17
  # Copyright:: Copyright (c) 2024-2025 Yegor Bugayenko
18
18
  # License:: MIT
19
- class TestFactbase < Minitest::Test
19
+ class TestFactbase < Factbase::Test
20
20
  def test_injects_data_correctly
21
21
  maps = []
22
22
  fb = Factbase.new(maps)
@@ -177,7 +177,7 @@ class TestFactbase < Minitest::Test
177
177
  Factbase::Rules.new(Factbase.new, '(always)'),
178
178
  Factbase::Inv.new(Factbase.new) { |_, _| true },
179
179
  Factbase::Pre.new(Factbase.new) { |_| true },
180
- Factbase::Looged.new(Factbase.new, Loog::NULL)
180
+ Factbase::Logged.new(Factbase.new, Loog::NULL)
181
181
  ].each do |d|
182
182
  f = d.insert
183
183
  f.foo = 42
metadata CHANGED
@@ -1,43 +1,42 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: factbase
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.3
4
+ version: 0.7.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Yegor Bugayenko
8
- autorequire:
9
8
  bindir: bin
10
9
  cert_chain: []
11
- date: 2025-02-24 00:00:00.000000000 Z
10
+ date: 2025-03-03 00:00:00.000000000 Z
12
11
  dependencies:
13
12
  - !ruby/object:Gem::Dependency
14
13
  name: backtrace
15
14
  requirement: !ruby/object:Gem::Requirement
16
15
  requirements:
17
- - - ">"
16
+ - - ">="
18
17
  - !ruby/object:Gem::Version
19
- version: '0'
18
+ version: 0.4.0
20
19
  type: :runtime
21
20
  prerelease: false
22
21
  version_requirements: !ruby/object:Gem::Requirement
23
22
  requirements:
24
- - - ">"
23
+ - - ">="
25
24
  - !ruby/object:Gem::Version
26
- version: '0'
25
+ version: 0.4.0
27
26
  - !ruby/object:Gem::Dependency
28
27
  name: decoor
29
28
  requirement: !ruby/object:Gem::Requirement
30
29
  requirements:
31
- - - ">"
30
+ - - ">="
32
31
  - !ruby/object:Gem::Version
33
- version: '0'
32
+ version: 0.0.1
34
33
  type: :runtime
35
34
  prerelease: false
36
35
  version_requirements: !ruby/object:Gem::Requirement
37
36
  requirements:
38
- - - ">"
37
+ - - ">="
39
38
  - !ruby/object:Gem::Version
40
- version: '0'
39
+ version: 0.0.1
41
40
  - !ruby/object:Gem::Dependency
42
41
  name: json
43
42
  requirement: !ruby/object:Gem::Requirement
@@ -56,16 +55,16 @@ dependencies:
56
55
  name: loog
57
56
  requirement: !ruby/object:Gem::Requirement
58
57
  requirements:
59
- - - ">"
58
+ - - ">="
60
59
  - !ruby/object:Gem::Version
61
- version: '0'
60
+ version: 0.6.0
62
61
  type: :runtime
63
62
  prerelease: false
64
63
  version_requirements: !ruby/object:Gem::Requirement
65
64
  requirements:
66
- - - ">"
65
+ - - ">="
67
66
  - !ruby/object:Gem::Version
68
- version: '0'
67
+ version: 0.6.0
69
68
  - !ruby/object:Gem::Dependency
70
69
  name: nokogiri
71
70
  requirement: !ruby/object:Gem::Requirement
@@ -84,30 +83,30 @@ dependencies:
84
83
  name: others
85
84
  requirement: !ruby/object:Gem::Requirement
86
85
  requirements:
87
- - - ">"
86
+ - - ">="
88
87
  - !ruby/object:Gem::Version
89
- version: '0'
88
+ version: 0.0.3
90
89
  type: :runtime
91
90
  prerelease: false
92
91
  version_requirements: !ruby/object:Gem::Requirement
93
92
  requirements:
94
- - - ">"
93
+ - - ">="
95
94
  - !ruby/object:Gem::Version
96
- version: '0'
95
+ version: 0.0.3
97
96
  - !ruby/object:Gem::Dependency
98
97
  name: tago
99
98
  requirement: !ruby/object:Gem::Requirement
100
99
  requirements:
101
- - - ">"
100
+ - - ">="
102
101
  - !ruby/object:Gem::Version
103
- version: '0'
102
+ version: 0.0.2
104
103
  type: :runtime
105
104
  prerelease: false
106
105
  version_requirements: !ruby/object:Gem::Requirement
107
106
  requirements:
108
- - - ">"
107
+ - - ">="
109
108
  - !ruby/object:Gem::Version
110
- version: '0'
109
+ version: 0.0.2
111
110
  - !ruby/object:Gem::Dependency
112
111
  name: yaml
113
112
  requirement: !ruby/object:Gem::Requirement
@@ -158,7 +157,10 @@ files:
158
157
  - README.md
159
158
  - REUSE.toml
160
159
  - Rakefile
161
- - benchmarks/simple.rb
160
+ - benchmark/bench_factbase.rb
161
+ - benchmark/bench_large_query.rb
162
+ - benchmark/bench_query.rb
163
+ - benchmark/bench_taped.rb
162
164
  - factbase.gemspec
163
165
  - lib/factbase.rb
164
166
  - lib/factbase/accum.rb
@@ -167,7 +169,7 @@ files:
167
169
  - lib/factbase/flatten.rb
168
170
  - lib/factbase/inv.rb
169
171
  - lib/factbase/light.rb
170
- - lib/factbase/looged.rb
172
+ - lib/factbase/logged.rb
171
173
  - lib/factbase/pre.rb
172
174
  - lib/factbase/query.rb
173
175
  - lib/factbase/query_once.rb
@@ -209,7 +211,7 @@ files:
209
211
  - test/factbase/test_fact.rb
210
212
  - test/factbase/test_flatten.rb
211
213
  - test/factbase/test_inv.rb
212
- - test/factbase/test_looged.rb
214
+ - test/factbase/test_logged.rb
213
215
  - test/factbase/test_pre.rb
214
216
  - test/factbase/test_query.rb
215
217
  - test/factbase/test_rules.rb
@@ -228,7 +230,6 @@ licenses:
228
230
  - MIT
229
231
  metadata:
230
232
  rubygems_mfa_required: 'true'
231
- post_install_message:
232
233
  rdoc_options:
233
234
  - "--charset=UTF-8"
234
235
  require_paths:
@@ -244,8 +245,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
244
245
  - !ruby/object:Gem::Version
245
246
  version: '0'
246
247
  requirements: []
247
- rubygems_version: 3.4.10
248
- signing_key:
248
+ rubygems_version: 3.6.2
249
249
  specification_version: 4
250
250
  summary: Factbase
251
251
  test_files: []
data/benchmarks/simple.rb DELETED
@@ -1,127 +0,0 @@
1
- #!/usr/bin/env ruby
2
- # frozen_string_literal: true
3
-
4
- # SPDX-FileCopyrightText: Copyright (c) 2024-2025 Yegor Bugayenko
5
- # SPDX-License-Identifier: MIT
6
-
7
- require 'benchmark'
8
- require 'time'
9
- require_relative '../lib/factbase'
10
-
11
- def insert(fb, total)
12
- time =
13
- Benchmark.measure do
14
- total.times do |i|
15
- fact = fb.insert
16
- fact.id = i
17
- fact.title = "Object Thinking #{i}"
18
- fact.time = Time.now.iso8601
19
- fact.cost = rand(1..100)
20
- fact.foo = rand(0.0..100.0).round(3)
21
- fact.bar = rand(100..300)
22
- fact.seenBy = "User#{i}" if i.even?
23
- fact.zzz = "Extra#{i}" if (i % 10).zero?
24
- end
25
- end
26
- {
27
- title: '`fb.insert()`',
28
- time: time.real,
29
- details: "Inserted #{total} facts"
30
- }
31
- end
32
-
33
- def query(fb, query)
34
- total = 0
35
- runs = 100
36
- time =
37
- Benchmark.measure do
38
- runs.times do
39
- total = fb.query(query).each.to_a.size
40
- end
41
- end
42
- {
43
- title: "`#{query}`",
44
- time: time.real.round(6),
45
- details: "#{total} facts x#{runs}"
46
- }
47
- end
48
-
49
- def delete(fb, query)
50
- total = 0
51
- time =
52
- Benchmark.measure do
53
- total = fb.query(query).delete!
54
- end
55
- {
56
- title: "`#{query}`",
57
- time: time.real.round(6),
58
- details: "Deleted #{total} fact(s)"
59
- }
60
- end
61
-
62
- def impex(fb)
63
- size = 0
64
- time =
65
- Benchmark.measure do
66
- bin = fb.export
67
- size = bin.size
68
- fb2 = Factbase.new
69
- fb2.import(bin)
70
- end
71
- {
72
- title: '`.export()` + `.import()`',
73
- time: time.real,
74
- details: "#{size} bytes"
75
- }
76
- end
77
-
78
- def txn(fb, scenario, &block)
79
- modified = 0
80
- time =
81
- Benchmark.measure do
82
- modified = fb.txn(&block)
83
- end
84
- {
85
- title: "txn: `#{scenario}`",
86
- time: time.real,
87
- details: modified.to_s
88
- }
89
- end
90
-
91
- fb = Factbase.new
92
- rows = [
93
- insert(fb, 25_000),
94
- query(fb, '(gt time \'2024-03-23T03:21:43Z\')'),
95
- query(fb, '(gt cost 50)'),
96
- query(fb, '(eq title \'Object Thinking 5000\')'),
97
- query(fb, '(and (eq foo 42.998) (or (gt bar 200) (absent zzz)))'),
98
- query(fb, '(eq id (agg (always) (max id)))'),
99
- query(fb, '(join "c<=cost,b<=bar" (eq id (agg (always) (max id))))'),
100
- txn(fb, 'query()') do |fbt|
101
- 100.times do |i|
102
- fbt.query("(gt foo #{i})").each.to_a
103
- end
104
- end,
105
- txn(fb, 'insert()') do |fbt|
106
- 100.times do
107
- fbt.insert
108
- end
109
- end,
110
- txn(fb, 'add()') do |fbt|
111
- 100.times do |i|
112
- fbt.query("(gt foo #{i})").each.to_a.first.bar = 55
113
- end
114
- end,
115
- txn(fb, 'delete!()') do |fbt|
116
- 50.times do |i|
117
- fbt.query("(gt foo #{100 - i})").delete!
118
- end
119
- end,
120
- impex(fb),
121
- delete(fb, '(gt cost 3)'),
122
- delete(fb, '(gt bar 1)')
123
- ].map { |r| "| #{r[:title]} | #{format('%0.3f', r[:time])} | #{r[:details]} |" }
124
-
125
- puts '| Action | Seconds | Details |'
126
- puts '| --- | --: | --- |'
127
- rows.each { |row| puts row }