cel 0.2.1 → 0.2.2
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 +4 -4
- data/CHANGELOG.md +9 -0
- data/lib/cel/ast/elements/protobuf.rb +9 -3
- data/lib/cel/ast/elements.rb +14 -13
- data/lib/cel/ast/types.rb +2 -0
- data/lib/cel/checker.rb +1 -1
- data/lib/cel/macro.rb +6 -3
- data/lib/cel/program.rb +10 -8
- data/lib/cel/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ed190ec0ddbda3e8c5229160dff580efa6cf1175f8b5ed5245e8de40f1feb800
|
4
|
+
data.tar.gz: 5f5d64c6a0199a0d47c7c29a3ef0c022f666e752147cadefbe6fc7090685e819
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c1c1aec4b0d8e54cf52a18057933c1ed214cddd79671ba6280f4e46f852c595f62259b4a10e2d8d0187d0b296f726b6dcae0b07aaccded157769b55f44d88900
|
7
|
+
data.tar.gz: 06c5d2653edca32b4cfb411a788734a0de1c9dcd6368f95b4ad4dcaeffe0b7fb82504c8e861d515acd19dbadb514804c5c6c108aa09e1600da0b9c1a60aec519
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,14 @@
|
|
1
1
|
## [Unreleased]
|
2
2
|
|
3
|
+
## [0.2.2] - 2023-08-17
|
4
|
+
|
5
|
+
* Reimplements `Cel::Literal#==` in a simpler way, to avoid several comparison issues arising from the previous implementation.
|
6
|
+
* fix initialization of `Cel::Duration` and `Cel::Timestamp` from string notation.
|
7
|
+
* fix protobuf-to-cel parsing of negative literals.
|
8
|
+
* more consistent usage of Cel types internally.
|
9
|
+
* fix condition clause evaluation.
|
10
|
+
|
11
|
+
|
3
12
|
## [0.2.1] - 2023-07-26
|
4
13
|
|
5
14
|
|
@@ -60,9 +60,15 @@ module Cel
|
|
60
60
|
|
61
61
|
value = value.fetch(key, value)
|
62
62
|
|
63
|
-
value =
|
64
|
-
|
65
|
-
|
63
|
+
value = case key
|
64
|
+
when "null_value"
|
65
|
+
Null.new if value.zero?
|
66
|
+
when "number_value"
|
67
|
+
value = -value.operands.first if value.is_a?(Operation) && value.op == "-" && value.unary?
|
68
|
+
Number.new(:double, value)
|
69
|
+
else
|
70
|
+
value
|
71
|
+
end
|
66
72
|
when "BoolValue", "google.protobuf.BoolValue"
|
67
73
|
value = value.nil? ? Bool.new(false) : value[Identifier.new("value")]
|
68
74
|
when "BytesValue", "google.protobuf.BytesValue"
|
data/lib/cel/ast/elements.rb
CHANGED
@@ -143,6 +143,7 @@ module Cel
|
|
143
143
|
end
|
144
144
|
|
145
145
|
def ==(other)
|
146
|
+
other = other.value if other.is_a?(Literal)
|
146
147
|
@value == other || super
|
147
148
|
end
|
148
149
|
|
@@ -194,7 +195,7 @@ module Cel
|
|
194
195
|
OUT
|
195
196
|
end
|
196
197
|
|
197
|
-
LOGICAL_OPERATORS.each do |op|
|
198
|
+
(LOGICAL_OPERATORS - %w[==]).each do |op|
|
198
199
|
class_eval(<<-OUT, __FILE__, __LINE__ + 1)
|
199
200
|
def #{op}(other)
|
200
201
|
Bool.new(super)
|
@@ -208,13 +209,17 @@ module Cel
|
|
208
209
|
super(:bool, value)
|
209
210
|
end
|
210
211
|
|
211
|
-
LOGICAL_OPERATORS.each do |op|
|
212
|
+
(LOGICAL_OPERATORS - %w[==]).each do |op|
|
212
213
|
class_eval(<<-OUT, __FILE__, __LINE__ + 1)
|
213
214
|
def #{op}(other)
|
214
215
|
Bool.new(super)
|
215
216
|
end
|
216
217
|
OUT
|
217
218
|
end
|
219
|
+
|
220
|
+
def !
|
221
|
+
Bool.new(super)
|
222
|
+
end
|
218
223
|
end
|
219
224
|
|
220
225
|
class Null < Literal
|
@@ -246,14 +251,6 @@ module Cel
|
|
246
251
|
Macro.matches(self, pattern)
|
247
252
|
end
|
248
253
|
|
249
|
-
LOGICAL_OPERATORS.each do |op|
|
250
|
-
class_eval(<<-OUT, __FILE__, __LINE__ + 1)
|
251
|
-
def #{op}(other)
|
252
|
-
other.is_a?(Cel::Literal) ? Bool.new(super) : super
|
253
|
-
end
|
254
|
-
OUT
|
255
|
-
end
|
256
|
-
|
257
254
|
%i[+ -].each do |op|
|
258
255
|
class_eval(<<-OUT, __FILE__, __LINE__ + 1)
|
259
256
|
def #{op}(other)
|
@@ -272,7 +269,7 @@ module Cel
|
|
272
269
|
[self]
|
273
270
|
end
|
274
271
|
|
275
|
-
LOGICAL_OPERATORS.each do |op|
|
272
|
+
(LOGICAL_OPERATORS - %w[==]).each do |op|
|
276
273
|
class_eval(<<-OUT, __FILE__, __LINE__ + 1)
|
277
274
|
def #{op}(other)
|
278
275
|
Bool.new(super)
|
@@ -358,7 +355,7 @@ module Cel
|
|
358
355
|
class Timestamp < Literal
|
359
356
|
def initialize(value)
|
360
357
|
value = case value
|
361
|
-
when String then Time.parse(value)
|
358
|
+
when ::String then Time.parse(value)
|
362
359
|
when Numeric then Time.at(value)
|
363
360
|
else value
|
364
361
|
end
|
@@ -443,7 +440,7 @@ module Cel
|
|
443
440
|
class Duration < Literal
|
444
441
|
def initialize(value)
|
445
442
|
value = case value
|
446
|
-
when String
|
443
|
+
when ::String
|
447
444
|
init_from_string(value)
|
448
445
|
when Hash
|
449
446
|
seconds, nanos = value.values_at(:seconds, :nanos)
|
@@ -553,6 +550,10 @@ module Cel
|
|
553
550
|
end
|
554
551
|
end
|
555
552
|
|
553
|
+
def unary?
|
554
|
+
@operands.size == 1
|
555
|
+
end
|
556
|
+
|
556
557
|
def to_s
|
557
558
|
return "#{@op}#{@operands.first}" if @operands.size == 1
|
558
559
|
|
data/lib/cel/ast/types.rb
CHANGED
data/lib/cel/checker.rb
CHANGED
data/lib/cel/macro.rb
CHANGED
@@ -43,21 +43,24 @@ module Cel
|
|
43
43
|
end
|
44
44
|
|
45
45
|
def all(collection, identifier, predicate, context:)
|
46
|
-
collection.all? do |element, *|
|
46
|
+
return_value = collection.all? do |element, *|
|
47
47
|
Program.new(context.merge(identifier.to_sym => element)).evaluate(predicate).value
|
48
48
|
end
|
49
|
+
Bool.new(return_value)
|
49
50
|
end
|
50
51
|
|
51
52
|
def exists(collection, identifier, predicate, context:)
|
52
|
-
collection.any? do |element, *|
|
53
|
+
return_value = collection.any? do |element, *|
|
53
54
|
Program.new(context.merge(identifier.to_sym => element)).evaluate(predicate).value
|
54
55
|
end
|
56
|
+
Bool.new(return_value)
|
55
57
|
end
|
56
58
|
|
57
59
|
def exists_one(collection, identifier, predicate, context:)
|
58
|
-
collection.one? do |element, *|
|
60
|
+
return_value = collection.one? do |element, *|
|
59
61
|
Program.new(context.merge(identifier.to_sym => element)).evaluate(predicate).value
|
60
62
|
end
|
63
|
+
Bool.new(return_value)
|
61
64
|
end
|
62
65
|
|
63
66
|
def filter(collection, identifier, predicate, context:)
|
data/lib/cel/program.rb
CHANGED
@@ -57,20 +57,22 @@ module Cel
|
|
57
57
|
ev_operand
|
58
58
|
end
|
59
59
|
|
60
|
-
if
|
60
|
+
if operation.unary? &&
|
61
61
|
op != "!" # https://bugs.ruby-lang.org/issues/18246
|
62
62
|
# unary operations
|
63
|
-
values.first.__send__(:"#{op}@")
|
63
|
+
Literal.to_cel_type(values.first.__send__(:"#{op}@"))
|
64
64
|
elsif op == "&&"
|
65
|
-
Bool.new(values.all? { |x| true == x }) # rubocop:disable Style/YodaCondition
|
65
|
+
Bool.new(values.all? { |x| true == x.value }) # rubocop:disable Style/YodaCondition
|
66
66
|
elsif op == "||"
|
67
|
-
Bool.new(values.any? { |x| true == x }) # rubocop:disable Style/YodaCondition
|
67
|
+
Bool.new(values.any? { |x| true == x.value }) # rubocop:disable Style/YodaCondition
|
68
68
|
elsif op == "in"
|
69
69
|
element, collection = values
|
70
70
|
Bool.new(collection.include?(element))
|
71
71
|
else
|
72
72
|
op_value, *values = values
|
73
|
-
op_value.public_send(op, *values)
|
73
|
+
val = op_value.public_send(op, *values)
|
74
|
+
|
75
|
+
Literal.to_cel_type(val)
|
74
76
|
end
|
75
77
|
end
|
76
78
|
|
@@ -120,7 +122,7 @@ module Cel
|
|
120
122
|
end
|
121
123
|
|
122
124
|
def evaluate_condition(condition)
|
123
|
-
call(condition.if) ? call(condition.then) : call(condition.else)
|
125
|
+
call(condition.if).value ? call(condition.then) : call(condition.else)
|
124
126
|
end
|
125
127
|
|
126
128
|
def evaluate_standard_func(funcall)
|
@@ -135,11 +137,11 @@ module Cel
|
|
135
137
|
val.class
|
136
138
|
# MACROS
|
137
139
|
when :has
|
138
|
-
|
140
|
+
Macro.__send__(func, *args)
|
139
141
|
when :size
|
140
142
|
Cel::Number.new(:int, Macro.__send__(func, *args))
|
141
143
|
when :matches
|
142
|
-
|
144
|
+
Macro.__send__(func, *args.map(&method(:call)))
|
143
145
|
when :int, :uint, :string, :double, :bytes, :duration, :timestamp
|
144
146
|
type = TYPES[func]
|
145
147
|
type.cast(call(args.first))
|
data/lib/cel/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cel
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tiago Cardoso
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-
|
11
|
+
date: 2023-08-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: minitest
|