predicate 2.7.0 → 2.8.0

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
- SHA1:
3
- metadata.gz: 9cef06edb829e0b79b74be5d6f69b329f1cc6656
4
- data.tar.gz: 32535df41b6b08a634d818308c05424509683b58
2
+ SHA256:
3
+ metadata.gz: 3b905f4aeb37f046ccef6ac9b7afc674f19f3a91f865be488354daecc8ef28f1
4
+ data.tar.gz: d205d1b1e789b2f549ccfe6181f7dfc66a7a650346050c1497521000e243f85f
5
5
  SHA512:
6
- metadata.gz: 650836d9f3b0534271a38b2e58f59f4f93aad9fad9b60017777a0c1ab91e373ffe458d1a77bcc2309405c267b657c89121abb401f6687d19f8f79196d209dd06
7
- data.tar.gz: 70a98a7269cda44050632396a4c90cfafddf16a8b06b1dc76fc1962cab7b4e8520e64244dc20cbf8e2369cbf21e7733f913d7b80cffa4dda0ec26b81decaaaae
6
+ metadata.gz: a9ec299aaa242f521d53042df037536e618e00cceebe612c56d083eb3ea62ae7175c9dcfefe45b9dcf52df3b22c4a594a6c1456047a807a924ae4fb0029a60c4
7
+ data.tar.gz: c3f88782791b4fbb0d645be5d24a7bfb54b4bddc7128b30b84e60c2fc66f9bb9fa4407620dcbed6f12cb8773fb112cf223ab38cbc96a43fd8c15c96ba66f0e9d
@@ -0,0 +1,12 @@
1
+ require 'minitest'
2
+ class Predicate
3
+ class Asserter
4
+ include Minitest::Assertions
5
+
6
+ def initialize
7
+ @assertions = 0
8
+ end
9
+ attr_accessor :assertions
10
+
11
+ end # class Asserter
12
+ end # class Predicate
@@ -30,6 +30,7 @@ require_relative 'nodes/gte'
30
30
  require_relative 'nodes/lt'
31
31
  require_relative 'nodes/lte'
32
32
  require_relative 'nodes/in'
33
+ require_relative 'nodes/exists'
33
34
  require_relative 'nodes/set_op'
34
35
  require_relative 'nodes/intersect'
35
36
  require_relative 'nodes/subset'
@@ -15,6 +15,7 @@ rules:
15
15
  - gt
16
16
  - gte
17
17
  - in
18
+ - exists
18
19
  - intersect
19
20
  - subset
20
21
  - superset
@@ -72,6 +73,7 @@ rules:
72
73
  - literal
73
74
  - placeholder
74
75
  - opaque
76
+ - exists
75
77
  varref:
76
78
  - qualified_identifier
77
79
  - identifier
@@ -84,6 +86,8 @@ rules:
84
86
  - "::Predicate::Placeholder"
85
87
  opaque:
86
88
  - "::Object"
89
+ exists:
90
+ - "::Object"
87
91
  handler:
88
92
  - "::Object"
89
93
  options:
@@ -46,6 +46,12 @@ class Predicate
46
46
  left.evaluate(tuple) == right.evaluate(tuple)
47
47
  end
48
48
 
49
+ def assert!(tuple, asserter = Asserter.new)
50
+ l, r = left.evaluate(tuple), right.evaluate(tuple)
51
+ asserter.assert_equal(l, r)
52
+ l
53
+ end
54
+
49
55
  def to_hash
50
56
  if left.identifier? && right.literal? && !right.has_placeholder?
51
57
  { left.name => right.value }
@@ -0,0 +1,16 @@
1
+ class Predicate
2
+ module Exists
3
+ include Expr
4
+
5
+ def priority; 100; end
6
+
7
+ def free_variables
8
+ @free_variables ||= []
9
+ end
10
+
11
+ def evaluate(tuple)
12
+ raise NotImplementedError, "Exists#evaluate is not defined"
13
+ end
14
+
15
+ end
16
+ end
@@ -50,6 +50,10 @@ class Predicate
50
50
  sexpr([:or, self, other])
51
51
  end
52
52
 
53
+ def assert!(tuple, asserter = Asserter.new)
54
+ asserter.assert(evaluate(tuple))
55
+ end
56
+
53
57
  def and_split(attr_list)
54
58
  # If we have no reference to attr_list, then we are P2, else we are P1
55
59
  (free_variables & attr_list).empty? ? [ tautology, self ] : [ self, tautology ]
@@ -10,5 +10,11 @@ class Predicate
10
10
  left.evaluate(tuple) != right.evaluate(tuple)
11
11
  end
12
12
 
13
+ def assert!(tuple, asserter = Asserter.new)
14
+ l, r = left.evaluate(tuple), right.evaluate(tuple)
15
+ asserter.refute_equal(l, r)
16
+ l
17
+ end
18
+
13
19
  end
14
20
  end
@@ -1,7 +1,7 @@
1
1
  class Predicate
2
2
  module Version
3
3
  MAJOR = 2
4
- MINOR = 7
4
+ MINOR = 8
5
5
  TINY = 0
6
6
  end
7
7
  VERSION = "#{Version::MAJOR}.#{Version::MINOR}.#{Version::TINY}"
data/lib/predicate.rb CHANGED
@@ -6,6 +6,7 @@ require_relative 'predicate/sugar'
6
6
  require_relative 'predicate/grammar'
7
7
  require_relative 'predicate/processors'
8
8
  require_relative 'predicate/dsl'
9
+ require_relative 'predicate/asserter'
9
10
  class Predicate
10
11
 
11
12
  class Error < StandardError; end
@@ -125,6 +126,10 @@ class Predicate
125
126
  expr.evaluate(tuple)
126
127
  end
127
128
 
129
+ def assert!(tuple = {})
130
+ expr.assert!(tuple)
131
+ end
132
+
128
133
  # Splits this predicate, say P, as too predicates P1 & P2
129
134
  # such that `P <=> P1 & P2` and P2 makes no reference to
130
135
  # any attribute in `attr_list`.
@@ -0,0 +1,67 @@
1
+ require 'spec_helper'
2
+ class Predicate
3
+ describe Predicate, "assert!" do
4
+
5
+ describe "eq" do
6
+ let(:predicate) {
7
+ Predicate.eq(:x, 2)
8
+ }
9
+
10
+ subject{
11
+ predicate.assert!(input)
12
+ }
13
+
14
+ context "when ok" do
15
+ let(:input){
16
+ { x: 2 }
17
+ }
18
+ it 'works and returns 2' do
19
+ expect(subject).to eql(2)
20
+ end
21
+ end
22
+
23
+ context "when ko" do
24
+ let(:input){
25
+ { x: 3 }
26
+ }
27
+ it 'works and throws' do
28
+ expect{
29
+ subject
30
+ }.to raise_error(Minitest::Assertion, /Expected: 3\s+Actual: 2/)
31
+ end
32
+ end
33
+ end
34
+
35
+ describe "neq" do
36
+ let(:predicate) {
37
+ Predicate.neq(:x, 2)
38
+ }
39
+
40
+ subject{
41
+ predicate.assert!(input)
42
+ }
43
+
44
+ context "when ok" do
45
+ let(:input){
46
+ { x: 3 }
47
+ }
48
+ it 'works and returns 3' do
49
+ expect(subject).to eql(3)
50
+ end
51
+ end
52
+
53
+ context "when ko" do
54
+ let(:input){
55
+ { x: 2 }
56
+ }
57
+ it 'works and throws' do
58
+ expect{
59
+ subject
60
+ }.to raise_error(Minitest::Assertion, /Expected 2 to not be equal to 2./)
61
+ end
62
+ end
63
+ end
64
+
65
+ end
66
+ end
67
+
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: predicate
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.7.0
4
+ version: 2.8.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Bernard Lambeau
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-02-10 00:00:00.000000000 Z
11
+ date: 2023-06-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: sexpr
@@ -16,14 +16,28 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '1.0'
19
+ version: '1.1'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '1.0'
26
+ version: '1.1'
27
+ - !ruby/object:Gem::Dependency
28
+ name: minitest
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '5.0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '5.0'
27
41
  - !ruby/object:Gem::Dependency
28
42
  name: rake
29
43
  requirement: !ruby/object:Gem::Requirement
@@ -107,6 +121,7 @@ files:
107
121
  - Rakefile
108
122
  - bin/g
109
123
  - lib/predicate.rb
124
+ - lib/predicate/asserter.rb
110
125
  - lib/predicate/dsl.rb
111
126
  - lib/predicate/factory.rb
112
127
  - lib/predicate/grammar.rb
@@ -118,6 +133,7 @@ files:
118
133
  - lib/predicate/nodes/dyadic_comp.rb
119
134
  - lib/predicate/nodes/empty.rb
120
135
  - lib/predicate/nodes/eq.rb
136
+ - lib/predicate/nodes/exists.rb
121
137
  - lib/predicate/nodes/expr.rb
122
138
  - lib/predicate/nodes/gt.rb
123
139
  - lib/predicate/nodes/gte.rb
@@ -218,6 +234,7 @@ files:
218
234
  - spec/postgres/test_to_postgres.rb
219
235
  - spec/postgres/test_to_sequel.rb
220
236
  - spec/predicate/test_and_split.rb
237
+ - spec/predicate/test_assert!.rb
221
238
  - spec/predicate/test_attr_split.rb
222
239
  - spec/predicate/test_bind.rb
223
240
  - spec/predicate/test_bool_and.rb
@@ -263,8 +280,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
263
280
  - !ruby/object:Gem::Version
264
281
  version: '0'
265
282
  requirements: []
266
- rubyforge_project:
267
- rubygems_version: 2.6.14.4
283
+ rubygems_version: 3.1.6
268
284
  signing_key:
269
285
  specification_version: 4
270
286
  summary: Predicate provides a simple class and processors to encode and manipulate