maroon 0.6.5 → 0.7.0

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,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: a2b4446ac84c36b68f710a04280f9488d116035c
4
- data.tar.gz: 01322628719027b5cfc4b500f81063a23c326e5a
3
+ metadata.gz: 41c4d573b28bd312c8a720f51ae4b283cd9311bd
4
+ data.tar.gz: a2a0f21a0278e3af009c884204e18bfa5c633d55
5
5
  SHA512:
6
- metadata.gz: 8a6644383356d9c8939dd1fa94c89d0e89baa05d867a1c7f2229c335972c04c164d4e6deacbe0632a679453c60858eb3447914817c8d9bc1e6fd7b1a741dd2ae
7
- data.tar.gz: ae022ce8665b2c78f963112be9a0635306dc6c47d64110dbde15508bdd690ba975ab3f14d2f1711c94e694d99fba2a19fa9af33a987fa484097992a94a57828d
6
+ metadata.gz: b2a48a828cc60e7e8e33bb4df82bdfacc6ff6c128f142a08f0fdca0858dfa5c25ffa2647855d20a745a2c1338a9ea08b0b71dc1beed452ac38955e1512317085
7
+ data.tar.gz: 00111ba32f2d574dc7ccfd1ba1435b241fd17e97736bc5ca573afab56c6463f26a50f67b40839381a2c3b0383aff3073fc535eac7efb05e253e78c215ef69e3c
data/README.md CHANGED
@@ -41,9 +41,11 @@ Run `rake test` or just `rake` to make the tests run.
41
41
 
42
42
  1. Fork it
43
43
  2. Create your feature branch (`git checkout -b my-new-feature`)
44
- 3. Commit your changes (`git commit -am 'Add some feature'`)
45
- 4. Push to the branch (`git push origin my-new-feature`)
46
- 5. Create new Pull Request
44
+ 3. Make your changes to the files in base.
45
+ 4. Make sure you can run the default rake task with no errors _twice_
46
+ 5. Commit your changes (`git commit -am 'Add some feature'`)
47
+ 6. Push to the branch (`git push origin my-new-feature`)
48
+ 7. Create new Pull Request
47
49
 
48
50
 
49
51
  Known bugs
data/Rakefile CHANGED
@@ -8,6 +8,7 @@ Rake::TestTask.new do |t|
8
8
  end
9
9
 
10
10
  task :generate do |t|
11
+
11
12
  require_relative './lib/Context'
12
13
  require_relative './lib/maroon/kernel'
13
14
  require_relative './lib/build' #use the one in lib. That should be the stable one
@@ -32,7 +33,7 @@ end
32
33
 
33
34
  task :build_generate do |t|
34
35
  require_relative './generated/build' #use the one previously generated
35
- Context::generate_files_in('generated') #generate files
36
+ Context::generate_files_in('lib') #generate files
36
37
  `git ls-files ./base/`.split($/).grep(%r{(.)*.rb}).select {|f| require_relative("#{f}")}
37
38
  end
38
39
 
@@ -0,0 +1,129 @@
1
+ require 'test/unit'
2
+ require_relative 'test_helper'
3
+ class MaroonInternal
4
+
5
+ end
6
+ class ContextTest < Test::Unit::TestCase
7
+
8
+ def test_role_method_call
9
+ name = :MyContextRoleMethodCall
10
+ role_name = :rol
11
+ Context::define name do
12
+ role role_name do
13
+ def rolem(x, y)
14
+ x+y
15
+ end
16
+ end
17
+ def add(x,y)
18
+ rol.rolem x,y
19
+ end
20
+ end
21
+
22
+ assert_equal(7, MyContextRoleMethodCall.new.send(:self_rol_rolem, 3, 4))
23
+ assert_equal(7, MyContextRoleMethodCall.new.add(3, 4))
24
+ end
25
+
26
+ def test_simple
27
+ name = :MyContextSimple
28
+ role_name = :r
29
+ Context::define name do
30
+ role role_name do
31
+ end
32
+ end
33
+ assert(Kernel::const_defined? name)
34
+
35
+ end
36
+
37
+ def test_role_method
38
+ name = :MyContext
39
+ role_name = :rol
40
+ c = Context::define name do
41
+ role role_name do
42
+ def rolem
43
+ 0+1
44
+ end
45
+ end
46
+ end
47
+ assert_equal(1, MyContext.new.send(:self_rol_rolem))
48
+ end
49
+
50
+ def test_role_method_args
51
+ name = :MyContextArgs
52
+ role_name = :rol
53
+ Context::define name do
54
+ role role_name do
55
+ def rolem(x, y)
56
+ x+y
57
+ end
58
+ end
59
+ end
60
+ assert_equal(7, MyContextArgs.new.send(:self_rol_rolem, 3, 4))
61
+ end
62
+
63
+ def test_role_method_splat
64
+ name = :MyContextSplat
65
+ role_name = :rol
66
+ Context::define name do
67
+ role role_name do
68
+ def rolem(x, *args)
69
+ x+(args[0])
70
+ end
71
+ end
72
+ end
73
+ assert_equal(7, MyContextSplat.new.send(:self_rol_rolem, 3, 4))
74
+ end
75
+
76
+ def test_role_method_block
77
+ name = :MyContextBlock
78
+ role_name = :rol
79
+ Context::define name do
80
+ role role_name do
81
+ def rolem(*args, &b)
82
+ res = 0
83
+ args.each { |x|
84
+ res = b.call res, x
85
+ }
86
+ res
87
+ end
88
+ end
89
+ end
90
+ assert_equal(7, MyContextBlock.new.send(:self_rol_rolem, 3, 4) { |x, res| res + x })
91
+ end
92
+
93
+ def test_class_method_block
94
+ name = :MyContextClass
95
+ role_name = :rol
96
+ Context::define name do
97
+ role :dummy do end
98
+ role role_name do
99
+ def rolem(*args, &b)
100
+ res = 0
101
+ args.each { |x|
102
+ res = b.call res, x
103
+ }
104
+ res
105
+ end
106
+ end
107
+
108
+ def self.mul(x, y)
109
+ x*y
110
+ end
111
+
112
+ def power(x, y)
113
+ x**y
114
+ end
115
+
116
+ def self.pow(x,y)
117
+ x**y
118
+ end
119
+ end
120
+ ctx = MyContextClass.new
121
+
122
+
123
+ assert_equal(8, ctx.power(2, 3))
124
+ assert_equal(16, MyContextClass::pow(2, 4))
125
+ assert_equal(12, MyContextClass::mul(3, 4))
126
+ assert_equal(7, ctx.send(:self_rol_rolem, 3, 4) { |x, res| res + x })
127
+ end
128
+
129
+ end
@@ -1,6 +1,6 @@
1
1
  require 'test/unit'
2
2
  require_relative '../generated/ImmutableQueue'
3
-
3
+ require_relative '../Test/test_helper'
4
4
 
5
5
 
6
6
  class ImmutableQueueTest < Test::Unit::TestCase
@@ -8,11 +8,11 @@ class ImmutableQueueTest < Test::Unit::TestCase
8
8
  def test_sunny
9
9
  queue = ImmutableQueue::empty.push 1
10
10
  queue = queue.push(2)
11
- f,queue = queue.pop()
11
+ f, queue = queue.pop()
12
12
  refute_nil(queue)
13
- s,queue = queue.pop()
14
- assert_equal(1,f)
15
- assert_equal(2,s)
13
+ s, queue = queue.pop()
14
+ assert_equal(1, f)
15
+ assert_equal(2, s)
16
16
  assert_equal(ImmutableQueue::empty, queue)
17
17
  end
18
18
  end
@@ -5,61 +5,82 @@ require_relative 'test_helper'
5
5
 
6
6
  class MethodInfoTest < Test::Unit::TestCase
7
7
  include SourceAssertions
8
+ def get_def(&b)
9
+ (get_sexp &b).detect do |exp|
10
+ exp[0] == :defn || exp[0] == :defs
11
+ end
12
+ end
13
+
8
14
  def test_simple
9
- block = get_sexp do |a,b|
10
- p 'this is a test'
15
+ block = get_def do
16
+ def name (a, b)
17
+ p 'this is a test'
18
+ end
11
19
  end
12
- source = MethodInfo.new(false,block,true).build_as_context_method("name",InterpretationContext.new({},{},{},nil))
13
- expected = %{def name(a,b)
14
- p("this is a test")
20
+
21
+ source = MethodInfo.new( block,nil,false).build_as_context_method( InterpretationContext.new({}, {}, {}, nil))
22
+ expected ='def name(a,b) p("this is a test") end'
23
+ assert_source_equal(expected, source)
24
+ end
25
+
26
+ def test_rolemethod
27
+ block = get_def do
28
+ def name (a, b)
29
+ foo.bar
30
+ end
15
31
  end
16
- }
17
- assert_source_equal(expected,source)
32
+
33
+ source = MethodInfo.new( block,nil,false).build_as_context_method( InterpretationContext.new({:foo=>{:bar=>[]}}, {}, {}, nil))
34
+ expected ='def name(a,b) self_foo_bar end'
35
+ assert_source_equal(expected, source)
18
36
  end
37
+
19
38
  def test_class_method
20
- block = get_sexp do |a,b|
21
- p 'this is a test'
39
+ block = get_def do
40
+ def self.name(a, b)
41
+ p 'this is a test'
42
+ end
22
43
  end
23
- source = MethodInfo.new(self,block,true).build_as_context_method("name",InterpretationContext.new({},{},{},nil))
24
- expected = %{def self.name(a,b)
25
- p("this is a test")
26
- end
27
- }
28
- assert_source_equal(expected,source)
44
+
45
+ source = MethodInfo.new( block,nil,false).build_as_context_method( InterpretationContext.new({}, {}, {}, nil))
46
+ expected = 'def self.name(a,b) p("this is a test") end'
47
+
48
+ assert_source_equal(expected, source)
29
49
  end
30
50
 
31
51
  def test_splat_argument
32
- block = get_sexp do |a,*b|
52
+ block = get_def do
53
+ def name (a, *b)
33
54
  p 'this is a test'
55
+ end
34
56
  end
35
- source = MethodInfo.new(nil,block,true).build_as_context_method("name",InterpretationContext.new({},{},{},nil))
36
- expected = %{def name(a,*b)
37
- p("this is a test")
38
- end
39
- }
40
- assert_source_equal(expected,source)
57
+ source = MethodInfo.new( block,nil,false).build_as_context_method( InterpretationContext.new({}, {}, {}, nil))
58
+ expected = 'def name(a,*b) p("this is a test") end'
59
+ assert_source_equal(expected, source)
41
60
  end
42
61
 
43
62
  def test_block_argument
44
- block = get_sexp do |a,b|
63
+ block = get_def do
64
+ def name(a, b,&block)
45
65
  p 'this is a test'
66
+ end
46
67
  end
47
- source = MethodInfo.new({:block=>:block},block,true)
48
- source = source.build_as_context_method("name",InterpretationContext.new({},{},{},nil))
49
- expected = %{def name(a,b,&block)
50
- p("this is a test")
51
- end
52
- }
53
- assert_source_equal(expected,source)
68
+
69
+ source = MethodInfo.new( block,nil,false)
70
+ source = source.build_as_context_method(InterpretationContext.new({}, {}, {}, nil))
71
+ expected = 'def name(a,b,&block) p("this is a test") end'
72
+
73
+ assert_source_equal(expected, source)
54
74
  end
75
+
55
76
  def test_block_argument_class_method
56
- block = (get_sexp { |a,*b|
57
- p 'is a test' })
58
- source = MethodInfo.new({:block=>:block,:self=>self},block,true).build_as_context_method("name",InterpretationContext.new({},{},{},nil))
59
- expected = %{def self.name(a,*b,&block)
60
- p("this is a test")
77
+ block = get_def do
78
+ def self.name(a, *b,&block)
79
+ p 'is a test'
80
+ end
61
81
  end
62
- }
63
- assert_source_equal(expected,source)
82
+ source = MethodInfo.new( block,nil,false).build_as_context_method( InterpretationContext.new({}, {}, {}, nil))
83
+ expected = 'def self.name(a,*b,&block) p("is a test") end'
84
+ assert_source_equal(expected, source)
64
85
  end
65
86
  end
@@ -1 +1 @@
1
- `git ls-files`.split($/).grep(%r{(test|spec|features).rb}).select {|f| p f; require_relative("../#{f}")}
1
+ `git ls-files`.split($/).grep(%r{(test|spec|features).rb}).select { |f| p f; require_relative("../#{f}") }
@@ -4,14 +4,22 @@ require 'ruby2ruby'
4
4
  module SourceAssertions
5
5
  def assert_source_equal(expected, actual)
6
6
 
7
- expected_sexp = if expected.instance_of? String then Ripper::sexp expected else expected end
8
- actual_sexp = if actual.instance_of? String then Ripper::sexp actual else actual end
7
+ expected_sexp = if expected.instance_of? String then
8
+ Ripper::sexp expected
9
+ else
10
+ expected
11
+ end
12
+ actual_sexp = if actual.instance_of? String then
13
+ Ripper::sexp actual
14
+ else
15
+ actual
16
+ end
9
17
 
10
18
  message = "
11
19
  Expected: #{expected}
12
20
  but got: #{actual}"
13
21
  assert_sexp_with_ident(expected_sexp, actual_sexp, message)
14
- assert_equal(1,1) #just getting the correct assertion count
22
+ assert_equal(1, 1) #just getting the correct assertion count
15
23
  end
16
24
 
17
25
  def is_terminal(sexp)
@@ -40,7 +48,7 @@ module SourceAssertions
40
48
  end
41
49
  else
42
50
  if expected[i] != actual[i]
43
- assert_equal(expected[i],actual[i], message || "the arrays differ at index #{i}")
51
+ assert_equal(expected[i], actual[i], message || "the arrays differ at index #{i}")
44
52
  end
45
53
  end
46
54
  end
@@ -0,0 +1,42 @@
1
+ require 'test/unit'
2
+ require_relative '../generated/Tokens'
3
+ require_relative '../generated/Production'
4
+ require_relative 'test_helper'
5
+ class ProductionTest < Test::Unit::TestCase
6
+ def get_method_call &b
7
+ exp = get_sexp &b
8
+ exp[3]
9
+ end
10
+
11
+ def test_rolemethod
12
+ method_call = get_method_call { foo.bar }
13
+
14
+ production = get_production(method_call)
15
+ type = production.type
16
+ assert_equal(Tokens::rolemethod_call, type)
17
+ end
18
+
19
+ def get_production(method_call)
20
+ contracts ={}
21
+ roles = {:foo => {:bar => []}}
22
+ Production.new(method_call, InterpretationContext.new(roles, contracts, nil, nil))
23
+ end
24
+
25
+ def test_call
26
+ method_call = get_method_call { foo.baz }
27
+
28
+ production = get_production(method_call)
29
+ type = production.type
30
+
31
+ assert_equal(Tokens::call, type)
32
+ end
33
+
34
+ def test_indexer
35
+ method_call = get_method_call { foo[0] }
36
+
37
+ production = get_production(method_call)
38
+ type = production.type
39
+
40
+ assert_equal(Tokens::indexer, type)
41
+ end
42
+ end
@@ -1,17 +1,16 @@
1
1
  require 'test/unit'
2
2
  require_relative '../generated/ImmutableStack'
3
3
 
4
- ImmutableStack.new nil,nil
5
4
 
6
5
  class Stack_Test < Test::Unit::TestCase
7
6
 
8
7
  def test_push_pop
9
8
  stack = ImmutableStack.empty.push(1)
10
9
  stack = stack.push 2
11
- f,stack = stack.pop
12
- s,stack = stack.pop
13
- assert_equal(2,f)
14
- assert_equal(1,s)
15
- assert_equal(stack,ImmutableStack::empty)
10
+ f, stack = stack.pop
11
+ s, stack = stack.pop
12
+ assert_equal(2, f)
13
+ assert_equal(1, s)
14
+ assert_equal(stack, ImmutableStack::empty)
16
15
  end
17
16
  end
@@ -1,12 +1,12 @@
1
1
  require 'minitest/autorun'
2
2
  require 'sourcify'
3
3
  require_relative 'assertions'
4
- require_relative '../generated/interpretation_context'
4
+ require_relative '../generated/build'
5
5
  #require 'debugger'
6
6
 
7
7
  def get_sexp &b
8
8
  begin
9
- b.to_sexp
9
+ b.to_sexp
10
10
  rescue
11
11
  puts "failed to get expression"
12
12
  end
@@ -0,0 +1,63 @@
1
+ context :AstRewritter do
2
+ role :ast do
3
+ end
4
+
5
+ def initialize (ast, interpretation_context)
6
+ @ast = Production.new ast, interpretation_context
7
+ end
8
+
9
+ def rewrite!
10
+ ast.each { |production|
11
+
12
+ case production.type
13
+ when Tokens::rolemethod_call
14
+ data = production.data
15
+ production[2] = ('self_' + data[1].to_s + '_' + data[0].to_s).to_sym
16
+ production[1] = nil
17
+ when Tokens::block_with_bind
18
+ block = production.last
19
+ must_b_sym = 'aliased_role must be a Symbol'.to_sym
20
+ local_must_b_sym = 'local must be a Symbol'.to_sym
21
+ raise must_b_sym unless aliased_role.instance_of? Symbol
22
+ raise local_must_b_sym unless local.instance_of? Symbol
23
+ # assigning role player to role field
24
+ #notice that this will be executed after the next block
25
+ aliased_field = ('@' + aliased_role.to_s).to_sym
26
+ temp_symbol = ('temp____' + aliased_role.to_s).to_sym
27
+
28
+ assignment = Sexp.new
29
+ assignment[0] = :iasgn
30
+ assignment[1] = aliased_field
31
+ load_arg = Sexp.new
32
+ load_arg[0] = :lvar
33
+ load_arg[1] = local
34
+ assignment[2] = load_arg
35
+ block.insert 1, assignment
36
+
37
+ # assign role player to temp
38
+ # notice this is prepended Ie. inserted in front of the role player to role field
39
+ assignment = Sexp.new
40
+ assignment[0] = :lasgn
41
+ assignment[1] = temp_symbol
42
+ load_field = Sexp.new
43
+ load_field[0] = :ivar
44
+ load_field[1] = aliased_field
45
+ assignment[2] = load_field
46
+ block.insert 1, assignment
47
+
48
+ # reassign original player
49
+ assignment = Sexp.new
50
+ assignment[0] = :iasgn
51
+ assignment[1] = aliased_field
52
+ load_temp = Sexp.new
53
+ load_temp[0] = :lvar
54
+ load_temp[1] = temp_symbol
55
+ assignment[2] = load_temp
56
+ block[block.length] = assignment
57
+ else
58
+ #do nothing
59
+ end
60
+ }
61
+ end
62
+
63
+ end