scenic 1.7.0 → 1.8.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (42) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ci.yml +23 -3
  3. data/CHANGELOG.md +9 -0
  4. data/CONTRIBUTING.md +1 -0
  5. data/Gemfile +3 -3
  6. data/README.md +18 -12
  7. data/Rakefile +1 -1
  8. data/bin/standardrb +27 -0
  9. data/lib/generators/scenic/model/model_generator.rb +7 -16
  10. data/lib/generators/scenic/model/templates/model.erb +4 -0
  11. data/lib/generators/scenic/view/templates/db/migrate/update_view.erb +1 -1
  12. data/lib/generators/scenic/view/view_generator.rb +5 -5
  13. data/lib/scenic/adapters/postgres/indexes.rb +1 -1
  14. data/lib/scenic/adapters/postgres/refresh_dependencies.rb +3 -3
  15. data/lib/scenic/adapters/postgres/views.rb +5 -5
  16. data/lib/scenic/adapters/postgres.rb +28 -3
  17. data/lib/scenic/definition.rb +1 -1
  18. data/lib/scenic/statements.rb +5 -5
  19. data/lib/scenic/version.rb +1 -1
  20. data/scenic.gemspec +10 -10
  21. data/spec/dummy/Rakefile +5 -5
  22. data/spec/dummy/bin/bundle +2 -2
  23. data/spec/dummy/bin/rails +3 -3
  24. data/spec/dummy/bin/rake +2 -2
  25. data/spec/dummy/config.ru +1 -1
  26. data/spec/dummy/db/migrate/20220112154220_add_pg_stat_statements_extension.rb +1 -1
  27. data/spec/dummy/db/schema.rb +0 -2
  28. data/spec/generators/scenic/model/model_generator_spec.rb +9 -1
  29. data/spec/generators/scenic/view/view_generator_spec.rb +2 -2
  30. data/spec/integration/revert_spec.rb +1 -1
  31. data/spec/scenic/adapters/postgres/connection_spec.rb +1 -1
  32. data/spec/scenic/adapters/postgres/refresh_dependencies_spec.rb +9 -9
  33. data/spec/scenic/adapters/postgres_spec.rb +52 -6
  34. data/spec/scenic/command_recorder/statement_arguments_spec.rb +4 -4
  35. data/spec/scenic/command_recorder_spec.rb +12 -12
  36. data/spec/scenic/schema_dumper_spec.rb +6 -6
  37. data/spec/scenic/statements_spec.rb +4 -4
  38. data/spec/support/generator_spec_setup.rb +2 -2
  39. data/spec/support/view_definition_helpers.rb +1 -1
  40. metadata +19 -40
  41. data/.hound.yml +0 -2
  42. data/.rubocop.yml +0 -129
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b378292bd7d642dcd235d01f5a31d94c74065b798ab469a9c091f68e936f4d9c
4
- data.tar.gz: b97f6e156685d4c03761543d5748f1381447c94cfcc42f7d6ddb8714e16791d0
3
+ metadata.gz: a9085d1f24783682a52d5874ce82bf44543b2a60d6edbfd72b026bf84b4bc0ab
4
+ data.tar.gz: fd7efd82eb88c0550c410f50e363db99eaf3e7fc6b5e3ac4eb374bd681afd7cd
5
5
  SHA512:
6
- metadata.gz: 4ffb0c73e52da5122a8ce3092b7f280d1a1dcaac9ca03a5f8ea63fe361d1b011d3c71f54706ff17d8ee1768fbdc1ba32c38bfebbcda320271e0b751eaea340f3
7
- data.tar.gz: 846d53ffe8c0d0209ab6517c47e0447ee3b40a81e5f55f845f16a1b3f697cebd44ad38550a5fe8d10016ab19b3c1197f36ea9f3f5f7f42395a1431790684e0c1
6
+ metadata.gz: d0c624619ae62c1c9e8186b8cde870e81dde6f47c8eacc93faad863c38d8fc57c3f15b81c0f1a515bad57318d2bef56f8a57b83934346542e4fbe9bbc6315209
7
+ data.tar.gz: 6a4e9ae269ee6ffb86a4e23fa1d0e741ee2b3ed12fabca23696d2d462c4359d9fceea53ffbf696f72357bfa10a4abf66ede72b1bfa1a37ce7fcf5fdc5f6aeca7
@@ -7,15 +7,35 @@ on:
7
7
  branches: "*"
8
8
 
9
9
  jobs:
10
+ standard:
11
+ name: Lint with Standard
12
+ runs-on: ubuntu-latest
13
+
14
+ steps:
15
+ - name: Checkout
16
+ uses: actions/checkout@v3
17
+
18
+ - name: Run standardrb
19
+ uses: standardrb/standard-ruby-action@f533e61f461ccb766b2d9c235abf59be02aea793
20
+ env:
21
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
22
+
23
+ permissions:
24
+ checks: write
25
+ contents: read
26
+
10
27
  build:
11
28
  name: Ruby ${{ matrix.ruby }}, Rails ${{ matrix.rails }}
12
29
 
13
30
  strategy:
14
31
  fail-fast: false
15
32
  matrix:
16
- ruby: ["2.7", "3.0", "3.1"]
33
+ ruby: ["2.7", "3.0", "3.1", "3.2"]
17
34
  rails: ["6.1", "7.0"]
18
35
  continue-on-error: [false]
36
+ exclude:
37
+ - ruby: "3.2"
38
+ rails: "6.1"
19
39
 
20
40
  runs-on: ubuntu-latest
21
41
 
@@ -40,7 +60,7 @@ jobs:
40
60
 
41
61
  steps:
42
62
  - name: Checkout
43
- uses: actions/checkout@v2
63
+ uses: actions/checkout@v3
44
64
 
45
65
  - name: Install Ruby ${{ matrix.ruby }}
46
66
  uses: ruby/setup-ruby@v1
@@ -54,7 +74,7 @@ jobs:
54
74
  run: bundle lock
55
75
 
56
76
  - name: Cache dependencies
57
- uses: actions/cache@v1
77
+ uses: actions/cache@v3
58
78
  with:
59
79
  path: vendor/bundle
60
80
  key: bundle-${{ hashFiles('Gemfile.lock') }}
data/CHANGELOG.md CHANGED
@@ -5,6 +5,15 @@ 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
7
 
8
+ ## [1.8.0] - March 28, 2024
9
+
10
+ [1.8.0]: https://github.com/scenic-views/scenic/compare/v1.7.0...v1.8.0
11
+
12
+ ### Added
13
+
14
+ * Added `#populated?` to check the state of materialized views - *Daisuke
15
+ Fujimura*, *Dr Nic Williams*
16
+
8
17
  ## [1.7.0] - December 8, 2022
9
18
 
10
19
  [1.7.0]: https://github.com/scenic-views/scenic/compare/v1.6.0...v1.7.0
data/CONTRIBUTING.md CHANGED
@@ -13,6 +13,7 @@ agree to abide by our [code of conduct].
13
13
  3. Run `rake` to verify that the tests pass against the version of Rails you are
14
14
  running locally.
15
15
  4. Make your change with new passing tests, following existing style.
16
+ 5. Run `standardrb --fix` to ensure your code is formatted correctly.
16
17
  5. Write a [good commit message], push your fork, and submit a pull request.
17
18
  6. CI will run the test suite on all configured versions of Ruby and Rails.
18
19
  Address any failures.
data/Gemfile CHANGED
@@ -5,10 +5,10 @@ gemspec
5
5
 
6
6
  rails_version = ENV.fetch("RAILS_VERSION", "6.1")
7
7
 
8
- if rails_version == "master"
9
- rails_constraint = { github: "rails/rails" }
8
+ rails_constraint = if rails_version == "master"
9
+ {github: "rails/rails"}
10
10
  else
11
- rails_constraint = "~> #{rails_version}.0"
11
+ "~> #{rails_version}.0"
12
12
  end
13
13
 
14
14
  gem "rails", rails_constraint
data/README.md CHANGED
@@ -4,7 +4,6 @@
4
4
 
5
5
  [![Build Status](https://github.com/scenic-views/scenic/actions/workflows/ci.yml/badge.svg)](https://github.com/scenic-views/scenic/actions/workflows/ci.yml)
6
6
  [![Documentation Quality](http://inch-ci.org/github/scenic-views/scenic.svg?branch=master)](http://inch-ci.org/github/scenic-views/scenic)
7
- [![Reviewed by Hound](https://img.shields.io/badge/Reviewed_by-Hound-8E64B0.svg)](https://houndci.com)
8
7
 
9
8
  Scenic adds methods to `ActiveRecord::Migration` to create and manage database
10
9
  views in Rails.
@@ -86,14 +85,16 @@ schema in the new definition and run the `update_view` migration.
86
85
 
87
86
  ## What if I want to change a view without dropping it?
88
87
 
89
- The `update_view` statement used by default will drop your view then create
90
- a new version of it.
88
+ The `update_view` statement used by default will drop your view then create a
89
+ new version of it. This may not be desirable when you have complicated
90
+ hierarchies of dependent views.
91
91
 
92
- This is not desirable when you have complicated hierarchies of views, especially
93
- when some of those views may be materialized and take a long time to recreate.
92
+ Scenic offers a `replace_view` schema statement, resulting in a `CREATE OR
93
+ REPLACE VIEW` SQL query which will update the supplied view in place, retaining
94
+ all dependencies. Materialized views cannot be replaced in this fashion.
94
95
 
95
- You can use `replace_view` to generate a CREATE OR REPLACE VIEW SQL statement
96
- instead by adding the `--replace` option to the generate command:
96
+ You can generate a migration that uses the `replace_view` schema statement by
97
+ passing the `--replace` option to the `scenic:view` generator:
97
98
 
98
99
  ```sh
99
100
  $ rails generate scenic:view search_results --replace
@@ -101,9 +102,6 @@ $ rails generate scenic:view search_results --replace
101
102
  create db/migrate/[TIMESTAMP]_update_search_results_to_version_2.rb
102
103
  ```
103
104
 
104
- See Postgres documentation on how this works:
105
- http://www.postgresql.org/docs/current/static/sql-createview.html
106
-
107
105
  The migration will look something like this:
108
106
 
109
107
  ```ruby
@@ -114,8 +112,6 @@ class UpdateSearchResultsToVersion2 < ActiveRecord::Migration
114
112
  end
115
113
  ```
116
114
 
117
- You can run the migration and the view will be replaced instead.
118
-
119
115
  ## Can I use this view to back a model?
120
116
 
121
117
  You bet! Using view-backed models can help promote concepts hidden in your
@@ -127,6 +123,11 @@ no different than a table.
127
123
  class SearchResult < ApplicationRecord
128
124
  belongs_to :searchable, polymorphic: true
129
125
 
126
+ # If you want to be able to call +Model.find+, you
127
+ # must declare the primary key. It can not be
128
+ # inferred from column information.
129
+ # self.primary_key = :id
130
+
130
131
  # this isn't strictly necessary, but it will prevent
131
132
  # rails from calling save, which would fail anyway.
132
133
  def readonly?
@@ -249,6 +250,11 @@ meet your needs:
249
250
  Please note that the maintainers of Scenic make no assertions about the
250
251
  quality or security of the above adapters.
251
252
 
253
+ **Related projects**
254
+
255
+ - [`fx`](<https://github.com/teoljungberg/fx>) Versioned database functions and
256
+ triggers for Rails
257
+
252
258
  ## About
253
259
 
254
260
  Scenic is used by some popular open source Rails apps:
data/Rakefile CHANGED
@@ -26,4 +26,4 @@ RSpec::Core::RakeTask.new("spec:acceptance") do |task|
26
26
  end
27
27
 
28
28
  desc "Run the specs and acceptance tests"
29
- task default: %w(spec spec:acceptance)
29
+ task default: %w[spec spec:acceptance]
data/bin/standardrb ADDED
@@ -0,0 +1,27 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ #
5
+ # This file was generated by Bundler.
6
+ #
7
+ # The application 'standardrb' is installed as part of a gem, and
8
+ # this file is here to facilitate running it.
9
+ #
10
+
11
+ ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../Gemfile", __dir__)
12
+
13
+ bundle_binstub = File.expand_path("bundle", __dir__)
14
+
15
+ if File.file?(bundle_binstub)
16
+ if File.read(bundle_binstub, 300).include?("This file was generated by Bundler")
17
+ load(bundle_binstub)
18
+ else
19
+ abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run.
20
+ Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.")
21
+ end
22
+ end
23
+
24
+ require "rubygems"
25
+ require "bundler/setup"
26
+
27
+ load Gem.bin_path("standard", "standardrb")
@@ -15,7 +15,7 @@ module Scenic
15
15
  [file_path.singularize],
16
16
  options.merge(
17
17
  fixture_replacement: false,
18
- migration: false,
18
+ migration: false
19
19
  )
20
20
  end
21
21
 
@@ -34,23 +34,14 @@ module Scenic
34
34
  private
35
35
 
36
36
  def evaluate_template(source)
37
- source = File.expand_path(find_in_source_paths(source.to_s))
37
+ source = File.expand_path(find_in_source_paths(source.to_s))
38
38
  context = instance_eval("binding", __FILE__, __LINE__)
39
39
 
40
- if ERB.instance_method(:initialize).parameters.assoc(:key) # Ruby 2.6+
41
- erb = ERB.new(
42
- ::File.binread(source),
43
- trim_mode: "-",
44
- eoutvar: "@output_buffer",
45
- )
46
- else
47
- erb = ERB.new(
48
- ::File.binread(source),
49
- nil,
50
- "-",
51
- "@output_buffer",
52
- )
53
- end
40
+ erb = ERB.new(
41
+ ::File.binread(source),
42
+ trim_mode: "-",
43
+ eoutvar: "@output_buffer"
44
+ )
54
45
 
55
46
  erb.result(context)
56
47
  end
@@ -1,3 +1,7 @@
1
1
  def self.refresh
2
2
  Scenic.database.refresh_materialized_view(table_name, concurrently: false, cascade: false)
3
3
  end
4
+
5
+ def self.populated?
6
+ Scenic.database.populated?(table_name)
7
+ end
@@ -1,6 +1,6 @@
1
1
  class <%= migration_class_name %> < <%= activerecord_migration_class %>
2
2
  def change
3
- <% method_name = replace_view? ? 'replace_view' : 'update_view' %>
3
+ <%- method_name = replace_view? ? 'replace_view' : 'update_view' -%>
4
4
  <%- if materialized? -%>
5
5
  <%= method_name %> <%= formatted_plural_name %>,
6
6
  version: <%= version %>,
@@ -28,12 +28,12 @@ module Scenic
28
28
  if creating_new_view? || destroying_initial_view?
29
29
  migration_template(
30
30
  "db/migrate/create_view.erb",
31
- "db/migrate/create_#{plural_file_name}.rb",
31
+ "db/migrate/create_#{plural_file_name}.rb"
32
32
  )
33
33
  else
34
34
  migration_template(
35
35
  "db/migrate/update_view.erb",
36
- "db/migrate/update_#{plural_file_name}_to_version_#{version}.rb",
36
+ "db/migrate/update_#{plural_file_name}_to_version_#{version}.rb"
37
37
  )
38
38
  end
39
39
  end
@@ -56,7 +56,7 @@ module Scenic
56
56
 
57
57
  def migration_class_name
58
58
  if creating_new_view?
59
- "Create#{class_name.tr('.', '').pluralize}"
59
+ "Create#{class_name.tr(".", "").pluralize}"
60
60
  else
61
61
  "Update#{class_name.pluralize}ToVersion#{version}"
62
62
  end
@@ -73,7 +73,7 @@ module Scenic
73
73
 
74
74
  private
75
75
 
76
- alias singular_name file_name
76
+ alias_method :singular_name, :file_name
77
77
 
78
78
  def file_name
79
79
  super.tr(".", "_")
@@ -113,7 +113,7 @@ module Scenic
113
113
 
114
114
  def create_view_options
115
115
  if materialized?
116
- ", materialized: #{no_data? ? '{ no_data: true }' : true}"
116
+ ", materialized: #{no_data? ? "{ no_data: true }" : true}"
117
117
  else
118
118
  ""
119
119
  end
@@ -44,7 +44,7 @@ module Scenic
44
44
  Scenic::Index.new(
45
45
  object_name: result["object_name"],
46
46
  index_name: result["index_name"],
47
- definition: result["definition"],
47
+ definition: result["definition"]
48
48
  )
49
49
  end
50
50
  end
@@ -17,7 +17,7 @@ module Scenic
17
17
  dependencies.each do |dependency|
18
18
  adapter.refresh_materialized_view(
19
19
  dependency,
20
- concurrently: concurrently,
20
+ concurrently: concurrently
21
21
  )
22
22
  end
23
23
  end
@@ -103,8 +103,8 @@ module Scenic
103
103
  ORDER BY class_for_rewrite.relname;
104
104
  SQL
105
105
 
106
- private_constant "DependencyParser"
107
- private_constant "DEPENDENCY_SQL"
106
+ private_constant :DependencyParser
107
+ private_constant :DEPENDENCY_SQL
108
108
 
109
109
  def dependencies
110
110
  raw_dependency_info = connection.select_rows(DEPENDENCY_SQL)
@@ -43,21 +43,21 @@ module Scenic
43
43
  def to_scenic_view(result)
44
44
  namespace, viewname = result.values_at "namespace", "viewname"
45
45
 
46
- if namespace != "public"
47
- namespaced_viewname = "#{pg_identifier(namespace)}.#{pg_identifier(viewname)}"
46
+ namespaced_viewname = if namespace != "public"
47
+ "#{pg_identifier(namespace)}.#{pg_identifier(viewname)}"
48
48
  else
49
- namespaced_viewname = pg_identifier(viewname)
49
+ pg_identifier(viewname)
50
50
  end
51
51
 
52
52
  Scenic::View.new(
53
53
  name: namespaced_viewname,
54
54
  definition: result["definition"].strip,
55
- materialized: result["kind"] == "m",
55
+ materialized: result["kind"] == "m"
56
56
  )
57
57
  end
58
58
 
59
59
  def pg_identifier(name)
60
- return name if name =~ /^[a-zA-Z_][a-zA-Z0-9_]*$/
60
+ return name if /^[a-zA-Z_][a-zA-Z0-9_]*$/.match?(name)
61
61
 
62
62
  pgconn.quote_ident(name)
63
63
  end
@@ -137,8 +137,8 @@ module Scenic
137
137
 
138
138
  execute <<-SQL
139
139
  CREATE MATERIALIZED VIEW #{quote_table_name(name)} AS
140
- #{sql_definition.rstrip.chomp(';')}
141
- #{'WITH NO DATA' if no_data};
140
+ #{sql_definition.rstrip.chomp(";")}
141
+ #{"WITH NO DATA" if no_data};
142
142
  SQL
143
143
  end
144
144
 
@@ -222,6 +222,31 @@ module Scenic
222
222
  end
223
223
  end
224
224
 
225
+ # True if supplied relation name is populated. Useful for checking the
226
+ # state of materialized views which may error if created `WITH NO DATA`
227
+ # and used before they are refreshed. True for all other relation types.
228
+ #
229
+ # @param name The name of the relation
230
+ #
231
+ # @raise [MaterializedViewsNotSupportedError] if the version of Postgres
232
+ # in use does not support materialized views.
233
+ #
234
+ # @return [boolean]
235
+ def populated?(name)
236
+ raise_unless_materialized_views_supported
237
+
238
+ schemaless_name = name.split(".").last
239
+
240
+ sql = "SELECT relispopulated FROM pg_class WHERE relname = '#{schemaless_name}'"
241
+ relations = execute(sql)
242
+
243
+ if relations.count.positive?
244
+ relations.first["relispopulated"].in?(["t", true])
245
+ else
246
+ false
247
+ end
248
+ end
249
+
225
250
  private
226
251
 
227
252
  attr_reader :connectable
@@ -248,7 +273,7 @@ module Scenic
248
273
  name,
249
274
  self,
250
275
  connection,
251
- concurrently: concurrently,
276
+ concurrently: concurrently
252
277
  )
253
278
  end
254
279
  end
@@ -31,7 +31,7 @@ module Scenic
31
31
  attr_reader :name
32
32
 
33
33
  def filename
34
- "#{UnaffixedName.for(name).tr('.', '_')}_v#{version}.sql"
34
+ "#{UnaffixedName.for(name).tr(".", "_")}_v#{version}.sql"
35
35
  end
36
36
  end
37
37
  end
@@ -26,7 +26,7 @@ module Scenic
26
26
  if version.present? && sql_definition.present?
27
27
  raise(
28
28
  ArgumentError,
29
- "sql_definition and version cannot both be set",
29
+ "sql_definition and version cannot both be set"
30
30
  )
31
31
  end
32
32
 
@@ -40,7 +40,7 @@ module Scenic
40
40
  Scenic.database.create_materialized_view(
41
41
  name,
42
42
  sql_definition,
43
- no_data: no_data(materialized),
43
+ no_data: no_data(materialized)
44
44
  )
45
45
  else
46
46
  Scenic.database.create_view(name, sql_definition)
@@ -92,14 +92,14 @@ module Scenic
92
92
  if version.blank? && sql_definition.blank?
93
93
  raise(
94
94
  ArgumentError,
95
- "sql_definition or version must be specified",
95
+ "sql_definition or version must be specified"
96
96
  )
97
97
  end
98
98
 
99
99
  if version.present? && sql_definition.present?
100
100
  raise(
101
101
  ArgumentError,
102
- "sql_definition and version cannot both be set",
102
+ "sql_definition and version cannot both be set"
103
103
  )
104
104
  end
105
105
 
@@ -109,7 +109,7 @@ module Scenic
109
109
  Scenic.database.update_materialized_view(
110
110
  name,
111
111
  sql_definition,
112
- no_data: no_data(materialized),
112
+ no_data: no_data(materialized)
113
113
  )
114
114
  else
115
115
  Scenic.database.update_view(name, sql_definition)
@@ -1,3 +1,3 @@
1
1
  module Scenic
2
- VERSION = "1.7.0".freeze
2
+ VERSION = "1.8.0".freeze
3
3
  end
data/scenic.gemspec CHANGED
@@ -3,20 +3,19 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
3
3
  require "scenic/version"
4
4
 
5
5
  Gem::Specification.new do |spec|
6
- spec.name = "scenic"
7
- spec.version = Scenic::VERSION
8
- spec.authors = ["Derek Prior", "Caleb Hearth"]
9
- spec.email = ["derekprior@gmail.com", "caleb@calebhearth.com"]
10
- spec.summary = "Support for database views in Rails migrations"
11
- spec.description = <<-DESCRIPTION
6
+ spec.name = "scenic"
7
+ spec.version = Scenic::VERSION
8
+ spec.authors = ["Derek Prior", "Caleb Hearth"]
9
+ spec.email = ["derekprior@gmail.com", "caleb@calebhearth.com"]
10
+ spec.summary = "Support for database views in Rails migrations"
11
+ spec.description = <<-DESCRIPTION
12
12
  Adds methods to ActiveRecord::Migration to create and manage database views
13
13
  in Rails
14
14
  DESCRIPTION
15
- spec.homepage = "https://github.com/scenic-views/scenic"
16
- spec.license = "MIT"
15
+ spec.homepage = "https://github.com/scenic-views/scenic"
16
+ spec.license = "MIT"
17
17
 
18
- spec.files = `git ls-files -z`.split("\x0")
19
- spec.test_files = spec.files.grep(%r{^spec/})
18
+ spec.files = `git ls-files -z`.split("\x0")
20
19
  spec.require_paths = ["lib"]
21
20
 
22
21
  spec.add_development_dependency "bundler", ">= 1.5"
@@ -28,6 +27,7 @@ Gem::Specification.new do |spec|
28
27
  spec.add_development_dependency "ammeter", ">= 1.1.3"
29
28
  spec.add_development_dependency "yard"
30
29
  spec.add_development_dependency "redcarpet"
30
+ spec.add_development_dependency "standard"
31
31
 
32
32
  spec.add_dependency "activerecord", ">= 4.0.0"
33
33
  spec.add_dependency "railties", ">= 4.0.0"
data/spec/dummy/Rakefile CHANGED
@@ -1,13 +1,13 @@
1
1
  # Add your own tasks in files placed in lib/tasks ending in .rake,
2
2
  # for example lib/tasks/capistrano.rake, and they will automatically be available to Rake.
3
3
 
4
- require File.expand_path('../config/application', __FILE__)
4
+ require File.expand_path("../config/application", __FILE__)
5
5
 
6
6
  Rails.application.load_tasks
7
7
 
8
- unless Rake::Task.task_defined?('db:environment:set')
9
- desc 'dummy task for rails versions where this task does not exist'
10
- task 'db:environment:set' do
11
- #no op
8
+ unless Rake::Task.task_defined?("db:environment:set")
9
+ desc "dummy task for rails versions where this task does not exist"
10
+ task "db:environment:set" do
11
+ # no op
12
12
  end
13
13
  end
@@ -1,3 +1,3 @@
1
1
  #!/usr/bin/env ruby
2
- ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', __FILE__)
3
- load Gem.bin_path('bundler', 'bundle')
2
+ ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile", __FILE__)
3
+ load Gem.bin_path("bundler", "bundle")
data/spec/dummy/bin/rails CHANGED
@@ -1,4 +1,4 @@
1
1
  #!/usr/bin/env ruby
2
- APP_PATH = File.expand_path('../../config/application', __FILE__)
3
- require_relative '../config/boot'
4
- require 'rails/commands'
2
+ APP_PATH = File.expand_path("../../config/application", __FILE__)
3
+ require_relative "../config/boot"
4
+ require "rails/commands"
data/spec/dummy/bin/rake CHANGED
@@ -1,4 +1,4 @@
1
1
  #!/usr/bin/env ruby
2
- require_relative '../config/boot'
3
- require 'rake'
2
+ require_relative "../config/boot"
3
+ require "rake"
4
4
  Rake.application.run
data/spec/dummy/config.ru CHANGED
@@ -1,4 +1,4 @@
1
1
  # This file is used by Rack-based servers to start the application.
2
2
 
3
- require ::File.expand_path('../config/environment', __FILE__)
3
+ require ::File.expand_path("../config/environment", __FILE__)
4
4
  run Rails.application
@@ -1,5 +1,5 @@
1
1
  class AddPgStatStatementsExtension < ActiveRecord::Migration[6.1]
2
2
  def change
3
- enable_extension 'pg_stat_statements'
3
+ enable_extension "pg_stat_statements"
4
4
  end
5
5
  end
@@ -11,9 +11,7 @@
11
11
  # It's strongly recommended that you check this file into your version control system.
12
12
 
13
13
  ActiveRecord::Schema.define(version: 2022_01_12_154220) do
14
-
15
14
  # These are extensions that must be enabled in order to support this database
16
15
  enable_extension "pg_stat_statements"
17
16
  enable_extension "plpgsql"
18
-
19
17
  end
@@ -6,7 +6,7 @@ module Scenic::Generators
6
6
  before do
7
7
  allow(ViewGenerator).to receive(:new)
8
8
  .and_return(
9
- instance_double("Scenic::Generators::ViewGenerator").as_null_object,
9
+ instance_double("Scenic::Generators::ViewGenerator").as_null_object
10
10
  )
11
11
  end
12
12
 
@@ -32,5 +32,13 @@ module Scenic::Generators
32
32
  expect(model_definition).to contain("self.refresh")
33
33
  expect(model_definition).to have_correct_syntax
34
34
  end
35
+
36
+ it "adds a populated? method to materialized models" do
37
+ run_generator ["active_user", "--materialized"]
38
+ model_definition = file("app/models/active_user.rb")
39
+
40
+ expect(model_definition).to contain("self.populated?")
41
+ expect(model_definition).to have_correct_syntax
42
+ end
35
43
  end
36
44
  end
@@ -31,7 +31,7 @@ describe Scenic::Generators::ViewGenerator, :generator do
31
31
 
32
32
  run_generator ["aired_episode", "--materialized"]
33
33
  migration = migration_file(
34
- "db/migrate/update_aired_episodes_to_version_2.rb",
34
+ "db/migrate/update_aired_episodes_to_version_2.rb"
35
35
  )
36
36
  expect(migration).to contain "materialized: true"
37
37
  end
@@ -43,7 +43,7 @@ describe Scenic::Generators::ViewGenerator, :generator do
43
43
 
44
44
  run_generator ["aired_episode", "--replace"]
45
45
  migration = migration_file(
46
- "db/migrate/update_aired_episodes_to_version_2.rb",
46
+ "db/migrate/update_aired_episodes_to_version_2.rb"
47
47
  )
48
48
  expect(migration).to contain "replace_view"
49
49
  end
@@ -61,7 +61,7 @@ describe "Reverting scenic schema statements", :db do
61
61
  end
62
62
 
63
63
  def run_migration(migration, directions)
64
- silence_stream(STDOUT) do
64
+ silence_stream($stdout) do
65
65
  Array.wrap(directions).each do |direction|
66
66
  migration.migrate(direction)
67
67
  end