delorean_lang 0.3.1 → 0.3.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- MjVkZjgyMDRiZjAyZmRlOGQxYjhhZmNmZTQyNTQ4M2VkNDlhZTg0OA==
4
+ ZDc1Y2Y0NzUxOGNkMzlmNmE2Y2M5OGM3YjBiOGNiNjBjZTM5OTY1Ng==
5
5
  data.tar.gz: !binary |-
6
- MTBlZDY5YzkxYWExMWM1MzMwM2UzNjU1ZjFkNzg4ODhmYmUxMDZkNg==
6
+ ZDgxMGNiOTM4NDhhM2Q3NDM0ZWQ4NjU3NDIzMDc4NzNlNDE4YzUxZg==
7
7
  SHA512:
8
8
  metadata.gz: !binary |-
9
- ZWYzNTQ3ZmY3NzhjMDU1NTc3ZGE1ZDQ5ZGJmNTUwMjBkOWZjNjBkMDIyYTcw
10
- MGFmZTQ2ZWQwMWQ4NmJiM2ZhMTBjOWNlMGFkNjZkN2NjZmMwNzIzNDE4MTAz
11
- ODEyYzg2YzY1MzI4Y2Q2MGY5ZmU1M2JjYzEwZTQ4NDU1ZjgxODc=
9
+ MjM0ODI5NmY0NmU4MGE1YWQ5ZmVlMDFkNThmYzdiNGQxNjJmZmE3OGZiNzNl
10
+ NmRlYzQwZTcyZjNmOThlNTExNDNmZmRiZmQ1MTMyNWFlODMzOTk2NjQzYWNi
11
+ ZDNjNmNlYzlmNzk5ZTU0Nzk4Y2Q5YzYwNmEzOWFlOWQyYWI0ODk=
12
12
  data.tar.gz: !binary |-
13
- YzRmOGIyOGI3NWNlZGY4MmIzN2FmZTlkMjhlYWU2ZjdiNzEwY2MzOTM1YTYx
14
- NjliNGYwMDE3Y2IyZWMwOTM2NWI1MjA0OTliMzc0ZGE3ZDVhNDM1YmQ0MDVi
15
- ODk0MjA0YTFmZDZkMjFhM2EwZGM4YTM0ZmEyMGRiOWIyNzNmZjQ=
13
+ NGQwM2M5YWU2MTAwNTlhNGE0ZmU4YjI4NmU5OWE4OTkwNjk0MGRlYTVhZGUz
14
+ ZDQ3ZTFlNjQ1OTU1MWExZDM0YjI0ZDRiZmMzMzFmNzkwNGM1YThhMjg2MmEz
15
+ NjZjMjAxZmM1ZmIwNjBjMjY0ZDAyMTc5NTk3ZGFlMzE0MzZlZmU=
@@ -69,7 +69,9 @@ module Delorean
69
69
  class NodeCall < Struct.new(:_e, :engine, :node, :params)
70
70
  def evaluate(attr)
71
71
  # FIXME: evaluate() modifies params! => need to clone it.
72
- # This is pretty awful.
72
+ # This is pretty awful. NOTE: can't sanitize params as Marty
73
+ # patches NodeCall and modifies params to send _parent_id.
74
+ # This whole thing needs to be redone.
73
75
  engine.evaluate(node, attr, params.clone)
74
76
  end
75
77
 
@@ -77,7 +79,7 @@ module Delorean
77
79
  raise "bad arg to %" unless args.is_a?(Array)
78
80
 
79
81
  # FIXME: params.clone!!!!
80
- engine.evaluate_attrs_hash(node, args, params.clone)
82
+ engine.eval_to_hash(node, args, params.clone)
81
83
  end
82
84
 
83
85
  # add new arguments, results in a new NodeCall
@@ -86,6 +88,10 @@ module Delorean
86
88
 
87
89
  NodeCall.new(_e, engine, node, params.merge(args))
88
90
  end
91
+
92
+ def sanitized_params
93
+ BaseClass._sanitize_hash(params)
94
+ end
89
95
  end
90
96
 
91
97
  class BaseClass
@@ -147,6 +153,15 @@ module Delorean
147
153
 
148
154
  ######################################################################
149
155
 
156
+ def self._sanitize_hash(_e)
157
+ _e.each_with_object({}) do
158
+ |(k,v), h|
159
+ h[k] = v if k =~ /\A[a-z][A-Za-z0-9_]*\z/
160
+ end
161
+ end
162
+
163
+ ######################################################################
164
+
150
165
  def self._err(*args)
151
166
  str = args.map(&:to_s).join(", ")
152
167
  raise str
@@ -2308,112 +2308,117 @@ module Delorean
2308
2308
  if r5
2309
2309
  r0 = r5
2310
2310
  else
2311
- r6 = _nt_list_expr
2311
+ r6 = _nt_self
2312
2312
  if r6
2313
2313
  r0 = r6
2314
2314
  else
2315
- r7 = _nt_set_expr
2315
+ r7 = _nt_list_expr
2316
2316
  if r7
2317
2317
  r0 = r7
2318
2318
  else
2319
- r8 = _nt_hash_expr
2319
+ r8 = _nt_set_expr
2320
2320
  if r8
2321
2321
  r0 = r8
2322
2322
  else
2323
- i9, s9 = index, []
2324
- i11, s11 = index, []
2325
- r12 = _nt_class_name
2326
- s11 << r12
2327
- if r12
2328
- if has_terminal?('::', false, index)
2329
- r13 = instantiate_node(SyntaxNode,input, index...(index + 2))
2330
- @index += 2
2331
- else
2332
- terminal_parse_failure('::')
2333
- r13 = nil
2334
- end
2335
- s11 << r13
2336
- end
2337
- if s11.last
2338
- r11 = instantiate_node(SyntaxNode,input, i11...index, s11)
2339
- r11.extend(Value0)
2340
- else
2341
- @index = i11
2342
- r11 = nil
2343
- end
2344
- if r11
2345
- r10 = r11
2346
- else
2347
- r10 = instantiate_node(SyntaxNode,input, index...index)
2348
- end
2349
- s9 << r10
2350
- if r10
2351
- r14 = _nt_class_name
2352
- s9 << r14
2353
- end
2354
- if s9.last
2355
- r9 = instantiate_node(NodeAsValue,input, i9...index, s9)
2356
- r9.extend(Value1)
2357
- else
2358
- @index = i9
2359
- r9 = nil
2360
- end
2323
+ r9 = _nt_hash_expr
2361
2324
  if r9
2362
2325
  r0 = r9
2363
2326
  else
2364
- i15, s15 = index, []
2365
- if has_terminal?('(', false, index)
2366
- r16 = instantiate_node(SyntaxNode,input, index...(index + 1))
2367
- @index += 1
2327
+ i10, s10 = index, []
2328
+ i12, s12 = index, []
2329
+ r13 = _nt_class_name
2330
+ s12 << r13
2331
+ if r13
2332
+ if has_terminal?('::', false, index)
2333
+ r14 = instantiate_node(SyntaxNode,input, index...(index + 2))
2334
+ @index += 2
2335
+ else
2336
+ terminal_parse_failure('::')
2337
+ r14 = nil
2338
+ end
2339
+ s12 << r14
2340
+ end
2341
+ if s12.last
2342
+ r12 = instantiate_node(SyntaxNode,input, i12...index, s12)
2343
+ r12.extend(Value0)
2344
+ else
2345
+ @index = i12
2346
+ r12 = nil
2347
+ end
2348
+ if r12
2349
+ r11 = r12
2350
+ else
2351
+ r11 = instantiate_node(SyntaxNode,input, index...index)
2352
+ end
2353
+ s10 << r11
2354
+ if r11
2355
+ r15 = _nt_class_name
2356
+ s10 << r15
2357
+ end
2358
+ if s10.last
2359
+ r10 = instantiate_node(NodeAsValue,input, i10...index, s10)
2360
+ r10.extend(Value1)
2368
2361
  else
2369
- terminal_parse_failure('(')
2370
- r16 = nil
2362
+ @index = i10
2363
+ r10 = nil
2371
2364
  end
2372
- s15 << r16
2373
- if r16
2374
- r18 = _nt_sp
2375
- if r18
2376
- r17 = r18
2365
+ if r10
2366
+ r0 = r10
2367
+ else
2368
+ i16, s16 = index, []
2369
+ if has_terminal?('(', false, index)
2370
+ r17 = instantiate_node(SyntaxNode,input, index...(index + 1))
2371
+ @index += 1
2377
2372
  else
2378
- r17 = instantiate_node(SyntaxNode,input, index...index)
2373
+ terminal_parse_failure('(')
2374
+ r17 = nil
2379
2375
  end
2380
- s15 << r17
2376
+ s16 << r17
2381
2377
  if r17
2382
- r19 = _nt_expression
2383
- s15 << r19
2378
+ r19 = _nt_sp
2384
2379
  if r19
2385
- r21 = _nt_sp
2386
- if r21
2387
- r20 = r21
2388
- else
2389
- r20 = instantiate_node(SyntaxNode,input, index...index)
2390
- end
2391
- s15 << r20
2380
+ r18 = r19
2381
+ else
2382
+ r18 = instantiate_node(SyntaxNode,input, index...index)
2383
+ end
2384
+ s16 << r18
2385
+ if r18
2386
+ r20 = _nt_expression
2387
+ s16 << r20
2392
2388
  if r20
2393
- if has_terminal?(')', false, index)
2394
- r22 = instantiate_node(SyntaxNode,input, index...(index + 1))
2395
- @index += 1
2389
+ r22 = _nt_sp
2390
+ if r22
2391
+ r21 = r22
2396
2392
  else
2397
- terminal_parse_failure(')')
2398
- r22 = nil
2393
+ r21 = instantiate_node(SyntaxNode,input, index...index)
2394
+ end
2395
+ s16 << r21
2396
+ if r21
2397
+ if has_terminal?(')', false, index)
2398
+ r23 = instantiate_node(SyntaxNode,input, index...(index + 1))
2399
+ @index += 1
2400
+ else
2401
+ terminal_parse_failure(')')
2402
+ r23 = nil
2403
+ end
2404
+ s16 << r23
2399
2405
  end
2400
- s15 << r22
2401
2406
  end
2402
2407
  end
2403
2408
  end
2404
- end
2405
- if s15.last
2406
- r15 = instantiate_node(Expr,input, i15...index, s15)
2407
- r15.extend(Value2)
2408
- else
2409
- @index = i15
2410
- r15 = nil
2411
- end
2412
- if r15
2413
- r0 = r15
2414
- else
2415
- @index = i0
2416
- r0 = nil
2409
+ if s16.last
2410
+ r16 = instantiate_node(Expr,input, i16...index, s16)
2411
+ r16.extend(Value2)
2412
+ else
2413
+ @index = i16
2414
+ r16 = nil
2415
+ end
2416
+ if r16
2417
+ r0 = r16
2418
+ else
2419
+ @index = i0
2420
+ r0 = nil
2421
+ end
2417
2422
  end
2418
2423
  end
2419
2424
  end
@@ -3049,6 +3054,30 @@ module Delorean
3049
3054
  r0
3050
3055
  end
3051
3056
 
3057
+ def _nt_self
3058
+ start_index = index
3059
+ if node_cache[:self].has_key?(index)
3060
+ cached = node_cache[:self][index]
3061
+ if cached
3062
+ cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
3063
+ @index = cached.interval.end
3064
+ end
3065
+ return cached
3066
+ end
3067
+
3068
+ if has_terminal?('_', false, index)
3069
+ r0 = instantiate_node(Self,input, index...(index + 1))
3070
+ @index += 1
3071
+ else
3072
+ terminal_parse_failure('_')
3073
+ r0 = nil
3074
+ end
3075
+
3076
+ node_cache[:self][start_index] = r0
3077
+
3078
+ r0
3079
+ end
3080
+
3052
3081
  def _nt_nil_val
3053
3082
  start_index = index
3054
3083
  if node_cache[:nil_val].has_key?(index)
@@ -105,6 +105,7 @@ grammar Delorean
105
105
  boolean /
106
106
  nil_val /
107
107
  identifier /
108
+ self /
108
109
  list_expr /
109
110
  set_expr /
110
111
  hash_expr /
@@ -144,6 +145,10 @@ grammar Delorean
144
145
  'true' <Literal> / 'false' <Literal>
145
146
  end
146
147
 
148
+ rule self
149
+ '_' <Self>
150
+ end
151
+
147
152
  rule nil_val
148
153
  'nil' <Literal>
149
154
  end
@@ -343,7 +343,7 @@ module Delorean
343
343
  evaluate_attrs(node, [attr], params)[0]
344
344
  end
345
345
 
346
- def evaluate_attrs_hash(node, attrs, params={})
346
+ def eval_to_hash(node, attrs, params={})
347
347
  res = evaluate_attrs(node, attrs, params)
348
348
  Hash[* attrs.zip(res).flatten(1)]
349
349
  end
@@ -202,6 +202,17 @@ eos
202
202
  end
203
203
  end
204
204
 
205
+ # _ is self -- a naive implementation of "self" for now.
206
+ class Self < SNode
207
+ def check(context, *)
208
+ []
209
+ end
210
+
211
+ def rewrite(context)
212
+ "_sanitize_hash(_e)"
213
+ end
214
+ end
215
+
205
216
  class DString < Literal
206
217
  def rewrite(context)
207
218
  # remove the quotes and requote. We don't want the likes of #{}
@@ -1,3 +1,3 @@
1
1
  module Delorean
2
- VERSION = "0.3.1"
2
+ VERSION = "0.3.2"
3
3
  end
@@ -244,7 +244,7 @@ describe "Delorean" do
244
244
  }.should raise_error(Delorean::InvalidGetAttribute)
245
245
  end
246
246
 
247
- it "should be able to get attr on ActiveRecord objects using Class.method().attr syntax" do
247
+ it "should be able to get attr on AR objs using Class.method().attr syntax" do
248
248
  engine.parse defn("A:",
249
249
  ' b = Dummy.i_just_met_you("CRJ", 1.234).name',
250
250
  )
@@ -252,7 +252,7 @@ describe "Delorean" do
252
252
  r.should == "CRJ"
253
253
  end
254
254
 
255
- it "should be able to access ActiveRecord whitelisted fns using .attr syntax" do
255
+ it "should be able to access ActiveRecord whitelisted fns using .x syntax" do
256
256
  engine.parse defn("A:",
257
257
  ' b = Dummy.i_just_met_you("CRJ", 1.234).name2',
258
258
  )
@@ -809,4 +809,22 @@ eof
809
809
  engine.evaluate("B", "m").should == [5, 2]
810
810
  end
811
811
 
812
+ it "implements simple version of self (_)" do
813
+ engine.parse defn("B:",
814
+ " a =?",
815
+ " b =?",
816
+ " x = a - b",
817
+ "A:",
818
+ " a =?",
819
+ " b =?",
820
+ " x = _.a * _.b",
821
+ " y = a && _",
822
+ " z = (B() + _).x",
823
+ )
824
+
825
+ engine.evaluate("A", "x", {"a"=>3, "b"=>5}).should == 15
826
+ h = {"a"=>1, "b"=>2, "c"=>3}
827
+ engine.evaluate("A", "y", {"a"=>1, "b"=>2, "c"=>3}).should == h
828
+ engine.evaluate("A", "z", {"a"=>1, "b"=>2, "c"=>3}).should == -1
829
+ end
812
830
  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.1
4
+ version: 0.3.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Arman Bostani
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-05-05 00:00:00.000000000 Z
11
+ date: 2014-05-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: treetop