condi 0.0.7 → 0.0.8
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/condi.rb +13 -5
- data/test/test_condi.rb +28 -2
- metadata +2 -2
data/lib/condi.rb
CHANGED
@@ -30,24 +30,32 @@ module Condi
|
|
30
30
|
# @param [Proc] block {} or do...end block.
|
31
31
|
# @note A *synonym* is an alias for defining methods that return values other than true or false.
|
32
32
|
# @note You are not required to end a predicate with a question mark, however it is conventional in Ruby to do so.
|
33
|
-
# @note Predicates can only be called during the request
|
33
|
+
# @note Predicates can only be called during the request scope they are defined in, otherwise a RuntimeError is raised. This restriction prevents the associated closures from inadvertently leaking previous request data when the controller classes are cached (i.e. in production).
|
34
|
+
# @note Predicates are semantically lambdas and may contain returns.
|
34
35
|
# @see the full example in the <a href="index.html">README</a>.
|
35
36
|
def predicate(method_name, &block)
|
36
37
|
self.class.instance_eval do
|
37
38
|
# this is the request id at the moment the predicate is defined
|
38
39
|
request_id = eval("request.object_id",block.binding)
|
39
40
|
|
41
|
+
# We need to keep the block impl as a method/lambda so that it supports returns
|
42
|
+
# by using this particular invocation of define_method...
|
43
|
+
method_name_impl = "impl_#{method_name}".to_sym
|
44
|
+
define_method(method_name_impl, &block)
|
45
|
+
|
46
|
+
# Next, this invocation of define_method creates a Proc, which
|
47
|
+
# wraps the impl and allows us to check the request id.
|
40
48
|
define_method(method_name) do |*args|
|
41
49
|
# this is the request id at the moment the predicate is called
|
42
50
|
check_request_id = request.object_id
|
43
|
-
|
44
51
|
# if they don't match, raise an error!
|
45
52
|
unless check_request_id == request_id
|
46
|
-
#
|
47
|
-
raise RuntimeError, "predicate '#{method_name}' cannot be called outside of the request it was defined in (#{request_id}). please redefine the predicate in this request (#{check_request_id}).", caller(2)
|
53
|
+
raise RuntimeError, "predicate '#{method_name}' cannot be called outside of the request scope it was defined in (#{request_id}). please redefine the predicate in this request scope (#{check_request_id}).", caller(2)
|
48
54
|
end
|
49
|
-
|
55
|
+
send(method_name_impl, *args)
|
50
56
|
end
|
57
|
+
|
58
|
+
# finally, expose the wrapped predicate to the view.
|
51
59
|
helper_method(method_name)
|
52
60
|
end
|
53
61
|
end
|
data/test/test_condi.rb
CHANGED
@@ -142,7 +142,7 @@ class CondiTest < Test::Unit::TestCase
|
|
142
142
|
end
|
143
143
|
|
144
144
|
|
145
|
-
#
|
145
|
+
# test for https://github.com/coldnebo/condi/issues/1
|
146
146
|
def test_lifespan
|
147
147
|
@controller_instance.request = Object.new # simulate the first request
|
148
148
|
@controller_instance.instance_eval do
|
@@ -160,4 +160,30 @@ class CondiTest < Test::Unit::TestCase
|
|
160
160
|
end
|
161
161
|
end
|
162
162
|
|
163
|
-
|
163
|
+
|
164
|
+
# test for https://github.com/coldnebo/condi/issues/2
|
165
|
+
def test_returns
|
166
|
+
@controller_instance.instance_eval do
|
167
|
+
def my_action
|
168
|
+
first_path = true
|
169
|
+
predicate(:can_return?) do
|
170
|
+
if first_path
|
171
|
+
return true
|
172
|
+
else
|
173
|
+
return false
|
174
|
+
end
|
175
|
+
end
|
176
|
+
end
|
177
|
+
end
|
178
|
+
@controller_instance.my_action
|
179
|
+
|
180
|
+
# don't raise a LocalJumpError: unexpected return!
|
181
|
+
assert_nothing_raised do
|
182
|
+
@controller_instance.can_return?
|
183
|
+
end
|
184
|
+
|
185
|
+
# also ensure the correct value was returned.
|
186
|
+
assert @controller_instance.can_return? == true
|
187
|
+
end
|
188
|
+
|
189
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: condi
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.8
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -36,7 +36,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
36
36
|
version: '0'
|
37
37
|
segments:
|
38
38
|
- 0
|
39
|
-
hash:
|
39
|
+
hash: 737326911507565152
|
40
40
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
41
41
|
none: false
|
42
42
|
requirements:
|