surrounded 0.8.4 → 0.9.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/.travis.yml +0 -2
- data/README.md +185 -99
- data/examples/bottles.rb +145 -0
- data/images/body-bg.png +0 -0
- data/images/highlight-bg.jpg +0 -0
- data/images/hr.png +0 -0
- data/images/octocat-icon.png +0 -0
- data/images/surrounded.png +0 -0
- data/images/tar-gz-icon.png +0 -0
- data/images/zip-icon.png +0 -0
- data/index.html +544 -0
- data/javascripts/main.js +1 -0
- data/javascripts/scale.fix.js +17 -0
- data/lib/surrounded/access_control.rb +14 -2
- data/lib/surrounded/context.rb +47 -123
- data/lib/surrounded/context/initializing.rb +0 -4
- data/lib/surrounded/context/role_builders.rb +9 -25
- data/lib/surrounded/context/role_map.rb +1 -1
- data/lib/surrounded/context/trigger_controls.rb +91 -0
- data/lib/surrounded/context_errors.rb +1 -1
- data/lib/surrounded/shortcuts.rb +1 -2
- data/lib/surrounded/version.rb +1 -1
- data/params.json +1 -0
- data/stylesheets/print.css +226 -0
- data/stylesheets/pygment_trac.css +69 -0
- data/stylesheets/styles.css +255 -0
- data/stylesheets/stylesheet.css +371 -0
- data/surrounded.gemspec +1 -1
- data/test/context_access_test.rb +16 -0
- data/test/example_proxy_test.rb +0 -5
- data/test/override_methods_test.rb +40 -0
- data/test/role_context_method_test.rb +71 -65
- data/test/surrounded_context_test.rb +2 -1
- data/test/test_helper.rb +0 -13
- metadata +23 -4
data/javascripts/main.js
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
console.log('This would be the main JS file.');
|
@@ -0,0 +1,17 @@
|
|
1
|
+
var metas = document.getElementsByTagName('meta');
|
2
|
+
var i;
|
3
|
+
if (navigator.userAgent.match(/iPhone/i)) {
|
4
|
+
for (i=0; i<metas.length; i++) {
|
5
|
+
if (metas[i].name == "viewport") {
|
6
|
+
metas[i].content = "width=device-width, minimum-scale=1.0, maximum-scale=1.0";
|
7
|
+
}
|
8
|
+
}
|
9
|
+
document.addEventListener("gesturestart", gestureStart, false);
|
10
|
+
}
|
11
|
+
function gestureStart() {
|
12
|
+
for (i=0; i<metas.length; i++) {
|
13
|
+
if (metas[i].name == "viewport") {
|
14
|
+
metas[i].content = "width=device-width, minimum-scale=0.25, maximum-scale=1.6";
|
15
|
+
}
|
16
|
+
}
|
17
|
+
}
|
@@ -33,10 +33,10 @@ module Surrounded
|
|
33
33
|
mod.class_eval {
|
34
34
|
define_method "disallow_#{name}?" do
|
35
35
|
begin
|
36
|
-
|
36
|
+
apply_behaviors
|
37
37
|
instance_exec(&block)
|
38
38
|
ensure
|
39
|
-
|
39
|
+
remove_behaviors
|
40
40
|
end
|
41
41
|
end
|
42
42
|
}
|
@@ -58,6 +58,18 @@ module Surrounded
|
|
58
58
|
!self.respond_to?(method_restrictor, true) || !self.send(method_restrictor)
|
59
59
|
}.to_set
|
60
60
|
end
|
61
|
+
|
62
|
+
# Ask if the context will allow access to a trigger given the current players.
|
63
|
+
def allow?(name)
|
64
|
+
unless self.respond_to?(name)
|
65
|
+
raise NoMethodError, %{undefined method `#{name}' for #{self.inspect}}
|
66
|
+
end
|
67
|
+
if self.respond_to?("disallow_#{name}?")
|
68
|
+
!self.public_send("disallow_#{name}?")
|
69
|
+
else
|
70
|
+
true
|
71
|
+
end
|
72
|
+
end
|
61
73
|
end
|
62
74
|
end
|
63
75
|
end
|
data/lib/surrounded/context.rb
CHANGED
@@ -2,6 +2,7 @@ require 'set'
|
|
2
2
|
require 'surrounded/context/role_map'
|
3
3
|
require 'surrounded/context/role_builders'
|
4
4
|
require 'surrounded/context/initializing'
|
5
|
+
require 'surrounded/context/trigger_controls'
|
5
6
|
require 'surrounded/access_control'
|
6
7
|
require 'surrounded/shortcuts'
|
7
8
|
require 'surrounded/east_oriented'
|
@@ -15,18 +16,18 @@ require 'surrounded/east_oriented'
|
|
15
16
|
module Surrounded
|
16
17
|
module Context
|
17
18
|
def self.extended(base)
|
18
|
-
base.extend RoleBuilders, Initializing
|
19
19
|
base.class_eval {
|
20
|
+
extend RoleBuilders, Initializing
|
21
|
+
|
20
22
|
@triggers = Set.new
|
21
23
|
include InstanceMethods
|
22
|
-
}
|
23
|
-
end
|
24
24
|
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
25
|
+
trigger_mod = Module.new
|
26
|
+
const_set('TriggerMethods', trigger_mod)
|
27
|
+
include trigger_mod
|
28
|
+
|
29
|
+
extend TriggerControls
|
30
|
+
}
|
30
31
|
end
|
31
32
|
|
32
33
|
private
|
@@ -39,15 +40,6 @@ module Surrounded
|
|
39
40
|
class << self
|
40
41
|
attr_writer :default_role_type
|
41
42
|
end
|
42
|
-
|
43
|
-
# Provide the ability to create access control methods for your triggers.
|
44
|
-
def protect_triggers; self.extend(::Surrounded::AccessControl); end
|
45
|
-
|
46
|
-
# Automatically create class methods for each trigger method.
|
47
|
-
def shortcut_triggers; self.extend(::Surrounded::Shortcuts); end
|
48
|
-
|
49
|
-
# Automatically return the context object from trigger methods.
|
50
|
-
def east_oriented_triggers; self.extend(::Surrounded::EastOriented); end
|
51
43
|
|
52
44
|
def default_role_type
|
53
45
|
@default_role_type ||= Surrounded::Context.default_role_type
|
@@ -57,87 +49,25 @@ module Surrounded
|
|
57
49
|
def default_role_type=(type)
|
58
50
|
@default_role_type = type
|
59
51
|
end
|
60
|
-
|
61
|
-
# Set the time to apply roles to objects. Either :trigger or :initialize.
|
62
|
-
# Defaults to :trigger
|
63
|
-
def apply_roles_on(which)
|
64
|
-
@__apply_role_policy = which
|
65
|
-
end
|
66
|
-
|
67
|
-
def __apply_role_policy
|
68
|
-
@__apply_role_policy ||= :trigger
|
69
|
-
end
|
70
|
-
|
71
|
-
# Creates a context instance method which will apply behaviors to role players
|
72
|
-
# before execution and remove the behaviors after execution.
|
73
|
-
#
|
74
|
-
# Alternatively you may define your own methods then declare them as triggers
|
75
|
-
# afterward.
|
76
|
-
#
|
77
|
-
# Example:
|
78
|
-
# trigger :some_event do
|
79
|
-
# # code here
|
80
|
-
# end
|
81
|
-
#
|
82
|
-
# def some_event
|
83
|
-
# # code here
|
84
|
-
# end
|
85
|
-
# trigger :some_event
|
86
|
-
#
|
87
|
-
def trigger(*names, &block)
|
88
|
-
if block.nil?
|
89
|
-
names.each do |name|
|
90
|
-
convert_method_to_trigger(name)
|
91
|
-
end
|
92
|
-
else
|
93
|
-
name = names.first
|
94
|
-
define_method(name, &block)
|
95
|
-
convert_method_to_trigger(name)
|
96
|
-
end
|
97
|
-
end
|
98
|
-
|
99
|
-
def store_trigger(*names)
|
100
|
-
@triggers.merge(names)
|
101
|
-
end
|
102
52
|
|
103
|
-
|
104
|
-
|
105
|
-
alias_method :"__trigger_#{name}", :"#{name}"
|
106
|
-
private :"__trigger_#{name}"
|
107
|
-
remove_method :"#{name}"
|
108
|
-
define_trigger_wrap_method(name)
|
109
|
-
store_trigger(name)
|
110
|
-
end
|
111
|
-
end
|
53
|
+
# Provide the ability to create access control methods for your triggers.
|
54
|
+
def protect_triggers; self.extend(::Surrounded::AccessControl); end
|
112
55
|
|
113
|
-
|
114
|
-
|
115
|
-
line = __LINE__
|
116
|
-
mod.class_eval %{
|
117
|
-
def #{name}(*args, &block)
|
118
|
-
begin
|
119
|
-
apply_roles if __apply_role_policy == :trigger
|
56
|
+
# Automatically create class methods for each trigger method.
|
57
|
+
def shortcut_triggers; self.extend(::Surrounded::Shortcuts); end
|
120
58
|
|
121
|
-
|
59
|
+
# Automatically return the context object from trigger methods.
|
60
|
+
def east_oriented_triggers; self.extend(::Surrounded::EastOriented); end
|
122
61
|
|
123
|
-
ensure
|
124
|
-
remove_roles if __apply_role_policy == :trigger
|
125
|
-
end
|
126
|
-
end
|
127
|
-
}, __FILE__, line
|
128
|
-
const_set("SurroundedTrigger#{name.to_s.upcase.sub(/\?\z/,'Query')}", mod)
|
129
|
-
include mod
|
130
|
-
end
|
131
|
-
|
132
|
-
def trigger_return_content(name, *args, &block)
|
133
|
-
%{self.send("__trigger_#{name}", *args, &block)}
|
134
|
-
end
|
135
|
-
|
136
62
|
# === Utility shortcuts
|
63
|
+
|
64
|
+
def role_const_defined?(name)
|
65
|
+
const_defined?(name, false)
|
66
|
+
end
|
137
67
|
|
138
68
|
# Set a named constant and make it private
|
139
69
|
def private_const_set(name, const)
|
140
|
-
unless
|
70
|
+
unless role_const_defined?(name)
|
141
71
|
const = const_set(name, const)
|
142
72
|
private_constant name.to_sym
|
143
73
|
end
|
@@ -157,10 +87,6 @@ module Surrounded
|
|
157
87
|
end
|
158
88
|
end
|
159
89
|
|
160
|
-
def role_const_defined?(name)
|
161
|
-
const_defined?(name, false)
|
162
|
-
end
|
163
|
-
|
164
90
|
module InstanceMethods
|
165
91
|
# Check whether a given name is a role inside the context.
|
166
92
|
# The provided block is used to evaluate whether or not the caller
|
@@ -183,14 +109,6 @@ module Surrounded
|
|
183
109
|
|
184
110
|
private
|
185
111
|
|
186
|
-
def preinitialize
|
187
|
-
@__apply_role_policy = self.class.send(:__apply_role_policy)
|
188
|
-
end
|
189
|
-
|
190
|
-
def postinitialize
|
191
|
-
apply_roles if __apply_role_policy == :initialize
|
192
|
-
end
|
193
|
-
|
194
112
|
def role_map
|
195
113
|
@role_map ||= RoleMap.new
|
196
114
|
end
|
@@ -221,59 +139,65 @@ module Surrounded
|
|
221
139
|
role_map.update(role, role_module_basename(mod_name), object)
|
222
140
|
end
|
223
141
|
|
224
|
-
def
|
225
|
-
@__apply_role_policy
|
226
|
-
end
|
227
|
-
|
228
|
-
def add_interface(role, behavior, object)
|
142
|
+
def apply_behavior(role, behavior, object)
|
229
143
|
if behavior && role_const_defined?(behavior)
|
230
|
-
applicator =
|
231
|
-
|
232
|
-
|
144
|
+
applicator = if self.respond_to?("apply_behavior_#{role}")
|
145
|
+
method("apply_behavior_#{role}")
|
146
|
+
elsif role_const(behavior).is_a?(Class)
|
147
|
+
method(:apply_class_behavior)
|
148
|
+
else
|
149
|
+
method(:apply_module_behavior)
|
150
|
+
end
|
151
|
+
|
152
|
+
role_player = applicator.call(role_const(behavior), object)
|
233
153
|
map_role(role, behavior, role_player)
|
234
154
|
end
|
235
155
|
role_player || object
|
236
156
|
end
|
237
157
|
|
238
|
-
def
|
158
|
+
def apply_module_behavior(mod, obj)
|
239
159
|
adder_name = module_extension_methods.find{|meth| obj.respond_to?(meth) }
|
240
|
-
return obj
|
160
|
+
return obj unless adder_name
|
241
161
|
|
242
162
|
obj.method(adder_name).call(mod)
|
243
163
|
obj
|
244
164
|
end
|
245
165
|
|
246
|
-
def
|
166
|
+
def apply_class_behavior(klass, obj)
|
247
167
|
wrapper_name = wrap_methods.find{|meth| klass.respond_to?(meth) }
|
248
168
|
return obj if !wrapper_name
|
249
169
|
klass.method(wrapper_name).call(obj)
|
250
170
|
end
|
251
|
-
|
252
|
-
def
|
171
|
+
|
172
|
+
def remove_behavior(role, behavior, object)
|
253
173
|
if behavior && role_const_defined?(behavior)
|
254
|
-
remover_name = (module_removal_methods + unwrap_methods).find
|
174
|
+
remover_name = (module_removal_methods + unwrap_methods).find do |meth|
|
175
|
+
object.respond_to?(meth)
|
176
|
+
end
|
255
177
|
end
|
256
178
|
|
257
|
-
if
|
258
|
-
|
259
|
-
|
179
|
+
role_player = if self.respond_to?("remove_behavior_#{role}")
|
180
|
+
self.send("remove_behavior_#{role}", role_const(behavior), object)
|
181
|
+
elsif remover_name
|
182
|
+
object.send(remover_name)
|
183
|
+
end
|
260
184
|
|
261
185
|
role_player || object
|
262
186
|
end
|
263
187
|
|
264
|
-
def
|
188
|
+
def apply_behaviors
|
265
189
|
role_map.each do |role, mod_name, object|
|
266
|
-
player =
|
190
|
+
player = apply_behavior(role, mod_name, object)
|
267
191
|
player.send(:store_context, self) do; end
|
268
192
|
end
|
269
193
|
end
|
270
194
|
|
271
|
-
def
|
195
|
+
def remove_behaviors
|
272
196
|
role_map.each do |role, mod_name, player|
|
273
197
|
if player.respond_to?(:remove_context, true)
|
274
198
|
player.send(:remove_context) do; end
|
275
199
|
end
|
276
|
-
|
200
|
+
remove_behavior(role, mod_name, player)
|
277
201
|
end
|
278
202
|
end
|
279
203
|
|
@@ -3,9 +3,7 @@ module Surrounded
|
|
3
3
|
module Initializing
|
4
4
|
def new(*args, &block)
|
5
5
|
instance = allocate
|
6
|
-
instance.send(:preinitialize)
|
7
6
|
instance.send(:initialize, *args, &block)
|
8
|
-
instance.send(:postinitialize)
|
9
7
|
instance
|
10
8
|
end
|
11
9
|
|
@@ -18,11 +16,9 @@ module Surrounded
|
|
18
16
|
line = __LINE__
|
19
17
|
mod.class_eval "
|
20
18
|
def initialize(#{setup_args.join(',')})
|
21
|
-
preinitialize
|
22
19
|
arguments = method(__method__).parameters.map{|arg| eval(arg[1].to_s) }
|
23
20
|
@role_map = RoleMap.new
|
24
21
|
map_roles(#{setup_args}.zip(arguments))
|
25
|
-
postinitialize
|
26
22
|
end
|
27
23
|
", __FILE__, line
|
28
24
|
const_set("ContextInitializer", mod)
|
@@ -1,17 +1,3 @@
|
|
1
|
-
# Some features are only available in versions of Ruby
|
2
|
-
# where this method is true
|
3
|
-
unless defined?(module_method_rebinding?)
|
4
|
-
def module_method_rebinding?
|
5
|
-
return @__module_method_rebinding__ if defined?(@__module_method_rebinding__)
|
6
|
-
sample_method = Enumerable.instance_method(:to_a)
|
7
|
-
@__module_method_rebinding__ = begin
|
8
|
-
!!sample_method.bind(Object.new)
|
9
|
-
rescue TypeError
|
10
|
-
false
|
11
|
-
end
|
12
|
-
end
|
13
|
-
end
|
14
|
-
|
15
1
|
module Surrounded
|
16
2
|
module Context
|
17
3
|
module RoleBuilders
|
@@ -43,19 +29,17 @@ module Surrounded
|
|
43
29
|
alias_method :wrapper, :wrap
|
44
30
|
|
45
31
|
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
interface_name = class_basename + 'Interface'
|
32
|
+
# Create an object which will bind methods to the role player
|
33
|
+
def interface(name, &block)
|
34
|
+
class_basename = name.to_s.gsub(/(?:^|_)([a-z])/){ $1.upcase }
|
35
|
+
interface_name = class_basename + 'Interface'
|
51
36
|
|
52
|
-
|
37
|
+
behavior = private_const_set(interface_name, Module.new(&block))
|
53
38
|
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
end
|
39
|
+
require 'surrounded/context/negotiator'
|
40
|
+
undef_method(name)
|
41
|
+
define_method(name) do
|
42
|
+
instance_variable_set("@#{name}", Negotiator.new(role_map.assigned_player(name), behavior))
|
59
43
|
end
|
60
44
|
end
|
61
45
|
|
@@ -0,0 +1,91 @@
|
|
1
|
+
module Surrounded
|
2
|
+
module Context
|
3
|
+
module TriggerControls
|
4
|
+
|
5
|
+
# Provides a Set of all available trigger methods where
|
6
|
+
# behaviors will be applied to the roles before execution
|
7
|
+
# and removed afterward.
|
8
|
+
def triggers
|
9
|
+
@triggers.dup
|
10
|
+
end
|
11
|
+
|
12
|
+
def store_trigger(*names)
|
13
|
+
@triggers.merge(names)
|
14
|
+
end
|
15
|
+
|
16
|
+
# Creates a context instance method which will apply behaviors to role players
|
17
|
+
# before execution and remove the behaviors after execution.
|
18
|
+
#
|
19
|
+
# Alternatively you may define your own methods then declare them as triggers
|
20
|
+
# afterward.
|
21
|
+
#
|
22
|
+
# Example:
|
23
|
+
# trigger :some_event do
|
24
|
+
# # code here
|
25
|
+
# end
|
26
|
+
#
|
27
|
+
# def some_event
|
28
|
+
# # code here
|
29
|
+
# end
|
30
|
+
# trigger :some_event
|
31
|
+
#
|
32
|
+
def trigger(*names, &block)
|
33
|
+
if block.nil?
|
34
|
+
names.each do |name|
|
35
|
+
convert_method_to_trigger(name)
|
36
|
+
end
|
37
|
+
else
|
38
|
+
name = names.first
|
39
|
+
define_trigger_action(*names, &block)
|
40
|
+
define_trigger(name, &block)
|
41
|
+
store_trigger(name)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def convert_method_to_trigger(name)
|
46
|
+
unless triggers.include?(name) || name.nil?
|
47
|
+
alias_method :"__trigger_#{name}", :"#{name}"
|
48
|
+
private :"__trigger_#{name}"
|
49
|
+
remove_method :"#{name}"
|
50
|
+
define_trigger(name)
|
51
|
+
store_trigger(name)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
def define_trigger(name)
|
56
|
+
line = __LINE__
|
57
|
+
self.class_eval %{
|
58
|
+
def #{name}(*args, &block)
|
59
|
+
begin
|
60
|
+
apply_behaviors
|
61
|
+
|
62
|
+
#{trigger_return_content(name)}
|
63
|
+
|
64
|
+
ensure
|
65
|
+
remove_behaviors
|
66
|
+
end
|
67
|
+
end
|
68
|
+
}, __FILE__, line
|
69
|
+
end
|
70
|
+
|
71
|
+
def trigger_return_content(name)
|
72
|
+
if method_defined?(name)
|
73
|
+
%{super}
|
74
|
+
else
|
75
|
+
%{self.send("__trigger_#{name}", *args, &block)}
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
|
80
|
+
def define_trigger_action(*name_and_args, &block)
|
81
|
+
trigger_action_module.module_eval do
|
82
|
+
define_method(*name_and_args, &block)
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
def trigger_action_module
|
87
|
+
self.const_get('TriggerMethods', false)
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|