rails-pg-procs 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|