surrounded 0.9.9 → 0.9.10
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/.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
|