diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 09eda75..8028045 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -11,11 +11,13 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - ruby: ['2.6', '2.7', '3.0', '3.1'] - gemfile: ['rails_5.0', 'rails_5.1', 'rails_5.2', 'rails_6.0', 'rails_6.1', 'rails_7.0'] + ruby: ['2.6', '2.7', '3.0', '3.1', '3.2', '3.3', '3.4'] + gemfile: ['rails_5.0', 'rails_5.1', 'rails_5.2', 'rails_6.0', 'rails_6.1', 'rails_7.0', 'rails_7.1'] exclude: - ruby: '2.6' gemfile: 'rails_7.0' + - ruby: '2.6' + gemfile: 'rails_7.1' - ruby: '3.0' gemfile: 'rails_5.0' - ruby: '3.0' @@ -28,6 +30,24 @@ jobs: gemfile: 'rails_5.1' - ruby: '3.1' gemfile: 'rails_5.2' + - ruby: '3.2' + gemfile: 'rails_5.0' + - ruby: '3.2' + gemfile: 'rails_5.1' + - ruby: '3.2' + gemfile: 'rails_5.2' + - ruby: '3.3' + gemfile: 'rails_5.0' + - ruby: '3.3' + gemfile: 'rails_5.1' + - ruby: '3.3' + gemfile: 'rails_5.2' + - ruby: '3.4' + gemfile: 'rails_5.0' + - ruby: '3.4' + gemfile: 'rails_5.1' + - ruby: '3.4' + gemfile: 'rails_5.2' env: BUNDLE_GEMFILE: ${{ github.workspace }}/gemfiles/${{ matrix.gemfile }}.gemfile diff --git a/gemfiles/rails_5.0.gemfile b/gemfiles/rails_5.0.gemfile index 7fe582a..925b34b 100644 --- a/gemfiles/rails_5.0.gemfile +++ b/gemfiles/rails_5.0.gemfile @@ -4,5 +4,6 @@ source 'https://rubygems.org' gem 'activerecord', '~> 5.0.0' gem 'sqlite3', '~> 1.3.0' +gem 'database_cleaner', '~> 1.99' gemspec path: '../' diff --git a/gemfiles/rails_5.1.gemfile b/gemfiles/rails_5.1.gemfile index 1f35e25..dc5db07 100644 --- a/gemfiles/rails_5.1.gemfile +++ b/gemfiles/rails_5.1.gemfile @@ -3,6 +3,6 @@ source 'https://rubygems.org' gem 'activerecord', '~> 5.1.0' -gem 'sqlite3', '~> 1.3.0' +gem 'sqlite3', '~> 1.4' gemspec path: '../' diff --git a/gemfiles/rails_7.1.gemfile b/gemfiles/rails_7.1.gemfile new file mode 100644 index 0000000..7f6612a --- /dev/null +++ b/gemfiles/rails_7.1.gemfile @@ -0,0 +1,13 @@ +# frozen_string_literal: true + +source 'https://rubygems.org' + +gem 'activerecord', '~> 7.1.3' + +if Gem::Version.new(RUBY_VERSION) >= Gem::Version.new('3.0.0') + gem 'sqlite3', '~> 2.0' +else + gem 'sqlite3', '~> 1.4' +end + +gemspec path: '../' diff --git a/imyou.gemspec b/imyou.gemspec index b683472..6511509 100644 --- a/imyou.gemspec +++ b/imyou.gemspec @@ -25,13 +25,17 @@ Gem::Specification.new do |spec| spec.require_paths = ['lib'] spec.required_ruby_version = '>= 2.6' - spec.add_dependency 'activerecord', '< 7.1.0', '>= 5.0.0' - spec.add_development_dependency 'database_cleaner', '~> 2.0' + spec.add_dependency 'activerecord', '< 7.2.0', '>= 5.0.0' + spec.add_development_dependency 'database_cleaner', '< 3.0', '>= 1.99.0' spec.add_development_dependency 'rake', '~> 13.0' spec.add_development_dependency 'rubocop', '~> 1.24' spec.add_development_dependency 'rubocop-minitest', '~> 0.17' spec.add_development_dependency 'rubocop-performance', '~> 1.13' spec.add_development_dependency 'rubocop-rake', '~> 0.6' - spec.add_development_dependency 'sqlite3', '~> 1.3' + spec.add_development_dependency 'sqlite3', '< 3.0', '>= 1.3' + spec.add_development_dependency 'concurrent-ruby', '1.3.4' + spec.add_development_dependency 'mutex_m', '~> 0.1' + spec.add_development_dependency 'bigdecimal', '~> 3.0' + spec.add_development_dependency 'base64', '~> 0.1' spec.metadata['rubygems_mfa_required'] = 'true' end diff --git a/lib/imyou/models.rb b/lib/imyou/models.rb index 19d6d2d..e3197d0 100644 --- a/lib/imyou/models.rb +++ b/lib/imyou/models.rb @@ -18,7 +18,11 @@ def has_imyou(name_column = nil) scope :with_nicknames, -> { preload(:imyou_nicknames) } - scope :match_by_nickname, lambda { |nickname, with_name_column: true| + # 本来はscopeで定義するべきだが、Ruby 3.2以降とActiveRecord 6.1系ではエラーになるため、 + # 苦肉の策で特異メソッドとして定義する。 + # Rails 6.1のサポートを終了したら、scopeに戻すこと。 + # @see https://qiita.com/usk0513/items/c2968733415c806f56fc + define_singleton_method(:match_by_nickname) do |nickname, with_name_column: true| if Gem::Version.new(ActiveRecord.version) >= Gem::Version.new(5) records = left_outer_joins(:imyou_nicknames).where(Imyou::Nickname.arel_table[:name].eq(nickname)) unless name_column.nil? || with_name_column == false @@ -47,9 +51,9 @@ def has_imyou(name_column = nil) end end records - } + end - scope :partial_match_by_nickname, lambda { |nickname, with_name_column: true| + define_singleton_method(:partial_match_by_nickname) do |nickname, with_name_column: true| if Gem::Version.new(ActiveRecord.version) >= Gem::Version.new(5) records = left_outer_joins(:imyou_nicknames). where(Imyou::Nickname.arel_table[:name]. @@ -82,7 +86,7 @@ def has_imyou(name_column = nil) end end records - } + end alias_method :save_with_nicknames, :save alias_method :save_with_nicknames!, :save! diff --git a/lib/imyou/version.rb b/lib/imyou/version.rb index 091e888..c9dd834 100644 --- a/lib/imyou/version.rb +++ b/lib/imyou/version.rb @@ -1,5 +1,5 @@ # frozen_string_literal: true module Imyou - VERSION = '1.4.3' + VERSION = '1.4.4' end diff --git a/test/nickname_test.rb b/test/nickname_test.rb index 20d5ca8..029acbd 100644 --- a/test/nickname_test.rb +++ b/test/nickname_test.rb @@ -64,7 +64,7 @@ describe 'If with_name_column = false' do it 'should not search by users.name' do - expect(User.match_by_nickname('user_name', with_name_column: false)).wont_be :exists? + expect(User.match_by_nickname("user_name", with_name_column: false)).wont_be :exists? end end end diff --git a/test/test_helper.rb b/test/test_helper.rb index af4087b..cede272 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -3,7 +3,8 @@ require 'minitest/autorun' require 'active_record' -require 'database_cleaner/active_record' +# database_cleaner 1~2系のどちらでも動くようにするため、パスを修正 +require 'database_cleaner' require 'imyou' Dir["#{Dir.pwd}/test/internal/app/models/*.rb"].sort.each { |f| require f } @@ -49,19 +50,21 @@ class Spec end # @see https://stackoverflow.com/questions/20329387/how-to-assert-the-contents-of-an-array-indifferent-of-the-ordering -module MiniTest +module Minitest module Assertions def assert_matched_arrays(exp, act) exp_ary = exp.to_ary + assert_kind_of Array, exp_ary act_ary = act.to_ary + assert_kind_of Array, act_ary assert_equal exp_ary.sort, act_ary.sort end end end -module MiniTest +module Minitest module Expectations infect_an_assertion :assert_matched_arrays, :must_match_array end