ambition 0.3.1 → 0.5.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.
- data/Manifest +41 -48
- data/README +6 -203
- data/ambition.gemspec +111 -0
- data/app_generators/ambition_adapter/USAGE +1 -0
- data/app_generators/ambition_adapter/ambition_adapter_generator.rb +66 -0
- data/app_generators/ambition_adapter/templates/LICENSE +18 -0
- data/app_generators/ambition_adapter/templates/README +6 -0
- data/app_generators/ambition_adapter/templates/Rakefile +31 -0
- data/app_generators/ambition_adapter/templates/lib/base.rb.erb +12 -0
- data/app_generators/ambition_adapter/templates/lib/init.rb.erb +22 -0
- data/app_generators/ambition_adapter/templates/lib/query.rb.erb +52 -0
- data/app_generators/ambition_adapter/templates/lib/select.rb.erb +100 -0
- data/app_generators/ambition_adapter/templates/lib/slice.rb.erb +19 -0
- data/app_generators/ambition_adapter/templates/lib/sort.rb.erb +43 -0
- data/app_generators/ambition_adapter/templates/test/helper.rb.erb +9 -0
- data/app_generators/ambition_adapter/templates/test/select_test.rb.erb +157 -0
- data/app_generators/ambition_adapter/templates/test/slice_test.rb.erb +36 -0
- data/app_generators/ambition_adapter/templates/test/sort_test.rb.erb +53 -0
- data/bin/ambition_adapter +13 -0
- data/lib/ambition.rb +8 -13
- data/lib/ambition/api.rb +42 -35
- data/lib/ambition/context.rb +62 -0
- data/lib/ambition/{proc_to_ruby.rb → core_ext.rb} +13 -0
- data/lib/ambition/enumerable.rb +6 -0
- data/lib/ambition/processors/base.rb +126 -0
- data/lib/ambition/processors/ruby.rb +24 -0
- data/lib/ambition/processors/select.rb +105 -0
- data/lib/ambition/processors/slice.rb +15 -0
- data/lib/ambition/processors/sort.rb +51 -0
- data/test/adapters/exemplar/association_test.rb +34 -0
- data/test/adapters/exemplar/count_test.rb +0 -0
- data/test/adapters/exemplar/detect_test.rb +9 -0
- data/test/adapters/exemplar/enumerable_test.rb +0 -0
- data/test/adapters/exemplar/helper.rb +3 -0
- data/test/adapters/exemplar/index_operator.rb +6 -0
- data/test/adapters/exemplar/reject_test.rb +0 -0
- data/test/adapters/exemplar/select_test.rb +151 -0
- data/test/adapters/exemplar/slice_test.rb +0 -0
- data/test/adapters/exemplar/sort_test.rb +0 -0
- data/test/debug +9 -0
- data/test/helper.rb +2 -52
- metadata +56 -71
- data/Rakefile +0 -64
- data/init.rb +0 -1
- data/lib/ambition/database_statements.rb +0 -31
- data/lib/ambition/processor.rb +0 -123
- data/lib/ambition/query.rb +0 -91
- data/lib/ambition/ruby_processor.rb +0 -22
- data/lib/ambition/select_processor.rb +0 -149
- data/lib/ambition/simple_processor.rb +0 -10
- data/lib/ambition/sort_processor.rb +0 -47
- data/lib/ambition/source.rb +0 -53
- data/test/benchmark.rb +0 -68
- data/test/chaining_test.rb +0 -34
- data/test/console +0 -9
- data/test/count_test.rb +0 -17
- data/test/databases/boot.rb +0 -3
- data/test/databases/database.yml +0 -17
- data/test/databases/fixtures/admin.rb +0 -3
- data/test/databases/fixtures/companies.yml +0 -24
- data/test/databases/fixtures/company.rb +0 -23
- data/test/databases/fixtures/developer.rb +0 -11
- data/test/databases/fixtures/developers_projects.yml +0 -13
- data/test/databases/fixtures/project.rb +0 -4
- data/test/databases/fixtures/projects.yml +0 -7
- data/test/databases/fixtures/replies.yml +0 -20
- data/test/databases/fixtures/reply.rb +0 -5
- data/test/databases/fixtures/topic.rb +0 -19
- data/test/databases/fixtures/topics.yml +0 -32
- data/test/databases/fixtures/user.rb +0 -2
- data/test/databases/fixtures/users.yml +0 -35
- data/test/databases/lib/activerecord_test_connector.rb +0 -65
- data/test/databases/lib/load_fixtures.rb +0 -13
- data/test/databases/lib/schema.rb +0 -41
- data/test/enumerable_test.rb +0 -95
- data/test/join_test.rb +0 -61
- data/test/limit_test.rb +0 -41
- data/test/order_test.rb +0 -52
- data/test/profiler.rb +0 -34
- data/test/ruby_test.rb +0 -9
- data/test/source_test.rb +0 -43
- data/test/types_test.rb +0 -59
- data/test/where_test.rb +0 -245
data/test/limit_test.rb
DELETED
@@ -1,41 +0,0 @@
|
|
1
|
-
require File.dirname(__FILE__) + '/helper'
|
2
|
-
|
3
|
-
context "Limit" do
|
4
|
-
setup do
|
5
|
-
@sql = User.select { |m| m.name == 'jon' }
|
6
|
-
end
|
7
|
-
|
8
|
-
specify "first" do
|
9
|
-
conditions = { :conditions => "users.name = 'jon'", :limit => 1 }
|
10
|
-
User.expects(:find).with(:first, conditions)
|
11
|
-
@sql.first
|
12
|
-
end
|
13
|
-
|
14
|
-
specify "first with argument" do
|
15
|
-
conditions = { :conditions => "users.name = 'jon'", :limit => 5 }
|
16
|
-
User.expects(:find).with(:all, conditions)
|
17
|
-
@sql.first(5).entries
|
18
|
-
end
|
19
|
-
|
20
|
-
specify "[] with two elements" do
|
21
|
-
conditions = { :conditions => "users.name = 'jon'", :limit => 20, :offset => 10 }
|
22
|
-
User.expects(:find).with(:all, conditions)
|
23
|
-
@sql[10, 20].entries
|
24
|
-
|
25
|
-
conditions = { :conditions => "users.name = 'jon'", :limit => 20, :offset => 20 }
|
26
|
-
User.expects(:find).with(:all, conditions)
|
27
|
-
@sql[20, 20].entries
|
28
|
-
end
|
29
|
-
|
30
|
-
specify "slice is an alias of []" do
|
31
|
-
conditions = { :conditions => "users.name = 'jon'", :limit => 20, :offset => 10 }
|
32
|
-
User.expects(:find).with(:all, conditions)
|
33
|
-
@sql.slice(10, 20).entries
|
34
|
-
end
|
35
|
-
|
36
|
-
specify "[] with range" do
|
37
|
-
conditions = { :conditions => "users.name = 'jon'", :limit => 10, :offset => 10 }
|
38
|
-
User.expects(:find).with(:all, conditions)
|
39
|
-
@sql[10..20].entries
|
40
|
-
end
|
41
|
-
end
|
data/test/order_test.rb
DELETED
@@ -1,52 +0,0 @@
|
|
1
|
-
require File.dirname(__FILE__) + '/helper'
|
2
|
-
|
3
|
-
context "Order" do
|
4
|
-
setup do
|
5
|
-
@sql = User.select { |m| m.name == 'jon' }
|
6
|
-
end
|
7
|
-
|
8
|
-
specify "simple order" do
|
9
|
-
string = @sql.sort_by { |m| m.name }.to_sql
|
10
|
-
string.should == "SELECT * FROM users WHERE users.name = 'jon' ORDER BY users.name"
|
11
|
-
end
|
12
|
-
|
13
|
-
specify "simple combined order" do
|
14
|
-
string = @sql.sort_by { |m| [ m.name, m.age ] }.to_sql
|
15
|
-
string.should == "SELECT * FROM users WHERE users.name = 'jon' ORDER BY users.name, users.age"
|
16
|
-
end
|
17
|
-
|
18
|
-
specify "simple combined order with single reverse" do
|
19
|
-
string = @sql.sort_by { |m| [ m.name, -m.age ] }.to_sql
|
20
|
-
string.should == "SELECT * FROM users WHERE users.name = 'jon' ORDER BY users.name, users.age DESC"
|
21
|
-
end
|
22
|
-
|
23
|
-
specify "simple combined order with two reverses" do
|
24
|
-
string = @sql.sort_by { |m| [ -m.name, -m.age ] }.to_sql
|
25
|
-
string.should == "SELECT * FROM users WHERE users.name = 'jon' ORDER BY users.name DESC, users.age DESC"
|
26
|
-
end
|
27
|
-
|
28
|
-
specify "reverse order with -" do
|
29
|
-
string = @sql.sort_by { |m| -m.age }.to_sql
|
30
|
-
string.should == "SELECT * FROM users WHERE users.name = 'jon' ORDER BY users.age DESC"
|
31
|
-
end
|
32
|
-
|
33
|
-
xspecify "reverse order with #reverse" do
|
34
|
-
# TODO: not implemented
|
35
|
-
string = @sql.sort_by { |m| m.age }.reverse.to_sql
|
36
|
-
string.should == "SELECT * FROM users WHERE users.name = 'jon' ORDER BY users.age DESC"
|
37
|
-
end
|
38
|
-
|
39
|
-
specify "random order" do
|
40
|
-
string = @sql.sort_by { rand }.to_sql
|
41
|
-
string.should == "SELECT * FROM users WHERE users.name = 'jon' ORDER BY RAND()"
|
42
|
-
end
|
43
|
-
|
44
|
-
specify "non-existent method to sort by" do
|
45
|
-
should.raise { @sql.sort_by { foo }.to_sql }
|
46
|
-
end
|
47
|
-
|
48
|
-
specify "Symbol#to_proc" do
|
49
|
-
string = User.sort_by(&:name).to_sql
|
50
|
-
string.should == "SELECT * FROM users ORDER BY users.name"
|
51
|
-
end
|
52
|
-
end
|
data/test/profiler.rb
DELETED
@@ -1,34 +0,0 @@
|
|
1
|
-
$:.unshift File.dirname(__FILE__) + '/../lib'
|
2
|
-
require 'ambition'
|
3
|
-
require 'ruby-prof'
|
4
|
-
|
5
|
-
class User < ActiveRecord::Base
|
6
|
-
def self.reflections
|
7
|
-
return @reflections if @reflections
|
8
|
-
@reflections = {}
|
9
|
-
@reflections[:ideas] = Reflection.new(:has_many, 'user_id', :ideas, 'ideas')
|
10
|
-
@reflections[:invites] = Reflection.new(:has_many, 'referrer_id', :invites, 'invites')
|
11
|
-
@reflections[:profile] = Reflection.new(:has_one, 'user_id', :profile, 'profiles')
|
12
|
-
@reflections[:account] = Reflection.new(:belongs_to, 'account_id', :account, 'accounts')
|
13
|
-
@reflections
|
14
|
-
end
|
15
|
-
|
16
|
-
def self.table_name
|
17
|
-
'users'
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
|
-
class Reflection < Struct.new(:macro, :primary_key_name, :name, :table_name)
|
22
|
-
end
|
23
|
-
|
24
|
-
result = RubyProf.profile do
|
25
|
-
1000.times do
|
26
|
-
User.select { |u| (u.id == 20 && u.age > 20) || u.profile.name == 'Jon' }.sort_by { |u| [u.id, -u.name] }.first(20).to_hash
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
|
-
printer = RubyProf::FlatPrinter.new(result)
|
31
|
-
#printer = RubyProf::GraphPrinter.new(result)
|
32
|
-
printer.print(STDOUT, 0)
|
33
|
-
|
34
|
-
puts User.select { |u| (u.id == 20 && u.age > 20) || u.profile.name == 'Jon' }.sort_by { |u| [u.id, -u.name] }.first(20).to_hash.inspect
|
data/test/ruby_test.rb
DELETED
@@ -1,9 +0,0 @@
|
|
1
|
-
require File.dirname(__FILE__) + '/helper'
|
2
|
-
|
3
|
-
context "Inline Ruby" do
|
4
|
-
xspecify "should know what to return" do
|
5
|
-
name = 'David'
|
6
|
-
sql = User.select { |u| name.nil? || u.name == name }.to_s
|
7
|
-
sql.should == "SELECT * FROM users WHERE (users.name = 'David')"
|
8
|
-
end
|
9
|
-
end
|
data/test/source_test.rb
DELETED
@@ -1,43 +0,0 @@
|
|
1
|
-
require File.dirname(__FILE__) + '/helper'
|
2
|
-
require 'ostruct'
|
3
|
-
|
4
|
-
context "Setting the ambition_source" do
|
5
|
-
setup do
|
6
|
-
@users = [
|
7
|
-
OpenStruct.new(:name => 'Chris', :age => 22),
|
8
|
-
OpenStruct.new(:name => 'PJ', :age => 24),
|
9
|
-
OpenStruct.new(:name => 'Kevin', :age => 23),
|
10
|
-
OpenStruct.new(:name => '_why', :age => 65)
|
11
|
-
]
|
12
|
-
User.ambition_source = @users
|
13
|
-
end
|
14
|
-
|
15
|
-
teardown do
|
16
|
-
User.ambition_source = nil
|
17
|
-
end
|
18
|
-
|
19
|
-
specify "should run all selects / detects against that collection" do
|
20
|
-
User.detect { |u| u.name == 'Chris' }.should == @users.first
|
21
|
-
end
|
22
|
-
|
23
|
-
specify "should run all sorts against that collection" do
|
24
|
-
User.sort_by { |u| -u.age }.entries.should == @users.sort_by { |u| -u.age }
|
25
|
-
end
|
26
|
-
|
27
|
-
specify "should chain successfully" do
|
28
|
-
User.select { |u| u.age > 22 }.sort_by { |u| -u.age }.entries.should == [ @users[3], @users[1], @users[2] ]
|
29
|
-
end
|
30
|
-
|
31
|
-
specify "should be able to revert to normal" do
|
32
|
-
block = proc { User.select { |m| m.name == 'PJ' }.first }
|
33
|
-
|
34
|
-
User.expects(:find).never
|
35
|
-
block.call.should == @users[1]
|
36
|
-
|
37
|
-
conditions = { :conditions => "users.name = 'PJ'", :limit => 1 }
|
38
|
-
User.expects(:find).with(:first, conditions)
|
39
|
-
|
40
|
-
User.ambition_source = nil
|
41
|
-
block.call
|
42
|
-
end
|
43
|
-
end
|
data/test/types_test.rb
DELETED
@@ -1,59 +0,0 @@
|
|
1
|
-
require File.dirname(__FILE__) + '/helper'
|
2
|
-
|
3
|
-
##
|
4
|
-
# Once dynamically, once hardcoded
|
5
|
-
context "Different types" do
|
6
|
-
types_hash = {
|
7
|
-
'string' => "'string'",
|
8
|
-
:symbol => "'--- :symbol\n'",
|
9
|
-
1 => '1',
|
10
|
-
1.2 => '1.2',
|
11
|
-
true => '1',
|
12
|
-
false => '0',
|
13
|
-
Time.now => "'#{Time.now.to_s(:db)}'",
|
14
|
-
DateTime.now => "'#{DateTime.now.to_s(:db)}'",
|
15
|
-
Date.today => "'#{Date.today.to_s(:db)}'"
|
16
|
-
}
|
17
|
-
|
18
|
-
types_hash.each do |type, translation|
|
19
|
-
specify "simple using #{type}" do
|
20
|
-
sql = User.select { |m| m.name == type }.to_sql
|
21
|
-
sql.should == "SELECT * FROM users WHERE users.name = #{translation}"
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
|
-
specify "float" do
|
26
|
-
sql = User.select { |m| m.name == 1.2 }.to_sql
|
27
|
-
sql.should == "SELECT * FROM users WHERE users.name = 1.2"
|
28
|
-
end
|
29
|
-
|
30
|
-
specify "integer" do
|
31
|
-
sql = User.select { |m| m.name == 1 }.to_sql
|
32
|
-
sql.should == "SELECT * FROM users WHERE users.name = 1"
|
33
|
-
end
|
34
|
-
|
35
|
-
specify "true" do
|
36
|
-
sql = User.select { |m| m.name == true }.to_sql
|
37
|
-
sql.should == "SELECT * FROM users WHERE users.name = 1"
|
38
|
-
end
|
39
|
-
|
40
|
-
specify "false" do
|
41
|
-
sql = User.select { |m| m.name == false }.to_sql
|
42
|
-
sql.should == "SELECT * FROM users WHERE users.name = 0"
|
43
|
-
end
|
44
|
-
|
45
|
-
specify "nil" do
|
46
|
-
sql = User.select { |m| m.name == nil }.to_sql
|
47
|
-
sql.should == "SELECT * FROM users WHERE users.name IS NULL"
|
48
|
-
end
|
49
|
-
|
50
|
-
specify "not nil" do
|
51
|
-
sql = User.select { |m| m.name != nil }.to_sql
|
52
|
-
sql.should == "SELECT * FROM users WHERE users.name IS NOT NULL"
|
53
|
-
end
|
54
|
-
|
55
|
-
specify "Time" do
|
56
|
-
sql = User.select { |m| m.name == Time.now }.to_sql
|
57
|
-
sql.should == "SELECT * FROM users WHERE users.name = '#{Time.now.to_s(:db)}'"
|
58
|
-
end
|
59
|
-
end
|
data/test/where_test.rb
DELETED
@@ -1,245 +0,0 @@
|
|
1
|
-
require File.dirname(__FILE__) + '/helper'
|
2
|
-
|
3
|
-
context "Where (using select)" do
|
4
|
-
specify "simple ==" do
|
5
|
-
sql = User.select { |m| m.name == 'jon' }.to_sql
|
6
|
-
sql.should == "SELECT * FROM users WHERE users.name = 'jon'"
|
7
|
-
end
|
8
|
-
|
9
|
-
specify "simple !=" do
|
10
|
-
sql = User.select { |m| m.name != 'jon' }.to_sql
|
11
|
-
sql.should == "SELECT * FROM users WHERE users.name <> 'jon'"
|
12
|
-
end
|
13
|
-
|
14
|
-
specify "simple == && ==" do
|
15
|
-
sql = User.select { |m| m.name == 'jon' && m.age == 21 }.to_sql
|
16
|
-
sql.should == "SELECT * FROM users WHERE (users.name = 'jon' AND users.age = 21)"
|
17
|
-
end
|
18
|
-
|
19
|
-
specify "simple == || ==" do
|
20
|
-
sql = User.select { |m| m.name == 'jon' || m.age == 21 }.to_sql
|
21
|
-
sql.should == "SELECT * FROM users WHERE (users.name = 'jon' OR users.age = 21)"
|
22
|
-
end
|
23
|
-
|
24
|
-
specify "mixed && and ||" do
|
25
|
-
sql = User.select { |m| m.name == 'jon' || m.age == 21 && m.password == 'pass' }.to_sql
|
26
|
-
sql.should == "SELECT * FROM users WHERE (users.name = 'jon' OR (users.age = 21 AND users.password = 'pass'))"
|
27
|
-
end
|
28
|
-
|
29
|
-
specify "grouped && and ||" do
|
30
|
-
sql = User.select { |m| (m.name == 'jon' || m.name == 'rick') && m.age == 21 }.to_sql
|
31
|
-
sql.should == "SELECT * FROM users WHERE ((users.name = 'jon' OR users.name = 'rick') AND users.age = 21)"
|
32
|
-
end
|
33
|
-
|
34
|
-
specify "simple >/<" do
|
35
|
-
sql = User.select { |m| m.age > 21 }.to_sql
|
36
|
-
sql.should == "SELECT * FROM users WHERE users.age > 21"
|
37
|
-
|
38
|
-
sql = User.select { |m| m.age >= 21 }.to_sql
|
39
|
-
sql.should == "SELECT * FROM users WHERE users.age >= 21"
|
40
|
-
|
41
|
-
sql = User.select { |m| m.age < 21 }.to_sql
|
42
|
-
sql.should == "SELECT * FROM users WHERE users.age < 21"
|
43
|
-
end
|
44
|
-
|
45
|
-
specify "array.include? item" do
|
46
|
-
sql = User.select { |m| [1, 2, 3, 4].include? m.id }.to_sql
|
47
|
-
sql.should == "SELECT * FROM users WHERE users.id IN (1, 2, 3, 4)"
|
48
|
-
end
|
49
|
-
|
50
|
-
specify "variable'd array.include? item" do
|
51
|
-
array = [1, 2, 3, 4]
|
52
|
-
sql = User.select { |m| array.include? m.id }.to_sql
|
53
|
-
sql.should == "SELECT * FROM users WHERE users.id IN (1, 2, 3, 4)"
|
54
|
-
end
|
55
|
-
|
56
|
-
specify "simple == with variables" do
|
57
|
-
me = 'chris'
|
58
|
-
sql = User.select { |m| m.name == me }.to_sql
|
59
|
-
sql.should == "SELECT * FROM users WHERE users.name = '#{me}'"
|
60
|
-
end
|
61
|
-
|
62
|
-
specify "simple == with method arguments" do
|
63
|
-
def test_it(name)
|
64
|
-
sql = User.select { |m| m.name == name }.to_sql
|
65
|
-
sql.should == "SELECT * FROM users WHERE users.name = '#{name}'"
|
66
|
-
end
|
67
|
-
|
68
|
-
test_it('chris')
|
69
|
-
end
|
70
|
-
|
71
|
-
specify "simple == with instance variables" do
|
72
|
-
@me = 'chris'
|
73
|
-
sql = User.select { |m| m.name == @me }.to_sql
|
74
|
-
sql.should == "SELECT * FROM users WHERE users.name = '#{@me}'"
|
75
|
-
end
|
76
|
-
|
77
|
-
specify "simple == with instance variable method call" do
|
78
|
-
require 'ostruct'
|
79
|
-
@person = OpenStruct.new(:name => 'chris')
|
80
|
-
|
81
|
-
sql = User.select { |m| m.name == @person.name }.to_sql
|
82
|
-
sql.should == "SELECT * FROM users WHERE users.name = '#{@person.name}'"
|
83
|
-
end
|
84
|
-
|
85
|
-
specify "simple == with global variables" do
|
86
|
-
$my_name = 'boston'
|
87
|
-
sql = User.select { |m| m.name == $my_name }.to_sql
|
88
|
-
sql.should == "SELECT * FROM users WHERE users.name = '#{$my_name}'"
|
89
|
-
end
|
90
|
-
|
91
|
-
specify "simple == with method call" do
|
92
|
-
def band
|
93
|
-
'megadeth'
|
94
|
-
end
|
95
|
-
|
96
|
-
sql = User.select { |m| m.name == band }.to_sql
|
97
|
-
sql.should == "SELECT * FROM users WHERE users.name = '#{band}'"
|
98
|
-
end
|
99
|
-
|
100
|
-
specify "simple =~ with string" do
|
101
|
-
sql = User.select { |m| m.name =~ 'chris' }.to_sql
|
102
|
-
sql.should == "SELECT * FROM users WHERE users.name LIKE 'chris'"
|
103
|
-
|
104
|
-
sql = User.select { |m| m.name =~ 'chri%' }.to_sql
|
105
|
-
sql.should == "SELECT * FROM users WHERE users.name LIKE 'chri%'"
|
106
|
-
end
|
107
|
-
|
108
|
-
specify "simple !~ with string" do
|
109
|
-
sql = User.select { |m| m.name !~ 'chris' }.to_sql
|
110
|
-
sql.should == "SELECT * FROM users WHERE users.name NOT LIKE 'chris'"
|
111
|
-
|
112
|
-
sql = User.select { |m| !(m.name =~ 'chris') }.to_sql
|
113
|
-
sql.should == "SELECT * FROM users WHERE users.name NOT LIKE 'chris'"
|
114
|
-
end
|
115
|
-
|
116
|
-
specify "simple =~ with regexp" do
|
117
|
-
sql = User.select { |m| m.name =~ /chris/ }.to_sql
|
118
|
-
sql.should == "SELECT * FROM users WHERE users.name REGEXP 'chris'"
|
119
|
-
end
|
120
|
-
|
121
|
-
specify "simple =~ with regexp flags" do
|
122
|
-
sql = User.select { |m| m.name =~ /chris/i }.to_sql
|
123
|
-
sql.should == "SELECT * FROM users WHERE users.name REGEXP 'chris'"
|
124
|
-
end
|
125
|
-
|
126
|
-
specify "simple LOWER()" do
|
127
|
-
sql = User.select { |m| m.name.downcase =~ 'chris%' }.to_sql
|
128
|
-
sql.should == "SELECT * FROM users WHERE LOWER(users.name) LIKE 'chris%'"
|
129
|
-
end
|
130
|
-
|
131
|
-
specify "simple UPPER()" do
|
132
|
-
sql = User.select { |m| m.name.upcase =~ 'chris%' }.to_sql
|
133
|
-
sql.should == "SELECT * FROM users WHERE UPPER(users.name) LIKE 'chris%'"
|
134
|
-
end
|
135
|
-
|
136
|
-
specify "undefined equality symbol" do
|
137
|
-
should.raise { User.select { |m| m.name =* /chris/ }.to_sql }
|
138
|
-
end
|
139
|
-
|
140
|
-
specify "block variable / assigning variable conflict" do
|
141
|
-
m = User.select { |m| m.name == 'chris' }.to_sql
|
142
|
-
m.should == "SELECT * FROM users WHERE users.name = 'chris'"
|
143
|
-
end
|
144
|
-
|
145
|
-
specify "simple == with inline ruby" do
|
146
|
-
sql = User.select { |m| m.created_at == 2.days.ago.to_s(:db) }.to_sql
|
147
|
-
sql.should == "SELECT * FROM users WHERE users.created_at = '#{2.days.ago.to_s(:db)}'"
|
148
|
-
end
|
149
|
-
|
150
|
-
specify "inspect" do
|
151
|
-
User.select { |u| u.name }.inspect.should.match %r(call #to_sql or #to_hash)
|
152
|
-
end
|
153
|
-
end
|
154
|
-
|
155
|
-
context "Where (using detect)" do
|
156
|
-
specify "simple ==" do
|
157
|
-
User.expects(:select).returns(mock(:first => true))
|
158
|
-
User.detect { |m| m.name == 'chris' }
|
159
|
-
end
|
160
|
-
|
161
|
-
specify "nothing found" do
|
162
|
-
User.expects(:select).returns(mock(:first => nil))
|
163
|
-
User.detect { |m| m.name == 'chris' }.should.be.nil
|
164
|
-
end
|
165
|
-
end
|
166
|
-
|
167
|
-
context "Where (using [])" do
|
168
|
-
specify "finds a single row" do
|
169
|
-
User.expects(:find).with(1)
|
170
|
-
User[1]
|
171
|
-
end
|
172
|
-
end
|
173
|
-
|
174
|
-
context "PostgreSQL specific" do
|
175
|
-
setup do
|
176
|
-
ActiveRecord::Base.connection = ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.new 'fake_connection', 'fake_logger'
|
177
|
-
end
|
178
|
-
|
179
|
-
teardown do
|
180
|
-
ActiveRecord::Base.remove_connection
|
181
|
-
end
|
182
|
-
|
183
|
-
specify "quoting of column name" do
|
184
|
-
me = 'chris'
|
185
|
-
sql = User.select { |m| m.name == me }.to_sql
|
186
|
-
sql.should == %(SELECT * FROM users WHERE users."name" = '#{me}')
|
187
|
-
end
|
188
|
-
|
189
|
-
specify "simple =~ with regexp" do
|
190
|
-
sql = User.select { |m| m.name =~ /chris/ }.to_sql
|
191
|
-
sql.should == %(SELECT * FROM users WHERE users."name" ~ 'chris')
|
192
|
-
end
|
193
|
-
|
194
|
-
specify "insensitive =~" do
|
195
|
-
sql = User.select { |m| m.name =~ /chris/i }.to_sql
|
196
|
-
sql.should == %(SELECT * FROM users WHERE users."name" ~* 'chris')
|
197
|
-
end
|
198
|
-
|
199
|
-
specify "negated =~" do
|
200
|
-
sql = User.select { |m| m.name !~ /chris/ }.to_sql
|
201
|
-
sql.should == %(SELECT * FROM users WHERE users."name" !~ 'chris')
|
202
|
-
end
|
203
|
-
|
204
|
-
specify "negated insensitive =~" do
|
205
|
-
sql = User.select { |m| m.name !~ /chris/i }.to_sql
|
206
|
-
sql.should == %(SELECT * FROM users WHERE users."name" !~* 'chris')
|
207
|
-
end
|
208
|
-
end
|
209
|
-
|
210
|
-
context "MySQL specific" do
|
211
|
-
setup do
|
212
|
-
ActiveRecord::Base.connection = ActiveRecord::ConnectionAdapters::MysqlAdapter.new('connection', 'logger', 'options', 'config')
|
213
|
-
end
|
214
|
-
|
215
|
-
teardown do
|
216
|
-
ActiveRecord::Base.remove_connection
|
217
|
-
end
|
218
|
-
|
219
|
-
specify "quoting of column name" do
|
220
|
-
me = 'chris'
|
221
|
-
sql = User.select { |m| m.name == me }.to_sql
|
222
|
-
sql.should == "SELECT * FROM users WHERE users.`name` = '#{me}'"
|
223
|
-
end
|
224
|
-
|
225
|
-
specify "simple =~ with regexp" do
|
226
|
-
sql = User.select { |m| m.name =~ /chris/ }.to_sql
|
227
|
-
sql.should == "SELECT * FROM users WHERE users.`name` REGEXP 'chris'"
|
228
|
-
end
|
229
|
-
end
|
230
|
-
|
231
|
-
context "Adapter without overrides" do
|
232
|
-
setup do
|
233
|
-
ActiveRecord::Base.connection = ActiveRecord::ConnectionAdapters::FakeAdapter.new('connection', 'logger')
|
234
|
-
end
|
235
|
-
|
236
|
-
teardown do
|
237
|
-
ActiveRecord::Base.remove_connection
|
238
|
-
end
|
239
|
-
|
240
|
-
specify "quoting of column name" do
|
241
|
-
me = 'chris'
|
242
|
-
sql = User.select { |m| m.name == me }.to_sql
|
243
|
-
sql.should == "SELECT * FROM users WHERE users.name = '#{me}'"
|
244
|
-
end
|
245
|
-
end
|