arel 2.0.1 → 2.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (63) hide show
  1. data/.autotest +26 -0
  2. data/History.txt +18 -0
  3. data/Manifest.txt +31 -30
  4. data/README.markdown +7 -99
  5. data/Rakefile +3 -2
  6. data/arel.gemspec +18 -11
  7. data/lib/arel.rb +2 -1
  8. data/lib/arel/attributes/attribute.rb +1 -174
  9. data/lib/arel/crud.rb +2 -2
  10. data/lib/arel/delete_manager.rb +4 -4
  11. data/lib/arel/insert_manager.rb +8 -8
  12. data/lib/arel/nodes/exists.rb +2 -6
  13. data/lib/arel/nodes/sql_literal.rb +1 -0
  14. data/lib/arel/predications.rb +177 -0
  15. data/lib/arel/select_manager.rb +17 -11
  16. data/lib/arel/table.rb +4 -0
  17. data/lib/arel/tree_manager.rb +4 -3
  18. data/lib/arel/update_manager.rb +8 -8
  19. data/lib/arel/visitors.rb +4 -0
  20. data/lib/arel/visitors/dot.rb +3 -3
  21. data/lib/arel/visitors/join_sql.rb +2 -0
  22. data/lib/arel/visitors/mysql.rb +14 -0
  23. data/lib/arel/visitors/oracle.rb +31 -1
  24. data/lib/arel/visitors/order_clauses.rb +2 -0
  25. data/lib/arel/visitors/sqlite.rb +11 -0
  26. data/lib/arel/visitors/to_sql.rb +8 -11
  27. data/lib/arel/visitors/visitor.rb +19 -0
  28. data/{spec/attributes/attribute_spec.rb → test/attributes/test_attribute.rb} +84 -84
  29. data/test/helper.rb +13 -0
  30. data/{spec/nodes/count_spec.rb → test/nodes/test_count.rb} +3 -3
  31. data/{spec/nodes/delete_statement_spec.rb → test/nodes/test_delete_statement.rb} +3 -4
  32. data/{spec/nodes/equality_spec.rb → test/nodes/test_equality.rb} +10 -8
  33. data/{spec/nodes/insert_statement_spec.rb → test/nodes/test_insert_statement.rb} +6 -6
  34. data/{spec/nodes/or_spec.rb → test/nodes/test_or.rb} +6 -4
  35. data/test/nodes/test_select_core.rb +22 -0
  36. data/{spec/nodes/select_statement_spec.rb → test/nodes/test_select_statement.rb} +3 -4
  37. data/test/nodes/test_sql_literal.rb +52 -0
  38. data/{spec/nodes/sum_spec.rb → test/nodes/test_sum.rb} +2 -2
  39. data/{spec/nodes/update_statement_spec.rb → test/nodes/test_update_statement.rb} +6 -6
  40. data/{spec → test}/support/fake_record.rb +4 -2
  41. data/{spec/activerecord_compat_spec.rb → test/test_activerecord_compat.rb} +3 -3
  42. data/{spec/attributes_spec.rb → test/test_attributes.rb} +7 -7
  43. data/{spec/crud_spec.rb → test/test_crud.rb} +4 -4
  44. data/{spec/delete_manager_spec.rb → test/test_delete_manager.rb} +5 -16
  45. data/{spec/insert_manager_spec.rb → test/test_insert_manager.rb} +15 -31
  46. data/{spec/select_manager_spec.rb → test/test_select_manager.rb} +95 -77
  47. data/{spec/table_spec.rb → test/test_table.rb} +38 -32
  48. data/{spec/update_manager_spec.rb → test/test_update_manager.rb} +9 -21
  49. data/{spec/visitors/join_sql_spec.rb → test/visitors/test_join_sql.rb} +3 -3
  50. data/test/visitors/test_mysql.rb +27 -0
  51. data/{spec/visitors/oracle_spec.rb → test/visitors/test_oracle.rb} +26 -10
  52. data/{spec/visitors/postgres_spec.rb → test/visitors/test_postgres.rb} +2 -2
  53. data/test/visitors/test_sqlite.rb +18 -0
  54. data/{spec/visitors/to_sql_spec.rb → test/visitors/test_to_sql.rb} +25 -18
  55. metadata +101 -43
  56. data/spec/nodes/select_core_spec.rb +0 -21
  57. data/spec/nodes/sql_literal_spec.rb +0 -26
  58. data/spec/spec.opts +0 -3
  59. data/spec/spec_helper.rb +0 -18
  60. data/spec/support/check.rb +0 -6
  61. data/spec/support/matchers.rb +0 -4
  62. data/spec/support/matchers/be_like.rb +0 -24
  63. data/spec/support/shared/tree_manager_shared.rb +0 -9
@@ -0,0 +1,18 @@
1
+ require 'helper'
2
+
3
+ module Arel
4
+ module Visitors
5
+ describe 'the sqlite visitor' do
6
+ before do
7
+ @visitor = SQLite.new Table.engine
8
+ end
9
+
10
+ it 'defaults limit to -1' do
11
+ stmt = Nodes::SelectStatement.new
12
+ stmt.offset = Nodes::Offset.new(1)
13
+ sql = @visitor.accept(stmt)
14
+ sql.must_be_like "SELECT LIMIT -1 OFFSET 1"
15
+ end
16
+ end
17
+ end
18
+ end
@@ -1,4 +1,4 @@
1
- require 'spec_helper'
1
+ require 'helper'
2
2
 
3
3
  module Arel
4
4
  module Visitors
@@ -11,13 +11,13 @@ module Arel
11
11
  describe 'equality' do
12
12
  it 'should handle false' do
13
13
  sql = @visitor.accept Nodes::Equality.new(false, false)
14
- sql.should be_like %{ 'f' = 'f' }
14
+ sql.must_be_like %{ 'f' = 'f' }
15
15
  end
16
16
 
17
17
  it 'should use the column to quote' do
18
18
  table = Table.new(:users)
19
19
  sql = @visitor.accept Nodes::Equality.new(table[:id], '1-fooo')
20
- sql.should be_like %{ "users"."id" = 1 }
20
+ sql.must_be_like %{ "users"."id" = 1 }
21
21
  end
22
22
  end
23
23
 
@@ -29,6 +29,10 @@ module Arel
29
29
  @visitor.accept 2.14
30
30
  end
31
31
 
32
+ it "should visit_Bignum" do
33
+ @visitor.accept 8787878092
34
+ end
35
+
32
36
  it "should visit_Hash" do
33
37
  @visitor.accept({:a => 1})
34
38
  end
@@ -41,16 +45,20 @@ module Arel
41
45
  @visitor.accept Date.today
42
46
  end
43
47
 
48
+ it "should visit_NilClass" do
49
+ @visitor.accept(nil).must_be_like "NULL"
50
+ end
51
+
44
52
  it "should visit_Arel_Nodes_And" do
45
53
  node = Nodes::And.new @attr.eq(10), @attr.eq(11)
46
- @visitor.accept(node).should be_like %{
54
+ @visitor.accept(node).must_be_like %{
47
55
  "users"."id" = 10 AND "users"."id" = 11
48
56
  }
49
57
  end
50
58
 
51
59
  it "should visit_Arel_Nodes_Or" do
52
60
  node = Nodes::Or.new @attr.eq(10), @attr.eq(11)
53
- @visitor.accept(node).should be_like %{
61
+ @visitor.accept(node).must_be_like %{
54
62
  "users"."id" = 10 OR "users"."id" = 11
55
63
  }
56
64
  end
@@ -61,15 +69,14 @@ module Arel
61
69
  end
62
70
 
63
71
  it "should visit_TrueClass" do
64
- test = @attr.eq(true)
65
- test.left.column.type = :boolean
66
- @visitor.accept(test).should be_like %{ "users"."id" = 't' }
72
+ test = Table.new(:users)[:bool].eq(true)
73
+ @visitor.accept(test).must_be_like %{ "users"."bool" = 't' }
67
74
  end
68
75
 
69
76
  describe "Nodes::Ordering" do
70
77
  it "should know how to visit" do
71
78
  node = @attr.desc
72
- @visitor.accept(node).should be_like %{
79
+ @visitor.accept(node).must_be_like %{
73
80
  "users"."id" DESC
74
81
  }
75
82
  end
@@ -78,33 +85,34 @@ module Arel
78
85
  describe "Nodes::In" do
79
86
  it "should know how to visit" do
80
87
  node = @attr.in [1, 2, 3]
81
- @visitor.accept(node).should be_like %{
88
+ @visitor.accept(node).must_be_like %{
82
89
  "users"."id" IN (1, 2, 3)
83
90
  }
84
91
  end
85
92
 
86
93
  it "should turn empty right to NULL" do
87
94
  node = @attr.in []
88
- @visitor.accept(node).should be_like %{
95
+ @visitor.accept(node).must_be_like %{
89
96
  "users"."id" IN (NULL)
90
97
  }
91
98
  end
92
99
 
93
100
  it 'can handle two dot ranges' do
94
101
  node = @attr.in 1..3
95
- @visitor.accept(node).should be_like %{
102
+ @visitor.accept(node).must_be_like %{
96
103
  "users"."id" BETWEEN 1 AND 3
97
104
  }
98
105
  end
99
106
 
100
107
  it 'can handle three dot ranges' do
101
108
  node = @attr.in 1...3
102
- @visitor.accept(node).should be_like %{
109
+ @visitor.accept(node).must_be_like %{
103
110
  "users"."id" >= 1 AND "users"."id" < 3
104
111
  }
105
112
  end
106
113
 
107
114
  it 'uses the same column for escaping values' do
115
+ @attr = Table.new(:users)[:name]
108
116
  visitor = Class.new(ToSql) do
109
117
  attr_accessor :expected
110
118
 
@@ -116,16 +124,15 @@ module Arel
116
124
  in_node = Nodes::In.new @attr, %w{ a b c }
117
125
  visitor = visitor.new(Table.engine)
118
126
  visitor.expected = @attr.column
119
- lambda { visitor.accept(in_node) }.should_not raise_error
127
+ visitor.accept(in_node).must_equal %("users"."name" IN ('a', 'b', 'c'))
120
128
  end
121
129
  end
122
130
 
123
131
  describe 'Equality' do
124
132
  it "should escape strings" do
125
- test = @attr.eq 'Aaron Patterson'
126
- test.left.column.type = :string
127
- @visitor.accept(test).should be_like %{
128
- "users"."id" = 'Aaron Patterson'
133
+ test = Table.new(:users)[:name].eq 'Aaron Patterson'
134
+ @visitor.accept(test).must_be_like %{
135
+ "users"."name" = 'Aaron Patterson'
129
136
  }
130
137
  end
131
138
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: arel
3
3
  version: !ruby/object:Gem::Version
4
- hash: 13
4
+ hash: 11
5
5
  prerelease: false
6
6
  segments:
7
7
  - 2
8
8
  - 0
9
- - 1
10
- version: 2.0.1
9
+ - 2
10
+ version: 2.0.2
11
11
  platform: ruby
12
12
  authors:
13
13
  - Aaron Patterson
@@ -18,7 +18,7 @@ autorequire:
18
18
  bindir: bin
19
19
  cert_chain: []
20
20
 
21
- date: 2010-10-13 00:00:00 -07:00
21
+ date: 2010-11-11 00:00:00 -06:00
22
22
  default_executable:
23
23
  dependencies:
24
24
  - !ruby/object:Gem::Dependency
@@ -38,25 +38,58 @@ dependencies:
38
38
  type: :development
39
39
  version_requirements: *id001
40
40
  - !ruby/object:Gem::Dependency
41
- name: rspec
41
+ name: minitest
42
42
  prerelease: false
43
43
  requirement: &id002 !ruby/object:Gem::Requirement
44
44
  none: false
45
45
  requirements:
46
- - - ~>
46
+ - - ">="
47
47
  - !ruby/object:Gem::Version
48
- hash: 27
48
+ hash: 31098209
49
49
  segments:
50
- - 1
51
- - 3
50
+ - 2
52
51
  - 0
53
- version: 1.3.0
52
+ - 0
53
+ - beta
54
+ version: 2.0.0.beta
54
55
  type: :development
55
56
  version_requirements: *id002
56
57
  - !ruby/object:Gem::Dependency
57
58
  name: hoe
58
59
  prerelease: false
59
60
  requirement: &id003 !ruby/object:Gem::Requirement
61
+ none: false
62
+ requirements:
63
+ - - ">="
64
+ - !ruby/object:Gem::Version
65
+ hash: 11
66
+ segments:
67
+ - 2
68
+ - 1
69
+ - 0
70
+ version: 2.1.0
71
+ type: :development
72
+ version_requirements: *id003
73
+ - !ruby/object:Gem::Dependency
74
+ name: minitest
75
+ prerelease: false
76
+ requirement: &id004 !ruby/object:Gem::Requirement
77
+ none: false
78
+ requirements:
79
+ - - ">="
80
+ - !ruby/object:Gem::Version
81
+ hash: 15
82
+ segments:
83
+ - 1
84
+ - 6
85
+ - 0
86
+ version: 1.6.0
87
+ type: :development
88
+ version_requirements: *id004
89
+ - !ruby/object:Gem::Dependency
90
+ name: hoe
91
+ prerelease: false
92
+ requirement: &id005 !ruby/object:Gem::Requirement
60
93
  none: false
61
94
  requirements:
62
95
  - - ">="
@@ -68,7 +101,7 @@ dependencies:
68
101
  - 2
69
102
  version: 2.6.2
70
103
  type: :development
71
- version_requirements: *id003
104
+ version_requirements: *id005
72
105
  description: Arel is a Relational Algebra for Ruby. It 1) simplifies the generation complex of SQL queries and it 2) adapts to various RDBMS systems. It is intended to be a framework framework; that is, you can build your own ORM with it, focusing on innovative object and collection modeling as opposed to database compatibility and query generation.
73
106
  email:
74
107
  - aaron@tenderlovemaking.com
@@ -85,6 +118,7 @@ extra_rdoc_files:
85
118
  - Manifest.txt
86
119
  - README.markdown
87
120
  files:
121
+ - .autotest
88
122
  - History.txt
89
123
  - MIT-LICENSE.txt
90
124
  - Manifest.txt
@@ -145,6 +179,7 @@ files:
145
179
  - lib/arel/nodes/unqualified_column.rb
146
180
  - lib/arel/nodes/update_statement.rb
147
181
  - lib/arel/nodes/values.rb
182
+ - lib/arel/predications.rb
148
183
  - lib/arel/relation.rb
149
184
  - lib/arel/select_manager.rb
150
185
  - lib/arel/sql/engine.rb
@@ -159,38 +194,37 @@ files:
159
194
  - lib/arel/visitors/oracle.rb
160
195
  - lib/arel/visitors/order_clauses.rb
161
196
  - lib/arel/visitors/postgresql.rb
197
+ - lib/arel/visitors/sqlite.rb
162
198
  - lib/arel/visitors/to_sql.rb
199
+ - lib/arel/visitors/visitor.rb
163
200
  - lib/arel/visitors/where_sql.rb
164
- - spec/activerecord_compat_spec.rb
165
- - spec/attributes/attribute_spec.rb
166
- - spec/attributes_spec.rb
167
- - spec/crud_spec.rb
168
- - spec/delete_manager_spec.rb
169
- - spec/insert_manager_spec.rb
170
- - spec/nodes/count_spec.rb
171
- - spec/nodes/delete_statement_spec.rb
172
- - spec/nodes/equality_spec.rb
173
- - spec/nodes/insert_statement_spec.rb
174
- - spec/nodes/or_spec.rb
175
- - spec/nodes/select_core_spec.rb
176
- - spec/nodes/select_statement_spec.rb
177
- - spec/nodes/sql_literal_spec.rb
178
- - spec/nodes/sum_spec.rb
179
- - spec/nodes/update_statement_spec.rb
180
- - spec/select_manager_spec.rb
181
- - spec/spec.opts
182
- - spec/spec_helper.rb
183
- - spec/support/check.rb
184
- - spec/support/fake_record.rb
185
- - spec/support/matchers.rb
186
- - spec/support/matchers/be_like.rb
187
- - spec/support/shared/tree_manager_shared.rb
188
- - spec/table_spec.rb
189
- - spec/update_manager_spec.rb
190
- - spec/visitors/join_sql_spec.rb
191
- - spec/visitors/oracle_spec.rb
192
- - spec/visitors/postgres_spec.rb
193
- - spec/visitors/to_sql_spec.rb
201
+ - test/attributes/test_attribute.rb
202
+ - test/helper.rb
203
+ - test/nodes/test_count.rb
204
+ - test/nodes/test_delete_statement.rb
205
+ - test/nodes/test_equality.rb
206
+ - test/nodes/test_insert_statement.rb
207
+ - test/nodes/test_or.rb
208
+ - test/nodes/test_select_core.rb
209
+ - test/nodes/test_select_statement.rb
210
+ - test/nodes/test_sql_literal.rb
211
+ - test/nodes/test_sum.rb
212
+ - test/nodes/test_update_statement.rb
213
+ - test/support/fake_record.rb
214
+ - test/test_activerecord_compat.rb
215
+ - test/test_attributes.rb
216
+ - test/test_crud.rb
217
+ - test/test_delete_manager.rb
218
+ - test/test_insert_manager.rb
219
+ - test/test_select_manager.rb
220
+ - test/test_table.rb
221
+ - test/test_update_manager.rb
222
+ - test/visitors/test_join_sql.rb
223
+ - test/visitors/test_mysql.rb
224
+ - test/visitors/test_oracle.rb
225
+ - test/visitors/test_postgres.rb
226
+ - test/visitors/test_sqlite.rb
227
+ - test/visitors/test_to_sql.rb
194
228
  has_rdoc: true
195
229
  homepage: http://github.com/rails/arel
196
230
  licenses: []
@@ -226,5 +260,29 @@ rubygems_version: 1.3.7
226
260
  signing_key:
227
261
  specification_version: 3
228
262
  summary: Arel is a Relational Algebra for Ruby
229
- test_files: []
230
-
263
+ test_files:
264
+ - test/attributes/test_attribute.rb
265
+ - test/nodes/test_count.rb
266
+ - test/nodes/test_delete_statement.rb
267
+ - test/nodes/test_equality.rb
268
+ - test/nodes/test_insert_statement.rb
269
+ - test/nodes/test_or.rb
270
+ - test/nodes/test_select_core.rb
271
+ - test/nodes/test_select_statement.rb
272
+ - test/nodes/test_sql_literal.rb
273
+ - test/nodes/test_sum.rb
274
+ - test/nodes/test_update_statement.rb
275
+ - test/test_activerecord_compat.rb
276
+ - test/test_attributes.rb
277
+ - test/test_crud.rb
278
+ - test/test_delete_manager.rb
279
+ - test/test_insert_manager.rb
280
+ - test/test_select_manager.rb
281
+ - test/test_table.rb
282
+ - test/test_update_manager.rb
283
+ - test/visitors/test_join_sql.rb
284
+ - test/visitors/test_mysql.rb
285
+ - test/visitors/test_oracle.rb
286
+ - test/visitors/test_postgres.rb
287
+ - test/visitors/test_sqlite.rb
288
+ - test/visitors/test_to_sql.rb
@@ -1,21 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Arel::Nodes::SelectCore do
4
- describe "#clone" do
5
- it "clones froms, projections and wheres" do
6
- core = Arel::Nodes::SelectCore.new
7
- core.instance_variable_set "@froms", %w[a b c]
8
- core.instance_variable_set "@projections", %w[d e f]
9
- core.instance_variable_set "@wheres", %w[g h i]
10
-
11
- [:froms, :projections, :wheres].each do |array_attr|
12
- core.send(array_attr).should_receive(:clone).and_return([array_attr])
13
- end
14
-
15
- dolly = core.clone
16
- check dolly.froms.should == [:froms]
17
- check dolly.projections.should == [:projections]
18
- check dolly.wheres.should == [:wheres]
19
- end
20
- end
21
- end
@@ -1,26 +0,0 @@
1
- module Arel
2
- module Nodes
3
- describe 'sql literal' do
4
- describe 'sql' do
5
- it 'makes a sql literal node' do
6
- sql = Arel.sql 'foo'
7
- sql.should be_kind_of Arel::Nodes::SqlLiteral
8
- end
9
- end
10
-
11
- describe 'count' do
12
- it 'makes a count node' do
13
- node = SqlLiteral.new('*').count
14
- viz = Visitors::ToSql.new Table.engine
15
- viz.accept(node).should be_like %{ COUNT(*) }
16
- end
17
-
18
- it 'makes a distinct node' do
19
- node = SqlLiteral.new('*').count true
20
- viz = Visitors::ToSql.new Table.engine
21
- viz.accept(node).should be_like %{ COUNT(DISTINCT *) }
22
- end
23
- end
24
- end
25
- end
26
- end
data/spec/spec.opts DELETED
@@ -1,3 +0,0 @@
1
- --backtrace
2
- --diff
3
- --color
data/spec/spec_helper.rb DELETED
@@ -1,18 +0,0 @@
1
- require 'rubygems'
2
- require 'spec'
3
- require 'fileutils'
4
- require 'arel'
5
-
6
- require 'support/matchers/be_like'
7
- require 'support/check'
8
- require 'support/fake_record'
9
- require 'support/shared/tree_manager_shared'
10
-
11
- Spec::Runner.configure do |config|
12
- config.include Matchers
13
- config.include Check
14
-
15
- config.before do
16
- Arel::Table.engine = Arel::Sql::Engine.new(FakeRecord::Base.new)
17
- end
18
- end
@@ -1,6 +0,0 @@
1
- module Check
2
- # This is used to eliminate Ruby warnings on some RSpec assertion lines
3
- # See: https://rspec.lighthouseapp.com/projects/5645/tickets/504
4
- def check(*args)
5
- end
6
- end