delorean_lang 0.1.7 → 0.2.0

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
- NjRmOWNjNTZjNTM5MWE0ZmE3OTM4MGE3MTY1MjRjZDgzNDdjZWRlMQ==
4
+ NzA4ZGU5ZGEwNmIwNjU0NzYyYWZkMTU4MTAxNzdiMzg3ZjFjODQyNA==
5
5
  data.tar.gz: !binary |-
6
- ZDlhMDJkNjhmODM4Yjg0OTAxYWZhMDk1MDE2M2M2NGU4ZTQ4Yzc2ZA==
6
+ ZmNkNTk2Y2Y2YzU5NzJiZTE5MzNmYTU4ODAwYzU3NTAyNmY5ZTJiNg==
7
7
  SHA512:
8
8
  metadata.gz: !binary |-
9
- YmQ4NjNlMDgyMDBkMTczNzc5NGU5YjE1NmJlMDAzODhkMWJmMTkwNzIzZDc4
10
- ZDQzZTVmMmQ4MTlmYzllOTc3ZDdhZGJiNjk5NDA3MmUwNTY4OGFkNmRjODYw
11
- YjM2ZWEyMTliMjY4OWUxOTg5NGUzODVkMzQxODVhMmFlYTJjYTY=
9
+ MzY1ZTk3YWMyYTgzODY5ZjM1YjFmODAxM2JlZWJlNDQ4NTg4Yzg1ODNjNGFm
10
+ NGQwYzM1MmE4YTYxZDVhNzA0NDlhYmFiZGM1NjJhNTVlOGEzYjViYmRiYzA2
11
+ NGFhMDQyZWEwYjUxOTdiOTc2ZDAyYjE5M2M1NjZlMzgxMDU3OTc=
12
12
  data.tar.gz: !binary |-
13
- NzE3NWI2ZGE2OTVjMDQ2NDg4YTAwN2ZmNjRkOWE4YTRmZjI3NDY1ZGI5N2Vk
14
- ODU2MmZjMzM0YzYyNDgwYzlmODlmZDc1YjFhYjQyMWI5N2JjOTZlOTgxMDBi
15
- ZTQwNzEyY2M4ZjA2ZmEzMDAwZTQ0M2M4MGQzNjM3ODQ2MTk4ODk=
13
+ MzkwMmQwOGUxN2U2MjJmZjJhZjQ0MmU0NGY0Mzg4ZmQ2NmVhZGRlNzI0YjNi
14
+ NzQyNGE2MTRiYzRkNTdiMTRiMDNmNmNlYzJmOTMyYWU5MDM4ZmY1NjRlM2Y5
15
+ ZmQxZWNmMmQyZjAyYzE3NmQ0ODg0YWUxZDY2MjAzMTNjOWFiYmU=
data/lib/delorean/base.rb CHANGED
@@ -187,4 +187,3 @@ module Delorean
187
187
  end
188
188
  end
189
189
  end
190
-
@@ -1,46 +1,7 @@
1
1
  require 'delorean/base'
2
2
 
3
- module Delorean
4
- class AbstractContainer
5
- def initialize
6
- @engines = {}
7
- end
8
-
9
- def names
10
- @engines.keys.map {|n, v| n}
11
- end
12
-
13
- def get(name, version)
14
- @engines[ [name, version] ]
15
- end
16
-
17
- def add(name, version, engine)
18
- if names.member? name
19
- n, v = @engines.keys.detect {|n, v| n == name}
20
-
21
- raise "Can't import #{name} version #{version}. " +
22
- "Collides with imported version #{v}."
23
- end
24
-
25
- @engines[ [name, version] ] = engine
26
- end
27
-
28
- def add_imports(engine)
29
- # Given an engine, make sure that all of its imports are added
30
- # to the script container. This makes sure we don't have
31
- # version conflict among different scripts.
32
- engine.imports.each { |name, ev|
33
- get(name, ev[1]) || add(name, ev[1], ev[0])
34
- }
35
- end
36
-
37
- def import(name, version)
38
- get(name, version) ||
39
- add(name, version, get_engine(name, version))
40
- end
41
-
42
- def get_engine(name, version)
43
- raise "get_engine needs to be overriden"
44
- end
3
+ class Delorean::AbstractContainer
4
+ def get_engine(name)
5
+ raise "get_engine needs to be overriden"
45
6
  end
46
7
  end
@@ -165,21 +165,13 @@ module Delorean
165
165
  end
166
166
 
167
167
  module Formula6
168
- def sp1
168
+ def sp
169
169
  elements[1]
170
170
  end
171
171
 
172
172
  def n
173
173
  elements[2]
174
174
  end
175
-
176
- def sp2
177
- elements[3]
178
- end
179
-
180
- def v
181
- elements[4]
182
- end
183
175
  end
184
176
 
185
177
  def _nt_formula
@@ -430,14 +422,6 @@ module Delorean
430
422
  if r40
431
423
  r41 = _nt_class_name
432
424
  s38 << r41
433
- if r41
434
- r42 = _nt_sp
435
- s38 << r42
436
- if r42
437
- r43 = _nt_integer
438
- s38 << r43
439
- end
440
- end
441
425
  end
442
426
  end
443
427
  if s38.last
@@ -14,7 +14,7 @@ grammar Delorean
14
14
  /
15
15
  n:class_name ':' <BaseNode>
16
16
  /
17
- 'import' sp n:class_name sp v:integer <Import>
17
+ 'import' sp n:class_name <Import>
18
18
  end
19
19
 
20
20
  rule class_name
@@ -5,12 +5,13 @@ require 'pp'
5
5
 
6
6
  module Delorean
7
7
  class Engine
8
- attr_reader :last_node, :module_name, :version,
9
- :line_no, :comp_set, :pm, :m, :imports
8
+ attr_reader :last_node, :module_name, :line_no,
9
+ :comp_set, :pm, :m, :imports, :sset
10
10
 
11
- def initialize(module_name, version=nil)
11
+ def initialize(module_name, sset=nil)
12
12
  # name of current module
13
- @module_name, @version = module_name, version
13
+ @module_name = module_name
14
+ @sset = sset
14
15
  reset
15
16
  end
16
17
 
@@ -32,30 +33,30 @@ module Delorean
32
33
  @multi_no || @line_no
33
34
  end
34
35
 
35
- def parse_import(sset, name, version)
36
+ def parse_import(name)
36
37
  err(ParseError, "No script set") unless sset
37
38
 
38
39
  err(ParseError, "Module #{name} importing itself") if
39
40
  name == module_name
40
41
 
41
42
  begin
42
- @imports[name] = [sset.import(name, version), version]
43
+ @imports[name] = sset.get_engine(name)
43
44
  rescue => exc
44
45
  err(ImportError, exc.to_s)
45
46
  end
46
47
 
47
- @pm.const_set("#{MOD}#{name}", @imports[name][0].pm)
48
+ @pm.const_set("#{MOD}#{name}", @imports[name].pm)
48
49
  end
49
50
 
50
- def gen_import(name, version)
51
- @imports.merge!(@imports[name][0].imports)
51
+ def gen_import(name)
52
+ @imports.merge!(@imports[name].imports)
52
53
 
53
- @m.const_set("#{MOD}#{name}", @imports[name][0].m)
54
+ @m.const_set("#{MOD}#{name}", @imports[name].m)
54
55
  end
55
56
 
56
57
  def get_import_engine(name)
57
58
  err(ParseError, "#{name} not imported") unless @imports[name]
58
- @imports[name][0]
59
+ @imports[name]
59
60
  end
60
61
 
61
62
  def is_node_defined(name)
@@ -212,8 +213,8 @@ module Delorean
212
213
  @@parser ||= DeloreanParser.new
213
214
  end
214
215
 
215
- def generate(t, sset=nil)
216
- t.check(self, sset)
216
+ def generate(t)
217
+ t.check(self)
217
218
 
218
219
  begin
219
220
  # generate ruby code
@@ -233,7 +234,7 @@ module Delorean
233
234
  end
234
235
  end
235
236
 
236
- def parse(source, sset=nil)
237
+ def parse(source)
237
238
  raise "can't call parse again without reset" if @pm
238
239
 
239
240
  # @m module is used at runtime for code evaluation. @pm module
@@ -263,7 +264,7 @@ module Delorean
263
264
 
264
265
  if t
265
266
  multi_line, @multi_no = nil, nil
266
- generate(t, sset)
267
+ generate(t)
267
268
  end
268
269
 
269
270
  else
@@ -275,7 +276,7 @@ module Delorean
275
276
  multi_line = line
276
277
  @multi_no = @line_no
277
278
  else
278
- generate(t, sset)
279
+ generate(t)
279
280
  end
280
281
  end
281
282
  end
@@ -295,9 +296,8 @@ module Delorean
295
296
 
296
297
  # enumerate qualified list of all attrs
297
298
  def enumerate_attrs
298
- @node_attrs.keys.inject({}) { |h, node|
299
+ @node_attrs.keys.each_with_object({}) { |node, h|
299
300
  h[node] = enumerate_attrs_by_node(node)
300
- h
301
301
  }
302
302
  end
303
303
 
@@ -52,12 +52,12 @@ eos
52
52
  end
53
53
 
54
54
  class Import < SNode
55
- def check(context, sset)
56
- context.parse_import(sset, n.text_value, v.text_value)
55
+ def check(context)
56
+ context.parse_import(n.text_value)
57
57
  end
58
58
 
59
59
  def rewrite(context)
60
- context.gen_import(n.text_value, v.text_value)
60
+ context.gen_import(n.text_value)
61
61
  ""
62
62
  end
63
63
  end
@@ -1,3 +1,3 @@
1
1
  module Delorean
2
- VERSION = "0.1.7"
2
+ VERSION = "0.2.0"
3
3
  end
data/spec/eval_spec.rb CHANGED
@@ -2,13 +2,9 @@ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
2
 
3
3
  describe "Delorean" do
4
4
 
5
- let(:engine) {
6
- Delorean::Engine.new "XXX"
7
- }
8
-
9
5
  let(:sset) {
10
6
  TestContainer.new({
11
- ["AAA", "0001"] =>
7
+ "AAA" =>
12
8
  defn("X:",
13
9
  " a =? 123",
14
10
  " b = a*2",
@@ -16,6 +12,10 @@ describe "Delorean" do
16
12
  })
17
13
  }
18
14
 
15
+ let(:engine) {
16
+ Delorean::Engine.new "XXX", sset
17
+ }
18
+
19
19
  it "evaluate simple expressions" do
20
20
  engine.parse defn("A:",
21
21
  " a = 123",
@@ -308,7 +308,7 @@ eoc
308
308
  engine.evaluate("E", "xx").should == [1,2,3]
309
309
  end
310
310
 
311
- it "should be able to call class methods on ActiveRecord classes in modules" do
311
+ it "should be able to call class methods on AR classes in modules" do
312
312
  engine.parse defn("A:",
313
313
  " b = M::LittleDummy.heres_my_number(867, 5309)",
314
314
  )
@@ -433,7 +433,8 @@ eof
433
433
  engin2.evaluate_attrs("A", ["a", "b"]).should == [222.0, 222.0/5]
434
434
 
435
435
  engine.evaluate_attrs("B", ["a", "b", "c"]).should == [123, 123*3, 123*3*2]
436
- engin2.evaluate_attrs("B", ["a", "b", "c"]).should == [222.0, 222.0/5, 222.0/5*3]
436
+ engin2.evaluate_attrs("B", ["a", "b", "c"]).should ==
437
+ [222.0, 222.0/5, 222.0/5*3]
437
438
 
438
439
  engin2.evaluate("C", "d").should == 111
439
440
  lambda {
@@ -662,29 +663,29 @@ eof
662
663
  end
663
664
 
664
665
  it "should eval imports" do
665
- engine.parse defn("import AAA 0001",
666
+ engine.parse defn("import AAA",
666
667
  "A:",
667
668
  " b = 456",
668
669
  "B: AAA::X",
669
670
  " a = 111",
670
671
  " c = AAA::X(a: 456).b",
671
- ), sset
672
+ )
672
673
  engine.evaluate_attrs("B", ["a", "b", "c"], {}).should ==
673
674
  [111, 222, 456*2]
674
675
  end
675
676
 
676
677
  it "should eval imports (2)" do
677
678
  sset.merge({
678
- ["BBB", "0002"] =>
679
- defn("import AAA 0001",
679
+ "BBB" =>
680
+ defn("import AAA",
680
681
  "B: AAA::X",
681
682
  " a = 111",
682
683
  " c = AAA::X(a: -1).b",
683
684
  " d = a * 2",
684
685
  ),
685
- ["CCC", "0003"] =>
686
- defn("import BBB 0002",
687
- "import AAA 0001",
686
+ "CCC" =>
687
+ defn("import BBB",
688
+ "import AAA",
688
689
  "B: BBB::B",
689
690
  " e = d * 3",
690
691
  "C: AAA::X",
@@ -692,20 +693,20 @@ eof
692
693
  ),
693
694
  })
694
695
 
695
- e2 = sset.get_engine("BBB", "0002")
696
+ e2 = sset.get_engine("BBB")
696
697
 
697
698
  e2.evaluate_attrs("B", ["a", "b", "c", "d"]).should ==
698
699
  [111, 222, -2, 222]
699
700
 
700
- engine.parse defn("import BBB 0002",
701
+ engine.parse defn("import BBB",
701
702
  "B: BBB::B",
702
703
  " e = d + 3",
703
- ), sset
704
+ )
704
705
 
705
706
  engine.evaluate_attrs("B", ["a", "b", "c", "d", "e"]).should ==
706
707
  [111, 222, -2, 222, 225]
707
708
 
708
- e4 = sset.get_engine("CCC", "0003")
709
+ e4 = sset.get_engine("CCC")
709
710
 
710
711
  e4.evaluate_attrs("B", ["a", "b", "c", "d", "e"]).should ==
711
712
  [111, 222, -2, 222, 666]
@@ -715,16 +716,16 @@ eof
715
716
 
716
717
  it "should eval imports (3)" do
717
718
  sset.merge({
718
- ["BBB", "0002"] => getattr_code,
719
- ["CCC", "0003"] =>
720
- defn("import BBB 0002",
719
+ "BBB" => getattr_code,
720
+ "CCC" =>
721
+ defn("import BBB",
721
722
  "X:",
722
723
  " xx = [n.x for n in BBB::D().xs]",
723
724
  " yy = [n.x for n in BBB::D.xs]",
724
725
  ),
725
726
  })
726
727
 
727
- e4 = sset.get_engine("CCC", "0003")
728
+ e4 = sset.get_engine("CCC")
728
729
  e4.evaluate("X", "xx").should == [1,2,3]
729
730
  e4.evaluate("X", "yy").should == [1,2,3]
730
731
  end
@@ -750,7 +751,8 @@ eof
750
751
  " d = c['b'].x * c['a'] - c['b'].y",
751
752
  )
752
753
  r = engine.evaluate_attrs("A", ["a", "b", "c", "d"])
753
- r.should == [1, {"x"=>123, "y"=>456}, {"a"=>1, "b"=>{"x"=>123, "y"=>456}}, -333]
754
+ r.should ==
755
+ [1, {"x"=>123, "y"=>456}, {"a"=>1, "b"=>{"x"=>123, "y"=>456}}, -333]
754
756
  end
755
757
 
756
758
  it "should properly eval overridden attrs" do
data/spec/parse_spec.rb CHANGED
@@ -2,13 +2,9 @@ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
2
 
3
3
  describe "Delorean" do
4
4
 
5
- let(:engine) {
6
- Delorean::Engine.new "YYY"
7
- }
8
-
9
5
  let(:sset) {
10
6
  TestContainer.new({
11
- ["AAA", "0001"] =>
7
+ "AAA" =>
12
8
  defn("X:",
13
9
  " a = 123",
14
10
  " b = a",
@@ -16,6 +12,10 @@ describe "Delorean" do
16
12
  })
17
13
  }
18
14
 
15
+ let(:engine) {
16
+ Delorean::Engine.new "YYY", sset
17
+ }
18
+
19
19
  it "can parse very simple calls" do
20
20
  engine.parse defn("X:",
21
21
  " a = 123",
@@ -702,71 +702,25 @@ describe "Delorean" do
702
702
  end
703
703
 
704
704
  it "should parse imports" do
705
- engine.parse defn("import AAA 0001",
705
+ engine.parse defn("import AAA",
706
706
  "A:",
707
707
  " b = 456",
708
708
  "B: AAA::X",
709
- ), sset
710
-
709
+ )
711
710
  end
712
711
 
713
712
  it "should disallow import loops" do
714
713
  pending
715
714
  sset.merge({
716
- ["BBB", "0001"] =>
717
- defn("import AAA 0001",
718
- "import CCC 0001",
715
+ "BBB" =>
716
+ defn("import AAA",
717
+ "import CCC",
719
718
  ),
720
- ["CCC", "0001"] =>
721
- defn("import BBB 0001",
719
+ "CCC" =>
720
+ defn("import BBB",
722
721
  ),
723
722
  })
724
- sset.get_engine("CCC", "0001")
725
- end
726
-
727
- it "should disallow multiple versions of same script" do
728
- sset.merge({
729
- ["AAA", "0002"] =>
730
- defn("A:",
731
- ),
732
- ["BBB", "0001"] =>
733
- defn("import AAA 0001",
734
- ),
735
- ["CCC", "0001"] =>
736
- defn("import BBB 0001",
737
- "import AAA 0002",
738
- ),
739
- })
740
- begin
741
- sset.get_engine("CCC", "0001")
742
- rescue Delorean::ImportError => exc
743
- exc.line.should == 2
744
- end
745
- end
746
-
747
- it "should disallow multiple versions of same script (2)" do
748
- sset.merge({
749
- ["BBB", "0001"] =>
750
- defn("import AAA 0001",
751
- ),
752
- ["CCC", "0001"] =>
753
- defn("import AAA 0001",
754
- "import BBB 0001",
755
- ),
756
- ["AAA", "0002"] =>
757
- defn("A:",
758
- ),
759
- ["CCC", "0002"] =>
760
- defn("import AAA 0002",
761
- "import BBB 0001",
762
- ),
763
- })
764
- begin
765
- sset.get_engine("CCC", "0002")
766
- rescue Delorean::ImportError => exc
767
- exc.line.should == 2
768
- end
723
+ sset.get_engine("CCC")
769
724
  end
770
725
 
771
726
  end
772
-
data/spec/spec_helper.rb CHANGED
@@ -10,7 +10,7 @@ require 'active_record'
10
10
  Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each {|f| require f}
11
11
 
12
12
  RSpec.configure do |config|
13
-
13
+
14
14
  end
15
15
 
16
16
  def defn(*l)
@@ -18,7 +18,7 @@ def defn(*l)
18
18
  end
19
19
 
20
20
  ######################################################################
21
- # ActiveRecord related
21
+ # ActiveRecord related
22
22
 
23
23
  ActiveRecord::Base.establish_connection adapter: "sqlite3", database: ":memory:"
24
24
 
@@ -79,22 +79,24 @@ class TestContainer < Delorean::AbstractContainer
79
79
  def initialize(scripts={})
80
80
  super()
81
81
  @scripts = scripts
82
+ @engines = {}
82
83
  end
83
84
 
84
85
  def merge(scripts)
85
86
  @scripts.merge!(scripts)
86
87
  end
87
88
 
88
- def get_engine(name, version)
89
- script = @scripts[ [name, version] ]
89
+ def get_engine(name)
90
+ return @engines[name] if @engines[name]
91
+
92
+ script = @scripts[name]
90
93
 
91
- raise "can't find #{name} #{version}" unless script
94
+ raise "can't find #{name}" unless script
92
95
 
93
- engine = Delorean::Engine.new name
94
- engine.parse script, self
96
+ engine = Delorean::Engine.new name, self
97
+ engine.parse script
95
98
  engine
96
99
  end
97
100
  end
98
101
 
99
102
  ######################################################################
100
-
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.1.7
4
+ version: 0.2.0
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-01-21 00:00:00.000000000 Z
11
+ date: 2014-03-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: treetop