squeel_rbg 0.8.2
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.
- data/.gitignore +4 -0
- data/.yardopts +3 -0
- data/Gemfile +13 -0
- data/LICENSE +20 -0
- data/README.md +398 -0
- data/Rakefile +19 -0
- data/lib/core_ext/hash.rb +13 -0
- data/lib/core_ext/symbol.rb +39 -0
- data/lib/squeel/adapters/active_record/3.0/association_preload.rb +15 -0
- data/lib/squeel/adapters/active_record/3.0/compat.rb +142 -0
- data/lib/squeel/adapters/active_record/3.0/context.rb +66 -0
- data/lib/squeel/adapters/active_record/3.0/join_association.rb +54 -0
- data/lib/squeel/adapters/active_record/3.0/join_dependency.rb +84 -0
- data/lib/squeel/adapters/active_record/3.0/relation.rb +327 -0
- data/lib/squeel/adapters/active_record/context.rb +66 -0
- data/lib/squeel/adapters/active_record/join_association.rb +44 -0
- data/lib/squeel/adapters/active_record/join_dependency.rb +83 -0
- data/lib/squeel/adapters/active_record/preloader.rb +21 -0
- data/lib/squeel/adapters/active_record/relation.rb +351 -0
- data/lib/squeel/adapters/active_record.rb +28 -0
- data/lib/squeel/configuration.rb +54 -0
- data/lib/squeel/constants.rb +24 -0
- data/lib/squeel/context.rb +67 -0
- data/lib/squeel/dsl.rb +86 -0
- data/lib/squeel/nodes/aliasing.rb +13 -0
- data/lib/squeel/nodes/and.rb +9 -0
- data/lib/squeel/nodes/as.rb +14 -0
- data/lib/squeel/nodes/binary.rb +32 -0
- data/lib/squeel/nodes/function.rb +66 -0
- data/lib/squeel/nodes/join.rb +113 -0
- data/lib/squeel/nodes/key_path.rb +192 -0
- data/lib/squeel/nodes/nary.rb +45 -0
- data/lib/squeel/nodes/not.rb +9 -0
- data/lib/squeel/nodes/operation.rb +32 -0
- data/lib/squeel/nodes/operators.rb +43 -0
- data/lib/squeel/nodes/or.rb +9 -0
- data/lib/squeel/nodes/order.rb +53 -0
- data/lib/squeel/nodes/predicate.rb +71 -0
- data/lib/squeel/nodes/predicate_operators.rb +29 -0
- data/lib/squeel/nodes/stub.rb +125 -0
- data/lib/squeel/nodes/unary.rb +28 -0
- data/lib/squeel/nodes.rb +17 -0
- data/lib/squeel/predicate_methods.rb +14 -0
- data/lib/squeel/version.rb +3 -0
- data/lib/squeel/visitors/attribute_visitor.rb +191 -0
- data/lib/squeel/visitors/base.rb +112 -0
- data/lib/squeel/visitors/predicate_visitor.rb +319 -0
- data/lib/squeel/visitors/symbol_visitor.rb +48 -0
- data/lib/squeel/visitors.rb +3 -0
- data/lib/squeel.rb +28 -0
- data/lib/squeel_rbg.rb +5 -0
- data/spec/blueprints/articles.rb +5 -0
- data/spec/blueprints/comments.rb +5 -0
- data/spec/blueprints/notes.rb +3 -0
- data/spec/blueprints/people.rb +4 -0
- data/spec/blueprints/tags.rb +3 -0
- data/spec/console.rb +22 -0
- data/spec/core_ext/symbol_spec.rb +75 -0
- data/spec/helpers/squeel_helper.rb +21 -0
- data/spec/spec_helper.rb +66 -0
- data/spec/squeel/adapters/active_record/context_spec.rb +44 -0
- data/spec/squeel/adapters/active_record/join_association_spec.rb +18 -0
- data/spec/squeel/adapters/active_record/join_dependency_spec.rb +66 -0
- data/spec/squeel/adapters/active_record/relation_spec.rb +627 -0
- data/spec/squeel/dsl_spec.rb +92 -0
- data/spec/squeel/nodes/function_spec.rb +149 -0
- data/spec/squeel/nodes/join_spec.rb +47 -0
- data/spec/squeel/nodes/key_path_spec.rb +100 -0
- data/spec/squeel/nodes/operation_spec.rb +149 -0
- data/spec/squeel/nodes/operators_spec.rb +87 -0
- data/spec/squeel/nodes/order_spec.rb +30 -0
- data/spec/squeel/nodes/predicate_operators_spec.rb +88 -0
- data/spec/squeel/nodes/predicate_spec.rb +50 -0
- data/spec/squeel/nodes/stub_spec.rb +198 -0
- data/spec/squeel/visitors/attribute_visitor_spec.rb +142 -0
- data/spec/squeel/visitors/predicate_visitor_spec.rb +342 -0
- data/spec/squeel/visitors/symbol_visitor_spec.rb +42 -0
- data/spec/support/schema.rb +104 -0
- data/squeel.gemspec +43 -0
- metadata +246 -0
@@ -0,0 +1,92 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Squeel
|
4
|
+
describe DSL do
|
5
|
+
|
6
|
+
it 'evaluates code' do
|
7
|
+
result = DSL.eval { {id => 1} }
|
8
|
+
result.should be_a Hash
|
9
|
+
result.keys.first.should be_a Nodes::Stub
|
10
|
+
end
|
11
|
+
|
12
|
+
it 'creates function nodes when a method has arguments' do
|
13
|
+
result = DSL.eval { max(id) }
|
14
|
+
result.should be_a Nodes::Function
|
15
|
+
result.args.should eq [Nodes::Stub.new(:id)]
|
16
|
+
end
|
17
|
+
|
18
|
+
it 'creates polymorphic join nodes when a method has a single class argument' do
|
19
|
+
result = DSL.eval { association(Person) }
|
20
|
+
result.should be_a Nodes::Join
|
21
|
+
result._klass.should eq Person
|
22
|
+
end
|
23
|
+
|
24
|
+
it 'handles OR between predicates' do
|
25
|
+
result = DSL.eval {(name =~ 'Joe%') | (articles.title =~ 'Hello%')}
|
26
|
+
result.should be_a Nodes::Or
|
27
|
+
result.left.should be_a Nodes::Predicate
|
28
|
+
result.right.should be_a Nodes::KeyPath
|
29
|
+
result.right.endpoint.should be_a Nodes::Predicate
|
30
|
+
end
|
31
|
+
|
32
|
+
it 'is not a full closure (instance_evals) when the block supplied has no arity' do
|
33
|
+
my_class = Class.new do
|
34
|
+
def a_method
|
35
|
+
'test'
|
36
|
+
end
|
37
|
+
|
38
|
+
def dsl_test
|
39
|
+
DSL.eval {name =~ a_method}
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
obj = my_class.new
|
44
|
+
result = obj.dsl_test
|
45
|
+
result.should be_a Nodes::Predicate
|
46
|
+
result.expr.should eq :name
|
47
|
+
result.method_name.should eq :matches
|
48
|
+
result.value.should be_a Nodes::Stub
|
49
|
+
result.value.symbol.should eq :a_method
|
50
|
+
end
|
51
|
+
|
52
|
+
it 'is a full closure (yields self) when the block supplied has an arity' do
|
53
|
+
my_class = Class.new do
|
54
|
+
def a_method
|
55
|
+
'test'
|
56
|
+
end
|
57
|
+
|
58
|
+
def dsl_test
|
59
|
+
DSL.eval {|q| q.name =~ a_method}
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
obj = my_class.new
|
64
|
+
result = obj.dsl_test
|
65
|
+
result.should be_a Nodes::Predicate
|
66
|
+
result.expr.should eq :name
|
67
|
+
result.method_name.should eq :matches
|
68
|
+
result.value.should be_a String
|
69
|
+
result.value.should eq 'test'
|
70
|
+
end
|
71
|
+
|
72
|
+
describe '#my' do
|
73
|
+
it 'allows access to caller instance variables' do
|
74
|
+
@test_var = "test"
|
75
|
+
result = DSL.eval{my{@test_var}}
|
76
|
+
result.should be_a String
|
77
|
+
result.should eq @test_var
|
78
|
+
end
|
79
|
+
|
80
|
+
it 'allows access to caller methods' do
|
81
|
+
def test_scoped_method
|
82
|
+
:name
|
83
|
+
end
|
84
|
+
|
85
|
+
result = DSL.eval{my{test_scoped_method}}
|
86
|
+
result.should be_a Symbol
|
87
|
+
result.should eq :name
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
end
|
92
|
+
end
|
@@ -0,0 +1,149 @@
|
|
1
|
+
module Squeel
|
2
|
+
module Nodes
|
3
|
+
describe Function do
|
4
|
+
before do
|
5
|
+
@f = :function.func(1,2,3)
|
6
|
+
end
|
7
|
+
|
8
|
+
Squeel::Constants::PREDICATES.each do |method_name|
|
9
|
+
it "creates #{method_name} predicates with no value" do
|
10
|
+
predicate = @f.send(method_name)
|
11
|
+
predicate.expr.should eq @f
|
12
|
+
predicate.method_name.should eq method_name
|
13
|
+
predicate.value?.should be_false
|
14
|
+
end
|
15
|
+
|
16
|
+
it "creates #{method_name} predicates with a value" do
|
17
|
+
predicate = @f.send(method_name, 'value')
|
18
|
+
predicate.expr.should eq @f
|
19
|
+
predicate.method_name.should eq method_name
|
20
|
+
predicate.value.should eq 'value'
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
Squeel::Constants::PREDICATE_ALIASES.each do |method_name, aliases|
|
25
|
+
aliases.each do |aliaz|
|
26
|
+
['', '_any', '_all'].each do |suffix|
|
27
|
+
it "creates #{method_name.to_s + suffix} predicates with no value using the alias #{aliaz.to_s + suffix}" do
|
28
|
+
predicate = @f.send(aliaz.to_s + suffix)
|
29
|
+
predicate.expr.should eq @f
|
30
|
+
predicate.method_name.should eq "#{method_name}#{suffix}".to_sym
|
31
|
+
predicate.value?.should be_false
|
32
|
+
end
|
33
|
+
|
34
|
+
it "creates #{method_name.to_s + suffix} predicates with a value using the alias #{aliaz.to_s + suffix}" do
|
35
|
+
predicate = @f.send((aliaz.to_s + suffix), 'value')
|
36
|
+
predicate.expr.should eq @f
|
37
|
+
predicate.method_name.should eq "#{method_name}#{suffix}".to_sym
|
38
|
+
predicate.value.should eq 'value'
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
it 'creates ascending Order nodes with #asc' do
|
45
|
+
order = @f.asc
|
46
|
+
order.expr.should eq @f
|
47
|
+
order.should be_ascending
|
48
|
+
end
|
49
|
+
|
50
|
+
it 'creates descending Order nodes with #desc' do
|
51
|
+
order = @f.desc
|
52
|
+
order.expr.should eq @f
|
53
|
+
order.should be_descending
|
54
|
+
end
|
55
|
+
|
56
|
+
it 'creates eq predicates with ==' do
|
57
|
+
predicate = @f == 1
|
58
|
+
predicate.expr.should eq @f
|
59
|
+
predicate.method_name.should eq :eq
|
60
|
+
predicate.value.should eq 1
|
61
|
+
end
|
62
|
+
|
63
|
+
it 'creates not_eq predicates with ^' do
|
64
|
+
predicate = @f ^ 1
|
65
|
+
predicate.expr.should eq @f
|
66
|
+
predicate.method_name.should eq :not_eq
|
67
|
+
predicate.value.should eq 1
|
68
|
+
end
|
69
|
+
|
70
|
+
it 'creates not_eq predicates with !=' do
|
71
|
+
predicate = @f != 1
|
72
|
+
predicate.expr.should eq @f
|
73
|
+
predicate.method_name.should eq :not_eq
|
74
|
+
predicate.value.should eq 1
|
75
|
+
end if respond_to?('!=')
|
76
|
+
|
77
|
+
it 'creates in predicates with >>' do
|
78
|
+
predicate = @f >> [1,2,3]
|
79
|
+
predicate.expr.should eq @f
|
80
|
+
predicate.method_name.should eq :in
|
81
|
+
predicate.value.should eq [1,2,3]
|
82
|
+
end
|
83
|
+
|
84
|
+
it 'creates not_in predicates with <<' do
|
85
|
+
predicate = @f << [1,2,3]
|
86
|
+
predicate.expr.should eq @f
|
87
|
+
predicate.method_name.should eq :not_in
|
88
|
+
predicate.value.should eq [1,2,3]
|
89
|
+
end
|
90
|
+
|
91
|
+
it 'creates matches predicates with =~' do
|
92
|
+
predicate = @f =~ '%bob%'
|
93
|
+
predicate.expr.should eq @f
|
94
|
+
predicate.method_name.should eq :matches
|
95
|
+
predicate.value.should eq '%bob%'
|
96
|
+
end
|
97
|
+
|
98
|
+
it 'creates does_not_match predicates with !~' do
|
99
|
+
predicate = @f !~ '%bob%'
|
100
|
+
predicate.expr.should eq @f
|
101
|
+
predicate.method_name.should eq :does_not_match
|
102
|
+
predicate.value.should eq '%bob%'
|
103
|
+
end if respond_to?('!~')
|
104
|
+
|
105
|
+
it 'creates gt predicates with >' do
|
106
|
+
predicate = @f > 1
|
107
|
+
predicate.expr.should eq @f
|
108
|
+
predicate.method_name.should eq :gt
|
109
|
+
predicate.value.should eq 1
|
110
|
+
end
|
111
|
+
|
112
|
+
it 'creates gteq predicates with >=' do
|
113
|
+
predicate = @f >= 1
|
114
|
+
predicate.expr.should eq @f
|
115
|
+
predicate.method_name.should eq :gteq
|
116
|
+
predicate.value.should eq 1
|
117
|
+
end
|
118
|
+
|
119
|
+
it 'creates lt predicates with <' do
|
120
|
+
predicate = @f < 1
|
121
|
+
predicate.expr.should eq @f
|
122
|
+
predicate.method_name.should eq :lt
|
123
|
+
predicate.value.should eq 1
|
124
|
+
end
|
125
|
+
|
126
|
+
it 'creates lteq predicates with <=' do
|
127
|
+
predicate = @f <= 1
|
128
|
+
predicate.expr.should eq @f
|
129
|
+
predicate.method_name.should eq :lteq
|
130
|
+
predicate.value.should eq 1
|
131
|
+
end
|
132
|
+
|
133
|
+
describe '#as' do
|
134
|
+
|
135
|
+
it 'aliases the function' do
|
136
|
+
@f.as('the_alias')
|
137
|
+
@f.alias.should eq 'the_alias'
|
138
|
+
end
|
139
|
+
|
140
|
+
it 'casts the alias to a string' do
|
141
|
+
@f.as(:the_alias)
|
142
|
+
@f.alias.should eq 'the_alias'
|
143
|
+
end
|
144
|
+
|
145
|
+
end
|
146
|
+
|
147
|
+
end
|
148
|
+
end
|
149
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Squeel
|
4
|
+
module Nodes
|
5
|
+
describe Join do
|
6
|
+
|
7
|
+
before do
|
8
|
+
@j = Join.new :name
|
9
|
+
end
|
10
|
+
|
11
|
+
it 'defaults to Arel::InnerJoin' do
|
12
|
+
@j._type.should eq Arel::InnerJoin
|
13
|
+
end
|
14
|
+
|
15
|
+
it 'allows setting join type' do
|
16
|
+
@j.outer
|
17
|
+
@j._type.should eq Arel::OuterJoin
|
18
|
+
end
|
19
|
+
|
20
|
+
it 'allows setting polymorphic class' do
|
21
|
+
@j._klass = Person
|
22
|
+
@j.should be_polymorphic
|
23
|
+
@j._klass.should eq Person
|
24
|
+
end
|
25
|
+
|
26
|
+
it 'creates a KeyPath when sent an unknown method' do
|
27
|
+
keypath = @j.another
|
28
|
+
keypath.should be_a KeyPath
|
29
|
+
keypath.path_with_endpoint.should eq [@j, Stub.new(:another)]
|
30
|
+
end
|
31
|
+
|
32
|
+
it 'creates a KeyPath with a join endpoint when sent a method with a Class param' do
|
33
|
+
keypath = @j.another(Person)
|
34
|
+
keypath.should be_a KeyPath
|
35
|
+
keypath.path_with_endpoint.should eq [@j, Join.new(:another, Arel::InnerJoin, Person)]
|
36
|
+
end
|
37
|
+
|
38
|
+
it 'creates an absolute keypath with just an endpoint with ~' do
|
39
|
+
node = ~@j
|
40
|
+
node.should be_a KeyPath
|
41
|
+
node.path.should eq []
|
42
|
+
node.endpoint.should eq @j
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,100 @@
|
|
1
|
+
module Squeel
|
2
|
+
module Nodes
|
3
|
+
describe KeyPath do
|
4
|
+
before do
|
5
|
+
@k = KeyPath.new(:first, :second)
|
6
|
+
end
|
7
|
+
|
8
|
+
it 'appends to its path when endpoint is a Stub' do
|
9
|
+
@k.third.fourth.fifth
|
10
|
+
@k.path.should eq [:first, :second, :third, :fourth]
|
11
|
+
@k.endpoint.should eq Stub.new(:fifth)
|
12
|
+
end
|
13
|
+
|
14
|
+
it 'becomes absolute when prefixed with ~' do
|
15
|
+
~@k.third.fourth.fifth
|
16
|
+
@k.path.should eq [:first, :second, :third, :fourth]
|
17
|
+
@k.endpoint.should eq Stub.new(:fifth)
|
18
|
+
@k.should be_absolute
|
19
|
+
end
|
20
|
+
|
21
|
+
it 'stops appending once its endpoint is not a Stub' do
|
22
|
+
@k.third.fourth.fifth == 'cinco'
|
23
|
+
@k.endpoint.should eq Predicate.new(Stub.new(:fifth), :eq, 'cinco')
|
24
|
+
expect { @k.another }.to raise_error NoMethodError
|
25
|
+
end
|
26
|
+
|
27
|
+
it 'sends missing calls to its endpoint if the endpoint responds to them' do
|
28
|
+
@k.third.fourth.fifth.matches('Joe%')
|
29
|
+
@k.endpoint.should be_a Predicate
|
30
|
+
@k.endpoint.expr.should eq :fifth
|
31
|
+
@k.endpoint.method_name.should eq :matches
|
32
|
+
@k.endpoint.value.should eq 'Joe%'
|
33
|
+
end
|
34
|
+
|
35
|
+
it 'creates a polymorphic join at its endpoint' do
|
36
|
+
@k.third.fourth.fifth(Person)
|
37
|
+
@k.endpoint.should be_a Join
|
38
|
+
@k.endpoint.should be_polymorphic
|
39
|
+
end
|
40
|
+
|
41
|
+
it 'creates a named function at its endpoint' do
|
42
|
+
@k.third.fourth.fifth.max(1,2,3)
|
43
|
+
@k.endpoint.should be_a Function
|
44
|
+
@k.endpoint.name.should eq :max
|
45
|
+
@k.endpoint.args.should eq [1,2,3]
|
46
|
+
end
|
47
|
+
|
48
|
+
it 'creates as nodes with #as' do
|
49
|
+
@k.as('other_name')
|
50
|
+
as = @k.endpoint
|
51
|
+
as.should be_a Squeel::Nodes::As
|
52
|
+
as.left.should eq Stub.new(:fourth)
|
53
|
+
as.right.should eq 'other_name'
|
54
|
+
end
|
55
|
+
|
56
|
+
it 'creates AND nodes with & if the endpoint responds to &' do
|
57
|
+
node = @k.third.fourth.eq('Bob') & Stub.new(:attr).eq('Joe')
|
58
|
+
node.should be_a And
|
59
|
+
node.children.should eq [@k, Stub.new(:attr).eq('Joe')]
|
60
|
+
end
|
61
|
+
|
62
|
+
it 'raises NoMethodError with & if the endpoint does not respond to &' do
|
63
|
+
expect {@k.third.fourth & Stub.new(:attr).eq('Joe')}.to raise_error NoMethodError
|
64
|
+
end
|
65
|
+
|
66
|
+
it 'creates Or nodes with | if the endpoint responds to |' do
|
67
|
+
node = @k.third.fourth.eq('Bob') | Stub.new(:attr).eq('Joe')
|
68
|
+
node.should be_a Or
|
69
|
+
node.left.should eq @k
|
70
|
+
node.right.should eq Stub.new(:attr).eq('Joe')
|
71
|
+
end
|
72
|
+
|
73
|
+
it 'raises NoMethodError with | if the endpoint does not respond to |' do
|
74
|
+
expect {@k.third.fourth | Stub.new(:attr).eq('Joe')}.to raise_error NoMethodError
|
75
|
+
end
|
76
|
+
|
77
|
+
it 'creates Operation nodes with - if the endpoint responds to -' do
|
78
|
+
node = @k.third.fourth - 4
|
79
|
+
node.should be_an Operation
|
80
|
+
node.left.should eq @k
|
81
|
+
node.right.should eq 4
|
82
|
+
end
|
83
|
+
|
84
|
+
it 'raises NoMethodError with - if the endpoint does not respond to -' do
|
85
|
+
expect {@k.third.fourth(Person) - Stub.new(:attr).eq('Joe')}.to raise_error NoMethodError
|
86
|
+
end
|
87
|
+
|
88
|
+
it 'creates NOT nodes with -@ if the endpoint responds to -@' do
|
89
|
+
node = - @k.third.fourth.eq('Bob')
|
90
|
+
node.should be_a Not
|
91
|
+
node.expr.should eq @k
|
92
|
+
end
|
93
|
+
|
94
|
+
it 'raises NoMethodError with -@ if the endpoint does not respond to -@' do
|
95
|
+
expect {-@k.third.fourth}.to raise_error NoMethodError
|
96
|
+
end
|
97
|
+
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
@@ -0,0 +1,149 @@
|
|
1
|
+
module Squeel
|
2
|
+
module Nodes
|
3
|
+
describe Operation do
|
4
|
+
before do
|
5
|
+
@o = dsl{name + 1}
|
6
|
+
end
|
7
|
+
|
8
|
+
Squeel::Constants::PREDICATES.each do |method_name|
|
9
|
+
it "creates #{method_name} predicates with no value" do
|
10
|
+
predicate = @o.send(method_name)
|
11
|
+
predicate.expr.should eq @o
|
12
|
+
predicate.method_name.should eq method_name
|
13
|
+
predicate.value?.should be_false
|
14
|
+
end
|
15
|
+
|
16
|
+
it "creates #{method_name} predicates with a value" do
|
17
|
+
predicate = @o.send(method_name, 'value')
|
18
|
+
predicate.expr.should eq @o
|
19
|
+
predicate.method_name.should eq method_name
|
20
|
+
predicate.value.should eq 'value'
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
Squeel::Constants::PREDICATE_ALIASES.each do |method_name, aliases|
|
25
|
+
aliases.each do |aliaz|
|
26
|
+
['', '_any', '_all'].each do |suffix|
|
27
|
+
it "creates #{method_name.to_s + suffix} predicates with no value using the alias #{aliaz.to_s + suffix}" do
|
28
|
+
predicate = @o.send(aliaz.to_s + suffix)
|
29
|
+
predicate.expr.should eq @o
|
30
|
+
predicate.method_name.should eq "#{method_name}#{suffix}".to_sym
|
31
|
+
predicate.value?.should be_false
|
32
|
+
end
|
33
|
+
|
34
|
+
it "creates #{method_name.to_s + suffix} predicates with a value using the alias #{aliaz.to_s + suffix}" do
|
35
|
+
predicate = @o.send((aliaz.to_s + suffix), 'value')
|
36
|
+
predicate.expr.should eq @o
|
37
|
+
predicate.method_name.should eq "#{method_name}#{suffix}".to_sym
|
38
|
+
predicate.value.should eq 'value'
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
it 'creates ascending Order nodes with #asc' do
|
45
|
+
order = @o.asc
|
46
|
+
order.expr.should eq @o
|
47
|
+
order.should be_ascending
|
48
|
+
end
|
49
|
+
|
50
|
+
it 'creates descending Order nodes with #desc' do
|
51
|
+
order = @o.desc
|
52
|
+
order.expr.should eq @o
|
53
|
+
order.should be_descending
|
54
|
+
end
|
55
|
+
|
56
|
+
it 'creates eq predicates with ==' do
|
57
|
+
predicate = @o == 1
|
58
|
+
predicate.expr.should eq @o
|
59
|
+
predicate.method_name.should eq :eq
|
60
|
+
predicate.value.should eq 1
|
61
|
+
end
|
62
|
+
|
63
|
+
it 'creates not_eq predicates with ^' do
|
64
|
+
predicate = @o ^ 1
|
65
|
+
predicate.expr.should eq @o
|
66
|
+
predicate.method_name.should eq :not_eq
|
67
|
+
predicate.value.should eq 1
|
68
|
+
end
|
69
|
+
|
70
|
+
it 'creates not_eq predicates with !=' do
|
71
|
+
predicate = @o != 1
|
72
|
+
predicate.expr.should eq @o
|
73
|
+
predicate.method_name.should eq :not_eq
|
74
|
+
predicate.value.should eq 1
|
75
|
+
end if respond_to?('!=')
|
76
|
+
|
77
|
+
it 'creates in predicates with >>' do
|
78
|
+
predicate = @o >> [1,2,3]
|
79
|
+
predicate.expr.should eq @o
|
80
|
+
predicate.method_name.should eq :in
|
81
|
+
predicate.value.should eq [1,2,3]
|
82
|
+
end
|
83
|
+
|
84
|
+
it 'creates not_in predicates with <<' do
|
85
|
+
predicate = @o << [1,2,3]
|
86
|
+
predicate.expr.should eq @o
|
87
|
+
predicate.method_name.should eq :not_in
|
88
|
+
predicate.value.should eq [1,2,3]
|
89
|
+
end
|
90
|
+
|
91
|
+
it 'creates matches predicates with =~' do
|
92
|
+
predicate = @o =~ '%bob%'
|
93
|
+
predicate.expr.should eq @o
|
94
|
+
predicate.method_name.should eq :matches
|
95
|
+
predicate.value.should eq '%bob%'
|
96
|
+
end
|
97
|
+
|
98
|
+
it 'creates does_not_match predicates with !~' do
|
99
|
+
predicate = @o !~ '%bob%'
|
100
|
+
predicate.expr.should eq @o
|
101
|
+
predicate.method_name.should eq :does_not_match
|
102
|
+
predicate.value.should eq '%bob%'
|
103
|
+
end if respond_to?('!~')
|
104
|
+
|
105
|
+
it 'creates gt predicates with >' do
|
106
|
+
predicate = @o > 1
|
107
|
+
predicate.expr.should eq @o
|
108
|
+
predicate.method_name.should eq :gt
|
109
|
+
predicate.value.should eq 1
|
110
|
+
end
|
111
|
+
|
112
|
+
it 'creates gteq predicates with >=' do
|
113
|
+
predicate = @o >= 1
|
114
|
+
predicate.expr.should eq @o
|
115
|
+
predicate.method_name.should eq :gteq
|
116
|
+
predicate.value.should eq 1
|
117
|
+
end
|
118
|
+
|
119
|
+
it 'creates lt predicates with <' do
|
120
|
+
predicate = @o < 1
|
121
|
+
predicate.expr.should eq @o
|
122
|
+
predicate.method_name.should eq :lt
|
123
|
+
predicate.value.should eq 1
|
124
|
+
end
|
125
|
+
|
126
|
+
it 'creates lteq predicates with <=' do
|
127
|
+
predicate = @o <= 1
|
128
|
+
predicate.expr.should eq @o
|
129
|
+
predicate.method_name.should eq :lteq
|
130
|
+
predicate.value.should eq 1
|
131
|
+
end
|
132
|
+
|
133
|
+
describe '#as' do
|
134
|
+
|
135
|
+
it 'aliases the function' do
|
136
|
+
@o.as('the_alias')
|
137
|
+
@o.alias.should eq 'the_alias'
|
138
|
+
end
|
139
|
+
|
140
|
+
it 'casts the alias to a string' do
|
141
|
+
@o.as(:the_alias)
|
142
|
+
@o.alias.should eq 'the_alias'
|
143
|
+
end
|
144
|
+
|
145
|
+
end
|
146
|
+
|
147
|
+
end
|
148
|
+
end
|
149
|
+
end
|
@@ -0,0 +1,87 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Squeel
|
4
|
+
module Nodes
|
5
|
+
describe Operators do
|
6
|
+
|
7
|
+
[:+, :-, :*, :/].each do |operator|
|
8
|
+
describe "#{operator}" do
|
9
|
+
it "creates Operations with #{operator} operator from stubs" do
|
10
|
+
left = Stub.new(:stubby_mcstubbenstein)
|
11
|
+
node = left.send(operator, 1)
|
12
|
+
node.should be_an Operation
|
13
|
+
node.left.should eq left
|
14
|
+
node.operator.should eq operator
|
15
|
+
node.right.should eq 1
|
16
|
+
end
|
17
|
+
|
18
|
+
it "creates Operations with #{operator} operator from key paths" do
|
19
|
+
left = KeyPath.new(:first, :second)
|
20
|
+
node = left.send(operator, 1)
|
21
|
+
node.should be_an Operation
|
22
|
+
node.left.should eq left
|
23
|
+
node.operator.should eq operator
|
24
|
+
node.right.should eq 1
|
25
|
+
end
|
26
|
+
|
27
|
+
it "creates Operations with #{operator} operator from functions" do
|
28
|
+
left = Function.new(:name, ["arg1", "arg2"])
|
29
|
+
node = left.send(operator, 1)
|
30
|
+
node.should be_an Operation
|
31
|
+
node.left.should eq left
|
32
|
+
node.operator.should eq operator
|
33
|
+
node.right.should eq 1
|
34
|
+
end
|
35
|
+
|
36
|
+
it "creates Operations with #{operator} operator from operations" do
|
37
|
+
left = Stub.new(:stubby_mcstubbenstein) + 1
|
38
|
+
node = left.send(operator, 1)
|
39
|
+
node.should be_an Operation
|
40
|
+
node.left.should eq left
|
41
|
+
node.operator.should eq operator
|
42
|
+
node.right.should eq 1
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
describe '#op' do
|
48
|
+
it "creates Operations with custom operator from stubs" do
|
49
|
+
left = Stub.new(:stubby_mcstubbenstein)
|
50
|
+
node = left.op('||', 1)
|
51
|
+
node.should be_an Operation
|
52
|
+
node.left.should eq left
|
53
|
+
node.operator.should eq '||'
|
54
|
+
node.right.should eq 1
|
55
|
+
end
|
56
|
+
|
57
|
+
it "creates Operations with custom operator from key paths" do
|
58
|
+
left = KeyPath.new(:first, :second)
|
59
|
+
node = left.op('||', 1)
|
60
|
+
node.should be_an Operation
|
61
|
+
node.left.should eq left
|
62
|
+
node.operator.should eq '||'
|
63
|
+
node.right.should eq 1
|
64
|
+
end
|
65
|
+
|
66
|
+
it "creates Operations with custom operator from functions" do
|
67
|
+
left = Function.new(:name, ["arg1", "arg2"])
|
68
|
+
node = left.op('||', 1)
|
69
|
+
node.should be_an Operation
|
70
|
+
node.left.should eq left
|
71
|
+
node.operator.should eq '||'
|
72
|
+
node.right.should eq 1
|
73
|
+
end
|
74
|
+
|
75
|
+
it "creates Operations with custom operator from operations" do
|
76
|
+
left = Stub.new(:stubby_mcstubbenstein) + 1
|
77
|
+
node = left.op('||', 1)
|
78
|
+
node.should be_an Operation
|
79
|
+
node.left.should eq left
|
80
|
+
node.operator.should eq '||'
|
81
|
+
node.right.should eq 1
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Squeel
|
4
|
+
module Nodes
|
5
|
+
describe Order do
|
6
|
+
|
7
|
+
it 'requires a direction of -1 or 1' do
|
8
|
+
expect { Order.new :attribute, 0 }.to raise_error ArgumentError
|
9
|
+
end
|
10
|
+
|
11
|
+
it 'defaults to ascending order' do
|
12
|
+
@o = Order.new :attribute
|
13
|
+
@o.should be_ascending
|
14
|
+
end
|
15
|
+
|
16
|
+
it 'allows reversal of order' do
|
17
|
+
@o = Order.new :attribute, 1
|
18
|
+
@o.reverse!
|
19
|
+
@o.should be_descending
|
20
|
+
end
|
21
|
+
|
22
|
+
it 'allows setting order' do
|
23
|
+
@o = Order.new :attribute
|
24
|
+
@o.desc
|
25
|
+
@o.should be_descending
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|