factbase 0.5.0 → 0.5.1

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: 88beb6f254052cd02b10e5c562bf1fe940c3a488274cbab3f4fcc61ef8ede0a7
4
- data.tar.gz: 983417ddfaf3f8b2f4930f1bb4565e4bc9d19d84ad26636df39d7bbc810ac3c1
3
+ metadata.gz: c672da652030c0c4a1405ce4d84b91e0ca776d342d1418be9b01d18ea6d70703
4
+ data.tar.gz: '068e446b24c80857c7c26724b22bd58d8644f8fa6db76223eb786d00fb422e1a'
5
5
  SHA512:
6
- metadata.gz: 577a14d1021f170224be23a8afe4427a30565c2a78356e21f582031f80a65f44e314270e1e152c4d929f7b2b92e39cecccdca1c01bb37ebb1071b77e80170288
7
- data.tar.gz: 956b6147cf616f2376ffffd6a171b75e129f268e4c9858ba85270f2fde86e7686601f346cfbd40487f4c03562c065ce5a105a730b2b9f4e21bbd0fcc3f07113d
6
+ metadata.gz: f3cc8aae4d769dc4103a5501d4ff8e3093dbbdb0084b3f705d0b8d4dc70667f7828ae7bc39585e68c45891c94a926828e899110e34f3a76aad918e8acf9f319c
7
+ data.tar.gz: 062e0dc1dd5f90e5d9555baa2f2d79f957180d2a1c823a35bb296db43708d9feacb9f9b1465c0bfc411245aeba981dee0a902d22c806febf99f6676911354a7d
data/Gemfile.lock CHANGED
@@ -14,23 +14,24 @@ PATH
14
14
  GEM
15
15
  remote: https://rubygems.org/
16
16
  specs:
17
- actionpack (8.0.1)
18
- actionview (= 8.0.1)
19
- activesupport (= 8.0.1)
17
+ actionpack (7.2.2.1)
18
+ actionview (= 7.2.2.1)
19
+ activesupport (= 7.2.2.1)
20
20
  nokogiri (>= 1.8.5)
21
- rack (>= 2.2.4)
21
+ racc
22
+ rack (>= 2.2.4, < 3.2)
22
23
  rack-session (>= 1.0.1)
23
24
  rack-test (>= 0.6.3)
24
25
  rails-dom-testing (~> 2.2)
25
26
  rails-html-sanitizer (~> 1.6)
26
27
  useragent (~> 0.16)
27
- actionview (8.0.1)
28
- activesupport (= 8.0.1)
28
+ actionview (7.2.2.1)
29
+ activesupport (= 7.2.2.1)
29
30
  builder (~> 3.1)
30
31
  erubi (~> 1.11)
31
32
  rails-dom-testing (~> 2.2)
32
33
  rails-html-sanitizer (~> 1.6)
33
- activesupport (8.0.1)
34
+ activesupport (7.2.2.1)
34
35
  base64
35
36
  benchmark (>= 0.3)
36
37
  bigdecimal
@@ -42,7 +43,6 @@ GEM
42
43
  minitest (>= 5.1)
43
44
  securerandom (>= 0.3)
44
45
  tzinfo (~> 2.0, >= 2.0.5)
45
- uri (>= 0.13.1)
46
46
  ansi (1.5.0)
47
47
  ast (2.4.2)
48
48
  backtrace (0.4.0)
@@ -114,9 +114,9 @@ GEM
114
114
  rails-html-sanitizer (1.6.2)
115
115
  loofah (~> 2.21)
116
116
  nokogiri (>= 1.15.7, != 1.16.7, != 1.16.6, != 1.16.5, != 1.16.4, != 1.16.3, != 1.16.2, != 1.16.1, != 1.16.0.rc1, != 1.16.0)
117
- railties (8.0.1)
118
- actionpack (= 8.0.1)
119
- activesupport (= 8.0.1)
117
+ railties (7.2.2.1)
118
+ actionpack (= 7.2.2.1)
119
+ activesupport (= 7.2.2.1)
120
120
  irb (~> 1.13)
121
121
  rackup (>= 1.0.0)
122
122
  rake (>= 12.2)
@@ -189,11 +189,10 @@ GEM
189
189
  unicode-display_width (3.1.4)
190
190
  unicode-emoji (~> 4.0, >= 4.0.4)
191
191
  unicode-emoji (4.0.4)
192
- uri (1.0.2)
193
192
  useragent (0.16.11)
194
193
  yaml (0.4.0)
195
194
  yard (0.9.37)
196
- zeitwerk (2.7.1)
195
+ zeitwerk (2.6.18)
197
196
 
198
197
  PLATFORMS
199
198
  arm64-darwin-22
data/README.md CHANGED
@@ -184,19 +184,19 @@ This is the result of the benchmark:
184
184
 
185
185
  <!-- benchmark_begin -->
186
186
  | Action | Seconds | Details |
187
- | --- | --: | --: |
188
- | `fb.insert()` | 7.800 | Inserted 100000 facts |
189
- | `(gt time '2024-03-23T03:21:43Z')` | 0.070 | Found 100000 fact(s) |
190
- | `(gt cost 50)` | 0.072 | Found 49779 fact(s) |
191
- | `(eq title 'Object Thinking 5000')` | 0.050 | Found 1 fact(s) |
192
- | `(and (eq foo 42.998) (or (gt bar 200) (absent zzz)))` | 0.060 | Found 0 fact(s) |
187
+ | --- | --: | --- |
188
+ | `fb.insert()` | 7.874 | Inserted 100000 facts |
189
+ | `(gt time '2024-03-23T03:21:43Z')` | 0.072 | Found 100000 fact(s) |
190
+ | `(gt cost 50)` | 0.069 | Found 50030 fact(s) |
191
+ | `(eq title 'Object Thinking 5000')` | 0.051 | Found 1 fact(s) |
192
+ | `(and (eq foo 42.998) (or (gt bar 200) (absent zzz)))` | 0.059 | Found 2 fact(s) |
193
193
  | `(eq id (agg (always) (max id)))` | 0.131 | Found 1 fact(s) |
194
- | `(join "c<=cost,b<=bar" (eq id (agg (always) (max id))))` | 0.708 | Found 100000 fact(s) |
195
- | `.export()` + `.import()` | 2.110 | 11407716 bytes |
194
+ | `(join "c<=cost,b<=bar" (eq id (agg (always) (max id))))` | 0.695 | Found 100000 fact(s) |
195
+ | `.export()` + `.import()` | 1.931 | 11407636 bytes |
196
196
 
197
197
  The results were calculated in [this GHA job][benchmark-gha]
198
- on 2025-01-27 at 16:25,
198
+ on 2025-01-27 at 16:51,
199
199
  on Linux with 4 CPUs.
200
200
  <!-- benchmark_end -->
201
201
 
202
- [benchmark-gha]: https://github.com/yegor256/factbase/actions/runs/12993508174
202
+ [benchmark-gha]: https://github.com/yegor256/factbase/actions/runs/12994018323
@@ -45,6 +45,11 @@ require_relative 'term_once'
45
45
  # License:: MIT
46
46
  class Factbase::Syntax
47
47
  # Ctor.
48
+ #
49
+ # The class provided as the +term+ argument must have a three-argument
50
+ # constructor, similar to the class +Factbase::Term+. Also, it must be
51
+ # a child of +Factbase::Term+.
52
+ #
48
53
  # @param [Factbase] fb Factbase
49
54
  # @param [String] query The query, for example "(eq id 42)"
50
55
  # @param [Class] term The class to instantiate to make every term
@@ -64,7 +69,7 @@ class Factbase::Syntax
64
69
  t
65
70
  end
66
71
  rescue StandardError => e
67
- err = "#{e.message} (#{e.backtrace[1]}) in \"#{@query}\""
72
+ err = "#{e.message} (#{e.backtrace.take(5).join('; ')}) in \"#{@query}\""
68
73
  err = "#{err}, tokens: #{@tokens}" unless @tokens.nil?
69
74
  raise err
70
75
  end
@@ -77,10 +82,10 @@ class Factbase::Syntax
77
82
  @tokens ||= to_tokens
78
83
  raise 'No tokens' if @tokens.empty?
79
84
  @ast ||= to_ast(@tokens, 0)
80
- raise 'Too many terms' if @ast[1] != @tokens.size
85
+ raise "Too many terms (#{@ast[1]} != #{@tokens.size})" if @ast[1] != @tokens.size
81
86
  term = @ast[0]
82
87
  raise 'No terms found' if term.nil?
83
- raise 'Not a term' unless term.is_a?(@term)
88
+ raise "Not a term: #{@term.class.name.inspect}" unless term.is_a?(@term)
84
89
  term
85
90
  end
86
91
 
@@ -164,7 +169,7 @@ class Factbase::Syntax
164
169
  elsif t.match?(/^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}Z$/)
165
170
  Time.parse(t)
166
171
  else
167
- raise "Wrong symbol format (#{t})" unless t.match?(/^[_a-z\$][a-zA-Z0-9_]*$/)
172
+ raise "Wrong symbol format (#{t})" unless t.match?(/^([_a-z][a-zA-Z0-9_]*|\$[a-z]+)$/)
168
173
  t.to_sym
169
174
  end
170
175
  end
data/lib/factbase.rb CHANGED
@@ -81,7 +81,7 @@ require 'yaml'
81
81
  # License:: MIT
82
82
  class Factbase
83
83
  # Current version of the gem (changed by .rultor.yml on every release)
84
- VERSION = '0.5.0'
84
+ VERSION = '0.5.1'
85
85
 
86
86
  # An exception that may be thrown in a transaction, to roll it back.
87
87
  class Rollback < StandardError; end
@@ -114,6 +114,7 @@ class TestSyntax < Minitest::Test
114
114
  '',
115
115
  '()',
116
116
  '(foo',
117
+ '(foo $)',
117
118
  '(foo 1) (bar 2)',
118
119
  'some text',
119
120
  '"hello, world!',
@@ -294,20 +294,21 @@ class TestFactbase < Minitest::Test
294
294
  # See details here https://github.com/yegor256/factbase/actions/runs/10492255419/job/29068637032
295
295
  def test_concurrent_transactions_inserts
296
296
  skip('Does not work')
297
+ total = 100
297
298
  fb = Factbase.new
298
- Threads.new(100).assert do |i|
299
+ Threads.new(total).assert do |i|
299
300
  fb.txn do |fbt|
300
301
  fact = fbt.insert
301
302
  fact.thread_id = i
302
303
  end
303
304
  end
304
- assert_equal(100, fb.size)
305
- assert_equal(100, fb.query('(exists thread_id)').each.to_a.size)
305
+ assert_equal(total, fb.size)
306
+ assert_equal(total, fb.query('(exists thread_id)').each.to_a.size)
306
307
  end
307
308
 
308
309
  def test_concurrent_transactions_with_rollbacks
309
310
  fb = Factbase.new
310
- Threads.new(100).assert do |i|
311
+ Threads.new.assert do |i|
311
312
  fb.txn do |fbt|
312
313
  fact = fbt.insert
313
314
  fact.thread_id = i
@@ -319,7 +320,8 @@ class TestFactbase < Minitest::Test
319
320
 
320
321
  def test_concurrent_transactions_successful
321
322
  fb = Factbase.new
322
- Threads.new(100).assert do |i|
323
+ total = 100
324
+ Threads.new(total).assert do |i|
323
325
  fb.txn do |fbt|
324
326
  fact = fbt.insert
325
327
  fact.thread_id = i
@@ -327,7 +329,7 @@ class TestFactbase < Minitest::Test
327
329
  end
328
330
  end
329
331
  facts = fb.query('(exists thread_id)').each.to_a
330
- assert_equal(100, facts.size)
332
+ assert_equal(total, facts.size)
331
333
  facts.each do |fact|
332
334
  assert_equal(fact.value, fact.thread_id * 10)
333
335
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: factbase
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.0
4
+ version: 0.5.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Yegor Bugayenko
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2025-01-27 00:00:00.000000000 Z
11
+ date: 2025-01-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: backtrace