activerecord_views 0.0.8 → 0.0.9

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