scopify 0.1.1 → 0.1.2
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +19 -16
- data/VERSION +1 -1
- data/lib/scopify.rb +3 -3
- data/lib/scopify/scope.rb +5 -6
- data/scopify.gemspec +1 -1
- data/spec/scopify_spec.rb +17 -5
- metadata +2 -2
data/README.md
CHANGED
@@ -23,6 +23,25 @@ Create named scopes, with options, lambdas or other scopes
|
|
23
23
|
MyDBWrapper.good.first
|
24
24
|
MyDBWrapper.good.goodness(3).first
|
25
25
|
|
26
|
+
### Custom scope helpers
|
27
|
+
class MyDBWrapper
|
28
|
+
def self.foo(num)
|
29
|
+
scoped(:foo => num)
|
30
|
+
end
|
31
|
+
|
32
|
+
def self.bar(num)
|
33
|
+
scoped(:bar => num)
|
34
|
+
end
|
35
|
+
|
36
|
+
# tell scopes to pass raw arguments to foo and bar (not merged options hash)
|
37
|
+
def self.raw_args_from_scope?(method_name)
|
38
|
+
return true if super
|
39
|
+
[:foo, :bar].include?(method_name)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
MyDBWrapper.foo(1).bar(3) == MyDBWrapper.scoped(:foo => 1, :bar => 3)
|
44
|
+
|
26
45
|
### scope_to_hash
|
27
46
|
Roll your own condition composing.
|
28
47
|
# not good ?
|
@@ -45,22 +64,6 @@ Roll your own condition composing.
|
|
45
64
|
# better now !
|
46
65
|
MyDBWrapper.scoped(:order => 'a').scoped(:order => 'b).all --> {:order => "a AND b"}
|
47
66
|
|
48
|
-
### Advanced: return_scope?(method_name)
|
49
|
-
Get raw arguments instead of a merged options hash.
|
50
|
-
class MyDBWrapper
|
51
|
-
def self.return_scope?(method_name)
|
52
|
-
return true if super
|
53
|
-
method_name == :i_return_scope
|
54
|
-
end
|
55
|
-
|
56
|
-
def self.i_return_scope(pure_args)
|
57
|
-
scoped(pure_args.merge(:offset => 1))
|
58
|
-
end
|
59
|
-
end
|
60
|
-
|
61
|
-
MyDBWrapper.scoped(:limit=>1).i_return_scope(:order => 'x')
|
62
|
-
--> receives {:order => 'x'}, not a merged options hash.
|
63
|
-
|
64
67
|
Author
|
65
68
|
======
|
66
69
|
[Michael Grosser](http://pragmatig.wordpress.com)
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.1.
|
1
|
+
0.1.2
|
data/lib/scopify.rb
CHANGED
@@ -12,8 +12,8 @@ module Scopify
|
|
12
12
|
Scope.build(self, options)
|
13
13
|
end
|
14
14
|
|
15
|
-
# overwrite tis to
|
16
|
-
def
|
15
|
+
# overwrite tis to build your custom scopes
|
16
|
+
def raw_args_from_scope?(method_name)
|
17
17
|
respond_to?("#{method_name}_scope_options")
|
18
18
|
end
|
19
19
|
|
@@ -32,7 +32,7 @@ module Scopify
|
|
32
32
|
elsif options.is_a?(Scope)
|
33
33
|
options
|
34
34
|
else
|
35
|
-
scoped(options)
|
35
|
+
scoped(options)
|
36
36
|
end
|
37
37
|
end
|
38
38
|
CODE
|
data/lib/scopify/scope.rb
CHANGED
@@ -20,9 +20,8 @@ module Scopify
|
|
20
20
|
if options.is_a?(Scope)
|
21
21
|
# merge in raw options e.g. :limit => [1, 2]
|
22
22
|
options.scope_options.each do |k,v|
|
23
|
-
|
24
|
-
merged[k]
|
25
|
-
old.each{|x| merged[k] << x }
|
23
|
+
merged[k] ||= []
|
24
|
+
v.each{|x| merged[k] << x }
|
26
25
|
end
|
27
26
|
else
|
28
27
|
# merge in a normal hash e.g. :limit => 1
|
@@ -59,10 +58,10 @@ module Scopify
|
|
59
58
|
end
|
60
59
|
|
61
60
|
def method_missing(method_name, *args, &block)
|
62
|
-
if @base.respond_to?(:
|
61
|
+
if @base.respond_to?(:raw_args_from_scope?) and @base.raw_args_from_scope?(method_name)
|
63
62
|
# the method we call is a scope, continue chaining
|
64
|
-
|
65
|
-
|
63
|
+
result = @base.send(method_name, *args, &block)
|
64
|
+
result.is_a?(Scope) ? scoped(result) : result
|
66
65
|
else
|
67
66
|
# the method we call is a normal method, flatten everything
|
68
67
|
options = (args.first||{})
|
data/scopify.gemspec
CHANGED
data/spec/scopify_spec.rb
CHANGED
@@ -32,12 +32,12 @@ class T3
|
|
32
32
|
options
|
33
33
|
end
|
34
34
|
|
35
|
-
def self.
|
35
|
+
def self.raw_args_from_scope?(name)
|
36
36
|
return true if super
|
37
|
-
name == :
|
37
|
+
name == :i_scope
|
38
38
|
end
|
39
39
|
|
40
|
-
def self.
|
40
|
+
def self.i_scope(options)
|
41
41
|
scoped(options)
|
42
42
|
end
|
43
43
|
end
|
@@ -115,8 +115,20 @@ describe Scopify do
|
|
115
115
|
|
116
116
|
it "calls method with raw arguments if they return scope" do
|
117
117
|
T3.scope(:bbb, :limit => 1)
|
118
|
-
T3.should_receive(:
|
119
|
-
T3.bbb.
|
118
|
+
T3.should_receive(:i_scope).with(:offset => 2).and_return T3.scoped(:offset => 2)
|
119
|
+
T3.bbb.i_scope(:offset => 2)
|
120
|
+
end
|
121
|
+
|
122
|
+
it "scopes in corret order when using scope-returning method" do
|
123
|
+
T3.scope(:ccc, :limit => 1)
|
124
|
+
T3.stub!(:i_scope).and_return T3.scoped(:offset => 2)
|
125
|
+
T3.bbb.i_scope(:offset => 2).scope_options.should == T3.bbb.scoped(:offset => 2).scope_options
|
126
|
+
end
|
127
|
+
|
128
|
+
it "does not crash when scope-returning method does not return a scope" do
|
129
|
+
T3.scope(:ccc, :limit => 1)
|
130
|
+
T3.stub!(:i_scope).and_return []
|
131
|
+
T3.ccc.i_scope(:offset => 2).should == []
|
120
132
|
end
|
121
133
|
end
|
122
134
|
|