squeel 0.9.1 → 0.9.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.
@@ -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