scenic 1.5.1 → 1.5.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +4 -8
- data/Appraisals +5 -15
- data/{NEWS.md → CHANGELOG.md} +16 -3
- data/gemfiles/{rails42.gemfile → rails60.gemfile} +2 -2
- data/lib/generators/scenic/view/view_generator.rb +6 -4
- data/lib/scenic/adapters/postgres.rb +4 -2
- data/lib/scenic/adapters/postgres/refresh_dependencies.rb +9 -5
- data/lib/scenic/command_recorder.rb +2 -1
- data/lib/scenic/command_recorder/statement_arguments.rb +9 -1
- data/lib/scenic/configuration.rb +1 -1
- data/lib/scenic/definition.rb +1 -1
- data/lib/scenic/version.rb +1 -1
- data/spec/generators/scenic/view/view_generator_spec.rb +9 -3
- data/spec/scenic/adapters/postgres/refresh_dependencies_spec.rb +12 -6
- data/spec/scenic/adapters/postgres_spec.rb +8 -2
- data/spec/scenic/command_recorder_spec.rb +15 -1
- data/spec/scenic/definition_spec.rb +6 -0
- metadata +4 -6
- data/gemfiles/rails50.gemfile +0 -8
- data/gemfiles/rails51.gemfile +0 -8
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 75afe5531011de8c35f2272af574763575bdb4d9f9650eeb2845a3f163b1e941
|
4
|
+
data.tar.gz: a7ded9f2177997aba8c3c424e04c2aed14f08a2f452d4ab74d2030d692fe1e7c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f1d00648e7f6c73b76242d43b3d49456afbc531a3a562dd43525b1f45f0b440f8650f1d4fb9459780aba7e46e87b49d33b3f7b92693ae43f03d51ea1fee39a67
|
7
|
+
data.tar.gz: 7da8bfdf0cac0c7bea6a7e67f09a37767943d5e6f2608ffb478db0b2884a93bc76e06b2b0d8fcf52a7d95d7b10d154d3b7cd2065de022a44d669f61b88699cfa
|
data/.travis.yml
CHANGED
@@ -18,21 +18,17 @@ notifications:
|
|
18
18
|
- false
|
19
19
|
sudo: false
|
20
20
|
rvm:
|
21
|
-
- 2.
|
22
|
-
- 2.5.3
|
21
|
+
- 2.7.0
|
23
22
|
- 2.4.5
|
24
|
-
- 2.3.8
|
25
23
|
gemfile:
|
26
|
-
- gemfiles/rails42.gemfile
|
27
|
-
- gemfiles/rails50.gemfile
|
28
|
-
- gemfiles/rails51.gemfile
|
29
24
|
- gemfiles/rails52.gemfile
|
25
|
+
- gemfiles/rails60.gemfile
|
30
26
|
- gemfiles/rails_edge.gemfile
|
31
27
|
matrix:
|
32
28
|
allow_failures:
|
33
29
|
- gemfile: gemfiles/rails_edge.gemfile
|
34
30
|
exclude:
|
35
|
-
- rvm: 2.
|
36
|
-
gemfile: gemfiles/
|
31
|
+
- rvm: 2.4.5
|
32
|
+
gemfile: gemfiles/rails60.gemfile
|
37
33
|
- rvm: 2.4.5
|
38
34
|
gemfile: gemfiles/rails_edge.gemfile
|
data/Appraisals
CHANGED
@@ -1,24 +1,14 @@
|
|
1
|
-
appraise "rails42" do
|
2
|
-
gem "activerecord", "~> 4.2.0"
|
3
|
-
gem "railties", "~> 4.2.0"
|
4
|
-
end
|
5
|
-
|
6
|
-
appraise "rails50" do
|
7
|
-
gem "activerecord", "~> 5.0.0"
|
8
|
-
gem "railties", "~> 5.0.0"
|
9
|
-
end
|
10
|
-
|
11
|
-
appraise "rails51" do
|
12
|
-
gem "activerecord", "~> 5.1.0"
|
13
|
-
gem "railties", "~> 5.1.0"
|
14
|
-
end
|
15
|
-
|
16
1
|
appraise "rails52" do
|
17
2
|
gem "activerecord", "~> 5.2.0"
|
18
3
|
gem "railties", "~> 5.2.0"
|
19
4
|
end
|
20
5
|
|
21
6
|
if RUBY_VERSION >= "2.5.0"
|
7
|
+
appraise "rails60" do
|
8
|
+
gem "activerecord", "~> 6.0.0"
|
9
|
+
gem "railties", "~> 6.0.0"
|
10
|
+
end
|
11
|
+
|
22
12
|
appraise "rails-edge" do
|
23
13
|
gem "rails", git: "https://github.com/rails/rails"
|
24
14
|
gem "arel", git: "https://github.com/rails/arel"
|
data/{NEWS.md → CHANGELOG.md}
RENAMED
@@ -1,9 +1,22 @@
|
|
1
|
-
#
|
1
|
+
# Changelog
|
2
2
|
|
3
3
|
The noteworthy changes for each Scenic version are included here. For a complete
|
4
|
-
changelog, see the [
|
4
|
+
changelog, see the [commits] for each version via the version links.
|
5
5
|
|
6
|
-
[
|
6
|
+
[commits]: https://github.com/scenic-views/scenic/commits/master
|
7
|
+
|
8
|
+
## [1.5.2] - February 6, 2019
|
9
|
+
|
10
|
+
### Fixed
|
11
|
+
|
12
|
+
- The schema statement `create_view` is now reversible when passed a `version`
|
13
|
+
argument.
|
14
|
+
- Calling `refresh_materialized_view` with both `concurrently` and `cascade` set
|
15
|
+
to `true` now correctly cascades the concurrent refresh to dependent views.
|
16
|
+
- File generation and lookup now operates correctly for schema-qualified names
|
17
|
+
like `warehouse.archived_posts`.
|
18
|
+
|
19
|
+
[1.5.2]: https://github.com/scenic-views/scenic/compare/v1.5.1...v1.5.2
|
7
20
|
|
8
21
|
## [1.5.1] - February 10, 2019
|
9
22
|
|
@@ -73,6 +73,12 @@ module Scenic
|
|
73
73
|
|
74
74
|
private
|
75
75
|
|
76
|
+
alias singular_name file_name
|
77
|
+
|
78
|
+
def file_name
|
79
|
+
super.tr(".", "_")
|
80
|
+
end
|
81
|
+
|
76
82
|
def views_directory_path
|
77
83
|
@views_directory_path ||= Rails.root.join("db", "views")
|
78
84
|
end
|
@@ -93,10 +99,6 @@ module Scenic
|
|
93
99
|
Scenic::Definition.new(plural_file_name, previous_version)
|
94
100
|
end
|
95
101
|
|
96
|
-
def plural_file_name
|
97
|
-
@plural_file_name ||= file_name.pluralize.tr(".", "_")
|
98
|
-
end
|
99
|
-
|
100
102
|
def destroying?
|
101
103
|
behavior == :revoke
|
102
104
|
end
|
@@ -209,8 +209,9 @@ module Scenic
|
|
209
209
|
# @return [void]
|
210
210
|
def refresh_materialized_view(name, concurrently: false, cascade: false)
|
211
211
|
raise_unless_materialized_views_supported
|
212
|
+
|
212
213
|
if cascade
|
213
|
-
refresh_dependencies_for(name)
|
214
|
+
refresh_dependencies_for(name, concurrently: concurrently)
|
214
215
|
end
|
215
216
|
|
216
217
|
if concurrently
|
@@ -242,11 +243,12 @@ module Scenic
|
|
242
243
|
end
|
243
244
|
end
|
244
245
|
|
245
|
-
def refresh_dependencies_for(name)
|
246
|
+
def refresh_dependencies_for(name, concurrently: false)
|
246
247
|
Scenic::Adapters::Postgres::RefreshDependencies.call(
|
247
248
|
name,
|
248
249
|
self,
|
249
250
|
connection,
|
251
|
+
concurrently: concurrently,
|
250
252
|
)
|
251
253
|
end
|
252
254
|
end
|
@@ -2,25 +2,29 @@ module Scenic
|
|
2
2
|
module Adapters
|
3
3
|
class Postgres
|
4
4
|
class RefreshDependencies
|
5
|
-
def self.call(name, adapter, connection)
|
6
|
-
new(name, adapter, connection).call
|
5
|
+
def self.call(name, adapter, connection, concurrently: false)
|
6
|
+
new(name, adapter, connection, concurrently: concurrently).call
|
7
7
|
end
|
8
8
|
|
9
|
-
def initialize(name, adapter, connection)
|
9
|
+
def initialize(name, adapter, connection, concurrently:)
|
10
10
|
@name = name
|
11
11
|
@adapter = adapter
|
12
12
|
@connection = connection
|
13
|
+
@concurrently = concurrently
|
13
14
|
end
|
14
15
|
|
15
16
|
def call
|
16
17
|
dependencies.each do |dependency|
|
17
|
-
adapter.refresh_materialized_view(
|
18
|
+
adapter.refresh_materialized_view(
|
19
|
+
dependency,
|
20
|
+
concurrently: concurrently,
|
21
|
+
)
|
18
22
|
end
|
19
23
|
end
|
20
24
|
|
21
25
|
private
|
22
26
|
|
23
|
-
attr_reader :name, :adapter, :connection
|
27
|
+
attr_reader :name, :adapter, :connection, :concurrently
|
24
28
|
|
25
29
|
class DependencyParser
|
26
30
|
def initialize(raw_dependencies, view_to_refresh)
|
@@ -22,8 +22,12 @@ module Scenic
|
|
22
22
|
StatementArguments.new([view, options_for_revert])
|
23
23
|
end
|
24
24
|
|
25
|
+
def remove_version
|
26
|
+
StatementArguments.new([view, options_without_version])
|
27
|
+
end
|
28
|
+
|
25
29
|
def to_a
|
26
|
-
@args.to_a
|
30
|
+
@args.to_a.dup.delete_if(&:empty?)
|
27
31
|
end
|
28
32
|
|
29
33
|
private
|
@@ -38,6 +42,10 @@ module Scenic
|
|
38
42
|
revert_options.delete(:revert_to_version)
|
39
43
|
end
|
40
44
|
end
|
45
|
+
|
46
|
+
def options_without_version
|
47
|
+
options.except(:version)
|
48
|
+
end
|
41
49
|
end
|
42
50
|
end
|
43
51
|
end
|
data/lib/scenic/configuration.rb
CHANGED
data/lib/scenic/definition.rb
CHANGED
data/lib/scenic/version.rb
CHANGED
@@ -38,14 +38,20 @@ describe Scenic::Generators::ViewGenerator, :generator do
|
|
38
38
|
end
|
39
39
|
|
40
40
|
context "for views created in a schema other than 'public'" do
|
41
|
-
it "creates view definition
|
42
|
-
migration = file("db/migrate/create_non_public_searches.rb")
|
41
|
+
it "creates a view definition" do
|
43
42
|
view_definition = file("db/views/non_public_searches_v01.sql")
|
44
43
|
|
45
44
|
run_generator ["non_public.search"]
|
46
45
|
|
47
|
-
expect(migration).to be_a_migration
|
48
46
|
expect(view_definition).to exist
|
49
47
|
end
|
48
|
+
|
49
|
+
it "creates a migration file" do
|
50
|
+
run_generator ["non_public.search"]
|
51
|
+
|
52
|
+
migration = migration_file("db/migrate/create_non_public_searches.rb")
|
53
|
+
expect(migration).to contain(/class CreateNonPublicSearches/)
|
54
|
+
expect(migration).to contain(/create_view "non_public.searches"/)
|
55
|
+
end
|
50
56
|
end
|
51
57
|
end
|
@@ -33,19 +33,24 @@ module Scenic
|
|
33
33
|
)
|
34
34
|
|
35
35
|
expect(adapter).to receive(:refresh_materialized_view)
|
36
|
-
.with("public.first").ordered
|
36
|
+
.with("public.first", concurrently: true).ordered
|
37
37
|
expect(adapter).to receive(:refresh_materialized_view)
|
38
|
-
.with("public.second").ordered
|
38
|
+
.with("public.second", concurrently: true).ordered
|
39
39
|
expect(adapter).to receive(:refresh_materialized_view)
|
40
|
-
.with("public.third").ordered
|
40
|
+
.with("public.third", concurrently: true).ordered
|
41
41
|
expect(adapter).to receive(:refresh_materialized_view)
|
42
|
-
.with("public.fourth_1").ordered
|
42
|
+
.with("public.fourth_1", concurrently: true).ordered
|
43
43
|
expect(adapter).to receive(:refresh_materialized_view)
|
44
|
-
.with("public.x_fourth").ordered
|
44
|
+
.with("public.x_fourth", concurrently: true).ordered
|
45
45
|
end
|
46
46
|
|
47
47
|
it "refreshes in the right order when called without namespace" do
|
48
|
-
described_class.call(
|
48
|
+
described_class.call(
|
49
|
+
:fourth,
|
50
|
+
adapter,
|
51
|
+
ActiveRecord::Base.connection,
|
52
|
+
concurrently: true,
|
53
|
+
)
|
49
54
|
end
|
50
55
|
|
51
56
|
it "refreshes in the right order when called with namespace" do
|
@@ -53,6 +58,7 @@ module Scenic
|
|
53
58
|
"public.fourth",
|
54
59
|
adapter,
|
55
60
|
ActiveRecord::Base.connection,
|
61
|
+
concurrently: true,
|
56
62
|
)
|
57
63
|
end
|
58
64
|
end
|
@@ -119,8 +119,14 @@ module Scenic
|
|
119
119
|
connectable = double("Connectable", connection: connection)
|
120
120
|
adapter = Postgres.new(connectable)
|
121
121
|
expect(Scenic::Adapters::Postgres::RefreshDependencies)
|
122
|
-
.to receive(:call)
|
123
|
-
|
122
|
+
.to receive(:call)
|
123
|
+
.with(:tests, adapter, connection, concurrently: true)
|
124
|
+
|
125
|
+
adapter.refresh_materialized_view(
|
126
|
+
:tests,
|
127
|
+
cascade: true,
|
128
|
+
concurrently: true,
|
129
|
+
)
|
124
130
|
end
|
125
131
|
|
126
132
|
context "refreshing concurrently" do
|
@@ -8,11 +8,25 @@ describe Scenic::CommandRecorder do
|
|
8
8
|
expect(recorder.commands).to eq [[:create_view, [:greetings], nil]]
|
9
9
|
end
|
10
10
|
|
11
|
-
it "reverts to drop_view" do
|
11
|
+
it "reverts to drop_view when not passed a version" do
|
12
12
|
recorder.revert { recorder.create_view :greetings }
|
13
13
|
|
14
14
|
expect(recorder.commands).to eq [[:drop_view, [:greetings]]]
|
15
15
|
end
|
16
|
+
|
17
|
+
it "reverts to drop_view when passed a version" do
|
18
|
+
recorder.revert { recorder.create_view :greetings, version: 2 }
|
19
|
+
|
20
|
+
expect(recorder.commands).to eq [[:drop_view, [:greetings]]]
|
21
|
+
end
|
22
|
+
|
23
|
+
it "reverts materialized views appropriately" do
|
24
|
+
recorder.revert { recorder.create_view :greetings, materialized: true }
|
25
|
+
|
26
|
+
expect(recorder.commands).to eq [
|
27
|
+
[:drop_view, [:greetings, materialized: true]],
|
28
|
+
]
|
29
|
+
end
|
16
30
|
end
|
17
31
|
|
18
32
|
describe "#drop_view" do
|
@@ -29,6 +29,12 @@ module Scenic
|
|
29
29
|
|
30
30
|
expect(definition.path).to eq expected
|
31
31
|
end
|
32
|
+
|
33
|
+
it "handles schema qualified view names" do
|
34
|
+
definition = Definition.new("non_public.searches", 1)
|
35
|
+
|
36
|
+
expect(definition.path).to eq "db/views/non_public_searches_v01.sql"
|
37
|
+
end
|
32
38
|
end
|
33
39
|
|
34
40
|
describe "full_path" do
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: scenic
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.5.
|
4
|
+
version: 1.5.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Derek Prior
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2020-02-06 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: appraisal
|
@@ -195,11 +195,11 @@ files:
|
|
195
195
|
- ".travis.yml"
|
196
196
|
- ".yardopts"
|
197
197
|
- Appraisals
|
198
|
+
- CHANGELOG.md
|
198
199
|
- CODE_OF_CONDUCT.md
|
199
200
|
- CONTRIBUTING.md
|
200
201
|
- Gemfile
|
201
202
|
- LICENSE.txt
|
202
|
-
- NEWS.md
|
203
203
|
- README.md
|
204
204
|
- Rakefile
|
205
205
|
- bin/appraisal
|
@@ -207,10 +207,8 @@ files:
|
|
207
207
|
- bin/rspec
|
208
208
|
- bin/setup
|
209
209
|
- bin/yard
|
210
|
-
- gemfiles/rails42.gemfile
|
211
|
-
- gemfiles/rails50.gemfile
|
212
|
-
- gemfiles/rails51.gemfile
|
213
210
|
- gemfiles/rails52.gemfile
|
211
|
+
- gemfiles/rails60.gemfile
|
214
212
|
- gemfiles/rails_edge.gemfile
|
215
213
|
- lib/generators/scenic/generators.rb
|
216
214
|
- lib/generators/scenic/materializable.rb
|
data/gemfiles/rails50.gemfile
DELETED