qubole_rails_sql_views 0.10.1 → 0.10.3

Sign up to get free protection for your applications and to get access to all the features.
data/Rakefile CHANGED
@@ -8,7 +8,7 @@ require File.join(File.dirname(__FILE__), 'lib/qubole_rails_sql_views', 'version
8
8
 
9
9
  PKG_BUILD = ENV['PKG_BUILD'] ? '.' + ENV['PKG_BUILD'] : ''
10
10
  PKG_NAME = 'qubole_rails_sql_views'
11
- PKG_VERSION = QuboleRailsSqlViews::VERSION::STRING + PKG_BUILD
11
+ PKG_VERSION = RailsSqlViews::VERSION::STRING + PKG_BUILD
12
12
  PKG_FILE_NAME = "#{PKG_NAME}-#{PKG_VERSION}"
13
13
  PKG_DESTINATION = ENV["PKG_DESTINATION"] || "../#{PKG_NAME}"
14
14
 
@@ -53,7 +53,7 @@ begin
53
53
  s.name = "qubole_rails_sql_views"
54
54
  s.summary = "Library which adds SQL Views to ActiveRecord."
55
55
  s.email = "josh@technicalpickles.com"
56
- s.homepage = "http://github.com/vrajat/rails_sql_views"
56
+ s.homepage = "http://activewarehouse.rubyforge.org/qubole_rails_sql_views"
57
57
  s.description = "Adds support for using SQL views within ActiveRecord"
58
58
  s.authors = ["Anthony Eden"]
59
59
  s.files = FileList[
@@ -63,6 +63,10 @@ begin
63
63
  "{bin,lib}/**/*"
64
64
  ]
65
65
  s.add_dependency 'activerecord'
66
+ s.add_development_dependency 'flexmock'
67
+ s.add_development_dependency 'pg'
68
+ s.add_development_dependency 'mysql'
69
+ s.add_development_dependency 'mysql2'
66
70
  end
67
71
  rescue LoadError
68
72
  puts "Jeweler, or one of its dependencies, is not available. Install it with: sudo gem install technicalpickles-jeweler -s http://gems.github.com"
@@ -70,5 +74,5 @@ end
70
74
 
71
75
  desc "Publish the API documentation"
72
76
  task :pdoc => [:rdoc] do
73
- Rake::SshDirPublisher.new("aeden@rubyforge.org", "/var/www/gforge-projects/activewarehouse/rails_sql_views/rdoc", "rdoc").upload
77
+ Rake::SshDirPublisher.new("aeden@rubyforge.org", "/var/www/gforge-projects/activewarehouse/qubole_rails_sql_views/rdoc", "rdoc").upload
74
78
  end
@@ -43,11 +43,11 @@ module ActiveRecord # :nodoc:
43
43
  end
44
44
  case r.macro
45
45
  when :belongs_to
46
- if self.column_names.include?(r.primary_key_name.to_s)
46
+ if self.column_names.include?(r.foreign_key.to_s)
47
47
  if !r.options[:foreign_type] || self.column_names.include?(r.options[:foreign_type])
48
48
  options = r.options.merge(
49
49
  :class_name => r.class_name,
50
- :foreign_key => r.primary_key_name
50
+ :foreign_key => r.foreign_key
51
51
  )
52
52
  belongs_to r.name, options
53
53
  end
@@ -56,13 +56,13 @@ module ActiveRecord # :nodoc:
56
56
  ### TODO :through assocications
57
57
  options = r.options.merge(
58
58
  :class_name => r.class_name,
59
- :foreign_key => r.primary_key_name
59
+ :foreign_key => r.foreign_key
60
60
  )
61
61
  has_many r.name, options
62
62
  when :has_and_belongs_to_many
63
63
  options = r.options.merge(
64
64
  :class_name => r.class_name,
65
- :foreign_key => r.primary_key_name,
65
+ :foreign_key => r.foreign_key,
66
66
  :association_foreign_key => r.association_foreign_key
67
67
  )
68
68
  has_and_belongs_to_many r.name, options
@@ -0,0 +1,62 @@
1
+ module QuboleRailsSqlViews
2
+ module ConnectionAdapters
3
+ module Mysql2Adapter
4
+ def self.included(base)
5
+ if base.private_method_defined?(:supports_views?) || base.protected_method_defined?(:supports_views?)
6
+ base.send(:public, :supports_views?)
7
+ end
8
+ end
9
+
10
+ # Returns true as this adapter supports views.
11
+ def supports_views?
12
+ true
13
+ end
14
+
15
+ def base_tables(name = nil) #:nodoc:
16
+ tables = []
17
+ execute("SHOW FULL TABLES WHERE TABLE_TYPE='BASE TABLE'").each{|row| tables << row[0]}
18
+ tables
19
+ end
20
+ alias nonview_tables base_tables
21
+
22
+ def views(name = nil) #:nodoc:
23
+ views = []
24
+ execute("SHOW FULL TABLES WHERE TABLE_TYPE='VIEW'").each{|row| views << row[0]}
25
+ views
26
+ end
27
+
28
+ def tables_with_views_included(name = nil)
29
+ nonview_tables(name) + views(name)
30
+ end
31
+
32
+ def structure_dump
33
+ structure = ""
34
+ base_tables.each do |table|
35
+ structure += select_one("SHOW CREATE TABLE #{quote_table_name(table)}")["Create Table"] + ";\n\n"
36
+ end
37
+
38
+ views.each do |view|
39
+ structure += select_one("SHOW CREATE VIEW #{quote_table_name(view)}")["Create View"] + ";\n\n"
40
+ end
41
+
42
+ return structure
43
+ end
44
+
45
+ # Get the view select statement for the specified table.
46
+ def view_select_statement(view, name=nil)
47
+ begin
48
+ row = execute("SHOW CREATE VIEW #{view}", name).each do |row|
49
+ return convert_statement(row[1]) if row[0] == view
50
+ end
51
+ rescue ActiveRecord::StatementInvalid => e
52
+ raise "No view called #{view} found"
53
+ end
54
+ end
55
+
56
+ private
57
+ def convert_statement(s)
58
+ s.gsub!(/.* AS (select .*)/, '\1')
59
+ end
60
+ end
61
+ end
62
+ end
@@ -1,9 +1,13 @@
1
1
  module QuboleRailsSqlViews
2
2
  module ConnectionAdapters
3
3
  module MysqlAdapter
4
+ REQUIRED_METHODS = [:supports_views?]
5
+
4
6
  def self.included(base)
5
- if base.private_method_defined?(:supports_views?)
6
- base.send(:public, :supports_views?)
7
+ base.class_eval do
8
+ def self.method_added(method)
9
+ public(method) if REQUIRED_METHODS.include?(method) && !self.public_method_defined?(method)
10
+ end
7
11
  end
8
12
  end
9
13
 
@@ -18,7 +22,7 @@ module QuboleRailsSqlViews
18
22
  tables
19
23
  end
20
24
  alias nonview_tables base_tables
21
-
25
+
22
26
  def views(name = nil) #:nodoc:
23
27
  views = []
24
28
  execute("SHOW FULL TABLES WHERE TABLE_TYPE='VIEW'").each{|row| views << row[0]}
@@ -28,7 +32,7 @@ module QuboleRailsSqlViews
28
32
  def tables_with_views_included(name = nil)
29
33
  nonview_tables(name) + views(name)
30
34
  end
31
-
35
+
32
36
  def structure_dump
33
37
  structure = ""
34
38
  base_tables.each do |table|
@@ -52,7 +56,7 @@ module QuboleRailsSqlViews
52
56
  raise "No view called #{view} found"
53
57
  end
54
58
  end
55
-
59
+
56
60
  private
57
61
  def convert_statement(s)
58
62
  s.gsub!(/.* AS (select .*)/, '\1')
@@ -2,7 +2,7 @@ module QuboleRailsSqlViews
2
2
  module ConnectionAdapters
3
3
  module PostgreSQLAdapter
4
4
  def self.included(base)
5
- base.alias_method_chain :tables, :views_included
5
+ base.alias_method_chain :tables, :views_included unless method_defined?(:tables_with_views_included)
6
6
  end
7
7
  # Returns true as this adapter supports views.
8
8
  def supports_views?
@@ -10,6 +10,8 @@ module QuboleRailsSqlViews
10
10
  ActiveRecord::ConnectionAdapters.const_get("#{db}Adapter").class_eval do
11
11
  include QuboleRailsSqlViews::ConnectionAdapters::AbstractAdapter
12
12
  include QuboleRailsSqlViews::ConnectionAdapters.const_get("#{db}Adapter")
13
+ # prevent reloading extension when the environment is reloaded
14
+ $qubole_rails_sql_views_included = true
13
15
  end
14
16
  end
15
17
  end
@@ -26,6 +26,7 @@ module QuboleRailsSqlViews
26
26
  def dump_with_views(stream)
27
27
  dump_without_views(stream)
28
28
  begin
29
+ @connection.class.send(:public, :supports_views?) # this is a kluge, but I don't know why it's changing back to private before it gets here
29
30
  if @connection.supports_views?
30
31
  views(stream)
31
32
  end
@@ -1,8 +1,8 @@
1
1
  module QuboleRailsSqlViews
2
2
  module VERSION #:nodoc:
3
3
  MAJOR = 0
4
- MINOR = 7
5
- TINY = 0
4
+ MINOR = 10
5
+ TINY = 3
6
6
 
7
7
  STRING = [MAJOR, MINOR, TINY].join('.')
8
8
  end
@@ -33,10 +33,14 @@ require 'qubole_rails_sql_views/connection_adapters/abstract_adapter'
33
33
  require 'qubole_rails_sql_views/schema_dumper'
34
34
  require 'qubole_rails_sql_views/loader'
35
35
 
36
+ $qubole_rails_sql_views_included = false
37
+
36
38
  ActiveRecord::ConnectionAdapters::AbstractAdapter.class_eval do
37
39
  include QuboleRailsSqlViews::ConnectionAdapters::SchemaStatements
38
40
  def self.inherited(sub)
39
- QuboleRailsSqlViews::Loader.load_extensions
41
+ unless $qubole_rails_sql_views_included && (Rails.env.test? || Rails.env.cucumber?)
42
+ QuboleRailsSqlViews::Loader.load_extensions
43
+ end
40
44
  end
41
45
  end
42
46
 
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: qubole_rails_sql_views
3
3
  version: !ruby/object:Gem::Version
4
- hash: 53
4
+ hash: 49
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 10
9
- - 1
10
- version: 0.10.1
9
+ - 3
10
+ version: 0.10.3
11
11
  platform: ruby
12
12
  authors:
13
13
  - Anthony Eden
@@ -15,12 +15,124 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2010-08-25 00:00:00 Z
18
+ date: 2011-06-10 00:00:00 Z
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
21
- name: activerecord
21
+ name: rake
22
22
  prerelease: false
23
23
  requirement: &id001 !ruby/object:Gem::Requirement
24
+ none: false
25
+ requirements:
26
+ - - ">="
27
+ - !ruby/object:Gem::Version
28
+ hash: 63
29
+ segments:
30
+ - 0
31
+ - 9
32
+ - 2
33
+ version: 0.9.2
34
+ type: :runtime
35
+ version_requirements: *id001
36
+ - !ruby/object:Gem::Dependency
37
+ name: rails
38
+ prerelease: false
39
+ requirement: &id002 !ruby/object:Gem::Requirement
40
+ none: false
41
+ requirements:
42
+ - - ">="
43
+ - !ruby/object:Gem::Version
44
+ hash: 1
45
+ segments:
46
+ - 3
47
+ - 1
48
+ - 1
49
+ version: 3.1.1
50
+ type: :runtime
51
+ version_requirements: *id002
52
+ - !ruby/object:Gem::Dependency
53
+ name: jeweler
54
+ prerelease: false
55
+ requirement: &id003 !ruby/object:Gem::Requirement
56
+ none: false
57
+ requirements:
58
+ - - "="
59
+ - !ruby/object:Gem::Version
60
+ hash: 11
61
+ segments:
62
+ - 1
63
+ - 6
64
+ - 2
65
+ version: 1.6.2
66
+ type: :development
67
+ version_requirements: *id003
68
+ - !ruby/object:Gem::Dependency
69
+ name: flexmock
70
+ prerelease: false
71
+ requirement: &id004 !ruby/object:Gem::Requirement
72
+ none: false
73
+ requirements:
74
+ - - "="
75
+ - !ruby/object:Gem::Version
76
+ hash: 59
77
+ segments:
78
+ - 0
79
+ - 9
80
+ - 0
81
+ version: 0.9.0
82
+ type: :development
83
+ version_requirements: *id004
84
+ - !ruby/object:Gem::Dependency
85
+ name: test-unit
86
+ prerelease: false
87
+ requirement: &id005 !ruby/object:Gem::Requirement
88
+ none: false
89
+ requirements:
90
+ - - "="
91
+ - !ruby/object:Gem::Version
92
+ hash: 3
93
+ segments:
94
+ - 2
95
+ - 3
96
+ - 0
97
+ version: 2.3.0
98
+ type: :development
99
+ version_requirements: *id005
100
+ - !ruby/object:Gem::Dependency
101
+ name: mysql2
102
+ prerelease: false
103
+ requirement: &id006 !ruby/object:Gem::Requirement
104
+ none: false
105
+ requirements:
106
+ - - ~>
107
+ - !ruby/object:Gem::Version
108
+ hash: 7
109
+ segments:
110
+ - 0
111
+ - 3
112
+ - 10
113
+ version: 0.3.10
114
+ type: :development
115
+ version_requirements: *id006
116
+ - !ruby/object:Gem::Dependency
117
+ name: pg
118
+ prerelease: false
119
+ requirement: &id007 !ruby/object:Gem::Requirement
120
+ none: false
121
+ requirements:
122
+ - - "="
123
+ - !ruby/object:Gem::Version
124
+ hash: 51
125
+ segments:
126
+ - 0
127
+ - 11
128
+ - 0
129
+ version: 0.11.0
130
+ type: :development
131
+ version_requirements: *id007
132
+ - !ruby/object:Gem::Dependency
133
+ name: activerecord
134
+ prerelease: false
135
+ requirement: &id008 !ruby/object:Gem::Requirement
24
136
  none: false
25
137
  requirements:
26
138
  - - ">="
@@ -30,7 +142,63 @@ dependencies:
30
142
  - 0
31
143
  version: "0"
32
144
  type: :runtime
33
- version_requirements: *id001
145
+ version_requirements: *id008
146
+ - !ruby/object:Gem::Dependency
147
+ name: flexmock
148
+ prerelease: false
149
+ requirement: &id009 !ruby/object:Gem::Requirement
150
+ none: false
151
+ requirements:
152
+ - - ">="
153
+ - !ruby/object:Gem::Version
154
+ hash: 3
155
+ segments:
156
+ - 0
157
+ version: "0"
158
+ type: :development
159
+ version_requirements: *id009
160
+ - !ruby/object:Gem::Dependency
161
+ name: pg
162
+ prerelease: false
163
+ requirement: &id010 !ruby/object:Gem::Requirement
164
+ none: false
165
+ requirements:
166
+ - - ">="
167
+ - !ruby/object:Gem::Version
168
+ hash: 3
169
+ segments:
170
+ - 0
171
+ version: "0"
172
+ type: :development
173
+ version_requirements: *id010
174
+ - !ruby/object:Gem::Dependency
175
+ name: mysql
176
+ prerelease: false
177
+ requirement: &id011 !ruby/object:Gem::Requirement
178
+ none: false
179
+ requirements:
180
+ - - ">="
181
+ - !ruby/object:Gem::Version
182
+ hash: 3
183
+ segments:
184
+ - 0
185
+ version: "0"
186
+ type: :development
187
+ version_requirements: *id011
188
+ - !ruby/object:Gem::Dependency
189
+ name: mysql2
190
+ prerelease: false
191
+ requirement: &id012 !ruby/object:Gem::Requirement
192
+ none: false
193
+ requirements:
194
+ - - ">="
195
+ - !ruby/object:Gem::Version
196
+ hash: 3
197
+ segments:
198
+ - 0
199
+ version: "0"
200
+ type: :development
201
+ version_requirements: *id012
34
202
  description: Adds support for using SQL views within ActiveRecord
35
203
  email: josh@technicalpickles.com
36
204
  executables: []
@@ -51,6 +219,7 @@ files:
51
219
  - lib/qubole_rails_sql_views/connection_adapters/abstract/schema_definitions.rb
52
220
  - lib/qubole_rails_sql_views/connection_adapters/abstract/schema_statements.rb
53
221
  - lib/qubole_rails_sql_views/connection_adapters/abstract_adapter.rb
222
+ - lib/qubole_rails_sql_views/connection_adapters/mysql2_adapter.rb
54
223
  - lib/qubole_rails_sql_views/connection_adapters/mysql_adapter.rb
55
224
  - lib/qubole_rails_sql_views/connection_adapters/oci_adapter.rb
56
225
  - lib/qubole_rails_sql_views/connection_adapters/oracle_adapter.rb
@@ -65,29 +234,12 @@ files:
65
234
  - lib/qubole_rails_sql_views/version.rb
66
235
  - LICENSE
67
236
  - TODO
68
- - test/adapter_test.rb
69
- - test/connection/native_mysql/connection.rb
70
- - test/connection/native_postgresql/connection.rb
71
- - test/connection/oracle_enhanced/connection.rb
72
- - test/models/item.rb
73
- - test/models/person.rb
74
- - test/models/person2.rb
75
- - test/models/place.rb
76
- - test/models/v_person.rb
77
- - test/models/v_profile.rb
78
- - test/schema.native_mysql.expected.rb
79
- - test/schema.native_postgresql.expected.rb
80
- - test/schema.oracle_enhanced.expected.rb
81
- - test/schema_dumper_test.rb
82
- - test/test_helper.rb
83
- - test/view_model_test.rb
84
- - test/view_operations_test.rb
85
- homepage: http://github.com/vrajat/rails_sql_views
237
+ homepage: http://activewarehouse.rubyforge.org/qubole_rails_sql_views
86
238
  licenses: []
87
239
 
88
240
  post_install_message:
89
- rdoc_options:
90
- - --charset=UTF-8
241
+ rdoc_options: []
242
+
91
243
  require_paths:
92
244
  - lib
93
245
  required_ruby_version: !ruby/object:Gem::Requirement
@@ -102,12 +254,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
102
254
  required_rubygems_version: !ruby/object:Gem::Requirement
103
255
  none: false
104
256
  requirements:
105
- - - ">="
257
+ - - ">"
106
258
  - !ruby/object:Gem::Version
107
- hash: 3
259
+ hash: 25
108
260
  segments:
109
- - 0
110
- version: "0"
261
+ - 1
262
+ - 3
263
+ - 1
264
+ version: 1.3.1
111
265
  requirements: []
112
266
 
113
267
  rubyforge_project:
@@ -115,21 +269,5 @@ rubygems_version: 1.8.10
115
269
  signing_key:
116
270
  specification_version: 3
117
271
  summary: Library which adds SQL Views to ActiveRecord.
118
- test_files:
119
- - test/adapter_test.rb
120
- - test/connection/native_mysql/connection.rb
121
- - test/connection/native_postgresql/connection.rb
122
- - test/connection/oracle_enhanced/connection.rb
123
- - test/models/item.rb
124
- - test/models/person.rb
125
- - test/models/person2.rb
126
- - test/models/place.rb
127
- - test/models/v_person.rb
128
- - test/models/v_profile.rb
129
- - test/schema.native_mysql.expected.rb
130
- - test/schema.native_postgresql.expected.rb
131
- - test/schema.oracle_enhanced.expected.rb
132
- - test/schema_dumper_test.rb
133
- - test/test_helper.rb
134
- - test/view_model_test.rb
135
- - test/view_operations_test.rb
272
+ test_files: []
273
+
data/test/adapter_test.rb DELETED
@@ -1,82 +0,0 @@
1
- require "#{File.dirname(__FILE__)}/test_helper"
2
-
3
- class AdapterTest < Test::Unit::TestCase
4
- def test_current_database
5
- if ActiveRecord::Base.connection.respond_to?(:current_database)
6
- assert_equal 'rails_sql_views_unittest', ActiveRecord::Base.connection.current_database
7
- end
8
- end
9
- def test_tables
10
- create_view
11
- found = ActiveRecord::Base.connection.tables.sort
12
- found.delete(ActiveRecord::Migrator.schema_migrations_table_name)
13
- assert_equal ["items", "items_people", "people", "people2", "places", "v_people"], found
14
- end
15
- def test_base_tables
16
- create_view
17
- found = ActiveRecord::Base.connection.base_tables.sort
18
- found.delete(ActiveRecord::Migrator.schema_migrations_table_name)
19
- assert_equal ["items", "items_people", "people", "people2", "places"], found
20
- end
21
- def test_views
22
- create_view
23
- assert_equal ['v_people'], ActiveRecord::Base.connection.views
24
- end
25
- def test_columns
26
- create_view
27
- assert_equal ["f_name", "l_name", "social_security"], ActiveRecord::Base.connection.columns('v_people').collect { |c| c.name }
28
- end
29
- def test_supports_views
30
- assert ActiveRecord::Base.connection.supports_views?
31
- end
32
-
33
- def test_mapped_views
34
- create_mapping
35
- assert_equal ['v_people'], ActiveRecord::Base.connection.views
36
- end
37
- def test_mapped_columns
38
- create_mapping
39
- assert_equal ["f_name", "l_name", "address_id"], ActiveRecord::Base.connection.columns('v_people').collect { |c| c.name }
40
- end
41
-
42
- def test_view_select_statement
43
- case ActiveRecord::Base.connection.adapter_name
44
- when "MySQL"
45
- assert_equal "select `people`.`first_name` AS `f_name`,`people`.`last_name` AS `l_name`,`people`.`ssn` AS `social_security` from `people`", ActiveRecord::Base.connection.view_select_statement('v_people')
46
- when "PostgreSQL"
47
- assert_equal "SELECT people.first_name AS f_name, people.last_name AS l_name, people.ssn AS social_security FROM people;", ActiveRecord::Base.connection.view_select_statement('v_people')
48
- end
49
- end
50
-
51
- def test_old_name_not_found_error_during_mapping
52
- assert_raise ActiveRecord::ActiveRecordError do
53
- ActiveRecord::Base.connection.create_mapping_view(:people, :v_people, :force => true) do |v|
54
- v.map_column :foo, :bar
55
- end
56
- end
57
- end
58
-
59
- ### TODO
60
- # def test_only_base_table_triggers_are_dropped_for_disabled_ref_integrity
61
- # ActiveRecord::Base.connection.disable_referential_integrity do
62
- # end
63
- # end
64
-
65
- private
66
- def create_view
67
- ActiveRecord::Base.connection.create_view(:v_people, 'select first_name, last_name, ssn from people', :force => true) do |v|
68
- v.column :f_name
69
- v.column :l_name
70
- v.column :social_security
71
- end
72
- end
73
-
74
- def create_mapping
75
- ActiveRecord::Base.connection.create_mapping_view(:people, :v_people, :force => true) do |v|
76
- v.map_column :id, nil
77
- v.map_column :first_name, :f_name
78
- v.map_column :last_name, :l_name
79
- v.map_column :ssn, nil
80
- end
81
- end
82
- end
@@ -1,32 +0,0 @@
1
- print "Using native MySQL\n"
2
-
3
- adapter_name = 'mysql'
4
- config = YAML.load_file(File.join(File.dirname(__FILE__), '/../../connection.yml'))[adapter_name]
5
-
6
- #require 'logger'
7
- #ActiveRecord::Base.logger = Logger.new("debug.log")
8
-
9
- ActiveRecord::Base.silence do
10
- ActiveRecord::Base.configurations = {
11
- config['database'] => {
12
- :adapter => adapter_name,
13
- :username => config['username'],
14
- :password => config['password'],
15
- :host => config['host'],
16
- :database => config['database'],
17
- :encoding => config['encoding'],
18
- :schema_file => config['schema_file'],
19
- }
20
- }
21
-
22
- ActiveRecord::Base.establish_connection config['database']
23
- ActiveRecord::Migration.verbose = false
24
-
25
- puts "Resetting database"
26
- conn = ActiveRecord::Base.connection
27
- conn.recreate_database(conn.current_database)
28
- conn.reconnect!
29
- lines = open(File.join(File.dirname(__FILE__), ActiveRecord::Base.configurations[config['database']][:schema_file])).readlines
30
- lines.join.split(';').each { |line| conn.execute(line) }
31
- conn.reconnect!
32
- end
@@ -1,31 +0,0 @@
1
- print "Using native PostgreSQL\n"
2
-
3
- adapter_name = 'postgresql'
4
- config = YAML.load_file(File.join(File.dirname(__FILE__), '/../../connection.yml'))[adapter_name]
5
-
6
- #require 'logger'
7
- #ActiveRecord::Base.logger = Logger.new("debug.log")
8
-
9
- ActiveRecord::Base.silence do
10
- ActiveRecord::Base.configurations = {
11
- 'rails_sql_views_unittest' => {
12
- :adapter => adapter_name,
13
- :username => config['username'],
14
- :password => config['password'],
15
- :host => config['host'],
16
- :database => config['database'],
17
- :encoding => config['encoding'],
18
- :schema_file => config['schema_file'],
19
- }
20
- }
21
-
22
- ActiveRecord::Base.establish_connection config['database']
23
-
24
- puts "Resetting database"
25
- conn = ActiveRecord::Base.connection
26
- #conn.recreate_database(conn.current_database)
27
- conn.reconnect!
28
- lines = open(File.join(File.dirname(__FILE__), ActiveRecord::Base.configurations[config['database']][:schema_file])).readlines
29
- lines.join.split(';').each { |line| conn.execute(line) }
30
- conn.reconnect!
31
- end
@@ -1,29 +0,0 @@
1
- print "Using Oracle Enhanced\n"
2
-
3
- #require 'logger'
4
- #ActiveRecord::Base.logger = Logger.new("debug.log")
5
-
6
- ActiveRecord::Base.configurations = {
7
- 'rails_sql_views_unittest' => {
8
- :adapter => :oracle_enhanced,
9
- :username => 'rails_sql_views_unittest',
10
- :password => 'rails',
11
- :host => 'localhost',
12
- :database => 'mydev',
13
- :encoding => 'utf8',
14
- :procedures_file => 'procedures.sql',
15
- :schema_file => 'schema.sql',
16
- }
17
- }
18
-
19
- ActiveRecord::Base.establish_connection 'rails_sql_views_unittest'
20
-
21
- puts "Resetting database"
22
- conn = ActiveRecord::Base.connection
23
- #conn.recreate_database(conn.current_database)
24
- conn.reconnect!
25
- [:procedures_file, :schema_file].each do |file|
26
- lines = open(File.join(File.dirname(__FILE__), ActiveRecord::Base.configurations['rails_sql_views_unittest'][file])).readlines
27
- conn.execute(lines.to_s)
28
- end
29
- conn.reconnect!
data/test/models/item.rb DELETED
@@ -1,4 +0,0 @@
1
- class Item < ActiveRecord::Base
2
- belongs_to :person
3
- has_and_belongs_to_many :people
4
- end
@@ -1,5 +0,0 @@
1
- class Person < ActiveRecord::Base
2
- belongs_to :address, :class_name => 'Place', :foreign_key => :address_id
3
- has_many :owned_items, :class_name => 'Item'
4
- has_and_belongs_to_many :shared_items, :class_name => 'Item'
5
- end
@@ -1,3 +0,0 @@
1
- class Person2 < ActiveRecord::Base
2
- set_table_name :people2
3
- end
data/test/models/place.rb DELETED
@@ -1,2 +0,0 @@
1
- class Place < ActiveRecord::Base
2
- end
@@ -1,4 +0,0 @@
1
- require 'active_record/view'
2
-
3
- class VPerson < ActiveRecord::View
4
- end
@@ -1,3 +0,0 @@
1
- class VProfile < ActiveRecord::Base
2
-
3
- end
@@ -1,51 +0,0 @@
1
- # This file is auto-generated from the current state of the database. Instead of editing this file,
2
- # please use the migrations feature of Active Record to incrementally modify your database, and
3
- # then regenerate this schema definition.
4
- #
5
- # Note that this schema.rb definition is the authoritative source for your database schema. If you need
6
- # to create the application database on another system, you should be using db:schema:load, not running
7
- # all the migrations from scratch. The latter is a flawed and unsustainable approach (the more migrations
8
- # you'll amass, the slower it'll run and the greater likelihood for issues).
9
- #
10
- # It's strongly recommended to check this file into your version control system.
11
-
12
- ActiveRecord::Schema.define(:version => 0) do
13
-
14
- create_table "items", :force => true do |t|
15
- t.integer "person_id"
16
- end
17
-
18
- create_table "items_people", :id => false, :force => true do |t|
19
- t.integer "person_id"
20
- t.integer "item_id"
21
- end
22
-
23
- create_table "people", :force => true do |t|
24
- t.string "first_name"
25
- t.string "last_name"
26
- t.string "ssn", :limit => 64
27
- t.integer "address_id"
28
- end
29
-
30
- create_table "people2", :force => true do |t|
31
- t.string "first_name"
32
- t.string "last_name"
33
- t.string "ssn", :limit => 64
34
- end
35
-
36
- create_table "places", :force => true do |t|
37
- t.text "address"
38
- t.string "city"
39
- t.string "cstate"
40
- t.string "country", :limit => 2
41
- end
42
-
43
- create_view "v_people", "select `people`.`id` AS `id`,`people`.`first_name` AS `f_name`,`people`.`last_name` AS `l_name`,`people`.`ssn` AS `social_security`,`people`.`address_id` AS `address_id` from `people`", :force => true do |v|
44
- v.column :id
45
- v.column :f_name
46
- v.column :l_name
47
- v.column :social_security
48
- v.column :address_id
49
- end
50
-
51
- end
@@ -1,51 +0,0 @@
1
- # This file is auto-generated from the current state of the database. Instead of editing this file,
2
- # please use the migrations feature of Active Record to incrementally modify your database, and
3
- # then regenerate this schema definition.
4
- #
5
- # Note that this schema.rb definition is the authoritative source for your database schema. If you need
6
- # to create the application database on another system, you should be using db:schema:load, not running
7
- # all the migrations from scratch. The latter is a flawed and unsustainable approach (the more migrations
8
- # you'll amass, the slower it'll run and the greater likelihood for issues).
9
- #
10
- # It's strongly recommended to check this file into your version control system.
11
-
12
- ActiveRecord::Schema.define(:version => 0) do
13
-
14
- create_table "items", :force => true do |t|
15
- t.integer "person_id"
16
- end
17
-
18
- create_table "items_people", :id => false, :force => true do |t|
19
- t.integer "person_id"
20
- t.integer "item_id"
21
- end
22
-
23
- create_table "people", :force => true do |t|
24
- t.string "first_name"
25
- t.string "last_name"
26
- t.string "ssn", :limit => 64
27
- t.integer "address_id"
28
- end
29
-
30
- create_table "people2", :force => true do |t|
31
- t.string "first_name"
32
- t.string "last_name"
33
- t.string "ssn", :limit => 64
34
- end
35
-
36
- create_table "places", :force => true do |t|
37
- t.text "address"
38
- t.string "city"
39
- t.string "cstate"
40
- t.string "country", :limit => 2
41
- end
42
-
43
- create_view "v_people", "SELECT people.id, people.first_name AS f_name, people.last_name AS l_name, people.ssn AS social_security, people.address_id FROM people;", :force => true do |v|
44
- v.column :id
45
- v.column :f_name
46
- v.column :l_name
47
- v.column :social_security
48
- v.column :address_id
49
- end
50
-
51
- end
@@ -1,51 +0,0 @@
1
- # This file is auto-generated from the current state of the database. Instead of editing this file,
2
- # please use the migrations feature of Active Record to incrementally modify your database, and
3
- # then regenerate this schema definition.
4
- #
5
- # Note that this schema.rb definition is the authoritative source for your database schema. If you need
6
- # to create the application database on another system, you should be using db:schema:load, not running
7
- # all the migrations from scratch. The latter is a flawed and unsustainable approach (the more migrations
8
- # you'll amass, the slower it'll run and the greater likelihood for issues).
9
- #
10
- # It's strongly recommended to check this file into your version control system.
11
-
12
- ActiveRecord::Schema.define(:version => 0) do
13
-
14
- create_table "items", :force => true do |t|
15
- t.integer "person_id", :precision => 38, :scale => 0
16
- end
17
-
18
- create_table "items_people", :id => false, :force => true do |t|
19
- t.integer "person_id", :precision => 38, :scale => 0
20
- t.integer "item_id", :precision => 38, :scale => 0
21
- end
22
-
23
- create_table "people", :force => true do |t|
24
- t.string "first_name"
25
- t.string "last_name"
26
- t.string "ssn", :limit => 64
27
- t.integer "address_id", :precision => 38, :scale => 0
28
- end
29
-
30
- create_table "people2", :force => true do |t|
31
- t.string "first_name"
32
- t.string "last_name"
33
- t.string "ssn", :limit => 64
34
- end
35
-
36
- create_table "places", :force => true do |t|
37
- t.string "address", :limit => 2000
38
- t.string "city"
39
- t.string "cstate"
40
- t.string "country", :limit => 2
41
- end
42
-
43
- create_view "v_people", "select id, first_name, last_name, ssn, address_id from people", :force => true do |v|
44
- v.column :id
45
- v.column :f_name
46
- v.column :l_name
47
- v.column :social_security
48
- v.column :address_id
49
- end
50
-
51
- end
@@ -1,117 +0,0 @@
1
- require "#{File.dirname(__FILE__)}/test_helper"
2
- require 'active_record/schema_dumper'
3
-
4
- class SchemaDumperTest < Test::Unit::TestCase
5
- def setup
6
- teardown
7
- end
8
- def teardown
9
- ['V_PEOPLE', 'V_PROFILE'].each do |view|
10
- if ActiveRecord::Base.connection.adapter_name == 'OracleEnhanced'
11
- ActiveRecord::Base.connection.execute("
12
- DECLARE
13
- CURSOR C1 is SELECT view_name FROM user_views where view_name = '#{view}';
14
- BEGIN
15
- FOR I IN C1 LOOP
16
- EXECUTE IMMEDIATE 'DROP VIEW '||I.view_name||'';
17
- END LOOP;
18
- END;
19
- ");
20
- else
21
- ActiveRecord::Base.connection.execute("drop view if exists #{view}")
22
- end
23
- end
24
- end
25
- def test_view
26
- create_people_view
27
- stream = StringIO.new
28
- dumper = ActiveRecord::SchemaDumper.dump(ActiveRecord::Base.connection, stream)
29
- stream.rewind
30
- assert_equal File.open(File.dirname(__FILE__) + "/schema.#{$connection}.expected.rb", 'r').readlines, stream.readlines
31
- end
32
- def test_dump_and_load
33
- create_people_view
34
- assert_dump_and_load_succeed
35
- end
36
- def test_union
37
- Person.create(:first_name => 'Joe', :last_name => 'User', :ssn => '123456789')
38
- Person2.create(:first_name => 'Jane', :last_name => 'Doe', :ssn => '222334444')
39
-
40
- select_stmt = <<-HERE
41
- select first_name, last_name, ssn from people
42
- UNION
43
- select first_name, last_name, ssn from people2
44
- HERE
45
-
46
- ActiveRecord::Base.connection.create_view(:v_profile, select_stmt, :force => true) do |v|
47
- v.column :first_name
48
- v.column :last_name
49
- v.column :ssn
50
- end
51
-
52
- assert_dump_and_load_succeed
53
- end
54
- def test_view_creation_order
55
- ActiveRecord::SchemaDumper.view_creation_order << :v_people
56
- create_people_view
57
- assert_dump_and_load_succeed
58
- ActiveRecord::SchemaDumper.view_creation_order.pop
59
- end
60
- def test_symbol_ignore
61
- ActiveRecord::SchemaDumper.ignore_views << :v_people
62
- create_people_view
63
- assert_dump_and_load_succeed
64
- ActiveRecord::SchemaDumper.ignore_views.pop
65
- end
66
- def test_regex_ignore
67
- ActiveRecord::SchemaDumper.ignore_views << Regexp.new(/v_people/)
68
- create_people_view
69
- assert_dump_and_load_succeed
70
- ActiveRecord::SchemaDumper.ignore_views.pop
71
- end
72
- def test_non_allowed_object_raises_error
73
- create_people_view
74
- ActiveRecord::SchemaDumper.ignore_views << 0
75
- begin
76
- schema_file = File.dirname(__FILE__) + "/schema.#{$connection}.out.rb"
77
- File.open(schema_file, "w") do |file|
78
- assert_raise(StandardError) do
79
- ActiveRecord::SchemaDumper.dump(ActiveRecord::Base.connection, file)
80
- end
81
- end
82
- ensure
83
- ActiveRecord::SchemaDumper.ignore_views.pop
84
- end
85
- end
86
-
87
- def test_logging_error
88
- ActiveRecord::SchemaDumper.ignore_views << 0
89
- old_logger = ActiveRecord::Base.logger
90
-
91
- begin
92
- mock_logger = flexmock('logger', :error => nil)
93
- mock_logger.should_receive(:error)
94
- ActiveRecord::Base.logger = mock_logger
95
- schema_file = File.dirname(__FILE__) + "/schema.#{$connection}.out.rb"
96
- File.open(schema_file, "w") do |file|
97
- ActiveRecord::SchemaDumper.dump(ActiveRecord::Base.connection, file)
98
- end
99
- ensure
100
- ActiveRecord::SchemaDumper.ignore_views.pop
101
- ActiveRecord::Base.logger = old_logger
102
- end
103
- end
104
-
105
- def assert_dump_and_load_succeed
106
- schema_file = File.dirname(__FILE__) + "/schema.#{$connection}.out.rb"
107
- assert_nothing_raised do
108
- File.open(schema_file, "w") do |file|
109
- ActiveRecord::SchemaDumper.dump(ActiveRecord::Base.connection, file)
110
- end
111
- end
112
-
113
- assert_nothing_raised do
114
- load(schema_file)
115
- end
116
- end
117
- end
data/test/test_helper.rb DELETED
@@ -1,30 +0,0 @@
1
- $:.unshift(File.dirname(__FILE__) + '/../lib')
2
- $:.unshift(File.dirname(__FILE__))
3
-
4
- require 'rubygems'
5
- require 'test/unit'
6
- require 'pp'
7
- require 'flexmock/test_unit'
8
-
9
- require 'active_record'
10
- #$connection = (ENV['DB'] || 'native_mysql')
11
- $connection = (ENV['DB'] || 'native_postgresql')
12
- require "connection/#{$connection}/connection"
13
- require 'rails_sql_views'
14
-
15
- require 'models/person'
16
- require 'models/person2'
17
- require 'models/v_person'
18
-
19
- class Test::Unit::TestCase
20
- def create_people_view
21
- ActiveRecord::Base.connection.create_view(:v_people,
22
- 'select id, first_name, last_name, ssn, address_id from people', :force => true) do |v|
23
- v.column :id
24
- v.column :f_name
25
- v.column :l_name
26
- v.column :social_security
27
- v.column :address_id
28
- end
29
- end
30
- end
@@ -1,63 +0,0 @@
1
- require "#{File.dirname(__FILE__)}/test_helper"
2
-
3
- require 'models/item'
4
- require 'models/place'
5
-
6
- class ViewModelTest < Test::Unit::TestCase
7
-
8
- def setup
9
- create_people_view
10
- VPerson.send(:based_on, Person)
11
-
12
- @address = Place.create!
13
- @person = Person.create!(:first_name => 'Primus', :address => @address)
14
- @items = [ @person.owned_items.create!, @person.owned_items.create! ]
15
- @sharable_items = [ Item.create!, Item.create!, Item.create! ]
16
- @person.shared_items << @sharable_items[0]
17
- @person.shared_items << @sharable_items[2]
18
-
19
- @vperson = VPerson.find(@person.id)
20
- end
21
-
22
- def cleanup
23
- Item.delete_all
24
- Person.delete_all
25
- Place.delete_all
26
- end
27
-
28
- def test_same_person
29
- assert_equal @person.id, @vperson.id
30
- end
31
-
32
- def test_cloned_belongs_to_association_exists
33
- reflection = VPerson.reflect_on_association(:address)
34
- assert_not_nil reflection
35
- end
36
-
37
- def test_access_cloned_belongs_to_association
38
- assert_equal @address, @vperson.address
39
- end
40
-
41
- def test_cloned_has_many_association_exists
42
- reflection = VPerson.reflect_on_association(:owned_items)
43
- assert_not_nil reflection
44
- end
45
-
46
- def test_access_cloned_has_many_association
47
- items = @vperson.owned_items
48
- assert_equal 2, items.size
49
- assert_equal @items.sort_by(&:id), items.sort_by(&:id)
50
- end
51
-
52
- def test_cloned_habtm_association_exists
53
- reflection = VPerson.reflect_on_association(:shared_items)
54
- assert_not_nil reflection
55
- end
56
-
57
- def test_access_cloned_habtm_association
58
- items = @vperson.shared_items
59
- assert_equal 2, items.size
60
- expected_items = [ @sharable_items[0], @sharable_items[2] ]
61
- assert_equal expected_items.sort_by(&:id), items.sort_by(&:id)
62
- end
63
- end
@@ -1,36 +0,0 @@
1
- require "#{File.dirname(__FILE__)}/test_helper"
2
-
3
- class ViewOperationsTest < Test::Unit::TestCase
4
- def test_create_view
5
- Person.create(:first_name => 'John', :last_name => 'Doe', :ssn => '123456789')
6
- assert_nothing_raised do
7
- ActiveRecord::Base.connection.create_view(:v_people,
8
- 'select first_name, last_name, ssn from people', :force => true) do |v|
9
- v.column :f_name
10
- v.column :l_name
11
- v.column :social_security
12
- end
13
- end
14
- p = Person.find(:first)
15
- vp = VPerson.find(:first)
16
- assert_equal p.first_name, vp.f_name
17
- end
18
- def test_drop_view
19
- assert_nothing_raised do
20
- ActiveRecord::Base.connection.create_view(:v_place,
21
- 'select address, city, cstate, country from places', :force => true) do |v|
22
- v.column :v_address
23
- v.column :v_city
24
- v.column :v_state
25
- v.column :v_country
26
- end
27
- ActiveRecord::Base.connection.drop_view(:v_place)
28
- end
29
- assert_raises(ActiveRecord::StatementInvalid) do
30
- ActiveRecord::Base.connection.execute "SELECT * FROM v_place"
31
- end
32
- end
33
- def test_no_view_raises_error
34
- assert_raises(RuntimeError) { ActiveRecord::Base.connection.view_select_statement('foo') }
35
- end
36
- end