maroon 0.7.1 → 0.8.0

Sign up to get free protection for your applications and to get access to all the features.
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