predicate 2.7.1 → 2.8.0

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
- SHA1:
3
- metadata.gz: 54c6504038763935a1edd5cad47538b4f1d60617
4
- data.tar.gz: 897b77cb9b664155976a0c816e5525e7ac6a53e0
2
+ SHA256:
3
+ metadata.gz: 3b905f4aeb37f046ccef6ac9b7afc674f19f3a91f865be488354daecc8ef28f1
4
+ data.tar.gz: d205d1b1e789b2f549ccfe6181f7dfc66a7a650346050c1497521000e243f85f
5
5
  SHA512:
6
- metadata.gz: a2ea154bb6d8ba3207002db0302ba021038b9f952effc68d89bead03a9e1da6601f272eff0d0e4263d0ae701c15069942ab7fd3a91d17ccac4ff6ebafba58495
7
- data.tar.gz: 0ec3739cbd3b6ee4e5e61f97e85a8db546e531dbf8936581cc5a5b7e2ac026113eda6f65628cfc6d000453dfdb943ad80eab5c654f1871cc683930eeae6c9186
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
@@ -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 }
@@ -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,8 +1,8 @@
1
1
  class Predicate
2
2
  module Version
3
3
  MAJOR = 2
4
- MINOR = 7
5
- TINY = 1
4
+ MINOR = 8
5
+ TINY = 0
6
6
  end
7
7
  VERSION = "#{Version::MAJOR}.#{Version::MINOR}.#{Version::TINY}"
8
8
  end
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.1
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-04-21 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
@@ -219,6 +234,7 @@ files:
219
234
  - spec/postgres/test_to_postgres.rb
220
235
  - spec/postgres/test_to_sequel.rb
221
236
  - spec/predicate/test_and_split.rb
237
+ - spec/predicate/test_assert!.rb
222
238
  - spec/predicate/test_attr_split.rb
223
239
  - spec/predicate/test_bind.rb
224
240
  - spec/predicate/test_bool_and.rb
@@ -264,8 +280,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
264
280
  - !ruby/object:Gem::Version
265
281
  version: '0'
266
282
  requirements: []
267
- rubyforge_project:
268
- rubygems_version: 2.6.14.4
283
+ rubygems_version: 3.1.6
269
284
  signing_key:
270
285
  specification_version: 4
271
286
  summary: Predicate provides a simple class and processors to encode and manipulate