maroon 0.7.1 → 0.8.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.
Files changed (39) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +26 -6
  3. data/Rakefile +3 -3
  4. data/Test/Context_test.rb +16 -16
  5. data/{Examples/Dijkstra → Test/Examples}/CalculateShortestDistance.rb +11 -13
  6. data/Test/Examples/MoneyTransfer_test.rb +76 -0
  7. data/{Examples/Dijkstra → Test/Examples}/calculate_shortest_path.rb +77 -89
  8. data/{Examples/Dijkstra → Test/Examples}/data.rb +0 -0
  9. data/{Examples/Dijkstra/dijkstra.rb → Test/Examples/dijkstra_test.rb} +34 -24
  10. data/Test/Examples/greeter_test.rb +48 -0
  11. data/{Examples/meter.rb → Test/Examples/meter_test.rb} +44 -30
  12. data/Test/abstract_syntax_tree_test.rb +17 -26
  13. data/Test/alltests.rb +1 -1
  14. data/Test/test_helper.rb +2 -0
  15. data/base/AbstractSyntaxTree.rb +24 -3
  16. data/base/ImmutableStack.rb +1 -1
  17. data/base/dependency_graph.rb +94 -0
  18. data/base/immutable_queue.rb +1 -1
  19. data/base/maroon_base.rb +50 -11
  20. data/base/transfomer.rb +196 -197
  21. data/generated/Tokens.rb +64 -2
  22. data/generated/build.rb +1 -3
  23. data/generated/maroon/kernel.rb +7 -0
  24. data/lib/AbstractSyntaxTree.rb +120 -0
  25. data/lib/AstRewritter.rb +53 -58
  26. data/lib/Context.rb +104 -126
  27. data/lib/DependencyGraph.rb +76 -0
  28. data/lib/ImmutableQueue.rb +28 -39
  29. data/lib/ImmutableStack.rb +20 -34
  30. data/lib/Tokens.rb +64 -2
  31. data/lib/Transformer.rb +125 -165
  32. data/lib/build.rb +2 -4
  33. data/lib/maroon/kernel.rb +1 -1
  34. data/lib/maroon/version.rb +1 -1
  35. metadata +13 -11
  36. data/Examples/MoneyTransfer.rb +0 -62
  37. data/Examples/greeter.rb +0 -46
  38. data/Test/Greeter_test_disabled.rb +0 -203
  39. data/lib/Production.rb +0 -149
@@ -0,0 +1,76 @@
1
+ class DependencyGraph
2
+ def initialize(context_name,roles,interactions,dependencies) @context_name = context_name
3
+ @roles = roles
4
+ @interactions = interactions
5
+ @dependencies = dependencies
6
+ end
7
+ def create!() self_roles_dependencies
8
+ self_interactions_dependencies
9
+ dependencies
10
+ end
11
+ private
12
+
13
+ def self_roles_dependencies() roles.each do |r, methods|
14
+ temp____role_name = @role_name
15
+ @role_name = r
16
+ role_dependencies = dependencies[r] ||= {}
17
+ methods.each do |name, method_sources|
18
+ temp____dependency = @dependency
19
+ @dependency = role_dependencies
20
+ temp____method = @method
21
+ @method = method_sources
22
+ self_method_get_dependencies
23
+ @method = temp____method
24
+ @dependency = temp____dependency
25
+ end
26
+ @role_name = temp____role_name
27
+ end end
28
+ def self_interactions_dependencies() interactions.each do |name, interact|
29
+ role_dependencies = dependencies[:interactions] ||= {}[name] ||= {}
30
+ interact.each do |m|
31
+ temp____dependency = @dependency
32
+ @dependency = role_dependencies
33
+ temp____method = @method
34
+ @method = m
35
+ self_method_get_dependencies
36
+ @method = temp____method
37
+ @dependency = temp____dependency
38
+ end
39
+ end end
40
+ def self_dependency_add(dependent_role_name,method_name) if dependent_role_name and dependent_role_name.!=(role_name) then
41
+ dependency[dependent_role_name] ||= {}
42
+ unless dependency[dependent_role_name].has_key?(method_name) then
43
+ dependency[dependent_role_name][method_name] = 0
44
+ end
45
+ dependency[dependent_role_name][method_name] += 1
46
+ end end
47
+ def self_method_body() args = self_method_definition.detect { |d| (d[0] == :args) }
48
+ index = (self_method_definition.index(args) + 1)
49
+ if (self_method_definition.length > (index + 1)) then
50
+ body = self_method_definition[(index..-1)]
51
+ body.insert(0, :block)
52
+ body
53
+ else
54
+ self_method_definition[index]
55
+ end
56
+ end
57
+ def self_method_ast() AbstractSyntaxTree.new(self_method_body, InterpretationContext.new(roles, {}, {}, role_name, {})) end
58
+ def self_method_definition() method.instance_of?(Array) ? (method[0]) : (method) end
59
+ def self_method_get_dependencies() self_method_ast.each_production do |production|
60
+ name = nil
61
+ method_name = nil
62
+ case production.type
63
+ when Tokens.rolemethod_call then
64
+ data = production.data
65
+ name = data[1]
66
+ method_name = data[0]
67
+ when Tokens.role then
68
+ name = production.data[0]
69
+ else
70
+ # do nothing
71
+ end
72
+ self_dependency_add(name, method_name) if name.!=(nil)
73
+ end end
74
+ attr_reader :roles, :interactions, :dependencies, :dependency, :role_name, :method
75
+
76
+ end
@@ -1,43 +1,32 @@
1
1
  class ImmutableQueue
2
- def push(element)
3
- b = (back or ImmutableStack.empty)
4
- ImmutableQueue.new(front, b.push(element))
2
+ def push(element) b = (back or ImmutableStack.empty)
3
+ ImmutableQueue.new(front, b.push(element))
4
+ end
5
+ def pop() f, b = front, back
6
+ if (f == ImmutableStack.empty) then
7
+ until (b == ImmutableStack.empty) do
8
+ (e, b = b.pop
9
+ f = f.push(e))
5
10
  end
11
+ end
12
+ head, f = f.pop
13
+ if (f == b) then
14
+ [head, ImmutableQueue.empty]
15
+ else
16
+ [head, ImmutableQueue.new(f, b)]
17
+ end
18
+ end
19
+ def self.empty() @empty ||= ImmutableQueue.new(ImmutableStack.empty, ImmutableStack.empty) end
20
+ def push_array(arr) q = self
21
+ arr.each { |i| q = q.push(i) } if arr
22
+ q
23
+ end
24
+ private
25
+ def initialize(front,back) @front = (front or ImmutableStack.empty)
26
+ @back = (back or ImmutableStack.empty)
27
+ self.freeze
28
+ end
6
29
 
7
- def pop()
8
- f, b = front, back
9
- if (f == ImmutableStack.empty) then
10
- until (b == ImmutableStack.empty) do
11
- (e, b = b.pop
12
- f = f.push(e))
13
- end
14
- end
15
- head, f = f.pop
16
- if (f == b) then
17
- [head, ImmutableQueue.empty]
18
- else
19
- [head, ImmutableQueue.new(f, b)]
20
- end
21
- end
22
-
23
- def self.empty()
24
- @@empty ||= ImmutableQueue.new(ImmutableStack.empty, ImmutableStack.empty)
25
- end
26
-
27
- def push_array(arr)
28
- q = self
29
- arr.each { |i| q = q.push(i) } if arr
30
- q
31
- end
32
-
33
- private
34
- def initialize(front, back)
35
- @front = (front or ImmutableStack.empty)
36
- @back = (back or ImmutableStack.empty)
37
- self.freeze
38
- end
39
-
40
- attr_reader :front
41
- attr_reader :back
30
+ attr_reader :front, :back
42
31
 
43
- end
32
+ end
@@ -1,35 +1,21 @@
1
1
  class ImmutableStack
2
- def pop()
3
- [@head, @tail]
4
- end
5
-
6
- def push(element)
7
- ImmutableStack.new(element, self)
8
- end
9
-
10
- def self.empty()
11
- @@empty ||= self.new(nil, nil)
12
- end
13
-
14
- def each()
15
- yield(head)
16
- t = tail
17
- while t.!=(ImmutableStack.empty) do
18
- h, t = t.pop
19
- yield(h)
20
- end
21
- end
22
-
23
- def initialize(h, t)
24
- @head = h
25
- @tail = t
26
- self.freeze
27
- end
28
-
29
- private
30
-
31
-
32
- attr_reader :head
33
- attr_reader :tail
34
-
35
- end
2
+ def pop() [@head, @tail] end
3
+ def push(element) ImmutableStack.new(element, self) end
4
+ def self.empty() @empty ||= self.new(nil, nil) end
5
+ def each() yield(head)
6
+ t = tail
7
+ while t.!=(ImmutableStack.empty) do
8
+ h, t = t.pop
9
+ yield(h)
10
+ end
11
+ end
12
+ def initialize(h,t) @head = h
13
+ @tail = t
14
+ self.freeze
15
+ end
16
+ private
17
+
18
+
19
+ attr_reader :head, :tail
20
+
21
+ end
@@ -1,6 +1,11 @@
1
1
  class Tokens
2
2
  def self.define_token(name)
3
- class_eval("@@#{name} = Tokens.new :#{name};def Tokens.#{name};@@#{name};end")
3
+ class_eval %{
4
+ @#{name} = Tokens.new :#{name};
5
+ def Tokens.#{name}
6
+ @#{name}
7
+ end
8
+ }
4
9
  end
5
10
 
6
11
  def to_s
@@ -21,4 +26,61 @@ class Tokens
21
26
  define_token :indexer
22
27
  define_token :block
23
28
  define_token :block_with_bind
24
- end
29
+ define_token :initializer
30
+ define_token :const
31
+ end
32
+
33
+ class DependencyGraphModel
34
+
35
+ def initialize(dependencies)
36
+ @dependencies = dependencies
37
+ end
38
+
39
+ def to_hash
40
+ @dependecies
41
+ end
42
+
43
+ def to_s
44
+ print_dependencies @dependencies,0
45
+ end
46
+
47
+ def to_dot
48
+ res = ''
49
+ dependencies = denormalize @dependencies
50
+ dependencies.each{|d| res << d.reverse.join('->') << '
51
+ '}
52
+ 'digraph g{
53
+ ' + res + '}'
54
+ end
55
+
56
+ private
57
+ def print_dependencies(dependencies,indent)
58
+ res = ''
59
+ dependencies.each do |key,value|
60
+ res << key.to_s
61
+ if value.instance_of? Hash
62
+ res << '->' << (print_dependencies value,indent != nil ? indent+4 : nil)
63
+ elsif
64
+ res << ':' << value.to_s + '
65
+ '
66
+ indent.times {res << ' '} unless indent == nil
67
+ end
68
+ res << '
69
+ '
70
+ end
71
+ res
72
+ end
73
+
74
+ def denormalize(dependencies)
75
+ res = []
76
+ dependencies.each do |key,value|
77
+ if value.instance_of? Hash
78
+ res = denormalize value
79
+ res.each{|a| a << key}
80
+ else
81
+ res << [key]
82
+ end
83
+ end
84
+ res
85
+ end
86
+ end
@@ -1,174 +1,134 @@
1
1
  class Transformer
2
- def initialize(context_name, roles, interactions, private_interactions, base_class, default_interaction)
3
- @context_name = context_name
4
- @roles = roles
5
- @interactions = interactions
6
- @base_class = base_class
7
- @default_interaction = default_interaction
8
- @private_interactions = private_interactions
9
- @definitions = {}
2
+ def initialize(context_name,roles,interactions,private_interactions,base_class,default_interaction) @context_name = context_name
3
+ @roles = roles
4
+ @interactions = interactions
5
+ @base_class = base_class
6
+ @default_interaction = default_interaction
7
+ @private_interactions = private_interactions
8
+ @definitions = {}
9
+ end
10
+ def transform(file_path,with_contracts) code = (self_interactions_generated_source + self_roles_generated_source)
11
+ if file_path then
12
+ name = context_name.to_s
13
+ complete = ((((("class " + name) + (@base_class ? (("<< " + @base_class.name)) : (""))) + "\n ") + code.to_s) + "\n end")
14
+ File.open((((("./" + file_path.to_s) + "/") + name) + ".rb"), "w") do |f|
15
+ f.write(complete)
10
16
  end
11
-
12
- def transform(file_path, with_contracts)
13
- code = (self_interactions_generated_source + self_roles_generated_source)
14
- if file_path then
15
- name = context_name.to_s
16
- complete = ((((("class " + name) + (@base_class ? (("<< " + @base_class.name)) : (""))) + "\n ") + code.to_s) + "\n end")
17
- File.open((((("./" + file_path.to_s) + "/") + name) + ".rb"), "w") do |f|
18
- f.write(complete)
19
- end
20
- complete
21
- else
22
- c = @base_class ? (Class.new(base_class)) : (Class.new)
23
- if with_contracts then
24
- c.class_eval("def self.assert_that(obj)\n ContextAsserter.new(self.contracts,obj)\nend\ndef self.refute_that(obj)\n ContextAsserter.new(self.contracts,obj,false)\nend\ndef self.contracts\n @@contracts\nend\ndef self.contracts=(value)\n @@contracts = value\nend")
25
- c.contracts = contracts
26
- end
27
- Kernel.const_set(context_name, c)
28
- begin
29
- temp = c.class_eval(code)
30
- rescue SyntaxError
31
- p(("error: " + code))
32
- end
33
- (temp or c)
34
- end
17
+ complete
18
+ else
19
+ c = @base_class ? (Class.new(base_class)) : (Class.new)
20
+ if with_contracts then
21
+ c.class_eval("def self.assert_that(obj)\n ContextAsserter.new(self.contracts,obj)\nend\ndef self.refute_that(obj)\n ContextAsserter.new(self.contracts,obj,false)\nend\ndef self.contracts\n @contracts\nend\ndef self.contracts=(value)\n @contracts = value\nend")
22
+ c.contracts = contracts
35
23
  end
36
-
37
- private
38
- def contracts()
39
- @contracts ||= {}
24
+ Kernel.const_set(context_name, c)
25
+ begin
26
+ temp = c.class_eval(code)
27
+ rescue SyntaxError
28
+ p(("error: " + code))
40
29
  end
41
-
42
- def role_aliases()
43
- @role_aliases ||= {}
30
+ (temp or c)
31
+ end
32
+ end
33
+ private
34
+ def contracts() @contracts ||= {} end
35
+ def role_aliases() @role_aliases ||= {} end
36
+ def interpretation_context() InterpretationContext.new(roles, contracts, role_aliases, defining_role, @private_interactions) end
37
+ def self_roles_generated_source() impl = ""
38
+ getters = []
39
+ roles.each do |role, methods|
40
+ (getters << role.to_s)
41
+ methods.each do |name, method_sources|
42
+ temp____defining_role = @defining_role
43
+ @defining_role = role
44
+ temp____method_name = @method_name
45
+ @method_name = name
46
+ temp____method = @method
47
+ @method = method_sources
48
+ definition = self_method_generated_source
49
+ (impl << (" " + definition)) if definition
50
+ @method = temp____method
51
+ @method_name = temp____method_name
52
+ @defining_role = temp____defining_role
44
53
  end
45
-
46
- def interpretation_context()
47
- InterpretationContext.new(roles, contracts, role_aliases, defining_role, @private_interactions)
54
+ end
55
+ ((((impl.strip! or "") + "\n") + ((getters.length > 0) ? (("attr_reader :" + getters.join(", :"))) : (""))) + "\n")
56
+ end
57
+ def self_interactions_generated_source() internal_methods = ""
58
+ external_methods = self_interactions_default
59
+ interactions.each do |name, interact|
60
+ interact.each do |m|
61
+ temp____method_name = @method_name
62
+ @method_name = name
63
+ temp____method = @method
64
+ @method = m
65
+ @defining_role = nil
66
+ code = self_method_generated_source
67
+ (((self_method_is_private? ? (internal_methods) : (external_methods)) << " ") << code)
68
+ @method = temp____method
69
+ @method_name = temp____method_name
48
70
  end
49
-
50
- def self_roles_generated_source()
51
- impl = ""
52
- getters = ""
53
- roles.each do |role, methods|
54
- (getters << (("attr_reader :" + role.to_s) + "\n "))
55
- methods.each do |name, method_sources|
56
- temp____defining_role = @defining_role
57
- @defining_role = role
58
- temp____method_name = @method_name
59
- @method_name = name
60
- temp____method = @method
61
- @method = method_sources
62
- definition = self_method_generated_source
63
- (impl << (" " + definition)) if definition
64
- @method = temp____method
65
- @method_name = temp____method_name
66
- @defining_role = temp____defining_role
67
- end
68
- end
69
- ((((impl.strip! or "") + "\n") + (getters.strip! or "")) + "\n")
71
+ end
72
+ ((((external_methods.strip! or "") + "\n private\n") + (internal_methods.strip! or "")) + "\n")
73
+ end
74
+ def self_interactions_default() if @default then
75
+ (((((((((("\n def self.call(*args)\n arity = " + name.to_s) + ".method(:new).arity\n newArgs = args[0..arity-1]\n obj = ") + name.to_s) + ".new *newArgs\n if arity < args.length\n methodArgs = args[arity..-1]\n obj.") + default.to_s) + " *methodArgs\n else\n obj.") + default.to_s) + "\n end\n end\n def call(*args);") + default.to_s) + " *args; end\n")
76
+ else
77
+ ""
78
+ end end
79
+ def self_method_is_private?() (defining_role.!=(nil) or private_interactions.has_key?(self_method_name)) end
80
+ def self_method_definition() key = ((@defining_role ? (@defining_role.to_s) : ("")) + method_name.to_s)
81
+ return @definitions[key] if @definitions.has_key?(key)
82
+ unless method.instance_of?(Sexp) then
83
+ unless method.instance_of?(Array) and (method.length < 2) then
84
+ raise((((("Duplicate definition of " + method_name.to_s) + "(") + method.to_s) + ")"))
70
85
  end
71
-
72
- def self_interactions_generated_source()
73
- internal_methods = ""
74
- external_methods = self_interactions_default
75
- interactions.each do |name, interact|
76
- interact.each do |m|
77
- temp____method_name = @method_name
78
- @method_name = name
79
- temp____method = @method
80
- @method = m
81
- @defining_role = nil
82
- code = self_method_generated_source
83
- (((self_method_is_private? ? (internal_methods) : (external_methods)) << " ") << code)
84
- @method = temp____method
85
- @method_name = temp____method_name
86
- end
87
- end
88
- ((((external_methods.strip! or "") + "\n private\n") + (internal_methods.strip! or "")) + "\n")
86
+ unless method.instance_of?(Array) and (method.length > 0) then
87
+ raise(("No source for " + method_name.to_s))
89
88
  end
89
+ end
90
+ d = method.instance_of?(Array) ? (method[0]) : (method)
91
+ raise("Sexp require") unless d.instance_of?(Sexp)
92
+ @definitions[key] = d
93
+ end
94
+ def self_method_body() args = self_method_definition.detect { |d| (d[0] == :args) }
95
+ index = (self_method_definition.index(args) + 1)
96
+ if (self_method_definition.length > (index + 1)) then
97
+ body = self_method_definition[(index..-1)]
98
+ body.insert(0, :block)
99
+ body
100
+ else
101
+ self_method_definition[index]
102
+ end
103
+ end
104
+ def self_method_arguments() args = self_method_definition.detect { |d| (d[0] == :args) }
105
+ args and (args.length > 1) ? (args[(1..-1)]) : ([])
106
+ end
107
+ def self_method_name() name = if self_method_definition[1].instance_of?(Symbol) then
108
+ self_method_definition[1].to_s
109
+ else
110
+ ((self_method_definition[1].select { |e| e.instance_of?(Symbol) }.map do |e|
111
+ e.to_s
112
+ end.join(".") + ".") + self_method_definition[2].to_s)
113
+ end
114
+ (if defining_role then
115
+ ((("self_" + @defining_role.to_s) + "_") + name.to_s)
116
+ else
117
+ name
118
+ end).to_sym
119
+ end
120
+ def self_method_generated_source() AstRewritter.new(self_method_body, interpretation_context).rewrite!
121
+ body = Ruby2Ruby.new.process(self_method_body)
122
+ raise("Body is undefined") unless body
123
+ args = self_method_arguments
124
+ if args and args.length then
125
+ args = (("(" + args.join(",")) + ")")
126
+ else
127
+ args = ""
128
+ end
129
+ header = (("def " + self_method_name.to_s) + args)
130
+ (((header + " ") + body) + " end\n")
131
+ end
132
+ attr_reader :private_interactions, :context_name, :roles, :interactions, :method_name, :defining_role, :method
90
133
 
91
- def self_interactions_default()
92
- if @default then
93
- (((((((((("\n def self.call(*args)\n arity = " + name.to_s) + ".method(:new).arity\n newArgs = args[0..arity-1]\n obj = ") + name.to_s) + ".new *newArgs\n if arity < args.length\n methodArgs = args[arity..-1]\n obj.") + default.to_s) + " *methodArgs\n else\n obj.") + default.to_s) + "\n end\n end\n def call(*args);") + default.to_s) + " *args; end\n")
94
- else
95
- ""
96
- end
97
- end
98
-
99
- def self_method_is_private?()
100
- (defining_role.!=(nil) or private_interactions.has_key?(self_method_name))
101
- end
102
-
103
- def self_method_definition()
104
- key = ((@defining_role ? (@defining_role.to_s) : ("")) + method_name.to_s)
105
- return @definitions[key] if @definitions.has_key?(key)
106
- unless method.instance_of?(Sexp) then
107
- unless method.instance_of?(Array) and (method.length < 2) then
108
- raise((((("Duplicate definition of " + method_name.to_s) + "(") + method.to_s) + ")"))
109
- end
110
- unless method.instance_of?(Array) and (method.length > 0) then
111
- raise(("No source for " + method_name.to_s))
112
- end
113
- end
114
- d = method.instance_of?(Array) ? (method[0]) : (method)
115
- raise("Sexp require") unless d.instance_of?(Sexp)
116
- @definitions[key] = d
117
- end
118
-
119
- def self_method_body()
120
- args = self_method_definition.detect { |d| (d[0] == :args) }
121
- index = (self_method_definition.index(args) + 1)
122
- if (self_method_definition.length > (index + 1)) then
123
- body = self_method_definition[(index..-1)]
124
- body.insert(0, :block)
125
- body
126
- else
127
- self_method_definition[index]
128
- end
129
- end
130
-
131
- def self_method_arguments()
132
- args = self_method_definition.detect { |d| (d[0] == :args) }
133
- args and (args.length > 1) ? (args[(1..-1)]) : ([])
134
- end
135
-
136
- def self_method_name()
137
- name = if self_method_definition[1].instance_of?(Symbol) then
138
- self_method_definition[1].to_s
139
- else
140
- ((self_method_definition[1].select { |e| e.instance_of?(Symbol) }.map do |e|
141
- e.to_s
142
- end.join(".") + ".") + self_method_definition[2].to_s)
143
- end
144
- (
145
- if defining_role then
146
- ((("self_" + @defining_role.to_s) + "_") + name.to_s)
147
- else
148
- name
149
- end).to_sym
150
- end
151
-
152
- def self_method_generated_source()
153
- AstRewritter.new(self_method_body, interpretation_context).rewrite!
154
- body = Ruby2Ruby.new.process(self_method_body)
155
- raise("Body is undefined") unless body
156
- args = self_method_arguments
157
- if args and args.length then
158
- args = (("(" + args.join(",")) + ")")
159
- else
160
- args = ""
161
- end
162
- header = (("def " + self_method_name.to_s) + args)
163
- (((header + " ") + body) + " end\n")
164
- end
165
-
166
- attr_reader :private_interactions
167
- attr_reader :context_name
168
- attr_reader :roles
169
- attr_reader :interactions
170
- attr_reader :method_name
171
- attr_reader :defining_role
172
- attr_reader :method
173
-
174
- end
134
+ end