factbase 0.8.0 → 0.9.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.
Files changed (82) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +1 -1
  3. data/Gemfile +1 -1
  4. data/Gemfile.lock +13 -13
  5. data/README.md +24 -24
  6. data/REUSE.toml +7 -2
  7. data/Rakefile +8 -1
  8. data/benchmark/bench_factbase.rb +1 -1
  9. data/fixtures/stories/agg.yml +17 -0
  10. data/fixtures/stories/always.yml +16 -0
  11. data/fixtures/stories/as.yml +16 -0
  12. data/fixtures/stories/count.yml +18 -0
  13. data/fixtures/stories/eq.yml +30 -0
  14. data/fixtures/stories/gt.yml +18 -0
  15. data/fixtures/stories/join.yml +19 -0
  16. data/fixtures/stories/max.yml +14 -0
  17. data/fixtures/stories/min.yml +14 -0
  18. data/fixtures/stories/nth.yml +14 -0
  19. data/fixtures/stories/or.yml +18 -0
  20. data/fixtures/stories/sprintf.yml +12 -0
  21. data/fixtures/stories/sum.yml +14 -0
  22. data/lib/factbase/cached/cached_fact.rb +28 -0
  23. data/lib/factbase/cached/cached_factbase.rb +64 -0
  24. data/lib/factbase/cached/cached_query.rb +61 -0
  25. data/lib/factbase/cached/cached_term.rb +25 -0
  26. data/lib/factbase/fact.rb +13 -13
  27. data/lib/factbase/indexed/indexed_fact.rb +28 -0
  28. data/lib/factbase/indexed/indexed_factbase.rb +64 -0
  29. data/lib/factbase/indexed/indexed_query.rb +56 -0
  30. data/lib/factbase/indexed/indexed_term.rb +60 -0
  31. data/lib/factbase/inv.rb +18 -6
  32. data/lib/factbase/light.rb +7 -6
  33. data/lib/factbase/logged.rb +87 -62
  34. data/lib/factbase/query.rb +29 -34
  35. data/lib/factbase/rules.rb +16 -15
  36. data/lib/factbase/sync/sync_factbase.rb +57 -0
  37. data/lib/factbase/sync/sync_query.rb +61 -0
  38. data/lib/factbase/syntax.rb +12 -25
  39. data/lib/factbase/tallied.rb +11 -10
  40. data/lib/factbase/taped.rb +8 -0
  41. data/lib/factbase/tee.rb +2 -0
  42. data/lib/factbase/term.rb +45 -17
  43. data/lib/factbase/terms/aggregates.rb +17 -15
  44. data/lib/factbase/terms/aliases.rb +4 -4
  45. data/lib/factbase/terms/casting.rb +8 -8
  46. data/lib/factbase/terms/debug.rb +2 -2
  47. data/lib/factbase/terms/defn.rb +3 -3
  48. data/lib/factbase/terms/logical.rb +53 -14
  49. data/lib/factbase/terms/math.rb +26 -26
  50. data/lib/factbase/terms/meta.rb +14 -14
  51. data/lib/factbase/terms/ordering.rb +4 -4
  52. data/lib/factbase/terms/strings.rb +8 -8
  53. data/lib/factbase/terms/system.rb +3 -3
  54. data/lib/factbase.rb +67 -55
  55. data/test/factbase/cached/test_cached_factbase.rb +22 -0
  56. data/test/factbase/cached/test_cached_query.rb +79 -0
  57. data/test/factbase/indexed/test_indexed_query.rb +175 -0
  58. data/test/factbase/sync/test_sync_query.rb +30 -0
  59. data/test/factbase/terms/test_aggregates.rb +5 -5
  60. data/test/factbase/terms/test_aliases.rb +7 -7
  61. data/test/factbase/terms/test_casting.rb +8 -8
  62. data/test/factbase/terms/test_debug.rb +6 -6
  63. data/test/factbase/terms/test_defn.rb +14 -14
  64. data/test/factbase/terms/test_logical.rb +17 -19
  65. data/test/factbase/terms/test_math.rb +63 -61
  66. data/test/factbase/terms/test_meta.rb +36 -36
  67. data/test/factbase/terms/test_ordering.rb +9 -9
  68. data/test/factbase/terms/test_strings.rb +10 -10
  69. data/test/factbase/terms/test_system.rb +6 -6
  70. data/test/factbase/test_accum.rb +5 -5
  71. data/test/factbase/test_fact.rb +12 -12
  72. data/test/factbase/test_logged.rb +7 -0
  73. data/test/factbase/test_query.rb +110 -37
  74. data/test/factbase/test_rules.rb +1 -1
  75. data/test/factbase/test_syntax.rb +12 -12
  76. data/test/factbase/test_tee.rb +8 -8
  77. data/test/factbase/test_term.rb +39 -30
  78. data/test/test__helper.rb +2 -2
  79. data/test/test_factbase.rb +6 -0
  80. metadata +29 -4
  81. data/lib/factbase/query_once.rb +0 -54
  82. data/lib/factbase/term_once.rb +0 -67
@@ -12,109 +12,111 @@ require_relative '../../../lib/factbase/term'
12
12
  # License:: MIT
13
13
  class TestMath < Factbase::Test
14
14
  def test_simple
15
- t = Factbase::Term.new(Factbase.new, :eq, [:foo, 42])
16
- assert(t.evaluate(fact('foo' => [42]), []))
17
- refute(t.evaluate(fact('foo' => 'Hello!'), []))
18
- refute(t.evaluate(fact('bar' => ['Hello!']), []))
15
+ t = Factbase::Term.new(:eq, [:foo, 42])
16
+ assert(t.evaluate(fact('foo' => [42]), [], Factbase.new))
17
+ refute(t.evaluate(fact('foo' => 'Hello!'), [], Factbase.new))
18
+ refute(t.evaluate(fact('bar' => ['Hello!']), [], Factbase.new))
19
19
  end
20
20
 
21
21
  def test_zero
22
- t = Factbase::Term.new(Factbase.new, :zero, [:foo])
23
- assert(t.evaluate(fact('foo' => [0]), []))
24
- assert(t.evaluate(fact('foo' => [10, 5, 6, -8, 'hey', 0, 9, 'fdsf']), []))
25
- refute(t.evaluate(fact('foo' => [100]), []))
26
- refute(t.evaluate(fact('foo' => []), []))
27
- refute(t.evaluate(fact('bar' => []), []))
22
+ t = Factbase::Term.new(:zero, [:foo])
23
+ assert(t.evaluate(fact('foo' => [0]), [], Factbase.new))
24
+ assert(t.evaluate(fact('foo' => [10, 5, 6, -8, 'hey', 0, 9, 'fdsf']), [], Factbase.new))
25
+ refute(t.evaluate(fact('foo' => [100]), [], Factbase.new))
26
+ refute(t.evaluate(fact('foo' => []), [], Factbase.new))
27
+ refute(t.evaluate(fact('bar' => []), [], Factbase.new))
28
28
  end
29
29
 
30
30
  def test_eq
31
- t = Factbase::Term.new(Factbase.new, :eq, [:foo, 42])
32
- assert(t.evaluate(fact('foo' => 42), []))
33
- assert(t.evaluate(fact('foo' => [10, 5, 6, -8, 'hey', 42, 9, 'fdsf']), []))
34
- refute(t.evaluate(fact('foo' => [100]), []))
35
- refute(t.evaluate(fact('foo' => []), []))
36
- refute(t.evaluate(fact('bar' => []), []))
31
+ t = Factbase::Term.new(:eq, [:foo, 42])
32
+ assert(t.evaluate(fact('foo' => 42), [], Factbase.new))
33
+ assert(t.evaluate(fact('foo' => [10, 5, 6, -8, 'hey', 42, 9, 'fdsf']), [], Factbase.new))
34
+ refute(t.evaluate(fact('foo' => [100]), [], Factbase.new))
35
+ refute(t.evaluate(fact('foo' => []), [], Factbase.new))
36
+ refute(t.evaluate(fact('bar' => []), [], Factbase.new))
37
37
  end
38
38
 
39
39
  def test_eq_time
40
40
  now = Time.now
41
- t = Factbase::Term.new(Factbase.new, :eq, [:foo, Time.parse(now.iso8601)])
42
- assert(t.evaluate(fact('foo' => now), []))
43
- assert(t.evaluate(fact('foo' => [now, Time.now]), []))
41
+ t = Factbase::Term.new(:eq, [:foo, Time.parse(now.iso8601)])
42
+ assert(t.evaluate(fact('foo' => now), [], Factbase.new))
43
+ assert(t.evaluate(fact('foo' => [now, Time.now]), [], Factbase.new))
44
44
  end
45
45
 
46
46
  def test_lt
47
- t = Factbase::Term.new(Factbase.new, :lt, [:foo, 42])
48
- assert(t.evaluate(fact('foo' => [10]), []))
49
- refute(t.evaluate(fact('foo' => [100]), []))
50
- refute(t.evaluate(fact('foo' => 100), []))
51
- refute(t.evaluate(fact('bar' => 100), []))
47
+ t = Factbase::Term.new(:lt, [:foo, 42])
48
+ assert(t.evaluate(fact('foo' => [10]), [], Factbase.new))
49
+ refute(t.evaluate(fact('foo' => [100]), [], Factbase.new))
50
+ refute(t.evaluate(fact('foo' => 100), [], Factbase.new))
51
+ refute(t.evaluate(fact('bar' => 100), [], Factbase.new))
52
52
  end
53
53
 
54
54
  def test_gte
55
- t = Factbase::Term.new(Factbase.new, :gte, [:foo, 42])
56
- assert(t.evaluate(fact('foo' => 100), []))
57
- assert(t.evaluate(fact('foo' => 42), []))
58
- refute(t.evaluate(fact('foo' => 41), []))
55
+ t = Factbase::Term.new(:gte, [:foo, 42])
56
+ assert(t.evaluate(fact('foo' => 100), [], Factbase.new))
57
+ assert(t.evaluate(fact('foo' => 42), [], Factbase.new))
58
+ refute(t.evaluate(fact('foo' => 41), [], Factbase.new))
59
59
  end
60
60
 
61
61
  def test_lte
62
- t = Factbase::Term.new(Factbase.new, :lte, [:foo, 42])
63
- assert(t.evaluate(fact('foo' => 41), []))
64
- assert(t.evaluate(fact('foo' => 42), []))
65
- refute(t.evaluate(fact('foo' => 100), []))
62
+ t = Factbase::Term.new(:lte, [:foo, 42])
63
+ assert(t.evaluate(fact('foo' => 41), [], Factbase.new))
64
+ assert(t.evaluate(fact('foo' => 42), [], Factbase.new))
65
+ refute(t.evaluate(fact('foo' => 100), [], Factbase.new))
66
66
  end
67
67
 
68
68
  def test_gt
69
- t = Factbase::Term.new(Factbase.new, :gt, [:foo, 42])
70
- assert(t.evaluate(fact('foo' => [100]), []))
71
- assert(t.evaluate(fact('foo' => 100), []))
72
- refute(t.evaluate(fact('foo' => [10]), []))
73
- refute(t.evaluate(fact('foo' => 10), []))
74
- refute(t.evaluate(fact('bar' => 10), []))
69
+ t = Factbase::Term.new(:gt, [:foo, 42])
70
+ assert(t.evaluate(fact('foo' => [100]), [], Factbase.new))
71
+ assert(t.evaluate(fact('foo' => 100), [], Factbase.new))
72
+ refute(t.evaluate(fact('foo' => [10]), [], Factbase.new))
73
+ refute(t.evaluate(fact('foo' => 10), [], Factbase.new))
74
+ refute(t.evaluate(fact('bar' => 10), [], Factbase.new))
75
75
  end
76
76
 
77
77
  def test_lt_time
78
- t = Factbase::Term.new(Factbase.new, :lt, [:foo, Time.now])
79
- assert(t.evaluate(fact('foo' => [Time.now - 100]), []))
80
- refute(t.evaluate(fact('foo' => [Time.now + 100]), []))
81
- refute(t.evaluate(fact('bar' => [100]), []))
78
+ t = Factbase::Term.new(:lt, [:foo, Time.now])
79
+ assert(t.evaluate(fact('foo' => [Time.now - 100]), [], Factbase.new))
80
+ refute(t.evaluate(fact('foo' => [Time.now + 100]), [], Factbase.new))
81
+ refute(t.evaluate(fact('bar' => [100]), [], Factbase.new))
82
82
  end
83
83
 
84
84
  def test_gt_time
85
- t = Factbase::Term.new(Factbase.new, :gt, [:foo, Time.now])
86
- assert(t.evaluate(fact('foo' => [Time.now + 100]), []))
87
- refute(t.evaluate(fact('foo' => [Time.now - 100]), []))
88
- refute(t.evaluate(fact('bar' => [100]), []))
85
+ t = Factbase::Term.new(:gt, [:foo, Time.now])
86
+ assert(t.evaluate(fact('foo' => [Time.now + 100]), [], Factbase.new))
87
+ refute(t.evaluate(fact('foo' => [Time.now - 100]), [], Factbase.new))
88
+ refute(t.evaluate(fact('bar' => [100]), [], Factbase.new))
89
89
  end
90
90
 
91
91
  def test_plus
92
- t = Factbase::Term.new(Factbase.new, :plus, [:foo, 42])
93
- assert_equal(46, t.evaluate(fact('foo' => 4), []))
94
- assert_nil(t.evaluate(fact, []))
92
+ t = Factbase::Term.new(:plus, [:foo, 42])
93
+ assert_equal(46, t.evaluate(fact('foo' => 4), [], Factbase.new))
94
+ assert_nil(t.evaluate(fact, [], Factbase.new))
95
95
  end
96
96
 
97
97
  def test_plus_time
98
- t = Factbase::Term.new(Factbase.new, :plus, [:foo, '12 days'])
99
- assert_equal(Time.parse('2024-01-13'), t.evaluate(fact('foo' => Time.parse('2024-01-01')), []))
100
- assert_nil(t.evaluate(fact, []))
98
+ t = Factbase::Term.new(:plus, [:foo, '12 days'])
99
+ assert_equal(Time.parse('2024-01-13'), t.evaluate(fact('foo' => Time.parse('2024-01-01')), [], Factbase.new))
100
+ assert_nil(t.evaluate(fact, [], Factbase.new))
101
101
  end
102
102
 
103
103
  def test_minus
104
- t = Factbase::Term.new(Factbase.new, :minus, [:foo, 42])
105
- assert_equal(58, t.evaluate(fact('foo' => 100), []))
106
- assert_nil(t.evaluate(fact, []))
104
+ t = Factbase::Term.new(:minus, [:foo, 42])
105
+ assert_equal(58, t.evaluate(fact('foo' => 100), [], Factbase.new))
106
+ assert_nil(t.evaluate(fact, [], Factbase.new))
107
107
  end
108
108
 
109
109
  def test_minus_time
110
- t = Factbase::Term.new(Factbase.new, :minus, [:foo, '4 hours'])
111
- assert_equal(Time.parse('2024-01-01T06:04'), t.evaluate(fact('foo' => Time.parse('2024-01-01T10:04')), []))
112
- assert_nil(t.evaluate(fact, []))
110
+ t = Factbase::Term.new(:minus, [:foo, '4 hours'])
111
+ assert_equal(Time.parse('2024-01-01T06:04'),
112
+ t.evaluate(fact('foo' => Time.parse('2024-01-01T10:04')), [], Factbase.new))
113
+ assert_nil(t.evaluate(fact, [], Factbase.new))
113
114
  end
114
115
 
115
116
  def test_minus_time_singular
116
- t = Factbase::Term.new(Factbase.new, :minus, [:foo, '1 hour'])
117
- assert_equal(Time.parse('2024-01-01T09:04'), t.evaluate(fact('foo' => Time.parse('2024-01-01T10:04')), []))
118
- assert_nil(t.evaluate(fact, []))
117
+ t = Factbase::Term.new(:minus, [:foo, '1 hour'])
118
+ assert_equal(Time.parse('2024-01-01T09:04'),
119
+ t.evaluate(fact('foo' => Time.parse('2024-01-01T10:04')), [], Factbase.new))
120
+ assert_nil(t.evaluate(fact, [], Factbase.new))
119
121
  end
120
122
  end
@@ -12,59 +12,59 @@ require_relative '../../../lib/factbase/term'
12
12
  # License:: MIT
13
13
  class TestMeta < Factbase::Test
14
14
  def test_exists
15
- t = Factbase::Term.new(Factbase.new, :exists, [:foo])
16
- assert(t.evaluate(fact('foo' => 41), []))
17
- refute(t.evaluate(fact('bar' => 41), []))
15
+ t = Factbase::Term.new(:exists, [:foo])
16
+ assert(t.evaluate(fact('foo' => 41), [], Factbase.new))
17
+ refute(t.evaluate(fact('bar' => 41), [], Factbase.new))
18
18
  end
19
19
 
20
20
  def test_absent
21
- t = Factbase::Term.new(Factbase.new, :absent, [:foo])
22
- refute(t.evaluate(fact('foo' => 41), []))
23
- assert(t.evaluate(fact('bar' => 41), []))
21
+ t = Factbase::Term.new(:absent, [:foo])
22
+ refute(t.evaluate(fact('foo' => 41), [], Factbase.new))
23
+ assert(t.evaluate(fact('bar' => 41), [], Factbase.new))
24
24
  end
25
25
 
26
26
  def test_size
27
- t = Factbase::Term.new(Factbase.new, :size, [:foo])
28
- assert_equal(1, t.evaluate(fact('foo' => 41), []))
29
- assert_equal(0, t.evaluate(fact('foo' => nil), []))
30
- assert_equal(4, t.evaluate(fact('foo' => [1, 2, 3, 4]), []))
31
- assert_equal(0, t.evaluate(fact('foo' => []), []))
32
- assert_equal(1, t.evaluate(fact('foo' => ''), []))
27
+ t = Factbase::Term.new(:size, [:foo])
28
+ assert_equal(1, t.evaluate(fact('foo' => 41), [], Factbase.new))
29
+ assert_equal(0, t.evaluate(fact('foo' => nil), [], Factbase.new))
30
+ assert_equal(4, t.evaluate(fact('foo' => [1, 2, 3, 4]), [], Factbase.new))
31
+ assert_equal(0, t.evaluate(fact('foo' => []), [], Factbase.new))
32
+ assert_equal(1, t.evaluate(fact('foo' => ''), [], Factbase.new))
33
33
  end
34
34
 
35
35
  def test_type
36
- t = Factbase::Term.new(Factbase.new, :type, [:foo])
37
- assert_equal('nil', t.evaluate(fact('foo' => nil), []))
38
- assert_equal('Integer', t.evaluate(fact('foo' => [1]), []))
39
- assert_equal('Array', t.evaluate(fact('foo' => [1, 2]), []))
40
- assert_equal('String', t.evaluate(fact('foo' => 'bar'), []))
41
- assert_equal('Float', t.evaluate(fact('foo' => 2.1), []))
42
- assert_equal('Time', t.evaluate(fact('foo' => Time.now), []))
36
+ t = Factbase::Term.new(:type, [:foo])
37
+ assert_equal('nil', t.evaluate(fact('foo' => nil), [], Factbase.new))
38
+ assert_equal('Integer', t.evaluate(fact('foo' => [1]), [], Factbase.new))
39
+ assert_equal('Array', t.evaluate(fact('foo' => [1, 2]), [], Factbase.new))
40
+ assert_equal('String', t.evaluate(fact('foo' => 'bar'), [], Factbase.new))
41
+ assert_equal('Float', t.evaluate(fact('foo' => 2.1), [], Factbase.new))
42
+ assert_equal('Time', t.evaluate(fact('foo' => Time.now), [], Factbase.new))
43
43
  end
44
44
 
45
45
  def test_nil
46
- t = Factbase::Term.new(Factbase.new, :nil, [:foo])
47
- assert(t.evaluate(fact('foo' => nil), []))
48
- refute(t.evaluate(fact('foo' => true), []))
49
- refute(t.evaluate(fact('foo' => 'bar'), []))
46
+ t = Factbase::Term.new(:nil, [:foo])
47
+ assert(t.evaluate(fact('foo' => nil), [], Factbase.new))
48
+ refute(t.evaluate(fact('foo' => true), [], Factbase.new))
49
+ refute(t.evaluate(fact('foo' => 'bar'), [], Factbase.new))
50
50
  end
51
51
 
52
52
  def test_many
53
- t = Factbase::Term.new(Factbase.new, :many, [:foo])
54
- refute(t.evaluate(fact('foo' => nil), []))
55
- refute(t.evaluate(fact('foo' => 1), []))
56
- refute(t.evaluate(fact('foo' => '1234'), []))
57
- assert(t.evaluate(fact('foo' => [1, 3, 5]), []))
58
- refute(t.evaluate(fact('foo' => []), []))
53
+ t = Factbase::Term.new(:many, [:foo])
54
+ refute(t.evaluate(fact('foo' => nil), [], Factbase.new))
55
+ refute(t.evaluate(fact('foo' => 1), [], Factbase.new))
56
+ refute(t.evaluate(fact('foo' => '1234'), [], Factbase.new))
57
+ assert(t.evaluate(fact('foo' => [1, 3, 5]), [], Factbase.new))
58
+ refute(t.evaluate(fact('foo' => []), [], Factbase.new))
59
59
  end
60
60
 
61
61
  def test_one
62
- t = Factbase::Term.new(Factbase.new, :one, [:foo])
63
- assert(t.evaluate(fact('foo' => 1), []))
64
- assert(t.evaluate(fact('foo' => '1234'), []))
65
- assert(t.evaluate(fact('foo' => [1]), []))
66
- refute(t.evaluate(fact('foo' => nil), []))
67
- refute(t.evaluate(fact('foo' => [1, 3, 5]), []))
68
- refute(t.evaluate(fact('foo' => []), []))
62
+ t = Factbase::Term.new(:one, [:foo])
63
+ assert(t.evaluate(fact('foo' => 1), [], Factbase.new))
64
+ assert(t.evaluate(fact('foo' => '1234'), [], Factbase.new))
65
+ assert(t.evaluate(fact('foo' => [1]), [], Factbase.new))
66
+ refute(t.evaluate(fact('foo' => nil), [], Factbase.new))
67
+ refute(t.evaluate(fact('foo' => [1, 3, 5]), [], Factbase.new))
68
+ refute(t.evaluate(fact('foo' => []), [], Factbase.new))
69
69
  end
70
70
  end
@@ -12,17 +12,17 @@ require_relative '../../../lib/factbase/term'
12
12
  # License:: MIT
13
13
  class TestOrdering < Factbase::Test
14
14
  def test_prev
15
- t = Factbase::Term.new(Factbase.new, :prev, [:foo])
16
- assert_nil(t.evaluate(fact('foo' => 41), []))
17
- assert_equal([41], t.evaluate(fact('foo' => 5), []))
18
- assert_equal([5], t.evaluate(fact('foo' => 6), []))
15
+ t = Factbase::Term.new(:prev, [:foo])
16
+ assert_nil(t.evaluate(fact('foo' => 41), [], Factbase.new))
17
+ assert_equal([41], t.evaluate(fact('foo' => 5), [], Factbase.new))
18
+ assert_equal([5], t.evaluate(fact('foo' => 6), [], Factbase.new))
19
19
  end
20
20
 
21
21
  def test_unique
22
- t = Factbase::Term.new(Factbase.new, :unique, [:foo])
23
- refute(t.evaluate(fact, []))
24
- assert(t.evaluate(fact('foo' => 41), []))
25
- refute(t.evaluate(fact('foo' => 41), []))
26
- assert(t.evaluate(fact('foo' => 1), []))
22
+ t = Factbase::Term.new(:unique, [:foo])
23
+ refute(t.evaluate(fact, [], Factbase.new))
24
+ assert(t.evaluate(fact('foo' => 41), [], Factbase.new))
25
+ refute(t.evaluate(fact('foo' => 41), [], Factbase.new))
26
+ assert(t.evaluate(fact('foo' => 1), [], Factbase.new))
27
27
  end
28
28
  end
@@ -12,25 +12,25 @@ require_relative '../../../lib/factbase/term'
12
12
  # License:: MIT
13
13
  class TestStrings < Factbase::Test
14
14
  def test_regexp_matching
15
- t = Factbase::Term.new(Factbase.new, :matches, [:foo, '[a-z]+'])
16
- assert(t.evaluate(fact('foo' => 'hello'), []))
17
- assert(t.evaluate(fact('foo' => 'hello 42'), []))
18
- refute(t.evaluate(fact('foo' => 42), []))
15
+ t = Factbase::Term.new(:matches, [:foo, '[a-z]+'])
16
+ assert(t.evaluate(fact('foo' => 'hello'), [], Factbase.new))
17
+ assert(t.evaluate(fact('foo' => 'hello 42'), [], Factbase.new))
18
+ refute(t.evaluate(fact('foo' => 42), [], Factbase.new))
19
19
  end
20
20
 
21
21
  def test_concat
22
- t = Factbase::Term.new(Factbase.new, :concat, [42, 'hi', 3.14, :hey, Time.now])
23
- s = t.evaluate(fact, [])
22
+ t = Factbase::Term.new(:concat, [42, 'hi', 3.14, :hey, Time.now])
23
+ s = t.evaluate(fact, [], Factbase.new)
24
24
  assert(s.start_with?('42hi3.14'))
25
25
  end
26
26
 
27
27
  def test_concat_empty
28
- t = Factbase::Term.new(Factbase.new, :concat, [])
29
- assert_equal('', t.evaluate(fact, []))
28
+ t = Factbase::Term.new(:concat, [])
29
+ assert_equal('', t.evaluate(fact, [], Factbase.new))
30
30
  end
31
31
 
32
32
  def test_sprintf
33
- t = Factbase::Term.new(Factbase.new, :sprintf, ['hi, %s!', 'Jeff'])
34
- assert_equal('hi, Jeff!', t.evaluate(fact, []))
33
+ t = Factbase::Term.new(:sprintf, ['hi, %s!', 'Jeff'])
34
+ assert_equal('hi, Jeff!', t.evaluate(fact, [], Factbase.new))
35
35
  end
36
36
  end
@@ -13,19 +13,19 @@ require_relative '../../../lib/factbase/term'
13
13
  class TestSystem < Factbase::Test
14
14
  def test_env
15
15
  ENV.store('FOO', 'bar')
16
- t = Factbase::Term.new(Factbase.new, :env, ['FOO', ''])
17
- assert_equal('bar', t.evaluate(fact, []))
16
+ t = Factbase::Term.new(:env, ['FOO', ''])
17
+ assert_equal('bar', t.evaluate(fact, [], Factbase.new))
18
18
  end
19
19
 
20
20
  def test_default
21
21
  ENV.delete('FOO')
22
- t = Factbase::Term.new(Factbase.new, :env, ['FOO', 'мой друг'])
23
- assert_equal('мой друг', t.evaluate(fact, []))
22
+ t = Factbase::Term.new(:env, ['FOO', 'мой друг'])
23
+ assert_equal('мой друг', t.evaluate(fact, [], Factbase.new))
24
24
  end
25
25
 
26
26
  def test_when_default_is_absent
27
27
  ENV.delete('FOO')
28
- t = Factbase::Term.new(Factbase.new, :env, ['FOO'])
29
- assert_raises(StandardError) { t.evaluate(fact, []) }
28
+ t = Factbase::Term.new(:env, ['FOO'])
29
+ assert_raises(StandardError) { t.evaluate(fact, [], Factbase.new) }
30
30
  end
31
31
  end
@@ -15,7 +15,7 @@ require_relative '../../lib/factbase/fact'
15
15
  class TestAccum < Factbase::Test
16
16
  def test_holds_props
17
17
  map = {}
18
- f = Factbase::Fact.new(Factbase.new, Mutex.new, map)
18
+ f = Factbase::Fact.new(map)
19
19
  props = {}
20
20
  a = Factbase::Accum.new(f, props, false)
21
21
  a.foo = 42
@@ -26,7 +26,7 @@ class TestAccum < Factbase::Test
26
26
 
27
27
  def test_passes_props
28
28
  map = {}
29
- f = Factbase::Fact.new(Factbase.new, Mutex.new, map)
29
+ f = Factbase::Fact.new(map)
30
30
  props = {}
31
31
  a = Factbase::Accum.new(f, props, true)
32
32
  a.foo = 42
@@ -37,7 +37,7 @@ class TestAccum < Factbase::Test
37
37
 
38
38
  def test_appends_props
39
39
  map = {}
40
- f = Factbase::Fact.new(Factbase.new, Mutex.new, map)
40
+ f = Factbase::Fact.new(map)
41
41
  f.foo = 42
42
42
  props = {}
43
43
  a = Factbase::Accum.new(f, props, false)
@@ -46,14 +46,14 @@ class TestAccum < Factbase::Test
46
46
  end
47
47
 
48
48
  def test_empties
49
- f = Factbase::Fact.new(Factbase.new, Mutex.new, {})
49
+ f = Factbase::Fact.new({})
50
50
  a = Factbase::Accum.new(f, {}, false)
51
51
  assert_nil(a['foo'])
52
52
  end
53
53
 
54
54
  def test_prints_to_string
55
55
  map = {}
56
- f = Factbase::Fact.new(Factbase.new, Mutex.new, map)
56
+ f = Factbase::Fact.new(map)
57
57
  props = {}
58
58
  a = Factbase::Accum.new(f, props, true)
59
59
  a.foo = 42
@@ -14,7 +14,7 @@ require_relative '../../lib/factbase/fact'
14
14
  class TestFact < Factbase::Test
15
15
  def test_injects_data_correctly
16
16
  map = {}
17
- f = Factbase::Fact.new(Factbase.new, Mutex.new, map)
17
+ f = Factbase::Fact.new(map)
18
18
  f.foo = 1
19
19
  f.bar = 2
20
20
  f.bar = 3
@@ -25,7 +25,7 @@ class TestFact < Factbase::Test
25
25
 
26
26
  def test_simple_resetting
27
27
  map = {}
28
- f = Factbase::Fact.new(Factbase.new, Mutex.new, map)
28
+ f = Factbase::Fact.new(map)
29
29
  f.foo = 42
30
30
  assert_equal(42, f.foo, f.to_s)
31
31
  f.foo = 256
@@ -35,7 +35,7 @@ class TestFact < Factbase::Test
35
35
 
36
36
  def test_keeps_values_unique
37
37
  map = {}
38
- f = Factbase::Fact.new(Factbase.new, Mutex.new, map)
38
+ f = Factbase::Fact.new(map)
39
39
  f.foo = 42
40
40
  f.foo = 'Hello'
41
41
  assert_equal(2, map['foo'].size)
@@ -44,28 +44,28 @@ class TestFact < Factbase::Test
44
44
  end
45
45
 
46
46
  def test_fails_when_empty
47
- f = Factbase::Fact.new(Factbase.new, Mutex.new, {})
47
+ f = Factbase::Fact.new({})
48
48
  assert_raises(StandardError) do
49
49
  f.something
50
50
  end
51
51
  end
52
52
 
53
53
  def test_fails_when_setting_nil
54
- f = Factbase::Fact.new(Factbase.new, Mutex.new, {})
54
+ f = Factbase::Fact.new({})
55
55
  assert_raises(StandardError) do
56
56
  f.foo = nil
57
57
  end
58
58
  end
59
59
 
60
60
  def test_fails_when_setting_empty
61
- f = Factbase::Fact.new(Factbase.new, Mutex.new, {})
61
+ f = Factbase::Fact.new({})
62
62
  assert_raises(StandardError) do
63
63
  f.foo = ''
64
64
  end
65
65
  end
66
66
 
67
67
  def test_fails_when_not_found
68
- f = Factbase::Fact.new(Factbase.new, Mutex.new, {})
68
+ f = Factbase::Fact.new({})
69
69
  f.first = 42
70
70
  assert_raises(StandardError) do
71
71
  f.second
@@ -73,21 +73,21 @@ class TestFact < Factbase::Test
73
73
  end
74
74
 
75
75
  def test_set_by_name
76
- f = Factbase::Fact.new(Factbase.new, Mutex.new, {})
76
+ f = Factbase::Fact.new({})
77
77
  f.send(:_foo_bar=, 42)
78
78
  assert_equal(42, f._foo_bar, f.to_s)
79
79
  end
80
80
 
81
81
  def test_set_twice_same_value
82
82
  map = {}
83
- f = Factbase::Fact.new(Factbase.new, Mutex.new, map)
83
+ f = Factbase::Fact.new(map)
84
84
  f.foo = 42
85
85
  f.foo = 42
86
86
  assert_equal([42], map['foo'])
87
87
  end
88
88
 
89
89
  def test_time_in_utc
90
- f = Factbase::Fact.new(Factbase.new, Mutex.new, {})
90
+ f = Factbase::Fact.new({})
91
91
  t = Time.now
92
92
  f.foo = t
93
93
  assert_equal(t.utc, f.foo)
@@ -95,13 +95,13 @@ class TestFact < Factbase::Test
95
95
  end
96
96
 
97
97
  def test_some_names_are_prohibited
98
- f = Factbase::Fact.new(Factbase.new, Mutex.new, {})
98
+ f = Factbase::Fact.new({})
99
99
  assert_raises(StandardError) { f.to_s = 42 }
100
100
  assert_raises(StandardError) { f.class = 42 }
101
101
  end
102
102
 
103
103
  def test_get_all_properties
104
- f = Factbase::Fact.new(Factbase.new, Mutex.new, {})
104
+ f = Factbase::Fact.new({})
105
105
  f.foo = 42
106
106
  assert_includes(f.all_properties, 'foo')
107
107
  end
@@ -48,6 +48,13 @@ class TestLogged < Factbase::Test
48
48
  assert_includes(log.to_s, 'touched', log)
49
49
  end
50
50
 
51
+ def test_with_slow_txn
52
+ log = Loog::Buffer.new
53
+ fb = Factbase::Logged.new(Factbase.new, log, time_tolerate: 0.1)
54
+ fb.txn { sleep 0.4 }
55
+ assert_includes(log.to_s, '(slow!)', log)
56
+ end
57
+
51
58
  def test_with_txn_rollback
52
59
  log = Loog::Buffer.new
53
60
  fb = Factbase::Logged.new(Factbase.new, log)