delorean_lang 0.2.0 → 0.2.1

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,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