squeel 0.9.1 → 0.9.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -34,6 +34,11 @@ module Squeel
34
34
  _klass
35
35
  end
36
36
 
37
+ # Implemented for equality testing
38
+ def hash
39
+ [_name, _type, _klass].hash
40
+ end
41
+
37
42
  # Compare with other objects
38
43
  def eql?(other)
39
44
  self.class.eql?(other.class) &&
@@ -109,7 +109,21 @@ module Squeel
109
109
  # @param other The right hand side of the operation
110
110
  # @return [Operation] An operation with the given custom operator, the KeyPath on its left and the other object on the right.
111
111
  def op(operator, other)
112
- endpoint.respond_to?(:op) ? super : no_method_error(:/)
112
+ endpoint.respond_to?(:op) ? super : no_method_error(:op)
113
+ end
114
+
115
+ # Allow KeyPath to have a sifter as its endpoint, if the endpoint is a
116
+ # chainable node (Stub or Join)
117
+ # @param [Symbol] name The name of the sifter
118
+ # @return [KeyPath] This keypath, with a sifter as its endpoint
119
+ def sift(name, *args)
120
+ if Stub === endpoint || Join === endpoint
121
+ @path << endpoint
122
+ @endpoint = Sifter.new(name, args)
123
+ self
124
+ else
125
+ no_method_error :sift
126
+ end
113
127
  end
114
128
 
115
129
  # Set the absolute flag on this KeyPath
@@ -9,6 +9,19 @@ module Squeel
9
9
  @name, @args = name, args
10
10
  end
11
11
 
12
+ # Implemented for equality testing
13
+ def hash
14
+ [name, args].hash
15
+ end
16
+
17
+ # Compare with other objects
18
+ def eql?(other)
19
+ self.class.eql?(other.class) &&
20
+ self.name.eql?(other.name) &&
21
+ self.args.eql?(other.args)
22
+ end
23
+ alias :== :eql?
24
+
12
25
  end
13
26
  end
14
27
  end
@@ -108,6 +108,12 @@ module Squeel
108
108
  Join.new(self.symbol, Arel::InnerJoin)
109
109
  end
110
110
 
111
+ # Create a keypath with a sifter as its endpoint
112
+ # @return [KeyPath] The new KeyPath
113
+ def sift(name, *args)
114
+ KeyPath.new(self, Sifter.new(name, args))
115
+ end
116
+
111
117
  # Create an outer Join node for the association named by this Stub
112
118
  # @return [Join] The new outer Join node
113
119
  def outer
@@ -1,3 +1,3 @@
1
1
  module Squeel
2
- VERSION = "0.9.1"
2
+ VERSION = "0.9.2"
3
3
  end
@@ -55,6 +55,12 @@ module Squeel
55
55
  as.right.should eq 'other_name'
56
56
  end
57
57
 
58
+ it 'creates sifter nodes with #sift' do
59
+ @k.sift(:blah, 1)
60
+ sifter = @k.endpoint
61
+ sifter.should be_a Sifter
62
+ end
63
+
58
64
  it 'creates AND nodes with & if the endpoint responds to &' do
59
65
  node = @k.third.fourth.eq('Bob') & Stub.new(:attr).eq('Joe')
60
66
  node.should be_a And
@@ -39,6 +39,12 @@ module Squeel
39
39
  keypath.path_with_endpoint.should eq [@s, Join.new(:another, Arel::InnerJoin, Person)]
40
40
  end
41
41
 
42
+ it 'creates a KeyPath with a sifter endpoint when sent #sift' do
43
+ keypath = @s.sift(:blah, 1)
44
+ keypath.should be_a KeyPath
45
+ keypath.path_with_endpoint.should eq [@s, Sifter.new(:blah, [1])]
46
+ end
47
+
42
48
  it 'creates an absolute keypath with just an endpoint with ~' do
43
49
  node = ~@s
44
50
  node.should be_a KeyPath
@@ -272,6 +272,15 @@ module Squeel
272
272
  expr.right.to_sql.should match /"children_people"."name" LIKE '%smith'/
273
273
  end
274
274
 
275
+ it 'visits sifters in a keypath' do
276
+ predicate = @v.accept(dsl {children.sift(:name_starts_or_ends_with, 'smith')})
277
+ predicate.should be_a Arel::Nodes::Grouping
278
+ expr = predicate.expr
279
+ expr.should be_a Arel::Nodes::Or
280
+ expr.left.to_sql.should match /"children_people"."name" LIKE 'smith%'/
281
+ expr.right.to_sql.should match /"children_people"."name" LIKE '%smith'/
282
+ end
283
+
275
284
  it 'honors an explicit table in string keys' do
276
285
  predicate = @v.accept('things.attribute' => 'retro')
277
286
  predicate.should be_a Arel::Nodes::Equality
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: squeel
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.1
4
+ version: 0.9.2
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2011-09-27 00:00:00.000000000Z
12
+ date: 2011-09-29 00:00:00.000000000Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: activerecord
16
- requirement: &70206840193580 !ruby/object:Gem::Requirement
16
+ requirement: &70246229519260 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ~>
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: '3.0'
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *70206840193580
24
+ version_requirements: *70246229519260
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: activesupport
27
- requirement: &70206840192480 !ruby/object:Gem::Requirement
27
+ requirement: &70246229518440 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ~>
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: '3.0'
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *70206840192480
35
+ version_requirements: *70246229518440
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: polyamorous
38
- requirement: &70206840191580 !ruby/object:Gem::Requirement
38
+ requirement: &70246229517800 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ~>
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: 0.5.0
44
44
  type: :runtime
45
45
  prerelease: false
46
- version_requirements: *70206840191580
46
+ version_requirements: *70246229517800
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: rspec
49
- requirement: &70206840190960 !ruby/object:Gem::Requirement
49
+ requirement: &70246229517260 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ~>
@@ -54,10 +54,10 @@ dependencies:
54
54
  version: 2.6.0
55
55
  type: :development
56
56
  prerelease: false
57
- version_requirements: *70206840190960
57
+ version_requirements: *70246229517260
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: machinist
60
- requirement: &70206840190480 !ruby/object:Gem::Requirement
60
+ requirement: &70246229516760 !ruby/object:Gem::Requirement
61
61
  none: false
62
62
  requirements:
63
63
  - - ~>
@@ -65,10 +65,10 @@ dependencies:
65
65
  version: 1.0.6
66
66
  type: :development
67
67
  prerelease: false
68
- version_requirements: *70206840190480
68
+ version_requirements: *70246229516760
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: faker
71
- requirement: &70206840190000 !ruby/object:Gem::Requirement
71
+ requirement: &70246229516300 !ruby/object:Gem::Requirement
72
72
  none: false
73
73
  requirements:
74
74
  - - ~>
@@ -76,10 +76,10 @@ dependencies:
76
76
  version: 0.9.5
77
77
  type: :development
78
78
  prerelease: false
79
- version_requirements: *70206840190000
79
+ version_requirements: *70246229516300
80
80
  - !ruby/object:Gem::Dependency
81
81
  name: sqlite3
82
- requirement: &70206840189500 !ruby/object:Gem::Requirement
82
+ requirement: &70246229515840 !ruby/object:Gem::Requirement
83
83
  none: false
84
84
  requirements:
85
85
  - - ~>
@@ -87,7 +87,7 @@ dependencies:
87
87
  version: 1.3.3
88
88
  type: :development
89
89
  prerelease: false
90
- version_requirements: *70206840189500
90
+ version_requirements: *70246229515840
91
91
  description: ! "\n Squeel unlocks the power of ARel in your Rails 3 application
92
92
  with\n a handy block-based syntax. You can write subqueries, access named\n
93
93
  \ functions provided by your RDBMS, and more, all without writing\n SQL