rails-pg-procs 1.0.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.
- data/.document +5 -0
- data/.gitignore +5 -0
- data/LICENSE +20 -0
- data/README +15 -0
- data/README.rdoc +18 -0
- data/Rakefile +60 -0
- data/VERSION +1 -0
- data/docs/classes/ActiveRecord.html +117 -0
- data/docs/classes/ActiveRecord/ConnectionAdapters.html +113 -0
- data/docs/classes/ActiveRecord/ConnectionAdapters/PostgreSQLAdapter.html +589 -0
- data/docs/classes/ActiveRecord/ConnectionAdapters/ProcedureDefinition.html +110 -0
- data/docs/classes/ActiveRecord/ConnectionAdapters/TriggerDefinition.html +519 -0
- data/docs/classes/ActiveRecord/ConnectionAdapters/TypeDefinition.html +110 -0
- data/docs/classes/ActiveRecord/SchemaDumper.html +371 -0
- data/docs/classes/Inflector.html +164 -0
- data/docs/classes/SchemaProcs.html +211 -0
- data/docs/classes/SqlFormat.html +139 -0
- data/docs/classes/String.html +117 -0
- data/docs/classes/Symbol.html +117 -0
- data/docs/created.rid +1 -0
- data/docs/fr_class_index.html +36 -0
- data/docs/fr_method_index.html +63 -0
- data/docs/index.html +22 -0
- data/docs/rdoc-style.css +208 -0
- data/init.rb +3 -0
- data/install.rb +1 -0
- data/lib/connection_adapters/aggregagtes_definition.rb +1 -0
- data/lib/connection_adapters/connection_adapters.rb +8 -0
- data/lib/connection_adapters/index_definition.rb +24 -0
- data/lib/connection_adapters/postgresql_adapter.rb +256 -0
- data/lib/connection_adapters/procedure_definition.rb +6 -0
- data/lib/connection_adapters/schema_definition.rb +24 -0
- data/lib/connection_adapters/schema_statements.rb +11 -0
- data/lib/connection_adapters/trigger_definition.rb +114 -0
- data/lib/connection_adapters/type_definition.rb +17 -0
- data/lib/connection_adapters/view_definition.rb +34 -0
- data/lib/inflector.rb +10 -0
- data/lib/rails_pg_procs.rb +8 -0
- data/lib/schema_dumper.rb +96 -0
- data/lib/schema_procs.rb +19 -0
- data/lib/sql_format.rb +17 -0
- data/tasks/rails_pg_procs.rake +4 -0
- data/test/connection.rb +16 -0
- data/test/procedure_test.rb +78 -0
- data/test/rails_pg_procs_test.rb +246 -0
- data/test/test_helper.rb +41 -0
- data/test/trigger_test.rb +87 -0
- data/test/type_test.rb +46 -0
- data/test/view_test.rb +36 -0
- data/uninstall.rb +1 -0
- metadata +112 -0
data/test/test_helper.rb
ADDED
@@ -0,0 +1,41 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'stringio'
|
3
|
+
require 'runit/assert'
|
4
|
+
require 'test/unit'
|
5
|
+
|
6
|
+
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
7
|
+
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
8
|
+
require 'rails_pg_procs'
|
9
|
+
require 'connection'
|
10
|
+
|
11
|
+
class ActiveRecord::SchemaDumper; public_class_method :new; end
|
12
|
+
# we want new public for the tests so we can test each method independantly from the rest
|
13
|
+
|
14
|
+
class Test::Unit::TestCase
|
15
|
+
@_use_transactional_fixtures = false
|
16
|
+
|
17
|
+
include RUNIT::Assert
|
18
|
+
def setup
|
19
|
+
@connection = ActiveRecord::Base.connection
|
20
|
+
@connection.create_table(:test_table, :force => true) {|t|
|
21
|
+
t.text :name
|
22
|
+
t.timestamp :when
|
23
|
+
}
|
24
|
+
|
25
|
+
@query_body = "
|
26
|
+
BEGIN
|
27
|
+
-- do something --
|
28
|
+
END;
|
29
|
+
"
|
30
|
+
end
|
31
|
+
|
32
|
+
def teardown
|
33
|
+
@connection.drop_table(:test_table)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
class String
|
38
|
+
def to_regex
|
39
|
+
Regexp.new(self.gsub(/([\s\n\t]+)/, '\\1+').gsub(/([\(\)\[\]\{\}\.\\\$])/) {|s| '\\' + s })
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,87 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class TriggerTest < Test::Unit::TestCase
|
4
|
+
def test_add_trigger
|
5
|
+
trig = ActiveRecord::ConnectionAdapters::TriggerDefinition.new(0, "trade_materials", nil, [:insert, :update])
|
6
|
+
assert_equal('CREATE TRIGGER "insert_or_update_after_trade_materials_trigger" AFTER INSERT OR UPDATE ON "trade_materials" FOR EACH STATEMENT EXECUTE PROCEDURE "insert_or_update_after_trade_materials_trigger"();', trig.to_sql_create)
|
7
|
+
assert_equal(' add_trigger "trade_materials", [:insert, :update]', trig.to_rdl)
|
8
|
+
|
9
|
+
trig = ActiveRecord::ConnectionAdapters::TriggerDefinition.new(0, "trade_materials", "update_trade_materials_statuses_logt", [:insert, :update])
|
10
|
+
assert_equal('CREATE TRIGGER "update_trade_materials_statuses_logt" AFTER INSERT OR UPDATE ON "trade_materials" FOR EACH STATEMENT EXECUTE PROCEDURE "update_trade_materials_statuses_logt"();', trig.to_sql_create)
|
11
|
+
assert_equal(' add_trigger "trade_materials", [:insert, :update], :name => :update_trade_materials_statuses_logt, :function => :update_trade_materials_statuses_logt', trig.to_rdl)
|
12
|
+
|
13
|
+
trig = ActiveRecord::ConnectionAdapters::TriggerDefinition.new(0, "trade_materials", "update_trade_materials_statuses_logt", [:insert, :update, :before, :row], "update_trade_materials_statuses_logf")
|
14
|
+
assert_equal('CREATE TRIGGER "update_trade_materials_statuses_logt" BEFORE INSERT OR UPDATE ON "trade_materials" FOR EACH ROW EXECUTE PROCEDURE "update_trade_materials_statuses_logf"();', trig.to_sql_create)
|
15
|
+
assert_equal(' add_trigger "trade_materials", [:insert, :update], :before => true, :row => true, :name => :update_trade_materials_statuses_logt, :function => :update_trade_materials_statuses_logf', trig.to_rdl)
|
16
|
+
|
17
|
+
trig = ActiveRecord::ConnectionAdapters::TriggerDefinition.new(0, "trade_materials", nil, [:insert, :update], "update_trade_materials_statuses_logf")
|
18
|
+
assert_equal('CREATE TRIGGER "insert_or_update_after_trade_materials_trigger" AFTER INSERT OR UPDATE ON "trade_materials" FOR EACH STATEMENT EXECUTE PROCEDURE "update_trade_materials_statuses_logf"();', trig.to_sql_create)
|
19
|
+
assert_equal(' add_trigger "trade_materials", [:insert, :update], :function => :update_trade_materials_statuses_logf', trig.to_rdl)
|
20
|
+
|
21
|
+
@connection.create_proc("update_trade_materials_statuses_logf", [], :return => "trigger") { @query_body }
|
22
|
+
assert_nothing_raised {
|
23
|
+
@connection.add_trigger("test_table", [:insert, :update], :row => true, :name => "update_trade_materials_statuses_logt", :function => "update_trade_materials_statuses_logf")
|
24
|
+
}
|
25
|
+
count = @connection.select_value("SELECT count(*) FROM pg_trigger WHERE tgname = 'update_trade_materials_statuses_logt' and tgrelid = (SELECT oid FROM pg_class WHERE relname = 'test_table')", "count")
|
26
|
+
assert_equal("1", count)
|
27
|
+
assert_nothing_raised {
|
28
|
+
@connection.remove_trigger("test_table", "update_trade_materials_statuses_logt")
|
29
|
+
}
|
30
|
+
count = @connection.select_value("SELECT count(*) FROM pg_trigger WHERE tgname = 'update_trade_materials_statuses_logt' and tgrelid = (SELECT oid FROM pg_class WHERE relname = 'test_table')", "count")
|
31
|
+
assert_equal("0", count)
|
32
|
+
@connection.drop_proc("update_trade_materials_statuses_logf", [])
|
33
|
+
end
|
34
|
+
|
35
|
+
def test_calculations
|
36
|
+
trig = ActiveRecord::ConnectionAdapters::TriggerDefinition.new(1, 'test_table', 'name', 0b00010101, 'function')
|
37
|
+
assert(trig.send("calc", ActiveRecord::ConnectionAdapters::TriggerDefinition::INSERT))
|
38
|
+
assert(trig.send("calc", ActiveRecord::ConnectionAdapters::TriggerDefinition::UPDATE))
|
39
|
+
assert(trig.send("calc", ActiveRecord::ConnectionAdapters::TriggerDefinition::ROW))
|
40
|
+
trig.binary_type = 0b00001010
|
41
|
+
assert_equal(10, trig.binary_type)
|
42
|
+
assert(trig.send("calc", ActiveRecord::ConnectionAdapters::TriggerDefinition::DELETE))
|
43
|
+
assert(trig.send("calc", ActiveRecord::ConnectionAdapters::TriggerDefinition::BEFORE))
|
44
|
+
trig.send("binary_type=", :insert, :row, :before)
|
45
|
+
assert_equal(7, trig.binary_type)
|
46
|
+
assert(trig.send("calc", ActiveRecord::ConnectionAdapters::TriggerDefinition::INSERT))
|
47
|
+
assert(trig.send("calc", ActiveRecord::ConnectionAdapters::TriggerDefinition::BEFORE))
|
48
|
+
assert(trig.send("calc", ActiveRecord::ConnectionAdapters::TriggerDefinition::ROW))
|
49
|
+
trig.send("binary_type=", :insert, :update)
|
50
|
+
trig.binary_type = 0b00010100
|
51
|
+
assert_equal(20, trig.binary_type)
|
52
|
+
assert(trig.send("calc", ActiveRecord::ConnectionAdapters::TriggerDefinition::INSERT))
|
53
|
+
assert(trig.send("calc", ActiveRecord::ConnectionAdapters::TriggerDefinition::UPDATE))
|
54
|
+
end
|
55
|
+
|
56
|
+
def test_constants
|
57
|
+
assert_equal 1<<0, ActiveRecord::ConnectionAdapters::TriggerDefinition::ROW
|
58
|
+
assert_equal 1<<1, ActiveRecord::ConnectionAdapters::TriggerDefinition::BEFORE
|
59
|
+
assert_equal 1<<2, ActiveRecord::ConnectionAdapters::TriggerDefinition::INSERT
|
60
|
+
assert_equal 1<<3, ActiveRecord::ConnectionAdapters::TriggerDefinition::DELETE
|
61
|
+
assert_equal 1<<4, ActiveRecord::ConnectionAdapters::TriggerDefinition::UPDATE
|
62
|
+
end
|
63
|
+
|
64
|
+
def test_trigger_definition_class
|
65
|
+
trig = ActiveRecord::ConnectionAdapters::TriggerDefinition.new(0, 'test_table', 'name', 0b00010101, 'function')
|
66
|
+
assert_equal('name', trig.name)
|
67
|
+
assert_equal('test_table', trig.table)
|
68
|
+
assert_equal(0b00010101, trig.binary_type)
|
69
|
+
assert_equal('function', trig.procedure_name)
|
70
|
+
trig.binary_type = 0b00011101
|
71
|
+
assert_equal(29, trig.binary_type)
|
72
|
+
trig.binary_type = :insert, :update
|
73
|
+
assert_equal(20, trig.binary_type)
|
74
|
+
trig.send("binary_type=", :insert, :delete)
|
75
|
+
assert_equal(12, trig.binary_type)
|
76
|
+
trig = ActiveRecord::ConnectionAdapters::TriggerDefinition.new(0, 'test_table', nil, [:insert, :delete])
|
77
|
+
assert_equal('insert_or_delete_after_test_table_trigger', trig.name)
|
78
|
+
assert_equal('insert_or_delete_after_test_table_trigger', trig.procedure_name)
|
79
|
+
|
80
|
+
trig.procedure_name = "update_trigger"
|
81
|
+
assert_equal('insert_or_delete_after_test_table_trigger', trig.name)
|
82
|
+
assert_equal('update_trigger' , trig.procedure_name)
|
83
|
+
assert trig.triggerized?
|
84
|
+
assert !trig.triggerized?(trig.procedure_name)
|
85
|
+
end
|
86
|
+
|
87
|
+
end
|
data/test/type_test.rb
ADDED
@@ -0,0 +1,46 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class TypeTest < Test::Unit::TestCase
|
4
|
+
def test_create_type
|
5
|
+
assert_exception(ActiveRecord::StatementInvalid, "Missing columns") {
|
6
|
+
@connection.create_type("user", {})
|
7
|
+
}
|
8
|
+
assert_exception(ActiveRecord::StatementInvalid, "Missing columns") {
|
9
|
+
@connection.create_type("user", [])
|
10
|
+
}
|
11
|
+
|
12
|
+
[
|
13
|
+
'CREATE TYPE "user"',
|
14
|
+
'"name" varchar(10)',
|
15
|
+
'"zip" numeric(5,0)'
|
16
|
+
].each {|re|
|
17
|
+
assert_match re.to_regex, @connection.send("get_type_query", "user", [:name, "varchar(10)"], {:zip => "numeric(5,0)"}, [:is_customer => :boolean])
|
18
|
+
}
|
19
|
+
|
20
|
+
# @connection.drop_type :qualitysmith_user
|
21
|
+
assert_nothing_raised {
|
22
|
+
@connection.create_type(:qualitysmith_user, [:name, "varchar(10)"], {:zip => "numeric(5,0)"}, [:is_customer => :boolean])
|
23
|
+
}
|
24
|
+
count = @connection.select_value("select count(*) from pg_type where typname = 'qualitysmith_user'", "count")
|
25
|
+
assert_equal("1", count)
|
26
|
+
assert_nothing_raised {
|
27
|
+
@connection.drop_type(:qualitysmith_user)
|
28
|
+
}
|
29
|
+
count = @connection.select_value("select count(*) from pg_type where typname = 'qualitysmith_user'", "count")
|
30
|
+
assert_equal("0", count)
|
31
|
+
end
|
32
|
+
|
33
|
+
def test_schema_dumper_type
|
34
|
+
# a type test
|
35
|
+
@connection.create_type("qualitysmith_user", [:name, "varchar(10)"], {:zip => "numeric(5,0)"}, [:is_customer => :boolean])
|
36
|
+
assert_no_exception(NoMethodError) do
|
37
|
+
dumper = ActiveRecord::SchemaDumper.new(@connection)
|
38
|
+
stream = StringIO.new
|
39
|
+
dumper.send(:types, stream)
|
40
|
+
stream.rewind
|
41
|
+
received = stream.read
|
42
|
+
assert_match %q|create_type "qualitysmith_user", [:name, "character varying(10)"], [:zip, "numeric(5,0)"], [:is_customer, :boolean]|.to_regex, received.chomp
|
43
|
+
end
|
44
|
+
@connection.drop_type(:qualitysmith_user)
|
45
|
+
end
|
46
|
+
end
|
data/test/view_test.rb
ADDED
@@ -0,0 +1,36 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class ViewTest < Test::Unit::TestCase
|
4
|
+
def test_view_definition_class
|
5
|
+
view = ActiveRecord::ConnectionAdapters::ViewDefinition.new(0, :trade_materials_view) { "SELECT 'aview'" }
|
6
|
+
[
|
7
|
+
/CREATE OR REPLACE VIEW/,
|
8
|
+
/\"trade_materials_view\"/,
|
9
|
+
/\n[\s\t]+AS SELECT 'aview'/,
|
10
|
+
].each {|re|
|
11
|
+
assert_match(re, view.to_sql)
|
12
|
+
}
|
13
|
+
assert_equal('DROP VIEW "trade_materials_view" RESTRICT', view.to_sql(:drop))
|
14
|
+
|
15
|
+
[
|
16
|
+
/create_view\(:trade_materials_view\)/,
|
17
|
+
/SELECT 'aview'/,
|
18
|
+
/\$trade_materials_view_body\$/
|
19
|
+
].each {|re|
|
20
|
+
assert_match(re, view.to_rdl())
|
21
|
+
}
|
22
|
+
|
23
|
+
count = @connection.select_value("SELECT count(*) FROM pg_class WHERE relname = 'trade_materials_view' AND relkind = 'v'", "count")
|
24
|
+
assert_equal("0", count)
|
25
|
+
assert_nothing_raised {
|
26
|
+
@connection.create_view("trade_materials_view") { "SELECT 'aview'" }
|
27
|
+
}
|
28
|
+
count = @connection.select_value("SELECT count(*) FROM pg_class WHERE relname = 'trade_materials_view' AND relkind = 'v'", "count")
|
29
|
+
assert_equal("1", count)
|
30
|
+
assert_nothing_raised {
|
31
|
+
@connection.drop_view("trade_materials_view")
|
32
|
+
}
|
33
|
+
count = @connection.select_value("SELECT count(*) FROM pg_class WHERE relname = 'trade_materials_view' AND relkind = 'v'", "count")
|
34
|
+
assert_equal("0", count)
|
35
|
+
end
|
36
|
+
end
|
data/uninstall.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
# Uninstall hook code here
|
metadata
ADDED
@@ -0,0 +1,112 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: rails-pg-procs
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Scott Noel-Hemming
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
|
12
|
+
date: 2009-11-08 00:00:00 -08:00
|
13
|
+
default_executable:
|
14
|
+
dependencies: []
|
15
|
+
|
16
|
+
description: PostgreSQL Stored Proc/Trigger/View/User defined Type/Aggregate Type for Ruby Schema dump in Rails
|
17
|
+
email: frogstarr78@gmail.com
|
18
|
+
executables: []
|
19
|
+
|
20
|
+
extensions: []
|
21
|
+
|
22
|
+
extra_rdoc_files:
|
23
|
+
- LICENSE
|
24
|
+
- README
|
25
|
+
- README.rdoc
|
26
|
+
files:
|
27
|
+
- .document
|
28
|
+
- .gitignore
|
29
|
+
- LICENSE
|
30
|
+
- README
|
31
|
+
- README.rdoc
|
32
|
+
- Rakefile
|
33
|
+
- VERSION
|
34
|
+
- docs/classes/ActiveRecord.html
|
35
|
+
- docs/classes/ActiveRecord/ConnectionAdapters.html
|
36
|
+
- docs/classes/ActiveRecord/ConnectionAdapters/PostgreSQLAdapter.html
|
37
|
+
- docs/classes/ActiveRecord/ConnectionAdapters/ProcedureDefinition.html
|
38
|
+
- docs/classes/ActiveRecord/ConnectionAdapters/TriggerDefinition.html
|
39
|
+
- docs/classes/ActiveRecord/ConnectionAdapters/TypeDefinition.html
|
40
|
+
- docs/classes/ActiveRecord/SchemaDumper.html
|
41
|
+
- docs/classes/Inflector.html
|
42
|
+
- docs/classes/SchemaProcs.html
|
43
|
+
- docs/classes/SqlFormat.html
|
44
|
+
- docs/classes/String.html
|
45
|
+
- docs/classes/Symbol.html
|
46
|
+
- docs/created.rid
|
47
|
+
- docs/fr_class_index.html
|
48
|
+
- docs/fr_method_index.html
|
49
|
+
- docs/index.html
|
50
|
+
- docs/rdoc-style.css
|
51
|
+
- init.rb
|
52
|
+
- install.rb
|
53
|
+
- lib/connection_adapters/aggregagtes_definition.rb
|
54
|
+
- lib/connection_adapters/connection_adapters.rb
|
55
|
+
- lib/connection_adapters/index_definition.rb
|
56
|
+
- lib/connection_adapters/postgresql_adapter.rb
|
57
|
+
- lib/connection_adapters/procedure_definition.rb
|
58
|
+
- lib/connection_adapters/schema_definition.rb
|
59
|
+
- lib/connection_adapters/schema_statements.rb
|
60
|
+
- lib/connection_adapters/trigger_definition.rb
|
61
|
+
- lib/connection_adapters/type_definition.rb
|
62
|
+
- lib/connection_adapters/view_definition.rb
|
63
|
+
- lib/inflector.rb
|
64
|
+
- lib/rails_pg_procs.rb
|
65
|
+
- lib/schema_dumper.rb
|
66
|
+
- lib/schema_procs.rb
|
67
|
+
- lib/sql_format.rb
|
68
|
+
- tasks/rails_pg_procs.rake
|
69
|
+
- test/connection.rb
|
70
|
+
- test/procedure_test.rb
|
71
|
+
- test/rails_pg_procs_test.rb
|
72
|
+
- test/test_helper.rb
|
73
|
+
- test/trigger_test.rb
|
74
|
+
- test/type_test.rb
|
75
|
+
- test/view_test.rb
|
76
|
+
- uninstall.rb
|
77
|
+
has_rdoc: true
|
78
|
+
homepage: http://github.com/frogstarr78/rails-pg-procs
|
79
|
+
licenses: []
|
80
|
+
|
81
|
+
post_install_message:
|
82
|
+
rdoc_options:
|
83
|
+
- --charset=UTF-8
|
84
|
+
require_paths:
|
85
|
+
- lib
|
86
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
87
|
+
requirements:
|
88
|
+
- - ">="
|
89
|
+
- !ruby/object:Gem::Version
|
90
|
+
version: "0"
|
91
|
+
version:
|
92
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - ">="
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: "0"
|
97
|
+
version:
|
98
|
+
requirements: []
|
99
|
+
|
100
|
+
rubyforge_project: railspgprocs
|
101
|
+
rubygems_version: 1.3.5
|
102
|
+
signing_key:
|
103
|
+
specification_version: 3
|
104
|
+
summary: PostgreSQL Stored Proc/Trigger/View/User defined Type/Aggregate Type for Ruby Schema dump in Rails
|
105
|
+
test_files:
|
106
|
+
- test/rails_pg_procs_test.rb
|
107
|
+
- test/type_test.rb
|
108
|
+
- test/connection.rb
|
109
|
+
- test/trigger_test.rb
|
110
|
+
- test/procedure_test.rb
|
111
|
+
- test/test_helper.rb
|
112
|
+
- test/view_test.rb
|