drsi 0.0.3 → 0.1.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 +4 -4
- data/lib/drsi/dci/context.rb +3 -2
- data/lib/drsi/dci/multiplayer.rb +40 -0
- data/lib/drsi/dci/role.rb +2 -2
- data/lib/drsi/version.rb +1 -1
- data/spec/multiplayers_spec.rb +134 -0
- data/spec/role_spec.rb +4 -5
- data/spec/roleplayers_spec.rb +3 -1
- metadata +4 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 92ea1b7d7874b1e6ee6596e7d1ff74934ff7faaf
|
4
|
+
data.tar.gz: e2da03ccffe38c5d4a07b47c4ade629daa5daf37
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: bff09ba36627ace4931fde461587d988b6cb46033af254d5445d4494711f8254e90821303a40a4437af06627d5437124f65b9e81cb49fcc62e3189fdaf52d150
|
7
|
+
data.tar.gz: 917f13107b5a9ee8abc8459434a91421ff150d4e7c970d064e625151eee619d6f3386b62b98b0a7657fe316d9500dddf5045661536ad61d7496c73049dda7f70
|
data/lib/drsi/dci/context.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'drsi/dci/role'
|
2
|
+
require 'drsi/dci/multiplayer'
|
2
3
|
|
3
4
|
module DCI
|
4
5
|
class Context
|
@@ -154,14 +155,14 @@ module DCI
|
|
154
155
|
# - This context instance get access to this new role player through an instance method named after the role key.
|
155
156
|
def assign_role_to_player!(rolekey, player)
|
156
157
|
role_mod = roles[rolekey]
|
157
|
-
player.__play_role!(role_mod, self)
|
158
|
+
::DCI::Multiplayer(player).each {|roleplayer| roleplayer.__play_role!(role_mod, self)}
|
158
159
|
instance_variable_set(:"@#{rolekey}", player)
|
159
160
|
end
|
160
161
|
|
161
162
|
# Disassociates every role from the playing object.
|
162
163
|
def players_unplay_role!
|
163
164
|
roles.keys.each do |rolekey|
|
164
|
-
@_players[rolekey].__unplay_last_role!
|
165
|
+
::DCI::Multiplayer(@_players[rolekey]).each {|roleplayer| roleplayer.__unplay_last_role!}
|
165
166
|
# 'instance_variable_set(:"@#{rolekey}", nil)
|
166
167
|
end
|
167
168
|
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
module DCI
|
2
|
+
|
3
|
+
# The intend of this method is to create something similar to Array():
|
4
|
+
# When called with a Multiplayer object, returns the object unmodified.
|
5
|
+
# Otherwise, retuns a new Multiplayer object wrapping the given argument.
|
6
|
+
def self.Multiplayer(obj)
|
7
|
+
obj.is_a?(::DCI::Multiplayer) ? obj : Multiplayer.new(obj)
|
8
|
+
end
|
9
|
+
|
10
|
+
|
11
|
+
# This simple class lets collect together a list of any type of objects.
|
12
|
+
# If you pass a multiplayer collection instance as the role player when instantiating a context,
|
13
|
+
# every object of the collection get the role instead of the multiplayer instance itself.
|
14
|
+
# So this is the way for different objects to play the similar roles at the same time in a DCI Context.
|
15
|
+
class Multiplayer
|
16
|
+
|
17
|
+
# Syntax sugar to easy the creation of Multiplayer instances.
|
18
|
+
def self.[](*args)
|
19
|
+
new(*args)
|
20
|
+
end
|
21
|
+
|
22
|
+
def each(&block)
|
23
|
+
@players.each {|player| block.call(player)}
|
24
|
+
end
|
25
|
+
|
26
|
+
# Give access to the players of this instance in a way similar to an array:
|
27
|
+
# multiplayer[1], multiplayer[1..5], multiplayer[-2], ...
|
28
|
+
def [](index)
|
29
|
+
@players[index]
|
30
|
+
end
|
31
|
+
|
32
|
+
def initialize(*args)
|
33
|
+
@players = args
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
39
|
+
|
40
|
+
|
data/lib/drsi/dci/role.rb
CHANGED
@@ -4,14 +4,14 @@ module DCI
|
|
4
4
|
private
|
5
5
|
|
6
6
|
def context
|
7
|
-
raise 'This method must be redefined in every module
|
7
|
+
raise 'This method must be redefined in every module extending DCI::Role'
|
8
8
|
end
|
9
9
|
|
10
10
|
# Defines a new private reader instance method for a context mate role, delegating it to the context object.
|
11
11
|
def add_role_reader_for!(rolekey)
|
12
12
|
return if private_method_defined?(rolekey)
|
13
|
-
private
|
14
13
|
define_method(rolekey) {context.send(rolekey)}
|
14
|
+
private rolekey
|
15
15
|
end
|
16
16
|
|
17
17
|
end
|
data/lib/drsi/version.rb
CHANGED
@@ -0,0 +1,134 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
2
|
+
require 'ostruct'
|
3
|
+
|
4
|
+
describe 'Role MultiPlayers' do
|
5
|
+
|
6
|
+
context "A role can be played by many objects in the same context at the same time" do
|
7
|
+
before(:all) do
|
8
|
+
class TestingRoleplayersContext < DCI::Context
|
9
|
+
role :role1 do
|
10
|
+
def role1method1; :role1method1_executed end
|
11
|
+
def role1self; self end
|
12
|
+
end
|
13
|
+
|
14
|
+
role :role2 do
|
15
|
+
def role2method1; role1 end
|
16
|
+
def role2self; self end
|
17
|
+
|
18
|
+
private
|
19
|
+
def private_role2method2; :private_rolemethod_return_value end
|
20
|
+
end
|
21
|
+
|
22
|
+
def check_role1_identity(obj)
|
23
|
+
[role1 == obj, role1.role1self == obj, role1.respond_to?(:role1method1), obj.respond_to?(:role1method1),
|
24
|
+
role1.role1method1 == :role1method1_executed, obj.role1method1 == :role1method1_executed].uniq == [true]
|
25
|
+
end
|
26
|
+
|
27
|
+
def get_role2_from_role1
|
28
|
+
role1.send(:role2)
|
29
|
+
end
|
30
|
+
|
31
|
+
def multiplayer_dont_get_role
|
32
|
+
[!role2.respond_to?(:role2method1), !role2.private_methods.map(&:to_s).include?('private_role2method2')].uniq == [true]
|
33
|
+
end
|
34
|
+
|
35
|
+
def multiplayer_players_get_their_role?
|
36
|
+
role2players = role2[0..-1]
|
37
|
+
[!role2players.empty?,
|
38
|
+
(role2players.all? {|roleplayer| roleplayer.respond_to?(:role2method1)}),
|
39
|
+
(role2players.all? {|roleplayer| roleplayer.role2method1 == role1}),
|
40
|
+
(role2players.all? {|roleplayer| roleplayer.private_methods.map(&:to_s).include?('private_role2method2')}),
|
41
|
+
|
42
|
+
].uniq == [true]
|
43
|
+
end
|
44
|
+
|
45
|
+
def check_role2players_identity(*objs)
|
46
|
+
objs.all? do |obj|
|
47
|
+
index = objs.index(obj)
|
48
|
+
[role2 != obj, role2[index] == obj, role2[index].role2self == obj,
|
49
|
+
role2[index].send(:private_role2method2) == :private_rolemethod_return_value,
|
50
|
+
obj.send(:private_role2method2) == :private_rolemethod_return_value].uniq == [true]
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
def roles2_external_interfaces_accessible?(*names)
|
55
|
+
names.all? do |name|
|
56
|
+
index = names.index(name)
|
57
|
+
role2[index].name == name
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
def roles2_have_context_private_access?
|
62
|
+
role2[0..-1].all? do |roleplayer|
|
63
|
+
[!roleplayer.respond_to?(:context), roleplayer.private_methods.map(&:to_s).include?('context'), roleplayer.send(:context) == self].uniq == [true]
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
def roles2_have_settings_private_access?(settings_copy)
|
68
|
+
role2[0..-1].all? do |roleplayer|
|
69
|
+
[!roleplayer.respond_to?(:settings), roleplayer.private_methods.map(&:to_s).include?('settings'),
|
70
|
+
roleplayer.send(:settings) == settings, roleplayer.send(:settings) == settings_copy,
|
71
|
+
roleplayer.send(:settings, :setting2) == settings_copy[:setting2],
|
72
|
+
roleplayer.send(:settings, :setting1, :setting3) == {:setting1 => settings_copy[:setting1], :setting3 => settings_copy[:setting3]}
|
73
|
+
].uniq == [true]
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
end
|
78
|
+
|
79
|
+
@player1, @player2, @player22 = OpenStruct.new(:name => 'player1'), OpenStruct.new(:name => 'player2'), OpenStruct.new(:name => 'player22')
|
80
|
+
@multiplayer = DCI::Multiplayer[@player2, @player22]
|
81
|
+
#puts @multiplayer.instance_variable_get(:@players)
|
82
|
+
@testing_roleplayers_context = TestingRoleplayersContext.new(:role1 => @player1,
|
83
|
+
:role2 => @multiplayer,
|
84
|
+
:setting1 => :one,
|
85
|
+
:setting2 => :two,
|
86
|
+
:setting3 => :three)
|
87
|
+
end
|
88
|
+
|
89
|
+
it("For it to work, the developer has to give a rolekey the value of a DCI::Multiplayer instance when instantiating the context...") do
|
90
|
+
@testing_roleplayers_context.get_role2_from_role1.should be(@multiplayer)
|
91
|
+
end
|
92
|
+
|
93
|
+
it("...so now, all the objects wrapped by the multiplayer instance play the role intended") do
|
94
|
+
@testing_roleplayers_context.multiplayer_dont_get_role.should be_true
|
95
|
+
@testing_roleplayers_context.multiplayer_players_get_their_role?.should be_true
|
96
|
+
end
|
97
|
+
|
98
|
+
it("...preserving their identity") do
|
99
|
+
@testing_roleplayers_context.check_role2players_identity(@player2, @player22).should be_true
|
100
|
+
end
|
101
|
+
it("...and therefore, their state and behaviour are accessible inside the context.") do
|
102
|
+
@testing_roleplayers_context.roles2_external_interfaces_accessible?(@player2.name, @player22.name).should be_true
|
103
|
+
end
|
104
|
+
|
105
|
+
it("They have private access to the context.") do
|
106
|
+
@testing_roleplayers_context.roles2_have_context_private_access?.should be_true
|
107
|
+
end
|
108
|
+
|
109
|
+
it("And also private access to extra args received in the instantiation of its context.") do
|
110
|
+
@testing_roleplayers_context.roles2_have_settings_private_access?({:setting1 => :one, :setting2 => :two, :setting3 => :three}).should be_true
|
111
|
+
end
|
112
|
+
|
113
|
+
it("But all these features, are only inside a context. Never out of it!") do
|
114
|
+
@player2.should_not respond_to(:role1method1)
|
115
|
+
@player22.should_not respond_to(:role1method1)
|
116
|
+
@player2.private_methods.map(&:to_s).should_not include(:private_role2method2)
|
117
|
+
@player22.private_methods.map(&:to_s).should_not include(:private_role2method2)
|
118
|
+
@player2.name.should eq('player2')
|
119
|
+
@player22.name.should eq('player22')
|
120
|
+
@player2.should_not respond_to(:role1)
|
121
|
+
@player22.should_not respond_to(:role1)
|
122
|
+
@player2.should_not respond_to(:context)
|
123
|
+
@player22.should_not respond_to(:context)
|
124
|
+
@player2.should_not respond_to(:settings)
|
125
|
+
@player22.should_not respond_to(:settings)
|
126
|
+
(@player2.private_methods.map(&:to_s) & ['role1', 'context', 'settings']).should be_empty
|
127
|
+
(@player22.private_methods.map(&:to_s) & ['role1', 'context', 'settings']).should be_empty
|
128
|
+
end
|
129
|
+
|
130
|
+
|
131
|
+
|
132
|
+
end
|
133
|
+
|
134
|
+
end
|
data/spec/role_spec.rb
CHANGED
@@ -5,10 +5,8 @@ describe 'Role' do
|
|
5
5
|
context "When defining roles inside a DCI::Context subclass..." do
|
6
6
|
before(:all) do
|
7
7
|
class TestingRoleContext < DCI::Context
|
8
|
-
role :rolename
|
9
|
-
end
|
10
|
-
role :anotherrolename do
|
11
|
-
end
|
8
|
+
role :rolename
|
9
|
+
role :anotherrolename do end
|
12
10
|
end
|
13
11
|
end
|
14
12
|
it("...you can define as many as you want.") do
|
@@ -25,8 +23,9 @@ describe 'Role' do
|
|
25
23
|
end
|
26
24
|
end.to raise_error
|
27
25
|
end
|
28
|
-
it("A block defining rolemethods
|
26
|
+
it("A block defining rolemethods can be provided as well.") do
|
29
27
|
TestingRoleContext.roles[:rolename].should be_a(Module)
|
28
|
+
TestingRoleContext.roles[:anotherrolename].should be_a(Module)
|
30
29
|
end
|
31
30
|
end
|
32
31
|
|
data/spec/roleplayers_spec.rb
CHANGED
@@ -19,7 +19,9 @@ describe 'RolePlayers' do
|
|
19
19
|
def private_role2method2; :private_rolemethod_return_value end
|
20
20
|
end
|
21
21
|
|
22
|
-
def check_role_interaccess
|
22
|
+
def check_role_interaccess
|
23
|
+
[role2.role2method1 == role1, !role2.respond_to?(:role1)].uniq == [true]
|
24
|
+
end
|
23
25
|
|
24
26
|
def check_role1_identity(obj)
|
25
27
|
[role1 == obj, role1.role1self == obj, role1.respond_to?(:role1method1), obj.respond_to?(:role1method1),
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: drsi
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Lorenzo Tello
|
@@ -43,6 +43,7 @@ files:
|
|
43
43
|
- examples/money_transfer.rb
|
44
44
|
- lib/drsi.rb
|
45
45
|
- lib/drsi/dci/context.rb
|
46
|
+
- lib/drsi/dci/multiplayer.rb
|
46
47
|
- lib/drsi/dci/role.rb
|
47
48
|
- lib/drsi/module.rb
|
48
49
|
- lib/drsi/object.rb
|
@@ -50,6 +51,7 @@ files:
|
|
50
51
|
- lib/drsi/version.rb
|
51
52
|
- spec/context_spec.rb
|
52
53
|
- spec/interaction_spec.rb
|
54
|
+
- spec/multiplayers_spec.rb
|
53
55
|
- spec/players_spec.rb
|
54
56
|
- spec/role_spec.rb
|
55
57
|
- spec/roleplayers_spec.rb
|
@@ -83,6 +85,7 @@ summary: Make DCI paradigm available to Ruby applications by enabling developers
|
|
83
85
|
test_files:
|
84
86
|
- spec/context_spec.rb
|
85
87
|
- spec/interaction_spec.rb
|
88
|
+
- spec/multiplayers_spec.rb
|
86
89
|
- spec/players_spec.rb
|
87
90
|
- spec/role_spec.rb
|
88
91
|
- spec/roleplayers_spec.rb
|