delorean_lang 0.2.0 → 0.2.1

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
- NzA4ZGU5ZGEwNmIwNjU0NzYyYWZkMTU4MTAxNzdiMzg3ZjFjODQyNA==
4
+ MjQ5M2EzMTc3OGJlMmFhYTY0YmY1YTE5ODg5MTZiYjk2NmFjNDk1OA==
5
5
  data.tar.gz: !binary |-
6
- ZmNkNTk2Y2Y2YzU5NzJiZTE5MzNmYTU4ODAwYzU3NTAyNmY5ZTJiNg==
6
+ NTVhYzM1MGQxNmNkNjM1YWQ4Zjc3ZjU2MDQzOGJjNzA5MjczNmNmNA==
7
7
  SHA512:
8
8
  metadata.gz: !binary |-
9
- MzY1ZTk3YWMyYTgzODY5ZjM1YjFmODAxM2JlZWJlNDQ4NTg4Yzg1ODNjNGFm
10
- NGQwYzM1MmE4YTYxZDVhNzA0NDlhYmFiZGM1NjJhNTVlOGEzYjViYmRiYzA2
11
- NGFhMDQyZWEwYjUxOTdiOTc2ZDAyYjE5M2M1NjZlMzgxMDU3OTc=
9
+ ZjA2NWM5NmQ0Zjg1NjkxYTI1YjBmZTEzYTdkNzJiODRkMzI2YTQ1NWNlZjA1
10
+ ODgyZjkzODAxYWViOTBmNDI0ODViNzBmMWE0NjRjZjE2NzI4ZWZjMmMzZDYw
11
+ YzhjMDQ5MjQyNzVhYjYyN2ZhYTMzODcyNzNkYTg4Y2Q5OWVmZWY=
12
12
  data.tar.gz: !binary |-
13
- MzkwMmQwOGUxN2U2MjJmZjJhZjQ0MmU0NGY0Mzg4ZmQ2NmVhZGRlNzI0YjNi
14
- NzQyNGE2MTRiYzRkNTdiMTRiMDNmNmNlYzJmOTMyYWU5MDM4ZmY1NjRlM2Y5
15
- ZmQxZWNmMmQyZjAyYzE3NmQ0ODg0YWUxZDY2MjAzMTNjOWFiYmU=
13
+ NzQ5YTJmODYwNTdkMjYyM2I1NzZiYjU2MjIyZmMzNzk1MTU4YTJmNDBlMzE4
14
+ MzlmYzU0ZmRmNmNmMThiYzA5ODdkNThhZjQ5MzAzZDI5MTVkMjk3MTE4ZjFl
15
+ ZjAyYjkzOTA5YmJlMmYxYTk5YjcwOWMxYWJjMTJhNWJmY2U2MDI=
@@ -98,7 +98,7 @@ module Delorean
98
98
  end
99
99
 
100
100
  module Formula0
101
- def sp
101
+ def sp4
102
102
  elements[0]
103
103
  end
104
104
 
@@ -112,7 +112,7 @@ module Delorean
112
112
  end
113
113
 
114
114
  module Formula1
115
- def sp
115
+ def sp4
116
116
  elements[0]
117
117
  end
118
118
 
@@ -123,7 +123,7 @@ module Delorean
123
123
  end
124
124
 
125
125
  module Formula2
126
- def sp
126
+ def sp4
127
127
  elements[0]
128
128
  end
129
129
 
@@ -187,7 +187,7 @@ module Delorean
187
187
 
188
188
  i0 = index
189
189
  i1, s1 = index, []
190
- r2 = _nt_sp
190
+ r2 = _nt_sp4
191
191
  s1 << r2
192
192
  if r2
193
193
  r3 = _nt_identifier
@@ -236,7 +236,7 @@ module Delorean
236
236
  r0 = r1
237
237
  else
238
238
  i10, s10 = index, []
239
- r11 = _nt_sp
239
+ r11 = _nt_sp4
240
240
  s10 << r11
241
241
  if r11
242
242
  r12 = _nt_identifier
@@ -272,7 +272,7 @@ module Delorean
272
272
  r0 = r10
273
273
  else
274
274
  i16, s16 = index, []
275
- r17 = _nt_sp
275
+ r17 = _nt_sp4
276
276
  s16 << r17
277
277
  if r17
278
278
  r18 = _nt_identifier
@@ -2697,22 +2697,31 @@ module Delorean
2697
2697
  r3 = _nt_identifier
2698
2698
  s2 << r3
2699
2699
  if r3
2700
- if has_terminal?(':', false, index)
2701
- r4 = instantiate_node(SyntaxNode,input, index...(index + 1))
2702
- @index += 1
2700
+ r5 = _nt_sp
2701
+ if r5
2702
+ r4 = r5
2703
2703
  else
2704
- terminal_parse_failure(':')
2705
- r4 = nil
2704
+ r4 = instantiate_node(SyntaxNode,input, index...index)
2706
2705
  end
2707
2706
  s2 << r4
2708
2707
  if r4
2709
- r6 = _nt_sp
2710
- if r6
2711
- r5 = r6
2708
+ if has_terminal?('=', false, index)
2709
+ r6 = instantiate_node(SyntaxNode,input, index...(index + 1))
2710
+ @index += 1
2712
2711
  else
2713
- r5 = instantiate_node(SyntaxNode,input, index...index)
2712
+ terminal_parse_failure('=')
2713
+ r6 = nil
2714
+ end
2715
+ s2 << r6
2716
+ if r6
2717
+ r8 = _nt_sp
2718
+ if r8
2719
+ r7 = r8
2720
+ else
2721
+ r7 = instantiate_node(SyntaxNode,input, index...index)
2722
+ end
2723
+ s2 << r7
2714
2724
  end
2715
- s2 << r5
2716
2725
  end
2717
2726
  end
2718
2727
  if s2.last
@@ -2729,58 +2738,58 @@ module Delorean
2729
2738
  end
2730
2739
  s0 << r1
2731
2740
  if r1
2732
- r7 = _nt_expression
2733
- s0 << r7
2734
- if r7
2735
- i9, s9 = index, []
2736
- r11 = _nt_sp
2737
- if r11
2738
- r10 = r11
2741
+ r9 = _nt_expression
2742
+ s0 << r9
2743
+ if r9
2744
+ i11, s11 = index, []
2745
+ r13 = _nt_sp
2746
+ if r13
2747
+ r12 = r13
2739
2748
  else
2740
- r10 = instantiate_node(SyntaxNode,input, index...index)
2749
+ r12 = instantiate_node(SyntaxNode,input, index...index)
2741
2750
  end
2742
- s9 << r10
2743
- if r10
2751
+ s11 << r12
2752
+ if r12
2744
2753
  if has_terminal?(',', false, index)
2745
- r12 = instantiate_node(SyntaxNode,input, index...(index + 1))
2754
+ r14 = instantiate_node(SyntaxNode,input, index...(index + 1))
2746
2755
  @index += 1
2747
2756
  else
2748
2757
  terminal_parse_failure(',')
2749
- r12 = nil
2758
+ r14 = nil
2750
2759
  end
2751
- s9 << r12
2752
- if r12
2753
- r14 = _nt_sp
2754
- if r14
2755
- r13 = r14
2760
+ s11 << r14
2761
+ if r14
2762
+ r16 = _nt_sp
2763
+ if r16
2764
+ r15 = r16
2756
2765
  else
2757
- r13 = instantiate_node(SyntaxNode,input, index...index)
2766
+ r15 = instantiate_node(SyntaxNode,input, index...index)
2758
2767
  end
2759
- s9 << r13
2760
- if r13
2761
- r16 = _nt_kw_args
2762
- if r16
2763
- r15 = r16
2768
+ s11 << r15
2769
+ if r15
2770
+ r18 = _nt_kw_args
2771
+ if r18
2772
+ r17 = r18
2764
2773
  else
2765
- r15 = instantiate_node(SyntaxNode,input, index...index)
2774
+ r17 = instantiate_node(SyntaxNode,input, index...index)
2766
2775
  end
2767
- s9 << r15
2776
+ s11 << r17
2768
2777
  end
2769
2778
  end
2770
2779
  end
2771
- if s9.last
2772
- r9 = instantiate_node(SyntaxNode,input, i9...index, s9)
2773
- r9.extend(KwArgs1)
2780
+ if s11.last
2781
+ r11 = instantiate_node(SyntaxNode,input, i11...index, s11)
2782
+ r11.extend(KwArgs1)
2774
2783
  else
2775
- @index = i9
2776
- r9 = nil
2784
+ @index = i11
2785
+ r11 = nil
2777
2786
  end
2778
- if r9
2779
- r8 = r9
2787
+ if r11
2788
+ r10 = r11
2780
2789
  else
2781
- r8 = instantiate_node(SyntaxNode,input, index...index)
2790
+ r10 = instantiate_node(SyntaxNode,input, index...index)
2782
2791
  end
2783
- s0 << r8
2792
+ s0 << r10
2784
2793
  end
2785
2794
  end
2786
2795
  if s0.last
@@ -3064,6 +3073,30 @@ module Delorean
3064
3073
  r0
3065
3074
  end
3066
3075
 
3076
+ def _nt_sp4
3077
+ start_index = index
3078
+ if node_cache[:sp4].has_key?(index)
3079
+ cached = node_cache[:sp4][index]
3080
+ if cached
3081
+ cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
3082
+ @index = cached.interval.end
3083
+ end
3084
+ return cached
3085
+ end
3086
+
3087
+ if has_terminal?(' ', false, index)
3088
+ r0 = instantiate_node(SyntaxNode,input, index...(index + 4))
3089
+ @index += 4
3090
+ else
3091
+ terminal_parse_failure(' ')
3092
+ r0 = nil
3093
+ end
3094
+
3095
+ node_cache[:sp4][start_index] = r0
3096
+
3097
+ r0
3098
+ end
3099
+
3067
3100
  def _nt_sp
3068
3101
  start_index = index
3069
3102
  if node_cache[:sp].has_key?(index)
@@ -4,11 +4,11 @@ grammar Delorean
4
4
  end
5
5
 
6
6
  rule formula
7
- sp i:identifier sp? '=?' sp? e:expression <ParameterDefault>
7
+ sp4 i:identifier sp? '=?' sp? e:expression <ParameterDefault>
8
8
  /
9
- sp i:identifier sp? '=?' <Parameter>
9
+ sp4 i:identifier sp? '=?' <Parameter>
10
10
  /
11
- sp i:identifier sp? '=' sp? e:expression <Formula>
11
+ sp4 i:identifier sp? '=' sp? e:expression <Formula>
12
12
  /
13
13
  n:class_name ':' sp? mod:(m:class_name '::')? p:class_name <SubNode>
14
14
  /
@@ -26,9 +26,9 @@ grammar Delorean
26
26
  /
27
27
  op:unary_op sp? e:expression <UnOp>
28
28
  /
29
- 'if' sp? v:expression sp?
30
- 'then' sp? e1:expression sp?
31
- 'else' sp? e2:expression <IfElse>
29
+ 'if' sp? v:expression sp?
30
+ 'then' sp? e1:expression sp?
31
+ 'else' sp? e2:expression <IfElse>
32
32
  /
33
33
  v:getattr_exp sp? op:binary_op sp? e:expression <BinOp>
34
34
  /
@@ -100,16 +100,16 @@ grammar Delorean
100
100
  end
101
101
 
102
102
  rule value
103
- number /
104
- string /
105
- boolean /
106
- nil_val /
107
- identifier /
108
- list_expr /
109
- set_expr /
110
- hash_expr /
103
+ number /
104
+ string /
105
+ boolean /
106
+ nil_val /
107
+ identifier /
108
+ list_expr /
109
+ set_expr /
110
+ hash_expr /
111
111
  mod:(m:class_name '::')? c:class_name <NodeAsValue> /
112
- '(' sp? e:expression sp? ')' <Expr>
112
+ '(' sp? e:expression sp? ')' <Expr>
113
113
  end
114
114
 
115
115
  rule fn_args
@@ -121,7 +121,7 @@ grammar Delorean
121
121
  end
122
122
 
123
123
  rule kw_args
124
- k:(i:identifier ':' sp?)? arg0:expression args_rest:(sp? ',' sp? al:kw_args?)? <KwArgs>
124
+ k:(i:identifier sp? '=' sp?)? arg0:expression args_rest:(sp? ',' sp? al:kw_args?)? <KwArgs>
125
125
  end
126
126
 
127
127
  rule number
@@ -148,6 +148,11 @@ grammar Delorean
148
148
  'nil' <Literal>
149
149
  end
150
150
 
151
+ # and you thought python was anal about spaces?
152
+ rule sp4
153
+ ' '
154
+ end
155
+
151
156
  rule sp
152
157
  [\s]+
153
158
  end
@@ -10,6 +10,10 @@ module Delorean
10
10
  @line = line
11
11
  @module_name = module_name
12
12
  end
13
+
14
+ def to_s
15
+ super + " #{module_name}:#{line}"
16
+ end
13
17
  end
14
18
 
15
19
  class UndefinedError < ParseError
@@ -1,3 +1,3 @@
1
1
  module Delorean
2
- VERSION = "0.2.0"
2
+ VERSION = "0.2.1"
3
3
  end
@@ -8,28 +8,28 @@ describe "Delorean" do
8
8
 
9
9
  it "can enumerate nodes" do
10
10
  engine.parse defn("X:",
11
- " a = 123",
12
- " b = a",
11
+ " a = 123",
12
+ " b = a",
13
13
  "Y: X",
14
14
  "A:",
15
15
  "XX: Y",
16
- " a = 11",
17
- " c =?",
18
- " d = 456",
16
+ " a = 11",
17
+ " c =?",
18
+ " d = 456",
19
19
  )
20
20
  engine.enumerate_nodes.should == SortedSet.new(["A", "X", "XX", "Y"])
21
21
  end
22
22
 
23
23
  it "can enumerate all attrs" do
24
24
  engine.parse defn("X:",
25
- " a = 123",
26
- " b = a",
25
+ " a = 123",
26
+ " b = a",
27
27
  "Y: X",
28
28
  "Z:",
29
29
  "XX: Y",
30
- " a = 11",
31
- " c =?",
32
- " d = 456",
30
+ " a = 11",
31
+ " c =?",
32
+ " d = 456",
33
33
  )
34
34
  engine.enumerate_attrs.should == {
35
35
  "X"=>["a", "b"],
@@ -41,14 +41,14 @@ describe "Delorean" do
41
41
 
42
42
  it "can enumerate attrs by node" do
43
43
  engine.parse defn("X:",
44
- " a = 123",
45
- " b = a",
44
+ " a = 123",
45
+ " b = a",
46
46
  "Y: X",
47
47
  "Z:",
48
48
  "XX: Y",
49
- " a = 11",
50
- " c =?",
51
- " d = 456",
49
+ " a = 11",
50
+ " c =?",
51
+ " d = 456",
52
52
  )
53
53
  engine.enumerate_attrs_by_node("X").should == ["a", "b"]
54
54
  engine.enumerate_attrs_by_node("Y").should == ["a", "b"]
@@ -58,17 +58,17 @@ describe "Delorean" do
58
58
 
59
59
  it "can enumerate params" do
60
60
  engine.parse defn("X:",
61
- " a =? 123",
62
- " b = a",
61
+ " a =? 123",
62
+ " b = a",
63
63
  "Y: X",
64
64
  "Z:",
65
65
  "XX: Y",
66
- " a = 11",
67
- " c =?",
68
- " d = 123",
66
+ " a = 11",
67
+ " c =?",
68
+ " d = 123",
69
69
  "YY: XX",
70
- " c =? 22",
71
- " e =? 11",
70
+ " c =? 22",
71
+ " e =? 11",
72
72
  )
73
73
 
74
74
  engine.enumerate_params.should == Set.new(["a", "c", "e"])
@@ -76,17 +76,17 @@ describe "Delorean" do
76
76
 
77
77
  it "can enumerate params by node" do
78
78
  engine.parse defn("X:",
79
- " a =? 123",
80
- " b = a",
79
+ " a =? 123",
80
+ " b = a",
81
81
  "Y: X",
82
82
  "Z:",
83
83
  "XX: Y",
84
- " a = 11",
85
- " c =?",
86
- " d = 123",
84
+ " a = 11",
85
+ " c =?",
86
+ " d = 123",
87
87
  "YY: XX",
88
- " c =? 22",
89
- " e =? 11",
88
+ " c =? 22",
89
+ " e =? 11",
90
90
  )
91
91
  engine.enumerate_params_by_node("X").should == Set.new(["a"])
92
92
  engine.enumerate_params_by_node("XX").should == Set.new(["a", "c"])
@@ -6,8 +6,8 @@ describe "Delorean" do
6
6
  TestContainer.new({
7
7
  "AAA" =>
8
8
  defn("X:",
9
- " a =? 123",
10
- " b = a*2",
9
+ " a =? 123",
10
+ " b = a*2",
11
11
  )
12
12
  })
13
13
  }
@@ -18,10 +18,10 @@ describe "Delorean" do
18
18
 
19
19
  it "evaluate simple expressions" do
20
20
  engine.parse defn("A:",
21
- " a = 123",
22
- " x = -(a * 2)",
23
- " b = -(a + 1)",
24
- " c = -a + 1",
21
+ " a = 123",
22
+ " x = -(a * 2)",
23
+ " b = -(a + 1)",
24
+ " c = -a + 1",
25
25
  )
26
26
 
27
27
  engine.evaluate_attrs("A", ["a"]).should == [123]
@@ -32,8 +32,8 @@ describe "Delorean" do
32
32
 
33
33
  it "proper unary expression evaluation" do
34
34
  engine.parse defn("A:",
35
- " a = 123",
36
- " c = -a + 1",
35
+ " a = 123",
36
+ " c = -a + 1",
37
37
  )
38
38
 
39
39
  r = engine.evaluate("A", "c")
@@ -42,17 +42,17 @@ describe "Delorean" do
42
42
 
43
43
  it "should handle getattr in expressions" do
44
44
  engine.parse defn("A:",
45
- " a = {'x':123, 'y':456, 'z':789}",
46
- " b = A.a.x * A.a.y - A.a.z",
45
+ " a = {'x':123, 'y':456, 'z':789}",
46
+ " b = A.a.x * A.a.y - A.a.z",
47
47
  )
48
48
  engine.evaluate_attrs("A", ["b"]).should == [123*456-789]
49
49
  end
50
50
 
51
51
  it "should be able to evaluate multiple node attrs" do
52
52
  engine.parse defn("A:",
53
- " a =? 123",
54
- " b = a % 11",
55
- " c = a / 4.0",
53
+ " a =? 123",
54
+ " b = a % 11",
55
+ " c = a / 4.0",
56
56
  )
57
57
 
58
58
  h = {"a" => 16}
@@ -62,8 +62,8 @@ describe "Delorean" do
62
62
 
63
63
  it "should give error when accessing undefined attr" do
64
64
  engine.parse defn("A:",
65
- " a = 1",
66
- " c = a.to_s",
65
+ " a = 1",
66
+ " c = a.to_s",
67
67
  )
68
68
 
69
69
  lambda {
@@ -73,8 +73,8 @@ describe "Delorean" do
73
73
 
74
74
  it "should handle default param values" do
75
75
  engine.parse defn("A:",
76
- " a =? 123",
77
- " c = a / 123.0",
76
+ " a =? 123",
77
+ " c = a / 123.0",
78
78
  )
79
79
 
80
80
  r = engine.evaluate("A", "c")
@@ -83,10 +83,10 @@ describe "Delorean" do
83
83
 
84
84
  it "order of attr evaluation should not matter" do
85
85
  engine.parse defn("A:",
86
- " a =? 1",
86
+ " a =? 1",
87
87
  "B:",
88
- " a =? 2",
89
- " c = A.a",
88
+ " a =? 2",
89
+ " c = A.a",
90
90
  )
91
91
  engine.evaluate_attrs("B", %w{c a}).should == [1, 2]
92
92
  engine.evaluate_attrs("B", %w{a c}).should == [2, 1]
@@ -94,13 +94,13 @@ describe "Delorean" do
94
94
 
95
95
  it "params should behave properly with inheritance" do
96
96
  engine.parse defn("A:",
97
- " a =? 1",
97
+ " a =? 1",
98
98
  "B: A",
99
- " a =? 2",
99
+ " a =? 2",
100
100
  "C: B",
101
- " a =? 3",
102
- " b = B.a",
103
- " c = A.a",
101
+ " a =? 3",
102
+ " b = B.a",
103
+ " c = A.a",
104
104
  )
105
105
  engine.evaluate_attrs("C", %w{a b c}).should == [3, 2, 1]
106
106
  engine.evaluate_attrs("C", %w{a b c}, {"a" => 4}).should == [4, 4, 4]
@@ -109,8 +109,8 @@ describe "Delorean" do
109
109
 
110
110
  it "should give error when param is undefined for eval" do
111
111
  engine.parse defn("A:",
112
- " a =?",
113
- " c = a / 123.0",
112
+ " a =?",
113
+ " c = a / 123.0",
114
114
  )
115
115
 
116
116
  lambda {
@@ -120,8 +120,8 @@ describe "Delorean" do
120
120
 
121
121
  it "should handle simple param computation" do
122
122
  engine.parse defn("A:",
123
- " a =?",
124
- " c = a / 123.0",
123
+ " a =?",
124
+ " c = a / 123.0",
125
125
  )
126
126
 
127
127
  r = engine.evaluate("A", "c", {"a" => 123})
@@ -130,7 +130,7 @@ describe "Delorean" do
130
130
 
131
131
  it "should give error on unknown node" do
132
132
  engine.parse defn("A:",
133
- " a = 1",
133
+ " a = 1",
134
134
  )
135
135
 
136
136
  lambda {
@@ -140,8 +140,8 @@ describe "Delorean" do
140
140
 
141
141
  it "should handle runtime errors and report module/line number" do
142
142
  engine.parse defn("A:",
143
- " a = 1/0",
144
- " b = 10 * a",
143
+ " a = 1/0",
144
+ " b = 10 * a",
145
145
  )
146
146
 
147
147
  begin
@@ -158,7 +158,7 @@ describe "Delorean" do
158
158
 
159
159
  it "should handle runtime errors 2" do
160
160
  engine.parse defn("A:",
161
- " b = Dummy.call_me_maybe('a', 'b')",
161
+ " b = Dummy.call_me_maybe('a', 'b')",
162
162
  )
163
163
 
164
164
  begin
@@ -172,10 +172,10 @@ describe "Delorean" do
172
172
 
173
173
  it "should handle operator precedence properly" do
174
174
  engine.parse defn("A:",
175
- " b = 3+2*4-1",
176
- " c = b*3+5",
177
- " d = b*2-c*2",
178
- " e = if (d < -10) then -123-1 else -456+1",
175
+ " b = 3+2*4-1",
176
+ " c = b*3+5",
177
+ " d = b*2-c*2",
178
+ " e = if (d < -10) then -123-1 else -456+1",
179
179
  )
180
180
 
181
181
  r = engine.evaluate("A", "d")
@@ -187,8 +187,8 @@ describe "Delorean" do
187
187
 
188
188
  it "should handle if/else" do
189
189
  text = defn("A:",
190
- " d =? -10",
191
- ' e = if d < -10 then "gungam"+"style" else "korea"'
190
+ " d =? -10",
191
+ ' e = if d < -10 then "gungam"+"style" else "korea"'
192
192
  )
193
193
 
194
194
  engine.parse text
@@ -201,13 +201,13 @@ describe "Delorean" do
201
201
 
202
202
  it "should be able to access specific node attrs " do
203
203
  engine.parse defn("A:",
204
- " b = 123",
205
- " c =?",
204
+ " b = 123",
205
+ " c =?",
206
206
  "B: A",
207
- " b = 111",
208
- " c = A.b * 123",
207
+ " b = 111",
208
+ " c = A.b * 123",
209
209
  "C:",
210
- " c = A.c + B.c",
210
+ " c = A.c + B.c",
211
211
  )
212
212
 
213
213
  r = engine.evaluate("B", "c")
@@ -218,9 +218,9 @@ describe "Delorean" do
218
218
 
219
219
  it "should be able to call class methods on ActiveRecord classes" do
220
220
  engine.parse defn("A:",
221
- " b = Dummy.call_me_maybe(1, 2, 3, 4)",
222
- " c = Dummy.call_me_maybe()",
223
- " d = Dummy.call_me_maybe(5) + b + c",
221
+ " b = Dummy.call_me_maybe(1, 2, 3, 4)",
222
+ " c = Dummy.call_me_maybe()",
223
+ " d = Dummy.call_me_maybe(5) + b + c",
224
224
  )
225
225
  r = engine.evaluate_attrs("A", ["b", "c", "d"])
226
226
  r.should == [10, 0, 15]
@@ -228,10 +228,10 @@ describe "Delorean" do
228
228
 
229
229
  it "should be able to get attr on ActiveRecord objects using a.b syntax" do
230
230
  engine.parse defn("A:",
231
- ' b = Dummy.i_just_met_you("this is crazy", 0.404)',
232
- " c = b.number",
233
- " d = b.name",
234
- " e = b.foo",
231
+ ' b = Dummy.i_just_met_you("this is crazy", 0.404)',
232
+ " c = b.number",
233
+ " d = b.name",
234
+ " e = b.foo",
235
235
  )
236
236
  r = engine.evaluate("A", "c")
237
237
  r.should == 0.404
@@ -246,7 +246,7 @@ describe "Delorean" do
246
246
 
247
247
  it "should be able to get attr on ActiveRecord objects using Class.method().attr syntax" do
248
248
  engine.parse defn("A:",
249
- ' b = Dummy.i_just_met_you("CRJ", 1.234).name',
249
+ ' b = Dummy.i_just_met_you("CRJ", 1.234).name',
250
250
  )
251
251
  r = engine.evaluate("A", "b")
252
252
  r.should == "CRJ"
@@ -254,19 +254,19 @@ describe "Delorean" do
254
254
 
255
255
  it "should be able to get attr on Hash objects using a.b syntax" do
256
256
  engine.parse defn("A:",
257
- ' b = Dummy.i_threw_a_hash_in_the_well()',
258
- " c = b.a",
259
- " d = b.b",
260
- " e = b.this_is_crazy",
257
+ ' b = Dummy.i_threw_a_hash_in_the_well()',
258
+ " c = b.a",
259
+ " d = b.b",
260
+ " e = b.this_is_crazy",
261
261
  )
262
262
  engine.evaluate_attrs("A", %w{c d e}).should == [456, 789, nil]
263
263
  end
264
264
 
265
265
  it "get attr on nil should return nil" do
266
266
  engine.parse defn("A:",
267
- ' b = Dummy.i_just_met_you("CRJ", 1.234).dummy',
268
- ' c = b.gaga',
269
- ' d = b.gaga || 55',
267
+ ' b = Dummy.i_just_met_you("CRJ", 1.234).dummy',
268
+ ' c = b.gaga',
269
+ ' d = b.gaga || 55',
270
270
  )
271
271
  r = engine.evaluate_attrs("A", ["b", "c", "d"])
272
272
  r.should == [nil, nil, 55]
@@ -274,8 +274,8 @@ describe "Delorean" do
274
274
 
275
275
  it "should be able to get assoc attr on ActiveRecord objects" do
276
276
  engine.parse defn("A:",
277
- ' b = Dummy.miss_you_so_bad()',
278
- ' c = b.dummy',
277
+ ' b = Dummy.miss_you_so_bad()',
278
+ ' c = b.dummy',
279
279
  )
280
280
  r = engine.evaluate("A", "c")
281
281
  r.name.should == "hello"
@@ -283,24 +283,24 @@ describe "Delorean" do
283
283
 
284
284
  it "should be able to get attr on node" do
285
285
  engine.parse defn("A:",
286
- " a = 123",
287
- " b = A",
288
- " c = b.a * 2",
286
+ " a = 123",
287
+ " b = A",
288
+ " c = b.a * 2",
289
289
  )
290
290
  engine.evaluate_attrs("A", %w{a c}).should == [123, 123*2]
291
291
  end
292
292
 
293
293
  getattr_code = <<eoc
294
294
  A:
295
- x = 1
295
+ x = 1
296
296
  B:
297
- x = 2
297
+ x = 2
298
298
  C:
299
- x = 3
299
+ x = 3
300
300
  D:
301
- xs = [A, B, C]
301
+ xs = [A, B, C]
302
302
  E:
303
- xx = [n.x for n in D.xs]
303
+ xx = [n.x for n in D.xs]
304
304
  eoc
305
305
 
306
306
  it "should be able to get attr on node 2" do
@@ -310,7 +310,7 @@ eoc
310
310
 
311
311
  it "should be able to call class methods on AR classes in modules" do
312
312
  engine.parse defn("A:",
313
- " b = M::LittleDummy.heres_my_number(867, 5309)",
313
+ " b = M::LittleDummy.heres_my_number(867, 5309)",
314
314
  )
315
315
  r = engine.evaluate("A", "b")
316
316
  r.should == 867 + 5309
@@ -318,7 +318,7 @@ eoc
318
318
 
319
319
  it "should not eval inside strings" do
320
320
  engine.parse defn("A:",
321
- ' d = "#{this is a test}"',
321
+ ' d = "#{this is a test}"',
322
322
  )
323
323
 
324
324
  r = engine.evaluate("A", "d")
@@ -327,7 +327,7 @@ eoc
327
327
 
328
328
  it "should ignore undeclared params sent to eval which match attr names" do
329
329
  engine.parse defn("A:",
330
- " d = 12",
330
+ " d = 12",
331
331
  )
332
332
  r = engine.evaluate("A", "d", {"d" => 5, "e" => 6})
333
333
  r.should == 12
@@ -335,12 +335,12 @@ eoc
335
335
 
336
336
  it "should handle different param defaults on nodes" do
337
337
  engine.parse defn("A:",
338
- " p =? 1",
339
- " c = p * 123",
338
+ " p =? 1",
339
+ " c = p * 123",
340
340
  "B: A",
341
- " p =? 2",
341
+ " p =? 2",
342
342
  "C: A",
343
- " p =? 3",
343
+ " p =? 3",
344
344
  )
345
345
 
346
346
  r = engine.evaluate("C", "c", {"p" => 5})
@@ -361,10 +361,10 @@ eoc
361
361
 
362
362
  it "should allow overriding of attrs as params" do
363
363
  engine.parse defn("A:",
364
- " a = 2",
365
- " b = a*3",
364
+ " a = 2",
365
+ " b = a*3",
366
366
  "B: A",
367
- " a =?",
367
+ " a =?",
368
368
  )
369
369
 
370
370
  r = engine.evaluate("A", "b", {"a" => 10})
@@ -381,16 +381,16 @@ eoc
381
381
 
382
382
  sample_script = <<eof
383
383
  A:
384
- a = 2
385
- p =?
386
- c = a * 2
387
- pc = p + c
384
+ a = 2
385
+ p =?
386
+ c = a * 2
387
+ pc = p + c
388
388
 
389
389
  C: A
390
390
  p =? 3
391
391
 
392
392
  B: A
393
- p =? 5
393
+ p =? 5
394
394
  eof
395
395
 
396
396
  it "should allow overriding of attrs as params" do
@@ -414,19 +414,19 @@ eof
414
414
  engin2 = Delorean::Engine.new(engine.module_name)
415
415
 
416
416
  engine.parse defn("A:",
417
- " a = 123",
418
- " b = a*3",
417
+ " a = 123",
418
+ " b = a*3",
419
419
  "B: A",
420
- " c = b*2",
420
+ " c = b*2",
421
421
  )
422
422
 
423
423
  engin2.parse defn("A:",
424
- " a = 222.0",
425
- " b = a/5",
424
+ " a = 222.0",
425
+ " b = a/5",
426
426
  "B: A",
427
- " c = b*3",
427
+ " c = b*3",
428
428
  "C:",
429
- " d = 111",
429
+ " d = 111",
430
430
  )
431
431
 
432
432
  engine.evaluate_attrs("A", ["a", "b"]).should == [123, 123*3]
@@ -450,10 +450,10 @@ eof
450
450
 
451
451
  it "should eval lists" do
452
452
  engine.parse defn("A:",
453
- " b = []",
454
- " c = [1,2,3]",
455
- " d = [b, c, b, c, 1, 2, '123', 1.1, -1.23]",
456
- " e = [1, 1+1, 1+1+1, 1*2*4]",
453
+ " b = []",
454
+ " c = [1,2,3]",
455
+ " d = [b, c, b, c, 1, 2, '123', 1.1, -1.23]",
456
+ " e = [1, 1+1, 1+1+1, 1*2*4]",
457
457
  )
458
458
 
459
459
  engine.evaluate_attrs("A", %w{b c d e}).should ==
@@ -466,9 +466,9 @@ eof
466
466
 
467
467
  it "should eval list expressions" do
468
468
  engine.parse defn("A:",
469
- " b = []+[]",
470
- " c = [1,2,3]+b",
471
- " d = c*2",
469
+ " b = []+[]",
470
+ " c = [1,2,3]+b",
471
+ " d = c*2",
472
472
  )
473
473
 
474
474
  engine.evaluate_attrs("A", %w{b c d}).should ==
@@ -480,9 +480,9 @@ eof
480
480
 
481
481
  it "should eval sets and set comprehension" do
482
482
  engine.parse defn("A:",
483
- " a = {-}",
484
- " b = {i*5 for i in {1,2,3}}",
485
- " c = {1,2,3} | {4,5}",
483
+ " a = {-}",
484
+ " b = {i*5 for i in {1,2,3}}",
485
+ " c = {1,2,3} | {4,5}",
486
486
  )
487
487
  engine.evaluate_attrs("A", ["a", "b", "c"]).should ==
488
488
  [Set[], Set[5,10,15], Set[1,2,3,4,5]]
@@ -490,14 +490,14 @@ eof
490
490
 
491
491
  it "should eval list comprehension" do
492
492
  engine.parse defn("A:",
493
- " b = [i*5 for i in [1,2,3]]",
493
+ " b = [i*5 for i in [1,2,3]]",
494
494
  )
495
495
  engine.evaluate("A", "b").should == [5, 10, 15]
496
496
  end
497
497
 
498
498
  it "should eval nested list comprehension" do
499
499
  engine.parse defn("A:",
500
- " b = [[a+c for c in [4,5]] for a in [1,2,3]]",
500
+ " b = [[a+c for c in [4,5]] for a in [1,2,3]]",
501
501
  )
502
502
  engine.evaluate("A", "b").should == [[5, 6], [6, 7], [7, 8]]
503
503
 
@@ -505,23 +505,23 @@ eof
505
505
 
506
506
  it "should eval list comprehension variable override" do
507
507
  engine.parse defn("A:",
508
- " b = [b/2.0 for b in [1,2,3]]",
508
+ " b = [b/2.0 for b in [1,2,3]]",
509
509
  )
510
510
  engine.evaluate("A", "b").should == [0.5, 1.0, 1.5]
511
511
  end
512
512
 
513
513
  it "should eval list comprehension variable override (2)" do
514
514
  engine.parse defn("A:",
515
- " a = 1",
516
- " b = [a+1 for a in [1,2,3]]",
515
+ " a = 1",
516
+ " b = [a+1 for a in [1,2,3]]",
517
517
  )
518
518
  engine.evaluate("A", "b").should == [2, 3, 4]
519
519
  end
520
520
 
521
521
  it "should eval conditional list comprehension" do
522
522
  engine.parse defn("A:",
523
- " b = [i*5 for i in [1,2,3,4,5] if i%2 == 1]",
524
- " c = [i/10.0 for i in [1,2,3,4,5] if i>4]",
523
+ " b = [i*5 for i in [1,2,3,4,5] if i%2 == 1]",
524
+ " c = [i/10.0 for i in [1,2,3,4,5] if i>4]",
525
525
  )
526
526
  engine.evaluate("A", "b").should == [5, 15, 25]
527
527
  engine.evaluate("A", "c").should == [0.5]
@@ -529,12 +529,12 @@ eof
529
529
 
530
530
  it "should eval hashes" do
531
531
  engine.parse defn("A:",
532
- " b = {}",
533
- " c = {'a':1, 'b': 2,'c':3}",
534
- " d = {123*2: -123, 'b_b': 1+1}",
535
- " e = {'x': 1, 'y': 1+1, 'z': 1+1+1, 'zz': 1*2*4}",
536
- " f = {'a': nil, 'b': [1, nil, 2]}",
537
- " g = {b:b, [b]:[1,23], []:345}",
532
+ " b = {}",
533
+ " c = {'a':1, 'b': 2,'c':3}",
534
+ " d = {123*2: -123, 'b_b': 1+1}",
535
+ " e = {'x': 1, 'y': 1+1, 'z': 1+1+1, 'zz': 1*2*4}",
536
+ " f = {'a': nil, 'b': [1, nil, 2]}",
537
+ " g = {b:b, [b]:[1,23], []:345}",
538
538
  )
539
539
 
540
540
  engine.evaluate_attrs("A", %w{b c d e f g}).should ==
@@ -549,14 +549,14 @@ eof
549
549
 
550
550
  it "should eval hash comprehension" do
551
551
  engine.parse defn("A:",
552
- " b = {i*5 :i for i in [1,2,3]}",
552
+ " b = {i*5 :i for i in [1,2,3]}",
553
553
  )
554
554
  engine.evaluate("A", "b").should == {5=>1, 10=>2, 15=>3}
555
555
  end
556
556
 
557
557
  it "should eval nested hash comprehension" do
558
558
  engine.parse defn("A:",
559
- " b = { a:{a+c:a-c for c in [4,5]} for a in [1,2,3]}",
559
+ " b = { a:{a+c:a-c for c in [4,5]} for a in [1,2,3]}",
560
560
  )
561
561
  engine.evaluate("A", "b").should ==
562
562
  {1=>{5=>-3, 6=>-4}, 2=>{6=>-2, 7=>-3}, 3=>{7=>-1, 8=>-2}}
@@ -564,8 +564,8 @@ eof
564
564
 
565
565
  it "should eval conditional hash comprehension" do
566
566
  engine.parse defn("A:",
567
- " b = {i*5:i+5 for i in [1,2,3,4,5] if i%2 == 1}",
568
- " c = {i/10.0:i*10 for i in [1,2,3,4,5] if i>4}",
567
+ " b = {i*5:i+5 for i in [1,2,3,4,5] if i%2 == 1}",
568
+ " c = {i/10.0:i*10 for i in [1,2,3,4,5] if i>4}",
569
569
  )
570
570
  engine.evaluate("A", "b").should == {5=>6, 15=>8, 25=>10}
571
571
  engine.evaluate("A", "c").should == {0.5=>50}
@@ -573,10 +573,10 @@ eof
573
573
 
574
574
  it "should eval node calls as intermediate results" do
575
575
  engine.parse defn("A:",
576
- " a =?",
577
- " e = A(a: 13)",
578
- " d = e.a * 2",
579
- " f = e.d / e.a",
576
+ " a =?",
577
+ " e = A(a=13)",
578
+ " d = e.a * 2",
579
+ " f = e.d / e.a",
580
580
  )
581
581
 
582
582
  engine.evaluate_attrs("A", ["d", "f"]).should == [26, 2]
@@ -584,9 +584,9 @@ eof
584
584
 
585
585
  it "should eval module calls 1" do
586
586
  engine.parse defn("A:",
587
- " a = 123",
588
- " n = A",
589
- " d = n().a",
587
+ " a = 123",
588
+ " n = A",
589
+ " d = n().a",
590
590
  )
591
591
 
592
592
  engine.evaluate_attrs("A", %w{d}).should == [123]
@@ -594,12 +594,12 @@ eof
594
594
 
595
595
  it "should eval module calls 2" do
596
596
  engine.parse defn("A:",
597
- " a = 123",
598
- " b = 456 + a",
599
- " n = 'A'",
600
- " c = nil(x: 123, y: 456) % ['a', 'b']",
601
- " d = n(x: 123, y: 456) % ['a', 'b']",
602
- " e = nil() % ['b']",
597
+ " a = 123",
598
+ " b = 456 + a",
599
+ " n = 'A'",
600
+ " c = nil(x = 123, y = 456) % ['a', 'b']",
601
+ " d = n(x = 123, y = 456) % ['a', 'b']",
602
+ " e = nil() % ['b']",
603
603
  )
604
604
 
605
605
  engine.evaluate_attrs("A", %w{n c d e}).should ==
@@ -608,10 +608,10 @@ eof
608
608
 
609
609
  it "should eval module calls 3" do
610
610
  engine.parse defn("A:",
611
- " a = 123",
611
+ " a = 123",
612
612
  "B:",
613
- " n = 'A'",
614
- " d = n().a",
613
+ " n = 'A'",
614
+ " d = n().a",
615
615
  )
616
616
 
617
617
  engine.evaluate_attrs("B", %w{d}).should == [123]
@@ -619,8 +619,8 @@ eof
619
619
 
620
620
  it "should be possible to implement recursive calls" do
621
621
  engine.parse defn("A:",
622
- " n =?",
623
- " fact = if n <= 1 then 1 else n * A(n: n-1).fact",
622
+ " n =?",
623
+ " fact = if n <= 1 then 1 else n * A(n=n-1).fact",
624
624
  )
625
625
 
626
626
  engine.evaluate("A", "fact", "n" => 10).should == 3628800
@@ -628,34 +628,34 @@ eof
628
628
 
629
629
  it "should eval module calls by node name" do
630
630
  engine.parse defn("A:",
631
- " a = 123",
632
- " b = A().a",
631
+ " a = 123",
632
+ " b = A().a",
633
633
  )
634
634
  engine.evaluate("A", "b").should == 123
635
635
  end
636
636
 
637
637
  it "should eval multiline expressions" do
638
638
  engine.parse defn("A:",
639
- " a = 1",
640
- " b = [a+1",
641
- " for a in [1,2,3]",
642
- " ]",
639
+ " a = 1",
640
+ " b = [a+1",
641
+ " for a in [1,2,3]",
642
+ " ]",
643
643
  )
644
644
  engine.evaluate("A", "b").should == [2, 3, 4]
645
645
  end
646
646
 
647
647
  it "should eval multiline expressions" do
648
648
  engine.parse defn("A:",
649
- " a = 123",
650
- " b = 456 + ",
651
- " a",
652
- " n = 'A'",
653
- " c = nil(x: 123,",
654
- " y: 456) % ['a', 'b']",
655
- " d = n(",
656
- " x: 123, y: 456) % ['a', 'b']",
657
- " e = nil(",
658
- " ) % ['b']",
649
+ " a = 123",
650
+ " b = 456 + ",
651
+ " a",
652
+ " n = 'A'",
653
+ " c = nil(x = 123,",
654
+ " y = 456) % ['a', 'b']",
655
+ " d = n(",
656
+ " x = 123, y = 456) % ['a', 'b']",
657
+ " e = nil(",
658
+ " ) % ['b']",
659
659
  )
660
660
 
661
661
  engine.evaluate_attrs("A", %w{n c d e}).should ==
@@ -665,10 +665,10 @@ eof
665
665
  it "should eval imports" do
666
666
  engine.parse defn("import AAA",
667
667
  "A:",
668
- " b = 456",
668
+ " b = 456",
669
669
  "B: AAA::X",
670
- " a = 111",
671
- " c = AAA::X(a: 456).b",
670
+ " a = 111",
671
+ " c = AAA::X(a=456).b",
672
672
  )
673
673
  engine.evaluate_attrs("B", ["a", "b", "c"], {}).should ==
674
674
  [111, 222, 456*2]
@@ -676,20 +676,20 @@ eof
676
676
 
677
677
  it "should eval imports (2)" do
678
678
  sset.merge({
679
- "BBB" =>
679
+ "BBB" =>
680
680
  defn("import AAA",
681
681
  "B: AAA::X",
682
- " a = 111",
683
- " c = AAA::X(a: -1).b",
684
- " d = a * 2",
682
+ " a = 111",
683
+ " c = AAA::X(a=-1).b",
684
+ " d = a * 2",
685
685
  ),
686
686
  "CCC" =>
687
687
  defn("import BBB",
688
688
  "import AAA",
689
689
  "B: BBB::B",
690
- " e = d * 3",
690
+ " e = d * 3",
691
691
  "C: AAA::X",
692
- " d = b * 3",
692
+ " d = b * 3",
693
693
  ),
694
694
  })
695
695
 
@@ -700,7 +700,7 @@ eof
700
700
 
701
701
  engine.parse defn("import BBB",
702
702
  "B: BBB::B",
703
- " e = d + 3",
703
+ " e = d + 3",
704
704
  )
705
705
 
706
706
  engine.evaluate_attrs("B", ["a", "b", "c", "d", "e"]).should ==
@@ -720,8 +720,8 @@ eof
720
720
  "CCC" =>
721
721
  defn("import BBB",
722
722
  "X:",
723
- " xx = [n.x for n in BBB::D().xs]",
724
- " yy = [n.x for n in BBB::D.xs]",
723
+ " xx = [n.x for n in BBB::D().xs]",
724
+ " yy = [n.x for n in BBB::D.xs]",
725
725
  ),
726
726
  })
727
727
 
@@ -732,12 +732,12 @@ eof
732
732
 
733
733
  it "can eval indexing" do
734
734
  engine.parse defn("A:",
735
- " a = [1,2,3]",
736
- " b = a[1]",
737
- " c = a[-1]",
738
- " d = {'a' : 123, 'b': 456}",
739
- " e = d['b']",
740
- " f = a[1,2]",
735
+ " a = [1,2,3]",
736
+ " b = a[1]",
737
+ " c = a[-1]",
738
+ " d = {'a' : 123, 'b': 456}",
739
+ " e = d['b']",
740
+ " f = a[1,2]",
741
741
  )
742
742
  r = engine.evaluate_attrs("A", ["b", "c", "e", "f"])
743
743
  r.should == [2, 3, 456, [2,3]]
@@ -745,10 +745,10 @@ eof
745
745
 
746
746
  it "can eval indexing 2" do
747
747
  engine.parse defn("A:",
748
- " a = 1",
749
- " b = {'x' : 123, 'y': 456}",
750
- " c = A() % ['a', 'b']",
751
- " d = c['b'].x * c['a'] - c['b'].y",
748
+ " a = 1",
749
+ " b = {'x' : 123, 'y': 456}",
750
+ " c = A() % ['a', 'b']",
751
+ " d = c['b'].x * c['a'] - c['b'].y",
752
752
  )
753
753
  r = engine.evaluate_attrs("A", ["a", "b", "c", "d"])
754
754
  r.should ==
@@ -757,14 +757,14 @@ eof
757
757
 
758
758
  it "should properly eval overridden attrs" do
759
759
  engine.parse defn("A:",
760
- " a = 5",
761
- " b = a",
760
+ " a = 5",
761
+ " b = a",
762
762
  "B: A",
763
- " a = 2",
764
- " x = A.b - B.b",
765
- " k = [A.b, B.b]",
766
- " l = [x.b for x in [A, B]]",
767
- " m = [x().b for x in [A, B]]",
763
+ " a = 2",
764
+ " x = A.b - B.b",
765
+ " k = [A.b, B.b]",
766
+ " l = [x.b for x in [A, B]]",
767
+ " m = [x().b for x in [A, B]]",
768
768
  )
769
769
 
770
770
  engine.evaluate("A", "b").should == 5