activerecord-postgresql-extensions 0.2.2 → 0.3.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 (54) hide show
  1. checksums.yaml +15 -0
  2. data/.gitignore +4 -0
  3. data/Gemfile +1 -0
  4. data/Guardfile +3 -3
  5. data/MIT-LICENSE +1 -1
  6. data/README.rdoc +10 -3
  7. data/lib/active_record/postgresql_extensions/adapter_extensions.rb +100 -60
  8. data/lib/active_record/postgresql_extensions/constraints.rb +13 -17
  9. data/lib/active_record/postgresql_extensions/event_triggers.rb +129 -0
  10. data/lib/active_record/postgresql_extensions/extensions.rb +14 -15
  11. data/lib/active_record/postgresql_extensions/features.rb +80 -41
  12. data/lib/active_record/postgresql_extensions/functions.rb +1 -1
  13. data/lib/active_record/postgresql_extensions/geometry.rb +6 -8
  14. data/lib/active_record/postgresql_extensions/indexes.rb +19 -11
  15. data/lib/active_record/postgresql_extensions/languages.rb +1 -1
  16. data/lib/active_record/postgresql_extensions/materialized_views.rb +272 -0
  17. data/lib/active_record/postgresql_extensions/permissions.rb +60 -22
  18. data/lib/active_record/postgresql_extensions/roles.rb +18 -7
  19. data/lib/active_record/postgresql_extensions/rules.rb +5 -0
  20. data/lib/active_record/postgresql_extensions/schemas.rb +39 -3
  21. data/lib/active_record/postgresql_extensions/sequences.rb +6 -3
  22. data/lib/active_record/postgresql_extensions/tables.rb +47 -19
  23. data/lib/active_record/postgresql_extensions/tablespaces.rb +1 -1
  24. data/lib/active_record/postgresql_extensions/text_search.rb +3 -3
  25. data/lib/active_record/postgresql_extensions/triggers.rb +3 -3
  26. data/lib/active_record/postgresql_extensions/types.rb +104 -1
  27. data/lib/active_record/postgresql_extensions/utils.rb +35 -13
  28. data/lib/active_record/postgresql_extensions/vacuum.rb +1 -1
  29. data/lib/active_record/postgresql_extensions/version.rb +1 -1
  30. data/lib/active_record/postgresql_extensions/views.rb +137 -6
  31. data/lib/activerecord-postgresql-extensions.rb +13 -11
  32. data/test/{adapter_tests.rb → adapter_extensions_tests.rb} +96 -3
  33. data/test/constraints_tests.rb +216 -104
  34. data/test/event_triggers_tests.rb +109 -0
  35. data/test/extensions_tests.rb +47 -39
  36. data/test/functions_tests.rb +47 -38
  37. data/test/geometry_tests.rb +268 -135
  38. data/test/{index_tests.rb → indexes_tests.rb} +16 -16
  39. data/test/languages_tests.rb +26 -9
  40. data/test/materialized_views_tests.rb +174 -0
  41. data/test/permissions_tests.rb +159 -45
  42. data/test/roles_tests.rb +17 -7
  43. data/test/rules_tests.rb +14 -6
  44. data/test/schemas_tests.rb +35 -9
  45. data/test/sequences_tests.rb +9 -11
  46. data/test/tables_tests.rb +132 -42
  47. data/test/tablespace_tests.rb +21 -15
  48. data/test/test_helper.rb +56 -10
  49. data/test/text_search_tests.rb +42 -44
  50. data/test/trigger_tests.rb +1 -3
  51. data/test/types_tests.rb +95 -0
  52. data/test/vacuum_tests.rb +1 -3
  53. data/test/views_tests.rb +203 -0
  54. metadata +22 -16
data/test/roles_tests.rb CHANGED
@@ -2,11 +2,19 @@
2
2
  $: << File.dirname(__FILE__)
3
3
  require 'test_helper'
4
4
 
5
- class RolesTests < MiniTest::Unit::TestCase
6
- include PostgreSQLExtensionsTestHelper
7
-
5
+ class RolesTests < PostgreSQLExtensionsTestCase
8
6
  def test_create_role
9
7
  ARBC.create_role('foo')
8
+
9
+ ARBC.create_role('foo', {
10
+ :password => 'testing',
11
+ :encrypted_password => false
12
+ })
13
+
14
+ ARBC.create_role('foo', {
15
+ :valid_until => 'foo'
16
+ })
17
+
10
18
  ARBC.create_role('foo', {
11
19
  :superuser => true,
12
20
  :create_db => true,
@@ -23,7 +31,9 @@ class RolesTests < MiniTest::Unit::TestCase
23
31
  })
24
32
 
25
33
  assert_equal([
26
- 'CREATE ROLE "foo";',
34
+ %{CREATE ROLE "foo";},
35
+ %{CREATE ROLE "foo" UNENCRYPTED PASSWORD 'testing';},
36
+ %{CREATE ROLE "foo" VALID UNTIL 'foo';},
27
37
  %{CREATE ROLE "foo" SUPERUSER CREATEDB CREATEROLE NOINHERIT LOGIN CONNECTION LIMIT 10 ENCRYPTED PASSWORD 'testing' VALID UNTIL '2011-10-12' IN ROLE "bar" ROLE "baz" ADMIN "blort";}
28
38
  ], statements)
29
39
  end
@@ -55,9 +65,9 @@ class RolesTests < MiniTest::Unit::TestCase
55
65
  ARBC.drop_role(%w{ foo bar baz }, :if_exists => true)
56
66
 
57
67
  assert_equal([
58
- 'DROP ROLE "foo";',
59
- 'DROP ROLE "foo", "bar", "baz";',
60
- 'DROP ROLE IF EXISTS "foo", "bar", "baz";',
68
+ %{DROP ROLE "foo";},
69
+ %{DROP ROLE "foo", "bar", "baz";},
70
+ %{DROP ROLE IF EXISTS "foo", "bar", "baz";}
61
71
  ], statements)
62
72
  end
63
73
  end
data/test/rules_tests.rb CHANGED
@@ -2,9 +2,7 @@
2
2
  $: << File.dirname(__FILE__)
3
3
  require 'test_helper'
4
4
 
5
- class RulesTests < MiniTest::Unit::TestCase
6
- include PostgreSQLExtensionsTestHelper
7
-
5
+ class RulesTests < PostgreSQLExtensionsTestCase
8
6
  def test_create_rule
9
7
  ARBC.create_rule(
10
8
  :ignore_root, :update, :foos, :instead, :nothing, :conditions => 'user_id = 0'
@@ -17,8 +15,8 @@ class RulesTests < MiniTest::Unit::TestCase
17
15
  )
18
16
 
19
17
  assert_equal([
20
- "CREATE RULE \"ignore_root\" AS ON UPDATE TO \"foos\" WHERE user_id = 0 DO INSTEAD NOTHING;",
21
- "CREATE OR REPLACE RULE \"ignore_root\" AS ON UPDATE TO \"foos\" WHERE user_id > 0 DO INSTEAD SELECT * FROM non_admins;"
18
+ %{CREATE RULE "ignore_root" AS ON UPDATE TO "foos" WHERE user_id = 0 DO INSTEAD NOTHING;},
19
+ %{CREATE OR REPLACE RULE "ignore_root" AS ON UPDATE TO "foos" WHERE user_id > 0 DO INSTEAD SELECT * FROM non_admins;}
22
20
  ], statements)
23
21
  end
24
22
 
@@ -26,7 +24,17 @@ class RulesTests < MiniTest::Unit::TestCase
26
24
  ARBC.drop_rule(:foo, :bar)
27
25
 
28
26
  assert_equal([
29
- "DROP RULE \"foo\" ON \"bar\";",
27
+ %{DROP RULE "foo" ON "bar";}
28
+ ], statements)
29
+ end
30
+
31
+ def test_rename_rule
32
+ skip unless ActiveRecord::PostgreSQLExtensions::Features.rename_rule?
33
+
34
+ Mig.rename_rule(:foo, :bar, :baz)
35
+
36
+ assert_equal([
37
+ %{ALTER RULE "foo" ON "bar" RENAME TO "baz";}
30
38
  ], statements)
31
39
  end
32
40
  end
@@ -2,16 +2,24 @@
2
2
  $: << File.dirname(__FILE__)
3
3
  require 'test_helper'
4
4
 
5
- class SchemasTests < MiniTest::Unit::TestCase
6
- include PostgreSQLExtensionsTestHelper
7
-
5
+ class SchemasTests < PostgreSQLExtensionsTestCase
8
6
  def test_create_schema
9
7
  Mig.create_schema(:foo)
10
8
  Mig.create_schema(:foo, :authorization => 'bar')
11
9
 
12
10
  assert_equal([
13
- "CREATE SCHEMA \"foo\";",
14
- "CREATE SCHEMA \"foo\" AUTHORIZATION \"bar\";"
11
+ %{CREATE SCHEMA "foo";},
12
+ %{CREATE SCHEMA "foo" AUTHORIZATION "bar";}
13
+ ], statements)
14
+ end
15
+
16
+ def test_create_schema_if_not_exists
17
+ skip unless ActiveRecord::PostgreSQLExtensions::Features.create_schema_if_not_exists?
18
+
19
+ Mig.create_schema(:foo, :if_not_exists => true)
20
+
21
+ assert_equal([
22
+ %{CREATE SCHEMA IF NOT EXISTS "foo";}
15
23
  ], statements)
16
24
  end
17
25
 
@@ -20,8 +28,8 @@ class SchemasTests < MiniTest::Unit::TestCase
20
28
  Mig.drop_schema(:foo, :if_exists => true, :cascade => true)
21
29
 
22
30
  assert_equal([
23
- "DROP SCHEMA \"foo\";",
24
- "DROP SCHEMA IF EXISTS \"foo\" CASCADE;"
31
+ %{DROP SCHEMA "foo";},
32
+ %{DROP SCHEMA IF EXISTS "foo" CASCADE;}
25
33
  ], statements)
26
34
  end
27
35
 
@@ -29,7 +37,7 @@ class SchemasTests < MiniTest::Unit::TestCase
29
37
  Mig.alter_schema_name(:foo, :bar)
30
38
 
31
39
  assert_equal([
32
- "ALTER SCHEMA \"foo\" RENAME TO \"bar\";"
40
+ %{ALTER SCHEMA "foo" RENAME TO "bar";}
33
41
  ], statements)
34
42
  end
35
43
 
@@ -37,7 +45,25 @@ class SchemasTests < MiniTest::Unit::TestCase
37
45
  Mig.alter_schema_owner(:foo, :bar)
38
46
 
39
47
  assert_equal([
40
- "ALTER SCHEMA \"foo\" OWNER TO \"bar\";"
48
+ %{ALTER SCHEMA "foo" OWNER TO "bar";}
49
+ ], statements)
50
+ end
51
+
52
+ def test_create_schema_authorization
53
+ Mig.create_schema_authorization(:foo)
54
+
55
+ assert_equal([
56
+ %{CREATE SCHEMA AUTHORIZATION "foo";}
57
+ ], statements)
58
+ end
59
+
60
+ def test_create_schema_authorization_if_not_exists
61
+ skip unless ActiveRecord::PostgreSQLExtensions::Features.create_schema_if_not_exists?
62
+
63
+ Mig.create_schema_authorization(:foo, :if_not_exists => true)
64
+
65
+ assert_equal([
66
+ %{CREATE SCHEMA IF NOT EXISTS AUTHORIZATION "foo";}
41
67
  ], statements)
42
68
  end
43
69
  end
@@ -2,9 +2,7 @@
2
2
  $: << File.dirname(__FILE__)
3
3
  require 'test_helper'
4
4
 
5
- class SequenceTests < MiniTest::Unit::TestCase
6
- include PostgreSQLExtensionsTestHelper
7
-
5
+ class SequenceTests < PostgreSQLExtensionsTestCase
8
6
  def test_create_sequence
9
7
  Mig.create_sequence(
10
8
  'what_a_sequence_of_events',
@@ -21,8 +19,8 @@ class SequenceTests < MiniTest::Unit::TestCase
21
19
  )
22
20
 
23
21
  assert_equal([
24
- "CREATE SEQUENCE \"what_a_sequence_of_events\" START WITH 10;",
25
- "CREATE SEQUENCE \"what_a_sequence_of_events\" INCREMENT BY 2 NO MINVALUE MAXVALUE 10 CACHE 2 OWNED BY \"foo\".\"id\";"
22
+ %{CREATE SEQUENCE "what_a_sequence_of_events" START WITH 10;},
23
+ %{CREATE SEQUENCE "what_a_sequence_of_events" INCREMENT BY 2 NO MINVALUE MAXVALUE 10 CACHE 2 OWNED BY "foo"."id";}
26
24
  ], statements)
27
25
  end
28
26
 
@@ -34,7 +32,7 @@ class SequenceTests < MiniTest::Unit::TestCase
34
32
  )
35
33
 
36
34
  assert_equal([
37
- "DROP SEQUENCE IF EXISTS \"foo_id_seq\" CASCADE;"
35
+ %{DROP SEQUENCE IF EXISTS "foo_id_seq" CASCADE;}
38
36
  ], statements)
39
37
  end
40
38
 
@@ -42,7 +40,7 @@ class SequenceTests < MiniTest::Unit::TestCase
42
40
  Mig.rename_sequence(:foo, :bar)
43
41
 
44
42
  assert_equal([
45
- 'ALTER SEQUENCE "foo" RENAME TO "bar";'
43
+ %{ALTER SEQUENCE "foo" RENAME TO "bar";}
46
44
  ], statements)
47
45
  end
48
46
 
@@ -51,8 +49,8 @@ class SequenceTests < MiniTest::Unit::TestCase
51
49
  Mig.alter_sequence_schema(:foo, :public)
52
50
 
53
51
  assert_equal([
54
- 'ALTER SEQUENCE "foo" SET SCHEMA "bar";',
55
- 'ALTER SEQUENCE "foo" SET SCHEMA PUBLIC;',
52
+ %{ALTER SEQUENCE "foo" SET SCHEMA "bar";},
53
+ %{ALTER SEQUENCE "foo" SET SCHEMA PUBLIC;}
56
54
  ], statements)
57
55
  end
58
56
 
@@ -61,8 +59,8 @@ class SequenceTests < MiniTest::Unit::TestCase
61
59
  Mig.set_sequence_value(:foo, 42, :is_called => false)
62
60
 
63
61
  assert_equal([
64
- "SELECT setval('foo', 42, true);",
65
- "SELECT setval('foo', 42, false);"
62
+ %{SELECT setval('foo', 42, true);},
63
+ %{SELECT setval('foo', 42, false);}
66
64
  ], statements)
67
65
  end
68
66
  end
data/test/tables_tests.rb CHANGED
@@ -2,9 +2,7 @@
2
2
  $: << File.dirname(__FILE__)
3
3
  require 'test_helper'
4
4
 
5
- class TablesTests < MiniTest::Unit::TestCase
6
- include PostgreSQLExtensionsTestHelper
7
-
5
+ class TablesTests < PostgreSQLExtensionsTestCase
8
6
  def test_default_with_expression
9
7
  Mig.create_table('foo') do |t|
10
8
  t.integer :foo_id, :default => { :expression => '10 + 20' }
@@ -12,19 +10,21 @@ class TablesTests < MiniTest::Unit::TestCase
12
10
  end
13
11
 
14
12
  if ActiveRecord::VERSION::STRING >= "3.2"
15
- assert_equal([
16
- %{CREATE TABLE "foo" (
17
- "id" serial primary key,
18
- "foo_id" integer DEFAULT 10 + 20,
19
- "bar_id" integer DEFAULT 20
20
- );} ], statements)
13
+ assert_equal([ strip_heredoc(<<-SQL) ], statements)
14
+ CREATE TABLE "foo" (
15
+ "id" serial primary key,
16
+ "foo_id" integer DEFAULT 10 + 20,
17
+ "bar_id" integer DEFAULT 20
18
+ );
19
+ SQL
21
20
  else
22
- assert_equal([
23
- %{CREATE TABLE "foo" (
24
- "id" serial primary key,
25
- "foo_id" integer DEFAULT 10 + 20,
26
- "bar_id" integer DEFAULT '20 + 10'
27
- );} ], statements)
21
+ assert_equal([ strip_heredoc(<<-SQL) ], statements)
22
+ CREATE TABLE "foo" (
23
+ "id" serial primary key,
24
+ "foo_id" integer DEFAULT 10 + 20,
25
+ "bar_id" integer DEFAULT '20 + 10'
26
+ );
27
+ SQL
28
28
  end
29
29
  end
30
30
 
@@ -35,36 +35,46 @@ class TablesTests < MiniTest::Unit::TestCase
35
35
  :excluding => %w{ storage comments }
36
36
  end
37
37
 
38
- assert_equal([
39
- %{CREATE TABLE "foo" (
40
- "id" serial primary key,
41
- LIKE "bar" INCLUDING CONSTRAINTS INCLUDING INDEXES EXCLUDING STORAGE EXCLUDING COMMENTS
42
- );}
43
- ], statements)
38
+ assert_equal([ strip_heredoc(<<-SQL) ], statements)
39
+ CREATE TABLE "foo" (
40
+ "id" serial primary key,
41
+ LIKE "bar" INCLUDING CONSTRAINTS INCLUDING INDEXES EXCLUDING STORAGE EXCLUDING COMMENTS
42
+ );
43
+ SQL
44
44
  end
45
45
 
46
46
  def test_option_unlogged
47
+ skip unless ActiveRecord::PostgreSQLExtensions::Features.create_table_unlogged?
48
+
47
49
  Mig.create_table('foo', :unlogged => true)
48
50
 
49
- assert_equal([
50
- %{CREATE UNLOGGED TABLE "foo" (\n "id" serial primary key\n);}
51
- ], statements)
51
+ assert_equal([ strip_heredoc(<<-SQL) ], statements)
52
+ CREATE UNLOGGED TABLE "foo" (
53
+ "id" serial primary key
54
+ );
55
+ SQL
52
56
  end
53
57
 
54
58
  def test_option_temporary
55
59
  Mig.create_table('foo', :temporary => true)
56
60
 
57
- assert_equal([
58
- %{CREATE TEMPORARY TABLE "foo" (\n "id" serial primary key\n);}
59
- ], statements)
61
+ assert_equal([ strip_heredoc(<<-SQL) ], statements)
62
+ CREATE TEMPORARY TABLE "foo" (
63
+ "id" serial primary key
64
+ );
65
+ SQL
60
66
  end
61
67
 
62
68
  def test_option_if_not_exists
69
+ skip unless ActiveRecord::PostgreSQLExtensions::Features.create_table_if_not_exists?
70
+
63
71
  Mig.create_table('foo', :if_not_exists => true)
64
72
 
65
- assert_equal([
66
- %{CREATE TABLE IF NOT EXISTS "foo" (\n "id" serial primary key\n);}
67
- ], statements)
73
+ assert_equal([ strip_heredoc(<<-SQL) ], statements)
74
+ CREATE TABLE IF NOT EXISTS "foo" (
75
+ "id" serial primary key
76
+ );
77
+ SQL
68
78
  end
69
79
 
70
80
  def test_option_on_commit
@@ -72,27 +82,52 @@ class TablesTests < MiniTest::Unit::TestCase
72
82
  Mig.create_table('foo', :on_commit => :delete_rows)
73
83
  Mig.create_table('foo', :on_commit => :drop)
74
84
 
75
- assert_equal([
76
- %{CREATE TABLE "foo" (\n "id" serial primary key\n)\nON COMMIT PRESERVE ROWS;},
77
- %{CREATE TABLE "foo" (\n "id" serial primary key\n)\nON COMMIT DELETE ROWS;},
78
- %{CREATE TABLE "foo" (\n "id" serial primary key\n)\nON COMMIT DROP;}
79
- ], statements)
85
+ expected = []
86
+
87
+ expected << strip_heredoc(<<-SQL)
88
+ CREATE TABLE "foo" (
89
+ "id" serial primary key
90
+ )
91
+ ON COMMIT PRESERVE ROWS;
92
+ SQL
93
+
94
+ expected << strip_heredoc(<<-SQL)
95
+ CREATE TABLE "foo" (
96
+ "id" serial primary key
97
+ )
98
+ ON COMMIT DELETE ROWS;
99
+ SQL
100
+
101
+ expected << strip_heredoc(<<-SQL)
102
+ CREATE TABLE "foo" (
103
+ "id" serial primary key
104
+ )
105
+ ON COMMIT DROP;
106
+ SQL
107
+
108
+ assert_equal(expected, statements)
80
109
  end
81
110
 
82
111
  def test_option_inherits
83
112
  Mig.create_table('foo', :inherits => 'bar')
84
113
 
85
- assert_equal([
86
- %{CREATE TABLE "foo" (\n "id" serial primary key\n)\nINHERITS ("bar");}
87
- ], statements)
114
+ assert_equal([ strip_heredoc(<<-SQL) ], statements)
115
+ CREATE TABLE "foo" (
116
+ "id" serial primary key
117
+ )
118
+ INHERITS ("bar");
119
+ SQL
88
120
  end
89
121
 
90
122
  def test_option_tablespace
91
123
  Mig.create_table('foo', :tablespace => 'bar')
92
124
 
93
- assert_equal([
94
- %{CREATE TABLE "foo" (\n "id" serial primary key\n)\nTABLESPACE "bar";}
95
- ], statements)
125
+ assert_equal([ strip_heredoc(<<-SQL) ], statements)
126
+ CREATE TABLE "foo" (
127
+ "id" serial primary key
128
+ )
129
+ TABLESPACE "bar";
130
+ SQL
96
131
  end
97
132
 
98
133
  def test_option_of_type
@@ -128,8 +163,63 @@ class TablesTests < MiniTest::Unit::TestCase
128
163
  })
129
164
  end
130
165
 
166
+ assert_equal([ strip_heredoc(<<-SQL) ], statements)
167
+ CREATE TABLE "foo" (
168
+ "id" serial primary key,
169
+ "blort" text,
170
+ CONSTRAINT "exclude_blort_length" EXCLUDE (length(blort) WITH =)
171
+ );
172
+ SQL
173
+ end
174
+
175
+ def test_index
176
+ Mig.create_table('foo') do |t|
177
+ t.text :blort
178
+ t.index :foo_blort_idx, :blort, :using => :gist
179
+ t.index :foo_blort_idx, :blort, :index_parameters => {
180
+ :fillfactor => 10
181
+ }
182
+ end
183
+
131
184
  assert_equal([
132
- %{CREATE TABLE "foo" (\n "id" serial primary key,\n "blort" text,\n CONSTRAINT "exclude_blort_length" EXCLUDE (length(blort) WITH =)\n);}
185
+ strip_heredoc(%{
186
+ CREATE TABLE "foo" (
187
+ "id" serial primary key,
188
+ "blort" text
189
+ );
190
+ }),
191
+
192
+ strip_heredoc(%{
193
+ CREATE INDEX "foo_blort_idx" ON "foo" USING "gist"("blort");
194
+ }),
195
+
196
+ strip_heredoc(%{
197
+ CREATE INDEX "foo_blort_idx" ON "foo"("blort") WITH ("fillfactor" = 10);
198
+ })
199
+ ], statements)
200
+ end
201
+
202
+ def test_storage_parameters
203
+ Mig.create_table('foo', :storage_parameters => {
204
+ :fillfactor => 10
205
+ })
206
+
207
+ Mig.create_table('foo', :storage_parameters => "FILLFACTOR=10")
208
+
209
+ assert_equal([
210
+ strip_heredoc(%{
211
+ CREATE TABLE "foo" (
212
+ "id" serial primary key
213
+ )
214
+ WITH ("fillfactor" = 10);
215
+ }),
216
+
217
+ strip_heredoc(%{
218
+ CREATE TABLE "foo" (
219
+ "id" serial primary key
220
+ )
221
+ WITH (FILLFACTOR=10);
222
+ })
133
223
  ], statements)
134
224
  end
135
225
  end