maroon 0.5.2 → 0.5.3

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.
@@ -1,4 +1,6 @@
1
1
  # -*- encoding: utf-8 -*-
2
+ require 'live_ast'
3
+ require 'live_ast/to_ruby'
2
4
  #
3
5
  # Consider street corners on a Manhattan grid. We want to find the
4
6
  # minimal path from the most northeast city to the most
@@ -39,7 +41,7 @@
39
41
  #
40
42
  # Map is a DCI role. The role in this example is played by an
41
43
  # object representing a particular Manhattan geometry
42
- Context::define :CalculateShortestPath do
44
+ ctx,source = Context::define :CalculateShortestPath do
43
45
  role :distance_labeled_graph_node do
44
46
  # Access to roles and other Context data
45
47
  tentative_distance_values do
@@ -350,3 +352,5 @@ class CalculateShortestPath
350
352
  end
351
353
  end
352
354
 
355
+ File.open('CalculateShortestPath_generated.rb', 'w') {|f| f.write(source) }
356
+
@@ -1,7 +1,7 @@
1
1
  #Thanks to Ted Milken for updating the original example
2
2
 
3
3
  require '../lib/maroon.rb'
4
- require '../lib/Moby/kernel.rb'
4
+ require '../lib/maroon/kernel.rb'
5
5
 
6
6
  class Person
7
7
  attr_accessor :name
@@ -0,0 +1,108 @@
1
+ require "test/unit"
2
+ require '../lib/maroon.rb'
3
+ require '../lib/maroon/kernel.rb'
4
+
5
+ ##
6
+ # General comment
7
+ # it's hopeless to test for the actual source. It should be the syntax tree rather than the source
8
+ # it's the semantics that are important not the formatted source!!
9
+ ##
10
+
11
+ context :Greet_Someone, :greet do
12
+ role :greeter do
13
+ welcome do
14
+ self.greeting
15
+ end
16
+ end
17
+
18
+ role :greeted do
19
+ end
20
+
21
+ greet do
22
+ "#{greeter.name}: \"#{greeter.welcome}, #{greeted.name}!\""
23
+ end
24
+ end
25
+
26
+ class Person
27
+ attr_accessor :name
28
+ attr_accessor :greeting
29
+ end
30
+
31
+
32
+ class Greet_Someone
33
+ def initialize(greeter, greeted)
34
+ @greeter = greeter
35
+ @greeted = greeted
36
+ end
37
+ end
38
+
39
+ class BasicTests < Test::Unit::TestCase
40
+
41
+ def test_define_context
42
+ name = :MyContext
43
+ ctx,source = Context::define name do end
44
+ assert_equal(ctx.name, "Kernel::#{name}")
45
+ assert_equal(source,"class #{name}\r\n\n\n private\n\n\n\r\nend")
46
+ end
47
+
48
+ def test_define_role
49
+ name,role_name = :MyContextWithRole,:my_role
50
+ ctx,source = Context::define name do
51
+ role role_name do
52
+ role_go_do do
53
+
54
+ end
55
+ end
56
+ end
57
+ assert_not_nil(ctx)
58
+ assert_equal(ctx.name, "Kernel::#{name}")
59
+ assert_equal("class #{name}\r\n\n@#{role_name}\n\n private\ndef #{role_name};@#{role_name} end\n\n \ndef self_#{role_name}_role_go_do \n end\n\n\r\nend",source)
60
+ end
61
+
62
+ def test_bind
63
+ name,role_name,other_name = :MyContextUsingBind,:my_role, :other_role
64
+ ctx,source = Context::define name do
65
+ role other_name do
66
+ plus_one do
67
+ (self + 1)
68
+ end
69
+ end
70
+ go_do do
71
+ a = Array.new
72
+ [1,2].each do |e|
73
+ bind e => :other_role
74
+ a << e.plus_one
75
+ end
76
+ a
77
+ end
78
+ end
79
+ arr = MyContextUsingBind.new.go_do
80
+ assert_not_nil(ctx)
81
+ assert_equal(ctx.name, "Kernel::#{name}")
82
+ assert_equal("class MyContextUsingBind\r\n \ndef go_do \na = Array.new\n [1, 2].each do |e|\n temp____other_role = @other_role\n @other_role = e\n (a << self_other_role_plus_one)\n @other_role = temp____other_role\n end\n a\n end\n\n@other_role\n\n private\ndef other_role;@other_role end\n\n \ndef self_other_role_plus_one \n(other_role + 1) end\n\n\r\nend",source)
83
+ assert_equal(2,arr[0])
84
+ assert_equal(3,arr[1])
85
+ end
86
+ end
87
+
88
+ class TestExamples < Test::Unit::TestCase
89
+ def test_greeter
90
+ p1 = Person.new
91
+ p1.name = 'Bob'
92
+ p1.greeting = 'Hello'
93
+
94
+ p2 = Person.new
95
+ p2.name = 'World!'
96
+ p2.greeting = 'Greetings'
97
+
98
+ #Execute is automagically created for the default interaction (specified by the second argument in context :Greet_Someone, :greet do)
99
+ #Executes construc a context object and calls the default interaction on this object
100
+ res1 = Greet_Someone.execute p1, p2
101
+ res2 = Greet_Someone.new(p2, p1).greet
102
+ assert_equal(res1,"#{p1.name}: \"#{p1.greeting}, #{p2.name}!\"")
103
+ assert_equal(res1,Greet_Someone.new(p1, p2).greet) #verifies default action
104
+ #constructs a Greet_Someone context object and executes greet.
105
+ assert_equal(res2,"#{p2.name}: \"#{p2.greeting}, #{p1.name}!\"")
106
+ end
107
+ end
108
+
@@ -151,7 +151,8 @@ class Context
151
151
  code << "#{interactions}\n#{fields}\n private\n#{getters}\n#{impl}\n"
152
152
 
153
153
  complete = "class #{name}\r\n#{code}\r\nend"
154
- return c.class_eval(code),complete
154
+ temp = c.class_eval(code)
155
+ return (temp ||c),complete
155
156
  end
156
157
 
157
158
  def role_or_interaction_method(method_name,*args, &b)
@@ -243,9 +244,10 @@ class Context
243
244
  def rewrite_bind(aliased_role, local, block)
244
245
  raise 'aliased_role must be a Symbol' unless aliased_role.instance_of? Symbol
245
246
  raise 'local must be a Symbol' unless local.instance_of? Symbol
247
+ aliased_field = "@#{aliased_role}".to_sym
246
248
  assignment = Sexp.new
247
249
  assignment[0] = :iasgn
248
- assignment[1] = aliased_role
250
+ assignment[1] = aliased_field
249
251
  load_arg = Sexp.new
250
252
  load_arg[0] = :lvar
251
253
  load_arg[1] = local
@@ -259,14 +261,14 @@ class Context
259
261
  assignment[1] = temp_symbol
260
262
  load_field = Sexp.new
261
263
  load_field[0] = :ivar
262
- load_field[1] = aliased_role
264
+ load_field[1] = aliased_field
263
265
  assignment[2] = load_field
264
266
  block.insert 1, assignment
265
267
 
266
268
  # reassign original player
267
269
  assignment = Sexp.new
268
270
  assignment[0] = :iasgn
269
- assignment[1] = aliased_role
271
+ assignment[1] = aliased_field
270
272
  load_temp = Sexp.new
271
273
  load_temp[0] = :lvar
272
274
  load_temp[1] = temp_symbol
@@ -1,3 +1,3 @@
1
1
  module Maroon
2
- VERSION = '0.5.2'
2
+ VERSION = '0.5.3'
3
3
  end
@@ -13,7 +13,7 @@ the first language to support injectionless DCI.
13
13
 
14
14
  The performance of code written using maroon is on par with code using regular method invocation.
15
15
 
16
- For examples on how to use maroon look at the examples}
16
+ For examples on how to use maroon look at the examples found at the home page}
17
17
  gem.summary = %q{maroon}
18
18
  gem.homepage = 'https://github.com/runefs/maroon'
19
19
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: maroon
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.2
4
+ version: 0.5.3
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -109,7 +109,7 @@ description: ! 'maroon makes DCI a DSL for Ruby it''s mainly based on the work g
109
109
  invocation.
110
110
 
111
111
 
112
- For examples on how to use maroon look at the examples'
112
+ For examples on how to use maroon look at the examples found at the home page'
113
113
  email:
114
114
  - funchsoltoft@gmail.com
115
115
  executables: []
@@ -127,6 +127,7 @@ files:
127
127
  - LICENSE.txt
128
128
  - README.md
129
129
  - Rakefile
130
+ - Test/Greeter_test.rb
130
131
  - lib/maroon.rb
131
132
  - lib/maroon/kernel.rb
132
133
  - lib/maroon/version.rb