qubole_rails_sql_views 0.10.1 → 0.10.3

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