factbase 0.0.27 → 0.0.28

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: 29134d600523642a5dd215f28aa9b48ec3337fec96d4dc41ea0500a3a4ee46c5
4
- data.tar.gz: 2335e295a7b5dfe6f3cb1eb5ace692cfbc32d788c91906a6f609249b26c4da13
3
+ metadata.gz: ffdf62af221a65ab9efa6097b01dab23edba0399bc8551757d450ff828f14367
4
+ data.tar.gz: 175dd8ead3a933305d46c8c4bb657a46efc507db3ad1045bb7495614dedfc1c2
5
5
  SHA512:
6
- metadata.gz: bf293f3f8ce5b6f1a515a071f771f1a8d84149e0198b0f11073900ed55a6b218bc2d4dcc65ecc439b777fb8163bb13b2f5d24bea9f2600639276183218f2d9f5
7
- data.tar.gz: ec4c0b3a780ea432b8560485b4a8c467d2b7fc165a1d29fd27b1e03d35f7f481cc11584b3f60100f4a63b308d84023304eb92f8f970cc105cff7e9eba06df0af
6
+ metadata.gz: ccade318b2db8568b72fcd29dd8d8cc301a791911a749bba8154485e8e95d1a00c2466477ff7e798f8a5146e87e03c69af8493fd05ae38c9463a8ffc9e29da62
7
+ data.tar.gz: 30730a5e848923b73c98f188142f30f56fd8eec95d8839561a6be01956922f60d9fe46a9dcf361b2f6b4bffca993fd20471bd51f1e2840659ba7bc252c9853b2
data/lib/factbase/term.rb CHANGED
@@ -97,18 +97,12 @@ class Factbase::Term
97
97
 
98
98
  def exists(fact)
99
99
  assert_args(1)
100
- o = @operands[0]
101
- raise "A symbol expected: #{o}" unless o.is_a?(Symbol)
102
- k = o.to_s
103
- !fact[k].nil?
100
+ !by_symbol(0, fact).nil?
104
101
  end
105
102
 
106
103
  def absent(fact)
107
104
  assert_args(1)
108
- o = @operands[0]
109
- raise "A symbol expected: #{o}" unless o.is_a?(Symbol)
110
- k = o.to_s
111
- fact[k].nil?
105
+ by_symbol(0, fact).nil?
112
106
  end
113
107
 
114
108
  def eq(fact)
@@ -125,38 +119,31 @@ class Factbase::Term
125
119
 
126
120
  def size(fact)
127
121
  assert_args(1)
128
- o = @operands[0]
129
- raise "A symbol expected: #{o}" unless o.is_a?(Symbol)
130
- k = o.to_s
131
- return 0 if fact[k].nil?
132
- return 1 unless fact[k].is_a?(Array)
133
- fact[k].size
122
+ v = by_symbol(0, fact)
123
+ return 0 if v.nil?
124
+ return 1 unless v.is_a?(Array)
125
+ v.size
134
126
  end
135
127
 
136
128
  def type(fact)
137
129
  assert_args(1)
138
- o = @operands[0]
139
- raise "A symbol expected: #{o}" unless o.is_a?(Symbol)
140
- k = o.to_s
141
- return 'nil' if fact[k].nil?
142
- fact[k].class.to_s
130
+ v = by_symbol(0, fact)
131
+ return 'nil' if v.nil?
132
+ v.class.to_s
143
133
  end
144
134
 
145
135
  def arithmetic(op, fact)
146
136
  assert_args(2)
147
- o = @operands[0]
148
- if o.is_a?(Factbase::Term)
149
- v = o.eval(fact)
150
- else
151
- raise "A symbol expected by #{op}: #{o}" unless o.is_a?(Symbol)
152
- k = o.to_s
153
- v = fact[k]
154
- end
155
- return false if v.nil?
156
- v = [v] unless v.is_a?(Array)
157
- v.any? do |vv|
158
- vv = vv.floor if vv.is_a?(Time) && op == :==
159
- vv.send(op, @operands[1])
137
+ lefts = the_value(0, fact)
138
+ return false if lefts.nil?
139
+ rights = the_value(1, fact)
140
+ return false if rights.nil?
141
+ lefts.any? do |l|
142
+ l = l.floor if l.is_a?(Time) && op == :==
143
+ rights.any? do |r|
144
+ r = r.floor if r.is_a?(Time) && op == :==
145
+ l.send(op, r)
146
+ end
160
147
  end
161
148
  end
162
149
 
@@ -165,4 +152,20 @@ class Factbase::Term
165
152
  raise "Too many (#{c}) operands for '#{@op}' (#{num} expected)" if c > num
166
153
  raise "Too few (#{c}) operands for '#{@op}' (#{num} expected)" if c < num
167
154
  end
155
+
156
+ def by_symbol(pos, fact)
157
+ o = @operands[pos]
158
+ raise "A symbol expected at ##{pos}, but provided: #{o}" unless o.is_a?(Symbol)
159
+ k = o.to_s
160
+ fact[k]
161
+ end
162
+
163
+ def the_value(pos, fact)
164
+ v = @operands[pos]
165
+ v = v.eval(fact) if v.is_a?(Factbase::Term)
166
+ v = fact[v.to_s] if v.is_a?(Symbol)
167
+ return v if v.nil?
168
+ v = [v] unless v.is_a?(Array)
169
+ v
170
+ end
168
171
  end
data/lib/factbase.rb CHANGED
@@ -29,7 +29,7 @@ require 'yaml'
29
29
  # License:: MIT
30
30
  class Factbase
31
31
  # Current version of the gem (changed by .rultor.yml on every release)
32
- VERSION = '0.0.27'
32
+ VERSION = '0.0.28'
33
33
 
34
34
  # Constructor.
35
35
  def initialize(facts = [])
@@ -54,9 +54,11 @@ class TestQuery < Minitest::Test
54
54
  "(and (lt pi 100) \n\n (gt num 1000))" => 0,
55
55
  '(exists pi)' => 1,
56
56
  '(not (exists hello))' => 3,
57
+ '(eq "Integer" (type num))' => 2,
57
58
  '(gt (size num) 2)' => 1,
58
59
  '(lt (size num) 2)' => 2,
59
60
  '(eq (size hello) 0)' => 3,
61
+ '(eq num pi)' => 0,
60
62
  '(absent time)' => 2,
61
63
  '(and (absent time) (exists pi))' => 1,
62
64
  "(and (exists time) (not (\t\texists pi)))" => 1,
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: factbase
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.27
4
+ version: 0.0.28
5
5
  platform: ruby
6
6
  authors:
7
7
  - Yegor Bugayenko