delorean_lang 0.3.24 → 0.3.25
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/lib/delorean/base.rb +66 -85
- data/lib/delorean/delorean.rb +52 -40
- data/lib/delorean/delorean.treetop +1 -1
- data/lib/delorean/version.rb +1 -1
- data/spec/eval_spec.rb +3 -0
- data/spec/func_spec.rb +26 -0
- metadata +2 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 7a874caf5f4ff132d1358f1200e1bdbe8922d968
|
|
4
|
+
data.tar.gz: 2953cf29508714e114dc2f35b1cec643133fdfdb
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: fcfc877b4bae858ce9988d371502ea9625b02e93b8046b7861c3f6f505b8b0f57a30878482b5d92bf3ef18935241383f9fddb3c61a243fec328ce0f6a483aef0
|
|
7
|
+
data.tar.gz: e2cfcda4485deca3b94169c26dfd5281778a1850b426fe08d42ad1c8edf3048f0c4452b2e2f262801aee9cde9a8ede2d63b56c99a5b8324bb0a141cf55a36d18
|
data/lib/delorean/base.rb
CHANGED
|
@@ -4,8 +4,9 @@ require 'bigdecimal'
|
|
|
4
4
|
|
|
5
5
|
module Delorean
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
|
|
7
|
+
DT_TYPES = [Date, Time, ActiveSupport::TimeWithZone]
|
|
8
|
+
NUM_OR_STR = [Numeric, String]
|
|
9
|
+
NUM_OR_NIL = [nil, Fixnum]
|
|
9
10
|
|
|
10
11
|
# FIXME: the whitelist is quite hacky. It's currently difficult to
|
|
11
12
|
# override it. A user will likely want to directly modify this
|
|
@@ -13,12 +14,12 @@ module Delorean
|
|
|
13
14
|
# rethought.
|
|
14
15
|
RUBY_WHITELIST = {
|
|
15
16
|
attributes: [ActiveRecord::Base],
|
|
16
|
-
between?: [
|
|
17
|
+
between?: [NUM_OR_STR, NUM_OR_STR, NUM_OR_STR],
|
|
17
18
|
between: "between?",
|
|
18
19
|
compact: [Array],
|
|
19
20
|
to_set: [Array],
|
|
20
|
-
flatten: [Array,
|
|
21
|
-
length: [Enumerable],
|
|
21
|
+
flatten: [Array, NUM_OR_NIL],
|
|
22
|
+
length: [[String, Enumerable]],
|
|
22
23
|
max: [Array],
|
|
23
24
|
member: "member?",
|
|
24
25
|
member?: [Enumerable, [Object]],
|
|
@@ -33,11 +34,11 @@ module Delorean
|
|
|
33
34
|
sum: [Array],
|
|
34
35
|
transpose: [Array],
|
|
35
36
|
join: [Array, String],
|
|
36
|
-
zip: [Array, [Array, Array,
|
|
37
|
+
zip: [Array, Array, [Array, nil], [Array, nil]],
|
|
37
38
|
index: [Array, [Object]],
|
|
38
39
|
product: [Array, Array],
|
|
39
|
-
first: [[ActiveRecord::Relation, Enumerable],
|
|
40
|
-
last: [[ActiveRecord::Relation, Enumerable],
|
|
40
|
+
first: [[ActiveRecord::Relation, Enumerable], NUM_OR_NIL],
|
|
41
|
+
last: [[ActiveRecord::Relation, Enumerable], NUM_OR_NIL],
|
|
41
42
|
intersection: [Set, Enumerable],
|
|
42
43
|
union: [Set, Enumerable],
|
|
43
44
|
|
|
@@ -45,39 +46,30 @@ module Delorean
|
|
|
45
46
|
values: [Hash],
|
|
46
47
|
upcase: [String],
|
|
47
48
|
downcase: [String],
|
|
48
|
-
match: [String, [String],
|
|
49
|
-
|
|
50
|
-
iso8601: [
|
|
51
|
-
hour: [
|
|
52
|
-
min: [[
|
|
53
|
-
sec: [
|
|
54
|
-
to_date: [[
|
|
55
|
-
|
|
56
|
-
month: [
|
|
57
|
-
day: [
|
|
58
|
-
year: [
|
|
59
|
-
|
|
60
|
-
next_month: [
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
[nil, Fixnum],
|
|
73
|
-
],
|
|
74
|
-
prev_day: [[Date, Time, ActiveSupport::TimeWithZone],
|
|
75
|
-
[nil, Fixnum],
|
|
76
|
-
],
|
|
77
|
-
|
|
78
|
-
to_i: [[Numeric, String]],
|
|
79
|
-
to_f: [[Numeric, String]],
|
|
80
|
-
to_d: [[Numeric, String]],
|
|
49
|
+
match: [String, [String], NUM_OR_NIL],
|
|
50
|
+
|
|
51
|
+
iso8601: [DT_TYPES],
|
|
52
|
+
hour: [DT_TYPES],
|
|
53
|
+
min: [DT_TYPES+[Array]],
|
|
54
|
+
sec: [DT_TYPES],
|
|
55
|
+
to_date: [DT_TYPES+[String]],
|
|
56
|
+
|
|
57
|
+
month: [DT_TYPES],
|
|
58
|
+
day: [DT_TYPES],
|
|
59
|
+
year: [DT_TYPES],
|
|
60
|
+
|
|
61
|
+
next_month: [DT_TYPES, NUM_OR_NIL],
|
|
62
|
+
prev_month: [DT_TYPES, NUM_OR_NIL],
|
|
63
|
+
|
|
64
|
+
beginning_of_month: [DT_TYPES],
|
|
65
|
+
end_of_month: [DT_TYPES],
|
|
66
|
+
|
|
67
|
+
next_day: [DT_TYPES, NUM_OR_NIL],
|
|
68
|
+
prev_day: [DT_TYPES, NUM_OR_NIL],
|
|
69
|
+
|
|
70
|
+
to_i: [NUM_OR_STR],
|
|
71
|
+
to_f: [NUM_OR_STR],
|
|
72
|
+
to_d: [NUM_OR_STR],
|
|
81
73
|
to_s: [Object],
|
|
82
74
|
to_a: [Object],
|
|
83
75
|
to_json: [Object],
|
|
@@ -97,15 +89,14 @@ module Delorean
|
|
|
97
89
|
end
|
|
98
90
|
|
|
99
91
|
def /(args)
|
|
100
|
-
raise "non-array/string arg to /" unless
|
|
101
|
-
args.is_a?(Array) || args.is_a?(String)
|
|
102
|
-
|
|
103
92
|
begin
|
|
104
93
|
case args
|
|
105
94
|
when Array
|
|
106
95
|
engine.eval_to_hash(node, args, params.clone)
|
|
107
96
|
when String
|
|
108
97
|
engine.evaluate(node, args, params.clone)
|
|
98
|
+
else
|
|
99
|
+
raise "non-array/string arg to /"
|
|
109
100
|
end
|
|
110
101
|
rescue => exc
|
|
111
102
|
Delorean::Engine.grok_runtime_exception(exc)
|
|
@@ -134,30 +125,25 @@ module Delorean
|
|
|
134
125
|
|
|
135
126
|
class BaseClass
|
|
136
127
|
def self._get_attr(obj, attr, _e)
|
|
137
|
-
# FIXME: even Javascript which is superpermissive raises an
|
|
138
|
-
# exception on null getattr.
|
|
139
|
-
return nil if obj.nil?
|
|
140
|
-
|
|
141
128
|
# NOTE: should keep this function consistent with _index
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
return
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
return obj.send(attr.to_sym) if
|
|
150
|
-
|
|
151
|
-
elsif obj.instance_of?(NodeCall)
|
|
129
|
+
case obj
|
|
130
|
+
when nil
|
|
131
|
+
# FIXME: even Javascript which is superpermissive raises an
|
|
132
|
+
# exception on null getattr.
|
|
133
|
+
return nil
|
|
134
|
+
when ActiveRecord::Base
|
|
135
|
+
return obj.read_attribute(attr) if obj.has_attribute?(attr)
|
|
136
|
+
return obj.send(attr.to_sym) if obj.class.reflections[attr]
|
|
137
|
+
when NodeCall
|
|
152
138
|
return obj.evaluate(attr)
|
|
153
|
-
|
|
139
|
+
when Hash
|
|
154
140
|
# FIXME: this implementation doesn't handle something like
|
|
155
141
|
# {}.length. i.e. length is a whitelisted function, but not
|
|
156
142
|
# an attr. This implementation returns nil instead of 0.
|
|
157
143
|
return obj[attr] if obj.member?(attr)
|
|
158
144
|
return attr.is_a?(String) ? obj[attr.to_sym] : nil
|
|
159
|
-
|
|
160
|
-
return obj.send((attr + POST).to_sym, _e)
|
|
145
|
+
when Class
|
|
146
|
+
return obj.send((attr + POST).to_sym, _e) if obj < BaseClass
|
|
161
147
|
end
|
|
162
148
|
|
|
163
149
|
begin
|
|
@@ -171,18 +157,19 @@ module Delorean
|
|
|
171
157
|
######################################################################
|
|
172
158
|
|
|
173
159
|
def self._index(obj, args, _e)
|
|
174
|
-
return nil if obj.nil?
|
|
175
|
-
|
|
176
160
|
# NOTE: should keep this function consistent with _get_attr
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
161
|
+
case obj
|
|
162
|
+
when nil
|
|
163
|
+
# FIXME: even Javascript which is superpermissive raises an
|
|
164
|
+
# exception on null getattr.
|
|
165
|
+
return nil
|
|
166
|
+
when Hash, ActiveRecord::Base, NodeCall, Class
|
|
180
167
|
raise InvalidIndex unless args.length == 1
|
|
181
168
|
_get_attr(obj, args[0], _e)
|
|
182
|
-
|
|
183
|
-
raise InvalidIndex unless args.length <= 2
|
|
184
|
-
|
|
185
|
-
|
|
169
|
+
when Array, String, MatchData
|
|
170
|
+
raise InvalidIndex unless args.length <= 2 &&
|
|
171
|
+
args[0].is_a?(Fixnum) &&
|
|
172
|
+
(args[1].nil? || args[1].is_a?(Fixnum))
|
|
186
173
|
obj[*args]
|
|
187
174
|
else
|
|
188
175
|
raise InvalidIndex
|
|
@@ -234,11 +221,9 @@ module Delorean
|
|
|
234
221
|
return obj.send(msg, *args)
|
|
235
222
|
end
|
|
236
223
|
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
sig = RUBY_WHITELIST[msg] unless sig
|
|
224
|
+
cls = obj.class
|
|
225
|
+
sig = (cls < Delorean::Model && cls.delorean_instance_methods[msg]) ||
|
|
226
|
+
RUBY_WHITELIST[msg]
|
|
242
227
|
|
|
243
228
|
raise "no such method #{method}" unless sig
|
|
244
229
|
|
|
@@ -249,19 +234,15 @@ module Delorean
|
|
|
249
234
|
|
|
250
235
|
arglist = [obj] + args
|
|
251
236
|
|
|
252
|
-
sig.each_with_index
|
|
237
|
+
sig.each_with_index do |s, i|
|
|
253
238
|
s = [s] unless s.is_a?(Array)
|
|
254
239
|
|
|
255
|
-
|
|
240
|
+
ai = arglist[i]
|
|
256
241
|
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
end
|
|
262
|
-
}
|
|
263
|
-
raise "bad arg #{i}, method #{method}: #{ai}/#{ai.class} #{s}" if !ok
|
|
264
|
-
}
|
|
242
|
+
raise "bad arg #{i}, method #{method}: #{ai}/#{ai.class} #{s}" unless
|
|
243
|
+
(s.member?(nil) && i>=arglist.length) ||
|
|
244
|
+
s.detect {|sc| sc && ai.class <= sc}
|
|
245
|
+
end
|
|
265
246
|
|
|
266
247
|
res = obj.send(msg, *args)
|
|
267
248
|
# FIXME: can't freeze AR relations since then we can't chain
|
data/lib/delorean/delorean.rb
CHANGED
|
@@ -2234,142 +2234,154 @@ module Delorean
|
|
|
2234
2234
|
r6 = SyntaxNode.new(input, (index-1)...index) if r6 == true
|
|
2235
2235
|
r0 = r6
|
|
2236
2236
|
else
|
|
2237
|
-
if (match_len = has_terminal?('
|
|
2238
|
-
r7 =
|
|
2237
|
+
if (match_len = has_terminal?('**', false, index))
|
|
2238
|
+
r7 = instantiate_node(SyntaxNode,input, index...(index + match_len))
|
|
2239
2239
|
@index += match_len
|
|
2240
2240
|
else
|
|
2241
|
-
terminal_parse_failure('\'
|
|
2241
|
+
terminal_parse_failure('\'**\'')
|
|
2242
2242
|
r7 = nil
|
|
2243
2243
|
end
|
|
2244
2244
|
if r7
|
|
2245
2245
|
r7 = SyntaxNode.new(input, (index-1)...index) if r7 == true
|
|
2246
2246
|
r0 = r7
|
|
2247
2247
|
else
|
|
2248
|
-
if (match_len = has_terminal?('
|
|
2248
|
+
if (match_len = has_terminal?('>', false, index))
|
|
2249
2249
|
r8 = true
|
|
2250
2250
|
@index += match_len
|
|
2251
2251
|
else
|
|
2252
|
-
terminal_parse_failure('\'
|
|
2252
|
+
terminal_parse_failure('\'>\'')
|
|
2253
2253
|
r8 = nil
|
|
2254
2254
|
end
|
|
2255
2255
|
if r8
|
|
2256
2256
|
r8 = SyntaxNode.new(input, (index-1)...index) if r8 == true
|
|
2257
2257
|
r0 = r8
|
|
2258
2258
|
else
|
|
2259
|
-
if (match_len = has_terminal?('
|
|
2259
|
+
if (match_len = has_terminal?('<', false, index))
|
|
2260
2260
|
r9 = true
|
|
2261
2261
|
@index += match_len
|
|
2262
2262
|
else
|
|
2263
|
-
terminal_parse_failure('\'
|
|
2263
|
+
terminal_parse_failure('\'<\'')
|
|
2264
2264
|
r9 = nil
|
|
2265
2265
|
end
|
|
2266
2266
|
if r9
|
|
2267
2267
|
r9 = SyntaxNode.new(input, (index-1)...index) if r9 == true
|
|
2268
2268
|
r0 = r9
|
|
2269
2269
|
else
|
|
2270
|
-
if (match_len = has_terminal?('
|
|
2270
|
+
if (match_len = has_terminal?('+', false, index))
|
|
2271
2271
|
r10 = true
|
|
2272
2272
|
@index += match_len
|
|
2273
2273
|
else
|
|
2274
|
-
terminal_parse_failure('\'
|
|
2274
|
+
terminal_parse_failure('\'+\'')
|
|
2275
2275
|
r10 = nil
|
|
2276
2276
|
end
|
|
2277
2277
|
if r10
|
|
2278
2278
|
r10 = SyntaxNode.new(input, (index-1)...index) if r10 == true
|
|
2279
2279
|
r0 = r10
|
|
2280
2280
|
else
|
|
2281
|
-
if (match_len = has_terminal?('
|
|
2281
|
+
if (match_len = has_terminal?('-', false, index))
|
|
2282
2282
|
r11 = true
|
|
2283
2283
|
@index += match_len
|
|
2284
2284
|
else
|
|
2285
|
-
terminal_parse_failure('\'
|
|
2285
|
+
terminal_parse_failure('\'-\'')
|
|
2286
2286
|
r11 = nil
|
|
2287
2287
|
end
|
|
2288
2288
|
if r11
|
|
2289
2289
|
r11 = SyntaxNode.new(input, (index-1)...index) if r11 == true
|
|
2290
2290
|
r0 = r11
|
|
2291
2291
|
else
|
|
2292
|
-
if (match_len = has_terminal?('
|
|
2292
|
+
if (match_len = has_terminal?('*', false, index))
|
|
2293
2293
|
r12 = true
|
|
2294
2294
|
@index += match_len
|
|
2295
2295
|
else
|
|
2296
|
-
terminal_parse_failure('\'
|
|
2296
|
+
terminal_parse_failure('\'*\'')
|
|
2297
2297
|
r12 = nil
|
|
2298
2298
|
end
|
|
2299
2299
|
if r12
|
|
2300
2300
|
r12 = SyntaxNode.new(input, (index-1)...index) if r12 == true
|
|
2301
2301
|
r0 = r12
|
|
2302
2302
|
else
|
|
2303
|
-
if (match_len = has_terminal?('
|
|
2303
|
+
if (match_len = has_terminal?('/', false, index))
|
|
2304
2304
|
r13 = true
|
|
2305
2305
|
@index += match_len
|
|
2306
2306
|
else
|
|
2307
|
-
terminal_parse_failure('\'
|
|
2307
|
+
terminal_parse_failure('\'/\'')
|
|
2308
2308
|
r13 = nil
|
|
2309
2309
|
end
|
|
2310
2310
|
if r13
|
|
2311
2311
|
r13 = SyntaxNode.new(input, (index-1)...index) if r13 == true
|
|
2312
2312
|
r0 = r13
|
|
2313
2313
|
else
|
|
2314
|
-
if (match_len = has_terminal?('
|
|
2314
|
+
if (match_len = has_terminal?('%', false, index))
|
|
2315
2315
|
r14 = true
|
|
2316
2316
|
@index += match_len
|
|
2317
2317
|
else
|
|
2318
|
-
terminal_parse_failure('\'
|
|
2318
|
+
terminal_parse_failure('\'%\'')
|
|
2319
2319
|
r14 = nil
|
|
2320
2320
|
end
|
|
2321
2321
|
if r14
|
|
2322
2322
|
r14 = SyntaxNode.new(input, (index-1)...index) if r14 == true
|
|
2323
2323
|
r0 = r14
|
|
2324
2324
|
else
|
|
2325
|
-
if (match_len = has_terminal?('
|
|
2325
|
+
if (match_len = has_terminal?('&', false, index))
|
|
2326
2326
|
r15 = true
|
|
2327
2327
|
@index += match_len
|
|
2328
2328
|
else
|
|
2329
|
-
terminal_parse_failure('\'
|
|
2329
|
+
terminal_parse_failure('\'&\'')
|
|
2330
2330
|
r15 = nil
|
|
2331
2331
|
end
|
|
2332
2332
|
if r15
|
|
2333
2333
|
r15 = SyntaxNode.new(input, (index-1)...index) if r15 == true
|
|
2334
2334
|
r0 = r15
|
|
2335
2335
|
else
|
|
2336
|
-
if (match_len = has_terminal?('
|
|
2336
|
+
if (match_len = has_terminal?('^', false, index))
|
|
2337
2337
|
r16 = true
|
|
2338
2338
|
@index += match_len
|
|
2339
2339
|
else
|
|
2340
|
-
terminal_parse_failure('\'
|
|
2340
|
+
terminal_parse_failure('\'^\'')
|
|
2341
2341
|
r16 = nil
|
|
2342
2342
|
end
|
|
2343
2343
|
if r16
|
|
2344
2344
|
r16 = SyntaxNode.new(input, (index-1)...index) if r16 == true
|
|
2345
2345
|
r0 = r16
|
|
2346
2346
|
else
|
|
2347
|
-
|
|
2348
|
-
|
|
2349
|
-
r18 = instantiate_node(SyntaxNode,input, index...(index + match_len))
|
|
2347
|
+
if (match_len = has_terminal?('|', false, index))
|
|
2348
|
+
r17 = true
|
|
2350
2349
|
@index += match_len
|
|
2351
2350
|
else
|
|
2352
|
-
terminal_parse_failure('\'
|
|
2353
|
-
r18 = nil
|
|
2354
|
-
end
|
|
2355
|
-
s17 << r18
|
|
2356
|
-
if r18
|
|
2357
|
-
r19 = _nt_sp
|
|
2358
|
-
s17 << r19
|
|
2359
|
-
end
|
|
2360
|
-
if s17.last
|
|
2361
|
-
r17 = instantiate_node(SyntaxNode,input, i17...index, s17)
|
|
2362
|
-
r17.extend(BinaryOp0)
|
|
2363
|
-
else
|
|
2364
|
-
@index = i17
|
|
2351
|
+
terminal_parse_failure('\'|\'')
|
|
2365
2352
|
r17 = nil
|
|
2366
2353
|
end
|
|
2367
2354
|
if r17
|
|
2368
2355
|
r17 = SyntaxNode.new(input, (index-1)...index) if r17 == true
|
|
2369
2356
|
r0 = r17
|
|
2370
2357
|
else
|
|
2371
|
-
|
|
2372
|
-
|
|
2358
|
+
i18, s18 = index, []
|
|
2359
|
+
if (match_len = has_terminal?('in', false, index))
|
|
2360
|
+
r19 = instantiate_node(SyntaxNode,input, index...(index + match_len))
|
|
2361
|
+
@index += match_len
|
|
2362
|
+
else
|
|
2363
|
+
terminal_parse_failure('\'in\'')
|
|
2364
|
+
r19 = nil
|
|
2365
|
+
end
|
|
2366
|
+
s18 << r19
|
|
2367
|
+
if r19
|
|
2368
|
+
r20 = _nt_sp
|
|
2369
|
+
s18 << r20
|
|
2370
|
+
end
|
|
2371
|
+
if s18.last
|
|
2372
|
+
r18 = instantiate_node(SyntaxNode,input, i18...index, s18)
|
|
2373
|
+
r18.extend(BinaryOp0)
|
|
2374
|
+
else
|
|
2375
|
+
@index = i18
|
|
2376
|
+
r18 = nil
|
|
2377
|
+
end
|
|
2378
|
+
if r18
|
|
2379
|
+
r18 = SyntaxNode.new(input, (index-1)...index) if r18 == true
|
|
2380
|
+
r0 = r18
|
|
2381
|
+
else
|
|
2382
|
+
@index = i0
|
|
2383
|
+
r0 = nil
|
|
2384
|
+
end
|
|
2373
2385
|
end
|
|
2374
2386
|
end
|
|
2375
2387
|
end
|
|
@@ -3423,7 +3435,7 @@ module Delorean
|
|
|
3423
3435
|
r7 = nil
|
|
3424
3436
|
terminal_parse_failure('\'"\'', true)
|
|
3425
3437
|
else
|
|
3426
|
-
terminal_failures.pop
|
|
3438
|
+
@terminal_failures.pop
|
|
3427
3439
|
@index = i7
|
|
3428
3440
|
r7 = instantiate_node(SyntaxNode,input, index...index)
|
|
3429
3441
|
end
|
|
@@ -98,7 +98,7 @@ grammar Delorean
|
|
|
98
98
|
# NOTE: some operations such as << have side-effects (e.g. on
|
|
99
99
|
# Arrays). So, be cautious about which opertaions are added.
|
|
100
100
|
rule binary_op
|
|
101
|
-
'==' / '!=' / '>=' / '<=' / '&&' / '||' /
|
|
101
|
+
'==' / '!=' / '>=' / '<=' / '&&' / '||' / '**' /
|
|
102
102
|
'>' / '<' / '+' / '-' / '*' / '/' / '%' /
|
|
103
103
|
'&' / '^' / '|' / 'in' sp
|
|
104
104
|
end
|
data/lib/delorean/version.rb
CHANGED
data/spec/eval_spec.rb
CHANGED
|
@@ -22,12 +22,15 @@ describe "Delorean" do
|
|
|
22
22
|
" x = -(a * 2)",
|
|
23
23
|
" b = -(a + 1)",
|
|
24
24
|
" c = -a + 1",
|
|
25
|
+
" d = a ** 3 - 10*0.2",
|
|
25
26
|
)
|
|
26
27
|
|
|
27
28
|
engine.evaluate_attrs("A", ["a"]).should == [123]
|
|
28
29
|
|
|
29
30
|
r = engine.evaluate_attrs("A", ["x", "b"])
|
|
30
31
|
r.should == [-246, -124]
|
|
32
|
+
|
|
33
|
+
expect(engine.evaluate("A", "d")).to eq 1860865.0
|
|
31
34
|
end
|
|
32
35
|
|
|
33
36
|
it "proper unary expression evaluation" do
|
data/spec/func_spec.rb
CHANGED
|
@@ -118,6 +118,21 @@ describe "Delorean" do
|
|
|
118
118
|
engine.evaluate("A", "b").should == x.flatten + x.flatten(1)
|
|
119
119
|
end
|
|
120
120
|
|
|
121
|
+
it "should handle ZIP" do
|
|
122
|
+
a = [1, 2]
|
|
123
|
+
b = [4, 5, 6]
|
|
124
|
+
c = [7, 8]
|
|
125
|
+
|
|
126
|
+
engine.parse defn("A:",
|
|
127
|
+
" a = #{a}",
|
|
128
|
+
" b = #{b}",
|
|
129
|
+
" c = #{c}",
|
|
130
|
+
" d = a.zip(b) + a.zip(b, c)",
|
|
131
|
+
)
|
|
132
|
+
|
|
133
|
+
expect(engine.evaluate("A", "d")).to eq a.zip(b) + a.zip(b, c)
|
|
134
|
+
end
|
|
135
|
+
|
|
121
136
|
it "should handle ERR" do
|
|
122
137
|
engine.parse defn("A:",
|
|
123
138
|
" a = ERR('hello')",
|
|
@@ -147,6 +162,7 @@ describe "Delorean" do
|
|
|
147
162
|
" l = a.member(5)",
|
|
148
163
|
" m = [a.member(5), a.member(55)]",
|
|
149
164
|
" n = {'a':1, 'b':2, 'c':3}.length()",
|
|
165
|
+
" o = 'hello'.length",
|
|
150
166
|
)
|
|
151
167
|
|
|
152
168
|
engine.evaluate("A", "c").should == x.flatten(1)
|
|
@@ -158,6 +174,7 @@ describe "Delorean" do
|
|
|
158
174
|
engine.evaluate("A", "gg").should == x.length
|
|
159
175
|
engine.evaluate("A", "m").should == [x.member?(5), x.member?(55)]
|
|
160
176
|
engine.evaluate("A", "n").should == 3
|
|
177
|
+
engine.evaluate("A", "o").should == 5
|
|
161
178
|
end
|
|
162
179
|
|
|
163
180
|
it "should be able to call function on hash" do
|
|
@@ -206,4 +223,13 @@ describe "Delorean" do
|
|
|
206
223
|
expect(engine.evaluate("A", "b")).to eq([false, true])
|
|
207
224
|
end
|
|
208
225
|
|
|
226
|
+
it "should handle MATCH" do
|
|
227
|
+
engine.parse defn("A:",
|
|
228
|
+
" a = 'this is a test'.match('(.*)( is )(.*)')",
|
|
229
|
+
" b = [a[0], a[1], a[2], a[3], a[4]]",
|
|
230
|
+
)
|
|
231
|
+
|
|
232
|
+
expect(engine.evaluate("A", "b")).
|
|
233
|
+
to eq(["this is a test", "this", " is ", "a test", nil])
|
|
234
|
+
end
|
|
209
235
|
end
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: delorean_lang
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.3.
|
|
4
|
+
version: 0.3.25
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Arman Bostani
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2017-
|
|
11
|
+
date: 2017-08-08 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: treetop
|