scenic 1.6.0 → 1.8.0
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 +4 -4
- data/.github/workflows/ci.yml +24 -4
- data/CHANGELOG.md +25 -8
- data/CONTRIBUTING.md +1 -0
- data/Gemfile +3 -3
- data/README.md +29 -29
- data/Rakefile +1 -1
- data/bin/standardrb +27 -0
- data/lib/generators/scenic/materializable.rb +9 -0
- data/lib/generators/scenic/model/model_generator.rb +9 -7
- data/lib/generators/scenic/model/templates/model.erb +4 -0
- data/lib/generators/scenic/view/templates/db/migrate/update_view.erb +3 -2
- data/lib/generators/scenic/view/view_generator.rb +5 -5
- data/lib/scenic/adapters/postgres/indexes.rb +1 -1
- data/lib/scenic/adapters/postgres/refresh_dependencies.rb +3 -3
- data/lib/scenic/adapters/postgres/views.rb +5 -5
- data/lib/scenic/adapters/postgres.rb +28 -3
- data/lib/scenic/definition.rb +1 -1
- data/lib/scenic/statements.rb +5 -5
- data/lib/scenic/version.rb +1 -1
- data/lib/scenic/view.rb +1 -1
- data/scenic.gemspec +10 -10
- data/spec/dummy/Rakefile +5 -5
- data/spec/dummy/bin/bundle +2 -2
- data/spec/dummy/bin/rails +3 -3
- data/spec/dummy/bin/rake +2 -2
- data/spec/dummy/config.ru +1 -1
- data/spec/dummy/db/migrate/20220112154220_add_pg_stat_statements_extension.rb +1 -1
- data/spec/dummy/db/schema.rb +0 -2
- data/spec/generators/scenic/model/model_generator_spec.rb +9 -1
- data/spec/generators/scenic/view/view_generator_spec.rb +13 -1
- data/spec/integration/revert_spec.rb +1 -1
- data/spec/scenic/adapters/postgres/connection_spec.rb +1 -1
- data/spec/scenic/adapters/postgres/refresh_dependencies_spec.rb +9 -9
- data/spec/scenic/adapters/postgres_spec.rb +52 -6
- data/spec/scenic/command_recorder/statement_arguments_spec.rb +4 -4
- data/spec/scenic/command_recorder_spec.rb +12 -12
- data/spec/scenic/schema_dumper_spec.rb +6 -6
- data/spec/scenic/statements_spec.rb +4 -4
- data/spec/support/generator_spec_setup.rb +2 -2
- data/spec/support/view_definition_helpers.rb +1 -1
- metadata +19 -40
- data/.hound.yml +0 -2
- data/.rubocop.yml +0 -129
    
        data/spec/dummy/bin/rake
    CHANGED
    
    
    
        data/spec/dummy/config.ru
    CHANGED
    
    
    
        data/spec/dummy/db/schema.rb
    CHANGED
    
    | @@ -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,12 +31,24 @@ 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
         | 
| 38 38 | 
             
              end
         | 
| 39 39 |  | 
| 40 | 
            +
              it "uses 'replace_view' instead of 'update_view' if replace flag is set" do
         | 
| 41 | 
            +
                with_view_definition("aired_episodes", 1, "hello") do
         | 
| 42 | 
            +
                  allow(Dir).to receive(:entries).and_return(["aired_episodes_v01.sql"])
         | 
| 43 | 
            +
             | 
| 44 | 
            +
                  run_generator ["aired_episode", "--replace"]
         | 
| 45 | 
            +
                  migration = migration_file(
         | 
| 46 | 
            +
                    "db/migrate/update_aired_episodes_to_version_2.rb"
         | 
| 47 | 
            +
                  )
         | 
| 48 | 
            +
                  expect(migration).to contain "replace_view"
         | 
| 49 | 
            +
                end
         | 
| 50 | 
            +
              end
         | 
| 51 | 
            +
             | 
| 40 52 | 
             
              context "for views created in a schema other than 'public'" do
         | 
| 41 53 | 
             
                it "creates a view definition" do
         | 
| 42 54 | 
             
                  view_definition = file("db/views/non_public_searches_v01.sql")
         | 
| @@ -9,7 +9,7 @@ module Scenic | |
| 9 9 | 
             
                        base_response = double("response from base connection")
         | 
| 10 10 | 
             
                        base_connection = double(
         | 
| 11 11 | 
             
                          "Connection",
         | 
| 12 | 
            -
                          supports_materialized_views?: base_response | 
| 12 | 
            +
                          supports_materialized_views?: base_response
         | 
| 13 13 | 
             
                        )
         | 
| 14 14 |  | 
| 15 15 | 
             
                        connection = Postgres::Connection.new(base_connection)
         | 
| @@ -9,27 +9,27 @@ module Scenic | |
| 9 9 | 
             
                    before do
         | 
| 10 10 | 
             
                      adapter.create_materialized_view(
         | 
| 11 11 | 
             
                        "first",
         | 
| 12 | 
            -
                        "SELECT text 'hi' AS greeting" | 
| 12 | 
            +
                        "SELECT text 'hi' AS greeting"
         | 
| 13 13 | 
             
                      )
         | 
| 14 14 | 
             
                      adapter.create_materialized_view(
         | 
| 15 15 | 
             
                        "second",
         | 
| 16 | 
            -
                        "SELECT * FROM first" | 
| 16 | 
            +
                        "SELECT * FROM first"
         | 
| 17 17 | 
             
                      )
         | 
| 18 18 | 
             
                      adapter.create_materialized_view(
         | 
| 19 19 | 
             
                        "third",
         | 
| 20 | 
            -
                        "SELECT * FROM first UNION SELECT * FROM second" | 
| 20 | 
            +
                        "SELECT * FROM first UNION SELECT * FROM second"
         | 
| 21 21 | 
             
                      )
         | 
| 22 22 | 
             
                      adapter.create_materialized_view(
         | 
| 23 23 | 
             
                        "fourth_1",
         | 
| 24 | 
            -
                        "SELECT * FROM third" | 
| 24 | 
            +
                        "SELECT * FROM third"
         | 
| 25 25 | 
             
                      )
         | 
| 26 26 | 
             
                      adapter.create_materialized_view(
         | 
| 27 27 | 
             
                        "x_fourth",
         | 
| 28 | 
            -
                        "SELECT * FROM fourth_1" | 
| 28 | 
            +
                        "SELECT * FROM fourth_1"
         | 
| 29 29 | 
             
                      )
         | 
| 30 30 | 
             
                      adapter.create_materialized_view(
         | 
| 31 31 | 
             
                        "fourth",
         | 
| 32 | 
            -
                        "SELECT * FROM fourth_1 UNION SELECT * FROM x_fourth" | 
| 32 | 
            +
                        "SELECT * FROM fourth_1 UNION SELECT * FROM x_fourth"
         | 
| 33 33 | 
             
                      )
         | 
| 34 34 |  | 
| 35 35 | 
             
                      expect(adapter).to receive(:refresh_materialized_view)
         | 
| @@ -49,7 +49,7 @@ module Scenic | |
| 49 49 | 
             
                        :fourth,
         | 
| 50 50 | 
             
                        adapter,
         | 
| 51 51 | 
             
                        ActiveRecord::Base.connection,
         | 
| 52 | 
            -
                        concurrently: true | 
| 52 | 
            +
                        concurrently: true
         | 
| 53 53 | 
             
                      )
         | 
| 54 54 | 
             
                    end
         | 
| 55 55 |  | 
| @@ -58,7 +58,7 @@ module Scenic | |
| 58 58 | 
             
                        "public.fourth",
         | 
| 59 59 | 
             
                        adapter,
         | 
| 60 60 | 
             
                        ActiveRecord::Base.connection,
         | 
| 61 | 
            -
                        concurrently: true | 
| 61 | 
            +
                        concurrently: true
         | 
| 62 62 | 
             
                      )
         | 
| 63 63 | 
             
                    end
         | 
| 64 64 | 
             
                  end
         | 
| @@ -69,7 +69,7 @@ module Scenic | |
| 69 69 |  | 
| 70 70 | 
             
                      adapter.create_materialized_view(
         | 
| 71 71 | 
             
                        "first",
         | 
| 72 | 
            -
                        "SELECT text 'hi' AS greeting" | 
| 72 | 
            +
                        "SELECT text 'hi' AS greeting"
         | 
| 73 73 | 
             
                      )
         | 
| 74 74 |  | 
| 75 75 | 
             
                      expect {
         | 
| @@ -19,7 +19,7 @@ module Scenic | |
| 19 19 |  | 
| 20 20 | 
             
                      adapter.create_materialized_view(
         | 
| 21 21 | 
             
                        "greetings",
         | 
| 22 | 
            -
                        "SELECT text 'hi' AS greeting" | 
| 22 | 
            +
                        "SELECT text 'hi' AS greeting"
         | 
| 23 23 | 
             
                      )
         | 
| 24 24 |  | 
| 25 25 | 
             
                      view = adapter.views.first
         | 
| @@ -33,7 +33,7 @@ module Scenic | |
| 33 33 | 
             
                      adapter.create_materialized_view(
         | 
| 34 34 | 
             
                        "greetings",
         | 
| 35 35 | 
             
                        "SELECT text 'hi' AS greeting; \n",
         | 
| 36 | 
            -
                        no_data: true | 
| 36 | 
            +
                        no_data: true
         | 
| 37 37 | 
             
                      )
         | 
| 38 38 |  | 
| 39 39 | 
             
                      view = adapter.views.first
         | 
| @@ -85,7 +85,7 @@ module Scenic | |
| 85 85 |  | 
| 86 86 | 
             
                      adapter.create_materialized_view(
         | 
| 87 87 | 
             
                        "greetings",
         | 
| 88 | 
            -
                        "SELECT text 'hi' AS greeting" | 
| 88 | 
            +
                        "SELECT text 'hi' AS greeting"
         | 
| 89 89 | 
             
                      )
         | 
| 90 90 | 
             
                      adapter.drop_materialized_view("greetings")
         | 
| 91 91 |  | 
| @@ -125,7 +125,7 @@ module Scenic | |
| 125 125 | 
             
                      adapter.refresh_materialized_view(
         | 
| 126 126 | 
             
                        :tests,
         | 
| 127 127 | 
             
                        cascade: true,
         | 
| 128 | 
            -
                        concurrently: true | 
| 128 | 
            +
                        concurrently: true
         | 
| 129 129 | 
             
                      )
         | 
| 130 130 | 
             
                    end
         | 
| 131 131 |  | 
| @@ -179,7 +179,7 @@ module Scenic | |
| 179 179 | 
             
                        "parents",
         | 
| 180 180 | 
             
                        "children",
         | 
| 181 181 | 
             
                        "people",
         | 
| 182 | 
            -
                        "people_with_names" | 
| 182 | 
            +
                        "people_with_names"
         | 
| 183 183 | 
             
                      ]
         | 
| 184 184 | 
             
                    end
         | 
| 185 185 |  | 
| @@ -199,11 +199,57 @@ module Scenic | |
| 199 199 |  | 
| 200 200 | 
             
                        expect(adapter.views.map(&:name)).to eq [
         | 
| 201 201 | 
             
                          "parents",
         | 
| 202 | 
            -
                          "scenic.parents" | 
| 202 | 
            +
                          "scenic.parents"
         | 
| 203 203 | 
             
                        ]
         | 
| 204 204 | 
             
                      end
         | 
| 205 205 | 
             
                    end
         | 
| 206 206 | 
             
                  end
         | 
| 207 | 
            +
             | 
| 208 | 
            +
                  describe "#populated?" do
         | 
| 209 | 
            +
                    it "returns false if a materialized view is not populated" do
         | 
| 210 | 
            +
                      adapter = Postgres.new
         | 
| 211 | 
            +
             | 
| 212 | 
            +
                      ActiveRecord::Base.connection.execute <<-SQL
         | 
| 213 | 
            +
                        CREATE MATERIALIZED VIEW greetings AS
         | 
| 214 | 
            +
                        SELECT text 'hi' AS greeting
         | 
| 215 | 
            +
                        WITH NO DATA
         | 
| 216 | 
            +
                      SQL
         | 
| 217 | 
            +
             | 
| 218 | 
            +
                      expect(adapter.populated?("greetings")).to be false
         | 
| 219 | 
            +
                    end
         | 
| 220 | 
            +
             | 
| 221 | 
            +
                    it "returns true if a materialized view is populated" do
         | 
| 222 | 
            +
                      adapter = Postgres.new
         | 
| 223 | 
            +
             | 
| 224 | 
            +
                      ActiveRecord::Base.connection.execute <<-SQL
         | 
| 225 | 
            +
                        CREATE MATERIALIZED VIEW greetings AS
         | 
| 226 | 
            +
                        SELECT text 'hi' AS greeting
         | 
| 227 | 
            +
                      SQL
         | 
| 228 | 
            +
             | 
| 229 | 
            +
                      expect(adapter.populated?("greetings")).to be true
         | 
| 230 | 
            +
                    end
         | 
| 231 | 
            +
             | 
| 232 | 
            +
                    it "strips out the schema from table_name" do
         | 
| 233 | 
            +
                      adapter = Postgres.new
         | 
| 234 | 
            +
             | 
| 235 | 
            +
                      ActiveRecord::Base.connection.execute <<-SQL
         | 
| 236 | 
            +
                        CREATE MATERIALIZED VIEW greetings AS
         | 
| 237 | 
            +
                        SELECT text 'hi' AS greeting
         | 
| 238 | 
            +
                        WITH NO DATA
         | 
| 239 | 
            +
                      SQL
         | 
| 240 | 
            +
             | 
| 241 | 
            +
                      expect(adapter.populated?("public.greetings")).to be false
         | 
| 242 | 
            +
                    end
         | 
| 243 | 
            +
             | 
| 244 | 
            +
                    it "raises an exception if the version of PostgreSQL is too old" do
         | 
| 245 | 
            +
                      connection = double("Connection", supports_materialized_views?: false)
         | 
| 246 | 
            +
                      connectable = double("Connectable", connection: connection)
         | 
| 247 | 
            +
                      adapter = Postgres.new(connectable)
         | 
| 248 | 
            +
                      err = Scenic::Adapters::Postgres::MaterializedViewsNotSupportedError
         | 
| 249 | 
            +
             | 
| 250 | 
            +
                      expect { adapter.populated?("greetings") }.to raise_error err
         | 
| 251 | 
            +
                    end
         | 
| 252 | 
            +
                  end
         | 
| 207 253 | 
             
                end
         | 
| 208 254 | 
             
              end
         | 
| 209 255 | 
             
            end
         | 
| @@ -4,7 +4,7 @@ module Scenic::CommandRecorder | |
| 4 4 | 
             
              describe StatementArguments do
         | 
| 5 5 | 
             
                describe "#view" do
         | 
| 6 6 | 
             
                  it "is the view name" do
         | 
| 7 | 
            -
                    raw_args = [:spaceships, { | 
| 7 | 
            +
                    raw_args = [:spaceships, {foo: :bar}]
         | 
| 8 8 | 
             
                    args = StatementArguments.new(raw_args)
         | 
| 9 9 |  | 
| 10 10 | 
             
                    expect(args.view).to eq :spaceships
         | 
| @@ -13,14 +13,14 @@ module Scenic::CommandRecorder | |
| 13 13 |  | 
| 14 14 | 
             
                describe "#revert_to_version" do
         | 
| 15 15 | 
             
                  it "is the revert_to_version from the keyword arguments" do
         | 
| 16 | 
            -
                    raw_args = [:spaceships, { | 
| 16 | 
            +
                    raw_args = [:spaceships, {revert_to_version: 42}]
         | 
| 17 17 | 
             
                    args = StatementArguments.new(raw_args)
         | 
| 18 18 |  | 
| 19 19 | 
             
                    expect(args.revert_to_version).to eq 42
         | 
| 20 20 | 
             
                  end
         | 
| 21 21 |  | 
| 22 22 | 
             
                  it "is nil if the revert_to_version was not supplied" do
         | 
| 23 | 
            -
                    raw_args = [:spaceships, { | 
| 23 | 
            +
                    raw_args = [:spaceships, {foo: :bar}]
         | 
| 24 24 | 
             
                    args = StatementArguments.new(raw_args)
         | 
| 25 25 |  | 
| 26 26 | 
             
                    expect(args.revert_to_version).to be nil
         | 
| @@ -29,7 +29,7 @@ module Scenic::CommandRecorder | |
| 29 29 |  | 
| 30 30 | 
             
                describe "#invert_version" do
         | 
| 31 31 | 
             
                  it "returns object with version set to revert_to_version" do
         | 
| 32 | 
            -
                    raw_args = [:meatballs, { | 
| 32 | 
            +
                    raw_args = [:meatballs, {version: 42, revert_to_version: 15}]
         | 
| 33 33 |  | 
| 34 34 | 
             
                    inverted_args = StatementArguments.new(raw_args).invert_version
         | 
| 35 35 |  | 
| @@ -24,7 +24,7 @@ describe Scenic::CommandRecorder do | |
| 24 24 | 
             
                  recorder.revert { recorder.create_view :greetings, materialized: true }
         | 
| 25 25 |  | 
| 26 26 | 
             
                  expect(recorder.commands).to eq [
         | 
| 27 | 
            -
                    [:drop_view, [:greetings, materialized: true]] | 
| 27 | 
            +
                    [:drop_view, [:greetings, materialized: true]]
         | 
| 28 28 | 
             
                  ]
         | 
| 29 29 | 
             
                end
         | 
| 30 30 | 
             
              end
         | 
| @@ -37,8 +37,8 @@ describe Scenic::CommandRecorder do | |
| 37 37 | 
             
                end
         | 
| 38 38 |  | 
| 39 39 | 
             
                it "reverts to create_view with specified revert_to_version" do
         | 
| 40 | 
            -
                  args = [:users, { | 
| 41 | 
            -
                  revert_args = [:users, { | 
| 40 | 
            +
                  args = [:users, {revert_to_version: 3}]
         | 
| 41 | 
            +
                  revert_args = [:users, {version: 3}]
         | 
| 42 42 |  | 
| 43 43 | 
             
                  recorder.revert { recorder.drop_view(*args) }
         | 
| 44 44 |  | 
| @@ -46,7 +46,7 @@ describe Scenic::CommandRecorder do | |
| 46 46 | 
             
                end
         | 
| 47 47 |  | 
| 48 48 | 
             
                it "raises when reverting without revert_to_version set" do
         | 
| 49 | 
            -
                  args = [:users, { | 
| 49 | 
            +
                  args = [:users, {another_argument: 1}]
         | 
| 50 50 |  | 
| 51 51 | 
             
                  expect { recorder.revert { recorder.drop_view(*args) } }
         | 
| 52 52 | 
             
                    .to raise_error(ActiveRecord::IrreversibleMigration)
         | 
| @@ -55,7 +55,7 @@ describe Scenic::CommandRecorder do | |
| 55 55 |  | 
| 56 56 | 
             
              describe "#update_view" do
         | 
| 57 57 | 
             
                it "records the updated view" do
         | 
| 58 | 
            -
                  args = [:users, { | 
| 58 | 
            +
                  args = [:users, {version: 2}]
         | 
| 59 59 |  | 
| 60 60 | 
             
                  recorder.update_view(*args)
         | 
| 61 61 |  | 
| @@ -63,8 +63,8 @@ describe Scenic::CommandRecorder do | |
| 63 63 | 
             
                end
         | 
| 64 64 |  | 
| 65 65 | 
             
                it "reverts to update_view with the specified revert_to_version" do
         | 
| 66 | 
            -
                  args = [:users, { | 
| 67 | 
            -
                  revert_args = [:users, { | 
| 66 | 
            +
                  args = [:users, {version: 2, revert_to_version: 1}]
         | 
| 67 | 
            +
                  revert_args = [:users, {version: 1}]
         | 
| 68 68 |  | 
| 69 69 | 
             
                  recorder.revert { recorder.update_view(*args) }
         | 
| 70 70 |  | 
| @@ -72,7 +72,7 @@ describe Scenic::CommandRecorder do | |
| 72 72 | 
             
                end
         | 
| 73 73 |  | 
| 74 74 | 
             
                it "raises when reverting without revert_to_version set" do
         | 
| 75 | 
            -
                  args = [:users, { | 
| 75 | 
            +
                  args = [:users, {version: 42, another_argument: 1}]
         | 
| 76 76 |  | 
| 77 77 | 
             
                  expect { recorder.revert { recorder.update_view(*args) } }
         | 
| 78 78 | 
             
                    .to raise_error(ActiveRecord::IrreversibleMigration)
         | 
| @@ -81,7 +81,7 @@ describe Scenic::CommandRecorder do | |
| 81 81 |  | 
| 82 82 | 
             
              describe "#replace_view" do
         | 
| 83 83 | 
             
                it "records the replaced view" do
         | 
| 84 | 
            -
                  args = [:users, { | 
| 84 | 
            +
                  args = [:users, {version: 2}]
         | 
| 85 85 |  | 
| 86 86 | 
             
                  recorder.replace_view(*args)
         | 
| 87 87 |  | 
| @@ -89,8 +89,8 @@ describe Scenic::CommandRecorder do | |
| 89 89 | 
             
                end
         | 
| 90 90 |  | 
| 91 91 | 
             
                it "reverts to replace_view with the specified revert_to_version" do
         | 
| 92 | 
            -
                  args = [:users, { | 
| 93 | 
            -
                  revert_args = [:users, { | 
| 92 | 
            +
                  args = [:users, {version: 2, revert_to_version: 1}]
         | 
| 93 | 
            +
                  revert_args = [:users, {version: 1}]
         | 
| 94 94 |  | 
| 95 95 | 
             
                  recorder.revert { recorder.replace_view(*args) }
         | 
| 96 96 |  | 
| @@ -98,7 +98,7 @@ describe Scenic::CommandRecorder do | |
| 98 98 | 
             
                end
         | 
| 99 99 |  | 
| 100 100 | 
             
                it "raises when reverting without revert_to_version set" do
         | 
| 101 | 
            -
                  args = [:users, { | 
| 101 | 
            +
                  args = [:users, {version: 42, another_argument: 1}]
         | 
| 102 102 |  | 
| 103 103 | 
             
                  expect { recorder.revert { recorder.replace_view(*args) } }
         | 
| 104 104 | 
             
                    .to raise_error(ActiveRecord::IrreversibleMigration)
         | 
| @@ -21,7 +21,7 @@ describe Scenic::SchemaDumper, :db do | |
| 21 21 |  | 
| 22 22 | 
             
                Search.connection.drop_view :searches
         | 
| 23 23 |  | 
| 24 | 
            -
                silence_stream( | 
| 24 | 
            +
                silence_stream($stdout) { eval(output) } # standard:disable Security/Eval
         | 
| 25 25 |  | 
| 26 26 | 
             
                expect(Search.first.haystack).to eq "needle"
         | 
| 27 27 | 
             
              end
         | 
| @@ -37,7 +37,7 @@ describe Scenic::SchemaDumper, :db do | |
| 37 37 | 
             
                expect(output).to include "~ '\\\\d+'::text"
         | 
| 38 38 |  | 
| 39 39 | 
             
                Search.connection.drop_view :searches
         | 
| 40 | 
            -
                silence_stream( | 
| 40 | 
            +
                silence_stream($stdout) { eval(output) } # standard:disable Security/Eval
         | 
| 41 41 |  | 
| 42 42 | 
             
                expect(Search.first.haystack).to eq "needle"
         | 
| 43 43 | 
             
              end
         | 
| @@ -67,7 +67,7 @@ describe Scenic::SchemaDumper, :db do | |
| 67 67 | 
             
                  output = stream.string
         | 
| 68 68 | 
             
                  expect(output).to include 'create_view "scenic.searches",'
         | 
| 69 69 |  | 
| 70 | 
            -
                  Search.connection.drop_view : | 
| 70 | 
            +
                  Search.connection.drop_view :"scenic.searches"
         | 
| 71 71 | 
             
                end
         | 
| 72 72 | 
             
              end
         | 
| 73 73 |  | 
| @@ -113,7 +113,7 @@ describe Scenic::SchemaDumper, :db do | |
| 113 113 |  | 
| 114 114 | 
             
                  Search.connection.drop_view :'"search in a haystack"'
         | 
| 115 115 |  | 
| 116 | 
            -
                  silence_stream( | 
| 116 | 
            +
                  silence_stream($stdout) { eval(output) } # standard:disable Security/Eval
         | 
| 117 117 |  | 
| 118 118 | 
             
                  expect(SearchInAHaystack.take.haystack).to eq "needle"
         | 
| 119 119 | 
             
                end
         | 
| @@ -123,7 +123,7 @@ describe Scenic::SchemaDumper, :db do | |
| 123 123 | 
             
                it "dumps a create_view for a view in the database" do
         | 
| 124 124 | 
             
                  view_definition = "SELECT 'needle'::text AS haystack"
         | 
| 125 125 | 
             
                  Search.connection.execute(
         | 
| 126 | 
            -
                    "CREATE SCHEMA scenic; SET search_path TO scenic, public" | 
| 126 | 
            +
                    "CREATE SCHEMA scenic; SET search_path TO scenic, public"
         | 
| 127 127 | 
             
                  )
         | 
| 128 128 | 
             
                  Search.connection.create_view 'scenic."search in a haystack"',
         | 
| 129 129 | 
             
                    sql_definition: view_definition
         | 
| @@ -137,7 +137,7 @@ describe Scenic::SchemaDumper, :db do | |
| 137 137 |  | 
| 138 138 | 
             
                  Search.connection.drop_view :'scenic."search in a haystack"'
         | 
| 139 139 |  | 
| 140 | 
            -
                  silence_stream( | 
| 140 | 
            +
                  silence_stream($stdout) { eval(output) } # standard:disable Security/Eval
         | 
| 141 141 |  | 
| 142 142 | 
             
                  expect(SearchInAHaystack.take.haystack).to eq "needle"
         | 
| 143 143 | 
             
                end
         | 
| @@ -70,7 +70,7 @@ module Scenic | |
| 70 70 | 
             
                    connection.create_view(
         | 
| 71 71 | 
             
                      :views,
         | 
| 72 72 | 
             
                      version: 1,
         | 
| 73 | 
            -
                      materialized: { | 
| 73 | 
            +
                      materialized: {no_data: true}
         | 
| 74 74 | 
             
                    )
         | 
| 75 75 |  | 
| 76 76 | 
             
                    expect(Scenic.database).to have_received(:create_materialized_view)
         | 
| @@ -137,7 +137,7 @@ module Scenic | |
| 137 137 | 
             
                    connection.update_view(
         | 
| 138 138 | 
             
                      :name,
         | 
| 139 139 | 
             
                      version: 3,
         | 
| 140 | 
            -
                      materialized: { | 
| 140 | 
            +
                      materialized: {no_data: true}
         | 
| 141 141 | 
             
                    )
         | 
| 142 142 |  | 
| 143 143 | 
             
                    expect(Scenic.database).to have_received(:update_materialized_view)
         | 
| @@ -147,7 +147,7 @@ module Scenic | |
| 147 147 | 
             
                  it "raises an error if not supplied a version or sql_defintion" do
         | 
| 148 148 | 
             
                    expect { connection.update_view :views }.to raise_error(
         | 
| 149 149 | 
             
                      ArgumentError,
         | 
| 150 | 
            -
                      /sql_definition or version must be specified | 
| 150 | 
            +
                      /sql_definition or version must be specified/
         | 
| 151 151 | 
             
                    )
         | 
| 152 152 | 
             
                  end
         | 
| 153 153 |  | 
| @@ -156,7 +156,7 @@ module Scenic | |
| 156 156 | 
             
                      connection.update_view(
         | 
| 157 157 | 
             
                        :views,
         | 
| 158 158 | 
             
                        version: 1,
         | 
| 159 | 
            -
                        sql_definition: "a defintion" | 
| 159 | 
            +
                        sql_definition: "a defintion"
         | 
| 160 160 | 
             
                      )
         | 
| 161 161 | 
             
                    end.to raise_error ArgumentError, /cannot both be set/
         | 
| 162 162 | 
             
                  end
         | 
| @@ -2,7 +2,7 @@ module ViewDefinitionHelpers | |
| 2 2 | 
             
              def with_view_definition(name, version, schema)
         | 
| 3 3 | 
             
                definition = Scenic::Definition.new(name, version)
         | 
| 4 4 | 
             
                FileUtils.mkdir_p(File.dirname(definition.full_path))
         | 
| 5 | 
            -
                File. | 
| 5 | 
            +
                File.write(definition.full_path, schema)
         | 
| 6 6 | 
             
                yield
         | 
| 7 7 | 
             
              ensure
         | 
| 8 8 | 
             
                FileUtils.rm_f(definition.full_path)
         | 
    
        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. | 
| 4 | 
            +
              version: 1.8.0
         | 
| 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: 2024-03-28 00:00:00.000000000 Z
         | 
| 13 13 | 
             
            dependencies:
         | 
| 14 14 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 15 15 | 
             
              name: bundler
         | 
| @@ -137,6 +137,20 @@ dependencies: | |
| 137 137 | 
             
                - - ">="
         | 
| 138 138 | 
             
                  - !ruby/object:Gem::Version
         | 
| 139 139 | 
             
                    version: '0'
         | 
| 140 | 
            +
            - !ruby/object:Gem::Dependency
         | 
| 141 | 
            +
              name: standard
         | 
| 142 | 
            +
              requirement: !ruby/object:Gem::Requirement
         | 
| 143 | 
            +
                requirements:
         | 
| 144 | 
            +
                - - ">="
         | 
| 145 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 146 | 
            +
                    version: '0'
         | 
| 147 | 
            +
              type: :development
         | 
| 148 | 
            +
              prerelease: false
         | 
| 149 | 
            +
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 150 | 
            +
                requirements:
         | 
| 151 | 
            +
                - - ">="
         | 
| 152 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 153 | 
            +
                    version: '0'
         | 
| 140 154 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 141 155 | 
             
              name: activerecord
         | 
| 142 156 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| @@ -180,8 +194,6 @@ files: | |
| 180 194 | 
             
            - ".devcontainer/docker-compose.yml"
         | 
| 181 195 | 
             
            - ".github/workflows/ci.yml"
         | 
| 182 196 | 
             
            - ".gitignore"
         | 
| 183 | 
            -
            - ".hound.yml"
         | 
| 184 | 
            -
            - ".rubocop.yml"
         | 
| 185 197 | 
             
            - ".yardopts"
         | 
| 186 198 | 
             
            - CHANGELOG.md
         | 
| 187 199 | 
             
            - CODE_OF_CONDUCT.md
         | 
| @@ -194,6 +206,7 @@ files: | |
| 194 206 | 
             
            - bin/rake
         | 
| 195 207 | 
             
            - bin/rspec
         | 
| 196 208 | 
             
            - bin/setup
         | 
| 209 | 
            +
            - bin/standardrb
         | 
| 197 210 | 
             
            - bin/yard
         | 
| 198 211 | 
             
            - lib/generators/scenic/generators.rb
         | 
| 199 212 | 
             
            - lib/generators/scenic/materializable.rb
         | 
| @@ -277,42 +290,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement | |
| 277 290 | 
             
                - !ruby/object:Gem::Version
         | 
| 278 291 | 
             
                  version: '0'
         | 
| 279 292 | 
             
            requirements: []
         | 
| 280 | 
            -
            rubygems_version: 3. | 
| 293 | 
            +
            rubygems_version: 3.5.3
         | 
| 281 294 | 
             
            signing_key:
         | 
| 282 295 | 
             
            specification_version: 4
         | 
| 283 296 | 
             
            summary: Support for database views in Rails migrations
         | 
| 284 | 
            -
            test_files:
         | 
| 285 | 
            -
            - spec/acceptance/user_manages_views_spec.rb
         | 
| 286 | 
            -
            - spec/acceptance_helper.rb
         | 
| 287 | 
            -
            - spec/dummy/.gitignore
         | 
| 288 | 
            -
            - spec/dummy/Rakefile
         | 
| 289 | 
            -
            - spec/dummy/app/models/application_record.rb
         | 
| 290 | 
            -
            - spec/dummy/bin/bundle
         | 
| 291 | 
            -
            - spec/dummy/bin/rails
         | 
| 292 | 
            -
            - spec/dummy/bin/rake
         | 
| 293 | 
            -
            - spec/dummy/config.ru
         | 
| 294 | 
            -
            - spec/dummy/config/application.rb
         | 
| 295 | 
            -
            - spec/dummy/config/boot.rb
         | 
| 296 | 
            -
            - spec/dummy/config/database.yml
         | 
| 297 | 
            -
            - spec/dummy/config/environment.rb
         | 
| 298 | 
            -
            - spec/dummy/db/migrate/.keep
         | 
| 299 | 
            -
            - spec/dummy/db/migrate/20220112154220_add_pg_stat_statements_extension.rb
         | 
| 300 | 
            -
            - spec/dummy/db/schema.rb
         | 
| 301 | 
            -
            - spec/dummy/db/views/.keep
         | 
| 302 | 
            -
            - spec/generators/scenic/model/model_generator_spec.rb
         | 
| 303 | 
            -
            - spec/generators/scenic/view/view_generator_spec.rb
         | 
| 304 | 
            -
            - spec/integration/revert_spec.rb
         | 
| 305 | 
            -
            - spec/scenic/adapters/postgres/connection_spec.rb
         | 
| 306 | 
            -
            - spec/scenic/adapters/postgres/refresh_dependencies_spec.rb
         | 
| 307 | 
            -
            - spec/scenic/adapters/postgres/views_spec.rb
         | 
| 308 | 
            -
            - spec/scenic/adapters/postgres_spec.rb
         | 
| 309 | 
            -
            - spec/scenic/command_recorder/statement_arguments_spec.rb
         | 
| 310 | 
            -
            - spec/scenic/command_recorder_spec.rb
         | 
| 311 | 
            -
            - spec/scenic/configuration_spec.rb
         | 
| 312 | 
            -
            - spec/scenic/definition_spec.rb
         | 
| 313 | 
            -
            - spec/scenic/schema_dumper_spec.rb
         | 
| 314 | 
            -
            - spec/scenic/statements_spec.rb
         | 
| 315 | 
            -
            - spec/spec_helper.rb
         | 
| 316 | 
            -
            - spec/support/generator_spec_setup.rb
         | 
| 317 | 
            -
            - spec/support/rails_configuration_helpers.rb
         | 
| 318 | 
            -
            - spec/support/view_definition_helpers.rb
         | 
| 297 | 
            +
            test_files: []
         | 
    
        data/.hound.yml
    DELETED