rails-pg-procs 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (51) hide show
  1. data/.document +5 -0
  2. data/.gitignore +5 -0
  3. data/LICENSE +20 -0
  4. data/README +15 -0
  5. data/README.rdoc +18 -0
  6. data/Rakefile +60 -0
  7. data/VERSION +1 -0
  8. data/docs/classes/ActiveRecord.html +117 -0
  9. data/docs/classes/ActiveRecord/ConnectionAdapters.html +113 -0
  10. data/docs/classes/ActiveRecord/ConnectionAdapters/PostgreSQLAdapter.html +589 -0
  11. data/docs/classes/ActiveRecord/ConnectionAdapters/ProcedureDefinition.html +110 -0
  12. data/docs/classes/ActiveRecord/ConnectionAdapters/TriggerDefinition.html +519 -0
  13. data/docs/classes/ActiveRecord/ConnectionAdapters/TypeDefinition.html +110 -0
  14. data/docs/classes/ActiveRecord/SchemaDumper.html +371 -0
  15. data/docs/classes/Inflector.html +164 -0
  16. data/docs/classes/SchemaProcs.html +211 -0
  17. data/docs/classes/SqlFormat.html +139 -0
  18. data/docs/classes/String.html +117 -0
  19. data/docs/classes/Symbol.html +117 -0
  20. data/docs/created.rid +1 -0
  21. data/docs/fr_class_index.html +36 -0
  22. data/docs/fr_method_index.html +63 -0
  23. data/docs/index.html +22 -0
  24. data/docs/rdoc-style.css +208 -0
  25. data/init.rb +3 -0
  26. data/install.rb +1 -0
  27. data/lib/connection_adapters/aggregagtes_definition.rb +1 -0
  28. data/lib/connection_adapters/connection_adapters.rb +8 -0
  29. data/lib/connection_adapters/index_definition.rb +24 -0
  30. data/lib/connection_adapters/postgresql_adapter.rb +256 -0
  31. data/lib/connection_adapters/procedure_definition.rb +6 -0
  32. data/lib/connection_adapters/schema_definition.rb +24 -0
  33. data/lib/connection_adapters/schema_statements.rb +11 -0
  34. data/lib/connection_adapters/trigger_definition.rb +114 -0
  35. data/lib/connection_adapters/type_definition.rb +17 -0
  36. data/lib/connection_adapters/view_definition.rb +34 -0
  37. data/lib/inflector.rb +10 -0
  38. data/lib/rails_pg_procs.rb +8 -0
  39. data/lib/schema_dumper.rb +96 -0
  40. data/lib/schema_procs.rb +19 -0
  41. data/lib/sql_format.rb +17 -0
  42. data/tasks/rails_pg_procs.rake +4 -0
  43. data/test/connection.rb +16 -0
  44. data/test/procedure_test.rb +78 -0
  45. data/test/rails_pg_procs_test.rb +246 -0
  46. data/test/test_helper.rb +41 -0
  47. data/test/trigger_test.rb +87 -0
  48. data/test/type_test.rb +46 -0
  49. data/test/view_test.rb +36 -0
  50. data/uninstall.rb +1 -0
  51. metadata +112 -0
@@ -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
@@ -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
@@ -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
@@ -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