factbase 0.0.27 → 0.0.28

Sign up to get free protection for your applications and to get access to all the features.
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