squeel 0.8.10 → 0.9.0

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.
Files changed (28) hide show
  1. data/README.md +48 -0
  2. data/lib/squeel/adapters/active_record.rb +13 -11
  3. data/lib/squeel/adapters/active_record/3.0/{association_preload.rb → association_preload_extensions.rb} +1 -1
  4. data/lib/squeel/adapters/active_record/3.0/context.rb +10 -0
  5. data/lib/squeel/adapters/active_record/3.0/{relation.rb → relation_extensions.rb} +1 -1
  6. data/lib/squeel/adapters/active_record/base_extensions.rb +22 -0
  7. data/lib/squeel/adapters/active_record/context.rb +10 -0
  8. data/lib/squeel/adapters/active_record/{join_dependency.rb → join_dependency_extensions.rb} +1 -1
  9. data/lib/squeel/adapters/active_record/{preloader.rb → preloader_extensions.rb} +1 -1
  10. data/lib/squeel/adapters/active_record/{relation.rb → relation_extensions.rb} +1 -1
  11. data/lib/squeel/context.rb +9 -1
  12. data/lib/squeel/dsl.rb +19 -1
  13. data/lib/squeel/nodes.rb +1 -0
  14. data/lib/squeel/nodes/sifter.rb +14 -0
  15. data/lib/squeel/version.rb +1 -1
  16. data/lib/squeel/visitors/attribute_visitor.rb +2 -2
  17. data/lib/squeel/visitors/predicate_visitor.rb +15 -4
  18. data/lib/squeel/visitors/symbol_visitor.rb +2 -2
  19. data/lib/squeel/visitors/{base.rb → visitor.rb} +2 -2
  20. data/spec/helpers/squeel_helper.rb +4 -0
  21. data/spec/squeel/adapters/active_record/base_extensions_spec.rb +45 -0
  22. data/spec/squeel/adapters/active_record/{join_dependency_spec.rb → join_dependency_extensions_spec.rb} +1 -1
  23. data/spec/squeel/adapters/active_record/{relation_spec.rb → relation_extensions_spec.rb} +1 -1
  24. data/spec/squeel/dsl_spec.rb +14 -0
  25. data/spec/squeel/nodes/sifter_spec.rb +22 -0
  26. data/spec/squeel/visitors/predicate_visitor_spec.rb +18 -0
  27. data/spec/support/schema.rb +5 -0
  28. metadata +32 -26
data/README.md CHANGED
@@ -266,6 +266,54 @@ I'm not sure about you, but I much prefer the latter. In short, you can add `_an
266
266
  `_all` to any predicate method, and it would do what you expect, when given an array of
267
267
  possibilities to compare against.
268
268
 
269
+ ### Sifters
270
+
271
+ Sifters are like little snippets of conditions that take parameters. Let's say that you
272
+ have a model called Article, and you often want to query for articles that contain a
273
+ string in the title or body. So you write a scope:
274
+
275
+ def self.title_or_body_contains(string)
276
+ where{title.matches("%#{string}%") | body.matches("%#{string}%")}
277
+ end
278
+
279
+ But then you want to query for people who wrote an article that matches these conditions,
280
+ but the scope only works against the model where it was defined. So instead, you write a
281
+ sifter:
282
+
283
+ class Article < ActiveRecord::Base
284
+ sifter :title_or_body_contains do |string|
285
+ title.matches("%#{string}%") | body.matches("%#{string}%")
286
+ end
287
+ end
288
+
289
+ Now you can write...
290
+
291
+ Article.where{sift :title_or_body_contains, 'awesome'}
292
+ => SELECT "articles".* FROM "articles"
293
+ WHERE ((
294
+ "articles"."title" LIKE '%awesome%'
295
+ OR "articles"."body" LIKE '%awesome%'
296
+ ))
297
+
298
+ ... or ...
299
+
300
+ Person.joins(:articles).
301
+ where{
302
+ {articles => sift(:title_or_body_contains, 'awesome')}
303
+ }
304
+ # => SELECT "people".* FROM "people"
305
+ INNER JOIN "articles" ON "articles"."person_id" = "people"."id"
306
+ WHERE ((
307
+ "articles"."title" LIKE '%awesome%'
308
+ OR "articles"."body" LIKE '%awesome%'
309
+ ))
310
+
311
+ Or, you can just modify your previous scope, changing `where` to `squeel`:
312
+
313
+ def self.title_or_body_contains(string)
314
+ squeel{title.matches("%#{string}%") | body.matches("%#{string}%")}
315
+ end
316
+
269
317
  ### Subqueries
270
318
 
271
319
  You can supply an `ActiveRecord::Relation` as a value for a predicate in order to use
@@ -1,26 +1,28 @@
1
1
  case ActiveRecord::VERSION::MAJOR
2
2
  when 3
3
3
  ActiveRecord::Relation.send :include, Squeel::Nodes::Aliasing
4
- require 'squeel/adapters/active_record/join_dependency'
4
+ require 'squeel/adapters/active_record/join_dependency_extensions'
5
+ require 'squeel/adapters/active_record/base_extensions'
6
+ ActiveRecord::Base.extend Squeel::Adapters::ActiveRecord::BaseExtensions
5
7
 
6
8
  case ActiveRecord::VERSION::MINOR
7
9
  when 0
8
10
  require 'squeel/adapters/active_record/3.0/compat'
9
- require 'squeel/adapters/active_record/3.0/relation'
10
- require 'squeel/adapters/active_record/3.0/association_preload'
11
+ require 'squeel/adapters/active_record/3.0/relation_extensions'
12
+ require 'squeel/adapters/active_record/3.0/association_preload_extensions'
11
13
  require 'squeel/adapters/active_record/3.0/context'
12
14
 
13
- ActiveRecord::Relation.send :include, Squeel::Adapters::ActiveRecord::Relation
14
- ActiveRecord::Associations::ClassMethods::JoinDependency.send :include, Squeel::Adapters::ActiveRecord::JoinDependency
15
- ActiveRecord::Base.extend Squeel::Adapters::ActiveRecord::AssociationPreload
15
+ ActiveRecord::Relation.send :include, Squeel::Adapters::ActiveRecord::RelationExtensions
16
+ ActiveRecord::Associations::ClassMethods::JoinDependency.send :include, Squeel::Adapters::ActiveRecord::JoinDependencyExtensions
17
+ ActiveRecord::Base.extend Squeel::Adapters::ActiveRecord::AssociationPreloadExtensions
16
18
  else
17
- require 'squeel/adapters/active_record/relation'
18
- require 'squeel/adapters/active_record/preloader'
19
+ require 'squeel/adapters/active_record/relation_extensions'
20
+ require 'squeel/adapters/active_record/preloader_extensions'
19
21
  require 'squeel/adapters/active_record/context'
20
22
 
21
- ActiveRecord::Relation.send :include, Squeel::Adapters::ActiveRecord::Relation
22
- ActiveRecord::Associations::JoinDependency.send :include, Squeel::Adapters::ActiveRecord::JoinDependency
23
- ActiveRecord::Associations::Preloader.send :include, Squeel::Adapters::ActiveRecord::Preloader
23
+ ActiveRecord::Relation.send :include, Squeel::Adapters::ActiveRecord::RelationExtensions
24
+ ActiveRecord::Associations::JoinDependency.send :include, Squeel::Adapters::ActiveRecord::JoinDependencyExtensions
25
+ ActiveRecord::Associations::Preloader.send :include, Squeel::Adapters::ActiveRecord::PreloaderExtensions
24
26
  end
25
27
  else
26
28
  raise NotImplementedError, "Squeel does not support ActiveRecord version #{ActiveRecord::VERSION::STRING}"
@@ -1,7 +1,7 @@
1
1
  module Squeel
2
2
  module Adapters
3
3
  module ActiveRecord
4
- module AssociationPreload
4
+ module AssociationPreloadExtensions
5
5
 
6
6
  def preload_associations(records, associations, preload_options={})
7
7
  super(records, Visitors::SymbolVisitor.new.accept(associations), preload_options)
@@ -60,6 +60,16 @@ module Squeel
60
60
  end
61
61
  end
62
62
 
63
+ def classify(object)
64
+ if Class === object
65
+ object
66
+ elsif object.respond_to? :active_record
67
+ object.active_record
68
+ else
69
+ raise ArgumentError, "#{object} can't be converted to a class"
70
+ end
71
+ end
72
+
63
73
  end
64
74
  end
65
75
  end
@@ -3,7 +3,7 @@ require 'active_record'
3
3
  module Squeel
4
4
  module Adapters
5
5
  module ActiveRecord
6
- module Relation
6
+ module RelationExtensions
7
7
 
8
8
  JoinAssociation = ::ActiveRecord::Associations::ClassMethods::JoinDependency::JoinAssociation
9
9
  JoinDependency = ::ActiveRecord::Associations::ClassMethods::JoinDependency
@@ -0,0 +1,22 @@
1
+ module Squeel
2
+ module Adapters
3
+ module ActiveRecord
4
+ module BaseExtensions
5
+
6
+ def squeel(&block)
7
+ DSL.eval &block
8
+ end
9
+
10
+ def sifter(name = nil)
11
+ if Symbol === name && block_given?
12
+ singleton_class.send :define_method, name,
13
+ lambda {|*args| DSL.exec(*args, &Proc.new)}
14
+ else
15
+ raise ArgumentError, "A name and block are required"
16
+ end
17
+ end
18
+
19
+ end
20
+ end
21
+ end
22
+ end
@@ -60,6 +60,16 @@ module Squeel
60
60
  end
61
61
  end
62
62
 
63
+ def classify(object)
64
+ if Class === object
65
+ object
66
+ elsif object.respond_to? :active_record
67
+ object.active_record
68
+ else
69
+ raise ArgumentError, "#{object} can't be converted to a class"
70
+ end
71
+ end
72
+
63
73
  end
64
74
  end
65
75
  end
@@ -3,7 +3,7 @@ require 'polyamorous'
3
3
  module Squeel
4
4
  module Adapters
5
5
  module ActiveRecord
6
- module JoinDependency
6
+ module JoinDependencyExtensions
7
7
 
8
8
  def self.included(base)
9
9
  base.class_eval do
@@ -1,7 +1,7 @@
1
1
  module Squeel
2
2
  module Adapters
3
3
  module ActiveRecord
4
- module Preloader
4
+ module PreloaderExtensions
5
5
 
6
6
  def self.included(base)
7
7
  base.class_eval do
@@ -3,7 +3,7 @@ require 'active_record'
3
3
  module Squeel
4
4
  module Adapters
5
5
  module ActiveRecord
6
- module Relation
6
+ module RelationExtensions
7
7
 
8
8
  JoinAssociation = ::ActiveRecord::Associations::JoinDependency::JoinAssociation
9
9
  JoinDependency = ::ActiveRecord::Associations::JoinDependency
@@ -1,7 +1,7 @@
1
1
  require 'arel'
2
2
 
3
3
  module Squeel
4
- # @abstract Subclass and implement {#traverse}, #{find} and {#get_table}
4
+ # @abstract Subclass and implement {#traverse}, {#find} and {#get_table}
5
5
  # to create a Context that supports a given ORM.
6
6
  class Context
7
7
  attr_reader :base, :engine, :arel_visitor
@@ -63,5 +63,13 @@ module Squeel
63
63
  raise NotImplementedError, "Subclasses must implement private method get_table"
64
64
  end
65
65
 
66
+ # Returns a class for the corresponding object.
67
+ #
68
+ # @param object A classifiable object (this will depend on the subclass's implementation)
69
+ # @return [Class] The class corresponding to the object
70
+ def classify(object)
71
+ raise NotImplementedError, "Subclasses must implement private method classify"
72
+ end
73
+
66
74
  end
67
75
  end
data/lib/squeel/dsl.rb CHANGED
@@ -6,7 +6,7 @@ module Squeel
6
6
  # method calls to fall through to method_missing.
7
7
  Squeel.evil_things do
8
8
  (instance_methods + private_instance_methods).each do |method|
9
- unless method.to_s =~ /^(__|instance_eval)/
9
+ unless method.to_s =~ /^(__|instance_eval|instance_exec)/
10
10
  undef_method method
11
11
  end
12
12
  end
@@ -32,6 +32,14 @@ module Squeel
32
32
  end
33
33
  end
34
34
 
35
+ # Called from an adapter, not directly.
36
+ # Executes a block of Squeel DSL code, possibly with arguments.
37
+ #
38
+ # @return The results of the executed DSL code.
39
+ def self.exec(*args, &block)
40
+ self.new(block.binding).instance_exec(*args, &block)
41
+ end
42
+
35
43
  private
36
44
 
37
45
  # This isn't normally called directly, but via DSL.eval, which will
@@ -63,6 +71,16 @@ module Squeel
63
71
  Nodes::Literal.new(string)
64
72
  end
65
73
 
74
+ # Create a Squeel Sifter node. This essentially substitutes the
75
+ # sifter block of the supplied name from the model.
76
+ #
77
+ # @param [Symbol, Nodes::Stub] name The name of the sifter defined in the model.
78
+ # @return [Nodes::Sifter] The sifter node
79
+ def sift(name, *args)
80
+ name = name.to_sym if Nodes::Stub === name
81
+ Nodes::Sifter.new name, args
82
+ end
83
+
66
84
  # Node generation inside DSL blocks.
67
85
  #
68
86
  # @overload node_name
data/lib/squeel/nodes.rb CHANGED
@@ -7,6 +7,7 @@ end
7
7
  require 'squeel/nodes/literal'
8
8
  require 'squeel/nodes/stub'
9
9
  require 'squeel/nodes/key_path'
10
+ require 'squeel/nodes/sifter'
10
11
  require 'squeel/nodes/predicate'
11
12
  require 'squeel/nodes/function'
12
13
  require 'squeel/nodes/operation'
@@ -0,0 +1,14 @@
1
+ module Squeel
2
+ module Nodes
3
+ class Sifter
4
+ include PredicateOperators
5
+
6
+ attr_reader :name, :args
7
+
8
+ def initialize(name, args)
9
+ @name, @args = name, args
10
+ end
11
+
12
+ end
13
+ end
14
+ end
@@ -1,3 +1,3 @@
1
1
  module Squeel
2
- VERSION = "0.8.10"
2
+ VERSION = "0.9.0"
3
3
  end
@@ -1,10 +1,10 @@
1
- require 'squeel/visitors/base'
1
+ require 'squeel/visitors/visitor'
2
2
 
3
3
  module Squeel
4
4
  module Visitors
5
5
  # A visitor that tries to convert visited nodes into Arel::Attributes
6
6
  # or other nodes that can be used for grouping, ordering, and the like.
7
- class AttributeVisitor < Base
7
+ class AttributeVisitor < Visitor
8
8
 
9
9
  private
10
10
 
@@ -1,8 +1,8 @@
1
- require 'squeel/visitors/base'
1
+ require 'squeel/visitors/visitor'
2
2
 
3
3
  module Squeel
4
4
  module Visitors
5
- class PredicateVisitor < Base
5
+ class PredicateVisitor < Visitor
6
6
 
7
7
  TRUE_SQL = Arel.sql('1=1').freeze
8
8
  FALSE_SQL = Arel.sql('1=0').freeze
@@ -83,6 +83,17 @@ module Squeel
83
83
  Arel.sql(o.expr)
84
84
  end
85
85
 
86
+ # Visit a Squeel sifter by executing its corresponding constraint block
87
+ # in the parent's class, with its given arguments, then visiting the result.
88
+ #
89
+ # @param [Nodes::Sifter] o The Sifter to visit
90
+ # @param parent The parent object in the context
91
+ # @return The result of visiting the executed block's return value
92
+ def visit_Squeel_Nodes_Sifter(o, parent)
93
+ klass = classify(parent)
94
+ visit(klass.send(o.name, *o.args), parent)
95
+ end
96
+
86
97
  # Visit a Squeel predicate, converting it into an ARel predicate
87
98
  #
88
99
  # @param [Nodes::Predicate] o The predicate to visit
@@ -220,7 +231,7 @@ module Squeel
220
231
  # @param v The value to consider
221
232
  def implies_context_change?(v)
222
233
  case v
223
- when Hash, Nodes::Predicate, Nodes::Unary, Nodes::Binary, Nodes::Nary
234
+ when Hash, Nodes::Predicate, Nodes::Unary, Nodes::Binary, Nodes::Nary, Nodes::Sifter
224
235
  true
225
236
  when Nodes::KeyPath
226
237
  can_visit?(v.endpoint) && !(Nodes::Stub === v.endpoint)
@@ -245,7 +256,7 @@ module Squeel
245
256
  end
246
257
 
247
258
  case v
248
- when Hash, Nodes::KeyPath, Nodes::Predicate, Nodes::Unary, Nodes::Binary, Nodes::Nary
259
+ when Hash, Nodes::KeyPath, Nodes::Predicate, Nodes::Unary, Nodes::Binary, Nodes::Nary, Nodes::Sifter
249
260
  visit(v, parent || k)
250
261
  when Array
251
262
  v.map {|val| visit(val, parent || k)}
@@ -1,8 +1,8 @@
1
- require 'squeel/visitors/base'
1
+ require 'squeel/visitors/visitor'
2
2
 
3
3
  module Squeel
4
4
  module Visitors
5
- class SymbolVisitor < Base
5
+ class SymbolVisitor < Visitor
6
6
 
7
7
  def initialize
8
8
  end
@@ -4,9 +4,9 @@ require 'squeel/nodes'
4
4
  module Squeel
5
5
  module Visitors
6
6
  # The Base visitor class, containing the default behavior common to subclasses.
7
- class Base
7
+ class Visitor
8
8
  attr_accessor :context
9
- delegate :contextualize, :find, :traverse, :engine, :arel_visitor, :to => :context
9
+ delegate :contextualize, :classify, :find, :traverse, :engine, :arel_visitor, :to => :context
10
10
 
11
11
  # Create a new Visitor that uses the supplied context object to contextualize
12
12
  # visited nodes.
@@ -3,6 +3,10 @@ module SqueelHelper
3
3
  Squeel::DSL.eval(&block)
4
4
  end
5
5
 
6
+ def dsl_exec(*args, &block)
7
+ Squeel::DSL.exec(*args, &block)
8
+ end
9
+
6
10
  def queries_for
7
11
  $queries_executed = []
8
12
  yield
@@ -0,0 +1,45 @@
1
+ require 'spec_helper'
2
+
3
+ module Squeel
4
+ module Adapters
5
+ module ActiveRecord
6
+ describe BaseExtensions do
7
+
8
+ subject { Person }
9
+
10
+ it { should respond_to :sifter }
11
+
12
+ describe '#sifter' do
13
+
14
+ subject { Article }
15
+
16
+ specify { expect {subject.sifter 'blah'}.to raise_error ArgumentError }
17
+
18
+ context 'with a sifter defned via block' do
19
+ before :all do
20
+ subject.sifter :title_or_body_contains do |value|
21
+ (title =~ "%#{value}%") | (body =~ "%#{value}%")
22
+ end
23
+ end
24
+
25
+ it { should respond_to :title_or_body_contains }
26
+ specify { subject.title_or_body_contains('ernie').should be_a Nodes::Or }
27
+ end
28
+
29
+ context 'with a sifter defined via method' do
30
+ before :all do
31
+ def subject.title_starts_with(val)
32
+ squeel{title =~ "#{val}%"}
33
+ end
34
+ end
35
+
36
+ it { should respond_to :title_starts_with }
37
+ specify { subject.title_starts_with('ernie').should be_a Nodes::Predicate }
38
+ end
39
+
40
+ end
41
+
42
+ end
43
+ end
44
+ end
45
+ end
@@ -3,7 +3,7 @@ require 'spec_helper'
3
3
  module Squeel
4
4
  module Adapters
5
5
  module ActiveRecord
6
- describe JoinDependency do
6
+ describe JoinDependencyExtensions do
7
7
  before do
8
8
  @jd = new_join_dependency(Person, {}, [])
9
9
  end
@@ -3,7 +3,7 @@ require 'spec_helper'
3
3
  module Squeel
4
4
  module Adapters
5
5
  module ActiveRecord
6
- describe Relation do
6
+ describe RelationExtensions do
7
7
 
8
8
  describe '#predicate_visitor' do
9
9
 
@@ -96,5 +96,19 @@ module Squeel
96
96
  end
97
97
  end
98
98
 
99
+ describe '#sift' do
100
+ it 'creates a Sifter' do
101
+ result = dsl{sift :blah}
102
+ result.should be_a Nodes::Sifter
103
+ result.name.should eq :blah
104
+ end
105
+
106
+ it 'casts Stubs to Symbols for sifter names' do
107
+ result = dsl{sift blah}
108
+ result.should be_a Nodes::Sifter
109
+ result.name.should eq :blah
110
+ end
111
+ end
112
+
99
113
  end
100
114
  end
@@ -0,0 +1,22 @@
1
+ require 'spec_helper'
2
+
3
+ module Squeel
4
+ module Nodes
5
+ describe Sifter do
6
+
7
+ subject { Sifter.new :title_or_body_contains, ['awesome'] }
8
+
9
+ specify { subject.name.should eq :title_or_body_contains }
10
+ specify { subject.args.should eq ['awesome'] }
11
+
12
+ it { should respond_to :& }
13
+ it { should respond_to :| }
14
+ it { should respond_to :-@ }
15
+
16
+ specify { (subject & subject).should be_a And }
17
+ specify { (subject | subject).should be_a Or }
18
+ specify { (-subject).should be_a Not }
19
+
20
+ end
21
+ end
22
+ end
@@ -248,6 +248,24 @@ module Squeel
248
248
  predicate.to_sql.should match /"people"."name" = "children_people"."name"/
249
249
  end
250
250
 
251
+ it 'visits Squeel Sifters at top level' do
252
+ predicate = @v.accept(dsl {sift :name_starts_or_ends_with, 'smith'})
253
+ predicate.should be_a Arel::Nodes::Grouping
254
+ expr = predicate.expr
255
+ expr.should be_a Arel::Nodes::Or
256
+ expr.left.to_sql.should match /"people"."name" LIKE 'smith%'/
257
+ expr.right.to_sql.should match /"people"."name" LIKE '%smith'/
258
+ end
259
+
260
+ it 'visits nested Squeel sifters' do
261
+ predicate = @v.accept(dsl {{:children => sift(:name_starts_or_ends_with, 'smith')}})
262
+ predicate.should be_a Arel::Nodes::Grouping
263
+ expr = predicate.expr
264
+ expr.should be_a Arel::Nodes::Or
265
+ expr.left.to_sql.should match /"children_people"."name" LIKE 'smith%'/
266
+ expr.right.to_sql.should match /"children_people"."name" LIKE '%smith'/
267
+ end
268
+
251
269
  it 'honors an explicit table in string keys' do
252
270
  predicate = @v.accept('things.attribute' => 'retro')
253
271
  predicate.should be_a Arel::Nodes::Equality
@@ -1,4 +1,5 @@
1
1
  require 'active_record'
2
+ require 'squeel'
2
3
 
3
4
  ActiveRecord::Base.establish_connection(
4
5
  :adapter => 'sqlite3',
@@ -19,6 +20,10 @@ class Person < ActiveRecord::Base
19
20
 
20
21
  has_many :outgoing_messages, :class_name => 'Message', :foreign_key => :author_id
21
22
  has_many :incoming_messages, :class_name => 'Message', :foreign_key => :recipient_id
23
+
24
+ sifter :name_starts_or_ends_with do |value|
25
+ (name =~ "#{value}%") | (name =~ "%#{value}")
26
+ end
22
27
  end
23
28
 
24
29
  class PersonWithNamePrimaryKey < ActiveRecord::Base
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.8.10
4
+ version: 0.9.0
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-03 00:00:00.000000000Z
12
+ date: 2011-09-07 00:00:00.000000000Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: activerecord
16
- requirement: &70152532762100 !ruby/object:Gem::Requirement
16
+ requirement: &70114561715900 !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: *70152532762100
24
+ version_requirements: *70114561715900
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: activesupport
27
- requirement: &70152532761420 !ruby/object:Gem::Requirement
27
+ requirement: &70114561714720 !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: *70152532761420
35
+ version_requirements: *70114561714720
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: polyamorous
38
- requirement: &70152532757160 !ruby/object:Gem::Requirement
38
+ requirement: &70114561713420 !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: *70152532757160
46
+ version_requirements: *70114561713420
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: rspec
49
- requirement: &70152532756300 !ruby/object:Gem::Requirement
49
+ requirement: &70114561712440 !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: *70152532756300
57
+ version_requirements: *70114561712440
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: machinist
60
- requirement: &70152532755220 !ruby/object:Gem::Requirement
60
+ requirement: &70114561710960 !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: *70152532755220
68
+ version_requirements: *70114561710960
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: faker
71
- requirement: &70152532754580 !ruby/object:Gem::Requirement
71
+ requirement: &70114561710220 !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: *70152532754580
79
+ version_requirements: *70114561710220
80
80
  - !ruby/object:Gem::Dependency
81
81
  name: sqlite3
82
- requirement: &70152532753940 !ruby/object:Gem::Requirement
82
+ requirement: &70114561709220 !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: *70152532753940
90
+ version_requirements: *70114561709220
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
@@ -109,14 +109,15 @@ files:
109
109
  - lib/core_ext/symbol.rb
110
110
  - lib/squeel.rb
111
111
  - lib/squeel/adapters/active_record.rb
112
- - lib/squeel/adapters/active_record/3.0/association_preload.rb
112
+ - lib/squeel/adapters/active_record/3.0/association_preload_extensions.rb
113
113
  - lib/squeel/adapters/active_record/3.0/compat.rb
114
114
  - lib/squeel/adapters/active_record/3.0/context.rb
115
- - lib/squeel/adapters/active_record/3.0/relation.rb
115
+ - lib/squeel/adapters/active_record/3.0/relation_extensions.rb
116
+ - lib/squeel/adapters/active_record/base_extensions.rb
116
117
  - lib/squeel/adapters/active_record/context.rb
117
- - lib/squeel/adapters/active_record/join_dependency.rb
118
- - lib/squeel/adapters/active_record/preloader.rb
119
- - lib/squeel/adapters/active_record/relation.rb
118
+ - lib/squeel/adapters/active_record/join_dependency_extensions.rb
119
+ - lib/squeel/adapters/active_record/preloader_extensions.rb
120
+ - lib/squeel/adapters/active_record/relation_extensions.rb
120
121
  - lib/squeel/configuration.rb
121
122
  - lib/squeel/constants.rb
122
123
  - lib/squeel/context.rb
@@ -138,15 +139,16 @@ files:
138
139
  - lib/squeel/nodes/order.rb
139
140
  - lib/squeel/nodes/predicate.rb
140
141
  - lib/squeel/nodes/predicate_operators.rb
142
+ - lib/squeel/nodes/sifter.rb
141
143
  - lib/squeel/nodes/stub.rb
142
144
  - lib/squeel/nodes/unary.rb
143
145
  - lib/squeel/predicate_methods.rb
144
146
  - lib/squeel/version.rb
145
147
  - lib/squeel/visitors.rb
146
148
  - lib/squeel/visitors/attribute_visitor.rb
147
- - lib/squeel/visitors/base.rb
148
149
  - lib/squeel/visitors/predicate_visitor.rb
149
150
  - lib/squeel/visitors/symbol_visitor.rb
151
+ - lib/squeel/visitors/visitor.rb
150
152
  - spec/blueprints/articles.rb
151
153
  - spec/blueprints/comments.rb
152
154
  - spec/blueprints/notes.rb
@@ -156,9 +158,10 @@ files:
156
158
  - spec/core_ext/symbol_spec.rb
157
159
  - spec/helpers/squeel_helper.rb
158
160
  - spec/spec_helper.rb
161
+ - spec/squeel/adapters/active_record/base_extensions_spec.rb
159
162
  - spec/squeel/adapters/active_record/context_spec.rb
160
- - spec/squeel/adapters/active_record/join_dependency_spec.rb
161
- - spec/squeel/adapters/active_record/relation_spec.rb
163
+ - spec/squeel/adapters/active_record/join_dependency_extensions_spec.rb
164
+ - spec/squeel/adapters/active_record/relation_extensions_spec.rb
162
165
  - spec/squeel/core_ext/symbol_spec.rb
163
166
  - spec/squeel/dsl_spec.rb
164
167
  - spec/squeel/nodes/function_spec.rb
@@ -170,6 +173,7 @@ files:
170
173
  - spec/squeel/nodes/order_spec.rb
171
174
  - spec/squeel/nodes/predicate_operators_spec.rb
172
175
  - spec/squeel/nodes/predicate_spec.rb
176
+ - spec/squeel/nodes/sifter_spec.rb
173
177
  - spec/squeel/nodes/stub_spec.rb
174
178
  - spec/squeel/visitors/attribute_visitor_spec.rb
175
179
  - spec/squeel/visitors/predicate_visitor_spec.rb
@@ -223,9 +227,10 @@ test_files:
223
227
  - spec/core_ext/symbol_spec.rb
224
228
  - spec/helpers/squeel_helper.rb
225
229
  - spec/spec_helper.rb
230
+ - spec/squeel/adapters/active_record/base_extensions_spec.rb
226
231
  - spec/squeel/adapters/active_record/context_spec.rb
227
- - spec/squeel/adapters/active_record/join_dependency_spec.rb
228
- - spec/squeel/adapters/active_record/relation_spec.rb
232
+ - spec/squeel/adapters/active_record/join_dependency_extensions_spec.rb
233
+ - spec/squeel/adapters/active_record/relation_extensions_spec.rb
229
234
  - spec/squeel/core_ext/symbol_spec.rb
230
235
  - spec/squeel/dsl_spec.rb
231
236
  - spec/squeel/nodes/function_spec.rb
@@ -237,6 +242,7 @@ test_files:
237
242
  - spec/squeel/nodes/order_spec.rb
238
243
  - spec/squeel/nodes/predicate_operators_spec.rb
239
244
  - spec/squeel/nodes/predicate_spec.rb
245
+ - spec/squeel/nodes/sifter_spec.rb
240
246
  - spec/squeel/nodes/stub_spec.rb
241
247
  - spec/squeel/visitors/attribute_visitor_spec.rb
242
248
  - spec/squeel/visitors/predicate_visitor_spec.rb