surrounded 0.9.9 → 0.9.10
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.pullreview.yml +4 -0
- data/.travis.yml +5 -6
- data/Changelog.md +8 -0
- data/LICENSE.txt +1 -1
- data/README.md +90 -0
- data/lib/surrounded/access_control.rb +3 -0
- data/lib/surrounded/context.rb +15 -1
- data/lib/surrounded/context/initializing.rb +0 -2
- data/lib/surrounded/context/name_collision_detector.rb +70 -0
- data/lib/surrounded/context/role_builders.rb +11 -1
- data/lib/surrounded/context/role_map.rb +2 -0
- data/lib/surrounded/context_errors.rb +1 -12
- data/lib/surrounded/shortcuts.rb +1 -0
- data/lib/surrounded/version.rb +1 -1
- data/surrounded.gemspec +1 -1
- data/test/example_proxy_test.rb +17 -0
- data/test/name_collisions_test.rb +162 -0
- data/test/role_context_method_test.rb +6 -4
- metadata +10 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2236ff5ee05ddc4b3c857e3700ca2205fa966e62
|
4
|
+
data.tar.gz: 7e47950aaac3dd0dc4b74f18409ef5590226b5ef
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1b6e97b48a2c4cda950b2507bff57bcb36bad18171774474405d01030f546e43b2df6adb4e8809477517953ee330df5ffde71c8d0e19af1f469103db5eece897
|
7
|
+
data.tar.gz: 606cb9ba7d77942a770956eb73581bd4f0fe08caf31bd8305ad404dcea7dd2dbe558521fc908160ba91c2b70bf36c644fc4aef65d940efb6353cf502be24ae3b
|
data/.pullreview.yml
ADDED
data/.travis.yml
CHANGED
@@ -1,17 +1,16 @@
|
|
1
|
+
before_install:
|
2
|
+
- gem install bundler
|
1
3
|
language: ruby
|
2
4
|
cache: bundler
|
3
5
|
rvm:
|
4
|
-
- 2.
|
5
|
-
- 2.
|
6
|
-
- 2.
|
6
|
+
- 2.3.1
|
7
|
+
- 2.2.5
|
8
|
+
- 2.1.10
|
7
9
|
- ruby-head
|
8
10
|
- jruby-head
|
9
|
-
- rbx
|
10
11
|
env:
|
11
12
|
- COVERALLS=true
|
12
13
|
matrix:
|
13
14
|
allow_failures:
|
14
|
-
- rvm: 2.0.0
|
15
15
|
- rvm: ruby-head
|
16
16
|
- rvm: jruby-head
|
17
|
-
- rvm: rbx
|
data/Changelog.md
ADDED
@@ -0,0 +1,8 @@
|
|
1
|
+
# Change Log
|
2
|
+
|
3
|
+
All notable changes to this project will be documented in this file.
|
4
|
+
|
5
|
+
## [0.9.10]
|
6
|
+
|
7
|
+
- Do something with name collisions when a role player has an existing method of another role in the context.
|
8
|
+
- Move InvalidRoleType exception under the host context class namespace. This allows you to rescue from your own namespace.
|
data/LICENSE.txt
CHANGED
data/README.md
CHANGED
@@ -722,6 +722,15 @@ class ActiviatingAccount
|
|
722
722
|
# ...
|
723
723
|
end
|
724
724
|
|
725
|
+
# Handle method name collisions on role players against role names in the context
|
726
|
+
on_name_collision :raise # will raise your context namespaced error: ActiviatingAccount::NameCollisionError
|
727
|
+
on_name_collision :warn
|
728
|
+
on_name_collision ->(message){ puts "Here's the message! #{message}" }
|
729
|
+
on_name_collision :my_custom_handler
|
730
|
+
def my_custom_handler(message)
|
731
|
+
# do something with the message here
|
732
|
+
end
|
733
|
+
|
725
734
|
role :activator do # module by default
|
726
735
|
def some_behavior; end
|
727
736
|
end
|
@@ -910,6 +919,87 @@ end
|
|
910
919
|
|
911
920
|
You can remember the method name by the convention that `remove` or `apply` describes it's function, `behavior` refers to the first argument (thet contsant holding the behaviors), and then the name of the role which refers to the role playing object: `remove_behavior_role`.
|
912
921
|
|
922
|
+
##Name collisions between methods and roles
|
923
|
+
|
924
|
+
Lets say that you wish to create a context as below, intending to use instances of the following two classes as role players:
|
925
|
+
|
926
|
+
```ruby
|
927
|
+
class Postcode
|
928
|
+
# other methods...
|
929
|
+
def code
|
930
|
+
@code
|
931
|
+
end
|
932
|
+
|
933
|
+
def country
|
934
|
+
@country
|
935
|
+
end
|
936
|
+
end
|
937
|
+
|
938
|
+
class Country
|
939
|
+
# other methods...
|
940
|
+
def country_code
|
941
|
+
@code
|
942
|
+
end
|
943
|
+
end
|
944
|
+
|
945
|
+
class SendAParcel
|
946
|
+
extend Surrounded::Context
|
947
|
+
|
948
|
+
keyword_initialize :postcode, :country
|
949
|
+
|
950
|
+
trigger :send do
|
951
|
+
postcode.send
|
952
|
+
end
|
953
|
+
|
954
|
+
end
|
955
|
+
role :postcode do
|
956
|
+
def send
|
957
|
+
# do things...
|
958
|
+
country_code = country.country_code # name collision...probably raises an exception!
|
959
|
+
end
|
960
|
+
end
|
961
|
+
end
|
962
|
+
```
|
963
|
+
When you call the `:send` trigger you are likely to be greeted with an `NoMethodError` exception. The reason for this is that there is a name collision between `Postcode#country`, and the `:country` role in the `SendAParcel` context. Where a name collision exists, the method in the role player overrides that of the calling class and you get unexpected results.
|
964
|
+
|
965
|
+
To address this issue, use `on_name_collision` to specify the name of a method to use when collisions are found:
|
966
|
+
|
967
|
+
```ruby
|
968
|
+
|
969
|
+
class SendAParcel
|
970
|
+
extend Surrounded::Context
|
971
|
+
|
972
|
+
on_name_collision :raise
|
973
|
+
end
|
974
|
+
|
975
|
+
```
|
976
|
+
|
977
|
+
This option will raise an exception (obviously). You may use any method which is available to the context but it must accept a single message as the argument.
|
978
|
+
|
979
|
+
You can also use a lambda:
|
980
|
+
|
981
|
+
```ruby
|
982
|
+
|
983
|
+
class SendAParcel
|
984
|
+
extend Surrounded::Context
|
985
|
+
|
986
|
+
on_name_collision ->(message){ puts "Here's the message: #{message}"}
|
987
|
+
end
|
988
|
+
|
989
|
+
```
|
990
|
+
|
991
|
+
You may also user a class method:
|
992
|
+
|
993
|
+
```ruby
|
994
|
+
class SendAParcel
|
995
|
+
extend Surrounded::Context
|
996
|
+
|
997
|
+
def self.handle_collisions(message)
|
998
|
+
Logger.debug "#{Time.now}: #{message}"
|
999
|
+
end
|
1000
|
+
end
|
1001
|
+
```
|
1002
|
+
|
913
1003
|
## How to read this code
|
914
1004
|
|
915
1005
|
If you use this library, it's important to understand it.
|
data/lib/surrounded/context.rb
CHANGED
@@ -7,6 +7,7 @@ require 'surrounded/context/trigger_controls'
|
|
7
7
|
require 'surrounded/access_control'
|
8
8
|
require 'surrounded/shortcuts'
|
9
9
|
require 'surrounded/east_oriented'
|
10
|
+
require 'surrounded/context/name_collision_detector'
|
10
11
|
|
11
12
|
# Extend your classes with Surrounded::Context to handle their
|
12
13
|
# initialization and application of behaviors to the role players
|
@@ -18,7 +19,7 @@ module Surrounded
|
|
18
19
|
module Context
|
19
20
|
def self.extended(base)
|
20
21
|
base.class_eval {
|
21
|
-
extend RoleBuilders, Initializing, Forwarding
|
22
|
+
extend RoleBuilders, Initializing, Forwarding, NameCollisionDetector
|
22
23
|
|
23
24
|
@triggers = Set.new
|
24
25
|
include InstanceMethods
|
@@ -28,11 +29,23 @@ module Surrounded
|
|
28
29
|
include trigger_mod
|
29
30
|
|
30
31
|
extend TriggerControls
|
32
|
+
|
31
33
|
}
|
34
|
+
define_exceptions(base)
|
32
35
|
end
|
33
36
|
|
34
37
|
private
|
35
38
|
|
39
|
+
def self.define_exceptions(klass)
|
40
|
+
self.constants.select{|const|
|
41
|
+
self.const_get(const) < ::StandardError
|
42
|
+
}.map{|exception|
|
43
|
+
unless klass.const_defined?(exception)
|
44
|
+
klass.const_set(exception, Class.new(self.const_get(exception)))
|
45
|
+
end
|
46
|
+
}
|
47
|
+
end
|
48
|
+
|
36
49
|
# Set the default type of implementation for role methods for all contexts.
|
37
50
|
def self.default_role_type
|
38
51
|
@default_role_type ||= :module
|
@@ -135,6 +148,7 @@ module Surrounded
|
|
135
148
|
end
|
136
149
|
|
137
150
|
def map_roles(role_object_array)
|
151
|
+
detect_collisions role_object_array
|
138
152
|
role_object_array.to_a.each do |role, object|
|
139
153
|
if self.respond_to?("map_role_#{role}")
|
140
154
|
self.send("map_role_#{role}", object)
|
@@ -29,8 +29,6 @@ module Surrounded
|
|
29
29
|
|
30
30
|
def default_initializer(params, setup_args, &block)
|
31
31
|
private_attr_reader(*setup_args)
|
32
|
-
|
33
|
-
parameters = setup_args.map{|a| "#{a}:"}.join(',')
|
34
32
|
@initializer_block = block || nil
|
35
33
|
mod = Module.new
|
36
34
|
line = __LINE__; mod.class_eval %{
|
@@ -0,0 +1,70 @@
|
|
1
|
+
module Surrounded
|
2
|
+
module Context
|
3
|
+
class NameCollisionError <::StandardError; end
|
4
|
+
module NameCollisionDetector
|
5
|
+
|
6
|
+
attr_reader :handler
|
7
|
+
|
8
|
+
def self.extended(base)
|
9
|
+
base.send :include, NameCollisionHandler
|
10
|
+
unless defined?(base::NameCollisionError)
|
11
|
+
base.const_set(:NameCollinionError, Class.new(::Surrounded::Context::NameCollisionError))
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def on_name_collision(method_name)
|
16
|
+
@handler = method_name
|
17
|
+
end
|
18
|
+
|
19
|
+
module NameCollisionHandler
|
20
|
+
|
21
|
+
private
|
22
|
+
|
23
|
+
def detect_collisions(role_object_map)
|
24
|
+
if handler
|
25
|
+
handle_collisions(collision_warnings(role_object_map))
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def collision_warnings(role_object_map)
|
30
|
+
role_object_map.select{|role, object|
|
31
|
+
![object.methods & role_object_map.keys].flatten.empty?
|
32
|
+
}.map{|role, object|
|
33
|
+
role_collision_message(role,(object.methods & role_object_map.keys).sort)
|
34
|
+
}.join("\n")
|
35
|
+
end
|
36
|
+
|
37
|
+
def handle_collisions(collisions)
|
38
|
+
handler_args = [collisions]
|
39
|
+
if handler == :raise
|
40
|
+
handler_args.unshift self.class::NameCollisionError
|
41
|
+
end
|
42
|
+
|
43
|
+
handler_method.call(*handler_args)
|
44
|
+
end
|
45
|
+
|
46
|
+
def role_collision_message(role, colliding_method_names)
|
47
|
+
"#{role} has name collisions with #{colliding_method_names}"
|
48
|
+
end
|
49
|
+
|
50
|
+
def nothing(*); end
|
51
|
+
|
52
|
+
def handler
|
53
|
+
self.class.handler
|
54
|
+
end
|
55
|
+
|
56
|
+
def handler_method
|
57
|
+
if handler.respond_to?(:call)
|
58
|
+
handler
|
59
|
+
elsif respond_to?(handler, true)
|
60
|
+
method(handler)
|
61
|
+
elsif self.class.respond_to?(handler, true)
|
62
|
+
self.class.method(handler)
|
63
|
+
else
|
64
|
+
method(:nothing)
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
@@ -1,5 +1,15 @@
|
|
1
1
|
module Surrounded
|
2
2
|
module Context
|
3
|
+
class InvalidRoleType < ::StandardError
|
4
|
+
unless method_defined?(:cause)
|
5
|
+
def initialize(msg=nil)
|
6
|
+
super
|
7
|
+
@cause = $!
|
8
|
+
end
|
9
|
+
attr_reader :cause
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
3
13
|
module RoleBuilders
|
4
14
|
|
5
15
|
# Define behaviors for your role players
|
@@ -13,7 +23,7 @@ module Surrounded
|
|
13
23
|
meth.call(name, &block)
|
14
24
|
end
|
15
25
|
rescue NameError => e
|
16
|
-
raise InvalidRoleType, e.message
|
26
|
+
raise self::InvalidRoleType, e.message
|
17
27
|
end
|
18
28
|
alias_method :role_methods, :role
|
19
29
|
|
@@ -1,16 +1,5 @@
|
|
1
1
|
require 'triad'
|
2
2
|
module Surrounded
|
3
3
|
module Context
|
4
|
-
class InvalidRole < ::Triad::ItemNotPresent; end
|
5
|
-
class InvalidRoleType < ::StandardError
|
6
|
-
unless method_defined?(:cause)
|
7
|
-
def initialize(msg=nil)
|
8
|
-
super
|
9
|
-
@cause = $!
|
10
|
-
end
|
11
|
-
attr_reader :cause
|
12
|
-
end
|
13
|
-
end
|
14
|
-
class AccessError < ::StandardError; end
|
15
4
|
end
|
16
|
-
end
|
5
|
+
end
|
data/lib/surrounded/shortcuts.rb
CHANGED
data/lib/surrounded/version.rb
CHANGED
data/surrounded.gemspec
CHANGED
data/test/example_proxy_test.rb
CHANGED
@@ -13,6 +13,10 @@ class ProxyContext
|
|
13
13
|
def talking_to_others
|
14
14
|
task.name
|
15
15
|
end
|
16
|
+
|
17
|
+
def combined_methods
|
18
|
+
some_admin_method
|
19
|
+
end
|
16
20
|
end
|
17
21
|
|
18
22
|
wrap :task do
|
@@ -41,6 +45,10 @@ class ProxyContext
|
|
41
45
|
trigger :get_admin_method do
|
42
46
|
admin.method(:talking_to_others)
|
43
47
|
end
|
48
|
+
|
49
|
+
trigger :combined_interface_methods do
|
50
|
+
admin.combined_methods
|
51
|
+
end
|
44
52
|
end
|
45
53
|
|
46
54
|
ProxyUser = Class.new do
|
@@ -83,6 +91,15 @@ describe ProxyContext do
|
|
83
91
|
assert context.admin_responds?
|
84
92
|
end
|
85
93
|
|
94
|
+
# A Negotiator object merely applies methods to another object
|
95
|
+
# so that once the method is called, the object has no knowledge
|
96
|
+
# of the module from which the method was applied.
|
97
|
+
it 'does not find other interface methods' do
|
98
|
+
assert_raises(NameError){
|
99
|
+
context.combined_interface_methods
|
100
|
+
}
|
101
|
+
end
|
102
|
+
|
86
103
|
it 'is able to grab methods from the object' do
|
87
104
|
assert_equal :talking_to_others, context.get_admin_method.name
|
88
105
|
end
|
@@ -0,0 +1,162 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
##
|
3
|
+
# The problem is as follows: When an object already contains a method
|
4
|
+
# that has the same name as an actor in the context, then the object
|
5
|
+
# defaults to its own method rather than calling the actor.
|
6
|
+
# This is simulated in the two classes below, where HasNameCollision has
|
7
|
+
# an empty attribute called will_collide (which is always nil). In the following
|
8
|
+
# context, when the method collide is called on the actor will_collide, the
|
9
|
+
# actor is ignored and the HasNameCollision#will_collide is called instead,
|
10
|
+
# returning nil.
|
11
|
+
##
|
12
|
+
|
13
|
+
class HasNameCollision
|
14
|
+
include Surrounded
|
15
|
+
|
16
|
+
attr_accessor :will_collide # should always return nil
|
17
|
+
|
18
|
+
def assert_has_role
|
19
|
+
true
|
20
|
+
end
|
21
|
+
|
22
|
+
def will_collide=(_); end
|
23
|
+
end
|
24
|
+
|
25
|
+
class ShouldCollide
|
26
|
+
include Surrounded
|
27
|
+
def collide
|
28
|
+
return 'Method called in ShouldCollide'
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
class ContextOverridesName
|
33
|
+
extend Surrounded::Context
|
34
|
+
|
35
|
+
# The specific behaviour we want to test is that when a role has a method that
|
36
|
+
# has the same name as another role, then when that method is called strange
|
37
|
+
# things happen.
|
38
|
+
keyword_initialize :base, :will_collide
|
39
|
+
on_name_collision :nothing
|
40
|
+
|
41
|
+
trigger :check_setup do
|
42
|
+
base.assert_has_role
|
43
|
+
end
|
44
|
+
|
45
|
+
trigger :induce_collision do
|
46
|
+
base.name_collision
|
47
|
+
end
|
48
|
+
|
49
|
+
role :base do
|
50
|
+
def name_collision
|
51
|
+
will_collide.collide
|
52
|
+
end
|
53
|
+
|
54
|
+
def assert_has_role
|
55
|
+
true
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
class ContextWithMultipleCollisions
|
61
|
+
extend Surrounded::Context
|
62
|
+
|
63
|
+
on_name_collision :warn
|
64
|
+
|
65
|
+
keyword_initialize :first, :second, :third
|
66
|
+
end
|
67
|
+
|
68
|
+
class First
|
69
|
+
|
70
|
+
def second;end
|
71
|
+
def third;end
|
72
|
+
end
|
73
|
+
|
74
|
+
class Second
|
75
|
+
def first;end
|
76
|
+
|
77
|
+
def third;end
|
78
|
+
end
|
79
|
+
|
80
|
+
class Third
|
81
|
+
def first;end
|
82
|
+
def second;end
|
83
|
+
|
84
|
+
end
|
85
|
+
|
86
|
+
describe 'handling name collisions' do
|
87
|
+
|
88
|
+
let(:new_context_with_collision){
|
89
|
+
ContextOverridesName.new(base: HasNameCollision.new, will_collide: ShouldCollide.new)
|
90
|
+
}
|
91
|
+
|
92
|
+
after do
|
93
|
+
ContextOverridesName.instance_eval{
|
94
|
+
remove_instance_variable :@handler if defined?(@handler)
|
95
|
+
}
|
96
|
+
end
|
97
|
+
|
98
|
+
def set_handler(handler)
|
99
|
+
ContextOverridesName.instance_eval{
|
100
|
+
on_name_collision handler
|
101
|
+
}
|
102
|
+
end
|
103
|
+
|
104
|
+
it 'is works properly without handling collisions' do
|
105
|
+
assert new_context_with_collision.check_setup
|
106
|
+
end
|
107
|
+
|
108
|
+
it 'allows a name collision' do
|
109
|
+
err = assert_raises(NoMethodError){
|
110
|
+
new_context_with_collision.induce_collision
|
111
|
+
}
|
112
|
+
assert_match(/undefined method \`collide' for nil:NilClass/, err.message)
|
113
|
+
end
|
114
|
+
|
115
|
+
it 'can raise an exception' do
|
116
|
+
set_handler :raise
|
117
|
+
assert_raises(ContextOverridesName::NameCollisionError){
|
118
|
+
new_context_with_collision
|
119
|
+
}
|
120
|
+
end
|
121
|
+
|
122
|
+
it 'can print a warning' do
|
123
|
+
set_handler :warn
|
124
|
+
assert_output(nil, "base has name collisions with [:will_collide]\n") {
|
125
|
+
new_context_with_collision
|
126
|
+
}
|
127
|
+
end
|
128
|
+
|
129
|
+
let(:create_context_with_multiple_collisions){
|
130
|
+
ContextWithMultipleCollisions.new(first: First.new, second: Second.new, third: Third.new)
|
131
|
+
}
|
132
|
+
|
133
|
+
it 'can handle multiple collisions' do
|
134
|
+
expected_message = <<ERR
|
135
|
+
first has name collisions with [:second, :third]
|
136
|
+
second has name collisions with [:first, :third]
|
137
|
+
third has name collisions with [:first, :second]
|
138
|
+
ERR
|
139
|
+
assert_output(nil, expected_message){
|
140
|
+
create_context_with_multiple_collisions
|
141
|
+
}
|
142
|
+
end
|
143
|
+
|
144
|
+
it 'can use a class method' do
|
145
|
+
class ContextOverridesName
|
146
|
+
def class_method_handler(message)
|
147
|
+
puts message
|
148
|
+
end
|
149
|
+
end
|
150
|
+
set_handler :class_method_handler
|
151
|
+
assert_output("base has name collisions with [:will_collide]\n"){
|
152
|
+
new_context_with_collision
|
153
|
+
}
|
154
|
+
end
|
155
|
+
|
156
|
+
it 'can use a proc' do
|
157
|
+
set_handler ->(message){ puts "message from a proc: #{message}"}
|
158
|
+
assert_output("message from a proc: base has name collisions with [:will_collide]\n"){
|
159
|
+
new_context_with_collision
|
160
|
+
}
|
161
|
+
end
|
162
|
+
end
|
@@ -89,14 +89,16 @@ describe Surrounded::Context, '.role' do
|
|
89
89
|
|
90
90
|
describe 'unknown' do
|
91
91
|
it 'raises an error' do
|
92
|
+
class UnknownRole
|
93
|
+
extend Surrounded::Context
|
94
|
+
end
|
95
|
+
|
92
96
|
err = _{
|
93
|
-
|
94
|
-
extend Surrounded::Context
|
95
|
-
|
97
|
+
UnknownRole.instance_eval do
|
96
98
|
role :admin, :unknown do
|
97
99
|
end
|
98
100
|
end
|
99
|
-
}.must_raise
|
101
|
+
}.must_raise UnknownRole::InvalidRoleType
|
100
102
|
_(err.cause).must_be_kind_of NameError
|
101
103
|
end
|
102
104
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: surrounded
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.9.
|
4
|
+
version: 0.9.10
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- "'Jim Gay'"
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2016-05-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: triad
|
@@ -30,14 +30,14 @@ dependencies:
|
|
30
30
|
requirements:
|
31
31
|
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: '1.
|
33
|
+
version: '1.12'
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: '1.
|
40
|
+
version: '1.12'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: rake
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -61,8 +61,10 @@ extra_rdoc_files: []
|
|
61
61
|
files:
|
62
62
|
- ".codeclimate.yml"
|
63
63
|
- ".gitignore"
|
64
|
+
- ".pullreview.yml"
|
64
65
|
- ".simplecov"
|
65
66
|
- ".travis.yml"
|
67
|
+
- Changelog.md
|
66
68
|
- Gemfile
|
67
69
|
- LICENSE.txt
|
68
70
|
- README.md
|
@@ -74,6 +76,7 @@ files:
|
|
74
76
|
- lib/surrounded/context.rb
|
75
77
|
- lib/surrounded/context/forwarding.rb
|
76
78
|
- lib/surrounded/context/initializing.rb
|
79
|
+
- lib/surrounded/context/name_collision_detector.rb
|
77
80
|
- lib/surrounded/context/negotiator.rb
|
78
81
|
- lib/surrounded/context/role_builders.rb
|
79
82
|
- lib/surrounded/context/role_map.rb
|
@@ -95,6 +98,7 @@ files:
|
|
95
98
|
- test/example_threaded_test.rb
|
96
99
|
- test/example_wrapper_test.rb
|
97
100
|
- test/initialization_test.rb
|
101
|
+
- test/name_collisions_test.rb
|
98
102
|
- test/non_surrounded_role_player_test.rb
|
99
103
|
- test/override_methods_test.rb
|
100
104
|
- test/role_context_method_test.rb
|
@@ -121,7 +125,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
121
125
|
version: '0'
|
122
126
|
requirements: []
|
123
127
|
rubyforge_project:
|
124
|
-
rubygems_version: 2.
|
128
|
+
rubygems_version: 2.5.1
|
125
129
|
signing_key:
|
126
130
|
specification_version: 4
|
127
131
|
summary: Create encapsulated environments for your objects.
|
@@ -138,6 +142,7 @@ test_files:
|
|
138
142
|
- test/example_threaded_test.rb
|
139
143
|
- test/example_wrapper_test.rb
|
140
144
|
- test/initialization_test.rb
|
145
|
+
- test/name_collisions_test.rb
|
141
146
|
- test/non_surrounded_role_player_test.rb
|
142
147
|
- test/override_methods_test.rb
|
143
148
|
- test/role_context_method_test.rb
|