From 68ea7e6f5b5008c052307673ca167c31ae52d67e Mon Sep 17 00:00:00 2001 From: Allan Reyes Date: Tue, 14 Jul 2026 19:01:40 -0400 Subject: [PATCH] Make aasm compiler v6.0 aware --- lib/tapioca/dsl/compilers/aasm.rb | 23 ++++++++++++++--------- spec/tapioca/dsl/compilers/aasm_spec.rb | 11 +---------- 2 files changed, 15 insertions(+), 19 deletions(-) diff --git a/lib/tapioca/dsl/compilers/aasm.rb b/lib/tapioca/dsl/compilers/aasm.rb index 823cb4682..52bd06904 100644 --- a/lib/tapioca/dsl/compilers/aasm.rb +++ b/lib/tapioca/dsl/compilers/aasm.rb @@ -94,14 +94,19 @@ def decorate create_rest_param("opts", type: "T.untyped"), create_block_param("block", type: "T.nilable(T.proc.void)"), ] + aasm_6_or_newer = ::Gem::Requirement.new(">= 6").satisfied_by?(::Gem::Version.new(::AASM::VERSION)) + state_machine.events.each do |event| - model.create_method(event.name.to_s, parameters: parameters) - model.create_method("#{event.name}!", parameters: parameters) - model.create_method("#{event.name}_without_validation!", parameters: parameters) - model.create_method("may_#{event.name}?", return_type: "T::Boolean") + # As of aasm 6.0 a namespaced state machine defines only the + # namespaced event methods (e.g. `run_foo!`) and not the plain + # methods (`run!`) as aliases. + unless namespace && aasm_6_or_newer + model.create_method(event.name.to_s, parameters: parameters) + model.create_method("#{event.name}!", parameters: parameters) + model.create_method("#{event.name}_without_validation!", parameters: parameters) + model.create_method("may_#{event.name}?", return_type: "T::Boolean") + end - # For events, if there's a namespace the default methods are created in addition to - # namespaced ones. next unless namespace name = "#{event.name}_#{namespace}" @@ -110,9 +115,9 @@ def decorate model.create_method("#{name}!", parameters: parameters) model.create_method("may_#{name}?", return_type: "T::Boolean") - # There's no namespaced method created for `_without_validation`, so skip - # defining a method for: - # "#{name}_without_validation!" + # aasm < 6 does not define a namespaced `_without_validation!` + # method. + model.create_method("#{name}_without_validation!", parameters: parameters) if aasm_6_or_newer end end diff --git a/spec/tapioca/dsl/compilers/aasm_spec.rb b/spec/tapioca/dsl/compilers/aasm_spec.rb index 11f019b49..d5e0ac64c 100644 --- a/spec/tapioca/dsl/compilers/aasm_spec.rb +++ b/spec/tapioca/dsl/compilers/aasm_spec.rb @@ -358,18 +358,9 @@ def foo_running?; end sig { returns(T::Boolean) } def foo_sleeping?; end - sig { returns(T::Boolean) } - def may_run?; end - sig { returns(T::Boolean) } def may_run_foo?; end - sig { params(opts: T.untyped, block: T.nilable(T.proc.void)).returns(T.untyped) } - def run(*opts, &block); end - - sig { params(opts: T.untyped, block: T.nilable(T.proc.void)).returns(T.untyped) } - def run!(*opts, &block); end - sig { params(opts: T.untyped, block: T.nilable(T.proc.void)).returns(T.untyped) } def run_foo(*opts, &block); end @@ -377,7 +368,7 @@ def run_foo(*opts, &block); end def run_foo!(*opts, &block); end sig { params(opts: T.untyped, block: T.nilable(T.proc.void)).returns(T.untyped) } - def run_without_validation!(*opts, &block); end + def run_foo_without_validation!(*opts, &block); end class << self sig { params(args: T.untyped, block: T.nilable(T.proc.bind(PrivateAASMMachine).void)).returns(PrivateAASMMachine) }