arel 0.1.0 → 0.2.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 (116) hide show
  1. data/.gitmodules +3 -0
  2. data/History.txt +11 -0
  3. data/README.markdown +26 -26
  4. data/Rakefile +34 -46
  5. data/Thorfile +124 -0
  6. data/arel.gemspec +216 -201
  7. data/lib/arel/algebra/{primitives/attribute.rb → attribute.rb} +7 -7
  8. data/lib/arel/algebra/{extensions → core_extensions}/class.rb +2 -2
  9. data/lib/arel/algebra/{extensions → core_extensions}/hash.rb +1 -1
  10. data/lib/arel/algebra/{extensions → core_extensions}/object.rb +1 -1
  11. data/lib/arel/algebra/{extensions → core_extensions}/symbol.rb +1 -1
  12. data/lib/arel/algebra/core_extensions.rb +4 -0
  13. data/lib/arel/algebra/{primitives/ordering.rb → ordering.rb} +1 -1
  14. data/lib/arel/algebra/predicates.rb +32 -30
  15. data/lib/arel/algebra/relations/operations/from.rb +6 -0
  16. data/lib/arel/algebra/relations/operations/having.rb +13 -0
  17. data/lib/arel/algebra/relations/operations/join.rb +4 -0
  18. data/lib/arel/algebra/relations/operations/lock.rb +12 -0
  19. data/lib/arel/algebra/relations/operations/project.rb +1 -1
  20. data/lib/arel/algebra/relations/relation.rb +9 -2
  21. data/lib/arel/algebra/relations/utilities/compound.rb +2 -2
  22. data/lib/arel/algebra/relations.rb +3 -0
  23. data/lib/arel/algebra.rb +7 -2
  24. data/lib/arel/engines/memory/predicates.rb +26 -24
  25. data/lib/arel/engines/memory/relations/operations.rb +6 -0
  26. data/lib/arel/engines/sql/christener.rb +2 -1
  27. data/lib/arel/engines/sql/{extensions → core_extensions}/array.rb +6 -2
  28. data/lib/arel/engines/sql/{extensions → core_extensions}/nil_class.rb +1 -1
  29. data/lib/arel/engines/sql/{extensions → core_extensions}/object.rb +1 -1
  30. data/lib/arel/engines/sql/{extensions → core_extensions}/range.rb +1 -1
  31. data/lib/arel/engines/sql/core_extensions.rb +4 -0
  32. data/lib/arel/engines/sql/engine.rb +4 -0
  33. data/lib/arel/engines/sql/formatters.rb +12 -3
  34. data/lib/arel/engines/sql/predicates.rb +37 -35
  35. data/lib/arel/engines/sql/primitives.rb +10 -2
  36. data/lib/arel/engines/sql/relations/operations/join.rb +2 -2
  37. data/lib/arel/engines/sql/relations/relation.rb +46 -10
  38. data/lib/arel/engines/sql/relations/table.rb +18 -5
  39. data/lib/arel/engines/sql/relations/utilities/compound.rb +1 -1
  40. data/lib/arel/engines/sql/relations/writes.rb +58 -11
  41. data/lib/arel/engines/sql.rb +1 -1
  42. data/lib/arel/session.rb +9 -6
  43. data/lib/arel.rb +9 -8
  44. data/spec/arel/algebra/unit/predicates/binary_spec.rb +23 -21
  45. data/spec/arel/algebra/unit/predicates/equality_spec.rb +20 -18
  46. data/spec/arel/algebra/unit/predicates/in_spec.rb +7 -5
  47. data/spec/arel/algebra/unit/primitives/attribute_spec.rb +10 -12
  48. data/spec/arel/algebra/unit/primitives/expression_spec.rb +1 -1
  49. data/spec/arel/algebra/unit/primitives/value_spec.rb +1 -1
  50. data/spec/arel/algebra/unit/relations/alias_spec.rb +2 -2
  51. data/spec/arel/algebra/unit/relations/delete_spec.rb +1 -1
  52. data/spec/arel/algebra/unit/relations/group_spec.rb +1 -1
  53. data/spec/arel/algebra/unit/relations/insert_spec.rb +1 -1
  54. data/spec/arel/algebra/unit/relations/join_spec.rb +1 -1
  55. data/spec/arel/algebra/unit/relations/order_spec.rb +2 -2
  56. data/spec/arel/algebra/unit/relations/project_spec.rb +1 -1
  57. data/spec/arel/algebra/unit/relations/relation_spec.rb +9 -9
  58. data/spec/arel/algebra/unit/relations/skip_spec.rb +1 -1
  59. data/spec/arel/algebra/unit/relations/table_spec.rb +2 -2
  60. data/spec/arel/algebra/unit/relations/take_spec.rb +1 -1
  61. data/spec/arel/algebra/unit/relations/update_spec.rb +1 -1
  62. data/spec/arel/algebra/unit/relations/where_spec.rb +1 -1
  63. data/spec/arel/algebra/unit/session/session_spec.rb +6 -6
  64. data/spec/arel/engines/memory/integration/joins/cross_engine_spec.rb +3 -4
  65. data/spec/arel/engines/memory/unit/relations/array_spec.rb +1 -1
  66. data/spec/arel/engines/memory/unit/relations/insert_spec.rb +8 -8
  67. data/spec/arel/engines/memory/unit/relations/join_spec.rb +1 -1
  68. data/spec/arel/engines/memory/unit/relations/order_spec.rb +1 -1
  69. data/spec/arel/engines/memory/unit/relations/project_spec.rb +1 -1
  70. data/spec/arel/engines/memory/unit/relations/skip_spec.rb +1 -1
  71. data/spec/arel/engines/memory/unit/relations/take_spec.rb +1 -1
  72. data/spec/arel/engines/memory/unit/relations/where_spec.rb +1 -1
  73. data/spec/arel/engines/sql/integration/joins/with_adjacency_spec.rb +1 -1
  74. data/spec/arel/engines/sql/integration/joins/with_aggregations_spec.rb +1 -1
  75. data/spec/arel/engines/sql/integration/joins/with_compounds_spec.rb +1 -1
  76. data/spec/arel/engines/sql/unit/engine_spec.rb +1 -1
  77. data/spec/arel/engines/sql/unit/predicates/binary_spec.rb +73 -70
  78. data/spec/arel/engines/sql/unit/predicates/equality_spec.rb +45 -28
  79. data/spec/arel/engines/sql/unit/predicates/in_spec.rb +75 -54
  80. data/spec/arel/engines/sql/unit/predicates/predicates_spec.rb +48 -46
  81. data/spec/arel/engines/sql/unit/primitives/attribute_spec.rb +1 -1
  82. data/spec/arel/engines/sql/unit/primitives/expression_spec.rb +1 -1
  83. data/spec/arel/engines/sql/unit/primitives/literal_spec.rb +13 -1
  84. data/spec/arel/engines/sql/unit/primitives/value_spec.rb +3 -3
  85. data/spec/arel/engines/sql/unit/relations/alias_spec.rb +1 -1
  86. data/spec/arel/engines/sql/unit/relations/delete_spec.rb +1 -1
  87. data/spec/arel/engines/sql/unit/relations/from_spec.rb +50 -0
  88. data/spec/arel/engines/sql/unit/relations/group_spec.rb +1 -1
  89. data/spec/arel/engines/sql/unit/relations/having_spec.rb +36 -0
  90. data/spec/arel/engines/sql/unit/relations/insert_spec.rb +1 -1
  91. data/spec/arel/engines/sql/unit/relations/join_spec.rb +85 -4
  92. data/spec/arel/engines/sql/unit/relations/lock_spec.rb +61 -0
  93. data/spec/arel/engines/sql/unit/relations/order_spec.rb +1 -1
  94. data/spec/arel/engines/sql/unit/relations/project_spec.rb +1 -1
  95. data/spec/arel/engines/sql/unit/relations/skip_spec.rb +1 -1
  96. data/spec/arel/engines/sql/unit/relations/table_spec.rb +42 -3
  97. data/spec/arel/engines/sql/unit/relations/take_spec.rb +1 -1
  98. data/spec/arel/engines/sql/unit/relations/update_spec.rb +13 -7
  99. data/spec/arel/engines/sql/unit/relations/where_spec.rb +1 -1
  100. data/spec/connections/mysql_connection.rb +3 -3
  101. data/spec/connections/postgresql_connection.rb +2 -2
  102. data/spec/connections/sqlite3_connection.rb +3 -2
  103. data/spec/doubles/hash.rb +4 -0
  104. data/spec/schemas/mysql_schema.rb +7 -0
  105. data/spec/schemas/postgresql_schema.rb +7 -0
  106. data/spec/schemas/sqlite3_schema.rb +7 -0
  107. data/spec/spec.opts +3 -0
  108. data/spec/spec_helper.rb +9 -1
  109. metadata +50 -25
  110. data/VERSION +0 -1
  111. data/lib/arel/.DS_Store +0 -0
  112. data/lib/arel/algebra/extensions.rb +0 -4
  113. data/lib/arel/algebra/primitives.rb +0 -5
  114. data/lib/arel/engines/sql/extensions.rb +0 -4
  115. /data/lib/arel/algebra/{primitives/expression.rb → expression.rb} +0 -0
  116. /data/lib/arel/algebra/{primitives/value.rb → value.rb} +0 -0
@@ -1,4 +1,4 @@
1
- require File.join(File.dirname(__FILE__), '..', '..', '..', '..', '..', 'spec_helper')
1
+ require 'spec_helper'
2
2
 
3
3
  module Arel
4
4
  describe Expression do
@@ -1,4 +1,4 @@
1
- require File.join(File.dirname(__FILE__), '..', '..', '..', '..', '..', 'spec_helper')
1
+ require 'spec_helper'
2
2
 
3
3
  module Arel
4
4
  describe SqlLiteral do
@@ -18,6 +18,18 @@ module Arel
18
18
  sql.should be_like(%Q{SELECT COUNT(*) AS count_id FROM "users"})
19
19
  end
20
20
  end
21
+
22
+ it "manufactures expressions on literal SQL fragment" do
23
+ sql = @relation.project(SqlLiteral.new("2 * credit_limit").sum).to_sql
24
+
25
+ adapter_is :mysql do
26
+ sql.should be_like(%Q{SELECT SUM(2 * credit_limit) AS sum_id FROM `users`})
27
+ end
28
+
29
+ adapter_is_not :mysql do
30
+ sql.should be_like(%Q{SELECT SUM(2 * credit_limit) AS sum_id FROM "users"})
31
+ end
32
+ end
21
33
  end
22
34
  end
23
35
  end
@@ -1,4 +1,4 @@
1
- require File.join(File.dirname(__FILE__), '..', '..', '..', '..', '..', 'spec_helper')
1
+ require 'spec_helper'
2
2
 
3
3
  module Arel
4
4
  describe Value do
@@ -9,11 +9,11 @@ module Arel
9
9
  describe '#to_sql' do
10
10
  it "appropriately quotes the value" do
11
11
  Value.new(1, @relation).to_sql.should be_like('1')
12
-
12
+
13
13
  adapter_is_not :postgresql do
14
14
  Value.new('asdf', @relation).to_sql.should be_like("'asdf'")
15
15
  end
16
-
16
+
17
17
  adapter_is :postgresql do
18
18
  Value.new('asdf', @relation).to_sql.should be_like("E'asdf'")
19
19
  end
@@ -1,4 +1,4 @@
1
- require File.join(File.dirname(__FILE__), '..', '..', '..', '..', '..', 'spec_helper')
1
+ require 'spec_helper'
2
2
 
3
3
  module Arel
4
4
  describe Alias do
@@ -1,4 +1,4 @@
1
- require File.join(File.dirname(__FILE__), '..', '..', '..', '..', '..', 'spec_helper')
1
+ require 'spec_helper'
2
2
 
3
3
  module Arel
4
4
  describe Deletion do
@@ -0,0 +1,50 @@
1
+ require 'spec_helper'
2
+
3
+ module Arel
4
+ describe Table do
5
+ before do
6
+ @relation = Table.new(:users)
7
+ end
8
+
9
+ describe '#to_sql' do
10
+ it "manufactures a simple select query" do
11
+ sql = @relation.from("workers").to_sql
12
+
13
+ adapter_is :mysql do
14
+ sql.should be_like(%Q{
15
+ SELECT `users`.`id`, `users`.`name`
16
+ FROM workers
17
+ })
18
+ end
19
+
20
+ adapter_is_not :mysql do
21
+ sql.should be_like(%Q{
22
+ SELECT "users"."id", "users"."name"
23
+ FROM workers
24
+ })
25
+ end
26
+ end
27
+ end
28
+
29
+ describe '#to_sql' do
30
+ it "overrides and use last from clause given " do
31
+ sql = @relation.from("workers").from("users").to_sql
32
+
33
+ adapter_is :mysql do
34
+ sql.should be_like(%Q{
35
+ SELECT `users`.`id`, `users`.`name`
36
+ FROM users
37
+ })
38
+ end
39
+
40
+ adapter_is_not :mysql do
41
+ sql.should be_like(%Q{
42
+ SELECT "users"."id", "users"."name"
43
+ FROM users
44
+ })
45
+ end
46
+ end
47
+ end
48
+
49
+ end
50
+ end
@@ -1,4 +1,4 @@
1
- require File.join(File.dirname(__FILE__), '..', '..', '..', '..', '..', 'spec_helper')
1
+ require 'spec_helper'
2
2
 
3
3
  module Arel
4
4
  describe Group do
@@ -0,0 +1,36 @@
1
+ require 'spec_helper'
2
+
3
+ module Arel
4
+ describe Having do
5
+ before do
6
+ @relation = Table.new(:developers)
7
+ end
8
+
9
+ describe '#to_sql' do
10
+ describe 'when given a predicate' do
11
+ it "manufactures sql with where clause conditions" do
12
+ sql = @relation.group(@relation[:department]).having("MIN(salary) > 1000").to_sql
13
+
14
+ adapter_is :mysql do
15
+ sql.should be_like(%Q{
16
+ SELECT `developers`.`id`, `developers`.`name`, `developers`.`salary`, `developers`.`department`
17
+ FROM `developers`
18
+ GROUP BY `developers`.`department`
19
+ HAVING MIN(salary) > 1000
20
+ })
21
+ end
22
+
23
+ adapter_is_not :mysql do
24
+ sql.should be_like(%Q{
25
+ SELECT "developers"."id", "developers"."name", "developers"."salary", "developers"."department"
26
+ FROM "developers"
27
+ GROUP BY "developers"."department"
28
+ HAVING MIN(salary) > 1000
29
+ })
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
36
+
@@ -1,4 +1,4 @@
1
- require File.join(File.dirname(__FILE__), '..', '..', '..', '..', '..', 'spec_helper')
1
+ require 'spec_helper'
2
2
 
3
3
  module Arel
4
4
  describe Insert do
@@ -1,17 +1,24 @@
1
- require File.join(File.dirname(__FILE__), '..', '..', '..', '..', '..', 'spec_helper')
1
+ require 'spec_helper'
2
2
 
3
3
  module Arel
4
4
  describe Join do
5
5
  before do
6
6
  @relation1 = Table.new(:users)
7
7
  @relation2 = Table.new(:photos)
8
- @predicate = @relation1[:id].eq(@relation2[:user_id])
8
+ @predicate1 = @relation1[:id].eq(@relation2[:user_id])
9
+
10
+ @relation3 = Table.new(:users, :as => :super_users)
11
+ @relation4 = Table.new(:photos, :as => :super_photos)
12
+
13
+ @predicate2 = @relation3[:id].eq(@relation2[:user_id])
14
+ @predicate3 = @relation3[:id].eq(@relation4[:user_id])
9
15
  end
10
16
 
11
17
  describe '#to_sql' do
18
+
12
19
  describe 'when joining with another relation' do
13
20
  it 'manufactures sql joining the two tables on the predicate' do
14
- sql = InnerJoin.new(@relation1, @relation2, @predicate).to_sql
21
+ sql = InnerJoin.new(@relation1, @relation2, @predicate1).to_sql
15
22
 
16
23
  adapter_is :mysql do
17
24
  sql.should be_like(%Q{
@@ -29,6 +36,51 @@ module Arel
29
36
  })
30
37
  end
31
38
  end
39
+
40
+ describe 'when joining with another relation with an aliased table' do
41
+ it 'manufactures sql joining the two tables on the predicate respecting table aliasing' do
42
+ sql = InnerJoin.new(@relation3, @relation2, @predicate2).to_sql
43
+
44
+ adapter_is :mysql do
45
+ sql.should be_like(%Q{
46
+ SELECT `super_users`.`id`, `super_users`.`name`, `photos`.`id`, `photos`.`user_id`, `photos`.`camera_id`
47
+ FROM `users` AS `super_users`
48
+ INNER JOIN `photos` ON `super_users`.`id` = `photos`.`user_id`
49
+ })
50
+ end
51
+
52
+ adapter_is_not :mysql do
53
+ sql.should be_like(%Q{
54
+ SELECT "super_users"."id", "super_users"."name", "photos"."id", "photos"."user_id", "photos"."camera_id"
55
+ FROM "users" AS "super_users"
56
+ INNER JOIN "photos" ON "super_users"."id" = "photos"."user_id"
57
+ })
58
+ end
59
+ end
60
+ end
61
+
62
+ describe 'when joining with two relations with aliased tables' do
63
+ it 'manufactures sql joining the two tables on the predicate respecting table aliasing' do
64
+ sql = InnerJoin.new(@relation3, @relation4, @predicate3).to_sql
65
+
66
+ adapter_is :mysql do
67
+ sql.should be_like(%Q{
68
+ SELECT `super_users`.`id`, `super_users`.`name`, `super_photos`.`id`, `super_photos`.`user_id`, `super_photos`.`camera_id`
69
+ FROM `users` AS `super_users`
70
+ INNER JOIN `photos` AS `super_photos` ON `super_users`.`id` = `super_photos`.`user_id`
71
+ })
72
+ end
73
+
74
+ adapter_is_not :mysql do
75
+ sql.should be_like(%Q{
76
+ SELECT "super_users"."id", "super_users"."name", "super_photos"."id", "super_photos"."user_id", "super_photos"."camera_id"
77
+ FROM "users" AS "super_users"
78
+ INNER JOIN "photos" AS "super_photos" ON "super_users"."id" = "super_photos"."user_id"
79
+ })
80
+ end
81
+ end
82
+ end
83
+
32
84
  end
33
85
 
34
86
  describe 'when joining with a string' do
@@ -51,7 +103,36 @@ module Arel
51
103
  })
52
104
  end
53
105
  end
54
- end
106
+
107
+ it "passes the string when there are multiple string joins" do
108
+ relation = StringJoin.new(@relation1, "INNER JOIN asdf ON fdsa")
109
+ relation = StringJoin.new(relation, "INNER JOIN lifo ON fifo")
110
+ sql = StringJoin.new(relation, "INNER JOIN hatful ON hallow").to_sql
111
+
112
+ adapter_is :mysql do
113
+ sql.should be_like(%Q{
114
+ SELECT `users`.`id`, `users`.`name`
115
+ FROM `users`
116
+ INNER JOIN asdf ON fdsa
117
+ INNER JOIN lifo ON fifo
118
+ INNER JOIN hatful ON hallow
119
+ })
120
+ end
121
+
122
+ adapter_is_not :mysql do
123
+ sql.should be_like(%Q{
124
+ SELECT "users"."id", "users"."name"
125
+ FROM "users"
126
+ INNER JOIN asdf ON fdsa
127
+ INNER JOIN lifo ON fifo
128
+ INNER JOIN hatful ON hallow
129
+ })
130
+ end
131
+ end
132
+
133
+ end
134
+
135
+
55
136
  end
56
137
  end
57
138
  end
@@ -0,0 +1,61 @@
1
+ require 'spec_helper'
2
+
3
+ module Arel
4
+ describe Lock do
5
+ before do
6
+ @relation = Table.new(:users)
7
+ end
8
+
9
+ describe '#to_sql' do
10
+ it "manufactures a simple select query lock" do
11
+ sql = @relation.lock.to_sql
12
+
13
+ adapter_is :mysql do
14
+ sql.should be_like(%Q{
15
+ SELECT `users`.`id`, `users`.`name`
16
+ FROM `users` FOR UPDATE
17
+ })
18
+ end
19
+
20
+ adapter_is :postgresql do
21
+ sql.should be_like(%Q{
22
+ SELECT "users"."id", "users"."name"
23
+ FROM "users" FOR UPDATE
24
+ })
25
+ end
26
+
27
+ adapter_is :sqlite3 do
28
+ sql.should be_like(%Q{
29
+ SELECT "users"."id", "users"."name"
30
+ FROM "users"
31
+ })
32
+ end
33
+ end
34
+
35
+ it "manufactures a select query locking with a given lock" do
36
+ sql = @relation.lock("LOCK IN SHARE MODE").to_sql
37
+
38
+ adapter_is :mysql do
39
+ sql.should be_like(%Q{
40
+ SELECT `users`.`id`, `users`.`name`
41
+ FROM `users` LOCK IN SHARE MODE
42
+ })
43
+ end
44
+
45
+ adapter_is :postgresql do
46
+ sql.should be_like(%Q{
47
+ SELECT "users"."id", "users"."name"
48
+ FROM "users" LOCK IN SHARE MODE
49
+ })
50
+ end
51
+
52
+ adapter_is :sqlite3 do
53
+ sql.should be_like(%Q{
54
+ SELECT "users"."id", "users"."name"
55
+ FROM "users"
56
+ })
57
+ end
58
+ end
59
+ end
60
+ end
61
+ end
@@ -1,4 +1,4 @@
1
- require File.join(File.dirname(__FILE__), '..', '..', '..', '..', '..', 'spec_helper')
1
+ require 'spec_helper'
2
2
 
3
3
  module Arel
4
4
  describe Order do
@@ -1,4 +1,4 @@
1
- require File.join(File.dirname(__FILE__), '..', '..', '..', '..', '..', 'spec_helper')
1
+ require 'spec_helper'
2
2
 
3
3
  module Arel
4
4
  describe Project do
@@ -1,4 +1,4 @@
1
- require File.join(File.dirname(__FILE__), '..', '..', '..', '..', '..', 'spec_helper')
1
+ require 'spec_helper'
2
2
 
3
3
  module Arel
4
4
  describe Skip do
@@ -1,4 +1,4 @@
1
- require File.join(File.dirname(__FILE__), '..', '..', '..', '..', '..', 'spec_helper')
1
+ require 'spec_helper'
2
2
 
3
3
  module Arel
4
4
  describe Table do
@@ -26,6 +26,45 @@ module Arel
26
26
  end
27
27
  end
28
28
 
29
+ describe '#as' do
30
+ it "manufactures a simple select query using aliases" do
31
+ sql = @relation.as(:super_users).to_sql
32
+
33
+ adapter_is :mysql do
34
+ sql.should be_like(%Q{
35
+ SELECT `super_users`.`id`, `super_users`.`name`
36
+ FROM `users` AS `super_users`
37
+ })
38
+ end
39
+
40
+ adapter_is_not :mysql do
41
+ sql.should be_like(%Q{
42
+ SELECT "super_users"."id", "super_users"."name"
43
+ FROM "users" AS "super_users"
44
+ })
45
+ end
46
+ end
47
+
48
+ it "does not apply alias if it's same as the table name" do
49
+ sql = @relation.as(:users).to_sql
50
+
51
+ adapter_is :mysql do
52
+ sql.should be_like(%Q{
53
+ SELECT `users`.`id`, `users`.`name`
54
+ FROM `users`
55
+ })
56
+ end
57
+
58
+ adapter_is_not :mysql do
59
+ sql.should be_like(%Q{
60
+ SELECT "users"."id", "users"."name"
61
+ FROM "users"
62
+ })
63
+ end
64
+ end
65
+
66
+ end
67
+
29
68
  describe '#column_for' do
30
69
  it "returns the column corresponding to the attribute" do
31
70
  @relation.column_for(@relation[:id]).should == @relation.columns.detect { |c| c.name == 'id' }
@@ -42,8 +81,8 @@ module Arel
42
81
 
43
82
  describe '#reset' do
44
83
  it "reloads columns from the database" do
45
- lambda { stub(@relation.engine).columns { [] } }.should_not change { @relation.attributes }
46
- lambda { @relation.reset }.should change { @relation.attributes }
84
+ lambda { @relation.engine.stub!(:columns => []) }.should_not change { @relation.attributes }
85
+ lambda { @relation.reset }.should change { @relation.attributes }
47
86
  end
48
87
  end
49
88
  end
@@ -1,4 +1,4 @@
1
- require File.join(File.dirname(__FILE__), '..', '..', '..', '..', '..', 'spec_helper')
1
+ require 'spec_helper'
2
2
 
3
3
  module Arel
4
4
  describe Take do
@@ -1,4 +1,10 @@
1
- require File.join(File.dirname(__FILE__), '..', '..', '..', '..', '..', 'spec_helper')
1
+ require 'spec_helper'
2
+
3
+ class User
4
+ def self.primary_key
5
+ "id"
6
+ end
7
+ end
2
8
 
3
9
  module Arel
4
10
  describe Update do
@@ -45,17 +51,17 @@ module Arel
45
51
 
46
52
  adapter_is :sqlite3 do
47
53
  sql.should be_like(%Q{
48
- UPDATE "users"
49
- SET "name" = 'nick'
50
- LIMIT 1
54
+ UPDATE "users" SET
55
+ "name" = 'nick'
56
+ WHERE "id" IN (SELECT "id" FROM "users" LIMIT 1)
51
57
  })
52
58
  end
53
59
 
54
60
  adapter_is :postgresql do
55
61
  sql.should be_like(%Q{
56
- UPDATE "users"
57
- SET "name" = E'nick'
58
- LIMIT 1
62
+ UPDATE "users" SET
63
+ "name" = E'nick'
64
+ WHERE "id" IN (SELECT "id" FROM "users" LIMIT 1)
59
65
  })
60
66
  end
61
67
  end
@@ -1,4 +1,4 @@
1
- require File.join(File.dirname(__FILE__), '..', '..', '..', '..', '..', 'spec_helper')
1
+ require 'spec_helper'
2
2
 
3
3
  module Arel
4
4
  describe Where do
@@ -1,13 +1,13 @@
1
- require "rubygems"
2
- require "activerecord"
3
1
  puts "Using native MySQL"
2
+ require "active_record"
3
+ require 'logger'
4
4
 
5
5
  ActiveRecord::Base.logger = Logger.new("debug.log")
6
6
 
7
7
  ActiveRecord::Base.configurations = {
8
8
  'unit' => {
9
9
  :adapter => 'mysql',
10
- :username => 'rails',
10
+ :username => 'root',
11
11
  :encoding => 'utf8',
12
12
  :database => 'arel_unit',
13
13
  }
@@ -1,6 +1,6 @@
1
- require "rubygems"
2
- require "activerecord"
3
1
  puts "Using native PostgreSQL"
2
+ require "active_record"
3
+ require 'logger'
4
4
 
5
5
  ActiveRecord::Base.logger = Logger.new("debug.log")
6
6
 
@@ -1,6 +1,6 @@
1
- require "rubygems"
2
- require "activerecord"
3
1
  puts "Using native SQLite3"
2
+ require "active_record"
3
+ require 'logger'
4
4
 
5
5
  ActiveRecord::Base.logger = Logger.new("debug.log")
6
6
 
@@ -16,6 +16,7 @@ ActiveRecord::Base.configurations = {
16
16
 
17
17
  unless File.exist?(db_file)
18
18
  puts "SQLite3 database not found at #{db_file}. Rebuilding it."
19
+ require 'fileutils'
19
20
  FileUtils.mkdir_p(File.dirname(db_file))
20
21
  sqlite_command = %Q{sqlite3 "#{db_file}" "create table a (a integer); drop table a;"}
21
22
  puts "Executing '#{sqlite_command}'"
data/spec/doubles/hash.rb CHANGED
@@ -3,18 +3,22 @@ class Hash
3
3
  to_a.sort { |(key1, value1), (key2, value2)| key1.hash <=> key2.hash }
4
4
  end
5
5
 
6
+ undef :keys
6
7
  def keys
7
8
  ordered_array.collect(&:first)
8
9
  end
9
10
 
11
+ undef :values
10
12
  def values
11
13
  ordered_array.collect { |_, v| v }
12
14
  end
13
15
 
16
+ undef :each
14
17
  def each(&block)
15
18
  ordered_array.each(&block)
16
19
  end
17
20
 
21
+ undef :shift
18
22
  def shift
19
23
  returning to_a.first do |k, v|
20
24
  delete(k)
@@ -11,6 +11,13 @@ sql = <<-SQL
11
11
  user_id INTEGER NOT NULL,
12
12
  camera_id INTEGER NOT NULL
13
13
  );
14
+ DROP TABLE IF EXISTS developers;
15
+ CREATE TABLE developers (
16
+ id INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY,
17
+ name VARCHAR(255) NOT NULL,
18
+ salary INTEGER NOT NULL,
19
+ department VARCHAR(255) NOT NULL
20
+ );
14
21
  SQL
15
22
 
16
23
  sql.split(/;/).select(&:present?).each do |sql_statement|
@@ -11,6 +11,13 @@ sql = <<-SQL
11
11
  user_id INTEGER NOT NULL,
12
12
  camera_id INTEGER NOT NULL
13
13
  );
14
+ DROP TABLE IF EXISTS developers;
15
+ CREATE TABLE developers (
16
+ id SERIAL PRIMARY KEY NOT NULL,
17
+ name VARCHAR(255) NOT NULL,
18
+ salary INTEGER NOT NULL,
19
+ department VARCHAR(255) NOT NULL
20
+ );
14
21
  SQL
15
22
 
16
23
  sql.split(/;/).select(&:present?).each do |sql_statement|
@@ -11,6 +11,13 @@ sql = <<-SQL
11
11
  user_id INTEGER NOT NULL,
12
12
  camera_id INTEGER NOT NULL
13
13
  );
14
+ DROP TABLE IF EXISTS developers;
15
+ CREATE TABLE developers (
16
+ id INTEGER NOT NULL PRIMARY KEY,
17
+ name VARCHAR(255) NOT NULL,
18
+ salary INTEGER NOT NULL,
19
+ department VARCHAR(255) NOT NULL
20
+ );
14
21
  SQL
15
22
 
16
23
  sql.split(/;/).select(&:present?).each do |sql_statement|
data/spec/spec.opts ADDED
@@ -0,0 +1,3 @@
1
+ --backtrace
2
+ --diff
3
+ --color
data/spec/spec_helper.rb CHANGED
@@ -37,10 +37,18 @@ module AdapterGuards
37
37
  end
38
38
  end
39
39
 
40
+ module Check
41
+ # This is used to eliminate Ruby warnings on some RSpec assertion lines
42
+ # See: https://rspec.lighthouseapp.com/projects/5645/tickets/504
43
+ def check(*args)
44
+ end
45
+ end
46
+
40
47
  Spec::Runner.configure do |config|
41
48
  config.include BeLikeMatcher, HashTheSameAsMatcher, DisambiguateAttributesMatcher
42
49
  config.include AdapterGuards
43
- config.mock_with :rr
50
+ config.include Check
51
+
44
52
  config.before do
45
53
  Arel::Table.engine = Arel::Sql::Engine.new(ActiveRecord::Base)
46
54
  end