From e86bb0f02dd4c3527d929263238c4fd5c697520d Mon Sep 17 00:00:00 2001 From: Tristan Starck Date: Wed, 23 Oct 2024 09:57:48 -0700 Subject: [PATCH 1/3] add support for rails 7.0 --- Appraisals | 2 +- CHANGELOG.md | 13 +- Gemfile.lock | 139 ++++++++------- fibered_mysql2.gemspec | 2 +- .../{rails_6_0.gemfile => rails_7_0.gemfile} | 2 +- .../fibered_mysql2_adapter.rb | 32 ++-- .../fibered_database_connection_pool.rb | 40 +---- .../fibered_mysql2_connection_factory.rb | 162 ++++++++---------- lib/fibered_mysql2/hash_config_override.rb | 2 + lib/fibered_mysql2/version.rb | 2 +- .../fibered_database_connection_pool_spec.rb | 11 +- 11 files changed, 185 insertions(+), 222 deletions(-) rename gemfiles/{rails_6_0.gemfile => rails_7_0.gemfile} (91%) diff --git a/Appraisals b/Appraisals index 92e0829..3ff90ab 100644 --- a/Appraisals +++ b/Appraisals @@ -2,4 +2,4 @@ require "appraisal/matrix" -appraisal_matrix(rails: "~> 6.0") +appraisal_matrix(rails: [">= 6.1", "< 7.1"]) diff --git a/CHANGELOG.md b/CHANGELOG.md index af1ecd3..7809fec 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,9 +4,20 @@ Inspired by [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). Note: this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [0.3.0] - Unreleased +### Added +- Support for Rails 7.0. + +### Removed +- Removed support for Rails 6.0 and Rails 5. + +### Changed +- Clean up FiberedMysql2ConnectionFactory#fibered_mysql2_connection to better match Mysql2Adapter behavior. +- Change FiberedMysql2::FiberedDatabaseConnectionPool#initialize to match ActiveRecord::ConnectionAdapters::ConnectionPool#initialize arguments. + ## [0.2.1] - 2024-08-19 ### Fixed -- Fixed bugs in Rails 6.1. +- Fixed bugs in Rails 6.1 ## [0.2.0] - 2023-01-12 ### Added diff --git a/Gemfile.lock b/Gemfile.lock index 08f77a3..872c3f2 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,72 +1,78 @@ PATH remote: . specs: - fibered_mysql2 (0.2.1) + fibered_mysql2 (0.3.0) em-synchrony (~> 1.0) - rails (>= 5.2, < 7) + rails (>= 6.1, < 7.1) GEM remote: https://rubygems.org/ specs: - actioncable (6.1.7.8) - actionpack (= 6.1.7.8) - activesupport (= 6.1.7.8) + actioncable (7.0.8.5) + actionpack (= 7.0.8.5) + activesupport (= 7.0.8.5) nio4r (~> 2.0) websocket-driver (>= 0.6.1) - actionmailbox (6.1.7.8) - actionpack (= 6.1.7.8) - activejob (= 6.1.7.8) - activerecord (= 6.1.7.8) - activestorage (= 6.1.7.8) - activesupport (= 6.1.7.8) + actionmailbox (7.0.8.5) + actionpack (= 7.0.8.5) + activejob (= 7.0.8.5) + activerecord (= 7.0.8.5) + activestorage (= 7.0.8.5) + activesupport (= 7.0.8.5) mail (>= 2.7.1) - actionmailer (6.1.7.8) - actionpack (= 6.1.7.8) - actionview (= 6.1.7.8) - activejob (= 6.1.7.8) - activesupport (= 6.1.7.8) + net-imap + net-pop + net-smtp + actionmailer (7.0.8.5) + actionpack (= 7.0.8.5) + actionview (= 7.0.8.5) + activejob (= 7.0.8.5) + activesupport (= 7.0.8.5) mail (~> 2.5, >= 2.5.4) + net-imap + net-pop + net-smtp rails-dom-testing (~> 2.0) - actionpack (6.1.7.8) - actionview (= 6.1.7.8) - activesupport (= 6.1.7.8) - rack (~> 2.0, >= 2.0.9) + actionpack (7.0.8.5) + actionview (= 7.0.8.5) + activesupport (= 7.0.8.5) + rack (~> 2.0, >= 2.2.4) rack-test (>= 0.6.3) rails-dom-testing (~> 2.0) rails-html-sanitizer (~> 1.0, >= 1.2.0) - actiontext (6.1.7.8) - actionpack (= 6.1.7.8) - activerecord (= 6.1.7.8) - activestorage (= 6.1.7.8) - activesupport (= 6.1.7.8) + actiontext (7.0.8.5) + actionpack (= 7.0.8.5) + activerecord (= 7.0.8.5) + activestorage (= 7.0.8.5) + activesupport (= 7.0.8.5) + globalid (>= 0.6.0) nokogiri (>= 1.8.5) - actionview (6.1.7.8) - activesupport (= 6.1.7.8) + actionview (7.0.8.5) + activesupport (= 7.0.8.5) builder (~> 3.1) erubi (~> 1.4) rails-dom-testing (~> 2.0) rails-html-sanitizer (~> 1.1, >= 1.2.0) - activejob (6.1.7.8) - activesupport (= 6.1.7.8) + activejob (7.0.8.5) + activesupport (= 7.0.8.5) globalid (>= 0.3.6) - activemodel (6.1.7.8) - activesupport (= 6.1.7.8) - activerecord (6.1.7.8) - activemodel (= 6.1.7.8) - activesupport (= 6.1.7.8) - activestorage (6.1.7.8) - actionpack (= 6.1.7.8) - activejob (= 6.1.7.8) - activerecord (= 6.1.7.8) - activesupport (= 6.1.7.8) + activemodel (7.0.8.5) + activesupport (= 7.0.8.5) + activerecord (7.0.8.5) + activemodel (= 7.0.8.5) + activesupport (= 7.0.8.5) + activestorage (7.0.8.5) + actionpack (= 7.0.8.5) + activejob (= 7.0.8.5) + activerecord (= 7.0.8.5) + activesupport (= 7.0.8.5) marcel (~> 1.0) mini_mime (>= 1.1.0) - activesupport (6.1.7.8) + activesupport (7.0.8.5) concurrent-ruby (~> 1.0, >= 1.0.2) i18n (>= 1.6, < 2) minitest (>= 5.1) tzinfo (~> 2.0) - zeitwerk (~> 2.3) appraisal (2.5.0) bundler rake @@ -94,7 +100,7 @@ GEM eventmachine (1.2.7) globalid (1.2.1) activesupport (>= 6.1) - i18n (1.14.5) + i18n (1.14.6) concurrent-ruby (~> 1.0) json (2.7.2) loofah (2.22.0) @@ -111,7 +117,7 @@ GEM mini_portile2 (2.8.7) minitest (5.25.1) mysql2 (0.5.6) - net-imap (0.4.14) + net-imap (0.5.0) date net-protocol net-pop (0.1.2) @@ -131,24 +137,23 @@ GEM byebug (~> 11.0) pry (>= 0.13, < 0.15) racc (1.8.1) - rack (2.2.9) + rack (2.2.10) rack-test (2.1.0) rack (>= 1.3) - rails (6.1.7.8) - actioncable (= 6.1.7.8) - actionmailbox (= 6.1.7.8) - actionmailer (= 6.1.7.8) - actionpack (= 6.1.7.8) - actiontext (= 6.1.7.8) - actionview (= 6.1.7.8) - activejob (= 6.1.7.8) - activemodel (= 6.1.7.8) - activerecord (= 6.1.7.8) - activestorage (= 6.1.7.8) - activesupport (= 6.1.7.8) + rails (7.0.8.5) + actioncable (= 7.0.8.5) + actionmailbox (= 7.0.8.5) + actionmailer (= 7.0.8.5) + actionpack (= 7.0.8.5) + actiontext (= 7.0.8.5) + actionview (= 7.0.8.5) + activejob (= 7.0.8.5) + activemodel (= 7.0.8.5) + activerecord (= 7.0.8.5) + activestorage (= 7.0.8.5) + activesupport (= 7.0.8.5) bundler (>= 1.15.0) - railties (= 6.1.7.8) - sprockets-rails (>= 2.0.0) + railties (= 7.0.8.5) rails-dom-testing (2.2.0) activesupport (>= 5.0.0) minitest @@ -156,12 +161,13 @@ GEM rails-html-sanitizer (1.6.0) loofah (~> 2.21) nokogiri (~> 1.14) - railties (6.1.7.8) - actionpack (= 6.1.7.8) - activesupport (= 6.1.7.8) + railties (7.0.8.5) + actionpack (= 7.0.8.5) + activesupport (= 7.0.8.5) method_source rake (>= 12.2) thor (~> 1.0) + zeitwerk (~> 2.5) rake (13.2.1) rspec (3.13.0) rspec-core (~> 3.13.0) @@ -181,17 +187,10 @@ GEM json (>= 1.8, < 3) simplecov-html (~> 0.10.0) simplecov-html (0.10.2) - sprockets (4.2.1) - concurrent-ruby (~> 1.0) - rack (>= 2.2.4, < 4) - sprockets-rails (3.5.2) - actionpack (>= 6.1) - activesupport (>= 6.1) - sprockets (>= 3.0.0) sync (0.5.0) term-ansicolor (1.11.2) tins (~> 1.0) - thor (1.3.1) + thor (1.3.2) timeout (0.4.1) tins (1.33.0) bigdecimal @@ -201,7 +200,7 @@ GEM websocket-driver (0.7.6) websocket-extensions (>= 0.1.0) websocket-extensions (0.1.5) - zeitwerk (2.6.17) + zeitwerk (2.6.18) PLATFORMS ruby diff --git a/fibered_mysql2.gemspec b/fibered_mysql2.gemspec index 1d89dd7..8f97bbf 100644 --- a/fibered_mysql2.gemspec +++ b/fibered_mysql2.gemspec @@ -30,5 +30,5 @@ Gem::Specification.new do |spec| spec.require_paths = ["lib"] spec.add_dependency 'em-synchrony', '~> 1.0' - spec.add_dependency 'rails', '>= 5.2', '< 7' + spec.add_dependency 'rails', '>= 6.1', '< 7.1' end diff --git a/gemfiles/rails_6_0.gemfile b/gemfiles/rails_7_0.gemfile similarity index 91% rename from gemfiles/rails_6_0.gemfile rename to gemfiles/rails_7_0.gemfile index a10b463..5fd8832 100644 --- a/gemfiles/rails_6_0.gemfile +++ b/gemfiles/rails_7_0.gemfile @@ -11,6 +11,6 @@ gem "pry" gem "pry-byebug" gem "rake" gem "rspec" -gem "rails", "~> 6.0.0" +gem "rails", "~> 7.0.0" gemspec path: "../" diff --git a/lib/active_record/connection_adapters/fibered_mysql2_adapter.rb b/lib/active_record/connection_adapters/fibered_mysql2_adapter.rb index be8181c..bffab09 100644 --- a/lib/active_record/connection_adapters/fibered_mysql2_adapter.rb +++ b/lib/active_record/connection_adapters/fibered_mysql2_adapter.rb @@ -6,16 +6,6 @@ require 'active_record/connection_adapters/em_mysql2_adapter' module FiberedMysql2 - module FiberedMysql2Adapter_4_2 - def lease - synchronize do - unless in_use? - @owner = Fiber.current - end - end - end - end - module FiberedMysql2Adapter_5_2 def lease if in_use? @@ -72,11 +62,23 @@ def owner_fiber end class FiberedMysql2Adapter < ::ActiveRecord::ConnectionAdapters::EMMysql2Adapter - case ::Rails::VERSION::MAJOR - when 4 - include FiberedMysql2Adapter_4_2 - when 5, 6 - include FiberedMysql2Adapter_5_2 + include FiberedMysql2Adapter_5_2 + + class << self + # Copied from Mysql2Adapter, except with the EM Mysql2 client + def new_client(config) + Mysql2::EM::Client.new(config) + rescue Mysql2::Error => error + if error.error_number == ConnectionAdapters::Mysql2Adapter::ER_BAD_DB_ERROR + raise ActiveRecord::NoDatabaseError.db_error(config[:database]) + elsif error.error_number == ConnectionAdapters::Mysql2Adapter::ER_ACCESS_DENIED_ERROR + raise ActiveRecord::DatabaseConnectionError.username_error(config[:username]) + elsif [ConnectionAdapters::Mysql2Adapter::ER_CONN_HOST_ERROR, ConnectionAdapters::Mysql2Adapter::ER_UNKNOWN_HOST_ERROR].include?(error.error_number) + raise ActiveRecord::DatabaseConnectionError.hostname_error(config[:host]) + else + raise ActiveRecord::ConnectionNotEstablished, error.message + end + end end def initialize(*args) diff --git a/lib/fibered_mysql2/fibered_database_connection_pool.rb b/lib/fibered_mysql2/fibered_database_connection_pool.rb index 3a38bf2..4c49a14 100644 --- a/lib/fibered_mysql2/fibered_database_connection_pool.rb +++ b/lib/fibered_mysql2/fibered_database_connection_pool.rb @@ -186,25 +186,6 @@ def mon_exit_for_cond module FiberedDatabaseConnectionPool include FiberedMonitorMixin - module Adapter_4_2 - def cached_connections - @reserved_connections - end - - def current_connection_id - ActiveRecord::Base.connection_id ||= Fiber.current.object_id - end - - def checkout - begin - reap_connections - rescue => ex - ActiveRecord::Base.logger.error("Exception occurred while executing reap_connections: #{ex}") - end - super - end - end - module Adapter_5_2 def cached_connections @thread_cached_conns @@ -229,27 +210,16 @@ def release_connection(owner_thread = Fiber.current) end end end + include Adapter_5_2 - case Rails::VERSION::MAJOR - when 4 - include Adapter_4_2 - when 5, 6 - include Adapter_5_2 - end - - def initialize(connection_spec, *args, **keyword_args) - if ActiveRecord.gem_version < "6.1" - connection_spec.config[:reaping_frequency] and raise "reaping_frequency is not supported (the ActiveRecord Reaper is thread-based)" - connection_spec.config[:reaping_frequency] = nil # starting in Rails 5, this defaults to 60 if not explicitly set - elsif connection_spec.db_config.reaping_frequency - connection_spec.db_config.reaping_frequency > 0 and raise "reaping_frequency is not supported (the ActiveRecord Reaper is thread-based)" + def initialize(pool_config) + if pool_config.db_config.reaping_frequency + pool_config.db_config.reaping_frequency > 0 and raise "reaping_frequency is not supported (the ActiveRecord Reaper is thread-based)" end - super(connection_spec, *args, **keyword_args) + super(pool_config) @reaper = nil # no need to keep a reference to this since it does nothing in this sub-class - - # note that @reserved_connections is a ThreadSafe::Cache which is overkill in a fibered world, but harmless end def connection diff --git a/lib/fibered_mysql2/fibered_mysql2_connection_factory.rb b/lib/fibered_mysql2/fibered_mysql2_connection_factory.rb index bd19bc7..fb24cb9 100644 --- a/lib/fibered_mysql2/fibered_mysql2_connection_factory.rb +++ b/lib/fibered_mysql2/fibered_mysql2_connection_factory.rb @@ -16,90 +16,80 @@ def transaction(*args) _ = TransactionManager class TransactionManager < _ - if Rails::VERSION::MAJOR > 5 - # Overriding the em-synchrony override to bring it up to rails 6 requirements. - # Changes from the original Rails 6 source are: - # 1. the usage of _current_stack created by em-synchrony instead of the Rails provided @stack instance variable - # 2. the usage of Fiber.current.object_id as a part of the savepoint transaction name - # - # Original EM Synchrony Source: - # https://github.com/igrigorik/em-synchrony/blob/master/lib/em-synchrony/activerecord_4_2.rb#L35-L44 - # - # Original Rails Source: - # https://github.com/rails/rails/blob/6-0-stable/activerecord/lib/active_record/connection_adapters/abstract/transaction.rb#L205-L224 - def begin_transaction(options = {}) - @connection.lock.synchronize do - run_commit_callbacks = !current_transaction.joinable? - transaction = - if _current_stack.empty? - if ::ActiveRecord.gem_version < "6.1" - ::ActiveRecord::ConnectionAdapters::RealTransaction.new(@connection, options, run_commit_callbacks: run_commit_callbacks) - else - ::ActiveRecord::ConnectionAdapters::RealTransaction.new(@connection, **options, run_commit_callbacks: run_commit_callbacks) - end - else - if ::ActiveRecord.gem_version < "6.1" - ::ActiveRecord::ConnectionAdapters::SavepointTransaction.new(@connection, "active_record_#{Fiber.current.object_id}_#{open_transactions}", _current_stack.last, options, run_commit_callbacks: run_commit_callbacks) - else - ::ActiveRecord::ConnectionAdapters::SavepointTransaction.new(@connection, "active_record_#{Fiber.current.object_id}_#{open_transactions}", _current_stack.last, **options, run_commit_callbacks: run_commit_callbacks) - end - end - - if @connection.supports_lazy_transactions? && lazy_transactions_enabled? && options[:_lazy] != false - @has_unmaterialized_transactions = true - else - transaction.materialize! - end - _current_stack.push(transaction) - transaction + # Overriding the em-synchrony override to bring it up to rails 6 requirements. + # Changes from the original Rails 6 source are: + # 1. the usage of _current_stack created by em-synchrony instead of the Rails provided @stack instance variable + # 2. the usage of Fiber.current.object_id as a part of the savepoint transaction name + # + # Original EM Synchrony Source: + # https://github.com/igrigorik/em-synchrony/blob/master/lib/em-synchrony/activerecord_4_2.rb#L35-L44 + # + # Original Rails Source: + # https://github.com/rails/rails/blob/6-0-stable/activerecord/lib/active_record/connection_adapters/abstract/transaction.rb#L205-L224 + def begin_transaction(isolation: nil, joinable: true, _lazy: true) + @connection.lock.synchronize do + run_commit_callbacks = !current_transaction.joinable? + transaction = + if _current_stack.empty? + ::ActiveRecord::ConnectionAdapters::RealTransaction.new(@connection, isolation:, joinable:, run_commit_callbacks: run_commit_callbacks) + else + ::ActiveRecord::ConnectionAdapters::SavepointTransaction.new(@connection, "active_record_#{Fiber.current.object_id}_#{open_transactions}", _current_stack.last, isolation:, joinable:, run_commit_callbacks: run_commit_callbacks) + end + + if @connection.supports_lazy_transactions? && lazy_transactions_enabled? && _lazy + @has_unmaterialized_transactions = true + else + transaction.materialize! end + _current_stack.push(transaction) + transaction end + end - # Overriding the ActiveRecord::TransactionManager#materialize_transactions method to use - # fiber safe the _current_stack instead of the @stack instance variable. when marterializing - # transactions. - def materialize_transactions - return if @materializing_transactions - return unless @has_unmaterialized_transactions - - @connection.lock.synchronize do - begin - @materializing_transactions = true - _current_stack.each { |t| t.materialize! unless t.materialized? } - ensure - @materializing_transactions = false - end - @has_unmaterialized_transactions = false + # Overriding the ActiveRecord::TransactionManager#materialize_transactions method to use + # fiber safe the _current_stack instead of the @stack instance variable. when marterializing + # transactions. + def materialize_transactions + return if @materializing_transactions + return unless @has_unmaterialized_transactions + + @connection.lock.synchronize do + begin + @materializing_transactions = true + _current_stack.each { |t| t.materialize! unless t.materialized? } + ensure + @materializing_transactions = false end + @has_unmaterialized_transactions = false end + end - # Overriding the ActiveRecord::TransactionManager#commit_transaction method to use - # fiber safe the _current_stack instead of the @stack instance variable. when marterializing - # transactions. - def commit_transaction - @connection.lock.synchronize do - transaction = _current_stack.last - - begin - transaction.before_commit_records - ensure - _current_stack.pop - end - - transaction.commit - transaction.commit_records + # Overriding the ActiveRecord::TransactionManager#commit_transaction method to use + # fiber safe the _current_stack instead of the @stack instance variable. when marterializing + # transactions. + def commit_transaction + @connection.lock.synchronize do + transaction = _current_stack.last + + begin + transaction.before_commit_records + ensure + _current_stack.pop end + + transaction.commit + transaction.commit_records end + end - # Overriding the ActiveRecord::TransactionManager#rollback_transaction method to use - # fiber safe the _current_stack instead of the @stack instance variable. when marterializing - # transactions. - def rollback_transaction(transaction = nil) - @connection.lock.synchronize do - transaction ||= _current_stack.pop - transaction.rollback - transaction.rollback_records - end + # Overriding the ActiveRecord::TransactionManager#rollback_transaction method to use + # fiber safe the _current_stack instead of the @stack instance variable. when marterializing + # transactions. + def rollback_transaction(transaction = nil) + @connection.lock.synchronize do + transaction ||= _current_stack.pop + transaction.rollback + transaction.rollback_records end end end @@ -111,23 +101,17 @@ module FiberedMysql2 module FiberedMysql2ConnectionFactory def fibered_mysql2_connection(raw_config) config = raw_config.symbolize_keys + config[:flags] ||= 0 + if config[:flags].kind_of? Array + config[:flags].push "FOUND_ROWS" + else + config[:flags] |= Mysql2::Client::FOUND_ROWS + end config[:username] = 'root' if config[:username].nil? - config[:flags] = Mysql2::Client::FOUND_ROWS if Mysql2::Client.const_defined?(:FOUND_ROWS) - - client = - begin - Mysql2::EM::Client.new(config) - rescue Mysql2::Error => error - if error.message.include?("Unknown database") - raise ActiveRecord::NoDatabaseError.new(error.message, error) - else - raise - end - end - options = [config[:host], config[:username], config[:password], config[:database], config[:port], config[:socket], 0] - FiberedMysql2Adapter.new(client, logger, options, config) + client = FiberedMysql2Adapter.new_client(config) + FiberedMysql2Adapter.new(client, logger, nil, config) end end end diff --git a/lib/fibered_mysql2/hash_config_override.rb b/lib/fibered_mysql2/hash_config_override.rb index 1480951..f3af31d 100644 --- a/lib/fibered_mysql2/hash_config_override.rb +++ b/lib/fibered_mysql2/hash_config_override.rb @@ -1,5 +1,7 @@ # frozen_string_literal: true +require "active_record/database_configurations/hash_config" + module FiberedMysql2 module HashConfigOverride # Override the reaping_frequency method to return nil so that the connection pool does not reap connections when in fibered mode. diff --git a/lib/fibered_mysql2/version.rb b/lib/fibered_mysql2/version.rb index b8754a8..aaa4739 100644 --- a/lib/fibered_mysql2/version.rb +++ b/lib/fibered_mysql2/version.rb @@ -1,5 +1,5 @@ # frozen_string_literal: true module FiberedMysql2 - VERSION = "0.2.1" + VERSION = "0.3.0" end diff --git a/spec/unit/fibered_database_connection_pool_spec.rb b/spec/unit/fibered_database_connection_pool_spec.rb index ccaa091..0c6766f 100644 --- a/spec/unit/fibered_database_connection_pool_spec.rb +++ b/spec/unit/fibered_database_connection_pool_spec.rb @@ -313,15 +313,10 @@ def cancel_timer(timer_block) let(:config) {{ database: 'rr_prod', host: 'master.ringrevenue.net' }} let(:adapter_method) { :em_mysql2 } let(:spec) do - case Rails::VERSION::MAJOR - when 4 - ActiveRecord::ConnectionAdapters::ConnectionSpecification.new(config, adapter_method) + if ActiveRecord.gem_version < "7.0" + ActiveRecord::ConnectionAdapters::PoolConfig.new(name, ActiveRecord::DatabaseConfigurations::HashConfig.new("staging", "staging", config)) else - if ActiveRecord.gem_version < "6.1" - ActiveRecord::ConnectionAdapters::ConnectionSpecification.new(name, config, adapter_method) - else - ActiveRecord::ConnectionAdapters::PoolConfig.new(name, ActiveRecord::DatabaseConfigurations::HashConfig.new("staging", "staging", config)) - end + ActiveRecord::ConnectionAdapters::PoolConfig.new(name, ActiveRecord::DatabaseConfigurations::HashConfig.new("primary", "primary", config), "primary", nil) end end From 967c15a5c4eae7f0039d008fcbdf97495ead23f7 Mon Sep 17 00:00:00 2001 From: Tristan Starck Date: Wed, 23 Oct 2024 09:58:49 -0700 Subject: [PATCH 2/3] fix gh actions gemfile matrix --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 9a98497..1c9a10d 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -11,8 +11,8 @@ jobs: ruby: [3.1, 3.2, 3.3] gemfile: - Gemfile - - gemfiles/rails_6_0.gemfile - gemfiles/rails_6_1.gemfile + - gemfiles/rails_7_0.gemfile env: BUNDLE_GEMFILE: ${{ matrix.gemfile }} steps: From ac0dda881cc08d6c9bb53f312bdaedbc1f42ddff Mon Sep 17 00:00:00 2001 From: Tristan Starck Date: Wed, 23 Oct 2024 13:16:48 -0700 Subject: [PATCH 3/3] prepare for full release --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7809fec..b5ce446 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,7 +4,7 @@ Inspired by [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). Note: this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## [0.3.0] - Unreleased +## [0.3.0] - 2024-10-23 ### Added - Support for Rails 7.0.