This Week in Rails

August 4, 2023

Omit webdrivers gem from new apps Gemfile, support for filtering tests by line range and more!

Hi! This is Vipul bringing you the latest from this week's changes in the Rails codebase.

Introduce config.dom_testing_default_html_version and use Rails::Dom::Testing to parse HTML in test helpers

Previously support was added to Rails::Dom::Testing for HTML5. This may cause issues if we still want to rely on HTML4 based testing.
This change adds a new configuration option config.dom_testing_default_html_version to allow users to configure the HTML version 4/5 to use when parsing HTML in test helpers.

Support filtering tests by line ranges

This change allows new syntax to filter tests by line ranges. For example, the following command runs tests from line 10 to 20.

$ rails test test/models/user_test.rb:10-20

Support NULLS NOT DISTINCT in Postgres 15+

This change adds full support NULLS [NOT] DISTINCT  for PostgreSQL 15+ indexes.

Previous work was done to allow the index to be created in a migration, but it was not supported in schema.rb.
Additionally, the matching for NULLS [NOT] DISTINCT was not in the correct order, which could have resulted in inconsistent schema detection.

Improve performance of JSON HTML entity escaping

John has been making various speed improvements to .to_json.
This latest change improves the performance of HTML entity escaping by ~2x.
Overall these changes put the performance of .to_json to be around ~4.5 faster than Rails 7.0.

Allow escaping of literal colons in ActionRecord::Sanitization#replace_named_bind_variables

This commit adds ability to allow escaping of literal colon characters in sanitize_sql_* methods when named bind variables are used. For example:

sanitize_sql_array(["TO_TIMESTAMP(:date, 'YYYY/MM/DD HH12\\:MI\\:SS')", date: "foo"])
#  => "TO_TIMESTAMP('foo', 'YYYY/MM/DD HH12:MI:SS')"

As of Selenium 4.6, the Selenium Manager is capable of managing Chrome Driver installations and integrations.
This make the requirement on webdrivers gem to be obsolete. This commit makes changes to omit webdrivers gem dependency from Gemfile template so that newly generated Apps won't need it.

Add Arel::FactoryMethods#cast(node, type)

CAST(field as type) is a widely supported SQL function. This PR adds native Arel support for this named function with a cast(field, type) helper.

product_table = Product.arel_table
product_table.cast(product_table[:position], "integer")
# => CAST("products"."position" as integer)

Lots of CI tools support showing a system spec failure screenshot in their UI.
This Pull Request changes ActionDispatch::SystemTesting::TestHelpers::ScreenshotHelper to save the screenshot path in the test metadata on failure, which can be used by CI tools to show the screenshot.

You can view the whole list of changes here
We had 27
contributors to the Rails codebase this past week!

Until next time!  

About This Week in Rails

Your weekly inside scoop of interesting commits, pull requests and more from Rails.