activerecord-postgresql-extensions 0.0.9 → 0.0.10
Sign up to get free protection for your applications and to get access to all the features.
- data/Rakefile +9 -1
- data/VERSION +1 -1
- data/activerecord-postgresql-extensions.gemspec +12 -10
- data/lib/activerecord-postgresql-extensions.rb +1 -0
- data/lib/postgresql_extensions/postgresql_adapter_extensions.rb +37 -0
- data/lib/postgresql_extensions/postgresql_roles.rb +127 -0
- data/test/adapter_test.rb +31 -0
- data/test/functions_test.rb +10 -10
- data/test/languages_test.rb +6 -6
- data/test/roles_test.rb +63 -0
- data/test/rules_test.rb +3 -3
- data/test/test_helper.rb +5 -2
- metadata +5 -3
data/Rakefile
CHANGED
@@ -4,7 +4,15 @@
|
|
4
4
|
require 'rubygems'
|
5
5
|
require 'rubygems/package_task'
|
6
6
|
require 'rake/testtask'
|
7
|
-
require '
|
7
|
+
require 'rake/rdoctask'
|
8
|
+
|
9
|
+
if RUBY_VERSION >= '1.9'
|
10
|
+
begin
|
11
|
+
gem 'psych'
|
12
|
+
rescue Exception => e
|
13
|
+
# it's okay, fall back on the bundled psych
|
14
|
+
end
|
15
|
+
end
|
8
16
|
|
9
17
|
$:.push 'lib'
|
10
18
|
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0.
|
1
|
+
0.0.10
|
@@ -4,14 +4,14 @@
|
|
4
4
|
# -*- encoding: utf-8 -*-
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
|
-
s.name =
|
8
|
-
s.version = "0.0.
|
7
|
+
s.name = "activerecord-postgresql-extensions"
|
8
|
+
s.version = "0.0.10"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
|
-
s.authors = [
|
12
|
-
s.date =
|
13
|
-
s.description =
|
14
|
-
s.email =
|
11
|
+
s.authors = ["J Smith"]
|
12
|
+
s.date = "2011-10-05"
|
13
|
+
s.description = "A whole bunch of extensions the ActiveRecord PostgreSQL adapter."
|
14
|
+
s.email = "code@zoocasa.com"
|
15
15
|
s.extra_rdoc_files = [
|
16
16
|
"README.rdoc"
|
17
17
|
]
|
@@ -30,6 +30,7 @@ Gem::Specification.new do |s|
|
|
30
30
|
"lib/postgresql_extensions/postgresql_indexes.rb",
|
31
31
|
"lib/postgresql_extensions/postgresql_languages.rb",
|
32
32
|
"lib/postgresql_extensions/postgresql_permissions.rb",
|
33
|
+
"lib/postgresql_extensions/postgresql_roles.rb",
|
33
34
|
"lib/postgresql_extensions/postgresql_rules.rb",
|
34
35
|
"lib/postgresql_extensions/postgresql_schemas.rb",
|
35
36
|
"lib/postgresql_extensions/postgresql_sequences.rb",
|
@@ -45,16 +46,17 @@ Gem::Specification.new do |s|
|
|
45
46
|
"test/index_test.rb",
|
46
47
|
"test/languages_test.rb",
|
47
48
|
"test/permissions_test.rb",
|
49
|
+
"test/roles_test.rb",
|
48
50
|
"test/rules_test.rb",
|
49
51
|
"test/schemas_test.rb",
|
50
52
|
"test/sequences_test.rb",
|
51
53
|
"test/tables_test.rb",
|
52
54
|
"test/test_helper.rb"
|
53
55
|
]
|
54
|
-
s.homepage =
|
55
|
-
s.require_paths = [
|
56
|
-
s.rubygems_version =
|
57
|
-
s.summary =
|
56
|
+
s.homepage = "http://github.com/zoocasa/activerecord-postgresql-extensions"
|
57
|
+
s.require_paths = ["lib"]
|
58
|
+
s.rubygems_version = "1.8.10"
|
59
|
+
s.summary = "A whole bunch of extensions the ActiveRecord PostgreSQL adapter."
|
58
60
|
|
59
61
|
if s.respond_to? :specification_version then
|
60
62
|
s.specification_version = 3
|
@@ -426,6 +426,43 @@ module ActiveRecord
|
|
426
426
|
SQL
|
427
427
|
end
|
428
428
|
|
429
|
+
def roles(name = nil)
|
430
|
+
query(<<-SQL, name).map { |row| row[0] }
|
431
|
+
SELECT rolname
|
432
|
+
FROM pg_roles
|
433
|
+
SQL
|
434
|
+
end
|
435
|
+
|
436
|
+
def role_exists?(name)
|
437
|
+
roles.include?(name)
|
438
|
+
end
|
439
|
+
|
440
|
+
# Sets the current database role/user. The :duration option can be set to
|
441
|
+
# :session or :local as described in the PostgreSQL docs.
|
442
|
+
def set_role(role, options = {})
|
443
|
+
duration = if options[:duration]
|
444
|
+
if [ :session, :local ].include?(options[:duration])
|
445
|
+
options[:duration].to_s.upcase
|
446
|
+
else
|
447
|
+
raise ArgumentError.new("The :duration option must be one of :session or :local.")
|
448
|
+
end
|
449
|
+
end
|
450
|
+
|
451
|
+
sql = 'SET '
|
452
|
+
sql << "#{duration} " if duration
|
453
|
+
sql << "ROLE #{quote_role(role)}"
|
454
|
+
execute(sql, "Setting current role")
|
455
|
+
end
|
456
|
+
|
457
|
+
def reset_role
|
458
|
+
execute('RESET ROLE')
|
459
|
+
end
|
460
|
+
|
461
|
+
def current_role
|
462
|
+
execute('SELECT current_role')
|
463
|
+
end
|
464
|
+
alias :current_user :current_role
|
465
|
+
|
429
466
|
# Returns an Array of tables to ignore.
|
430
467
|
def ignored_tables(name = nil)
|
431
468
|
query(<<-SQL, name).map { |row| row[0] }
|
@@ -0,0 +1,127 @@
|
|
1
|
+
|
2
|
+
require 'active_record/connection_adapters/postgresql_adapter'
|
3
|
+
|
4
|
+
module ActiveRecord
|
5
|
+
class InvalidRoleAction < ActiveRecordError #:nodoc:
|
6
|
+
def initialize(action)
|
7
|
+
super("Invalid role action - #{action}")
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
module ConnectionAdapters
|
12
|
+
class PostgreSQLAdapter < AbstractAdapter
|
13
|
+
def create_role(name, options = {})
|
14
|
+
execute PostgreSQLRole.new(self, :create, name, options).to_sql
|
15
|
+
end
|
16
|
+
alias :create_user :create_role
|
17
|
+
|
18
|
+
def alter_role(name, options = {})
|
19
|
+
execute PostgreSQLRole.new(self, :alter, name, options).to_sql
|
20
|
+
end
|
21
|
+
alias :alter_user :alter_role
|
22
|
+
|
23
|
+
def drop_role(name, options = {})
|
24
|
+
sql = 'DROP ROLE '
|
25
|
+
sql << 'IF EXISTS ' if options[:if_exists]
|
26
|
+
sql << Array(name).collect { |r| quote_role(r) }.join(', ')
|
27
|
+
execute sql
|
28
|
+
end
|
29
|
+
alias :drop_user :drop_role
|
30
|
+
end
|
31
|
+
|
32
|
+
# This is a base class for PostgreSQLGrantPrivilege and
|
33
|
+
# PostgreSQLRevokePrivilege and is not meant to be used directly.
|
34
|
+
class PostgreSQLRole
|
35
|
+
attr_accessor :base, :action, :name, :options
|
36
|
+
|
37
|
+
def initialize(base, action, name, options = {}) #:nodoc:
|
38
|
+
assert_valid_action(action)
|
39
|
+
|
40
|
+
@base, @action, @name, @options = base, action, name, options
|
41
|
+
end
|
42
|
+
|
43
|
+
def to_sql #:nodoc:
|
44
|
+
sql = Array.new
|
45
|
+
if action == :create
|
46
|
+
sql << 'CREATE'
|
47
|
+
else
|
48
|
+
sql << 'ALTER'
|
49
|
+
end
|
50
|
+
sql << "ROLE #{base.quote_role(name)}"
|
51
|
+
|
52
|
+
if options[:superuser]
|
53
|
+
sql << 'SUPERUSER'
|
54
|
+
end
|
55
|
+
|
56
|
+
if options[:create_db]
|
57
|
+
sql << 'CREATEDB'
|
58
|
+
end
|
59
|
+
|
60
|
+
if options[:create_role]
|
61
|
+
sql << 'CREATEROLE'
|
62
|
+
end
|
63
|
+
|
64
|
+
if options.has_key?(:inherit) && !options[:inherit]
|
65
|
+
sql << 'NOINHERIT'
|
66
|
+
end
|
67
|
+
|
68
|
+
if options[:login]
|
69
|
+
sql << 'LOGIN'
|
70
|
+
end
|
71
|
+
|
72
|
+
if options[:connection_limit]
|
73
|
+
sql << "CONNECTION LIMIT #{options[:connection_limit].to_i}"
|
74
|
+
end
|
75
|
+
|
76
|
+
if options[:password]
|
77
|
+
if options.has_key?(:encrypted_password)
|
78
|
+
if options[:encrypted_password]
|
79
|
+
sql << 'ENCRYPTED'
|
80
|
+
else
|
81
|
+
sql << 'UNENCRYPTED'
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
sql << 'PASSWORD'
|
86
|
+
sql << base.quote(options[:password])
|
87
|
+
end
|
88
|
+
|
89
|
+
if options[:valid_until]
|
90
|
+
sql << 'VALID UNTIL'
|
91
|
+
timestamp = case options[:valid_until]
|
92
|
+
when Date, Time, DateTime
|
93
|
+
options[:valid_until].to_s(:sql)
|
94
|
+
else
|
95
|
+
options[:valid_until].to_s
|
96
|
+
end
|
97
|
+
sql << base.quote(timestamp)
|
98
|
+
end
|
99
|
+
|
100
|
+
if options[:in_role].present?
|
101
|
+
sql << 'IN ROLE'
|
102
|
+
sql << Array(options[:in_role]).collect { |r| base.quote_role(r) }.join(', ')
|
103
|
+
end
|
104
|
+
|
105
|
+
if options[:role].present?
|
106
|
+
sql << 'ROLE'
|
107
|
+
sql << Array(options[:role]).collect { |r| base.quote_role(r) }.join(', ')
|
108
|
+
end
|
109
|
+
|
110
|
+
if options[:admin].present?
|
111
|
+
sql << 'ADMIN'
|
112
|
+
sql << Array(options[:admin]).collect { |r| base.quote_role(r) }.join(', ')
|
113
|
+
end
|
114
|
+
|
115
|
+
sql.join(' ')
|
116
|
+
end
|
117
|
+
alias :to_s :to_sql
|
118
|
+
|
119
|
+
private
|
120
|
+
def assert_valid_action(action) #:nodoc:
|
121
|
+
if ![ :create, :alter ].include?(action)
|
122
|
+
raise ActiveRecord::InvalidRoleAction.new(action)
|
123
|
+
end
|
124
|
+
end
|
125
|
+
end
|
126
|
+
end
|
127
|
+
end
|
data/test/adapter_test.rb
CHANGED
@@ -50,4 +50,35 @@ class AdapterExtensionTests < Test::Unit::TestCase
|
|
50
50
|
assert_equal(:integer, col.send(:simplified_type, 'integer'))
|
51
51
|
assert_equal(nil, col.send(:simplified_type, 'complete_nonsense'))
|
52
52
|
end
|
53
|
+
|
54
|
+
def test_set_role
|
55
|
+
ARBC.set_role('foo')
|
56
|
+
ARBC.set_role('foo', :duration => :local)
|
57
|
+
ARBC.set_role('foo', :duration => :session)
|
58
|
+
|
59
|
+
assert_equal([
|
60
|
+
%{SET ROLE "foo"},
|
61
|
+
%{SET LOCAL ROLE "foo"},
|
62
|
+
%{SET SESSION ROLE "foo"}
|
63
|
+
], ARBC.statements)
|
64
|
+
|
65
|
+
assert_raise(ArgumentError) do
|
66
|
+
ARBC.set_role('foo', :duration => :nonsense)
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
def test_reset_role
|
71
|
+
ARBC.reset_role
|
72
|
+
assert_equal([ 'RESET ROLE' ], ARBC.statements)
|
73
|
+
end
|
74
|
+
|
75
|
+
def test_current_role
|
76
|
+
ARBC.current_role
|
77
|
+
ARBC.current_user
|
78
|
+
|
79
|
+
assert_equal([
|
80
|
+
'SELECT current_role',
|
81
|
+
'SELECT current_role'
|
82
|
+
], ARBC.statements)
|
83
|
+
end
|
53
84
|
end
|
data/test/functions_test.rb
CHANGED
@@ -6,11 +6,11 @@ class FunctionsTests < Test::Unit::TestCase
|
|
6
6
|
include PostgreSQLExtensionsTestHelper
|
7
7
|
|
8
8
|
def test_create_function
|
9
|
-
|
9
|
+
ARBC.create_function(:test, :integer, :integer, :sql) do
|
10
10
|
"select 10;"
|
11
11
|
end
|
12
12
|
|
13
|
-
|
13
|
+
ARBC.create_function(:test, :integer, :integer, :sql, {
|
14
14
|
:force => true,
|
15
15
|
:delimiter => '$__$',
|
16
16
|
:behavior => :immutable,
|
@@ -43,8 +43,8 @@ LANGUAGE "sql"
|
|
43
43
|
end
|
44
44
|
|
45
45
|
def test_drop_function
|
46
|
-
|
47
|
-
|
46
|
+
ARBC.drop_function(:test, :integer)
|
47
|
+
ARBC.drop_function(:test, :integer, :if_exists => true, :cascade => true)
|
48
48
|
|
49
49
|
assert_equal([
|
50
50
|
"DROP FUNCTION \"test\"(integer)",
|
@@ -53,7 +53,7 @@ LANGUAGE "sql"
|
|
53
53
|
end
|
54
54
|
|
55
55
|
def test_rename_function
|
56
|
-
|
56
|
+
ARBC.rename_function(:test, 'integer, text', :foo)
|
57
57
|
|
58
58
|
assert_equal([
|
59
59
|
"ALTER FUNCTION \"test\"(integer, text) RENAME TO \"foo\""
|
@@ -61,7 +61,7 @@ LANGUAGE "sql"
|
|
61
61
|
end
|
62
62
|
|
63
63
|
def test_alter_function_owner
|
64
|
-
|
64
|
+
ARBC.alter_function_owner(:test, 'integer, text', :admin)
|
65
65
|
|
66
66
|
assert_equal([
|
67
67
|
"ALTER FUNCTION \"test\"(integer, text) OWNER TO \"admin\""
|
@@ -69,7 +69,7 @@ LANGUAGE "sql"
|
|
69
69
|
end
|
70
70
|
|
71
71
|
def test_alter_function_schema
|
72
|
-
|
72
|
+
ARBC.alter_function_schema(:test, 'integer, text', :geospatial)
|
73
73
|
|
74
74
|
assert_equal([
|
75
75
|
"ALTER FUNCTION \"test\"(integer, text) SET SCHEMA \"geospatial\""
|
@@ -77,9 +77,9 @@ LANGUAGE "sql"
|
|
77
77
|
end
|
78
78
|
|
79
79
|
def test_alter_function
|
80
|
-
|
81
|
-
|
82
|
-
|
80
|
+
ARBC.alter_function('my_function', 'integer', :rename_to => 'another_function')
|
81
|
+
ARBC.alter_function('another_function', 'integer', :owner_to => 'jdoe')
|
82
|
+
ARBC.alter_function('my_function', 'integer') do |f|
|
83
83
|
f.rename_to 'another_function'
|
84
84
|
f.owner_to 'jdoe'
|
85
85
|
f.set_schema 'foo'
|
data/test/languages_test.rb
CHANGED
@@ -6,8 +6,8 @@ class LanguagesTests < Test::Unit::TestCase
|
|
6
6
|
include PostgreSQLExtensionsTestHelper
|
7
7
|
|
8
8
|
def test_create_language
|
9
|
-
|
10
|
-
|
9
|
+
ARBC.create_language(:foo)
|
10
|
+
ARBC.create_language(
|
11
11
|
:foo,
|
12
12
|
:trusted => true,
|
13
13
|
:call_handler => 'plpgsql',
|
@@ -21,8 +21,8 @@ class LanguagesTests < Test::Unit::TestCase
|
|
21
21
|
end
|
22
22
|
|
23
23
|
def test_drop_language
|
24
|
-
|
25
|
-
|
24
|
+
ARBC.drop_language(:foo)
|
25
|
+
ARBC.drop_language(:foo, :if_exists => true, :cascade => true)
|
26
26
|
|
27
27
|
assert_equal([
|
28
28
|
"DROP PROCEDURAL LANGUAGE \"foo\"",
|
@@ -31,7 +31,7 @@ class LanguagesTests < Test::Unit::TestCase
|
|
31
31
|
end
|
32
32
|
|
33
33
|
def test_alter_language_name
|
34
|
-
|
34
|
+
ARBC.alter_language_name(:foo, :bar)
|
35
35
|
|
36
36
|
assert_equal([
|
37
37
|
"ALTER PROCEDURAL LANGUAGE \"foo\" RENAME TO \"bar\""
|
@@ -39,7 +39,7 @@ class LanguagesTests < Test::Unit::TestCase
|
|
39
39
|
end
|
40
40
|
|
41
41
|
def test_alter_language_owner
|
42
|
-
|
42
|
+
ARBC.alter_language_owner(:foo, :bar)
|
43
43
|
|
44
44
|
assert_equal([
|
45
45
|
"ALTER PROCEDURAL LANGUAGE \"foo\" OWNER TO \"bar\""
|
data/test/roles_test.rb
ADDED
@@ -0,0 +1,63 @@
|
|
1
|
+
|
2
|
+
$: << File.dirname(__FILE__)
|
3
|
+
require 'test_helper'
|
4
|
+
|
5
|
+
class RolesTests < Test::Unit::TestCase
|
6
|
+
include PostgreSQLExtensionsTestHelper
|
7
|
+
|
8
|
+
def test_create_role
|
9
|
+
ARBC.create_role('foo')
|
10
|
+
ARBC.create_role('foo', {
|
11
|
+
:superuser => true,
|
12
|
+
:create_db => true,
|
13
|
+
:create_role => true,
|
14
|
+
:inherit => false,
|
15
|
+
:login => true,
|
16
|
+
:connection_limit => 10,
|
17
|
+
:password => 'testing',
|
18
|
+
:encrypted_password => true,
|
19
|
+
:valid_until => Date.parse('2011-10-12'),
|
20
|
+
:in_role => 'bar',
|
21
|
+
:role => 'baz',
|
22
|
+
:admin => 'blort'
|
23
|
+
})
|
24
|
+
|
25
|
+
assert_equal([
|
26
|
+
'CREATE ROLE "foo"',
|
27
|
+
%{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
|
+
], statements)
|
29
|
+
end
|
30
|
+
|
31
|
+
def test_alter_role
|
32
|
+
ARBC.alter_role('foo', {
|
33
|
+
:superuser => true,
|
34
|
+
:create_db => true,
|
35
|
+
:create_role => true,
|
36
|
+
:inherit => false,
|
37
|
+
:login => true,
|
38
|
+
:connection_limit => 10,
|
39
|
+
:password => 'testing',
|
40
|
+
:encrypted_password => true,
|
41
|
+
:valid_until => Date.parse('2011-10-12'),
|
42
|
+
:in_role => 'bar',
|
43
|
+
:role => 'baz',
|
44
|
+
:admin => 'blort'
|
45
|
+
})
|
46
|
+
|
47
|
+
assert_equal([
|
48
|
+
%{ALTER 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"}
|
49
|
+
], statements)
|
50
|
+
end
|
51
|
+
|
52
|
+
def test_drop_role
|
53
|
+
ARBC.drop_role('foo')
|
54
|
+
ARBC.drop_role(%w{ foo bar baz })
|
55
|
+
ARBC.drop_role(%w{ foo bar baz }, :if_exists => true)
|
56
|
+
|
57
|
+
assert_equal([
|
58
|
+
'DROP ROLE "foo"',
|
59
|
+
'DROP ROLE "foo", "bar", "baz"',
|
60
|
+
'DROP ROLE IF EXISTS "foo", "bar", "baz"',
|
61
|
+
], statements)
|
62
|
+
end
|
63
|
+
end
|
data/test/rules_test.rb
CHANGED
@@ -6,10 +6,10 @@ class RulesTests < Test::Unit::TestCase
|
|
6
6
|
include PostgreSQLExtensionsTestHelper
|
7
7
|
|
8
8
|
def test_create_rule
|
9
|
-
|
9
|
+
ARBC.create_rule(
|
10
10
|
:ignore_root, :update, :users, :instead, :nothing, :conditions => 'user_id = 0'
|
11
11
|
)
|
12
|
-
|
12
|
+
ARBC.create_rule(
|
13
13
|
:ignore_root, :update, :users, :instead, 'SELECT * FROM non_admins', {
|
14
14
|
:force => true,
|
15
15
|
:conditions => 'user_id > 0'
|
@@ -23,7 +23,7 @@ class RulesTests < Test::Unit::TestCase
|
|
23
23
|
end
|
24
24
|
|
25
25
|
def test_drop_rule
|
26
|
-
|
26
|
+
ARBC.drop_rule(:foo, :bar)
|
27
27
|
|
28
28
|
assert_equal([
|
29
29
|
"DROP RULE \"foo\" ON \"bar\"",
|
data/test/test_helper.rb
CHANGED
@@ -8,8 +8,6 @@ require 'active_record'
|
|
8
8
|
require 'test/unit'
|
9
9
|
require File.join(File.dirname(__FILE__), *%w{ .. lib activerecord-postgresql-extensions })
|
10
10
|
|
11
|
-
puts "Testing against ActiveRecord #{Gem.loaded_specs['activerecord'].version.to_s}"
|
12
|
-
|
13
11
|
ActiveRecord::Base.configurations = {
|
14
12
|
'arunit' => {
|
15
13
|
:adapter => 'postgresql',
|
@@ -24,6 +22,11 @@ ActiveRecord::Base.establish_connection 'arunit'
|
|
24
22
|
|
25
23
|
ARBC = ActiveRecord::Base.connection
|
26
24
|
|
25
|
+
puts "Testing against ActiveRecord #{Gem.loaded_specs['activerecord'].version.to_s}"
|
26
|
+
if postgresql_version = ARBC.query('SELECT version()').flatten.to_s
|
27
|
+
puts "PostgreSQL info from version(): #{postgresql_version}"
|
28
|
+
end
|
29
|
+
|
27
30
|
class ActiveRecord::ConnectionAdapters::PostgreSQLAdapter
|
28
31
|
def statements
|
29
32
|
@statements ||= []
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: activerecord-postgresql-extensions
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.10
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2011-
|
12
|
+
date: 2011-10-05 00:00:00.000000000 Z
|
13
13
|
dependencies: []
|
14
14
|
description: A whole bunch of extensions the ActiveRecord PostgreSQL adapter.
|
15
15
|
email: code@zoocasa.com
|
@@ -32,6 +32,7 @@ files:
|
|
32
32
|
- lib/postgresql_extensions/postgresql_indexes.rb
|
33
33
|
- lib/postgresql_extensions/postgresql_languages.rb
|
34
34
|
- lib/postgresql_extensions/postgresql_permissions.rb
|
35
|
+
- lib/postgresql_extensions/postgresql_roles.rb
|
35
36
|
- lib/postgresql_extensions/postgresql_rules.rb
|
36
37
|
- lib/postgresql_extensions/postgresql_schemas.rb
|
37
38
|
- lib/postgresql_extensions/postgresql_sequences.rb
|
@@ -47,6 +48,7 @@ files:
|
|
47
48
|
- test/index_test.rb
|
48
49
|
- test/languages_test.rb
|
49
50
|
- test/permissions_test.rb
|
51
|
+
- test/roles_test.rb
|
50
52
|
- test/rules_test.rb
|
51
53
|
- test/schemas_test.rb
|
52
54
|
- test/sequences_test.rb
|
@@ -72,7 +74,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
72
74
|
version: '0'
|
73
75
|
requirements: []
|
74
76
|
rubyforge_project:
|
75
|
-
rubygems_version: 1.8.
|
77
|
+
rubygems_version: 1.8.10
|
76
78
|
signing_key:
|
77
79
|
specification_version: 3
|
78
80
|
summary: A whole bunch of extensions the ActiveRecord PostgreSQL adapter.
|