activerecord_views 0.0.8 → 0.0.9

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 373526856a79d7a2d2c97de39373d0a9a791e70c
4
- data.tar.gz: 942cecdc3e31f8417166778362f19567ce16774f
3
+ metadata.gz: d730fc5ba86879e6e1a74f23f1e3320809d37e8d
4
+ data.tar.gz: dc5a5b0e4453124be60b9ed57178fd81f763617d
5
5
  SHA512:
6
- metadata.gz: 18d20a0204d37764802b32ef58fd532f8c39cd6ad82b786eb55c4b2d3bd298fa67a84afac9bedb3cb6ca58fd45e280bac0d3852f11d3f92f53625a5f4f4fe653
7
- data.tar.gz: 68d3db12c7ea7c8cdaafb1391efab4a9f5a59ad579069ca8246ed47abf1c028b48ffa41b16a2eadfbfacfbe7194e10a9cc9222f5c01def2576c39830e708e69f
6
+ metadata.gz: 5281382c91bde1d07a1784d781d6c618c14e059201c3d252e1d1490bd47bd2fc52890134b715430f5a29f8ae6bbbb5ac9916d9d2d6e7f3ffc7f452cf94442a53
7
+ data.tar.gz: 1286c8ea11028e69b5c4e850600d1b8899672e80ee5618648e98c37fc7ec9864ddc2476e3d2dd926f0a77dfc7f65f37c2c59a486fca008e0b09c2a4fb507a7bb
@@ -45,7 +45,7 @@ module ActiveRecordViews
45
45
  end
46
46
  options_json = JSON.dump(options)
47
47
 
48
- rows_updated = @connection.update(<<-SQL)
48
+ rows_updated = @connection.update(<<-SQL.squish)
49
49
  UPDATE active_record_views
50
50
  SET
51
51
  class_name = #{@connection.quote data[:class_name]},
@@ -57,7 +57,7 @@ module ActiveRecordViews
57
57
  SQL
58
58
 
59
59
  if rows_updated == 0
60
- @connection.insert <<-SQL
60
+ @connection.insert <<-SQL.squish
61
61
  INSERT INTO active_record_views (
62
62
  name,
63
63
  class_name,
@@ -52,7 +52,7 @@ module ActiveRecordViews
52
52
  end
53
53
 
54
54
  def view_populated?
55
- value = connection.select_value(<<-SQL)
55
+ value = connection.select_value(<<-SQL.squish)
56
56
  SELECT ispopulated
57
57
  FROM pg_matviews
58
58
  WHERE schemaname = 'public' AND matviewname = #{connection.quote self.table_name};
@@ -14,5 +14,9 @@ module ActiveRecordViews
14
14
  end
15
15
  end
16
16
  end
17
+
18
+ rake_tasks do
19
+ load 'tasks/active_record_views.rake'
20
+ end
17
21
  end
18
22
  end
@@ -1,3 +1,3 @@
1
1
  module ActiveRecordViews
2
- VERSION = '0.0.8'
2
+ VERSION = '0.0.9'
3
3
  end
@@ -96,7 +96,7 @@ module ActiveRecordViews
96
96
 
97
97
  def self.execute_create_view(connection, name, sql, options)
98
98
  options.assert_valid_keys :materialized, :unique_columns
99
- sql = sql.sub(/;\s*/, '')
99
+ sql = sql.sub(/;\s*\z/, '')
100
100
 
101
101
  if options[:materialized]
102
102
  connection.execute "CREATE MATERIALIZED VIEW #{connection.quote_table_name name} AS #{sql} WITH NO DATA;"
@@ -105,7 +105,7 @@ module ActiveRecordViews
105
105
  end
106
106
 
107
107
  if options[:unique_columns]
108
- connection.execute <<-SQL
108
+ connection.execute <<-SQL.squish
109
109
  CREATE UNIQUE INDEX #{connection.quote_table_name "#{name}_pkey"}
110
110
  ON #{connection.quote_table_name name}(
111
111
  #{options[:unique_columns].map { |column_name| connection.quote_table_name(column_name) }.join(', ')}
@@ -123,7 +123,7 @@ module ActiveRecordViews
123
123
  end
124
124
 
125
125
  def self.view_exists?(connection, name)
126
- connection.select_value(<<-SQL).present?
126
+ connection.select_value(<<-SQL.squish).present?
127
127
  SELECT 1
128
128
  FROM information_schema.views
129
129
  WHERE table_schema = 'public' AND table_name = #{connection.quote name}
@@ -135,7 +135,7 @@ module ActiveRecordViews
135
135
  end
136
136
 
137
137
  def self.materialized_view?(connection, name)
138
- connection.select_value(<<-SQL).present?
138
+ connection.select_value(<<-SQL.squish).present?
139
139
  SELECT 1
140
140
  FROM pg_matviews
141
141
  WHERE schemaname = 'public' AND matviewname = #{connection.quote name};
@@ -147,7 +147,7 @@ module ActiveRecordViews
147
147
  end
148
148
 
149
149
  def self.get_view_dependencies(connection, name)
150
- connection.select_rows <<-SQL
150
+ connection.select_rows <<-SQL.squish
151
151
  WITH RECURSIVE dependants AS (
152
152
  SELECT
153
153
  #{connection.quote name}::regclass::oid,
@@ -197,13 +197,22 @@ module ActiveRecordViews
197
197
  yield
198
198
 
199
199
  dependencies.each do |dependency_name, class_name, definition, options_json|
200
+ create_view_exception = begin
201
+ connection.transaction :requires_new => true do
202
+ options = JSON.load(options_json).symbolize_keys
203
+ execute_create_view connection, dependency_name, definition, options
204
+ cache.set dependency_name, dependency_metadata[dependency_name]
205
+ end
206
+ nil
207
+ rescue StandardError => e
208
+ e
209
+ end
210
+
200
211
  begin
201
212
  class_name.constantize
202
213
  rescue NameError => e
203
214
  raise unless e.missing_name?(class_name)
204
- options = JSON.load(options_json).symbolize_keys
205
- execute_create_view connection, dependency_name, definition, options
206
- cache.set dependency_name, dependency_metadata[dependency_name]
215
+ raise create_view_exception unless create_view_exception.nil?
207
216
  end
208
217
  end
209
218
  end
@@ -0,0 +1,9 @@
1
+ Rake::Task['db:structure:dump'].enhance do
2
+ if ActiveRecord::Base.connection.table_exists?('active_record_views')
3
+ filename = ENV['DB_STRUCTURE'] || File.join(Rails.root, "db", "structure.sql")
4
+ config = current_config
5
+ set_psql_env(config)
6
+ system("pg_dump --data-only --table=active_record_views #{Shellwords.escape config['database']} >> #{Shellwords.escape filename}")
7
+ raise 'active_record_views metadata dump failed' unless $?.success?
8
+ end
9
+ end
@@ -99,12 +99,20 @@ describe ActiveRecordViews::Extension do
99
99
 
100
100
  it 'successfully restores dependant view when temporarily dropping dependency' do
101
101
  ActiveRecordViews.create_view ActiveRecord::Base.connection, 'dependency_as', 'DependencyA', 'SELECT 42 AS foo, 1 AS id;'
102
- ActiveRecordViews.create_view ActiveRecord::Base.connection, 'dependency_bs', 'DependencyB', 'SELECT * FROM dependency_as;'
102
+ ActiveRecordViews.create_view ActiveRecord::Base.connection, 'dependency_bs', 'DependencyB', 'SELECT id FROM dependency_as;'
103
103
 
104
104
  expect(DependencyA.first.id).to eq 2
105
105
  expect(DependencyB.first.id).to eq 2
106
106
  end
107
107
 
108
+ it 'sucessfully restore dependant view and dependency when loading from middle outwards' do
109
+ ActiveRecordViews.create_view ActiveRecord::Base.connection, 'dependency_as', 'DependencyA', 'SELECT 42 AS foo, 1 AS id;'
110
+ ActiveRecordViews.create_view ActiveRecord::Base.connection, 'dependency_bs', 'DependencyB', 'SELECT id FROM dependency_as;'
111
+ ActiveRecordViews.create_view ActiveRecord::Base.connection, 'dependency_cs', 'DependencyC', 'SELECT id FROM dependency_bs;'
112
+
113
+ expect(DependencyB.first.id).to eq 2
114
+ end
115
+
108
116
  it 'errors if more than one argument is specified' do
109
117
  expect {
110
118
  class TooManyArguments < ActiveRecord::Base
@@ -13,7 +13,7 @@ describe ActiveRecordViews do
13
13
  end
14
14
 
15
15
  def test_view_sql
16
- connection.select_value(<<-SQL).try(&:squish)
16
+ connection.select_value(<<-SQL.squish).try(&:squish)
17
17
  SELECT view_definition
18
18
  FROM information_schema.views
19
19
  WHERE table_schema = 'public' AND table_name = 'test'
@@ -21,7 +21,7 @@ describe ActiveRecordViews do
21
21
  end
22
22
 
23
23
  def view_names
24
- connection.select_values <<-SQL
24
+ connection.select_values(<<-SQL.squish)
25
25
  SELECT table_name
26
26
  FROM information_schema.views
27
27
  WHERE table_schema = 'public'
@@ -29,7 +29,7 @@ describe ActiveRecordViews do
29
29
  end
30
30
 
31
31
  def test_materialized_view_sql
32
- connection.select_value(<<-SQL).try(&:squish)
32
+ connection.select_value(<<-SQL.squish).try(&:squish)
33
33
  SELECT definition
34
34
  FROM pg_matviews
35
35
  WHERE schemaname = 'public' AND matviewname = 'test'
@@ -37,7 +37,7 @@ describe ActiveRecordViews do
37
37
  end
38
38
 
39
39
  def materialized_view_names
40
- connection.select_values <<-SQL
40
+ connection.select_values(<<-SQL.squish)
41
41
  SELECT matviewname
42
42
  FROM pg_matviews
43
43
  WHERE schemaname = 'public'
@@ -1,3 +1,3 @@
1
1
  class DependencyB < ActiveRecord::Base
2
- is_view 'SELECT * FROM dependency_as;'
2
+ is_view "SELECT id FROM #{DependencyA.table_name};"
3
3
  end
@@ -0,0 +1,3 @@
1
+ class DependencyC < ActiveRecord::Base
2
+ is_view "SELECT id FROM #{DependencyB.table_name};"
3
+ end
data/spec/spec_helper.rb CHANGED
@@ -16,11 +16,14 @@ RSpec.configure do |config|
16
16
  config.use_transactional_fixtures = false
17
17
 
18
18
  config.before do
19
+ ActionDispatch::Reloader.cleanup!
20
+ ActionDispatch::Reloader.prepare!
21
+
19
22
  connection = ActiveRecord::Base.connection
20
23
 
21
24
  connection.execute 'DROP TABLE IF EXISTS active_record_views'
22
25
 
23
- view_names = connection.select_values <<-SQL
26
+ view_names = connection.select_values(<<-SQL.squish)
24
27
  SELECT table_name
25
28
  FROM information_schema.views
26
29
  WHERE table_schema = 'public';
@@ -29,7 +32,7 @@ RSpec.configure do |config|
29
32
  connection.execute "DROP VIEW IF EXISTS #{connection.quote_table_name view_name} CASCADE"
30
33
  end
31
34
 
32
- materialized_view_names = connection.select_values <<-SQL
35
+ materialized_view_names = connection.select_values(<<-SQL.squish)
33
36
  SELECT matviewname
34
37
  FROM pg_matviews
35
38
  WHERE schemaname = 'public'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: activerecord_views
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.8
4
+ version: 0.0.9
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jason Weathered
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-01-18 00:00:00.000000000 Z
11
+ date: 2015-01-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord
@@ -112,11 +112,13 @@ files:
112
112
  - lib/active_record_views/registered_view.rb
113
113
  - lib/active_record_views/version.rb
114
114
  - lib/activerecord_views.rb
115
+ - lib/tasks/active_record_views.rake
115
116
  - spec/active_record_views_checksum_cache_spec.rb
116
117
  - spec/active_record_views_extension_spec.rb
117
118
  - spec/active_record_views_spec.rb
118
119
  - spec/internal/app/models/dependency_a.rb
119
120
  - spec/internal/app/models/dependency_b.rb
121
+ - spec/internal/app/models/dependency_c.rb
120
122
  - spec/internal/app/models/erb_test_model.rb
121
123
  - spec/internal/app/models/erb_test_model.sql.erb
122
124
  - spec/internal/app/models/external_file_test_model.rb
@@ -160,6 +162,7 @@ test_files:
160
162
  - spec/active_record_views_spec.rb
161
163
  - spec/internal/app/models/dependency_a.rb
162
164
  - spec/internal/app/models/dependency_b.rb
165
+ - spec/internal/app/models/dependency_c.rb
163
166
  - spec/internal/app/models/erb_test_model.rb
164
167
  - spec/internal/app/models/erb_test_model.sql.erb
165
168
  - spec/internal/app/models/external_file_test_model.rb