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.
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