Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Facilitate use of any regular ERB in database.yml #46134

Merged
merged 1 commit into from Sep 27, 2022

Conversation

eikes
Copy link
Contributor

@eikes eikes commented Sep 26, 2022

Commit 37d1429 (#35497) introduced the DummyERB to avoid loading the environment when running rake -T.

The DummyCompiler simply replaced all output from <%= with a fixed string and removed everything else. This worked okay when it was used for YAML values. When using <%= within a YAML key, it caused an error in the YAML parser, making it impossible to use ERB as you would expect. For example a database.yml file containing the following should be possible:

  development:
    <% 5.times do |i| %>
    shard_<%= i %>:
      database: db/development_shard_<%= i %>.sqlite3
      adapter: sqlite3
    <% end %>

Instead of using a broken ERB compiler we can temporarily use a Rails.application.config that does not raise an error when configurations are accessed which have not been set as described in #35468.

This change removes the DummyCompiler and uses the standard ERB::Compiler. It introduces the DummyConfig which delegates all known configurations to the real Rails::Application::Configuration instance and returns a dummy string for everything else. This restores the full ERB capabilities without compromising on speed when generating the rake tasks for multiple databases.

Deprecates config.active_record.suppress_multiple_database_warning.

Copy link
Member

@eileencodes eileencodes left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for the PR @eikes. It looks like this will work and I've verified there is no performance difference.

I've left some comments for things to change, mainly around wording and style.

railties/lib/rails/application/configuration.rb Outdated Show resolved Hide resolved
railties/lib/rails/application/dummy_config.rb Outdated Show resolved Hide resolved
activerecord/CHANGELOG.md Show resolved Hide resolved
activerecord/CHANGELOG.md Outdated Show resolved Hide resolved
activerecord/CHANGELOG.md Show resolved Hide resolved
railties/lib/rails/application/configuration.rb Outdated Show resolved Hide resolved
railties/test/application/rake/dbs_test.rb Show resolved Hide resolved
@eileencodes eileencodes self-assigned this Sep 26, 2022
@eileencodes eileencodes added this to the 7.1.0 milestone Sep 26, 2022
@eikes eikes force-pushed the remove-dummy-erb-compiler branch 2 times, most recently from 08c991f to b96a395 Compare September 26, 2022 22:13
@eikes
Copy link
Contributor Author

eikes commented Sep 26, 2022

@eileencodes Thank you for reviewing this so quickly. I addressed all your requested changes.

Copy link
Member

@eileencodes eileencodes left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

One last change, otherwise this looks good to me.

railties/CHANGELOG.md Outdated Show resolved Hide resolved
Commit 37d1429 introduced the DummyERB to avoid loading the environment when
running `rake -T`.

The DummyCompiler simply replaced all output from `<%=` with a fixed string and
removed everything else. This worked okay when it was used for YAML values.
When using `<%=` within a YAML key, it caused an error in the YAML parser,
making it impossible to use ERB as you would expect. For example a
`database.yml` file containing the following should be possible:

  development:
    <% 5.times do |i| %>
    shard_<%= i %>:
      database: db/development_shard_<%= i %>.sqlite3
      adapter: sqlite3
    <% end %>

Instead of using a broken ERB compiler we can temporarily use a
`Rails.application.config` that does not raise an error when configurations are
accessed which have not been set as described in rails#35468.

This change removes the `DummyCompiler` and uses the standard `ERB::Compiler`.
It introduces the `DummyConfig` which delegates all known configurations to the
real `Rails::Application::Configuration` instance and returns a dummy string for
everything else. This restores the full ERB capabilities without compromising on
speed when generating the rake tasks for multiple databases.

Deprecates `config.active_record.suppress_multiple_database_warning`.
@eileencodes eileencodes merged commit 5b8421f into rails:main Sep 27, 2022
@eileencodes
Copy link
Member

Thank you @eikes!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

3 participants