ambition 0.1.2 → 0.1.3
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/README +17 -5
- data/Rakefile +1 -1
- data/lib/ambition/enumerable.rb +17 -0
- data/lib/ambition/limit.rb +1 -0
- data/test/constructive_test.rb +16 -0
- data/test/destructive_test.rb +21 -0
- data/test/enumerable_test.rb +44 -0
- data/test/limit_test.rb +6 -0
- data/test/where_test.rb +4 -0
- metadata +3 -1
data/README
CHANGED
@@ -34,10 +34,13 @@ Basically, you write your SQL in Ruby. No, not in Ruby. As Ruby.
|
|
34
34
|
|
35
35
|
And that's it.
|
36
36
|
|
37
|
-
The key is
|
38
|
-
|
39
|
-
|
40
|
-
|
37
|
+
The key is that queries arent actually run until the data they represent is
|
38
|
+
requested. Usually this is done with what I call a kicker method. You can call them
|
39
|
+
that, too.
|
40
|
+
|
41
|
+
Kicker methods are guys like +detect+, +each+, +each_with_index+, +map+, +entries+,
|
42
|
+
+to_a+, and +first+ (with no argument). Methods like +select+, +sort_by+, and +first+
|
43
|
+
(with an argument) are not kicker methods and return a +Query+ object without running any SQL.
|
41
44
|
|
42
45
|
Our +Query+ object has two useful methods: +to_sql+ and +to_hash+. With these,
|
43
46
|
we can check out what exactly we're building. Not everyone has +to_sql+,
|
@@ -127,7 +130,7 @@ still query through ActiveRecord just fine.
|
|
127
130
|
User.detect { |m| m.name == 'chris' }
|
128
131
|
"SELECT * FROM users WHERE users.`name` = 'chris' LIMIT 1"
|
129
132
|
|
130
|
-
== LIMITs -- first, first(x), [offset, limit], [range]
|
133
|
+
== LIMITs -- first, first(x), [offset, limit], [range], slice
|
131
134
|
|
132
135
|
User.select { |m| m.name == 'jon' }.first
|
133
136
|
"SELECT * FROM users WHERE users.`name` = 'jon' LIMIT 1"
|
@@ -173,6 +176,15 @@ still query through ActiveRecord just fine.
|
|
173
176
|
>> User.select { |m| m.name == 'jon' }.size
|
174
177
|
=> 21
|
175
178
|
|
179
|
+
== Other Enumerables
|
180
|
+
|
181
|
+
These methods perform COUNT() operations rather than loading your array into memory. They're all
|
182
|
+
kickers.
|
183
|
+
|
184
|
+
User.any? { |m| m.name == 'jon' }
|
185
|
+
User.all? { |m| m.name == 'jon' }
|
186
|
+
User.select { |m| m.name == 'jon' }.empty?
|
187
|
+
|
176
188
|
== SELECT * FROM bugs
|
177
189
|
|
178
190
|
Found a bug? Sweet. Add it at the Lighthouse: http://err.lighthouseapp.com/projects/466-plugins/tickets/new
|
data/Rakefile
CHANGED
@@ -8,7 +8,7 @@ begin
|
|
8
8
|
ENV['RUBY_FLAGS'] = ""
|
9
9
|
require 'echoe'
|
10
10
|
|
11
|
-
Echoe.new('ambition', '0.1.
|
11
|
+
Echoe.new('ambition', '0.1.3') do |p|
|
12
12
|
p.rubyforge_name = 'err'
|
13
13
|
p.summary = "Ambition builds SQL from plain jane Ruby."
|
14
14
|
p.description = "Ambition builds SQL from plain jane Ruby."
|
data/lib/ambition/enumerable.rb
CHANGED
@@ -5,5 +5,22 @@ module Ambition
|
|
5
5
|
def each(&block)
|
6
6
|
find(:all, query_context.to_hash).each(&block)
|
7
7
|
end
|
8
|
+
|
9
|
+
def any?(&block)
|
10
|
+
select(&block).size > 0
|
11
|
+
end
|
12
|
+
|
13
|
+
def all?(&block)
|
14
|
+
size == select(&block).size
|
15
|
+
end
|
16
|
+
|
17
|
+
def empty?
|
18
|
+
size.zero?
|
19
|
+
end
|
20
|
+
|
21
|
+
def entries
|
22
|
+
find(:all, query_context.to_hash)
|
23
|
+
end
|
24
|
+
alias_method :to_a, :entries
|
8
25
|
end
|
9
26
|
end
|
data/lib/ambition/limit.rb
CHANGED
@@ -0,0 +1,21 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/helper'
|
2
|
+
|
3
|
+
context "Destructive" do
|
4
|
+
xspecify "clear" do
|
5
|
+
end
|
6
|
+
|
7
|
+
xspecify "delete" do
|
8
|
+
end
|
9
|
+
|
10
|
+
xspecify "delete_if" do
|
11
|
+
end
|
12
|
+
|
13
|
+
xspecify "<<" do
|
14
|
+
end
|
15
|
+
|
16
|
+
xspecify "concat" do
|
17
|
+
end
|
18
|
+
|
19
|
+
xspecify "delete_at" do
|
20
|
+
end
|
21
|
+
end
|
data/test/enumerable_test.rb
CHANGED
@@ -48,4 +48,48 @@ context "Enumerable Methods" do
|
|
48
48
|
puts "#{i}: #{user.name}"
|
49
49
|
end
|
50
50
|
end
|
51
|
+
|
52
|
+
specify "any?" do
|
53
|
+
User.expects(:count).with(:conditions => "users.`age` > 21").returns(1)
|
54
|
+
User.any? { |u| u.age > 21 }.should == true
|
55
|
+
end
|
56
|
+
|
57
|
+
specify "all?" do
|
58
|
+
User.expects(:count).at_least_once.returns(10, 20)
|
59
|
+
User.all? { |u| u.age > 21 }.should == false
|
60
|
+
|
61
|
+
User.expects(:count).at_least_once.returns(10, 10)
|
62
|
+
User.all? { |u| u.age > 21 }.should == true
|
63
|
+
end
|
64
|
+
|
65
|
+
specify "empty?" do
|
66
|
+
User.expects(:count).with(:conditions => "users.`age` > 21").returns(1)
|
67
|
+
User.select { |u| u.age > 21 }.empty?.should.equal false
|
68
|
+
|
69
|
+
User.expects(:count).with(:conditions => "users.`age` > 21").returns(0)
|
70
|
+
User.select { |u| u.age > 21 }.empty?.should.equal true
|
71
|
+
end
|
72
|
+
|
73
|
+
specify "entries" do
|
74
|
+
User.expects(:find).with(:all, {})
|
75
|
+
User.entries
|
76
|
+
|
77
|
+
hash = { :conditions => "users.`age` = 21" }
|
78
|
+
User.expects(:find).with(:all, hash).returns([])
|
79
|
+
User.select { |m| m.age == 21 }.entries
|
80
|
+
end
|
81
|
+
|
82
|
+
specify "to_a" do
|
83
|
+
User.expects(:find).with(:all, {})
|
84
|
+
User.to_a
|
85
|
+
end
|
86
|
+
|
87
|
+
xspecify "each_slice" do
|
88
|
+
end
|
89
|
+
|
90
|
+
xspecify "max" do
|
91
|
+
end
|
92
|
+
|
93
|
+
xspecify "min" do
|
94
|
+
end
|
51
95
|
end
|
data/test/limit_test.rb
CHANGED
@@ -29,6 +29,12 @@ context "Limit" do
|
|
29
29
|
@sql[10, 20]
|
30
30
|
end
|
31
31
|
|
32
|
+
specify "slice is an alias of []" do
|
33
|
+
conditions = { :conditions => "users.`name` = 'jon'", :limit => '10, 20' }
|
34
|
+
User.expects(:find).with(:all, conditions)
|
35
|
+
@sql.slice(10, 20)
|
36
|
+
end
|
37
|
+
|
32
38
|
specify "[] with range" do
|
33
39
|
conditions = { :conditions => "users.`name` = 'jon'", :limit => '10, 10' }
|
34
40
|
User.expects(:find).with(:all, conditions)
|
data/test/where_test.rb
CHANGED
@@ -122,6 +122,10 @@ context "Where (using select)" do
|
|
122
122
|
sql = User.select { |m| m.created_at == 2.days.ago.to_s(:db) }.to_sql
|
123
123
|
sql.should == "SELECT * FROM users WHERE users.`created_at` = #{2.days.ago.to_s(:db)}"
|
124
124
|
end
|
125
|
+
|
126
|
+
specify "inspect" do
|
127
|
+
User.select { |u| u.name }.inspect.should.match %r(call #to_sql or #to_hash)
|
128
|
+
end
|
125
129
|
end
|
126
130
|
|
127
131
|
context "Where (using detect)" do
|
metadata
CHANGED
@@ -3,7 +3,7 @@ rubygems_version: 0.9.0
|
|
3
3
|
specification_version: 1
|
4
4
|
name: ambition
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 0.1.
|
6
|
+
version: 0.1.3
|
7
7
|
date: 2007-08-30 00:00:00 -07:00
|
8
8
|
summary: Ambition builds SQL from plain jane Ruby.
|
9
9
|
require_paths:
|
@@ -54,7 +54,9 @@ files:
|
|
54
54
|
- ./Manifest
|
55
55
|
test_files:
|
56
56
|
- test/chaining_test.rb
|
57
|
+
- test/constructive_test.rb
|
57
58
|
- test/count_test.rb
|
59
|
+
- test/destructive_test.rb
|
58
60
|
- test/enumerable_test.rb
|
59
61
|
- test/join_test.rb
|
60
62
|
- test/limit_test.rb
|