From aa1374dea02bb4b7d64322b33f5c6841a62cf5d5 Mon Sep 17 00:00:00 2001 From: Noel Rappin Date: Thu, 12 Feb 2026 14:22:43 -0600 Subject: [PATCH 1/3] first --- .github/workflows/tests.yml | 9 ++-- Appraisals | 16 ++++--- .../{rails_6.1.gemfile => rails_7.2.gemfile} | 2 +- .../{rails_7.0.gemfile => rails_8.0.gemfile} | 2 +- gemfiles/rails_8.1.gemfile | 7 +++ .../connection_adapters/abstract_mysql.rb | 45 +++++++----------- lib/sql_enum/class_methods.rb | 9 ++-- lib/sql_enum/version.rb | 2 +- sql_enum-1.0.0.gem | Bin 0 -> 12288 bytes sql_enum.gemspec | 4 +- 10 files changed, 51 insertions(+), 45 deletions(-) rename gemfiles/{rails_6.1.gemfile => rails_7.2.gemfile} (80%) rename gemfiles/{rails_7.0.gemfile => rails_8.0.gemfile} (80%) create mode 100644 gemfiles/rails_8.1.gemfile create mode 100644 sql_enum-1.0.0.gem diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 00edf89..d0a06b7 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -10,14 +10,15 @@ jobs: strategy: matrix: ruby: - - '3.0' - - '3.1' - '3.2' - '3.3' + - '3.4' + - '4.0' rails: - - '6.1' - - '7.0' - '7.1' + - '7.2' + - '8.0' + - '8.1' runs-on: ubuntu-22.04 name: RSpec (Rails ${{ matrix.rails }}) (Ruby ${{ matrix.ruby }}) diff --git a/Appraisals b/Appraisals index b85fe68..fb892cd 100644 --- a/Appraisals +++ b/Appraisals @@ -1,11 +1,15 @@ -appraise "rails-6.1" do - gem "rails", "~> 6.1" +appraise "rails-7.1" do + gem "rails", "~> 7.1" end -appraise "rails-7.0" do - gem "rails", "~> 7.0" +appraise "rails-7.2" do + gem "rails", "~> 7.2" end -appraise "rails-7.1" do - gem "rails", "~> 7.1" +appraise "rails-8.0" do + gem "rails", "~> 8.0" +end + +appraise "rails-8.1" do + gem "rails", "~> 8.1" end diff --git a/gemfiles/rails_6.1.gemfile b/gemfiles/rails_7.2.gemfile similarity index 80% rename from gemfiles/rails_6.1.gemfile rename to gemfiles/rails_7.2.gemfile index c34b486..978120d 100644 --- a/gemfiles/rails_6.1.gemfile +++ b/gemfiles/rails_7.2.gemfile @@ -2,6 +2,6 @@ source "https://rubygems.org" -gem "rails", "~> 6.1" +gem "rails", "~> 7.2" gemspec path: "../" diff --git a/gemfiles/rails_7.0.gemfile b/gemfiles/rails_8.0.gemfile similarity index 80% rename from gemfiles/rails_7.0.gemfile rename to gemfiles/rails_8.0.gemfile index 9d2735b..0b55d5a 100644 --- a/gemfiles/rails_7.0.gemfile +++ b/gemfiles/rails_8.0.gemfile @@ -2,6 +2,6 @@ source "https://rubygems.org" -gem "rails", "~> 7.0" +gem "rails", "~> 8.0" gemspec path: "../" diff --git a/gemfiles/rails_8.1.gemfile b/gemfiles/rails_8.1.gemfile new file mode 100644 index 0000000..c88a868 --- /dev/null +++ b/gemfiles/rails_8.1.gemfile @@ -0,0 +1,7 @@ +# This file was generated by Appraisal + +source "https://rubygems.org" + +gem "rails", "~> 8.1" + +gemspec path: "../" diff --git a/lib/active_record/connection_adapters/abstract_mysql.rb b/lib/active_record/connection_adapters/abstract_mysql.rb index b5d0841..258a87d 100644 --- a/lib/active_record/connection_adapters/abstract_mysql.rb +++ b/lib/active_record/connection_adapters/abstract_mysql.rb @@ -9,39 +9,30 @@ def register_enum_type(mapping) end end - # In Rails 6.1, registering the enum type is an instance method and is - # done on initialization, In Rails 7.0 it is a class method and - # the registration happens when the class is loaded. So, in Rails 6.1, - # we can override the `initialize_type_map` method to register the enum - # but in Rails 7.1, we need to call register_enum_type explicitly. - - if SqlEnum.rails_version_match?("6.1") - module SqlEnumMapper - def initialize_type_map(m = type_map) - super(m) - AbstractMysqlAdapter.register_enum_type(m) - end - end - - ActiveRecord::ConnectionAdapters::Mysql2Adapter.prepend(SqlEnumMapper) - end - - - if SqlEnum.rails_version_match?("7.0") - [ - ActiveRecord::ConnectionAdapters::Mysql2Adapter::TYPE_MAP, - ActiveRecord::ConnectionAdapters::Mysql2Adapter::TYPE_MAP_WITH_BOOLEAN - ].each do |m| - AbstractMysqlAdapter.register_enum_type(m) - end - end - # Rails 7.1 drops the TYPE_MAP_WITH_BOOLEAN constant if SqlEnum.rails_version_match?("7.1") AbstractMysqlAdapter.register_enum_type( ActiveRecord::ConnectionAdapters::Mysql2Adapter::TYPE_MAP ) end + + if SqlEnum.rails_version_match?("7.2") + AbstractMysqlAdapter.register_enum_type( + ActiveRecord::ConnectionAdapters::Mysql2Adapter::TYPE_MAP + ) + end + + if SqlEnum.rails_version_match?("8.0") + AbstractMysqlAdapter.register_enum_type( + ActiveRecord::ConnectionAdapters::Mysql2Adapter::TYPE_MAP + ) + end + + if SqlEnum.rails_version_match?(".1") + AbstractMysqlAdapter.register_enum_type( + ActiveRecord::ConnectionAdapters::Mysql2Adapter::TYPE_MAP + ) + end end end end diff --git a/lib/sql_enum/class_methods.rb b/lib/sql_enum/class_methods.rb index 890991f..d56a8d8 100644 --- a/lib/sql_enum/class_methods.rb +++ b/lib/sql_enum/class_methods.rb @@ -13,11 +13,14 @@ def sql_enum(column_name, options = {}) suffix = options.fetch(:_suffix, !!SqlEnum.configuration&.default_suffix) # Define enum using Rails enum - enum(column_name => values_map, _prefix: prefix, _suffix: suffix) + enum(column_name, values_map, prefix: prefix, suffix: suffix) # Override reader to return symbols - type_definition = ->(subtype) { EnumType.new(attr, send(column_name.to_s.pluralize), subtype) } - attribute(column_name, &type_definition) + col_name = column_name.to_s + decorate_attributes([col_name]) do |_name, subtype| + subtype = subtype.subtype if ActiveRecord::Enum::EnumType === subtype + EnumType.new(col_name, send(col_name.pluralize), subtype) + end prefix_str = format_affix(column_name, prefix, suffix: '_') suffix_str = format_affix(column_name, suffix, prefix: '_') diff --git a/lib/sql_enum/version.rb b/lib/sql_enum/version.rb index b58f273..5666529 100644 --- a/lib/sql_enum/version.rb +++ b/lib/sql_enum/version.rb @@ -1,3 +1,3 @@ module SqlEnum - VERSION = "1.0.0" + VERSION = "2.0.0" end diff --git a/sql_enum-1.0.0.gem b/sql_enum-1.0.0.gem new file mode 100644 index 0000000000000000000000000000000000000000..653d457ea15baf56fda5f43b121c9178a9002118 GIT binary patch literal 12288 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 6.1.0" - spec.add_dependency "activerecord", ">= 6.1.0" + spec.add_dependency "activesupport", ">= 7.1.0" + spec.add_dependency "activerecord", ">= 7.1.0" spec.add_development_dependency "appraisal" spec.add_development_dependency "awesome_print" From 18b0e2a182c4ef3a45b50714823bd48b126cb96a Mon Sep 17 00:00:00 2001 From: Noel Rappin Date: Thu, 12 Feb 2026 14:52:50 -0600 Subject: [PATCH 2/3] Second --- .gitignore | 2 + Appraisals | 8 ++-- Dockerfile | 2 +- Gemfile.lock | 42 +++++++++++++------ README.md | 6 +-- gemfiles/rails_7.1.gemfile | 2 +- gemfiles/rails_7.2.gemfile | 2 +- gemfiles/rails_8.0.gemfile | 2 +- gemfiles/rails_8.1.gemfile | 2 +- .../connection_adapters/abstract_mysql.rb | 28 ++----------- .../connection_adapters/mysql2.rb | 15 +++---- lib/sql_enum.rb | 4 -- lib/sql_enum/class_methods.rb | 8 +++- lib/sql_enum/enum_column.rb | 12 +++--- sql_enum.gemspec | 2 + 15 files changed, 71 insertions(+), 66 deletions(-) diff --git a/.gitignore b/.gitignore index eb10a5b..4579abf 100644 --- a/.gitignore +++ b/.gitignore @@ -12,3 +12,5 @@ gemfiles/*.lock .env.local +*.gem +/.claude diff --git a/Appraisals b/Appraisals index fb892cd..2633c7d 100644 --- a/Appraisals +++ b/Appraisals @@ -1,15 +1,15 @@ appraise "rails-7.1" do - gem "rails", "~> 7.1" + gem "rails", "~> 7.1.0" end appraise "rails-7.2" do - gem "rails", "~> 7.2" + gem "rails", "~> 7.2.0" end appraise "rails-8.0" do - gem "rails", "~> 8.0" + gem "rails", "~> 8.0.0" end appraise "rails-8.1" do - gem "rails", "~> 8.1" + gem "rails", "~> 8.1.0" end diff --git a/Dockerfile b/Dockerfile index fb8c4cb..ca8c75b 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM ruby:3.0 +FROM ruby:3.4 WORKDIR /usr/src/app diff --git a/Gemfile.lock b/Gemfile.lock index 5a641cb..9df419d 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,40 +1,55 @@ PATH remote: . specs: - sql_enum (1.0.0) - activerecord (>= 6.1.0) - activesupport (>= 6.1.0) + sql_enum (2.0.0) + activerecord (>= 7.1.0) + activesupport (>= 7.1.0) mysql2 GEM remote: https://rubygems.org/ specs: - activemodel (7.0.8) - activesupport (= 7.0.8) - activerecord (7.0.8) - activemodel (= 7.0.8) - activesupport (= 7.0.8) - activesupport (7.0.8) - concurrent-ruby (~> 1.0, >= 1.0.2) + activemodel (8.1.2) + activesupport (= 8.1.2) + activerecord (8.1.2) + activemodel (= 8.1.2) + activesupport (= 8.1.2) + timeout (>= 0.4.0) + activesupport (8.1.2) + base64 + bigdecimal + concurrent-ruby (~> 1.0, >= 1.3.1) + connection_pool (>= 2.2.5) + drb i18n (>= 1.6, < 2) + json + logger (>= 1.4.2) minitest (>= 5.1) - tzinfo (~> 2.0) + securerandom (>= 0.3) + tzinfo (~> 2.0, >= 2.0.5) + uri (>= 0.13.1) appraisal (2.5.0) bundler rake thor (>= 0.14.0) awesome_print (1.9.2) - concurrent-ruby (1.2.3) + base64 (0.3.0) + bigdecimal (4.0.1) + concurrent-ruby (1.3.6) + connection_pool (3.0.2) debug (1.9.1) irb (~> 1.10) reline (>= 0.3.8) diff-lcs (1.5.0) + drb (2.2.3) i18n (1.14.1) concurrent-ruby (~> 1.0) io-console (0.7.2) irb (1.11.1) rdoc reline (>= 0.4.2) + json (2.18.1) + logger (1.7.0) minitest (5.21.2) mysql2 (0.5.5) psych (5.1.2) @@ -57,10 +72,13 @@ GEM diff-lcs (>= 1.2.0, < 2.0) rspec-support (~> 3.12.0) rspec-support (3.12.1) + securerandom (0.4.1) stringio (3.1.0) thor (1.3.0) + timeout (0.6.0) tzinfo (2.0.6) concurrent-ruby (~> 1.0) + uri (1.1.1) PLATFORMS ruby diff --git a/README.md b/README.md index 444c070..c27c2b6 100644 --- a/README.md +++ b/README.md @@ -4,9 +4,9 @@ Enables usage of native sql enums with ActiveRecord ## NOTE -Version 1.0 of this is compatible with Rails 7 and above. +Version 2.0 of this gem requires Rails 7.1+ and Ruby 3.2+. -For Rails versions below Rails 7, use version 0.4 +For Rails 7.0 and 7.1, use version 1.0. For Rails versions below 7, use version 0.4. ## Installation @@ -30,7 +30,7 @@ Or install it yourself as: Use a part of table definition: ```ruby -class CreateUsers < ActiveRecord::Migration[5.1] +class CreateUsers < ActiveRecord::Migration[7.1] def change create_table :users do |t| t.enum :status, limit: [:active, :pending, :inactive], default: :active diff --git a/gemfiles/rails_7.1.gemfile b/gemfiles/rails_7.1.gemfile index 1d906c3..35a0ba3 100644 --- a/gemfiles/rails_7.1.gemfile +++ b/gemfiles/rails_7.1.gemfile @@ -2,6 +2,6 @@ source "https://rubygems.org" -gem "rails", "~> 7.1" +gem "rails", "~> 7.1.0" gemspec path: "../" diff --git a/gemfiles/rails_7.2.gemfile b/gemfiles/rails_7.2.gemfile index 978120d..92cc2b2 100644 --- a/gemfiles/rails_7.2.gemfile +++ b/gemfiles/rails_7.2.gemfile @@ -2,6 +2,6 @@ source "https://rubygems.org" -gem "rails", "~> 7.2" +gem "rails", "~> 7.2.0" gemspec path: "../" diff --git a/gemfiles/rails_8.0.gemfile b/gemfiles/rails_8.0.gemfile index 0b55d5a..3b3765b 100644 --- a/gemfiles/rails_8.0.gemfile +++ b/gemfiles/rails_8.0.gemfile @@ -2,6 +2,6 @@ source "https://rubygems.org" -gem "rails", "~> 8.0" +gem "rails", "~> 8.0.0" gemspec path: "../" diff --git a/gemfiles/rails_8.1.gemfile b/gemfiles/rails_8.1.gemfile index c88a868..cedb65f 100644 --- a/gemfiles/rails_8.1.gemfile +++ b/gemfiles/rails_8.1.gemfile @@ -2,6 +2,6 @@ source "https://rubygems.org" -gem "rails", "~> 8.1" +gem "rails", "~> 8.1.0" gemspec path: "../" diff --git a/lib/active_record/connection_adapters/abstract_mysql.rb b/lib/active_record/connection_adapters/abstract_mysql.rb index 258a87d..6795572 100644 --- a/lib/active_record/connection_adapters/abstract_mysql.rb +++ b/lib/active_record/connection_adapters/abstract_mysql.rb @@ -9,30 +9,10 @@ def register_enum_type(mapping) end end - # Rails 7.1 drops the TYPE_MAP_WITH_BOOLEAN constant - if SqlEnum.rails_version_match?("7.1") - AbstractMysqlAdapter.register_enum_type( - ActiveRecord::ConnectionAdapters::Mysql2Adapter::TYPE_MAP - ) - end - - if SqlEnum.rails_version_match?("7.2") - AbstractMysqlAdapter.register_enum_type( - ActiveRecord::ConnectionAdapters::Mysql2Adapter::TYPE_MAP - ) - end - - if SqlEnum.rails_version_match?("8.0") - AbstractMysqlAdapter.register_enum_type( - ActiveRecord::ConnectionAdapters::Mysql2Adapter::TYPE_MAP - ) - end - - if SqlEnum.rails_version_match?(".1") - AbstractMysqlAdapter.register_enum_type( - ActiveRecord::ConnectionAdapters::Mysql2Adapter::TYPE_MAP - ) - end + # Rails 7.1+ uses a single TYPE_MAP constant on the adapter class + AbstractMysqlAdapter.register_enum_type( + ActiveRecord::ConnectionAdapters::Mysql2Adapter::TYPE_MAP + ) end end end diff --git a/lib/active_record/connection_adapters/mysql2.rb b/lib/active_record/connection_adapters/mysql2.rb index 79ebd48..c5f427a 100644 --- a/lib/active_record/connection_adapters/mysql2.rb +++ b/lib/active_record/connection_adapters/mysql2.rb @@ -7,16 +7,17 @@ def native_database_types self.class::NATIVE_DATABASE_TYPES.merge(enum: {name: "enum"}) end - def type_to_sql_with_enum(type, limit: nil, precision: nil, scale: nil, unsigned: nil, **) - if type.to_sym == :enum - "#{type}(#{limit.map{|n| "'#{n}'"}.join(",")})" - else - type_to_sql_without_enum(type, limit: limit, precision: precision, scale: scale, unsigned: unsigned) + module SqlEnumTypeToSql + def type_to_sql(type, limit: nil, **) + if type.to_sym == :enum + "#{type}(#{limit.map { |n| "'#{n}'" }.join(",")})" + else + super + end end end - alias_method :type_to_sql_without_enum, :type_to_sql - alias_method :type_to_sql, :type_to_sql_with_enum + prepend SqlEnumTypeToSql end end end diff --git a/lib/sql_enum.rb b/lib/sql_enum.rb index 792e215..879521a 100644 --- a/lib/sql_enum.rb +++ b/lib/sql_enum.rb @@ -7,10 +7,6 @@ def self.configure self.configuration ||= Configuration.new yield(configuration) end - - def self.rails_version_match?(version_string) - ActiveSupport.version.to_s.start_with?(version_string) - end end require 'active_record' diff --git a/lib/sql_enum/class_methods.rb b/lib/sql_enum/class_methods.rb index d56a8d8..f15d83a 100644 --- a/lib/sql_enum/class_methods.rb +++ b/lib/sql_enum/class_methods.rb @@ -17,11 +17,17 @@ def sql_enum(column_name, options = {}) # Override reader to return symbols col_name = column_name.to_s - decorate_attributes([col_name]) do |_name, subtype| + enum_type = ->(subtype) do subtype = subtype.subtype if ActiveRecord::Enum::EnumType === subtype EnumType.new(col_name, send(col_name.pluralize), subtype) end + if respond_to?(:decorate_attributes, true) + decorate_attributes([col_name]) { |_name, subtype| enum_type.call(subtype) } + else + attribute(column_name, &enum_type) + end + prefix_str = format_affix(column_name, prefix, suffix: '_') suffix_str = format_affix(column_name, suffix, prefix: '_') diff --git a/lib/sql_enum/enum_column.rb b/lib/sql_enum/enum_column.rb index 786951d..4294c1c 100644 --- a/lib/sql_enum/enum_column.rb +++ b/lib/sql_enum/enum_column.rb @@ -9,15 +9,15 @@ def values private def schema_values - ActiveRecord::Base.connection.exec_query(schema_values_query).rows.dig(0, 0) + if ActiveRecord::Base.respond_to?(:with_connection) + ActiveRecord::Base.with_connection { |conn| conn.exec_query(schema_values_query).rows.dig(0, 0) } + else + ActiveRecord::Base.connection.exec_query(schema_values_query).rows.dig(0, 0) + end end def database_name - if ActiveRecord::Base.respond_to?(:connection_db_config) - ActiveRecord::Base.connection_db_config.configuration_hash[:database] - else - ActiveRecord::Base.connection_config.values_at(:database, :database_name).find(&:present?) - end + ActiveRecord::Base.connection_db_config.configuration_hash[:database] end def schema_values_query diff --git a/sql_enum.gemspec b/sql_enum.gemspec index a3ce669..50e1269 100644 --- a/sql_enum.gemspec +++ b/sql_enum.gemspec @@ -25,6 +25,8 @@ Gem::Specification.new do |spec| spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) } spec.require_paths = ["lib"] + spec.required_ruby_version = ">= 3.2.0" + spec.add_dependency "mysql2" spec.add_dependency "activesupport", ">= 7.1.0" spec.add_dependency "activerecord", ">= 7.1.0" From b71f82a2b6cb5db943dac7982c0d9029fb9c298c Mon Sep 17 00:00:00 2001 From: Noel Rappin Date: Thu, 12 Feb 2026 17:02:14 -0600 Subject: [PATCH 3/3] Update Gemfile.lock --- Gemfile.lock | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index 9df419d..dfd841e 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -50,8 +50,10 @@ GEM reline (>= 0.4.2) json (2.18.1) logger (1.7.0) - minitest (5.21.2) + minitest (6.0.1) + prism (~> 1.5) mysql2 (0.5.5) + prism (1.9.0) psych (5.1.2) stringio rake (13.1.0)