predicate 2.10.0 → 2.12.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
2
  SHA256:
3
- metadata.gz: ba74ff534d4a9b58d4fdc9dc671d17275d9d01d65b391b509be68fd6500fb75b
4
- data.tar.gz: 964c06320295c968a80547e7af048bfd6382638414e724734f7b79ab9c739ac1
3
+ metadata.gz: '09ccf1574a1c60ddbbc1098e0366b64bef8ac7293a68beadc6a62703ee226157'
4
+ data.tar.gz: 8f2ab6ebda4b51e7daf12b747bb0042f2fe7d3117a0ac67b1b8204cb11cdb882
5
5
  SHA512:
6
- metadata.gz: e4ac5d9e093b57a77ca942c11f602e13460d9e9154d6f5b271651c3ea7972c6fc0fb01a19b66c1a462e2c2d0d8760b7479ec75db566ef83fa7c63c1b3ab62db9
7
- data.tar.gz: 275ebdd55119eca9b6ef5513f90ba0a2e9664cf2a70fa3fa28da342fcbb0ce91ade41154cbc04e187c89c33b34473d0a83fe98828aec40c1573dc465f1031518
6
+ metadata.gz: e805d5307a5977dae82e83ee41a92c1fba18e23eae6dacdaa84e374d9ddcaf068c597bcd5ab1b71763a214a98e80007ce80b29e68b39fbde2bdbfa2323b65a7e
7
+ data.tar.gz: f4031f7cba8e49714ca7e8f3c9a05864a23cfee7ad29829aab48cd4b159cc905721796ceb15d02bd585008c07fea41625d3a4d0f8d01a7af282cc09634a06abf
@@ -10,5 +10,37 @@ class Predicate
10
10
  sexpr_body.any?{|op| op.evaluate(tuple) }
11
11
  end
12
12
 
13
+ # A disjunction can be represented as a `{ attr => [values] }` hash only
14
+ # when every operand constrains the *same single* attribute to a literal
15
+ # or a set of literals, e.g. `x == 1 OR x == 2 OR x IN [3, 4]`. Operands
16
+ # are folded together into an IN-style hash. As soon as an operand touches
17
+ # another attribute, or cannot itself be represented as a hash, the whole
18
+ # disjunction is not representable and an ArgumentError is raised (as for
19
+ # any other non-representable predicate).
20
+ def to_hash
21
+ merged = sexpr_body.inject(nil) do |acc, term|
22
+ hash = term.to_hash
23
+ return super unless hash.size == 1
24
+
25
+ attr, value = hash.first
26
+ values = value.is_a?(Array) ? value : [value]
27
+
28
+ if acc.nil?
29
+ [attr, values.dup]
30
+ elsif acc.first == attr
31
+ [attr, acc.last + values]
32
+ else
33
+ return super
34
+ end
35
+ end
36
+
37
+ return super if merged.nil?
38
+ { merged.first => merged.last.uniq }
39
+ end
40
+
41
+ def to_hashes
42
+ [ to_hash, {} ]
43
+ end
44
+
13
45
  end
14
46
  end
@@ -1,7 +1,7 @@
1
1
  class Predicate
2
2
  module Version
3
3
  MAJOR = 2
4
- MINOR = 10
4
+ MINOR = 12
5
5
  TINY = 0
6
6
  end
7
7
  VERSION = "#{Version::MAJOR}.#{Version::MINOR}.#{Version::TINY}"
@@ -36,5 +36,23 @@ class Predicate
36
36
  it{ expect(subject).to eql(x: 3, y: [2,3]) }
37
37
  end
38
38
 
39
+ context "or of eqs on the same attribute" do
40
+ let(:predicate){ Predicate.eq(:x, 2) | Predicate.eq(:x, 3) }
41
+
42
+ it{ expect(subject).to eql(x: [2,3]) }
43
+ end
44
+
45
+ context "or mixing eq and in on the same attribute" do
46
+ let(:predicate){ Predicate.eq(:x, 2) | Predicate.in(:x, [3,4]) }
47
+
48
+ it{ expect(subject).to eql(x: [2,3,4]) }
49
+ end
50
+
51
+ context "or on distinct attributes" do
52
+ let(:predicate){ Predicate.eq(:x, 2) | Predicate.eq(:y, 3) }
53
+
54
+ it{ expect{ subject }.to raise_error(ArgumentError) }
55
+ end
56
+
39
57
  end
40
58
  end
@@ -48,6 +48,12 @@ class Predicate
48
48
  it{ expect(subject).to eql([{y: [2,3]},{x: 3}]) }
49
49
  end
50
50
 
51
+ context "or of eqs on the same attribute" do
52
+ let(:predicate){ Predicate.eq(:x, 2) | Predicate.eq(:x, 3) }
53
+
54
+ it{ expect(subject).to eql([{x: [2,3]},{}]) }
55
+ end
56
+
51
57
  context "not nil & eq" do
52
58
  let(:predicate){ Predicate.neq(:x, nil) & Predicate.eq(:x, [2,3]) }
53
59
 
metadata CHANGED
@@ -1,14 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: predicate
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.10.0
4
+ version: 2.12.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Bernard Lambeau
8
- autorequire:
9
8
  bindir: bin
10
9
  cert_chain: []
11
- date: 2026-04-24 00:00:00.000000000 Z
10
+ date: 2026-09-30 00:00:00.000000000 Z
12
11
  dependencies:
13
12
  - !ruby/object:Gem::Dependency
14
13
  name: sexpr
@@ -31,6 +30,9 @@ dependencies:
31
30
  - - ">="
32
31
  - !ruby/object:Gem::Version
33
32
  version: '5.0'
33
+ - - "<"
34
+ - !ruby/object:Gem::Version
35
+ version: '7.0'
34
36
  type: :runtime
35
37
  prerelease: false
36
38
  version_requirements: !ruby/object:Gem::Requirement
@@ -38,76 +40,93 @@ dependencies:
38
40
  - - ">="
39
41
  - !ruby/object:Gem::Version
40
42
  version: '5.0'
43
+ - - "<"
44
+ - !ruby/object:Gem::Version
45
+ version: '7.0'
41
46
  - !ruby/object:Gem::Dependency
42
47
  name: rake
43
48
  requirement: !ruby/object:Gem::Requirement
44
49
  requirements:
45
50
  - - "~>"
46
51
  - !ruby/object:Gem::Version
47
- version: '13'
52
+ version: '13.2'
48
53
  type: :development
49
54
  prerelease: false
50
55
  version_requirements: !ruby/object:Gem::Requirement
51
56
  requirements:
52
57
  - - "~>"
53
58
  - !ruby/object:Gem::Version
54
- version: '13'
59
+ version: '13.2'
55
60
  - !ruby/object:Gem::Dependency
56
61
  name: rspec
57
62
  requirement: !ruby/object:Gem::Requirement
58
63
  requirements:
59
64
  - - "~>"
60
65
  - !ruby/object:Gem::Version
61
- version: '3'
66
+ version: '3.13'
62
67
  type: :development
63
68
  prerelease: false
64
69
  version_requirements: !ruby/object:Gem::Requirement
65
70
  requirements:
66
71
  - - "~>"
67
72
  - !ruby/object:Gem::Version
68
- version: '3'
73
+ version: '3.13'
69
74
  - !ruby/object:Gem::Dependency
70
75
  name: sequel
71
76
  requirement: !ruby/object:Gem::Requirement
72
77
  requirements:
73
- - - ">="
78
+ - - "~>"
74
79
  - !ruby/object:Gem::Version
75
- version: '0'
80
+ version: '5.80'
76
81
  type: :development
77
82
  prerelease: false
78
83
  version_requirements: !ruby/object:Gem::Requirement
79
84
  requirements:
80
- - - ">="
85
+ - - "~>"
81
86
  - !ruby/object:Gem::Version
82
- version: '0'
87
+ version: '5.80'
83
88
  - !ruby/object:Gem::Dependency
84
89
  name: sqlite3
85
90
  requirement: !ruby/object:Gem::Requirement
86
91
  requirements:
87
- - - ">="
92
+ - - "~>"
88
93
  - !ruby/object:Gem::Version
89
- version: '0'
94
+ version: '2.1'
90
95
  type: :development
91
96
  prerelease: false
92
97
  version_requirements: !ruby/object:Gem::Requirement
93
98
  requirements:
94
- - - ">="
99
+ - - "~>"
95
100
  - !ruby/object:Gem::Version
96
- version: '0'
101
+ version: '2.1'
97
102
  - !ruby/object:Gem::Dependency
98
103
  name: pg
99
104
  requirement: !ruby/object:Gem::Requirement
100
105
  requirements:
101
- - - ">="
106
+ - - "~>"
102
107
  - !ruby/object:Gem::Version
103
- version: '0'
108
+ version: '1.5'
104
109
  type: :development
105
110
  prerelease: false
106
111
  version_requirements: !ruby/object:Gem::Requirement
107
112
  requirements:
108
- - - ">="
113
+ - - "~>"
109
114
  - !ruby/object:Gem::Version
110
- version: '0'
115
+ version: '1.5'
116
+ - !ruby/object:Gem::Dependency
117
+ name: ostruct
118
+ requirement: !ruby/object:Gem::Requirement
119
+ requirements:
120
+ - - "~>"
121
+ - !ruby/object:Gem::Version
122
+ version: '0.6'
123
+ type: :development
124
+ prerelease: false
125
+ version_requirements: !ruby/object:Gem::Requirement
126
+ requirements:
127
+ - - "~>"
128
+ - !ruby/object:Gem::Version
129
+ version: '0.6'
111
130
  description: Predicate provides a simple class and processors to encode and manipulate
112
131
  (tuple) predicates
113
132
  email: blambeau@gmail.com
@@ -266,7 +285,6 @@ homepage: http://github.com/enspirit/predicate
266
285
  licenses:
267
286
  - MIT
268
287
  metadata: {}
269
- post_install_message:
270
288
  rdoc_options: []
271
289
  require_paths:
272
290
  - lib
@@ -274,15 +292,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
274
292
  requirements:
275
293
  - - ">="
276
294
  - !ruby/object:Gem::Version
277
- version: '0'
295
+ version: '3.1'
278
296
  required_rubygems_version: !ruby/object:Gem::Requirement
279
297
  requirements:
280
298
  - - ">="
281
299
  - !ruby/object:Gem::Version
282
300
  version: '0'
283
301
  requirements: []
284
- rubygems_version: 3.1.6
285
- signing_key:
302
+ rubygems_version: 3.6.9
286
303
  specification_version: 4
287
304
  summary: Predicate provides a simple class and processors to encode and manipulate
288
305
  (tuple) predicates