diff --git a/.rubocop.yml b/.rubocop.yml index 096cce15c6..922ea32681 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -316,6 +316,9 @@ Style/RedundantCondition: Style/RedundantDoubleSplatHashBraces: Enabled: true +Style/OpenStructUse: + Enabled: true + Style/ArrayIntersect: Enabled: true @@ -355,9 +358,6 @@ Performance/DeletePrefix: Performance/DeleteSuffix: Enabled: true -Performance/OpenStruct: - Enabled: true - Performance/InefficientHashSearch: Enabled: true diff --git a/Gemfile b/Gemfile index 3609120800..f6fc8c1bc9 100644 --- a/Gemfile +++ b/Gemfile @@ -38,9 +38,6 @@ gem "cgi", ">= 0.3.6", require: false gem "prism" -# Became a bundled gem in Ruby 3.5 -gem "ostruct" - group :lint do gem "syntax_tree", "6.1.1", require: false end diff --git a/Gemfile.lock b/Gemfile.lock index 8e97828346..eef6c80576 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -368,7 +368,6 @@ GEM nokogiri (1.16.0-x86_64-linux) racc (~> 1.4) os (1.1.4) - ostruct (0.6.0) parallel (1.24.0) parser (3.2.2.4) ast (~> 2.4.1) @@ -624,7 +623,6 @@ DEPENDENCIES msgpack (>= 1.7.0) mysql2 (~> 0.5) nokogiri (>= 1.8.1, != 1.11.0) - ostruct pg (~> 1.3) prism propshaft (>= 0.1.7) diff --git a/actionmailer/test/url_test.rb b/actionmailer/test/url_test.rb index 3e0805225d..123c194aac 100644 --- a/actionmailer/test/url_test.rb +++ b/actionmailer/test/url_test.rb @@ -2,7 +2,6 @@ require "abstract_unit" require "action_controller" -require "ostruct" class WelcomeController < ActionController::Base end @@ -42,7 +41,7 @@ def exercise_url_for(options) class ActionMailerUrlTest < ActionMailer::TestCase class DummyModel def self.model_name - OpenStruct.new(route_key: "dummy_model") + Struct.new(:route_key, :name).new("dummy_model", nil) end def persisted? diff --git a/actionpack/test/controller/http_token_authentication_test.rb b/actionpack/test/controller/http_token_authentication_test.rb index fb6cf1f1bc..cf768dde6f 100644 --- a/actionpack/test/controller/http_token_authentication_test.rb +++ b/actionpack/test/controller/http_token_authentication_test.rb @@ -1,6 +1,5 @@ # frozen_string_literal: true -require "ostruct" require "abstract_unit" class HttpTokenAuthenticationTest < ActionController::TestCase @@ -240,7 +239,7 @@ def sample_request_without_token_key(token) end def mock_authorization_request(authorization) - OpenStruct.new(authorization: authorization) + Struct.new(:authorization).new(authorization) end def encode_credentials(token, options = {}) diff --git a/actionview/test/lib/controller/fake_models.rb b/actionview/test/lib/controller/fake_models.rb index 65bd1a342d..889d200712 100644 --- a/actionview/test/lib/controller/fake_models.rb +++ b/actionview/test/lib/controller/fake_models.rb @@ -207,7 +207,7 @@ class Plane class << self def model_name - OpenStruct.new param_key: "airplane" + Struct.new(:param_key).new("airplane") end end diff --git a/actionview/test/template/controller_helper_test.rb b/actionview/test/template/controller_helper_test.rb index 63601480b0..d7d988a500 100644 --- a/actionview/test/template/controller_helper_test.rb +++ b/actionview/test/template/controller_helper_test.rb @@ -1,7 +1,6 @@ # frozen_string_literal: true require "abstract_unit" -require "ostruct" class ControllerHelperTest < ActionView::TestCase tests ActionView::Helpers::ControllerHelper @@ -9,26 +8,28 @@ class ControllerHelperTest < ActionView::TestCase class SpecializedFormBuilder < ActionView::Helpers::FormBuilder ; end def test_assign_controller_sets_default_form_builder - @controller = OpenStruct.new(default_form_builder: SpecializedFormBuilder) + @controller = Struct.new(:default_form_builder).new(SpecializedFormBuilder) assign_controller(@controller) assert_equal SpecializedFormBuilder, default_form_builder end def test_assign_controller_skips_default_form_builder - @controller = OpenStruct.new + @controller = Object.new assign_controller(@controller) assert_nil default_form_builder end def test_respond_to - @controller = OpenStruct.new + @controller = Object.new assign_controller(@controller) assert_not respond_to?(:params) assert respond_to?(:assign_controller) - @controller.params = {} + def @controller.params + {} + end assert respond_to?(:params) assert respond_to?(:assign_controller) end diff --git a/actionview/test/template/form_helper_test.rb b/actionview/test/template/form_helper_test.rb index e8d7592d77..3987b668d5 100644 --- a/actionview/test/template/form_helper_test.rb +++ b/actionview/test/template/form_helper_test.rb @@ -2,7 +2,6 @@ require "abstract_unit" require "controller/fake_models" -require "ostruct" class FormHelperTest < ActionView::TestCase include RenderERBUtils @@ -280,7 +279,7 @@ def test_label_with_locales_fallback_and_nested_attributes end def test_label_with_non_active_record_object - form_for(OpenStruct.new(name: "ok"), as: "person", url: "/an", html: { id: "create-person" }) do |f| + form_for(Struct.new(:name).new("ok"), as: "person", url: "/an", html: { id: "create-person" }) do |f| f.label(:name) end diff --git a/actionview/test/template/record_identifier_test.rb b/actionview/test/template/record_identifier_test.rb index 7b97f495ce..78d1b3d8e0 100644 --- a/actionview/test/template/record_identifier_test.rb +++ b/actionview/test/template/record_identifier_test.rb @@ -2,7 +2,6 @@ require "abstract_unit" require "controller/fake_models" -require "ostruct" class RecordIdentifierTest < ActiveSupport::TestCase include ActionView::RecordIdentifier diff --git a/activejob/test/support/delayed_job/delayed/backend/test.rb b/activejob/test/support/delayed_job/delayed/backend/test.rb index 107adf2ba9..c6d24322a4 100644 --- a/activejob/test/support/delayed_job/delayed/backend/test.rb +++ b/activejob/test/support/delayed_job/delayed/backend/test.rb @@ -1,7 +1,6 @@ # frozen_string_literal: true # copied from https://github.com/collectiveidea/delayed_job/blob/master/spec/delayed/backend/test.rb -require "ostruct" # An in-memory backend suitable only for testing. Tries to behave as if it were an ORM. module Delayed diff --git a/activerecord/test/cases/arel/attributes/attribute_test.rb b/activerecord/test/cases/arel/attributes/attribute_test.rb index 71f0e95213..0f3d78c459 100644 --- a/activerecord/test/cases/arel/attributes/attribute_test.rb +++ b/activerecord/test/cases/arel/attributes/attribute_test.rb @@ -1,7 +1,6 @@ # frozen_string_literal: true require_relative "../helper" -require "ostruct" module Arel module Attributes @@ -1161,10 +1160,10 @@ def fake_caster.type_cast_for_database(attr_name, value) private def quoted_range(begin_val, end_val, exclude) - OpenStruct.new( - begin: Nodes::Quoted.new(begin_val), - end: Nodes::Quoted.new(end_val), - exclude_end?: exclude, + Struct.new(:begin, :end, :exclude_end?).new( + Nodes::Quoted.new(begin_val), + Nodes::Quoted.new(end_val), + exclude, ) end diff --git a/activerecord/test/cases/encryption/configurable_test.rb b/activerecord/test/cases/encryption/configurable_test.rb index 8aa1da049f..3029f4535f 100644 --- a/activerecord/test/cases/encryption/configurable_test.rb +++ b/activerecord/test/cases/encryption/configurable_test.rb @@ -1,6 +1,5 @@ # frozen_string_literal: true -require "ostruct" require "cases/encryption/helper" require "models/pirate" require "models/book" @@ -43,7 +42,7 @@ class ActiveRecord::Encryption::ConfigurableTest < ActiveRecord::EncryptionTestC end test "installing autofiltered parameters will add the encrypted attribute as a filter parameter using the dot notation" do - application = OpenStruct.new(config: OpenStruct.new(filter_parameters: [])) + application = Struct.new(:config).new(Struct.new(:filter_parameters).new([])) with_auto_filtered_parameters(application) do NamedPirate = Class.new(Pirate) do @@ -56,7 +55,7 @@ class ActiveRecord::Encryption::ConfigurableTest < ActiveRecord::EncryptionTestC end test "installing autofiltered parameters will work with unnamed classes" do - application = OpenStruct.new(config: OpenStruct.new(filter_parameters: [])) + application = Struct.new(:config).new(Struct.new(:filter_parameters).new([])) with_auto_filtered_parameters(application) do Class.new(Pirate) do @@ -71,7 +70,7 @@ class ActiveRecord::Encryption::ConfigurableTest < ActiveRecord::EncryptionTestC test "exclude the installation of autofiltered params" do ActiveRecord::Encryption.config.excluded_from_filter_parameters = [:catchphrase] - application = OpenStruct.new(config: OpenStruct.new(filter_parameters: [])) + application = Struct.new(:config).new(Struct.new(:filter_parameters).new([])) with_auto_filtered_parameters(application) do Class.new(Pirate) do diff --git a/activerecord/test/models/developer.rb b/activerecord/test/models/developer.rb index 2a3fe93950..97e698a18f 100644 --- a/activerecord/test/models/developer.rb +++ b/activerecord/test/models/developer.rb @@ -1,6 +1,5 @@ # frozen_string_literal: true -require "ostruct" require "models/computer" class Developer < ActiveRecord::Base @@ -226,7 +225,7 @@ class LazyBlockDeveloperCalledDavid < ActiveRecord::Base class CallableDeveloperCalledDavid < ActiveRecord::Base self.table_name = "developers" - default_scope OpenStruct.new(call: where(name: "David")) + default_scope Struct.new(:call).new(where(name: "David")) end class ClassMethodDeveloperCalledDavid < ActiveRecord::Base @@ -329,7 +328,7 @@ class EagerDeveloperWithCallableDefaultScope < ActiveRecord::Base self.table_name = "developers" has_and_belongs_to_many :projects, -> { order("projects.id") }, foreign_key: "developer_id", join_table: "developers_projects" - default_scope OpenStruct.new(call: includes(:projects)) + default_scope Struct.new(:call).new(includes(:projects)) end class ThreadsafeDeveloper < ActiveRecord::Base diff --git a/railties/test/application/rake/dbs_test.rb b/railties/test/application/rake/dbs_test.rb index 666bfda222..da1d74986e 100644 --- a/railties/test/application/rake/dbs_test.rb +++ b/railties/test/application/rake/dbs_test.rb @@ -2,7 +2,6 @@ require "isolation/abstract_unit" require "env_helpers" -require "ostruct" module ApplicationTests module RakeTests @@ -139,7 +138,7 @@ def db_create_and_drop(expected_database, environment_loaded: true) app_file "config/environments/development.rb", <<-RUBY Rails.application.configure do - config.other = OpenStruct.new(value: 123) + config.other = Struct.new(:value).new(123) end RUBY