diff --git a/lib/rails_async_migrations.rb b/lib/rails_async_migrations.rb index 803b85b..d1ae1e4 100644 --- a/lib/rails_async_migrations.rb +++ b/lib/rails_async_migrations.rb @@ -8,6 +8,7 @@ rescue LoadError end +require 'rails_async_migrations/define_method_in' require 'rails_async_migrations/connection/active_record' require 'rails_async_migrations/config' require 'rails_async_migrations/migration' diff --git a/lib/rails_async_migrations/define_method_in.rb b/lib/rails_async_migrations/define_method_in.rb new file mode 100644 index 0000000..aa7b93e --- /dev/null +++ b/lib/rails_async_migrations/define_method_in.rb @@ -0,0 +1,10 @@ +module RailsAsyncMigrations + module DefineMethodIn + # `klass.define_method(...)` does not work in Ruby 2.4. Work around. + def define_method_in(klass, name, &block) + klass.class_exec { + define_method(name, &block) + } + end + end +end \ No newline at end of file diff --git a/lib/rails_async_migrations/migration/give.rb b/lib/rails_async_migrations/migration/give.rb index 0c6b180..d15a770 100644 --- a/lib/rails_async_migrations/migration/give.rb +++ b/lib/rails_async_migrations/migration/give.rb @@ -1,6 +1,8 @@ module RailsAsyncMigrations module Migration class Give + include RailsAsyncMigrations::DefineMethodIn + attr_reader :resource_class, :method_name def initialize(resource_class, method_name) @@ -17,7 +19,7 @@ def perform def restore_original_method if valid? Take.new(resource_class, method_name).suspend_take do - resource_class.define_method(method_name, &method_clone) + define_method_in(resource_class, method_name, &method_clone) end end end diff --git a/lib/rails_async_migrations/migration/take.rb b/lib/rails_async_migrations/migration/take.rb index 135eda4..597f1e3 100644 --- a/lib/rails_async_migrations/migration/take.rb +++ b/lib/rails_async_migrations/migration/take.rb @@ -4,6 +4,8 @@ module RailsAsyncMigrations module Migration class Take + include RailsAsyncMigrations::DefineMethodIn + attr_reader :resource_class, :method_name def initialize(resource_class, method_name) @@ -39,7 +41,7 @@ def clone_method_name end def preserve_method_logics - resource_class.define_method(clone_method_name, &captured_method) + define_method_in(resource_class, clone_method_name, &captured_method) end def captured_method @@ -47,7 +49,7 @@ def captured_method end def overwrite_method - resource_class.define_method(method_name, &overwrite_closure) + define_method_in(resource_class, method_name, &overwrite_closure) end def overwrite_closure diff --git a/spec/rails_async_migrations/migration/take_spec.rb b/spec/rails_async_migrations/migration/take_spec.rb index bf01dae..c17a81e 100644 --- a/spec/rails_async_migrations/migration/take_spec.rb +++ b/spec/rails_async_migrations/migration/take_spec.rb @@ -1,10 +1,12 @@ RSpec.describe RailsAsyncMigrations::Migration::Take do + include RailsAsyncMigrations::DefineMethodIn + let(:resource_class) { FakeClass } let(:resource_instance) { resource_class.new } let(:method) { :free_method } let(:instance) { described_class.new(resource_class, method) } - let(:change_to_it_passed) { resource_class.define_method(method, -> { 'it passed' }) } + let(:change_to_it_passed) { define_method_in(resource_class, method) { 'it passed' } } before { change_to_it_passed } subject { instance.perform } diff --git a/spec/rails_async_migrations/migration_spec.rb b/spec/rails_async_migrations/migration_spec.rb index 50778ed..f9a293f 100644 --- a/spec/rails_async_migrations/migration_spec.rb +++ b/spec/rails_async_migrations/migration_spec.rb @@ -1,9 +1,11 @@ RSpec.describe RailsAsyncMigrations::Migration do + include RailsAsyncMigrations::DefineMethodIn + let(:resource_class) { FakeClass } let(:instance) { resource_class.new } let(:method) { :free_method } - let(:change_to_true) { resource_class.define_method(method, -> { true }) } - let(:change_to_false) { resource_class.define_method(method, -> { false }) } + let(:change_to_true) { define_method_in(resource_class, method) { true } } + let(:change_to_false) { define_method_in(resource_class, method) { false } } # we reset the class each time # as RSpec won't hot-reload it